WordPress: как удалить дубли постов в XML? - Форум успешных вебмастеров - GoFuckBiz.com - Страница 2
 
 
Форум успешных вебмастеров - GoFuckBiz.com

  Форум успешных вебмастеров - GoFuckBiz.com > Бизнес-решения > Скрипты, программы и технические решения
Дата
USD/RUB88.4375
BTC/USD67232.5428
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии.

Закрытая тема
Опции темы Опции просмотра
Старый 31.08.2017, 12:05
Start Post: WordPress: как удалить дубли постов в XML? 
  #11
Dr.EVIL
★☆★☆★
 
Аватар для Dr.EVIL
 
Регистрация: 01.10.2009
Сообщений: 444
Бабло: $166305
Question

Как можно удалить дубли постов в XML файле перед импортом в вордпресс? Может быть, есть какие-то спец. скрипты или софт?

Извращался в Notepad++ путём объёдинения строк -> удаления дублей -> через поиск/замену восстановление правильного формата XML, но это просто пздц когда всё зависает на обработке крупных файлов =\

Ещё как вариант делаю предварительно импорт XML в вордпресс на локалхосте, после чего вордпресс сам отсеивает дубли постов. Затем закачиваю чистый XML через export тулзу. Тоже геморой, т.к. процесс проходит очень долго.

Как-то можно ускорить импорт XML на локалхосте? Разбивать файлы на несколько мелких не вариант, при условии что файлов очень много.

Заранее спасибо, если что можно за $ накидать решение.
__________________
I shave my balls
Dr.EVIL вне форума  
Старый 31.08.2017, 16:59   #12
веломан
сыроед
 
Аватар для веломан
 
Регистрация: 01.10.2015
Сообщений: 15,816
Бабло: $1863835
По умолчанию

попробуй так
5 сек на 300мб файле (8млн строк) это быстро?
через БД было бы побыстрее конечно
PHP код:
<?php

// все комменты должны находиться в блоках <item> ... </item>
// шапку потом руками вставить в конечный файл

$infile __DIR__."/xml-src.xml"// исходный файл с комментами в текущей дире
$outfile __DIR__."/xml-out.xml"// уникальные комменты пойдут сюда

$f1 fopen($infile,'r');
$f2 fopen($outfile,'w');
$hashes = array();
$trigger 0;
$str '';

while (
$line fgets($f1))
{
    
$l trim($line);
    if (!
$trigger && $l === "<item>") {$trigger 1;}

    if (
$trigger)
    {
        
$str .= $line;

        if (
$l === "</item>")
        {
            
$trigger 0;
            
$md5 md5($str);
            if (!isset(
$hashes{$md5}))
            {
                
fwrite($f2,$str."\n");
                
$hashes{$md5} = '';
            }
            
$str '';
            continue;
        }

    }

}

// footer
fwrite($f2,"</channel>\n</rss>\n");

fclose($f1);fclose($f2);

?>
веломан вне форума  
Старый 31.08.2017, 17:00   #13
yandexru
Ебланнед
 
Регистрация: 13.02.2016
Сообщений: 1,390
Бабло: $194295
По умолчанию

Dr.EVIL, http://dropmefiles.com/3Zetl
yandexru вне форума  
Старый 31.08.2017, 17:01   #14
capturis
Senior Member
 
Аватар для capturis
 
Регистрация: 25.11.2013
Сообщений: 271
Бабло: $47245
Отправить сообщение для capturis с помощью Telegram Отправить сообщение для capturis с помощью Jabber
По умолчанию

Цитата:
Сообщение от Dr.EVIL Посмотреть сообщение
capturis, что-то не работает, на выходе файл без изменений.
Работает на этом примере, только у него в третьем </item> пробел лишний. Я предположил, что у тебя криво скопипастилось и его убрал.
capturis вне форума  
Старый 02.09.2017, 12:42   #15
Dr.EVIL
★☆★☆★
 
Аватар для Dr.EVIL
 
Регистрация: 01.10.2009
Сообщений: 444
Бабло: $166305
ТС -->
автор темы ТС По умолчанию

capturis, попробовал убрать пробелы, всё равно на выходе файл без изменений. Проверь плз, может быть, где-то ошибся?
веломан, также попробовал прогнать тестовый xml, на выходе файл без изменений.

Вот точный xml с дублем для проверки

PHP код:
<item>
<
title>title1</title>
<
dc:creator><![CDATA[admin]]></dc:creator>
<
category><![CDATA[Uncategorized]]></category><category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
<
category domain="tag"><![CDATA[Tag1]]></category><category domain="tag" nicename="tag1"><![CDATA[Tag1]]></category>
<
content:encoded><![CDATA[
<
p>text</p>
]]></
content:encoded>
<
wp:comment_status>open</wp:comment_status>
<
wp:ping_status>close</wp:ping_status>
<
wp:post_name>title1</wp:post_name>
<
wp:status>publish</wp:status>
<
wp:post_type>post</wp:post_type>
</
item>

