web-dev-qa-db-ja.com

プラグインによるカスタムページテンプレートの読み込み

私はカスタム投稿タイプに関するかなり古いチュートリアルに従っています、そして最後のステップはカスタムページテンプレートを作成することです。コメントによれば、6年後に使用された方法はもはや機能しなくなり(図を参照)、私のカスタムページテンプレートは新しいページを作成するときのオプションにはなりません。

カスタムフォルダをテーマフォルダに置いてもうまくいきますが、プラグインディレクトリから読み込むというオプションが壊れています。テンプレートを新しいページに割り当てるためにこれを修正するにはどうすればよいですか。

編集

私が今よりよく理解しているように、このコードは only 私のカスタム投稿タイプを表示するときのテンプレートのロードです。混乱はそれがThemesディレクトリに配置されたときにそれが "ページ属性"セクションで利用可能なテンプレートとして表示されていたことが原因でした。新しいページを作成するときにオプションとして利用できるようにしたいのですが、テンプレートファイルを自分のプラグインのディレクトリに配置します。

チュートリアルの元のコード:

add_filter( 'template_include', 'include_template_function', 1 );

function include_template_function( $template_path ) {
    if ( get_post_type() == 'movie_reviews' ) {
        if ( is_single() ) {
            // checks if the file exists in the theme first,
            // otherwise serve the file from the plugin
            if ( $theme_file = locate_template( array ( 'single-movie_reviews.php' ) ) ) {
                $template_path = $theme_file;
            } else {
                $template_path = plugin_dir_path( __FILE__ ) . '/single-movie_reviews.php';
            }
        }
    }
    return $template_path;
}
3
Aidan Knight

ページ属性テンプレートセクションにカスタムテンプレートを追加するには、最初にドロップダウンにテンプレートを追加し、現在のページが現在のテンプレートとして選択したときにそれをtemplate_includeフックに読み込む必要があります。

/**
 * Add "Custom" template to page attirbute template section.
 */
function wpse_288589_add_template_to_select( $post_templates, $wp_theme, $post, $post_type ) {

    // Add custom template named template-custom.php to select dropdown 
    $post_templates['template-custom.php'] = __('Custom');

    return $post_templates;
}

add_filter( 'theme_page_templates', 'wpse_288589_add_template_to_select', 10, 4 );


/**
 * Check if current page has our custom template. Try to load
 * template from theme directory and if not exist load it 
 * from root plugin directory.
 */
function wpse_288589_load_plugin_template( $template ) {

    if(  get_page_template_slug() === 'template-custom.php' ) {

        if ( $theme_file = locate_template( array( 'template-custom.php' ) ) ) {
            $template = $theme_file;
        } else {
            $template = plugin_dir_path( __FILE__ ) . 'template-custom.php';
        }
    }

    if($template == '') {
        throw new \Exception('No template found');
    }

    return $template;
}

add_filter( 'template_include', 'wpse_288589_load_plugin_template' );

theme_page_templatesフックはpage投稿タイプに利用可能です。他の投稿タイプにカスタムテンプレートを追加したい場合は、pageをあなたのカスタム投稿タイプ名に置き換えてください。 eventポストタイプフックはtheme_event_templatesという名前を持ちます。

5
kierzniak