janfabry
  • 0
Гуру

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

  • 0

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

У меня есть пользовательская таксономия 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();
?>

Обновление: сгенерированные правила перезаписи

Вывод моего Rewrite Analyzer, кажется, говорит мне, что таксономия «выигрывает» для обычных страниц таксономии (это то, что я заметил), но пользовательский тип записи получает все другие URL-адреса (включая вторые страницы, каналы,…). Это то, чего я боялся, и что мне нужно будет исследовать дальше.Переписать правила для таксономии людей и типа поста

Share
  1. @Jan Fabry — Можете ли вы скопировать свой taxonomy-people.php вопрос для проверки?

    • 0
    • @Jan Fabry — я неправильно понял и подумал, что вы определяете свои CPT и CT в taxonomy-people.php (конечно, я не думал…) Поэтому я просил код, в котором вы определяете свои CPT и CT.

      • 0
    • @Mike: добавлен код, определяющий таксономию и тип записи. Я удалю свой первый комментарий, чтобы очистить эту тему.

      • 0
    • Можете ли вы расширить этот ответ и привести конкретные примеры того, что может пойти не так?

      • 0
    • Я знаю, что одна из них не будет работать, это не проблема, поскольку я объединяю содержимое обеих структур на одной странице шаблона. Моя проблема в том, что я должен знать, какую страницу шаблона использовать: таксономию или пользовательский тип сообщения? Если правила перезаписи детерминированы, и я всегда могу предположить, что «победит таксономия» или «победит тип сообщения», это решит мой вопрос. Я обновил свой текст изображением фактических правил перезаписи, которое показывает, что ситуация кажется смешанной.

      • 0
    • @Jan: А, хорошо, теперь я понимаю, что тебе нужно. Мне нужно будет проанализировать ядро ​​wp, чтобы узнать. Но я почему-то чувствую, что это может что-то сломаться, поскольку это своего рода серая зона, которая, вероятно, изменится. Вместо этого может быть лучшим способом просто создать шаблоны таксономии и пост-типа, включая другие, и вы настроены на любой случай, поскольку всегда загружается «правильный» шаблон. Разве это не простой способ решить эту проблему?

      • 0
    • Действительно, я мог бы скопировать файл шаблона, но вы знаете, как похожие, но немного разные файлы вызывают у вас головную боль, когда вы исправляете ошибку в одном, но забываете о другом… В моем стремлении понять WP_Rewrite (или умереть, пытаясь), Надеюсь, я узнаю, как add_rewrite_tag() и add_permastruct() повлияю на результирующие правила.

      • 0
    • Действительно, я подозревал, что произойдет слияние на основе регулярного выражения. Я сосредоточусь на способе, который, например people_bio, выходит за рамки правил перезаписи, но позволяет ему работать с файлами get_permalink() . Посмотрим, что мне даст этот pre_post_link фильтр…

      • 0
    • Этот билет может быть полезен вам при внедрении правильного решения: core.trac.wordpress.org/ticket/14991.

      • 0
  2. Вопрос: Это проблема, если пользовательская таксономия и пользовательский тип записи используют одну и ту же структуру перезаписи?

    Ответ: Да.

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

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

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

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

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

    • 0

Оставить ответ

You must login to add an answer.