カスタム投稿タイプとtemplate_redirect


9

独立したテンプレート(single-post_type_1.phpとsingle-post_type_2.php)にリダイレクトしてそれらの表示を処理したい2つのカスタム投稿タイプ(post_type_1とpost_type_2)があります。ディスプレイテンプレートをテーマフォルダーに配置したくないのは、それぞれのプラグインフォルダーに自己完結させたいためです。

他のユーザーに影響を与えることなく、それぞれにtemplate_redirectフックを登録させるにはどうすればよいですか?または、別のテクニックを使用する必要がありますか?

現在、私はプラグイン1でこれを行っています。

add_action( 'template_redirect', 'template_redirect_1' );
function template_redirect_1() {
    global $wp_query;
    global $wp;

    if ( $wp_query->query_vars['post_type'] === 'post_type_1' ) {

        if ( have_posts() )
        {
            include( PATH_TO_PLUGIN_1 . '/views/single-post_type_1.php' );
            die();
        }
        else
        {
            $wp_query->is_404 = true;
        }

    }
}

そして、これはプラグイン2です。

add_action( 'template_redirect', 'template_redirect_2' );
function template_redirect_2() {
    global $wp_query;
    global $wp;

    if ( $wp_query->query_vars['post_type'] === 'post_type_2' ) {

        if ( have_posts() )
        {
            include( PATH_TO_PLUGIN_2 . '/views/single-post_type_2.php' );
            die();
        }
        else
        {
            $wp_query->is_404 = true;
        }

    }
}

プラグイン2のtemplate_redirectフックを登録すると、プラグイン1は機能しなくなります。

何か不足していますか?

これを行う最良の方法は何ですか?

回答:


13

これには、template_includeフィルターを使用する必要があります。

add_filter('template_include', 'wpse_44239_template_include', 1, 1);
function wpse_44239_template_include($template){
    global $wp_query;
    //Do your processing here and define $template as the full path to your alt template.
    return $template;
}

template_redirectレンダリングされたテンプレートの出力のためにヘッダーが送信される直前に呼び出されるアクションです。これは404リダイレクトなどを行うのに便利なフックですが、WordPressが 'template_include'フィルターで元々これを行うため、他のテンプレートパスを含めるために使用しないでください。

template_includeおよびsingle_templateフックは、コンテンツのレンダリングに使用されるテンプレートのパスのみを扱います。これは、テンプレートパスを調整する適切な場所です。

@ChipBennettのコメントからの更新:

single_templateされた3.4のように除去。代わりに{posttype} _templateを使用してください。


したがって、これは機能しますが、template_redirectとsingle_templateも機能することがわかります。私が決定した本当の問題は、「リクエスト」フィルターにフックするカスタム管理列ソート関数があり、$ vars変数の変更を投稿タイプが特定のタイプである場合のみに制限していないことでした。しかし、私はtemplate_includeフックについて知ってうれしいです。ただし、template_redirect、template_include、single_templateの違いはまだわかりません。
かつての

@anderly私は私の答えを更新しました。お役に立てれば。
Brian Fegter

では、single_templateはどうですか?このリンク(codex.wordpress.org/Plugin_API/Filter_Reference/single_template)は、単一のテンプレートが呼び出されたときに、投稿またはページのテンプレートを調整するために使用できることを示しています。これは私がやろうとしていることです。いずれの場合も、template_includeまたはsingle_templateフィルターのいずれかを使用しても機能し、同じことを達成しているように見えます。
かつての

1
single_templateは、条件付きで呼び出されることを除いて、同じように機能します。これにより、サイト全体でハンマーフィルターを使用する代わりに、パスの変更を分離できます。
Brian Fegter

1
とてもかっこいい... template_includeについて知らなかった
helgatheviking
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.