Поиск из mSearch2 по SEO страницам SeoFilter

Привет всем! Давно я сюда ничего не писал, лишь только почитывал. И вот настало время поделиться интересным решением и дальнейшими планами.

Меня иногда спрашивали, можно ли индексировать SEO страницы, но тогда я ничего толком сделать не мог.
Казалось всё это чем-то очень сложным и трудозатратным. Но время шло, я продолжал учиться и стал опытнее. Конечно, отсюда есть и большой минус: на свой старый код без слёз не посмотришь :)

Совсем недавно ко мне обратился @Роман Ильин с таким запросом на доработку. Изучил подробнее, как устроен mSearch2, его таблицы и прикинул, что можно его научить искать и по сторонним таблицам.
В общем-то, Роман и проспонсировал такую доработку, спасибо!



Перейдём, наконец к делу.


Требования:


1. Никакие исходники от mSearch2 не менялись и всё тестировалось на актуальных версиях.
2. Минимальная версия PHP 7.0, так как не могу уже писать без тайпхинтинга.
3. SeoFilter 1.7.1, который обязательно будет рано или поздно переписан под PHP 7.1 с добавлением нового функционала, и вообще это будет скорее SeoFilter2 (который перекочует и на MODX 3).



Возможности поиска:

  • Поиск работает также в админке во вкладке поиск в компонете mSearch2 (скриншот выше);
  • Результаты перемешиваются по весу, то есть для пользователей поиска нет разницы между SEO-страницами и обычными;
  • Индекс обновляется из админки по кнопке «Обновить индекс» и при создании и редактировании SEO-страниц. Индекс подставляет в переменные все переменные и учитывает это;
  • ! Важно ! Названия SEO-страниц должны быть сгенерированы заранее. В правилах это Шаблон для названия страниц в меню и в хлебных крошках;
  • Учитывается настройка seofilter_hide_empty — не покажет страницы с 0 результатами (корректно настройте подсчёты);
  • Можете управлять полями для индексации и их развесовкой:
    • seo_word — значение слова, из которого состоит ссылка (то, что обычно видно в фильтрах, например, название производителя, района или цвет). Рекомендую наибольший вес ставить сюда;

    • seo_link — сформированное название SEO-страницы, оно же и отображается в чанках результатов, как pagetitle (чанки результатов менять не нужно, pagetitle привязанной страницы будет доступен в переменной [[+page_title]] или $page_title для Fenom);
    • seo_title, seo_h1 и h2, description, introtext, keywords, text, content (все с префиксом seo_) — индивидуальные поля в SEO-странице. Индексируются, если страница использует индивидуальные теги.
    • Такие же поля, но с префиксом rule_ индексируют SEO-страницу с учётом общего шаблона (рекомендую ставить минимальный вес, так как обычные слова из правил попадут ко всем привязанным SEO-страницам).

10 простых действий для настройки на своём проекте:

  1. Скопируйте все файлы в соответствующие директории;
  2. Создайте копию сниппета mSearch2 с названием mSearch2Seo (название не менять) с содержимым из core/components/msearch2/elements/snippets/snippet.msearch2seo.php;
  3. Создайте плагин SeoUrlToIndex с содержимым из core/components/msearch2/elements/plugins/plugin.seourltoindex.php и отметьте события sfOnUrlAdd, sfOnUrlUpdate, sfOnUrlBeforeRemove;
  4. Отредактируйте пункт меню mSearch2 в админке /manager/?a=system/action, изменив действие home на seohome (пространство имён msearch2);
    ! Важно ! Это нужно будет делать при каждом обновлении mSearch2, что бы поиск работал в админ-панели;
  5. Запустите обновление индекса в во вкладке индекс в mSearch2 по этому адресу /manager/?a=seohome&namespace=msearch2 (скриншот в начале заметки);
  6. Создайте системную настройку mse2_seo_index_empty с типом Да/нет со значением 1 (разрешить индекс пустых SEO страниц);
  7. Создайте системную настройку mse2_seo_index_fields с типом Текст с значением seo_word:5,seo_link:3,seo_title:1,seo_h1:1,seo_description:1,rule_title:1,rule_content:1,rule_h1:1 — развесовка полей ссылок и правил, и к SEO-страницам также применяются все остальные настройки из mSearch2, включая баллы за совпадения (порегулируйте веса и прочие настройки);
  8. Создайте системную настройку msearch2.action_url со значением /assets/components/msearch2/action-search.php;
  9. В вызовах mSearchForm указажите &element=`mSearch2Seo`;
  10. И замените вызовы mSearch2 на mSearch2Seo (при pdoPage/mFilter2 параметр &element=`mSearch2Seo`).
Никакой стандартный функционал поиска обычных страниц не страдает, работает также showLog.

