通过插件添加自定义帖子类型模板

时间:2015-02-01 11:36:18

标签: wordpress post

我正在为自定义帖子类型创建一个插件。我想为它添加自定义模板。但我不确定如何通过插件添加它。

如何通过插件添加自定义帖子类型模板?

请帮忙!

3 个答案:

答案 0 :(得分:0)

下面是一个完整的(空白)插件,我根据之前发布的答案放在一起。我把它加载到我的主题(基于二十五)并且它有效。与插件一起,您还需要以下文件结构

 - schs-blank/css schs-blank/js schs-blank/images
   schs-blank/archive-blank.php schs-blank/single-blank.php
   schs-blank/schs-blank-edit-posts.php
   schs-blank/schs-blank-template.php

要弄清楚上述文件中应该包含哪些内容应该不会太棘手,但对于初学者来说,只需要放置&#34; <h1>{filename}</h1>&#34;查看每个页面的调用位置。

<?php
/*
        Plugin Name: SCHS Blank Plugin
        Plugin URI: http://www.southcoasthosting.com/schs-blank
        Tags: jquery, flyout, vertical, menu, animated, css, navigation, widget, plugin, scroll
        Description: Creates a widget to place a vertical menu which caters for many menu items.
        Author: Gavin Simpson
        Version: 0.1
        Author URI: http://www.southcoasthosting.com
        074 355 1881
*/
class schs_blank
{
    protected $plugin_slug;
    private static $instance;
    protected $templates;

    public static function get_instance() 
    {
        if( null == self::$instance )
        {
            self::$instance = new schs_blank();
        }
        return self::$instance;
    } 
    private function __construct()
    {
        $this->templates = array();
        $page_template = dirname( __FILE__ ) . '/schs-blank-template.php';
        $this->templates = array('schs-blank-template.php' => 'SCHS Blank Page Template','schs-blank-edit-posts.php'=>'Edit Blank Post Template');
        if(!is_admin())
        {
            add_action( 'wp_blank', array('schs_blank', 'header') );
        }
        else
            add_action( 'wp_blank', array('schs_blank', 'footer') );

        add_filter('page_attributes_dropdown_pages_args',array( $this, 'register_project_templates' ));
        add_filter('wp_insert_post_data', array( $this, 'register_project_templates' ));
        add_filter( 'template_include', array($this,'schs_force_template' ));
        add_filter('template_include', array( $this, 'view_project_template') );

        add_action('admin_menu', array($this,'setup_blank_admin_menus'));
        add_action( 'init', array($this,'blank_custom_post' ));
    }
    function schs_force_template($template)
    {
        if( is_archive( 'blank' ) )
        {
            $template = WP_PLUGIN_DIR .'/'. plugin_basename( dirname(__FILE__) ) .'/archive-blank.php';
        }
        if( is_singular( 'blank' ) ) 
        {
            $template = WP_PLUGIN_DIR .'/'. plugin_basename( dirname(__FILE__) ) .'/single-blank.php';
        }
        return $template;
    }
    function header(){
        wp_enqueue_script('jquery');
        wp_enqueue_style( 'blank-css', schs_blank::get_plugin_directory() . "/css/blank.css" );
        wp_enqueue_script('schs_blank', schs_blank::get_plugin_directory() . '/js/schs-blank.js', array('jquery'));
    }
    function footer()
    {
    }
    function get_plugin_directory(){
        return WP_PLUGIN_URL . '/schs-blank';   
    }
    function setup_blank_admin_menus()
    {
        add_menu_page('SCHS Blank Settings', 'SCHS Blank Settings', 'manage_options', 
            'SCHS_blank_settings', array($this,'SCHS_page_settings'));
        add_submenu_page('SCHS_blank_settings', 
            'SCHS Page Elements', 'Blank Topics', 'manage_options', 
            'SCHS_blank_topics_settings', array($this,'SCHS_blank_topics_settings')); 
    }
    function SCHS_page_settings()
    {
        ?>
        <div class="wrap">
        <h2>There are no Blank options at this stage.</h2>
        </div>
        <?php
    }
    function SCHS_blank_topics_settings()
    {
        ?>
        <div id="blank_topics" class="wrap">
        <h1>There are no blank topics at this stage</h1>
        </div>
        <?php
    }
    function blank_custom_post()
    {
        $labels = array(
        'name'               => _x( 'Blank', 'post type general name' ),
        'singular_name'      => _x( 'Topic', 'post type singular name' ),
        'add_new'            => _x( 'Add New', 'book' ),
        'add_new_item'       => __( 'Add New Blank Topic' ),
        'edit_item'          => __( 'Edit Blank Topic' ),
        'new_item'           => __( 'New Blank Topic' ),
        'all_items'          => __( 'All Blank Topics' ),
        'view_item'          => __( 'View Blank Topics' ),
        'search_items'       => __( 'Search Blank Topics' ),
        'not_found'          => __( 'No blank topics found' ),
        'not_found_in_trash' => __( 'No blank topics found in the trash' ), 
        'parent_item_colon'  => '',
        'menu_name'          => 'Blank'
        );
        $args = array(
        'labels'        => $labels,
        'description'   => 'Holds our blank topic specific data',
        'public'        => true,
        'menu_position' => 5,
        'supports'      => array( 'title', 'editor'),
        'has_archive'   => true,
        'menu_icon'     => $this->get_plugin_directory().'/images/blank-icon.png',
        );
        register_post_type( 'blank', $args );
        flush_rewrite_rules();
    }

    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; 
                    exit;
                }
                return $template;
    }

}
add_action( 'plugins_loaded', array( 'schs_blank', 'get_instance' ) );
?>

我希望这会有所帮助。

答案 1 :(得分:0)

您只需在自定义插件中创建自定义页面模板并将其指定给自定义帖子类型。

只需在插件目录中创建2个模板文件(存档和单个)。

然后在主插件中添加一些代码,如下例所示:

/*
 * Set Page templates for CPT "help_lessions"
 */


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

    if ( is_post_type_archive( $post_types ) && file_exists( plugin_dir_path(__FILE__) . 'templates/archive_help_lessions.php' ) ){
        $template = plugin_dir_path(__FILE__) . 'templates/archive_help_lessions.php';
    }

    if ( is_singular( $post_types ) && file_exists( plugin_dir_path(__FILE__) . 'templates/single_help_lessions.php' ) ){
        $template = plugin_dir_path(__FILE__) . 'templates/single_help_lessions.php';
    }

    return $template;
}

希望这个例子对你有所帮助。 干杯!!

答案 2 :(得分:0)

为我工作,请尝试一下,谢谢
模板已加载到位于
的cpt文件中 custom_plugin->应用程序-> cpt-> cpt_article.php
模板位于
custom_plugin->应用->模板

add_filter( 'single_template', 'load_my_custom_template', 99, 1 );
 function load_custom_templates($single_template) {
   global $post;
   if ($post->post_type == 'article' ) {
   $single_template = trailingslashit( plugin_dir_path( __FILE__ ) .'app/templates' ).'single_article.php';
  }
   return $single_template;
}