Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » Общие вопросы по PHP » Как найти похожие новости для всех публикаций?

Как найти похожие новости для всех публикаций?


     30.01.2019    php mysql dle_post_extras related-news    Общие вопросы по PHP, Модули, Хаки    1903

вопрос
На сколько я понял в таблице dle_post_extras столбец related_ids отвечает за id похожих публикаций. Похожие публикации ищутся во время первого захода на публикацию. Как найти похожие новости сразу для всех постов перед заливкой базы(полностью заполнить столбец related_ids)? Может скрипт у кого есть или сам DLE как то может это сделать? Если не подскажите придется препарировать движок и вынимать часть которая отвечает за заполнение данного столбца- может подскажите этот кусок?

Ответил: Sander


Открыть консоль браузера (F12, вкладка Console).
Вставить туда код и нажать Enter (нужно только свой ID указать). Дождаться окончания выполнения скрипта.
var max_post_id = 120; //Максимальный ID новости
function rebuildMe(id) {
  if (id > max_post_id) {
    console.log('Усё готово, шеф');
    return false;
  }
  $.get('/?newsid='+id, function(){
    rebuildMe(id+1);
  });
}
rebuildMe(1);


Метод "тупой", но простой и рабочий.

8 комментариев

LazyDev
PHP-developer

LazyDev - 30 января 2019 22:24 -

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

Мой блог: LazyDev.pro

Помогаю с решением проблем на платной основе.

Hertz
Юзер

Hertz - 30 января 2019 22:57 -

Ну так при заходе в новость, а хотелось бы сразу для всех заполнить столбец с похожими(про что я написал выше).

maks
Юзер

maks - 30 января 2019 23:18 -

Зачем его обновлять раньше чем кто-то зайдет? Для кого?

Hertz
Юзер

Hertz - 30 января 2019 23:47 -

Для другого движка тащащего данные из таблиц DLE, для ускорения работы, для пользовательских скриптов... У меня первый вариант и сам я не доволен таким положением вещей, но сделать придется. Так как есть готовое решение, ориентиры в этом деле? Если что там не такой трудный запрос к БД, но если кто уже делал и поделится- завтра пол дня сэкономлю.

TeraMoune
Эксперт

TeraMoune - 1 февраля 2019 03:05 -

Препарировать всегда придётся, хоть и немного.

В начале выполнения всех действий другого двига проверяйте наличие существования данных.
Открываете файл, show.full.php, находите начало условия if ( $row['related_ids'] ).

Нам нужен код выполняющийся в else, копируем его и выставляем в самое начало в условии if ( !$row['related_ids'] ) везде где тянутся данные из поля. Это для пользовательских скриптов которые часть движка DLE

Для сторонних скриптов обращающихся к базе при помощи других классов или функций поступаем по другому. Делаете обращение в базу, если никаким другим способом узнать пустое ли related_ids поле нельзя. И смотрите ответ, если пусто то посылаете запрос в данную новость по url имитируя пользовательский заход (например с помощью Curl). Тем самым скрипт по требованию найдёт заполнит и при следующем обращении уже related_ids будет содержать данные. Так же можно поставить sleep между запросом curl и продолжением выполнения сценария, чтобы дать время закончить.

Получиться следующее, всякий раз когда будет попытка вытянуть данные из related_ids перед этим действием будет созданы эти самые данные если их нету.

Это всё теория, на практике конечно я этого не делал. Мне пока не нужно такое. Можете сами попробовать. Всё, что надо это скопировать да вставить.

Тестовый репозиторий установки плагинов: teramoune

dj-avtosh
PHP-developer

dj-avtosh - 1 февраля 2019 03:35 -

вы меня простите за неконструктивность, но похоже на костыль.

По заказам пишем сюда: @Rud00y

ЯД: 41001679231462
Заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

Hertz
Юзер

Hertz - 3 февраля 2019 15:04 -

Код для этой задачи для сообщества.
<?php
include 'connectBd.php'; // файл соединения с Базой данных

$sch=0;
$related_number=6; //сколько похожих найдем для каждого поста
for($id=1;$id<30;$id++){
	set_time_limit(0);
$result=mysql_query( "SELECT full_story FROM dle_post WHERE id='$id' AND approve=1 ORDER BY id DESC");
$row = mysql_fetch_assoc($result);
//print_r($row);
//echo '||||||'.$row[full_story];
$body=$row[full_story];   //поле в котором будем искать фрагменты из выбранной новости
//доделать чистку для $body
$result1=mysql_query( "SELECT id, date, short_story, xfields, title, category, alt_name FROM dle_post WHERE  MATCH (title, short_story, full_story, xfields) AGAINST ('$body') AND id != " . $id . " AND approve=1 LIMIT " . $related_number );
$related_ids='';
while($row1 = mysql_fetch_assoc($result1)){

$related_ids[]=$row1[id];
}

//echo count($related_ids).'///';
//echo $related_ids;
//print_r($related_ids);
if ( count($related_ids) ) {
	
$related_ids = implode(",",$related_ids);
	
}
//print_r($related_ids);
mysql_query( "UPDATE dle_post_extras SET related_ids='$related_ids' WHERE news_id='$id'" );
$sch++;
if($sch%100==0){      //каждые сколько строк показываем, прогресс
	echo($sch.'<br>');
}
}
?>

Hertz
Юзер

Hertz - 4 февраля 2019 01:58 -

Еще сказать стоит, что перед запуском скрипта нужно сделать перестроение публикаций, что бы подготовилась для заполнения таблица related_ids.

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

наверх