J'ai déclaré le type de message ci-dessous:
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array('slug' => 'agences'),
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 5,
'taxonomies' => array('brands', 'country'),
'supports' => array('title', 'editor', 'author', 'thumbnail', 'custom-fields')
);
register_post_type('destinations', $args);
Initialement, je pouvais accéder à une seule page de ce type de message en utilisant single-agences.php
, mais maintenant, il est redirigé vers 404.
J'ai vérifié d'autres réponses et trouvé qu'il s'agit d'une erreur commune, mais d'autres réponses n'ont pas permis de résoudre ce problème. Toute aide sera merveilleuse.
Cela était dû à un plugin "Supprimer la base de taxonomie slug". C'était en conflit avec le slug de base des "destinations" du CPT. J'ai dû utiliser add_rewrite_rule
pour vérifier la présence de slug et le rediriger manuellement vers le bon emplacement
Le CPT nouvellement enregistré affiche 404, car la register_post_type()
ne vide pas les règles de réécriture. C'est donc à vous de décider si vous voulez le faire manuellement ou automatiquement.
Accédez à /wp-admin/
, puis à Paramètres "Permaliens, puis appuyez simplement sur la Save Changes bouton pour vider les règles de réécriture.
Vous pouvez vider les règles de réécriture en utilisant la fonction flush_rewrite_rules()
. Mais comme register_post_type()
est appelé dans le hook init
, il se déclenchera chaque fois que le hook init
se déclenchera. Le codex dit aussi la même chose:
Cette fonction est utile lorsqu'elle est utilisée avec des types de publication personnalisés, car elle permet de vider automatiquement les règles de réécriture de WordPress (doit généralement être effectuée manuellement pour les nouveaux types de publication personnalisés). Cependant, il s’agit d’une opération coûteuse et ne doit donc être utilisé que lorsque cela est absolument nécessaire.
C’est pourquoi il est préférable d’attacher la chose à quelque chose qui ne se déclenche qu’une fois, et qui n’affecte que les règles lorsque cela est nécessaire. Comme @ cybmeta a déjà montré cela à vous. Mais vous pouvez aussi suivre l'approche de @bandternet:
/**
* To activate CPT Single page
* @author Bainternet
* @link http://en.bainternet.info/2011/custom-post-type-getting-404-on-permalinks
* ---
*/
$set = get_option( 'post_type_rules_flased_mycpt' );
if ( $set !== true ){
flush_rewrite_rules( false );
update_option( 'post_type_rules_flased_mycpt', true );
}
Il enregistre une valeur dans la table options
uniquement pour votre type de publication. Et si la valeur n'est pas là, il annule les règles de réécriture. Si c'est là, il ne le fait pas.
Mais s'il vous plaît noter, il fait réellement un appel de base de données à chaque fois (si pas mis en cache). Donc, je préférerais accrocher le code after_setup_theme
pour le thème, ou register_activation_hook
pour le plugin.
Pendant le débogage des règles de réécriture, un plugin comme celui-ci pourrait être très utile: