WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

register_taxonomy() WP 2.3

Добавляет (регистрирует) новую (пользовательскую) таксономию. Можно перезаписать существующую таксономию.

Функцию желательно вызывать во время события init:

add_action( 'init', 'function_name' );

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

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

Когда нужно зарегистрировать новый тип записи, используйте register_post_type()

Удобный плагин, который позволяет регистрировать новые типы записей и таксономии: Custom Post Type UI

Работает на основе: WP_Taxonomy()
Хуки из функции
Возвращает

WP_Error/null.

Шаблон использования

// хук для регистрации
add_action( 'init', 'create_taxonomy' );
function create_taxonomy(){

	// список параметров: wp-kama.ru/function/get_taxonomy_labels
	register_taxonomy( 'taxonomy', [ 'post' ], [ 
		'label'                 => '', // определяется параметром $labels->name
		'labels'                => [
			'name'              => 'Genres',
			'singular_name'     => 'Genre',
			'search_items'      => 'Search Genres',
			'all_items'         => 'All Genres',
			'view_item '        => 'View Genre',
			'parent_item'       => 'Parent Genre',
			'parent_item_colon' => 'Parent Genre:',
			'edit_item'         => 'Edit Genre',
			'update_item'       => 'Update Genre',
			'add_new_item'      => 'Add New Genre',
			'new_item_name'     => 'New Genre Name',
			'menu_name'         => 'Genre',
		],
		'description'           => '', // описание таксономии
		'public'                => true,
		// 'publicly_queryable'    => null, // равен аргументу public
		// 'show_in_nav_menus'     => true, // равен аргументу public
		// 'show_ui'               => true, // равен аргументу public
		// 'show_in_menu'          => true, // равен аргументу show_ui
		// 'show_tagcloud'         => true, // равен аргументу show_ui
		// 'show_in_quick_edit'    => null, // равен аргументу show_ui
		'hierarchical'          => false,

		'rewrite'               => true,
		//'query_var'             => $taxonomy, // название параметра запроса
		'capabilities'          => array(),
		'meta_box_cb'           => null, // html метабокса. callback: `post_categories_meta_box` или `post_tags_meta_box`. false — метабокс отключен.
		'show_admin_column'     => false, // авто-создание колонки таксы в таблице ассоциированного типа записи. (с версии 3.5)
		'show_in_rest'          => null, // добавить в REST API
		'rest_base'             => null, // $taxonomy
		// '_builtin'              => false,
		//'update_count_callback' => '_update_post_term_count',
	] );
}

Использование

register_taxonomy( $taxonomy, $object_type, $args );
$taxonomy(строка) (обязательный)
Название создаваемой таксономии.
Может содержать только строчные латинские символы, числа и _, т.е. a-z0-9_.
По умолчанию: ''
$object_type(строка/массив) (обязательный)
Название типов постов, к которым будет привязана таксономия. В этом параметре, например, можно указать 'post', тогда у обычных постов WordPress появится новая таксономия (возможность классификации).
По умолчанию: ''
$args(массив) (обязательный)
Массив аргументов определяющий признаки таксономии.
По умолчанию: нет

Аргументы параметра $args

label(строка)
Название таксономии во множественном числе (для отображения в админке).
По умолчанию: используется значение аргумента $labels->name
labels(массив)

Массив описывающий заголовки таксономии (для отображения в админке).

