web-dev-qa-db-ja.com

デフォルトのテンプレートフォルダの代わりにプラグインフォルダからsingle.phpを使う

私が作っているカスタムプラグインに別のsingle.phpを使う方法を見つけようとしています。カスタム投稿タイプです。

人々がこのプラグインをインストールするならば、彼らは彼らのテーマフォルダにカスタムsingle-product.phpを持たないでしょう。だからこそ、私はそれをプラグインフォルダに入れたいのです。

このカスタム投稿タイプのsingle.phpのパスを変更する方法、またはこのプラグインをインストールした後にテーマフォルダにファイルを自動的に生成する方法はありますか。

前もって感謝します

2
user3428971

私は のようなtemplate_includeへのフックはここで説明されています がこれを行うための適切な方法であるかもしれないと思います。

コードは次のようになります。

add_filter('template_include', 'my_plugin_templates');
function my_plugin_templates( $template ) {
    $post_types = array('post');

    if (is_singular($post_types)) {
        $template = 'path/to/singular/template/in/plugin/folder.php';
    }

    return $template;
}
4
flomei

プラグインはウィジェットやショートコードではない視覚効果を持つべきではありません。テーマファイルを操作する必要があると感じる場合は、おそらく間違っている可能性があります。

*特定のテーマをターゲットにしたり、テーマにとらわれないもの(ポップアップやライトボックスなど)をしたり、テーマを壊したり醜い結果を得たりする可能性がほとんどないという例外は常にあります。

コメントを編集

これは、白黒の答えがない境界線の問題です。あなたが説明したものからあなたはテーマではなくプラグインをすべきだったが、私はあなたに課題が与えられたと思う。正しい方法はウーコマースのようなものです - CPTとして管理されているコンテンツを表示するショートコードやウィジェットです。そうでなければあなたはすべてのテーマで素晴らしいプレーをしないでしょう

1
Mark Kaplun

get_custom_post_type_templateは、コンテンツの取得時にWordPressが呼び出すべき関数です。プラグインが定義するフィルタ関数はテンプレートファイルへのフルパスを返さなければならないことに注意してください。そうしないと、結果のページは空白になります。テンプレートファイルはテーマのsingle.phpファイルと同じエントリを持つべきです。 詳細については、サイトをご覧ください。

 <?php
    function get_custom_post_type_template($single_template) {
    global $post;

       if ($post->post_type == 'my_post_type') {
          $single_template = dirname( __FILE__ ) . '/post-type-template.php';
       }
    return $single_template;
    }
    add_filter( 'single_template', 'get_custom_post_type_template' );
?>
0
kamleshpal