Как добавить поддержку меток и рубрик для страниц WP?

Несмотря на то, что всё это делается функцией register_taxonomy_for_object_type(), код для каждой таксономии будет разным — отдельно для рубрик, отдельно для меток и отдельно для произвольной таксономии.

Каждый листинг кода будет состоять из двух частей:

  1. Первая часть кода — основная, именно в ней и будет добавляться поддержка определенной таксономии (рубрики, метки и пр.)
  2. Вторая часть кода — это модификация стандартных запросов. Т.е. например вы открыли на сайте страницу архива какой-либо категории, а там отображаются и записи post и страницы page.

Как привязать рубрики к страницам?

Достаточно добавить этот код в functions.php темы.

function true_apply_categories_for_pages(){
	add_meta_box( 'categorydiv', 'Категории', 'post_categories_meta_box', 'page', 'side', 'normal'); // добавляем метабокс категорий для страниц
	register_taxonomy_for_object_type('category', 'page'); // регистрируем рубрики для страниц
}
// обязательно вешаем на admin_init
add_action('admin_init','true_apply_categories_for_pages');
 
function true_expanded_request_category($q) {
	if (isset($q['category_name'])) // если в запросе присутствует параметр рубрики
		$q['post_type'] = array('post', 'page'); // то, помимо записей, выводим также и страницы
	return $q;
}
 
add_filter('request', 'true_expanded_request_category');

Как привязать метки к страницам?

Можно одновременно использовать с кодом для рубрик.

function true_apply_tags_for_pages(){
	add_meta_box( 'tagsdiv-post_tag', 'Теги', 'post_tags_meta_box', 'page', 'side', 'normal' ); // сначала добавляем метабокс меток
	register_taxonomy_for_object_type('post_tag', 'page'); // затем включаем их поддержку страницами wp
}
 
add_action('admin_init','true_apply_tags_for_pages');
 
function true_expanded_request_post_tags($q) {
	if (isset($q['tag'])) // если в запросе присутствует параметр метки
		$q['post_type'] = array('post', 'page');
	return $q;
}
 
add_filter('request', 'true_expanded_request_post_tags');

Окей, я вставил весь код выше (и тот, который для категорий и тот, который для тегов) «как есть» в functions.php своей темы, и вот что у меня получилось:

Включаем поддержку рубрик и меток для страниц WordPress

Метабоксы рубрик и меток на странице редактирования страниц (тип поста page) WordPress.

Привязка таксономий к произвольным типам постов

Способ 1. register_taxonomy()

Тут всё проще — достаточно при регистрации таксономии указать все необходимые типы постов в параметре $object_type функции register_taxonomy().

$taxonomy = ''; // название таксономии
$object_type = array(); // тут и указываем все необходимые типы постов в виде массива
$args = array(); // параметры таксономии
register_taxonomy( $taxonomy, $object_type, $args );

Способ 2. register_taxonomy_for_object_type() и фильтр «request»

А что, если у нас нет доступа к параметрам функции register_taxonomy()? Что, если она является частью плагина или темы, и установленные нами параметры будут сбрасываться каждый раз при обновлении?

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

В данном примере привязываем рубрики к произвольному типу постов product.

function true_apply_taxonomy_for_post_type(){
	// add_meta_box() в данном случае не нужен
	register_taxonomy_for_object_type('category', 'product');
}
 
add_action('admin_init','true_apply_taxonomy_for_post_type');  
 
function true_expanded_request_custom($q) {
	if (isset($q['category_name'])) // для произвольных таксономий нужно использовать их название, например $q['product_category']
		$q['post_type'] = array('post', 'product');
	return $q;
}
 
add_filter('request', 'true_expanded_request_custom');
Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

Смотрите также

