我有一个自定义的帖子类型,当我使用自定义的wp\\u查询时,它可以在页面上很好地显示帖子,但是这会破坏分页,所以我尝试使用pre\\u get\\u posts来代替,因为我已经在使用它来处理分页偏移,并且可以在普通帖子上找到。
但是,当我尝试使用pre\\u get\\u posts设置特定页面/帖子类型的帖子类型时,它显示了404。我确实有一篇自定义帖子,其名称中的字符串与自定义帖子类型中的字符串相同;\'“业务挑战”是帖子类型,“面对业务挑战”是它重定向到的帖子。自从我删除了那篇帖子,现在只显示了404。
我的预获取帖子功能:
function query_business_challenges( $query ) {
if ( ! is_admin() && $query->is_main_query() && is_page(\'business-challenges\')) {
$query->set( \'post_type\', \'business-challenges\' );
} // end if
}
add_action( \'pre_get_posts\', \'query_business_challenges\', 1 );
和我的自定义帖子类型:
function pt_business_challenges() {
$labels = array(
\'name\' => \'Business Challenges\',
\'singular_name\' => \'Business Challenge\',
\'menu_name\' => \'B. Challenges\',
\'parent_item_colon\' => \'Business Challenges\',
\'all_items\' => \'All Business Challenges\',
\'view_item\' => \'View Business Challenge\',
\'add_new_item\' => \'Add New Business Challenge\',
\'add_new\' => \'Add New\',
\'edit_item\' => \'Edit Business Challenge\',
\'update_item\' => \'Update Business Challenge\',
\'search_items\' => \'Search Business Challenges\',
\'not_found\' => \'Not found\',
\'not_found_in_trash\' => \'Not found in Trash\',
);
$args = array(
\'label\' => \'business-challenges\',
\'description\' => \'For New and Previous Business Challenges\',
\'labels\' => $labels,
\'supports\' => array( \'title\', \'editor\', \'excerpt\', \'thumbnail\', \'revisions\', \'custom-fields\', ),
\'hierarchical\' => false,
\'public\' => true,
\'show_ui\' => true,
\'show_in_menu\' => true,
\'rewrite\' => array( \'slug\' => \'/business-challenges\'),
\'show_in_nav_menus\' => true,
\'show_in_admin_bar\' => true,
\'menu_position\' => 7,
\'menu_icon\' => \'dashicons-chart-area\',
\'can_export\' => true,
\'has_archive\' => true,
\'exclude_from_search\' => false,
\'publicly_queryable\' => true,
\'capability_type\' => \'page\',
);
register_post_type( \'business-challenges\', $args );
}
add_action( \'init\', \'pt_business_challenges\', 0 );
我做错了什么?
最合适的回答,由SO网友:Pieter Goosen 整理而成
pre_get_posts
不适用于页面模板和静态首页。它将是404。如果我读了WP_Query
正确初始化时,页面ID将传递给参数,如p
解析URL后。您可以尝试取消设置此参数并检查它是否更改了查询,但我怀疑这是否是唯一可以更改以使其正常工作的参数。从来没有玩过这个,所以一切都只是猜测。这是一个很好的机会pre_get_posts
页面上的模板
您必须在此处使用自定义查询来输出所需内容。至于分页,您需要添加以下自定义查询以使其正常工作
这是在定义参数之前进行的
$paged = get_query_var( \'paged\' ) ? get_query_var( \'paged\' ) : 1;
记住要改变
\'paged\'
到
\'page\'
对于静态首页
然后需要设置\'paged\'
查询参数中的参数
\'paged\' => $paged,
那么,通过
$max_num_pages
对分页函数的自定义查询的属性。
实例
如果自定义查询如下所示
$q = new WP_Query( $args );
那你需要通过
$q->max_num_pages
到分页函数,如下所示
next_posts_link( \'Next posts\', $q->max_num_pages );
编辑代码上的一个或两个注释
如果要在页面模板上显示自定义帖子类型,需要设置has_archive
到false
, 否则,存档模板将用于显示自定义帖子类型
如果您在自定义帖子类型上遇到404个错误archive 模板,然后您只需要通过访问permalink设置页面来刷新permalinks。不需要任何类型的自定义代码或过滤器。
从你的粘贴中编辑2(这应该是对你的问题的编辑),你有一些小问题
wp_reset_query()
是错误的。它与一起使用query_posts
你永远不应该使用它。您应该使用wp_reset_postdata()
似乎您正在尝试将分页添加到查询的顶部。为了使其工作,您需要首先定义自定义查询。但是,您可以在循环之前添加分页。
正如我所说,您需要设置$max_pages
中的参数next_posts_link()
您的查询应该与此类似
$paged = get_query_var( \'paged\' ) ? get_query_var( \'paged\' ) : 1;
$args = array(
\'paged\' => $paged,
//Rest of your arguments
);
$loop = new WP_Query( $args );
/*
* If you need your pagination above the loop,
* this is the earliest to add it. You cannot add it above
*/
next_posts_link( \'Next Posts\', $loop->max_num_pages );
previous_posts_link( \'Previous Posts\' );
if ( $loop->have_posts() ) {
while ( $loop->have_posts() ) {
$loop->the_post();
//YOUR LOOP
} // endwhile
// Add pagination here
next_posts_link( \'Next Posts\', $loop->max_num_pages );
previous_posts_link( \'Previous Posts\' );
// Reset postdata, VERY VERY IMPORTANT
wp_reset_postdata();
} // endif