Рабочий поиск по сайту на CMS WordPress по дополнительным полям (Custom Fields) и по части фразы или слова

12.11.2016

Задача

Необходимо сделать поиск по сайту на CMS WordPress по дополнительным полям (Custom Fields) и по части фразы или слова для сайта-каталога картриджей для принтеров.

Проблема

  • Стандартный поиск работает только по Заголовку и Контенту по целому слову.
  • Relevansi при разных настройках работал по разному и по некоторым полям выдавал неправильные результаты, а по части слова показывал не то или не было результатов вообще.
  • Плагин Searchford WordPress Advanced Search работал четко по всем полям плагина Advanced Custom Fields + живая выдача результатов при вводе поискового запроса, но при этом по части слова ничего не находил.

Решение проблемы

Был найден сайт adambalee.com, на котором выложен отличный рабочий код для поиска по сайту. При этом автор предлагает поставить этот код в файл functions.php, а я предлагаю сделать этот код плагином и просто активировать его. Чем это лучше?

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

Реализация

  1. Код, который представлен ниже помещаем в файл creative-search.php
  2. По ftp закачиваем на свой сайт в папку plugins или добавляем файл в zip-архив и загружаем его через Плагины — Добавить новый — Загрузить плагин.
  3. Затем Активируем плагин в админке.
  4. Всё. Поиск работает красиво, правильно и адекватно. Благодарим вслух меня и автора кода Adam Balée, уходим пить чай.
  5. Если поиск не работает, отключаем плагин, удаляем и ищем другой вариант для реализации поиска по сайту по доп. полям и по части фразы.

Код, из которого делаем наш плагин:

<?php 
/*
Plugin Name: Creative Search
Author: Denis Creative
Plugin URI: https://adambalee.com/search-wordpress-by-custom-fields-without-a-plugin/
Author URI: http://denis-creative.com/
Description: It's works with ACF!
*/


/**
 * Extend WordPress search to include custom fields
 *
 * http://adambalee.com
 */

/**
 * Join posts and postmeta tables
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join
 */
function cf_search_join( $join ) {
  global $wpdb;

  if ( is_search() ) {    
    $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
  }

  return $join;
}
add_filter('posts_join', 'cf_search_join' );

/**
 * Modify the search query with posts_where
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where
 */
function cf_search_where( $where ) {
  global $pagenow, $wpdb;

  if ( is_search() ) {
    $where = preg_replace(
      "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
      "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
  }

  return $where;
}
add_filter( 'posts_where', 'cf_search_where' );

/**
 * Prevent duplicates
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_distinct
 */
function cf_search_distinct( $where ) {
  global $wpdb;

  if ( is_search() ) {
    return "DISTINCT";
  }

  return $where;
}
add_filter( 'posts_distinct', 'cf_search_distinct' );

?>

Или можете скачать мой готовый вариант плагина и просто установить его себе даже через админку. Если боитесь левого кода, то можете проверить и сравнить код в моем плагине и код на сайте автора. Добавлены только параметры для работы кода как плагина, и я файл поместил в папку creative-search, для порядка в каталогах.

Вот такой вид будет иметь ваш плагин Creative Search среди остальных плагинов (он неактивен на скриншоте):
Рабочий поиск по сайту на CMS WordPress по дополнительным полям (Custom Fields) и по части фразы или слова

И вот такой вид результатов поиска на сайте заказчика при поиске по части фразы из дополнительных полей, созданных плагином Advanced Custom Fields:
Рабочий поиск по сайту на CMS WordPress по дополнительным полям (Advanced Custom Fields) и по части фразы или слова

Полезная инфа:

Оставить комментарий