it-swarm-eu.dev

Problémy při kolizi pravidel přepisu?

Je problém mít vlastní taxonomii a vlastní typ příspěvku používat stejnou strukturu přepsání?

Mám vlastní taxonomii people a vlastní typ příspěvku people_bio. Myšlenka je, že dostanete seznam příspěvků o osobě s krátkou biografií v horní části stránky. Kombinuji je v mém souboru taxonomy-people.php šablony. Permalink je /people/[person-slug].

Vlastní taxonomie i vlastní typ příspěvku mají argument rewrite nastaven na array('slug' => 'people'). Zdá se, že to funguje: get_term_link('seth-godin', 'people') vrací /people/seth-godin/ a pro vlastní typ příspěvku se slug seth-godin, get_permalink() také vrací /people/seth-godin/. Nejprve je definována taxonomie a zdá se, že "win": na stránce /people/[slug] je is_tax() true, zatímco is_single() je falešná.

Funguje to, ale necítím se s tím dobře. Je někdo zkušenější s přepisovacím motorem a můžete mi říct, zda by to mohlo rozbít jiné věci?


Příslušná část souboru pluginu, volaná v akci 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');

(Vždy používám všechny parametry s register_*(), mnoho s jejich výchozími hodnotami, jako další dokumentaci, pokud Kodex není aktuální)


Soubor šablony 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();
?>

Aktualizace: Generovaná pravidla přepsání

Zdá se, že výstup mého analyzátoru přepisu mi říká "vyhraje" pro pravidelné stránky taxonomie (což je to, co jsem si všiml), ale typ vlastního příspěvku získá všechny ostatní adresy URL (včetně sekund, stránek, ...). To je to, čeho jsem se obával, a které budu muset dále zkoumat. Rewrite rules for people taxonomy and post type

3
Jan Fabry

Ano, to bude dávat problémy. Čtyři pravidla přepsání, která jsou generována vlastní taxonomií, jsou také používána vlastním typem příspěvku. Ten, který se zaregistrujete jako první, bude přepsán tím, který se zaregistrujete. V závislosti na přesné konfiguraci (hierarchické vs. nehierarchické) mohou podobná pravidla skončit v konečném seznamu pravidel přepsání, ale pouze první vyhraje.

To může mít vliv, že /people/seth-godin/ dotazy pro vlastní taxonomii, ale /people/seth-godin/page/2/ dotazy pro vlastní typ příspěvku.

1
Jan Fabry

Otázka: Je problém mít vlastní taxonomii a vlastní typ příspěvku použít stejnou strukturu přepsání?

Odpověď: Ano.

Pokud mají stejnou strukturu, dostanete podmínku závodu, takže jeden z nich nebude fungovat. Ale předpokládám, že váš scénář nevede automaticky ke stejným pravidlům pro přepsání, protože tyto dvě věci jsou různě prefixovány.

1
hakre

K tomu dochází, protože pravidla pro přepsání permastruktury (která zahrnují pravidla vytvořená registrací post_typů a taxonomií) jsou spouštěna přes pole array_merge (). Pole array_merge nahradí všechny rewrite_rules se stejným regexem v aktuálním umístění pole, ale přidejte všechny, které nejsou v konfliktu s koncem pole.

Nejlepším řešením může být nastavit argument 'rewrite' na hodnotu false pro jednu ze dvou registrací a přidat samostatný kód pro přidání chybějících potřebných pravidel pro přepsání na rewrite_rules_top.

1
prettyboymp