我花了一整天的时间试图解决自定义查询和自定义帖子类型组合的问题。这是我最后的手段...
设置
我编写了一个插件,向我的 WordPress 引入了一些自定义帖子类型。为了在主查询中显示它们,我将它们挂接到查询中,如下所示:
function add_cpt_to_query( $query ) {
*some code...*
// add custom post types to query
if ( !( is_admin() || is_post_type_archive() || is_page() ) && $query->is_main_query() ) {
$query->set('post_type', array_merge( array('post'), $cpt ) );
}
}
add_action('pre_get_posts','add_cpt_to_query');
另一方面,在我的主题中,我设置了 ajax 分页,如下所示:
function setup_pagination() {
global $wp_query;
$max_pages = $wp_query->max_num_pages;
$current_page = ( $wp_query->paged > 1 ) ? $wp_query->paged : 1;
$ajaxurl = admin_url( 'admin-ajax.php' );
wp_register_script( 'ajax-pagination', get_template_directory_uri() .'/js/dummy.js', array('jquery'), '', true);
wp_localize_script( 'ajax-pagination', 'ajaxpagination', array(
'max_pages' => $max_pages,
'current_page' => $current_page,
'ajaxurl' => $ajaxurl,
'query_vars' => $wp_query->query_vars
));
wp_enqueue_script( 'ajax-pagination' );
}
add_action( 'wp_enqueue_scripts', 'setup_pagination' );
function pagination() {
$query = $_POST['query_vars'];
$query['paged'] = $_POST['next_page'];
/*
$query = array(
'paged' => 2,
'post_type' => array('post', 'custom_post_type_1', 'custom_post_type_2' )
);
*/
$posts = new WP_Query( $query );
$GLOBALS['wp_query'] = $posts;
// Start the loop.
while ( have_posts() ) : the_post();
?>
*some code...*
<?php endwhile;
die();
}
add_action( 'wp_ajax_nopriv_ajax_pagination', 'pagination' );
add_action( 'wp_ajax_ajax_pagination', 'pagination' );
和脚本部分:
$.ajax({
url: ajaxpagination.ajaxurl,
type: 'post',
data: {
action: 'ajax_pagination',
query_vars: ajaxpagination.query_vars,
next_page: parseInt(ajaxpagination.current_page) + 1
}
});
问题
如果我将从 $wp_query 获取的带有更改后的“分页”值的 query_vars 数组传递回 WP_QUERY,它将返回错误的帖子集。看起来 WP_QUERY 没有考虑循环中的 cpt。尽管这些cpt在query_vars数组的“post_type”中被提及,从而传递给新的WP_QUERY。
当我手动设置“post_type”并仅传递此参数时,它会按预期工作。令我震惊的方面是,对 WP_QUERY 的 ajax 调用中使用的结果 query_vars 完全相同,但只有当我手动设置“post_type”时,分页才能正常工作。
我不知道这是否是一个可以理解的解释,但我感谢每一个可以帮助我的想法。谢谢!
好的...我现在明白了。
我在 wp_localize_script() 中犯了一个错误。 query_vars 应该是一个 json 字符串,另一方面我只是传递了数组本身。我上面的代码必须修改为两行:
function mk_setup_pagination() {
...
wp_localize_script( 'ajax-pagination', 'ajaxpagination', array(
...
'query_vars' => json_encode($wp_query->query_vars) <- convert to json-string
));
...
}
function mk_pagination() {
$query = json_decode( stripslashes( $_POST['query_vars'] ) , true); <- convert json-string to array
...
现在就像魅力一样。 :)
btw:该代码基于 wpmudev.org 的教程:使用 AJAX 动态加载 WordPress 帖子