По умолчанию используются заголовки "меток" для не древовидных типов таксономий и заголовки "категорий" для древовидных таксономий.

  • name
    Имя таксономии, обычно во множественном числе. По умолчанию _x( 'Post Tags', 'taxonomy general name' ) или _x( 'Categories', 'taxonomy general name' );

  • singular_name
    Название для одного элемента этой таксономии. По умолчанию _x( 'Post Tag', 'taxonomy singular name' ) или _x( 'Category', 'taxonomy singular name' );

  • menu_name
    Текст для названия меню. Эта строка обозначает название для пунктов меню. По умолчанию значение параметра name;

  • search_items
    Текст для поиска элемента таксономии. По умолчанию __( 'Search Tags' ) или __( 'Search Categories' );

  • popular_items
    Текст для блока популярных элементов. __( 'Popular Tags' ) или null;

  • all_items
    Текст для всех элементов. __( 'All Tags' ) или __( 'All Categories' );

  • parent_item
    Текст для родительского элемента таксономии. Этот аргумент не используется для не древовидных таксономий. По умолчанию null или __( 'Parent Category' );

  • parent_item_colon
    Текст для родительского элемента таксономии, тоже что и parent_item но с двоеточием в конце. По умолчанию нет или __( 'Parent Category:' );

  • edit_item
    Текст для редактирования элемента. По умолчанию __( 'Edit Tag' ) или __( 'Edit Category' );

  • update_item
    Текст для обновления элемента. По умолчанию __( 'Update Tag' ) или __( 'Update Category' );

  • add_new_item
    Текст для добавления нового элемента таксономии. По умолчанию __( 'Add New Tag' ) или __( 'Add New Category' );

  • view_item
    Текст для просмотра термина таксономии. По умолчанию: "Посмотреть метку", "Посмотреть категорию". Используется например, в админ баре (тулбаре).

  • new_item_name
    Текст для создания нового элемента таксономии. По умолчанию __( 'New Tag Name' ) или __( 'New Category Name' );

  • separate_items_with_commas
    Текст описывающий, что элементы нужно разделять запятыми (для блога в админке). Не работает для древовидного типа. По умолчанию __( 'Separate tags with commas' ) или null;

  • add_or_remove_items
    Текст для "удаления или добавления элемента", который используется в блоке админке, при отключенном javascript. Не действует для древовидных таксономий. По умолчанию __( 'Add or remove tags' ) или null;

  • choose_from_most_used
    текст для блога при редактировании поста "выберите из часто используемых". Не используется для древовидных таксономий. По умолчанию __( 'Choose from the most used tags' ) или null;

  • popular_items
    Текст для поиска популярных терминов. Этот параметр не используется для древовидных таксономий. По умолчанию: "Популярные метки" или null.

  • separate_items_with_commas
    Текст говорящий о том, что термины (метки) нужно разделять запятыми. Не используется для древовидных таксономий. По умолчанию: "Разделяйте метки запятыми" или null.

  • add_or_remove_items
    Текст для добавления или удаления терминов. Не используется для древовидных типов. По умолчанию: "Добавить или удалить метки". или null.

  • choose_from_most_used
    Текст "Выбрать из часто используемых". Не используется для древовидных типов.

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

Весь список смотрите в описании get_taxonomy_labels()

По умолчанию: заголовки меток/категорий

public(логический)
Показывать ли эту таксономию в интерфейсе админ-панели. Это значение передается параметрам publicly_queryable, show_ui, show_in_nav_menus если для них не установлено свое значение.
По умолчанию: true
show_ui(логический)
Показывать блок управления этой таксономией в админке.
По умолчанию: если нет, равно аргументу public
show_in_menu(логический)

Показывать ли таксономию в админ-меню.

  • true - таксономия будет показана как подменю у типа записи, к которой она прикреплена.
  • false - подменю не будет показано.

Параметр $show_ui должен быть включен (true).

По умолчанию: если нет, равно аргументу show_ui

show_in_nav_menus(логический)
true даст возможность выбирать элементы этой таксономии в навигационном меню.
По умолчанию: если нет, равно аргументу public
show_tagcloud(логический)
Создать виджет облако элементов этой таксономии (как облако меток).
По умолчанию: если нет, равно аргументу show_ui
show_in_rest(логический)
Нужно ли включать таксономию в REST API. С WP 4.7.
rest_base(строка)
Ярлык в REST API. По умолчанию, название таксономии. С WP 4.7.
По умолчанию: $taxonomy
rest_controller_class(строка)
Название класса контроллера в REST API. С WP 4.7.
По умолчанию: 'WP_REST_Terms_Controller'
hierarchical(логический)
true - таксономия будет древовидная (как категории). false - будет не древовидная (как метки).
По умолчанию: false
update_count_callback(строка)

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

По умолчанию:

  • _update_post_term_count для таксономий прикрепленных к типам записей.
  • _update_generic_term_count для таксономий, присоединенных к другим объектам, например, к юзерам.

Функция получит следующие параметры:

  • $termsterm_taxonomy_id терминов которые нужно обновить.
  • $taxonomy — Объект таксономии.

По умолчанию: '_update_post_term_count' или '_update_generic_term_count'

rewrite(массив/логический)

