web-dev-qa-db-fra.com

Le modèle CPT ne s'affiche pas - Obtenir 404

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.

8
NotoriousWebmaster

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.

13
fuxia