Редактор темы

Реклама
Реклама

Удаляем похожие новости (дубли) на дле

  • Автор темы Автор темы makdem
  • Дата начала Дата начала

makdem

Бывалый
Регистрация
3 Окт 2017
Сообщения
341
Рейтинг реакций
55
Баллы
28
1/3
Автор темы
На своём сайте, работающем на CMS DLE, столкнулся с проблемой дубликатов новостей.

Сначала руками удалял, потом подумал, что это долго и нудно. Стал искать выход по автоматическому удалению новостей, у которых совпадают названия в TITLE. В поиске предлагают всякое устаревшее гомно для DLE. Все это сомнительно, вместе с ними в подарок можно получить бэкдор, потерять посетителей из-за падения трафика.

Короче говоря, нашел выход. Весьма рабочая инструкция! Мне, по крайней мере, помогла.
Заходим в PhpMyAdmin. Кто забыл логин и пароль базы данных DLE, может посмотреть их через файл менеджер в файле dbconfig.php. Этот файл по этому адресу лежит относительно корня:

/engine/data/dbconfig.php


В PhpMyAdmin выбираете вашу базу данных. Обязательно сделайте резервную копию базы и сохраните ее, мало ли что может случиться!!! Затем переходите на вкладку SQL.

В поле вводите запрос:

ALTER IGNORE TABLE dle_post ADD UNIQUE INDEX titleindex (title);

ALTER TABLE dle_post DROP INDEX titleindex;


Получаете ответ: SQL-запрос был выполнен успешно.

Вот и все )) всём удачи!

PS: У меня новости ставятся так:- Пассажиры 2009, то есть приставка к новости по году фильма и удалить Пассажиры 2016 и тд не возможно,если у вас новости стоят только лишь по названию то да можно удалить !
 
Последнее редактирование:
В результате фильмы с одинаковым названием, если в заголовке введено только название, будут удалены и оставлен только один первый встретившийся материал.
 
Автор темы
Согласен,есть небольшой риск потерять пару новостей ,но если как у меня за сотни дублей было то тем в помощь)
 
Есть еще вот такой код для чистки дубликатов:

Код:
<?PHP
//                          COPYRIGHT FDSTAR.NET
@error_reporting(E_ALL ^ E_NOTICE);
@ini_set('display_errors', true);
@ini_set('html_errors', false);
@ini_set('error_reporting', E_ALL ^ E_NOTICE);

define('DATALIFEENGINE', true);

$member_id = FALSE;
$is_logged = FALSE;
$content = '';

define('ROOT_DIR', dirname (__FILE__));
define('ENGINE_DIR', ROOT_DIR.'/engine');
define('DROP_IMAGES', false);


@include (ENGINE_DIR.'/data/config.php');
if (!$config['version_id']) die("Datalife Engine not installed. Please run install.php");
require_once ENGINE_DIR.'/classes/mysql.php';
require_once ENGINE_DIR.'/data/dbconfig.php';

$sql = "SELECT *,count(*) as `post_counter`
        FROM `". PREFIX. "_post`
        GROUP BY `alt_name`
        ORDER BY `post_counter` DESC";
$res = $db->query($sql);
$row = $db->get_row($res);

if($row && count($row))
{
    if($row['post_counter']<=1)
    {
        die('COMPLETE !');
    }
    if(DROP_IMAGES)
    {
        $sql= "SELECT *
                FROM `". PREFIX. "_images`
                WHERE `news_id`='{$row['id']}' ";
   
        $res2 = $db->query($sql);
        while($row2 = $db->get_row($res2))
        {
            $images_array = split("\|\|\|", $row2['images']);
            foreach($images_array as $image)
            {
                if($image = trim($image))
                {
                    $image = ltrim($image, '/');
                    if(preg_match('#([0-9]{4}\-[0-9]{2}/)(.*)$#', $image, $match))
                    {
                        $img_date_dir = $match[1];
                        $img_name = basename($match[2]);
                       
                        $img_thumb_address = ROOT_DIR. '/uploads/posts/'. $img_date_dir. 'thumbs/'. $img_name;
                        $img_address = ROOT_DIR. '/uploads/posts/'. $img_date_dir. $img_name;
   
                        @$img_thumb_address_delete = (int)unlink($img_thumb_address);
                        @$img_address_delete = (int)unlink($img_address);
                       
                        $content.= "{$img_address} {$img_address_delete} <br /> {$img_thumb_address} {$img_thumb_address_delete}<hr />";
                    }
                    else
                    {
                        $content.= '<br />NO IMAGES FOUND<br />';
                    }
                }
            }
            $sql = "DELETE FROM `". PREFIX. "_images` WHERE `id`='{$row2['id']}'";
            $db->query($sql);
            $content.= $sql. "<hr />";
        }

    }  
   
    $sql= "DELETE FROM `". PREFIX. "_post` WHERE `id`='{$row['id']}' ";
    $db->query($sql);
    $content.= $sql. "<hr />";
}


echo <<<HTML

<html>
    <head>

<script language="JavaScript" DEFER><!--
function reload_page()
{
         document.location.reload();
}
--></script>

    </head>
    <body onload="reload_page();">
          {$content}  
    </body>
</html>

HTML;

?>

Создать php файл с вышеуказанным кодом, закинуть в корневую директорию сайта и запустить.
dle найти дубли новостей
Спасибо за код @Gameer, очень он мне был необходим когда то.
 