false - отключит перезапись. Если указать массив, то можно задать произвольный параметр запроса (query var). А по умолчанию будет использоваться параметр $taxonomy.

Возможные аргументы массива:

  • slug - предваряет таксономии этой строкой. По умолчанию название таксономии;
  • with_front - позволяет установить префикс для постоянной ссылки. По умолчанию true;
  • hierarchical - true - включает поддержку древовидных URL (с версии 3.1). По умолчанию false;

Массив передается в функцию add_permastruct(), поэтому тут также можно указать аргументы этой функции.

По умолчанию: true

publicly_queryable(логический)
Имеют ли пользователи доступ к элементам таксономии во внешней части сайта. Если не установлено, то берется значение параметра public. C версии 4.5.
По умолчанию: null (равен аргументу public)
query_var(строка/логический)
Если указать false, выключит параметры запроса и сам запрос. Или можно указать строку, чтобы изменить параметр запроса (query var). По умолчанию будет использоваться параметр $taxonomy - название таксономии.
По умолчанию: $taxonomy
capabilities(массив)

Массив прав для этой таксономии:

  • manage_terms - 'manage_categories'
  • edit_terms - 'manage_categories'
  • delete_terms - 'manage_categories'
  • assign_terms - 'edit_posts'

По умолчанию: нет

meta_box_cb(строка)

callback функция. Отвечает за то, как будет отображаться таксономия в метабоксе (с версии 3.8).

Встроенные названия функций:

  • post_categories_meta_box - показывать как категории
  • post_tags_meta_box - показывать как метки.

Если указать false, то метабокс будет отключен вообще.

По умолчанию: null

show_admin_column(логический)
Позволить или нет авто-создание колонки таксономии в таблице ассоциированного типа записи. (с версии 3.5)
По умолчанию: false
show_in_quick_edit(логический)
Показывать ли таксономию в панели быстрого редактирования записи (в таблице, списке всех записей, при нажатии на кнопку "свойства"). С версии 4.2.
По умолчанию: null (значение show_ui)
sort(логический)

Следует ли этой таксономии запоминать порядок в котором созданные элементы (термины) прикрепляются к объектам (записям).

Например, для тегов, если этот параметр true, то при получении тегов они должны выводиться в том порядке, в котором они были указаны (добавлены) для записи. Т.е. если этот флаг установлен, то сортировка терминов должна быть не по name а по полю term_order.

При true в таблицу wp_term_relationships в поле term_order будет записываться число - порядок в котором расположены рубрики, в которые добавлена запись. Чаще всего эта настройка не нужна, более того, параметр этот есть, но в коде он нигде не прописан и по факту ни на что не виляет.
По умолчанию: null

_builtin(логический) (не для обычного использования)
Параметр предназначен для разработчиков. Если переключить на true, то это будет означать что эта таксономия относится к внутренним таксономия WordPress и не является встроенной (кастомной).
По умолчанию: false

Примеры

#1. Регистрация таксономий

Пример регистрации двух таксономий "genres" и "writers" для постов типа "book". Этот код можно вставить в файл темы functions.php. Некоторые аргументы рассчитаны на версию 3.1+:

// хук, через который подключается функция
// регистрирующая новые таксономии (create_book_taxonomies)
add_action( 'init', 'create_book_taxonomies' );

