是否可以通过插件使用自定义页面模板?

#1 楼

可以通过get_page_template()过滤器覆盖page_template。如果您的插件是一个包含模板作为文件的目录,则只需传递这些文件的名称即可。如果要“即时”创建它们(在管理区域中编辑它们并将它们保存在数据库中?),则可能需要将它们写入高速缓存目录并引用它们,或者挂接到template_redirect并进行一些疯狂的操作eval()的东西。

一个简单的示例,如果某个标准成立,它会“重定向”到同一插件目录中的文件:

add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template )
{
    if ( is_page( 'my-custom-page-slug' ) ) {
        $page_template = dirname( __FILE__ ) . '/custom-page-template.php';
    }
    return $page_template;
}


评论


嗨,Jan,您是否有一些示例代码,说明如何将插件文件作为自定义页面模板传入?

– jnthnclrk
10 Nov 16 '17:58

@trnsfrmr:真的很简单,我在回答中添加了一个简单的示例。

– Jan Fabry
10 Nov 16 '19:46

请注意,在更高版本(3.1+)中,这已或多或少地被“ template_include”过滤器所取代。

– Inigoesdr
2013年6月10日15:54

完美!!!,您已经节省了我的时间@JanFabry

– Kishan Chauhan
18/12/21在14:02

如@fireydude所述,这不是通用解决方案。这是一种硬编码页面代码的解决方法。

–毛罗·科雷拉(Mauro Colella)
19年7月7日在21:18

#2 楼

覆盖get_page_template()只是一个快速的技巧。它不允许从“管理”屏幕中选择模板,并且页面标签已硬编码到插件中,因此用户无法知道模板的来源。

首选解决方案是遵循本教程,该教程使您可以从插件在后端注册页面模板。然后它就像其他模板一样工作。

 /*
 * Initializes the plugin by setting filters and administration functions.
 */
private function __construct() {
        $this->templates = array();

        // Add a filter to the attributes metabox to inject template into the cache.
        add_filter('page_attributes_dropdown_pages_args',
            array( $this, 'register_project_templates' ) 
        );

        // Add a filter to the save post to inject out template into the page cache
        add_filter('wp_insert_post_data', 
            array( $this, 'register_project_templates' ) 
        );

        // Add a filter to the template include to determine if the page has our 
        // template assigned and return it's path
        add_filter('template_include', 
            array( $this, 'view_project_template') 
        );

        // Add your templates to this array.
        $this->templates = array(
                'goodtobebad-template.php'     => 'It\'s Good to Be Bad',
        );
}


评论


如果您可以从答案中的链接中发布相关代码,那将是很好(并且更可取),否则,这不过是a肿的注释而已:-)

–Pieter Goosen
15年10月12日在11:32

该教程实际上将Tom McFarlin的示例归功于此方法的创建者。

– fireydude
2015年10月12日在11:53

#3 楼

对的,这是可能的。我发现这个示例插件非常有用。

我想到的另一种方法是使用WP Filesystem API创建主题模板文件。我不确定这是否是最好的方法,但我确定它会起作用!

评论


链接的示例插件甚至都有很好的文档说明。我喜欢。 :)

– Arvid
17年8月14日在14:46

#4 楼

以前的答案都没有对我有用。在这里,您可以在Wordpress管理员中选择模板。只需将其放在您的主要php插件文件中,并通过您的模板名称更改template-configurator.php
//Load template from specific page
add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template ){

    if ( get_page_template_slug() == 'template-configurator.php' ) {
        $page_template = dirname( __FILE__ ) . '/template-configurator.php';
    }
    return $page_template;
}

/**
 * Add "Custom" template to page attirbute template section.
 */
add_filter( 'theme_page_templates', 'wpse_288589_add_template_to_select', 10, 4 );
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-configurator.php'] = __('Configurator');

    return $post_templates;
}