从插件添加自定义页面模板 [英] adding custom page template from plugin

查看:112
本文介绍了从插件添加自定义页面模板的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为Wordpress构建我的第一个插件,并且需要它为登录屏幕动态添加自定义页面.

I'm working on building my first plugin for wordpress and am needing it to dynamically add a custom page for a login screen among other things.

我唯一能找到的就是我需要的东西:

The only thing I've been able to find that's anywhere near what I'm needing is here: WP - Use file in plugin directory as custom Page Template? & Possible to add Custom Template Page in a WP plugin?, but they're still not quite what I'm looking for.

这是我当前在插件中运行的代码...

Here is the code that I currently have running in my plugin...

// Add callback to admin menu
add_action( 'template_redirect', 'uploadr_redirect' );

// Callback to add menu items
function uploadr_redirect() {

global $wp;
$plugindir = dirname( __FILE__ );

// A Specific Custom Post Type
if ( $wp->query_vars["post_type"] == 'uploadr' ) {

    $templatefilename = 'custom-uploadr.php';

    if ( file_exists( TEMPLATEPATH . '/' . $templatefilename )) {

        $return_template = TEMPLATEPATH . '/' . $templatefilename;

    } else {

        $return_template = $plugindir . '/themefiles/' . $templatefilename;

    }

    do_theme_redirect( $return_template );

}

}


function do_theme_redirect( $url ) {

    global $post, $wp_query;

    if ( have_posts ()) {

        include( $url );
        die();

    } else {

        $wp_query->is_404 = true;

    }

}

使用此方法需要我的客户端创建新页面...我需要的是使用插件中的模板文件自动创建自定义页面(具有自定义路径,即.com/custompathhere)的插件.文件夹,其中将包含插件执行的所有操作.

Using this would require that my client create new page... what I'm needing is for the pluging to auto create a custom page (with a customized path, meaning .com/custompathhere) using a template file from the plugin folder, which will then contain all actions the plugin performs.

注意:此插件旨在在一页上运行,因此减少了加载时间等.

Note: This plugin is designed to run on one page, therefore reducing load-time and etc.

提前谢谢!

推荐答案

这是我的代码解决方案,用于从Wordpress插件(由Tom McFarlin启发)中添加页面模板.

Here is my code solution for adding page templates from a Wordpress plugin (inspired by Tom McFarlin).

这是为插件设计的(在插件的根目录中搜索模板文件).这些文件的格式也与要直接包含在主题中的格式完全相同.如果需要,可以更改此设置-请查看我的完整教程 http://www.wpexplorer. com/wordpress-page-templates-plugin/以获得有关此解决方案的更多详细信息.

This is designed for a plugin (the template files are searched for in the root directory of the plugin). These files are also in exactly the same format as if they were to be included directly in a theme. This can be changed if desired - check out my full tutorial http://www.wpexplorer.com/wordpress-page-templates-plugin/ for greater detail on this solution.

要自定义,只需在__construct方法中编辑以下代码块;

To customise, simply edit the following code block within the __construct method;

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

完整代码;

class PageTemplater {

    /**
     * A Unique Identifier
     */
     protected $plugin_slug;

    /**
     * A reference to an instance of this class.
     */
    private static $instance;

    /**
     * The array of templates that this plugin tracks.
     */
    protected $templates;


    /**
     * Returns an instance of this class. 
     */
    public static function get_instance() {

            if( null == self::$instance ) {
                    self::$instance = new PageTemplater();
            } 

            return self::$instance;

    } 

    /**
     * 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',
            );

    } 


    /**
     * Adds our template to the pages cache in order to trick WordPress
     * into thinking the template file exists where it doens't really exist.
     *
     */

    public function register_project_templates( $atts ) {

            // Create the key used for the themes cache
            $cache_key = 'page_templates-' . md5( get_theme_root() . '/' . get_stylesheet() );

            // Retrieve the cache list. 
            // If it doesn't exist, or it's empty prepare an array
            $templates = wp_get_theme()->get_page_templates();
            if ( empty( $templates ) ) {
                    $templates = array();
            } 

            // New cache, therefore remove the old one
            wp_cache_delete( $cache_key , 'themes');

            // Now add our template to the list of templates by merging our templates
            // with the existing templates array from the cache.
            $templates = array_merge( $templates, $this->templates );

            // Add the modified cache to allow WordPress to pick it up for listing
            // available templates
            wp_cache_add( $cache_key, $templates, 'themes', 1800 );

            return $atts;

    } 

    /**
     * Checks if the template is assigned to the page
     */
    public function view_project_template( $template ) {

            global $post;

            if (!isset($this->templates[get_post_meta( 
                $post->ID, '_wp_page_template', true 
            )] ) ) {

                    return $template;

            } 

            $file = plugin_dir_path(__FILE__). get_post_meta( 
                $post->ID, '_wp_page_template', true 
            );

            // Just to be safe, we check if the file exist first
            if( file_exists( $file ) ) {
                    return $file;
            } 
            else { echo $file; }

            return $template;

    } 


} 

add_action( 'plugins_loaded', array( 'PageTemplater', 'get_instance' ) );

有关更多信息,请查看我的教程.

Check out my tutorial on this for more info.

http://www.wpexplorer.com/wordpress-page-templates-plugin /

我希望这可以帮助您完成您想做的事情:)

I hope this helps you in what you want to do :)

这篇关于从插件添加自定义页面模板的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