CPTテンプレートが表示されない-404の取得


8

私は、カスタムポストタイププラグインを開発しています。これは、devで正常に動作します。本番環境に移動したので、CPTのテンプレートを表示しようとすると404が表示されます。

したがって、2つの質問:

1- WPが階層を通過するために使用したパスを決定するメカニズムはありますか?

2-なぜそれは私に単一またはインデックスページを与えないのですか?

$ wp_queryとスタックトレースを404の最後にダンプしました。これが私が見つけたものの一部です:

[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

そしてスタックトレース:

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

ご協力いただきありがとうございます。

回答:


14

新しい公開投稿タイプまたは分類法を登録するときは、常に書き換えルールをフラッシュしてください。そうしないと、URLがクエリにマップされるときに、内部書き換えルールでそのことが考慮されません。

registered_post_typeとをフックすることで、このプロセスを自動化できますregistered_taxonomy

以下は、コメントや他の人々からのフィードバックに基づいて更新されたコードです。

プラグインT5 Silent Flushとして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 );
}

これにより、新しい投稿タイプまたは分類法を作成するたびにルールがフラッシュされます。パーマリンク設定に再度アクセスする必要はありません。


これをCPTプラグイン自体に追加することを考えています。ユーザーが私のプラグインを機能させるために別のプラグインを用意するように要求しても意味がないようです。
NotoriousWebmaster 2013

はい、もちろん。同じ問題を抱えている他の読者に再利用可能な例を提供したかっただけです。
fuxia

8
このような音がコアになるはずです
スコットキングスレークラーク

これに関するいくつかの質問がありました:これは、書き換えルールをフラッシュするのと同じくらいリソースを消費しますか?これは、WPが読み込まれるたびに実行されますか?
Manny Fleurmond 2013

@MannyFleurmondはい、投稿タイプが登録されるたびに実行されます。ただし、ルールは必要な場合にのみフラッシュされ、get_option()値はキャッシュから取得されます。
fuxia
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.