WordPress默认是不会将自定义文章类型加入主查询的。
主查询(Main Query)
WordPress中的查询是 WP_Query 类的实例。主查询是负责处理每个请求的查询。此查询由WordPress自动创建和维护。
在各请求的过程中,WordPress将URL翻译成一组查询变量,用这些变量配置主查询并获取结果。主查询被保存在全局变量 $wp_the_query 中。
除了主查询之外的其他查询被称为“自定义查询”或“辅助查询”。
问题
WordPress默认不会将自定义文章类型添加到主查询中,所以如果你在自定义文章类型中插入了一条数据,这条数据是不会出现在主页、归档页等页面上的。
为了验证这个问题,用下面的代码来注册一个叫“Book”的自定义文章类型,创建一本新书,然后访问主页。这本书的信息是不会出现的。
/*
* Registers the custom post type Book.
*/
function ns_register_book_cpt(){
// See all possible labels in the PHPDoc of the function get_post_type_labels
$labels = array(
'name' => __('Books', 'ns'),
'singular_name' => __('Book', 'ns'),
'menu_name' => __('Books', 'ns'),
'all_items' => __('All Books', 'ns'),
'add_new' => __('Add New', 'ns'),
'add_new_item' => __('Add New Book', 'ns'),
'edit_item' => __('Edit Book', 'ns'),
'new_item' => __('New Book', 'ns'),
'view_item' => __('View Book', 'ns'),
'view_items' => __('View Books', 'ns'),
'search_items' => __('Search Books', 'ns'),
'not_found' => __('No books found.', 'ns'),
'not_found_in_trash' => __('No books found in Trash.', 'ns'),
'archives' => __('Book Archives', 'ns'),
'filter_items_list' => __('Filter books list', 'ns'),
'items_list_navigation' => __('Books list navigation', 'ns'),
'items_list' => __('Books list', 'ns')
);
// See all possible attributes in the PHPDoc of the function register_post_type
$args = array(
'label' => __('Books', 'ns'),
'labels' => $labels,
'public' => true,
'exclude_from_search' => false,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_nav_menus' => true,
'show_in_menu' => true,
'show_in_admin_bar' => true,
'hierarchical' => false,
'supports' => array('title', 'editor', 'author'),
'taxonomies' => array('post_tag'),
'has_archive' => true,
'rewrite' => array('slug' => 'books'),
'query_var' => 'book'
);
register_post_type('ns_book_cpt', $args);
}
add_action('init', 'ns_register_book_cpt', 10, 0);
解决方案
使用“ pre_get_posts ”操作将自定义post类型添加到主查询。 步骤如下:
- 检查所需的查询是否正在被处理
- 用希望出现在查询中的文章类型填充数组
- 设置“post_type”查询变量
以下代码会将自定义文章类型 Book 添加到主页的主查询中
/*
* Sets the post types that can appear on the homepage.
*/
function ns_set_home_post_types($query){
$is_target_query =
!is_admin() &&
$query->is_main_query() &&
$query->is_home;
if($is_target_query){
$target_types = array('post', 'ns_book_cpt');
$query->set('post_type', $target_types);
}
}
add_action('pre_get_posts', 'ns_set_home_post_types', 10, 1);
当显示除文章类型归档页之外的其他归档页面时,下面的代码会将自定义文章类型Book添加到主查询中。如果显示的是文章类型归档页,那么修改“post_type”查询变量没有任何意义。
/*
* Sets the post types that can appear on archive pages.
*/
function ns_set_archive_post_types($query){
// We cannot use 'is_archive' here because post type archives should not be included
$is_target_query =
!is_admin() &&
$query->is_main_query() &&
($query->is_date ||
$query->is_author ||
$query->is_category ||
$query->is_tag ||
$query->is_tax);
if($is_target_query){
$target_types = array('post', 'ns_book_cpt');
$query->set('post_type', $target_types);
}
}
add_action('pre_get_posts', 'ns_set_archive_post_types', 10, 1);
源代码
本教程中用到的源代码可以在这里下载。
原创文章,作者:3628473679,如若转载,请注明出处:https://blog.ytso.com/tech/wp/246211.html