Вот и ссылка на гитхаб github.com/sheronov/msearch2seo (скачать архивом можно во вкладке Releases).
Там тоже есть инструкция и описание. Но если что-то будет меняться — там будет более мгновенно обновляться.

Только скриншоты и Readme к себе на сайт копировать не нужно :)

Если я забыл учесть что-то важное для поиска, напишите в комментарии — обсудим.
Евгений Шеронов
29 января 2020, 12:13
modx.pro
4
1 691
+18
Поблагодарить автора Отправить деньги

Комментарии: 8

Семён Кудрявцев
11 февраля 2020, 10:05
0
Поставил потестить компонент и заметил один момент, что поля фильтров, если им указать условие,
например — {«published»:1,«template»:8} — будут собирать новые значения, только если заходить в каждый новый товар и явно в нем ставить галочку опубликован и сохранять ресурс. Но сбора новых значений в словарь не происходит, если публиковать товары через таблицу в категории — yadi.sk/i/YJ2lPD0e0eC0zA
Видимо нажатие этих кнопок не вызывает необходимых событий, на которые завязан компонент.
    Евгений Шеронов
    11 февраля 2020, 11:03
    1
    0
    Условия в полях немного по другому работают, они вообще больше созданы для условий, когда значения из сторонних таблиц.
    По идее эти условия срабатывают при сохранении поля, а при сохранении ресурса нет.
    Но вообще, надо бы этот момент поправить когда-нибудь, спасибо!

    Вот для ограничения сбора ресурсов есть настройки по шаблонам и типам ресурсов.

    Основные же условия для правильности подсчёта результатов пишутся в правилах. Вот они гораздо важнее, так как влияют на видимость страницы.
    Сергей
    06 апреля 2020, 20:27
    0
    Подскажите как на базе данного модуля реализовать плитку тегов. По средством какого сниппета у данного дополнения. Например как на DNS Это ссылки: Индукционные, 50 см. 60 см и.т.д.
    Как реализовать их отдельно от списка фильтров, ведь если добавлять их aliases и filters то они отобразяться как в списке фильров. Попробовал задействовать поле у магазина tags. Но пока не совсем понятно как верно все настроить. Есть может пример сниппета? В поддержку написать к сожалению не могу (покупал модуль еще в 17 году, но так и не настраивал его), в документации нет такого, точнее что то близкое есть но не работает.
      Сергей
      06 апреля 2020, 20:58
      0
      Я так полагаю это надо делать через Tagger…
        Евгений Шеронов
        11 мая 2020, 20:43
        1
        0
        Я не специально проигнорировал сообщение. Но ответить лучше поздно, чем никогда)

        По сути это делается через sfMenu просто с указанием параметров &parents=`[[*id]]` и &mincount=`1`.
        Там ещё можно учитывать относительность через параметр &relative=`1` (тогда ссылки будут каждый раз уходить в глубину от выбранного параметра, если такие правила есть).

        Но, конечно, как и на DNS, это просто популярные фильтры для этой страницы, и желательно, чтобы они были на странице. Их можно скрыть стилями или передать немного скрипты, чтобы проставленное значение сохранялось для пагинации.

        А как сделать фильтры для mSearch2 особо разницы нет, хоть ТВ поля, хоть опции, хоть через Tagger.
          Сергей
          11 мая 2020, 20:48
          +1
          Спасибо за ответ! Честно говоря этот вопрос уже давно закрыл)
        Александр
        28 декабря 2020, 23:36
        0
        Спасибо за отличное решение!
          Александр
          29 декабря 2020, 01:40
          0
          Заметил что при обновлении индекса, сыпятся такие ошибки и их много, но они однообразные:
          \core\components\msearch2\processors\mgr\index\createseo.class.php : 249) PHP warning: Invalid argument supplied for foreach()
          \core\components\msearch2\processors\mgr\index\createseo.class.php : 215) PHP warning: array_column() expects parameter 1 to be array, null given
          \core\components\msearch2\processors\mgr\index\createseo.class.php : 215) PHP warning: implode(): Invalid arguments passed
          На 249 строке в файле «createseo.class.php» ругается на этот код:
          foreach ($data['_words'] as $field => $word) {
                      foreach ($word as $key => $val) {
                          if (!isset($words[$key])) {
                              $words[$key] = $val;
                          }
                          if (mb_strpos($key, 'value') !== false) {
                              $words[str_replace('value', $field, $key)] = $val;
                          }
                      }
                      $words[$field.'_input'] = $word['input'];
                      $words[$field.'_alias'] = $word['alias'];
                      $words[$field.'_word'] = $word['id'];
                      $words['m_'.$field] = $word['m_value_i'];
                  }
          На 215 строке:
          $text = implode(' ', array_column($data['_words'], 'value'));

          Если его удалить, ошибки пропадают и всё вроде работает, но как можно попробовать избавится от этих ошибок без удаления кода, подскажите пожалуйста?
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            8