Проблемы при столкновении правил перезаписи?
Проблема ли в том, что пользовательская таксономия и пользовательский тип записи используют одну и ту же структуру перезаписи?
У меня есть пользовательская таксономия people
и пользовательский тип записи people_bio
. Идея заключается в том, что вы получаете список сообщений о человеке с краткой биографией в верхней части страницы. Я объединяю их в своем файле шаблона taxonomy-people.php
. Постоянная ссылка - это /people/[person-slug]
.
Как пользовательская таксономия, так и пользовательский тип записи имеют аргумент rewrite
, равный array('slug' => 'people')
. Похоже, это работает: get_term_link('seth-godin', 'people')
возвращает /people/seth-godin/
, и для пользовательского типа записи с slug seth-godin
, get_permalink()
также возвращает /people/seth-godin/
. Сначала определяется таксономия, и, похоже, она "выигрывает": на странице /people/[slug]
is_tax()
истинно, а is_single()
ложно.
Итак, это работает, но я не чувствую себя комфортно с этим. Есть ли кто-нибудь более опытный в работе с механизмом перезаписи, и не могли бы вы сказать мне, может ли это нарушить другие вещи?
Соответствующая часть файла плагина, вызываемая в действии init
:
register_taxonomy(
'people',
'post',
array(
'labels' => array(
'name' => 'People',
'singular_name' => 'Person',
'search_items' => 'Search people',
'popular_items' => 'Popular people',
'all_items' => 'All people',
'parent_item' => null,
'parent_item_colon' => null,
'edit_item' => 'Edit person',
'update_item' => 'Update person',
'add_new_item' => 'Add person',
'new_item_name' => 'New person',
'separate_items_with_commas' => 'Separate people with commas',
'add_or_remove_items' => 'Add or remove people',
'choose_from_most_used' => 'Choose from the most used people',
),
'public' => true,
'show_ui' => true,
'show_tagcloud' => true,
'hierarchical' => false,
'update_count_callback' => '',
'rewrite' => array(
'slug' => 'people',
'with_front' => true,
),
'query_var' => 'people',
'capabilities' => array(),
'show_in_nav_menus' => true,
)
);
register_post_type(
'people_bio',
array(
'label' => 'People Bio',
'labels' => array(
'name' => 'Biographies',
'singular_name' => 'Biography',
'add_new' => 'Add new',
'add_new_item' => 'Add new biography',
'edit_item' => 'Edit biography',
'new_item' => 'New biography',
'view_item' => 'View biography',
'search_items' => 'Search biographies',
'not_found' => 'No biographies found',
'not_found_in_trash' => 'No biographies found in trash',
'parent_item_colon' => null,
),
'description' => 'Biography pages of interesting people',
'public' => true,
'exclude_from_search' => true,
'publicly_queryable' => true,
'show_ui' => true,
'menu_position' => null,
'menu_icon' => null,
'capability_type' => 'post',
'capabilities' => array(),
'hierarchical' => false,
'supports' => array(
'title',
'editor',
//'author',
'thumbnail',
'excerpt',
//'trackbacks',
'custom-fields',
//'comments',
//'revisions',
//'page-attributes',
),
'register_meta_box_cb' => null,
'taxonomies' => array(),
'permalink_epmask' => EP_PERMALINK,
//'rewrite' => false,
'rewrite' => array(
'slug' => 'people',
'with_front' => true,
),
'query_var' => true,
'can_export' => true,
'show_in_nav_menus' => true,
)
);
register_taxonomy_for_object_type('people', 'people_bio');
( Я всегда используйте все параметры с register_*()
, многие со значениями по умолчанию, в качестве дополнительной документации, если Кодекс не обновлен)
Файл шаблона taxonomy-people.php
:
<?php
get_header();
$people_biography = get_posts(array(
'numberposts' => -1,
'post_type' => 'people_bio',
'taxonomy' => 'people',
'term' => $wp_query->get_queried_object()->slug,
));
?>
<div class="container_24">
<div class="grid_18" id="content" role="main">
<?php if ($people_biography) :
foreach ($people_biography as $bio) : ?>
<h1><?php echo get_the_title($bio->ID); ?></h1>
<?php
echo get_the_post_thumbnail($bio->ID);
echo apply_filters('the_content', $bio->post_content); ?>
<?php
endforeach;
else: ?>
<h1><?php esc_html_e($wp_query->get_queried_object()->name); ?></h1>
<?php endif; ?>
<?php get_template_part( 'loop', 'archive' ); ?>
</div><!-- .content -->
<div class="grid_6" id="default_sidebar">
<?php dynamic_sidebar('default-sidebar'); ?>
</div><!-- #default_sidebar -->
</div><!-- .container_24 -->
<div class="clear"></div>
<?php
get_footer();
?>
Обновление: сгенерированные правила перезаписи
Вывод моего анализатора перезаписи , похоже, говорит мне, что таксономия "выигрывает" для обычных страниц таксономии (это то, что я заметил), но пользовательский тип записи получает все другие URL-адреса (включая вторые страницы, каналы,...). Это то, чего я боялся из, и который мне нужно будет исследовать дальше.
3 answers
Вопрос: Проблема в том, что пользовательская таксономия и пользовательский тип записи используют одну и ту же структуру перезаписи?
Ответ: Да.
Если они имеют одинаковую структуру, вы получите состояние гонки, поэтому одно из них не будет работать. Но я предполагаю, что ваш сценарий автоматически не приводит к одинаковым правилам перезаписи, поскольку эти две вещи имеют разные префиксы.
Это происходит потому, что правила перезаписи постоянной структуры (в том числе правила, созданные путем регистрации post_types и таксономий) выполняются через array_merge(). Array_merge заменит любые rewrite_rules тем же регулярным выражением в текущем местоположении массива, но добавит любые, которые не конфликтуют, в конец массива.
Лучшим вариантом может быть установка аргумента "переписать" в значение false для одной из двух регистраций и добавление отдельного кода для добавления любых отсутствующих необходимых перепишите правила в верхнюю строку rewrite_rules_.
Да, это вызовет проблемы. Четыре правила перезаписи, созданные пользовательской таксономией, также используются пользовательским типом записи. Тот, который вы зарегистрируете первым, будет перезаписан тем, который вы зарегистрируете после этого. В зависимости от точной конфигурации (иерархической или неиерархической) аналогичные правила могут оказаться в окончательном списке правил перезаписи, но "выиграет" только первый.
Это может привести к тому, что /people/seth-godin/
запрашивает пользовательскую таксономию, но /people/seth-godin/page/2/
запрашивает для пользовательского типа записи.