Intereting Posts
Как повернуть каждую букву в заголовке Как разместить ссылку Подробнее после публикации выдержки? Регенерировать миниатюры для изображений, которые не находятся в медиа-библиотеке WordPress Hook, который будет запущен при удалении медиафайла query_posts: как показать все «meta_value», содержащие определенное слово? Новые пользователи должны комментировать при запросе имени пользователя Расширьте плагин, чтобы включить опцию виджета Метабокс не добавляется WordPress 3.8 получает текущую цветовую схему администратора Как стилизовать предварительные просмотры / ссылки, не влияя на основные сообщения? Для чего используется wp-includes / certificates / ca-bundle.crt? Плюсы / минусы плагинов «WP e-commerce» и «Shopp» Создавать динамические страницы из внешних данных JSON без сохранения в базе данных? Список категорий и автоматические классы jQuery Регистрация нового виджета

Применение канонических URL-адресов с несколькими пользовательскими типами сообщений

Я работаю над проектом с несколькими пользовательскими типами сообщений, где один из типов сообщений естественно (но не на самом деле в смысле WordPress) «родительский» из других. Например, скажем, у меня есть пользовательский тип сообщения, называемый «книга», а другой – «символ», и я хочу, чтобы у меня была следующая структура URL-адресов:

books/[book-name]/characters/[character-name] 

Таким образом, канонический URL для сообщения о персонаже Thing One в книге «Кошка в шляпе» будет:

  books/cat-in-the-hat/characters/thing-one 

Персонаж связан с книгой с мета-строкой.

Я создал пользовательские перезаписи, чтобы заставить его работать …

 add_rewrite_rule ( '^books/([^\/]+)/characters/([^\/]+)/?$', 'index.php?book=$matches[1]&character=$matches[2]&post_type=character' ); 

… но мне также нужно убедиться, что «сообщение персонажа» в URL-адресе относится к «книге» …

 books/cat-in-the-hat/characters/thing-one //good books/anna-karenina/characters/count-vronsky //good books/anna-karenina/characters/thing-one //bad 

Это не может произойти автоматически: я должен подключиться к фильтру или к действию, чтобы проверить, соответствует ли символ книге, а если нет, либо перенаправлять на правильный, канонический URL-адрес, либо принудительно 404.

Где лучшее место для выполнения этой проверки? Мой выбор (до сих пор):

  • Фильтр request – т.е. проверка перед основным запросом создается.
  • Различные фильтры WP_Query, то есть делают WP_Query, проверяют меня, добавляя ограничение метаданных.

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

Solutions Collecting From Web of "Применение канонических URL-адресов с несколькими пользовательскими типами сообщений"

Я занимался подчиненными типами писем с аналогичной веной, но не был столь строгим в отношении канонического url; однако, я столкнулся с аналогичной ситуацией с подключением пользовательских ссылок типа продукта WooCommerce .

Я использовал крючок template_redirect чтобы нажать 404, если он не соответствует маршруту и post_type_link чтобы обеспечить метатег для канонической ссылки, а все the_permalink() и get_permalink() соответствуют намеченной ссылке.

Я хотел бы рекомендовать это:

 add_action( 'template_redirect', 'wp20140320_template_redirect' ); public function wp20140320_template_redirect(){ global $wp_query, $post; // the character post type has the book id set as meta? // or could set as post_parent if you don't have characters heirarchical $book_id = get_post_meta( $post->ID, '_book_id', true ); // compare_parent_slug_to_id to check required $book_id against set parent book slug if( $post->post_type == 'character' && ! compare_parent_slug_to_id( $book_id ) ){ // set is_404 since post type is character and parent slug does not match set $wp_query->is_404 = true; status_header(404); include get_404_template(); exit; // maybe a better way to gracefully exit? } } 

Изменено из источника