<
item>
<
title>title2</title>
<
dc:creator><![CDATA[admin]]></dc:creator>
<
category><![CDATA[Uncategorized]]></category><category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
<
category domain="tag"><![CDATA[Tag1]]></category><category domain="tag" nicename="tag1"><![CDATA[Tag1]]></category>
<
content:encoded><![CDATA[
<
p>text</p>
]]></
content:encoded>
<
wp:comment_status>open</wp:comment_status>
<
wp:ping_status>close</wp:ping_status>
<
wp:post_name>title1</wp:post_name>
<
wp:status>publish</wp:status>
<
wp:post_type>post</wp:post_type>
</
item>

<
item>
<
title>title1</title>
<
dc:creator><![CDATA[admin]]></dc:creator>
<
category><![CDATA[Uncategorized]]></category><category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
<
category domain="tag"><![CDATA[Tag1]]></category><category domain="tag" nicename="tag1"><![CDATA[Tag1]]></category>
<
content:encoded><![CDATA[
<
p>text</p>
]]></
content:encoded>
<
wp:comment_status>open</wp:comment_status>
<
wp:ping_status>close</wp:ping_status>
<
wp:post_name>title1</wp:post_name>
<
wp:status>publish</wp:status>
<
wp:post_type>post</wp:post_type>
</
item
Добавлю, что в результате должно получиться только два блока, т.к. первый и последний являются одинаковыми. Т.е. в результате должно быть:

PHP код:
<item>
<
title>title1</title>
<
dc:creator><![CDATA[admin]]></dc:creator>
<
category><![CDATA[Uncategorized]]></category><category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
<
category domain="tag"><![CDATA[Tag1]]></category><category domain="tag" nicename="tag1"><![CDATA[Tag1]]></category>
<
content:encoded><![CDATA[
<
p>text</p>
]]></
content:encoded>
<
wp:comment_status>open</wp:comment_status>
<
wp:ping_status>close</wp:ping_status>
<
wp:post_name>title1</wp:post_name>
<
wp:status>publish</wp:status>
<
wp:post_type>post</wp:post_type>
</
item>

<
item>
<
title>title2</title>
<
dc:creator><![CDATA[admin]]></dc:creator>
<
category><![CDATA[Uncategorized]]></category><category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
<
category domain="tag"><![CDATA[Tag1]]></category><category domain="tag" nicename="tag1"><![CDATA[Tag1]]></category>
<
content:encoded><![CDATA[
<
p>text</p>
]]></
content:encoded>
<
wp:comment_status>open</wp:comment_status>
<
wp:ping_status>close</wp:ping_status>
<
wp:post_name>title1</wp:post_name>
<
wp:status>publish</wp:status>
<
wp:post_type>post</wp:post_type>
</
item
__________________
I shave my balls

Последний раз редактировалось Dr.EVIL; 02.09.2017 в 12:50.
Dr.EVIL вне форума  
Старый 02.09.2017, 12:54   #16
capturis
Senior Member
 
Аватар для capturis
 
Регистрация: 25.11.2013
Сообщений: 271
Бабло: $47245
Отправить сообщение для capturis с помощью Telegram Отправить сообщение для capturis с помощью Jabber
По умолчанию

Цитата:
Сообщение от Dr.EVIL Посмотреть сообщение
capturis, попробовал убрать пробелы, всё равно на выходе файл без изменений. Проверь плз, может быть, где-то ошибся?
Ясен пень, ошибся. Только не я. More
capturis вне форума  
Старый 02.09.2017, 13:12   #17
Dr.EVIL
★☆★☆★
 
Аватар для Dr.EVIL
 
Регистрация: 01.10.2009
Сообщений: 444
Бабло: $166305
ТС -->
автор темы ТС По умолчанию

Вот так у меня, WTF

PHP код:
admin@1111 ~/.tmp cat file.txt
<item>
<
title>title1</title>
<
dc:creator><![CDATA[admin]]></dc:creator>
<
category><![CDATA[Uncategorized]]></category><category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
<
category domain="tag"><![CDATA[Tag1]]></category><category domain="tag" nicename="tag1"><![CDATA[Tag1]]></category>
<
content:encoded><![CDATA[
<
p>text</p>
]]></
content:encoded>
<
wp:comment_status>open</wp:comment_status>
<
wp:ping_status>close</wp:ping_status>
<
wp:post_name>title1</wp:post_name>
<
wp:status>publish</wp:status>
<
wp:post_type>post</wp:post_type>
</
item>

<
item>
<
title>title2</title>
<
dc:creator><![CDATA[admin]]></dc:creator>
<
category><![CDATA[Uncategorized]]></category><category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
<
category domain="tag"><![CDATA[Tag1]]></category><category domain="tag" nicename="tag1"><![CDATA[Tag1]]></category>
<
content:encoded><![CDATA[
<
p>text</p>
]]></
content:encoded>
<
wp:comment_status>open</wp:comment_status>
<
wp:ping_status>close</wp:ping_status>
<
wp:post_name>title1</wp:post_name>
<
wp:status>publish</wp:status>
<
wp:post_type>post</wp:post_type>
</
item>

