如何使用页面模板显示帖子类型

时间:2016-05-10 19:01:20

标签: php wordpress

我需要知道如何将所有帖子从自定义帖子类型拉到单个页面,同时根据在帖子编辑器中选择的页面模板使页面显示这些帖子。

我集成了一个下拉列表,用于分配客户可以选择的页面模板,但如何输出该内容?

这里是帖子类型的所有代码,包括模板选择器。

add_action('init', 'create_modules');
  function create_modules() {
    $moduleslabels = array(
      'name' => 'Module',
      'singular_name' => 'Home Module',
      'add_new' => 'Add New Module',
      'add_new_item' => 'Add New Module',
      'edit_item' => 'Edit Module',
      'new_item' => 'New Module',
      'all_items' => 'All Modules',
      'view_item' => 'View Module',
      'search_items' => 'Search Modules',
      'not_found' =>  'No Modules Found',
      'not_found_in_trash' => 'No Modules Found in Trash', 
      'parent_item_colon' => '',
      'menu_name' => 'Home Modules'
    );   

    $modules_args = array(
      'labels' => $moduleslabels,
      'public' => true,
      'show_ui' => true,
      'capability_type' => 'page',
      'order' => 'ASC', 
      'rewrite' => true,
      'menu_icon'   => 'dashicons-menu',
      'supports' => array('title', 'editor', 'thumbnail', 'page-attributes', 'revisions')
  );

  register_post_type('modules',$modules_args);

  }

  // admin filters  
  add_filter("manage_edit_modules_columns", "modules_edit_columns");
  add_action("manage_posts_custom_column",  "modules_columns_display");

  function modules_edit_columns($modules_columns){
    $modules_columns = array(
      "cb" => "<input type=\"checkbox\" />",
      "title" => "Section Title",
      "description" => "Section Content",
    );

    return $modules_columns;

    }

    function modules_columns_display($modules_columns){
      switch ($modules_columns)
      {
      case "description":
        the_content();
        break;              
      }
    }  

// new title text in Module
add_filter( 'enter_title_here', 'modules_enter_title_here' );
function modules_enter_title_here( $message ){
  global $post;
  if( 'modules' == $post-> post_type ):
    $message = 'Enter Title';
  endif;

  return $message;
}







/** Custom Post Type Template Selector **/
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>Template</strong></p>";
    echo "<select id=\"cpt-selector\" name=\"_wp_page_template\"><option value=\"default\">Default Template</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' );
/** END Custom Post Type Template Selector **/

我还没有关于页面模板的任何内容,这是我需要帮助创建的内容,但这里是帖子类型代码。

谢谢!

1 个答案:

答案 0 :(得分:0)

使用正确的过滤器

当有人查看单个项目时,single_template过滤器是可挂钩的。由于您要创建一个包含所有模块概述的页面,您应该将现在使用的过滤器(single_template)替换为另一个过滤器 - 将代码的最后一句替换为:

add_filter( 'page_template', 'custom_single_template' );

在后端创建新页面

创建一个新页面并将其命名为“模块页面”。从自定义下拉列表中选择页面模板。记住您选择的页面模板。您将在以下步骤中使用它。

修改页面模板

可以使用WP_Query获取帖子。尝试将以下代码粘贴到您在上一步中选择的页面模板中,看看是否得到了结果。确保您在模块帖子类型中添加了几个项目。

// WP_Query arguments
$args = array (
    'post_type'              => array( 'modules' ),
    'post_status'            => array( 'publish' ),
    'posts_per_page'         => '-1',
);

// The Query
$query = new WP_Query( $args );

// The Loop
if ( $query->have_posts() ) {
    while ( $query->have_posts() ) {

        // get post data
        $query->the_post();

        // show the module title
        echo get_the_title();

    }
} else {

    // no modules found
    echo 'No items in "modules" post type';

}

// Restore original Post Data
wp_reset_postdata();