Поддержка Проблемы и решения Функция pre_get_posts()

  • Есть тестовый сайт с двумя рубриками: «Черновики» (по умолчанию для новых постов, ID рубрики = 1) и «Общее» (ID=2).

    Нужно: скрыть отображение рубрики с ID=1 во всех стандартных отображениях WP (главная, виджет Рубрики, календарь, поиск, архивы, rss и проч). Я понимаю, что прямая ссылка будет работать, вопрос не в этом, нужно скрыть отображение.

    Гугление дает печальные результаты, все сводится либо к ковырянию кода ядра, либо к изменению всех php страниц темы оформления, отвечающих за это, или к установке плагина Advanced Category Excluder (который не обновлялся 3 года и беглый анализ кода которого показывает, что скорее всего он просто подменяет стандартные php ядра на свои такие-же отредактированные):

    http://wp-money.ru/plaginy-wordpress/dopolnitelnye-vozmozhnosti/kak-skryt-rubriku-v-wordpress-bystryj-sposob-bez-plagina-rabotaet-100/

    http://moi-start.ru/kak-skryt-ubrat-rubriki-categories-wordpress.html/

    http://www.websoldier.ru/kak-skryt-rubriku-v-wordpress-advanced-category-excluder.html

    Полазив более основательно, нашел это:

    http://wp-kama.ru/hook/pre_get_posts

    Все примеры нормально работают, например этот (добавляя в конец functions.php текущей темы оформления — посты с главной с этой рубрикой пропадают):

    function exclude_category( $query ) {
    	if ( $query->is_front_page() && $query->is_main_query() ) {
    		$query->set( 'cat', '-1' );
    	}
    }
    add_action( 'pre_get_posts', 'exclude_category' );

    попробовал пока несколько, очевидно, что скрытость определяется наличием одного из параметров:

    $query->is_404
    $query->is_admin
    $query->is_archive
    $query->is_attachment
    $query->is_author
    $query->is_category
    $query->is_comments_popup
    $query->is_comment_feed
    $query->is_date
    $query->is_day
    $query->is_feed
    $query->is_home
    $query->is_month
    $query->is_page
    $query->is_paged
    $query->is_posts_page
    $query->is_post_type_archive
    $query->is_preview
    $query->is_robots
    $query->is_search
    $query->is_single
    $query->is_singular
    $query->is_tag
    $query->is_tax
    $query->is_time
    $query->is_trackback
    $query->is_year

    Вопрос:

    Благодаря набору параметров (выше) вроде удалось убрать отовсюду, кроме виджета Категории. Там по прежнему рубрику видно. Не могли бы дать пример кода, который уберет рубрику «всамомделишным» способом везде (что-то типа «$query->is_all»)?

    Спасибо.

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

    (@denisco)

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

    А если просто, без условий? Что происходит?

    function exclude_category( $query ) {
    	if ( ! is_admin() ) {
    		$query->set( 'cat', '-1' );
    	}
    }
    add_action( 'pre_get_posts', 'exclude_category' );

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Убрать из условия && $query->is_main_query().

    Можно ещё добавить && is_admin(), чтобы функция влияла только на внешнюю часть сайта, а не на админку.

    сейчас код такой,

    function gu_hide_cat($query) {
    if 	($query->is_404 ||
    //	$query->is_admin ||
    	$query->is_archive ||
    	$query->is_attachment ||
    	$query->is_author ||
    	$query->is_category ||
    	$query->is_comments_popup ||
    	$query->is_comment_feed ||
    	$query->is_date ||
    	$query->is_day ||
    	$query->is_feed ||
    	$query->is_home ||
    	$query->is_month ||
    	$query->is_page ||
    	$query->is_paged ||
    	$query->is_posts_page ||
    	$query->is_post_type_archive ||
    	$query->is_preview ||
    	$query->is_robots ||
    	$query->is_search ||
    	$query->is_single ||
    	$query->is_singular ||
    	$query->is_tag ||
    	$query->is_tax ||
    	$query->is_time ||
    	$query->is_trackback ||
    	$query->is_year)
    //if ($query->is_feed || ($query->is_home && !(is_paged())))
    	   {$query->set('cat','-1');}
    		  return $query; }
    add_filter('pre_get_posts','gu_hide_cat', gu_wp_order);

    записей нигде не видно, но в стандартном виджете рубрик вижу рубрику — вот ее оттуда как выпилить (и для адм. в том числе)?

    >> А если просто, без условий? Что происходит?

    аналогично моему коду выше, но рубрики видны в виджете

    Спасиб за ответы, братцы.

    >> Убрать из условия
    записи пропадают везде, только не в стд. виджете Рубрики (их рубрики видно).

    Т.е. с показом записей разобрались, теперь как сами рубрики скрыть (их отображение).

    ++
    На сколько понял, эта функция действует только на записи, не на рубрики. Есть что-то аналогичное, но для рубрик?
    Видимо, не совсем корректно задал начальный вопрос. Надо скрыть и посты в рубриках (готово) и сами рубрики от отображения.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Точно, там же не запрашиваются записи, поэтому не используется pre_get_posts.

    Для виджета нужна отдельная функция:

    function exclude_category_from_widget( $args ) {
    	$args['exclude'] = '1';
    	return $args;
    }
    add_filter( 'widget_categories_args', 'exclude_category_from_widget' );
    add_filter( 'widget_categories_dropdown_args', 'exclude_category_from_widget' );

    Работает…

    Дядя Серёжа, Вам когда-то точно поставят памятник 🙂

    Благодарю.

    надеюсь, в сл. версиях WP будет реализовано:
    1. в постах — кроме статусов черновик, личное, опубликовано, прилеплено — скрыто с главной
    2. в рубриках — опция скрыть из списка рубрик
    3. ну и в идеале — чтобы посты после скрытия — не открывались по прямой ссылке (кроме типа записи было бы еще «кому показывать» — группы пользователей + аналог для рубрик — они не открываются по прямой ссылке после операций выше, а записи — пожалуйста)

    так, мысли вслух..

Просмотр 8 ответов — с 1 по 8 (всего 8)
  • Тема «Функция pre_get_posts()» закрыта для новых ответов.