<
item>
<
title>title1</title>
<
dc:creator><![CDATA[admin]]></dc:creator>
<
category><![CDATA[Uncategorized]]></category><category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
<
category domain="tag"><![CDATA[Tag1]]></category><category domain="tag" nicename="tag1"><![CDATA[Tag1]]></category>
<
content:encoded><![CDATA[
<
p>text</p>
]]></
content:encoded>
<
wp:comment_status>open</wp:comment_status>
<
wp:ping_status>close</wp:ping_status>
<
wp:post_name>title1</wp:post_name>
<
wp:status>publish</wp:status>
<
wp:post_type>post</wp:post_type>
</
item>

admin@1111 ~/.tmp sed '/./{H;$!d;};x;s/\n/={NL}=/g' file.txt sort -sed '1s/={NL}=//;s/={NL}=/\n/g'
<item>
<
title>title1</title>
<
dc:creator><![CDATA[admin]]></dc:creator>
<
category><![CDATA[Uncategorized]]></category><category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
<
category domain="tag"><![CDATA[Tag1]]></category><category domain="tag" nicename="tag1"><![CDATA[Tag1]]></category>
<
content:encoded><![CDATA[
<
p>text</p>
]]></
content:encoded>
<
wp:comment_status>open</wp:comment_status>
<
wp:ping_status>close</wp:ping_status>
<
wp:post_name>title1</wp:post_name>
<
wp:status>publish</wp:status>
<
wp:post_type>post</wp:post_type>
</
item>

<
item>
<
title>title2</title>
<
dc:creator><![CDATA[admin]]></dc:creator>
<
category><![CDATA[Uncategorized]]></category><category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
<
category domain="tag"><![CDATA[Tag1]]></category><category domain="tag" nicename="tag1"><![CDATA[Tag1]]></category>
<
content:encoded><![CDATA[
<
p>text</p>
]]></
content:encoded>
<
wp:comment_status>open</wp:comment_status>
<
wp:ping_status>close</wp:ping_status>
<
wp:post_name>title1</wp:post_name>
<
wp:status>publish</wp:status>
<
wp:post_type>post</wp:post_type>
</
item>

<
item>
<
title>title1</title>
<
dc:creator><![CDATA[admin]]></dc:creator>
<
category><![CDATA[Uncategorized]]></category><category domain="category" nicename="uncategorized"><![CDATA[Uncategorized]]></category>
<
category domain="tag"><![CDATA[Tag1]]></category><category domain="tag" nicename="tag1"><![CDATA[Tag1]]></category>
<
content:encoded><![CDATA[
<
p>text</p>
]]></
content:encoded>
<
wp:comment_status>open</wp:comment_status>
<
wp:ping_status>close</wp:ping_status>
<
wp:post_name>title1</wp:post_name>
<
wp:status>publish</wp:status>
<
wp:post_type>post</wp:post_type>
</
item
__________________
I shave my balls
Dr.EVIL вне форума  
Старый 02.09.2017, 14:05   #18
веломан
сыроед
 
Аватар для веломан
 
Регистрация: 01.10.2015
Сообщений: 15,816
Бабло: $1863835
По умолчанию

Цитата:
Сообщение от Dr.EVIL Посмотреть сообщение
веломан, также попробовал прогнать тестовый xml, на выходе файл без изменений.

Вот точный xml с дублем для проверки

Добавлю, что в результате должно получиться только два блока, т.к. первый и последний являются одинаковыми.
именно так он и работает - из 300мб оставил 5 уникальных блоков
он генерит новый файл xml-out.xml в той же дире, как указано в $outfile

кладёшь script.php в диру с xml-файлом
прописываешь в $infile = __DIR__."/имя_файла";
и запускаешь скрипт

зы: кстати, если на 100% есть уверенность, что все <item> </item> записи будут в начале строки БЕЗ пробелов, можно переделать без trim(), тогда скрипт будет в 2.2 раза быстрее

зыы: кстати, ты же его не на винде запускаешь??

Последний раз редактировалось веломан; 02.09.2017 в 14:10.
веломан вне форума  
Старый 29.09.2017, 10:50   #19
bengom
Юниор
 
Аватар для bengom
 
Регистрация: 25.09.2017
Адрес: Москва
Сообщений: 5
Бабло: $1920
Отправить сообщение для bengom с помощью ICQ
По умолчанию

DELETE t1 FROM `wp_posts` AS t1,`wp_posts` AS t2
WHERE t1.`post_content`=t2.`post_content` AND t1.ID>t2.ID
Данная транзакция удаляет копии постов опубликованные после уже имеющихся. Удалить что-то ненужное не получится, т.к. записи сравниваются именно по содержанию (поле post_content).
bengom вне форума