[РЕШЕНО] Переиндексация материалов

Главные вкладки

Аватар пользователя orion_st orion_st 11 марта 2014 в 0:00

У меня есть материалы, которые со временем могут автоматически менять статус опубликованности. Индексирую их с помощью Search API. Есть views которые выводит проиндексированные опубликованные материалы.

Когда я создаю материал, то по крону он у меня индексируется и появляется во вьюсе. Вижу сообщение "Indexed 1 items for index Default node index." - все ОК.
Скажем, через день, материал автоматически (модулем Classified Ad) снимается с публикации. По идее, по очередному крону материал должен закинуться в индекс со статусом "не опубликован". Но этого не происходит, во вьюсе он так и висит, в журнале никаких сообщений о запуске переиндексации нет.
В настройках индекса на закладке "Фильтры" флаг "Исключить неопубликованные материалы" снят, т.е. при индексации они все равно должны "дергаться".
Если же я нажму принудительную переиндексацию, то все переиндексируется на ура, и неопубликованный материал уйдет.

Короче, какая-то фигня при запуске кроном индексации, как будто не видятся неопубликованные ноды, не понимаю.

Комментарии

Аватар пользователя CSoft CSoft 11 марта 2014 в 2:57

"orion_st" wrote:
Скажем, через день, материал автоматически (модулем Classified Ad) снимается с публикации

"orion_st" wrote:
По идее, по очередному крону материал должен закинуться в индекс со статусом "не опубликован". Но этого не происходит

Могу предположить, что Classified Ads меняет статус ноды прямой записью в БД. Впрочем, я сейчас скачал этот модуль и рука сразу потянулась в файл classified.scheduled.inc - так и есть. А чтобы материал попал в очередь на переиндексацию и ушёл из индекса по крону, так как он снят с публикации, - он должен быть сохранён через node_save. Поэтому, Вы и получаете тот результат, который получаете.

Вам нужно в тот момент, когда Classified Ads снимает ноду с публикации, добавить её вручную в очередь для индексации:

<?php
  $indexes 
search_api_index_load_multiple(array('НАЗВАНИЕ_ИНДЕКСА'));
  
search_api_get_datasource_controller('node')->trackItemChange(МАССИВ_NID_НОД_ДЛЯ_ИНДЕКСАЦИИ$indexes);
?>

Вот такие мысли сходу у меня.