通过插件加载自定义页面模板

时间:2017-12-14 作者:Aidan Knight

我正在学习一个关于自定义帖子类型的过时教程,最后一步是创建一个自定义页面模板,该模板旨在以归档列表格式显示自定义类型的所有帖子。根据评论,6年后使用的方法不再有效(见图),并且在创建新页面时,我的自定义页面模板不是一个选项。

如果我将自定义模板放在主题文件夹中,它可以工作,但从插件目录中加载它的选项已损坏。如何修复此问题,以便将模板分配给新页面?

编辑

现在我更好地理解了这段代码only 查看自定义帖子类型时加载模板。造成混淆的原因是,当它位于主题目录中时,它在“页面属性”部分显示为可用模板。我想让它作为一个选项时,使一个新的网页,但有模板文件位于我的插件的目录。

教程中的原始代码:

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;
}

1 个回复
最合适的回答,由SO网友:kierzniak 整理而成

要在页面属性模板部分添加自定义模板,您必须首先将模板添加到下拉列表中并加载到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 post类型挂钩将有一个名称theme_event_templates.

结束

相关推荐

Taxonomy Templates

我不太明白如何链接到我的分类法模板。我需要做一个临时页面并从那里查询我的条款吗?我当前正在使用分类层次结构:Taxonomy$labels = array( \'name\' => __( \'Product Categories\' ), \'singular_name\' => __( \'Product Category\' ), \'search_items\' =>