// функция, создающая 2 новые таксономии "genres" и "writers" для постов типа "book"
function create_book_taxonomies(){

	// Добавляем древовидную таксономию 'genre' (как категории)
	register_taxonomy('genre', array('book'), array(
		'hierarchical'  => true,
		'labels'        => array(
			'name'              => _x( 'Genres', 'taxonomy general name' ),
			'singular_name'     => _x( 'Genre', 'taxonomy singular name' ),
			'search_items'      =>  __( 'Search Genres' ),
			'all_items'         => __( 'All Genres' ),
			'parent_item'       => __( 'Parent Genre' ),
			'parent_item_colon' => __( 'Parent Genre:' ),
			'edit_item'         => __( 'Edit Genre' ),
			'update_item'       => __( 'Update Genre' ),
			'add_new_item'      => __( 'Add New Genre' ),
			'new_item_name'     => __( 'New Genre Name' ),
			'menu_name'         => __( 'Genre' ),
		),
		'show_ui'       => true,
		'query_var'     => true,
		//'rewrite'       => array( 'slug' => 'the_genre' ), // свой слаг в URL
	));

	// Добавляем НЕ древовидную таксономию 'writer' (как метки)
	register_taxonomy('writer', 'book',array(
		'hierarchical'  => false,
		'labels'        => array(
			'name'                        => _x( 'Writers', 'taxonomy general name' ),
			'singular_name'               => _x( 'Writer', 'taxonomy singular name' ),
			'search_items'                =>  __( 'Search Writers' ),
			'popular_items'               => __( 'Popular Writers' ),
			'all_items'                   => __( 'All Writers' ),
			'parent_item'                 => null,
			'parent_item_colon'           => null,
			'edit_item'                   => __( 'Edit Writer' ),
			'update_item'                 => __( 'Update Writer' ),
			'add_new_item'                => __( 'Add New Writer' ),
			'new_item_name'               => __( 'New Writer Name' ),
			'separate_items_with_commas'  => __( 'Separate writers with commas' ),
			'add_or_remove_items'         => __( 'Add or remove writers' ),
			'choose_from_most_used'       => __( 'Choose from the most used writers' ),
			'menu_name'                   => __( 'Writers' ),
		),
		'show_ui'       => true,
		'query_var'     => true,
		//'rewrite'       => array( 'slug' => 'the_writer' ), // свой слаг в URL
	));
}

#2 Добавление таксономии в ЧПУ

Смотрите в примерах к описаниям функций: register_post_type(), WP_Rewrite

#3 Переименования названий таксономии

Код ниже, показывает как переименовать имеющуюся таксономию category (рубрики).

## Переименуем таксономию category (рубрики)
add_action( 'init', function(){
	global $wp_taxonomies;

	$labels                     = & $wp_taxonomies['category']->labels;
	$labels->name               = 'Author';
	$labels->singular_name      = 'Author';
	$labels->add_new            = 'Add Author';
	$labels->add_new_item       = 'Add Author';
	$labels->edit_item          = 'Edit Author';
	$labels->new_item           = 'Author';
	$labels->view_item          = 'View Author';
	$labels->search_items       = 'Search Authors';
	$labels->not_found          = 'No Authors found';
	$labels->not_found_in_trash = 'No Authors found in Trash';
	$labels->all_items          = 'All Authors';
	$labels->menu_name          = 'Author';
	$labels->name_admin_bar     = 'Author';

} );

Заметки

  • Global. Массив. $wp_taxonomies Registered taxonomies.

Список изменений

С версии 2.3.0 Введена.
С версии 4.2.0 Introduced show_in_quick_edit argument.
С версии 4.4.0 The show_ui argument is now enforced on the term editing screen.
С версии 4.4.0 The public argument now controls whether the taxonomy can be queried on the front end.
С версии 4.5.0 Introduced publicly_queryable argument.
С версии 4.7.0 Introduced show_in_rest, 'rest_base' and 'rest_controller_class' arguments to register the Taxonomy in REST API.
С версии 5.1.0 Introduced meta_box_sanitize_cb argument.

Код register taxonomy: wp-includes/taxonomy.php WP 5.2.3

<?php
function register_taxonomy( $taxonomy, $object_type, $args = array() ) {
	global $wp_taxonomies;

	if ( ! is_array( $wp_taxonomies ) ) {
		$wp_taxonomies = array();
	}

	$args = wp_parse_args( $args );

	if ( empty( $taxonomy ) || strlen( $taxonomy ) > 32 ) {
		_doing_it_wrong( __FUNCTION__, __( 'Taxonomy names must be between 1 and 32 characters in length.' ), '4.2.0' );
		return new WP_Error( 'taxonomy_length_invalid', __( 'Taxonomy names must be between 1 and 32 characters in length.' ) );
	}

	$taxonomy_object = new WP_Taxonomy( $taxonomy, $object_type, $args );
	$taxonomy_object->add_rewrite_rules();

	$wp_taxonomies[ $taxonomy ] = $taxonomy_object;

	$taxonomy_object->add_hooks();

	/**
	 * Fires after a taxonomy is registered.
	 *
	 * @since 3.3.0
	 *
	 * @param string       $taxonomy    Taxonomy slug.
	 * @param array|string $object_type Object type or array of object types.
	 * @param array        $args        Array of taxonomy registration arguments.
	 */
	do_action( 'registered_taxonomy', $taxonomy, $object_type, (array) $taxonomy_object );
}

