我需要知道如何将我的所有帖子从自定义帖子类型拉到一个页面中,同时使页面根据帖子编辑器中选择的页面模板显示这些帖子。
我集成了一个下拉列表,用于分配客户端可以选择的页面模板,但我如何输出这些内容?
以下是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();