Modèle CPT non affiché - Obtention de 404


8

Je développe un plugin Custom Post Type, qui fonctionne très bien en dev. Maintenant que je l'ai déplacé en production, j'obtiens un 404 lorsque j'essaie d'afficher le modèle pour le CPT.

Donc, deux questions:

1- Existe-t-il un mécanisme pour déterminer le chemin emprunté par WP pour traverser la hiérarchie?

2- Pourquoi ne me donnerait-il pas simplement la page unique ou l'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.

Réponses:


14

Rincez 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_typeet registered_taxonomy.

Vous trouverez ci-dessous le code mis à jour, basé sur les commentaires des commentaires et d'autres personnes.

Téléchargez le 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 videra les règles chaque fois que vous créez un nouveau type de message ou une nouvelle taxonomie. Pas besoin de visiter à nouveau les paramètres du permalien.


Je pense à l'ajouter au plugin CPT lui-même. Il ne semble pas logique d'exiger qu'un utilisateur ait un autre plugin pour que mon plugin fonctionne.
NotoriousWebmaster

Oui bien sûr. Je voulais juste fournir un exemple réutilisable pour d'autres lecteurs ayant le même problème.
fuxia

8
Des sons comme celui-ci devraient être essentiels
Scott Kingsley Clark

J'avais quelques questions à ce sujet: cela nécessitera-t-il autant de ressources que le nettoyage des règles de réécriture et cela s'exécute-t-il à chaque chargement de WP?
Manny Fleurmond

@MannyFleurmond Oui, il s'exécutera chaque fois que le type de message est enregistré. Mais les règles ne sont vidées que lorsque cela est nécessaire et la get_option()valeur provient du cache.
fuxia
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.