Проблемы при столкновении правил перезаписи?


Проблема ли в том, что пользовательская таксономия и пользовательский тип записи используют одну и ту же структуру перезаписи?

У меня есть пользовательская таксономия 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-адреса (включая вторые страницы, каналы,...). Это то, чего я боялся из, и который мне нужно будет исследовать дальше. Rewrite rules for people taxonomy and post type

Author: Community, 2010-10-18

3 answers

Вопрос: Проблема в том, что пользовательская таксономия и пользовательский тип записи используют одну и ту же структуру перезаписи?

Ответ: Да.

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

 1
Author: hakre, 2010-11-09 22:34:43

Это происходит потому, что правила перезаписи постоянной структуры (в том числе правила, созданные путем регистрации post_types и таксономий) выполняются через array_merge(). Array_merge заменит любые rewrite_rules тем же регулярным выражением в текущем местоположении массива, но добавит любые, которые не конфликтуют, в конец массива.

Лучшим вариантом может быть установка аргумента "переписать" в значение false для одной из двух регистраций и добавление отдельного кода для добавления любых отсутствующих необходимых перепишите правила в верхнюю строку rewrite_rules_.

 1
Author: prettyboymp, 2010-11-10 14:20:04

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

Это может привести к тому, что /people/seth-godin/ запрашивает пользовательскую таксономию, но /people/seth-godin/page/2/ запрашивает для пользовательского типа записи.

 1
Author: Jan Fabry, 2011-01-13 15:32:01