我需要知道如何将所有帖子从自定义帖子类型拉到单个页面,同时根据在帖子编辑器中选择的页面模板使页面显示这些帖子。
我集成了一个下拉列表,用于分配客户可以选择的页面模板,但如何输出该内容?
这里是帖子类型的所有代码,包括模板选择器。
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 **/
我还没有关于页面模板的任何内容,这是我需要帮助创建的内容,但这里是帖子类型代码。
谢谢!
答案 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();