web-dev-qa-db-fra.com

Lien permanent réécrire 404 conflict - Taxonomies WordPress/CPT

Vous vous demandez si quelqu'un pourrait me dire pourquoi les sous-pages (pages enfants) ne fonctionnent plus (par exemple: www.monsite.com/type/pagepage).

J'ai une page appelée "Type" (fonctionne bien) et je souhaite des pages enfants de "Type" (404 erreurs) - comme vous pouvez le voir, j'aime aussi avoir le slug "type" en face de mon message personnalisé types/taxonomies.

J'ai essayé la méthode de ce lien sans succès: https://wordpress.stackexchange.com/questions/4127/custom-taxonomy-and-pages-rewrite-conflict-gives-404

add_action( 'init', 'create_zombie_type' );

function create_zombie_type() {
register_post_type('zombies', 
array(  
'description' => 'Zombie custom post type',
'show_ui' => true,
'menu_position' => 5,
'menu_icon' => get_stylesheet_directory_uri() . '/images/zombies.png',
'exclude_from_search' => false,
'labels' => array(
    'name' => 'Zombies',
    'singular_name' => 'Zombie',
    'add_new' => 'Add New Zombie',
    'add_new_item' => 'Add New Zombie',
    'edit' => 'Edit Zombies',
    'edit_item' => 'Edit Zombie',
    'new_item' => 'New Zombie',
    'view' => 'View Zombie',
    'view_item' => 'View Zombie',
    'search_items' => 'Search Zombies',
    'not_found' => 'No zombies found',
    'not_found_in_trash' => 'No zombies found in Trash',
    'parent' => 'Parent Zombie',
),
'hierarchical' => false,
'supports' => array('title','editor','excerpt', 'trackbacks','custom-fields',     'comments','revisions','thumbnail','author','page-attributes'),
'public' => true,
'rewrite' => array('slug' => 'type/%freshness%', 'with_front' => false),
'taxonomies' => array('freshness')
) 
);
}




add_action( 'init', 'create_zombie_taxonomies' );

function create_zombie_taxonomies() {
register_taxonomy( 
'freshness', 
'zombies',
array( 
'labels' => array(
    'name' => 'Freshness',
    'singular_name' => 'Freshness',
    'search_items' =>  'Search Freshness',
    'popular_items' => 'Popular Freshness',
    'all_items' => 'All Freshness',
    'parent_item' => 'Parent Freshness',
    'parent_item_colon' => 'Parent Freshness:',
    'edit_item' => 'Edit Freshness', 
    'update_item' => 'Update Freshness',
    'add_new_item' => 'Add New Freshness',
    'new_item_name' => 'New Freshness Name'
), 
'hierarchical' => true, 
'public' => true,
'show_ui' => true,
'query_var' => 'freshness',
'show_tagcloud' => true,
'rewrite' => array( 'slug' => 'type', 'with_front' => false ) 
) 
   );

}



function filter_post_type_link($link, $post)
{
if ($post->post_type != 'zombies')
return $link;

if ($cats = get_the_terms($post->ID, 'freshness'))
$link = str_replace('%freshness%', array_pop($cats)->slug, $link);
return $link;
}

add_filter('post_type_link', 'filter_post_type_link', 10, 2);
5
Joe

Vous pouvez créer des règles de page détaillées pour chaque page commençant par /type/, mais vous devrez également vous attacher à la création de page et à des tâches de ce type pour la maintenir à jour. Si vous n'avez pas beaucoup de pages supplémentaires, il pourrait être plus facile de forcer les règles de page verbeuses pour all pages, alors WordPress le fera pour vous.

add_action( 'init', 'wpse16902_init' );
function wpse16902_init() {
    $GLOBALS['wp_rewrite']->use_verbose_page_rules = true;
}

Le seul problème maintenant est que les règles de taxonomie sont placées au-dessus de cela (depuis WP 3.1 je pense). Mais avec les crochets corrects, nous pouvons intercepter les règles de page et les placer vraiment en haut.

add_filter( 'page_rewrite_rules', 'wpse16902_collect_page_rewrite_rules' );
function wpse16902_collect_page_rewrite_rules( $page_rewrite_rules )
{
    $GLOBALS['wpse16902_page_rewrite_rules'] = $page_rewrite_rules;
    return array();
}

add_filter( 'rewrite_rules_array', 'wspe16902_prepend_page_rewrite_rules' );
function wspe16902_prepend_page_rewrite_rules( $rewrite_rules )
{
    return $GLOBALS['wpse16902_page_rewrite_rules'] + $rewrite_rules;
}

Il est possible que les règles de réécriture du type de publication personnalisé et de la taxonomie personnalisée se rencontrent pour les URL /type/%freshness%/. Vous voulez que ce soit une archive de taxonomie, pas une archive de type publication personnalisée. Si vous rencontrez des problèmes, inversez l'ordre dans lequel vous les enregistrez: tout d'abord la taxonomie, puis le type de message personnalisé:

register_taxonomy(
    'freshness',
     array(), // Empty array, no post types linked
     array(
         'rewrite' => array(
             'slug' => 'type',
         )
     ),
 );
 register_post_type(
     'zombie',
     array(
         'rewrite' => array(
             'slug' => 'type/%freshness%',
         ),
         'taxonomies' => array( 'freshness' ),
     ),
 );

Avis supplémentaire: si vos URL de taxonomie commencent vraiment par /type/, vous pourriez entrer en conflit avec les archives au format post. /type/aside/ affiche par défaut toutes les publications du format "Annulé". Cette réponse suppose que le type d'article personnalisé zombie et la taxonomie ne sont qu'un exemple et que vous utilisez un autre format d'URL dans votre problème réel.

8
Jan Fabry