【问题标题】:$wp_query and WP_QUERY - same arguments, different results$wp_query 和 WP_QUERY - 相同的参数,不同的结果
【发布时间】:2016-05-10 16:04:21
【问题描述】:

我花了一整天的时间试图找出自定义查询和自定义帖子类型相结合的问题。这是我最后的手段……

设置

我编写了一个插件,为我的 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 没有考虑循环中的 cpts。尽管这些 cpts 在 query_vars 数组的 'post_type' 中被提及并因此传递给新的 WP_QUERY。

当我手动设置“post_type”并且只传递这个参数时,它会按预期工作。让我大吃一惊的是,在对 WP_QUERY 的 ajax 调用中使用的结果 query_vars 完全相同,但只有当我手动设置“post_type”时,分页才能正常工作。

我不知道这是否是一个可以理解的解释,但我感谢每一个可以帮助我的想法。大赞!

【问题讨论】:

标签: wordpress wordpress-theming


【解决方案1】:

好的...我现在明白了。

我在 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

...

现在就像一个魅力。 :)

顺便说一句:代码基于 wpmudev.org 的教程:Loading WordPress Posts Dynamically With AJAX

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-23
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 2015-09-19
    • 2014-04-05
    相关资源
    最近更新 更多