当前位置: 首页 / 技术资讯 / wordpress为自定义文章类型添加可选择的模板

wordpress为自定义文章类型添加可选择的模板

WordPress支持自定义文章类型,推荐使用custom post type ui这个插件。这个插件功能异常强大,但这个不是我们今天的议题。

使用custom post type ui 这个插件,可以让Wordpress自定义文章类型。其模板为:single-{posttypename}.php,但这样则使得该类型文章都使用同一个模板,不能自主选择,今天,奕耕网站建设的工作人员,经过研究,可以使得自定文章类型的文章也可以自主选择模板。请跟随这篇文章操作:

  1. 在主题的function.php里添加如下代码:
    function cpt_add_meta_boxes() {
    $post_types = get_post_types();
    foreach( $post_types as $ptype ) {
    if ( $ptype !== 'page') {
    add_meta_box( 'cpt-selector', 'Attributes', 'cpt_meta_box', $ptype, 'side', 'core' );
    }
    }
    }
    add_action( 'add_meta_boxes', 'cpt_add_meta_boxes' );

    function cpt_remove_meta_boxes() {
    $post_types = get_post_types();
    foreach( $post_types as $ptype ) {
    if ( $ptype !== 'page') {
    remove_meta_box( 'pageparentdiv', $ptype, 'normal' );
    }
    }
    }
    add_action( 'admin_menu' , 'cpt_remove_meta_boxes' );

    function cpt_meta_box( $post ) {
    $post_meta = get_post_meta( $post->ID );
    $templates = wp_get_theme()->get_page_templates();

    $post_type_object = get_post_type_object($post->post_type);
    if ( $post_type_object->hierarchical ) {
    $dropdown_args = array(
    'post_type' => $post->post_type,
    'exclude_tree' => $post->ID,
    'selected' => $post->post_parent,
    'name' => 'parent_id',
    'show_option_none' => __('(no parent)'),
    'sort_column' => 'menu_order, post_title',
    'echo' => 0,
    );

    $dropdown_args = apply_filters( 'page_attributes_dropdown_pages_args', $dropdown_args, $post );
    $pages = wp_dropdown_pages( $dropdown_args );

    if ( $pages ) {
    echo "<p><strong>Parent</strong></p>";
    echo "<label class=\"screen-reader-text\" for=\"parent_id\">Parent</label>";
    echo $pages;
    }
    }

    // Template Selector
    echo "<p><strong><a href=\"http://www.eagerstar.com\" target=\"_blank\">模板选择</a></strong></p>";
    echo "<select id=\"cpt-selector\" name=\"_wp_page_template\"><option value=\"default\">奕耕模板</option>";
    foreach ( $templates as $template_filename => $template_name ) {
    if ( $post->post_type == strstr( $template_filename, '-', true) ) {
    if ( isset($post_meta['_wp_page_template'][0]) && ($post_meta['_wp_page_template'][0] == $template_filename) ) {
    echo "<option value=\"$template_filename\" selected=\"selected\">$template_name</option>";
    } else {
    echo "<option value=\"$template_filename\">$template_name</option>";
    }
    }
    }
    echo "</select>";

    // Page order
    echo "<p><strong>Order</strong></p>";
    echo "<p><label class=\"screen-reader-text\" for=\"menu_order\">Order</label><input name=\"menu_order\" type=\"text\" size=\"4\" id=\"menu_order\" value=\"". esc_attr($post->menu_order) . "\" /></p>";
    }

    function save_cpt_template_meta_data( $post_id ) {

    if ( isset( $_REQUEST['_wp_page_template'] ) ) {
    update_post_meta( $post_id, '_wp_page_template', $_REQUEST['_wp_page_template'] );
    }
    }
    add_action( 'save_post' , 'save_cpt_template_meta_data' );

    function custom_single_template($template) {
    global $post;

    $post_meta = ( $post ) ? get_post_meta( $post->ID ) : null;
    if ( isset($post_meta['_wp_page_template'][0]) && ( $post_meta['_wp_page_template'][0] != 'default' ) ) {
    $template = get_template_directory() . '/' . $post_meta['_wp_page_template'][0];
    }

    return $template;
    }
    add_filter( 'single_template', 'custom_single_template' );

  2. 添加完毕后,即可在自定义文章类型的文章中看到模板选择:如下图:
    wordpress为自定义文章类型添加可选择的模板
  3. 接下来,你需要定义一个php文件,文件名称为:{posttypename}-{customname}.php。并在其文件开始,填写Template Name:模板名称
  4. 这样,即可在自定义文章类型的文章发布中,找到并可自由选择模板了。