Поддержка Проблемы и решения Штатный поиск по доп.полям записи

  • Во всех записях добавлено произвольное поле «Notes» (примечания) — средствами WP.
    Можно ли добавить в штатный поиск (оптимально кодом в fun..s.php схемы) возможность искать записи, учитывая это поле? Т.е. если в записи есть это поле и в нем текст содержит, например, «12345», то при поиске на главной этой строки эта запись попала бы в результаты поиска?

Просмотр 2 ответов — с 1 по 2 (всего 2)
  • Модератор Denis Yanchevskiy

    (@denisco)

    WordPress-разработчик, denisco.pro

    Порылся в архивах. Как-то давно решал подобную проблему и совсем штатными средствами у меня не вышло. Возможно, сейчас есть лучший вариант, но на тот момент у меня получилось следующее:

    
    function dco_posts_where_request( $where ) {
    	if ( is_search() ) {
    		$where = str_replace( "AND ( 
      ( wp_postmeta.meta_key = 'product_sku' AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%" . get_search_query() . "%' )
    )", '', $where );
    
    		$where = str_replace( "OR (wp_posts.post_content LIKE '%" . get_search_query() . "%')", "OR (wp_posts.post_content LIKE '%" . get_search_query() . "%') OR (
      wp_postmeta.meta_key = 'product_sku' AND CAST(wp_postmeta.meta_value AS CHAR) LIKE '%" . get_search_query() . "%'
      )", $where );
    	}
    
    	return $where;
    }
    
    add_action( 'pre_get_posts', 'alter_query' );
    
    function alter_query( $query ) {
    	if ( !is_admin() && $query->is_main_query() ) {
    		if ( $query->is_search ) {
    			$query->set( 'post_type', 'post' );
    			$query->set( 'posts_per_page', 6 );
    			$query->set( 'orderby', 'title' );
    			$query->set( 'order', 'asc' );
    
    			$meta_query_args = array(
    				array(
    					'key'		 => 'product_sku',
    					'value'		 => get_search_query(),
    					'compare'	 => 'LIKE'
    				)
    			);
    
    			$query->set( 'meta_query', $meta_query_args );
    
    			//we remove the actions hooked on the '__after_loop' (post navigation)
    			remove_all_actions( '__after_loop' );
    
    			add_filter( 'posts_where', 'dco_posts_where_request' );
    		}
    	}
    }
    

    Насколько помню, заменять куски запроса пришлось, так как в WP не было возможности поставить условие или контент или поле.

    • Ответ изменён 7 лет, 7 месяцев назад пользователем Denis Yanchevskiy.

    при поиске на главной

    Так при поиске (результат в search.php) или на главной (др шаблоны с разными способами вывода контента)?
    Для поиска и фильтрации есть напр. https://wordpress.org/plugins/search-filter/

    • Ответ изменён 7 лет, 7 месяцев назад пользователем SeVlad.
Просмотр 2 ответов — с 1 по 2 (всего 2)
  • Тема «Штатный поиск по доп.полям записи» закрыта для новых ответов.