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

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


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

вопрос
На сколько я понял в таблице 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 перед этим действием будет созданы эти самые данные если их нету.

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

Принимаю оплату только на карту Мир. Крипту меньше трёхзначной цифры не принимаю.

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.

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

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

наверх