Поддержка Проблемы и решения Исключение рубрик из поиска

  • нужна помощь в переделке кода
    Данный код исключает рубрики из поиска:

    function exclude_categories_from_search( $query ) {
    	if ( is_admin() || ! $query->is_main_query() ) {
    		return;
    	}
    
    	if ( $query->is_search() ) {
    		$query->set( 'category__not_in', array( 1, 2, 3 ) );
    	}
    }
    add_action( 'pre_get_posts', 'exclude_categories_from_search' );

    код работает, но плагин для живого поиска (Dave’s WordPress Live Search) отображает скрытые рубрики.
    так же нашел еще один код, который исключает из поиска статические страницы, приведенный ниже код работает с плагином.

    function search_posts_only($where) {
    	global $wp_query, $wpdb;
    
    	if ( !empty($wp_query->query_vars['s']) ) {
    		$where .= " AND $wpdb->posts.post_type != 'page'";
    	}
    
    	return $where;
    }
    add_filter('posts_where', 'search_posts_only');

    Можно второй код, который исключает из поиска вывод страниц, переделать так, чтоб он исключал из поиска вывод некоторых рубрик?
    это нужно для того, чтоб запрет распространялся на плагин живого поиска.

Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Думаю, что первый вариант кода не исполняется, потому как не установлен шаблон is_search.

    Взгляните на исходный код плагина
    https://plugins.trac.wordpress.org/browser/daves-wordpress-live-search/tags/4.2/class-daves-wordpress-live-search-results.php#L29
    Есть две новости, одна грустная, другая — неплохая 🙂

    Грустная: Используется get_posts для получения списка постов.
    Неплохая: Есть фильтр, находится на строке 49. Попробуйте поработать с ним.

    Строчку найти удалось

    $wpQueryResults = $wp_query->get_posts();
    $wpQueryResults = apply_filters( 'dwls_alter_results', $wpQueryResults, -1, $this );

    только не совсем ясно, что с ней нужно сделать…
    В этом плагине даже есть специальная форма, через которую можно вписать id постов и страниц, только почему-то она не работает пробовал десятки разных комбинаций безрезультатно.

    не совсем ясно, что с ней нужно сделать…

    Попробовать применить. Как-то так:

    function dwls_exclude_cats() {
        return get_posts( array( 'category__not_in' => array(1, 2, 3) ) );
    }
    add_filter( 'dwls_alter_results', 'dwls_exclude_cats' );

    За результат не ручаюсь, но надеюсь на лучшее, как и вы. 😉

    Добавил этот код в файл (function.php)не сработал. Может есть еще какие-то варианты, скорей всего где-то ошибка, поскольку данный код не исключает из поиска рубрики, а код в самом верху работает, но плагин его игнорит и все равно выводит заблокированные рубрики.

    function dwls_exclude_cats() {
        return get_posts( array( 'category__not_in' => array(1, 2, 3) ) );
    }
    add_filter( 'dwls_alter_results', 'dwls_exclude_cats' );

    Пробовал добавлять данный код в файл function.php , но безрезультатно, скорей всего есть ошибка, поскольку запрет не распространяется даже на обычный поиск, в отличии от кода в самом верху. возможно есть еще варианты…

    А вы попробуйте прямо в коде плагина изменить строчку
    $wpQueryResults = $wp_query->get_posts();
    на

    $wpQueryResults = $wp_query->get_posts( array( 'category__not_in' => array(1, 2, 3) ) );

    И проверьте — работает или нет.


    Надеюсь, вы не забыли вместо 1,2,3 внести нужные ID рубрик? А вдруг!? 🙂

    не сработало, про ID рубрик я в курсе)

    не сработало,

    Э-эх.. Значит не помогло (

    В любом случае спасибо за помощь, может еще кто-то отпишет.

    Посмотрел еще раз исходный код. В том же файле https://plugins.trac.wordpress.org/browser/daves-wordpress-live-search/tags/4.2/class-daves-wordpress-live-search-results.php#L155 есть одноименная функция отрабатывающая на экшене pre_get_posts. Думаю, если в ней выставить query-аргумент, например в 162 строке:
    $query->set( 'cat', '-1,-2,-3' ); //исключаемые категории
    то должно сработать..

    Попробуйте.. Ведь интересно же понять и разобраться 🙂

    —ЗЫ
    Это наглый хак-метод-костыль, потому как не видно более достойных вариантов. Ведь все решения всегда ограничены нашими знаниями и «некорректностью» исходного кода 🙂

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

    function searchExcludePages($query) {
    	if ($query->is_search) {
    		$query->set('post_type', 'post');
    		$query->set('category__not_in','30');
    	}
    
    	return $query;
    }
    
    add_filter('pre_get_posts','searchExcludePages');
Просмотр 11 ответов — с 1 по 11 (всего 11)
  • Тема «Исключение рубрик из поиска» закрыта для новых ответов.