Комментарии 27

  • Мария12 июня 2015 в 22:06 #

    Спасибо, очень пригодилась статья!

  • alx dh24 июня 2015 в 17:06 #

    А как в функции true_expanded_request_custom($q) добавить к категориям еще и тэги, и произвольную таксономию custom_tax?
    В синтаксисе плаваю и вообще... ))
    Заранее спасибо.

  • Ира28 июля 2015 в 11:07 #

    Скажите пожалуйста а как привязать к странице к рубрики?

  • Наташа11 августа 2015 в 18:08 #

    У меня тот же вопрос что и у Иры, теперь страницы в рубриках отображаются, а надо чтобы определенная рубрика на страницу выводилась, т.е страница не была статичной, а наполнялась определенной рубрикой.. Заранее спасибо!

  • Andy5 сентября 2015 в 10:09 #

    У меня код не заработал. Ошибку выдает при сохранении страницы, для которой была выбрана рубрика.
    То есть, meta box на "страницах" отображается, но толку от него, если при сохранении белый фон и предупреждение:

    Warning: Cannot modify header information - headers already sent by (output started at W:\domains\travel\wp-content\themes\mosaic\functions.php:1) in W:\domains\travel\wp-admin\post.php on line 235

    Warning: Cannot modify header information - headers already sent by (output started at W:\domains\travel\wp-content\themes\mosaic\functions.php:1) in W:\domains\travel\wp-includes\pluggable.php on line 1178

  • Andy5 сентября 2015 в 11:09 #

    Простите... ошибка в кодировке.

    Код работает, спасибо! Но только в бэк-энде.

  • Александр19 сентября 2015 в 04:09 #

    Здравствуйте! Как я могу получить массив с рубриками, привязанными к странице?
    Привязал 2 рубрики, вардамплю:

    $id = get_the_ID();
    var_dump( get_page($id) );

    Вывод:

    object(WP_Post)#7343 (24) { ["ID"]=> int(11) ["post_author"]=> string(1) "1" ["post_date"]=> string(19) "2014-09-27 17:39:00" ["post_date_gmt"]=> string(19) "2014-09-27 10:39:00" ["post_content"]=> string(0) "" ["post_title"]=> string(12) "Статьи" ["post_excerpt"]=> string(0) "" ["post_status"]=> string(7) "publish" ["comment_status"]=> string(4) "open" ["ping_status"]=> string(6) "closed" ["post_password"]=> string(0) "" ["post_name"]=> string(8) "articles" ["to_ping"]=> string(0) "" ["pinged"]=> string(0) "" ["post_modified"]=> string(19) "2015-09-19 08:19:05" ["post_modified_gmt"]=> string(19) "2015-09-19 01:19:05" ["post_content_filtered"]=> string(0) "" ["post_parent"]=> int(0) ["guid"]=> string(34) "http://a839288a8932.tmweb.ru/?page_id=11" ["menu_order"]=> int(3) ["post_type"]=> string(4) "page" ["post_mime_type"]=> string(0) "" ["comment_count"]=> string(1) "0" ["filter"]=> string(3) "raw" }

    О привязанных рубриках никакого упоминания..

  • Мария22 ноября 2015 в 11:11 #

    Михаил, добрый день.
    Уже не первый раз нахожу ваши полезные статьи в поисковике по разным запросам. Теперь уже вижу домен и жму для перехода на сайт, т.к. знаю, что тут все по делу))
    Михаил, у меня вопрос такой: а на главное страницы будут в этом случае выводиться? В ленту рсс уходить? Мне бы не надо... То есть, я жду от этой функции, что страницы с полезной информацией будут добавляться как бы фоном, незаметно для пользователей, но в то же время для заинтересованных в рубрике и по тегу страницы отображаться будут.
    Например, есть рубрика "Бали", тег "Авиа". Я создала запись про аэропорт Денпасар, понятно, что в рассылке это никому неинтересно читать, да и на главной вовсе необязательно это афишировать, эта запись просто для поискового трафика. Вот думаю подобные статьи создавать страницами, но чтобы в рубриках или как минимум по тегам они фигурировали, но в общей ленте не шли.
    Если я сделаю функционал в вашей статье, это так и будет работать, или же страницы будут себя вести как и записи блога? Спасибо!

  • Никита16 ноября 2016 в 15:11 #

    Михаил здравствуйте! Во-первых отличный блог, много полезной информации, спасибо Вам) Теперь собственно сабж:
    Проделал все как написано в статье, но что-то не могу понять что изменилось, страница отображается так, будто не имеет к рубрике никакого отношения. Ожидал увидеть примерно следующее:
    Создал страницу, привязал к рубрике. При переходе в рубрику, отображается ссылка на эту страницу. Переходим по ссылке и открывается та самая страница. Но сейчас даже в хлебных крошках не выстраивается нужная иерархия. Объясню что нужно:

    Есть несколько рубрик, условно:
    -Дома кирпичные
    -Дома из бруса
    ...
    В каждой рубрике есть что-то похожее на меню:
    -Дома кирпичные
    --Описание(просто текст)
    --Проекты(список постов)
    --Отзывы(список постов)
    ...
    -Дома из бруса
    --аналогичные пункты

    В итоге иерархия должна строиться след. образом:
    Дома кирпичные -> Описание
    Дома кирпичные -> Проекты -> Проект 1
    и т.д.

    Реализовал бы все через вложенные рубрики, но сложность в том, что для пунктов в которых есть посты нужен уникальный шаблон. Надеюсь понятно объяснил) Подскажите пожалуйста в какую сторону копать, как-то дорабатывать Ваше решение, или может есть другой вариант? Спасибо!

    • Миша17 ноября 2016 в 08:11 #

      Добрый день!
      спасибо!

      По идее этот код делает две вещи:
      1) добавляет возможность при редактировании страницы определить рубрику для неё
      2) на самой рубрике выводить помимо записей еще и страницы.

      По идее код этот в своё время использовался и должен работать. У вас второй пункт не работает я верно понимаю? Рубрика вообще пустая или в ней только записи отображаются сейчас?

      • Никита17 ноября 2016 в 10:11 #

        Первый пункт работает. Второй нет. В рубрике выводятся записи, но не выводятся страницы. Ну и я так полагаю что не строятся хлебные крошки в нужном порядке, а надо бы) Спасибо!

        • Миша18 ноября 2016 в 18:11 #

          Попробуйте этот код вставить в functions.php темы:

          function tr_pre_redefining_query( $query ) {
          	if ( $query->is_category ) { // если рубрика
          		$query->set('post_type', array('post', 'page')); // ставим тип и записи и страницы
          	}
          	return $query;
          }
           
          add_filter('pre_get_posts', 'tr_pre_redefining_query');
          • Никита20 ноября 2016 в 20:11 #

            Спасибо! Сейчас вывелась ссылка на страницу, но по прежнему хлебные крошки ее как-будто не видят. И еще такой момент: Заметил что если какой-то кастомный шаблон(category-{ID}.php), то ссылка на страницу уже не выводится, а если по умолчанию, то работает как нужно. Можно ли как-то победить обе проблемы? Спасибо!

            • Миша21 ноября 2016 в 15:11 #

              То есть при переходе на страницу в хлебных крошках не появляется рубрика, к которым она принадлежит?

              Про кастомный шаблон - не понял про ссылку. Имеется ввиду, что страницы не появляются в цикле?

              • Никита21 ноября 2016 в 18:11 #

                Да, при переходе на страницу в хлебных крошках идет: Главная -> Страница, рубрики между ними нет.

                По кастомному шаблону тоже верно, если это просто стандартный цикл то все выводится, если с параметрами то нет.

                Решил сделать по-другому, т.к. время поджимает. Сделал следующим образом:
                1) Создал страницы(как основные разделы), к ним создал подстраницы(как подразделы).
                2) Через плагин произвольных полей(ACF) создал поле для страниц "Привязка к рубрике".
                3) При создании страниц, привязывается рубрика и выбирается кастомный шаблон для страницы. Дальше все кодом.

                Но и здесь столкнулся с проблемой. Т.к. рубрика и страница имеют одинаковые урлы, приоритет отдается рубрике, и шаблон уже не работает. В общем запутался( Подскажите пожалуйста как лучше сделать? Спасибо!

                • Миша22 ноября 2016 в 18:11 #

                  Лучше вернуться к моему способу, просто цикл с параметрами у вас неправильно задается - добавьте к нему везде как минимум ещё параметр

                  'post_type' => array('page','post')
                  • Никита28 ноября 2016 в 16:11 #

                    Михаил здравствуйте! Снова я) Попробовал добавить параметр что Вы написали. Теперь страница выводится, но урл все равно формируется неправильно(в хлебных крошках соответственно тоже). По логике должно быть так:
                    корень-сайта/рубрика/страница
                    а работает так:
                    корень-сайта/страница
                    Цикл выглядит так:

                    <? 
                    $args = array(
                    	'cat' => $cat,
                    	'orderby' => 'ID',
                    	'order' => 'DESC',
                    	'post_type' => array('page','post')
                    );
                    query_posts($args); 
                    if ( have_posts() ) : while ( have_posts() ) : the_post();?>

                    Как вообще решить эту задачу? Спасибо!

                    • Миша28 ноября 2016 в 17:11 #

                      Здравствуйте,

                      данная статья не затрагивает ни URL, ни хлебных крошек. И к сожалению статей на эту тему у меня нет.

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

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Миша: Да, точно)

  • Владимир: и на третьей строке не хватает скобки ) закрывающей if :)

  • Миша: Добрый вечер! Рекомендую получить ID пользователя через функцию get_current_user_id().

  • Дмитрий: Миша, подскажите пожалуйста, я использую такой редирект, но он не срабатывает: add_action( 'template_redirect', funct...

  • Миша: Ну как не определена - это аргумент функции. Или я просто вас не до конца понимаю.