Je développe un plugin Custom Post Type, qui fonctionne bien dans dev. Maintenant que je l'ai mis en production, je reçois un 404 lorsque j'essaie d'afficher le modèle pour le CPT.
Donc, deux questions:
1- Existe-t-il un mécanisme permettant de déterminer le chemin que WP a emprunté pour franchir la hiérarchie?
2- Pourquoi ne me donnerais-je pas simplement la page simple ou la page d'index?
J'ai vidé $ wp_query et un stacktrace à la fin du 404. Voici une partie de ce que j'ai trouvé:
[query] => Array
(
[page] =>
[pagename] => refletters/proximity
)
[request] => SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND (wp_posts.ID = '0') AND wp_posts.post_type = 'page' ORDER BY wp_posts.post_date DESC
[posts] => Array
(
)
[queried_object] =>
[queried_object_id] => 0
Et la trace de la pile:
2013-04-27 22:16:41 - 24.52.197.40 - TRACE - index.php - 404.php[39] -
wordpress/wp-content/themes/notoriousconsultant/404.php[39] - aaLog->logtrace
wordpress/wp-includes/template-loader.php[50] - include
wordpress/wp-blog-header.php[16] - require_once
wordpress/index.php[17] - require
Merci de votre aide.
Effacez toujours les règles de réécriture lorsque vous enregistrez un nouveau type de publication publique ou une nouvelle taxonomie. Sinon, les règles de réécriture internes ne prendront pas cela en compte lorsqu'une URL est mappée à une requête.
Vous pouvez automatiser ce processus en vous connectant à registered_post_type
et registered_taxonomy
.
Ci-dessous se trouve le code mis à jour, basé sur les commentaires des commentaires et d’autres personnes.
Télécharger en tant que plugin T5 Silent Flush sur GitHub.
add_action( 'registered_post_type', 't5_silent_flush_cpt', 10, 2 );
add_action( 'registered_taxonomy', 't5_silent_flush_tax', 10, 3 );
/**
* Flush rules for custom post types.
*
* @wp-hook registered_post_type
* @param string $post_type
* @param stdClass $args
* @return void
*/
function t5_silent_flush_cpt( $post_type, $args )
{
if ( $args->_builtin )
return;
if ( ! $args->public )
return;
if ( ! $args->publicly_queryable )
return;
if ( ! $args->rewrite )
return;
$slug = $post_type;
if ( isset ( $args->rewrite['slug'] ) && is_string( $args->rewrite['slug'] ) )
$slug = $args->rewrite['slug'];
$rules = get_option( 'rewrite_rules' );
if ( ! isset ( $rules[ $slug . '/?$'] ) )
flush_rewrite_rules( FALSE );
}
/**
* Flush rules for custom post taxonomies.
*
* @wp-hook registered_taxonomy
* @param string $taxonomy
* @param string $object_type
* @param array $args
* @return void
*/
function t5_silent_flush_tax( $taxonomy, $object_type, $args )
{
// No idea why we get an array here, but an object for post types.
// Objects are easier to write, so ...
$args = (object) $args;
if ( $args->_builtin )
return;
if ( ! $args->public )
return;
if ( ! $args->rewrite )
return;
$slug = $taxonomy;
if ( isset ( $args->rewrite['slug'] ) && is_string( $args->rewrite['slug'] ) )
$slug = $args->rewrite['slug'];
$rules = get_option( 'rewrite_rules' );
if ( ! isset ( $rules[ $slug . '/(.+?)/?$'] ) )
flush_rewrite_rules( FALSE );
}
Cela effacera les règles chaque fois que vous créez un nouveau type d'article ou une nouvelle taxonomie. Pas besoin de visiter les paramètres de permalien à nouveau.