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

Можно использовать это как постоянную ссылку для сообщения:

/%category%/%postname%/ 

Но, допустим, я создал таксономию под названием «художник». Я хотел бы использовать это для своих сообщений:

 /%artist%/%postname%/ 

Я знаю, что таксономии позволяют вам перечислить их условия:

 /%artist%/%someartist%/ 

но это не то, что я ищу. Я хочу изменить URL-адреса POST, а не таксономические.

Я пытаюсь это сделать в своем блоге, и он не работает. Это что-то, что можно сделать в WordPress?

Предполагая, что ваша пользовательская таксономия называется artist (и вы не переопределяете slug в параметре rewrite ), вы можете использовать тег rewrite %artist% . WordPress реализует почти все функциональные возможности для использования этих тегов rewrite в постоянных ссылках. Необходима лишь небольшая адаптация.

Создание постоянной ссылки

Во-первых, вам нужно использовать фильтр post_link для замены пользовательского тега «в вашей структуре запроса:

 /** * replace the '%artist%' tag with the first * term slug in the artist taxonomy * * @wp-hook post_link * @param string $permalink * @param WP_Post $post * @return string */ function wpse_56769_post_link( $permalink, $post ) { $default_term = 'no_artist'; $terms = wp_get_post_terms( $post->ID, 'artist' ); if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) $term = current( $terms )->slug; else $term = $default_term; $permalink = str_replace( '%artist%', $term, $permalink ); return $permalink; } add_filter( 'post_link', 'wpse_56769_post_link', 10, 2 ); 

Эта функция ( wpse_56769_post_link ):

  • определяет по умолчанию термин slug ( no_artist ), который используется как резерв, если сообщение не назначено в таксономии исполнителя,
  • выбирает первый назначенный термин (в алфавитном порядке) таксономии художника,
  • заменяет тег %artist% слоем этого термина.

Теперь перейдите в меню «Настройки» → «Постоянная ссылка», выберите параметр «Пользовательская структура» и напишите: /%artist%/%postname%/ .

В результате постоянная ссылка post должна выглядеть так:

Использование первого термина в качестве URL-пули

Теперь, когда сообщение permalinks чернилами включает в себя первый прозвище участника, давайте посмотрим на маршрутизацию.

Обновление постоянных ссылок (маршрутизация)

Вы заметите, что постоянная ссылка правильно разрешена для отдельного сообщения. К сожалению, постоянная ссылка страницы не работает.

Чтобы решить эту проблему, вам необязательно изменять правила перезаписи. Единственное, что нам нужно сделать, это изменить внутреннее состояние WP_Rewrite . Свойство WP_Rewrite::use_verbose_page_link должно быть установлено в TRUE . (Это внутреннее поведение WP_Rewrite при использовании WP_Rewrite %category% или %author% качестве базы для постоянных ссылок.)

 /** * set WP_Rewrite::use_verbose_page_rules to TRUE if %artist% * is used as the first rewrite tag in post permalinks * * @wp-hook do_parse_request * @wp-hook page_rewrite_rules * @global $wp_rewrite * @param mixed $pass_through (Unused) * @return mixed */ function wpse_56769_rewrite_verbose_page_rules( $pass_through = NULL ) { $permastruct = $GLOBALS[ 'wp_rewrite' ]->permalink_structure; $permastruct = trim( $permastruct, '/%' ); if ( 0 !== strpos( $permastruct, 'artist%' ) ) return $pass_through; $GLOBALS[ 'wp_rewrite' ]->use_verbose_page_rules = TRUE; return $pass_through; } add_filter( 'page_rewrite_rules', 'wpse_56769_rewrite_verbose_page_rules', PHP_INT_MAX ); add_filter( 'do_parse_request', 'wpse_56769_rewrite_verbose_page_rules', PHP_INT_MAX ); 

Состояние должно быть изменено в двух точках: do_parse_request потому что WP::parse_request() запрашивает это состояние и page_rewrite_rules когда правила перезаписи получат сборку.

Теперь маршрутизация фиксирована, и постоянная ссылка страницы работает хорошо. (После повторной промывки снова).

Обращаться с псевдо-термином no_artist

Последнее, что no_artist : если сообщение действительно не привязано ни к одному термину таксономии artist , постоянная ссылка анализируется на следующие переменные запроса:

 name => 'sample_post' artist => 'no_artist' page => '' 

Это должно привести к 404, потому что этот термин не существует. Поскольку имя сообщения должно быть уникальным, мы можем удалить переменную запроса artist в фильтре request :

 /** * check for existing artist and set query to 404 if necessary * * @wp-hook parse_query * @param array $request_vars * @return array */ function wpse_56769_request_vars( $request_vars ) { if ( ! isset( $request_vars[ 'artist' ] ) ) return $request_vars; if ( ! isset( $request_vars[ 'name' ] ) ) return $request_vars; if ( 'no_artist' == $request_vars[ 'artist' ] ) unset( $request_vars[ 'artist' ] ); return $request_vars; } add_filter( 'request', 'wpse_56769_request_vars' ); 

С этим фильтром сообщение, подобное http://wordpress.dev/no_artist/sample-post/ будет найдено правильно.

Я думаю, что это то, что вы ищете: Custom Post Type Permalinks

Этот плагин позволяет редактировать структуру постоянных ссылок для настраиваемого типа сообщений.

Чтобы установить этот плагин:

  1. Загрузите файл custom-post-type-permalinks.zip на свой компьютер.
  2. Разархивируйте файл.
  3. Загрузите каталог custom-post-type-permalinks в каталог / wp-content / plugins /.
  4. Активируйте плагин через меню «Плагины» в WordPress.

Вы также можете перейти в меню «Плагины» в своем WordPress и нажать «добавить новый». Затем найдите этот плагин, выполнив поиск «Permalink Custom Post Type Permalinks» и установите его, нажав кнопку установки.

Новый элемент появится в меню слева от вашего администратора WordPress. Здесь вы можете изменить настройки в зависимости от ваших потребностей (имена таксономий и т. Д.).


Futhermore мой сайт в настоящее время имеет следующую структуру permalink "site.com/star/aristname/", в которой затем перечислены все записи для этого исполнителя или страница / запись об этом художнике.

Если вы ищете это, вы можете создать страницу архива для своего настраиваемого типа сообщений. WordPress автоматически примет эту структуру. Для получения дополнительной информации о том, как создать свою собственную страницу архива, перейдите сюда . (Если вы действительно ищете это, я могу объяснить это более подробно, если вы хотите)

Что я хотел связать url с категорией (в любой структуре url), я задал список терминов в структуре перезаписи url, но в моем случае не было много условий …

результаты были чем-то вроде ключа правила перезаписи

 publications/(annual-reports|articles|books|policy-briefs)/([^/]+).html?$ 

и значение правила

 index.php?post_type=publication&category_publication=$matches[1]&publication=$matches[2]&paged=1 

все было подключено с использованием фильтра rewrite_rules_array .

результат вы можете увидеть по адресу http://unu.edu/publications