Cвязанные функции

Из метки: Расширения WP (доп возможности регистрация)

Еще из раздела: Любые таксономии

70 комментов
Полезные 8 Вопросы 4 Все
  • WP_Panda158 wp-panda.com

    'meta_box_cb' - есть не задокументированный параметр false, нужен когда надо запретить вывод метабокса

    1
    Ответить4.4 года назад #
    • Kama7601

      Если в meta_box_cb указать null, тогда используются базовые функции для вывода метабокса, а вот если false (0, '') (я не пробовал), то наверное метабокс вообще отключится. Вы это проверяли?

      Ответить4.4 года назад #
  • Андрей

    Уважаемый Тимур. Подскажите, если есть мысль.

    Я вот зарегистрировал кучу таксономий с помощью функции register_taxonomy. И теперь в административном меню под записями идет их длинный перечень. Что мне не очень нравится, ибо большинство из созданных таксономий имеют по одному или два терма.
    Я конечно могу убрать видимость их в меню при создании, но тогда как я добавлю / изменю эти самые термы... Нет ли какого способа более аккуратно вывести или скрыть их в меню, но оставить возможность добавлять / изменять термы?

    Спасибо.

    Ответить4.2 года назад #
    • Kama7601

      Я таких способов не знаю, но возможно есть... Такса же прикрепляется к типу записи и находится в подменю, вроде не так страшно даже если их 5-10 штук... unknw

      Ответить4.2 года назад #
  • Митя

    На главой странице моего сайта выводятся записи таксономии. Называются они portfolio. Я могу вывести либо все записи, либо определенное количество, скажем 10. Допустим у меня всего 100 записей. Значит должно быть 10 страниц. Однако добавив плагин и использовав код wp_pagenavi(); у меня появляются эти страницы. Но нажимая скажем на 3-ю страницу все равно остается на 1ой странице и выводятся последние записи. Скажите, как можно сделать постраничну навигацию таксономии

    Ответить4 года назад #
    • @ campusboy3415 www.youtube.com/c/wpplus

      Я точно в этот раз не уверен, но на мой взгляд стоит в базовый запрос добавить это всё дело. Попробуйте использовать pre_get_posts.

      Ответить4 года назад #
  • Андре

    А у меня в админке в свойствах Записи, когда добавляю ранее созданные Таксономии (также в админке), не появляются подсказки (когда начинаешь печатать несколько первых букв), как у тэгов - как этого добиться?

    Ответить3.8 года назад #
    • Kama7601

      Эта функция должна работать по умолчанию. У вас похоже какой-то конфликт скриптов или что-то еще. Пробуйте плагины отключить, в момент написания названия термина попробуйте в консоль браузера заглянуть, может там увидите ошибку какую-то.

      Ответить3.8 года назад #
      • Андре

        Дело в том, что для тэгов и рубрик эта функция работает!
        А вот для моих собственных таксономий - нет. В таком случае Ваше предложение тоже действительно?
        Я создал свой собственный плагин, в нём такой код:

        add_action( 'init', 'create_okrug', 0 );
        
        function create_okrug() {
        
          $labels = array(
        	'name' => _x( 'Районы', 'общее имя таксономии' ),
        	'singular_name' => _x( 'Район', 'единичное имя таксономии' ),
        	'search_items' =>  __( 'Поиск районов' ),
        	'popular_items' => __( 'Популярные районы' ),
        	'all_items' => __( 'Все районы' ),
        	'parent_item' => null,
        	'parent_item_colon' => null,
        	'edit_item' => __( 'Изменить район' ),
        	'update_item' => __( 'Обновить район' ),
        	'add_new_item' => __( 'Добавить новый район' ),
        	'new_item_name' => __( 'Имя нового района' ),
        	'separate_items_with_commas' => __( 'Пишите районы через запятую' ),
        	'add_or_remove_items' => __( 'Добавить или удалить районы' ),
        	'choose_from_most_used' => __( 'Выбрать среди самых популярных районов' ),
        	'menu_name' => __( 'Районы' ),
          );
        
          register_taxonomy('районы','post',array(
        	'hierarchical' => false,
        	'labels' => $labels,
        	'show_ui' => true,
        	'show_admin_column' => true,
        	'update_count_callback' => '_update_post_term_count',
        	'query_var' => true,
        	'rewrite' => array( 'slug' => 'район' ),
          ));
        }
        Ответить3.8 года назад #
        • Kama7601

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

          register_taxonomy('wpfunctag', 'func', array(
          		'hierarchical' => false
          		,'labels' => $labels
          		,'show_ui' => true
          		,'query_var' => true
          		,'rewrite' => array( 'slug'=>'function-tag', 'with_front'=>false )
          	));

          Посмотрел ваш код, должно работать, не вижу ничего почему не может работать. Шаманьте дальше... Может вы что-то не так ищите? Попробуйте в латинице создать метку и найти её, может глюк с кириллицей...

          Ответить3.8 года назад #
          • Андре

            Да, буду пробовать.
            Самое интересное , если в этих таксах у меня, допустим, созданы "Аааа", "Бббб", "Вввв" - то если написать Бб (не дописав оставшиеся буквы) - подсказки нет, но после сохранения, система сохранит всё корректно , как "Бббб"

            Ответить3.8 года назад #
          • Андре

            В итоге получилось - кому-нить может пригодится:
            register_taxonomy('районы','post',array(
            в этой строчке в аргументах не должно быть кириллицы! Вот и всё решение проблемы smile

            Заодно вопрос подкину:
            Когда перехожу по ссылкам новосозданных такс/меток, то шаблон который у категорий и у родных меток Вордпресса - слетает. Т.е. пропадают доп. оформление, боковой столбец....
            Как сделать , чтобы у новых такс/меток, при переходе на них, шаблон был такой же как и для категорий и родных меток?

            Ответить3.8 года назад #
            • Kama7601

              http://wp-kama.ru/id_89/uslovnyie-tegi-v-wordpress-i-vse-chto-s-nimi-svyazano.html
              тут иерархию файлов шаблона смотрите, скорее всего у вас за вывод отвечает уже другой файл, без боковой панели, например archive.php.

              Ответить3.8 года назад #
              • Андре

                Возможно, что и другой файл. Посмотрел.
                А что теперь с этим делать? Вставить код вывода сайдбара в этот другой файл? Или по-другому это решается?

                Ответить3.8 года назад #
                • Kama7601

                  Нужно создать подходящий файл (смотрите иерархию) и в него скопировать аналогичный код (tag.php или category.php) и подправить под себя некоторые моменты можно, если нужно.

                  Ответить3.8 года назад #
                  • Андре

                    Я совсем запутался sad
                    В каждый php файл шаблона пробовал вставлять
                    <?php get_sidebar( 'blog' ); ?>
                    но тщетно - не хочет выводить сайдбар на страницах:
                    сайт.ру/район/юзао
                    и
                    сайт.ру/?s=drsgsregeg (если в Поиске сайта вбить "drsgsregeg").

                    А вот для остальных страниц добавить получилось:
                    сайт.ру/?s= (пустой поиск)
                    и
                    сайт.ру/?s=автомобиль (если слово "автомобиль" действительно существует и поиск сайта его отображает в результатах поиска)

                    Что бы всё это могло означать?
                    (Иерархию посмотрел, но пока не понятно где и какой файл создавать)

                    Ответить3.8 года назад #
  • aksak

    Подскажите как можно пользовательской таксономии присвоить ID?

    Ответить3.5 года назад #
    • @ campusboy3415 www.youtube.com/c/wpplus

      Никак. ID даётся автоматически при создании по порядку. К примеру, была последней таксономия "Фильмы" с ID 15, то следующая таксономия "Журналы" автоматически получит ID 16.

      Ответить3.5 года назад #
  • nikonorovsv

    Всем привет! Может, кто сталкивался? Как можно сделать выбор термина произвольной таксономии обязательным при сохранении поста?

    Ответить3.4 года назад #
  • Виктор

    Здравствуйте. У меня после регистрации таксономии внутри категории на сайте ошибка 404, flash_rewrite_rules(не помогает почему-то) вот код, подскажите что сдесь не так

    // Регистрирую новый тип записи
    if ( ! function_exists( 'catalog_cp' ) ) {
    
    // Опишем требуемый функционал
    	function catalog_cp() {
    
    		$labels = array(
    			'name'                => _x( 'Каталог товаров', 'Post Type General Name', 'catalog' ),
    			'singular_name'       => _x( 'Каталог товаров', 'Post Type Singular Name', 'catalog' ),
    			'menu_name'           => __( 'Каталог товаров', 'catalog' ),
    			'parent_item_colon'   => __( 'Родительский:', 'catalog' ),
    			'all_items'           => __( 'Все товары', 'catalog' ),
    			'view_item'           => __( 'Просмотреть', 'catalog' ),
    			'add_new_item'        => __( 'Добавить товар', 'catalog' ),
    			'add_new'             => __( 'Добавить товар', 'catalog' ),
    			'edit_item'           => __( 'Редактировать товар', 'catalog' ),
    			'update_item'         => __( 'Обновить товар', 'catalog' ),
    			'search_items'        => __( 'Найти товар', 'catalog' ),
    			'not_found'           => __( 'Не найдено', 'catalog' ),
    			'not_found_in_trash'  => __( 'Не найдено в корзине', 'catalog' ),
    		);
    		$args = array(
    			'labels'              => $labels,
    			'supports'            => array( 'title', 'editor', 'excerpt', ),
    			'taxonomies'          => array( 'catalog' ), // категории, которые мы создадим ниже
    			'public'              => true,
    			'menu_position'       => 5,
    			'menu_icon'           => 'dashicons-book',
    		);
    		register_post_type( 'catalog', $args );
    
    	}
    
    	add_action( 'init', 'catalog_cp', 0 ); // инициализируем
    
    }
    
    // Регистрирую таксономию
    if ( ! function_exists( 'catalog' ) ) {
    
    // Опишем требуемый функционал
    	function catalog() {
    
    		$labels = array(
    			'name'                       => _x( 'Категории товаров', 'Taxonomy General Name', 'catalog' ),
    			'singular_name'              => _x( 'Категория товаров', 'Taxonomy Singular Name', 'catalog' ),
    			'menu_name'                  => __( 'Категории', 'catalog' ),
    			'all_items'                  => __( 'Категории', 'catalog' ),
    			'parent_item'                => __( 'Родительская категория Товара', 'catalog' ),
    			'parent_item_colon'          => __( 'Родительская категория Товара:', 'catalog' ),
    			'new_item_name'              => __( 'Новая категория', 'catalog' ),
    			'add_new_item'               => __( 'Добавить новую категорию', 'catalog' ),
    			'edit_item'                  => __( 'Редактировать категорию', 'catalog' ),
    			'update_item'                => __( 'Обновить категорию', 'catalog' ),
    			'search_items'               => __( 'Найти', 'catalog' ),
    			'add_or_remove_items'        => __( 'Добавить или удалить категорию', 'catalog' ),
    			'choose_from_most_used'      => __( 'Поиск среди популярных', 'catalog' ),
    			'not_found'                  => __( 'Не найдено', 'catalog' ),
    		);
    		$args = array(
    			'labels'                     => $labels,
    			'hierarchical'               => true,
    			'public'                     => true,
    		);
    		register_taxonomy( 'catalog', array( 'catalog' ), $args );
    
    	}
    
    	add_action( 'init', 'catalog', 0 ); // инициализируем
    }
    1
    Ответить3.3 года назад #
  • Руслан

    Тимур, подскажи создал произвольный тип постов custom-post-type, и произвольную таксономию custom-tax, как мне вывести в ЧПУ такого вида custom-post-type/custom-tax-parent-category/custom-tax-children/post

    Ответить3.1 года назад #
    • Kama7601

      Я не уверен, но по коду вижу, что при реге таксы, регается такой тег ЧПУ - "%$taxonomy%". Т.е. теоретически вы в параметре rewrite при реге типа поста, может указать этот тег, в вашем случае он будет выглядеть так: %custom-tax%.

      Я такое не делал, но насколько понимаю параметр rewrite должен выглядеть так:

      'rewrite' => array('slug'=>'custom-post-type/%custom-tax%')

      В результате ЧПУ типа записи будет такого вида (кусок из кода):

      "{$args->rewrite['slug']}/%$post_type%"
      
      // т.е.
      custom-post-type/%custom-tax%/%custom-post-type%

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

      1
      Ответить3.1 года назад #
      • mrtime

        Чуда не произошло - всё не заработало)
        Причина - функция get_post_permalink проводит подстановку ТОЛЬКО post_name

        Похожая задачка была у меня: надо было получить ЧПУ такого вида books/genre/book (т.е. у меня нет иерархии genre, но она доделывается без проблем)

        пример реализации:

        add_action( 'init', 'create_book_taxonomies', 0 );
        function create_book_taxonomies(){
        	register_taxonomy('genre', array('books'), array(
        		'hierarchical' => true,
        		'show_ui' => true,
        		'rewrite' => array(
        			'slug' => 'books',
        		),
        	));
        
        	register_post_type('book', array(
        		'public'             => true,
        		'publicly_queryable' => true,
        		'show_ui'            => true,
        		'show_in_menu'       => true,
        		'query_var'          => true,
        		'capability_type'    => 'post',
        		'has_archive'        => 'books',
        		'rewrite'            => array(
        			'slug' => 'books/%genre%',
        		),
        	));
        }
        
        add_filter('post_type_link', 'book_link', 1, 2);
        function book_link($permalink, $post) {
        	if( $post->post_type != 'book' ) {
        		return $permalink;
        	}
        	$rewritecode = array(
        		'%genre%',
        	);
        	if( ! in_array($post->post_status, array('draft', 'pending', 'auto-draft', 'future')) ) {
        		$genre= '';
        		if( strpos($permalink, '%genre%') !== false ) {
        			$genres = get_the_terms($post->ID, 'genres');
        			if( $genres ) {
        				usort($genres , '_usort_terms_by_ID');
        				$genre_object = $genres[0];
        				$genre_object = get_term($genre_object, 'genre');
        				$genre= $genre_object->slug;
        		}
        		$rewritereplace =
        		array(
        			$genre,
        		);
        		$permalink = str_replace($rewritecode, $rewritereplace, $permalink);
        	}
        	return $permalink;
        }
        

        Вообще этот фильтр сделан по образу и подобию get_permalink

        1
        Ответить2.8 года назад #
  • Добрый день. Наверное вопрос не совсем по теме. Решил использовать таксономии не стандартно. То есть создал таксономию лендинг. В ней страницы. Подскажите как можно отдельной странице в таксономии задавать свой файл. По примеру страниц page-2.php

    Ответить3 года назад #
    • Kama7601

      Вот тут третий способ: 3 способа создать шаблон страницы:

      // фильтр передает переменную $template - путь до файла шаблона. 
      // Изменяя этот путь мы изменяем файл шаблона.
      add_filter('template_include', 'my_template');
      function my_template( $template ) {
      
      	# шаблон для группы рубрик
      	// этот пример будет использовать файл из папки темы tpl_special-cats.php, 
      	// как шаблон для рубрик с ID 9, названием "Без рубрики" и слагом "php"
      	if( is_category( array( 9, 'Без рубрики', 'php') ) ){
      		return get_stylesheet_directory() . '/tpl_special-cats.php';
      	}
      
      	return $template;
      
      }
      1
      Ответить3 года назад #
  • Кама, спасибо за информативный сайт, очень помогает в практическом изучении WP.
    Предлагаю дополнить пример древовидной таксономии.

    Вместо:
    'rewrite' => array( 'slug' => 'genre', ),

    Заменить на:
    'rewrite' => array( 'slug' => 'genre', 'hierarchical' => true, ),

    Или только по сути:
    'rewrite' => array( 'hierarchical' => true, ),

    Так как slug и так "по-умолчанию" будет создан из названия таксономии, а вот структура ЧПУ, для вложенных таксономий "по-умолчанию" "false".

    // Добавляем древовидную таксономию 'genre' (как категории)
    	register_taxonomy('genre', array('book'), array(
    		'hierarchical' => true,
    		'labels' => $labels,
    		'show_ui' => true,
    		'query_var' => true,
    		'rewrite' => array( 'hierarchical' => true, ),
    	));

    Без добавления в аргумент 'rewrite' параметра 'hierarchical' => true, создаются таксономии с не вложенной структурой URL, хотя выглядят в админке, как вложенные.

    Ответить2.9 года назад #
    • Kama7601

      Чтобы не путать пользователей я думаю этого не стоит добавлять... В общем-то это описано в параметре rewrite, кому нужно разберутся...

      Ответить2.8 года назад #
Здравствуйте, !     Войти . Зарегистрироваться