如何使用页面模板显示文章类型


How to Display Post Type with Page Template

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

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

以下是post类型的所有代码,包括模板选择器。

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 **/

我还没有任何关于页面模板的东西,这就是我需要帮助创建的,但这是文章类型的代码。

谢谢!

使用正确的过滤器

当有人查看单个项目时,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();