Последнее редактирование модератором:
А есть какой-то метод, чтобы при добавлении новостей (если будет дублироваться заголовок) всплывала предупреждающая подсказка или не публиковалась новость, если уже есть такой "H1" ???
Просто не хочется каждый раз при добавлении новостей нажимать на кнопку "Найти похожие новости".
 
Так что, никто не знает?

Есть какая-то настройка в ДЛЕ, чтобы при добавлении новостей, если такой заголовок уже есть - то новость не публиковалась или всплывала подсказка типа "такая новость уже есть" и т.д. ???

(нажимать на кнопку "Найти похожие новости" при публикации - не вариант, всё время забываю, да и долго это)
 
Есть проще гораздо вариант, точнее не проще, а надежнее. Прогоняешь сайт пауком как-нибудь по типу нетпикспайдера, выгружаешь список страниц с дублями тайтлов и еще чего угодно. И ручками уже как надо правишь или удаляешь.
 

Чёт не получился у меня этот вариант:
По инструкции в файле engine/inc/addnews.php кнопку "Найти похожие новости" нашёл и удалил.
Но потом нужно:
... и вешаем событие на поле (событие onclick только на поле меняем на onchange)
Какое событие, куда его вешать? В комментах тоже задавали этот вопрос, но он так и остался без ответа ещё с 2012-го года.

Вобщем придётся приучивать себя нажимать на кнопку "Найти похожие новости" при добавлении новостей (((
 
Karambole найти
HTML:
<input type="text" style="width:99%;max-width:437px;" name="title" id="title">&nbsp;<button onclick="find_relates(); return false;" class="btn btn-sm btn-black">{$lang['b_find_related']}</button>
и заменить на
HTML:
<input type="text" style="width:99%;max-width:437px;" name="title" id="title" onchange="find_relates();">
2017-11-08_21-09-24.png

Когда курсор будет не в поле заголовка новости - будет выполнен автоматический поиск новостей. Проверено на ДЛЕ 11.3.

Вобщем придётся приучивать себя нажимать на кнопку "Найти похожие новости" при добавлении новостей (((
но вообще лучше приучить себя пользоваться кнопкой: всего один раз нажать её надо и никаких проблем 😉
 
так вот куда этот "onchange" надо было вставить.
byroot, Спасибо Огромное! теперь заработало как надо ))
 
Спасибо отличный запрос удаляет то что нужно ALTER IGNORE TABLE dle_post ADD UNIQUE INDEX titleindex (title);
ALTER TABLE dle_post DROP INDEX titleindex
 
Спасибо работает
 
не пашет

ALTER IGNORE TABLE dle_post ADD UNIQUE INDEX titleindex (title)



MySQL said:

#1071 - Specified key was too long; max key length is 1000 bytes
 
На своём сайте, работающем на CMS DLE, столкнулся с проблемой дубликатов новостей.

Сначала руками удалял, потом подумал, что это долго и нудно. Стал искать выход по автоматическому удалению новостей, у которых совпадают названия в TITLE. В поиске предлагают всякое устаревшее гомно для DLE. Все это сомнительно, вместе с ними в подарок можно получить бэкдор, потерять посетителей из-за падения трафика.

Короче говоря, нашел выход. Весьма рабочая инструкция! Мне, по крайней мере, помогла.
Заходим в PhpMyAdmin. Кто забыл логин и пароль базы данных DLE, может посмотреть их через файл менеджер в файле dbconfig.php. Этот файл по этому адресу лежит относительно корня:

/engine/data/dbconfig.php


В PhpMyAdmin выбираете вашу базу данных. Обязательно сделайте резервную копию базы и сохраните ее, мало ли что может случиться!!! Затем переходите на вкладку SQL.

В поле вводите запрос:

ALTER IGNORE TABLE dle_post ADD UNIQUE INDEX titleindex (title);

ALTER TABLE dle_post DROP INDEX titleindex;


Получаете ответ: SQL-запрос был выполнен успешно.

Вот и все )) всём удачи!

PS: У меня новости ставятся так:- Пассажиры 2009, то есть приставка к новости по году фильма и удалить Пассажиры 2016 и тд не возможно,если у вас новости стоят только лишь по названию то да можно удалить !

Не работает этот метод на dle 14
 
Удаляю руками, сорян если метод уже был.
1. Захожу в базу phpmyadmin
2. Пишу
Код:
SELECT * FROM dle_post
WHERE metatitle IN
    (SELECT metatitle FROM dle_post GROUP BY metatitle HAVING COUNT(metatitle) > 1)
ORDER BY metatitle

В результате выводит по две одинаковые записи. Сравниваю одно ли это и то же... если да, то каждую вторую, увы, но руками, удаляю.
Ревизию провожу раз в месяц, в принципе запары нет. Была только в первый раз.
 
А есть вариант допустим удаление дублей по доп полям? допустим по id кинопоиск?
 
А есть вариант допустим удаление дублей по доп полям? допустим по id кинопоиск?
Нашел способ? Вот тоже сегодня случайно увидел дубль, и подумал что странное что нету какого то хака для кинопоиск ид. Может есть у кого? Удаление дублей по кп.ид или что то в этом роде?
 
У меня больше 100 новостей дублей. В ручную это удалять, ужас.
 

Похожие темы Последние темы Популярные темы

Назад
Сверху