带有AJAX处理程序的WP_QUERY返回相同的帖子

时间:2013-04-10 作者:Jonas

我有一个问题,那就是让我的自动取款机秃顶。我有一个ajax调用,它处理一个循环,该循环处理一些查询并为我返回帖子。

到目前为止还不错,但用户第一次看到页面时,我们应该加载10篇帖子,然后我们想单击一个按钮再请求5篇。

到目前为止还不错。

但当我们要求再发5个帖子时,我们又得到了前5个帖子。

我的batchloop

<?php   
// Our include  
define(\'WP_USE_THEMES\', false);  
require_once(\'../../../wp-load.php\');  

// Our variables  
$posts = (isset($_GET[\'numPosts\'])) ? $_GET[\'numPosts\'] : 0;  
$page = (isset($_GET[\'pageNumber\'])) ? $_GET[\'pageNumber\'] : 0;  
$category = (isset($_GET[\'category_name\'])) ? $_GET[\'category_name\'] : 0;  

var_dump($posts);

$args = array(  
    \'posts_per_page\' => $posts,
    \'category_name\'  => $category, 
    \'post_status\'    => \'publish\',
    \'orderby\'        => \'date\',
    \'order\'          => \'DESC\',
    \'paged\'          => $page 
);

query_posts($args);  

// $query = new WP_query($args);

// our loop  
if (have_posts()) {  

    $paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1; query_posts($args);

       while (have_posts()){  
              the_post();  

              get_template_part( \'thumbs\', get_post_format() );  
       }  
} 

// unset($page, $posts, $category);

// wp_reset_postdata();
wp_reset_query();
?> 
有人看到我做错了什么吗?

编辑:

批处理程序

 function _batchhandler() { 
        var getamount = localStorage.getItem(\'amount\'); 

        console.log(\'amount of posts to retrive \' + JSON.parse(getamount));

        // Ajax call
        $.ajax({
            type: \'GET\',
            data: {
                posts: getamount, 
                page: page,
                category: \'work\'
            },
            dataType: \'html\',
            url: \'http://dev.xxx.se/wp-content/themes/xxx/batch.php\',
            beforeSend: function() {
                _setHeader;
                if( page != 1 ) {
                    console.log(\'Loading\');
                    // Show the preloader
                    $(\'body\').prepend(\'<div class="preloader"><span class="rotate"></span></div>\');
                }
                // If we reach the end we hide the show more button
                if( page >= total ) {
                    $(\'.load\').hide();
                }
            },
            success: function(data) {
                console.log(page);  
                var scroll = ($(\'.thumb\').height() * posts);
                // If thumbs exist append them
                if( data.length ) { 
                    // Append the data
                    $(\'#batch\').append(data);

                    // Remove the crappy width and height attrs from the image * Generated by WP *
                    $(\'img\').removeAttr(\'height\').removeAttr(\'width\');

                    // Animate each new object in a nice way
                    (function _showitem() {
                        $(\'#batch .thumb:hidden:first\').addClass(\'show\', 80, _showitem);

                        // On the last request do load any more
                        loading = false;  
                    })();

                    // Remove the preloader
                    $(\'.preloader\').fadeOut(200, function() {
                        $(\'.preloader\').remove();   
                    });
                }
                // return false;
            },
            complete: function() {
                // Delete storage
                localStorage.clear();

                // Update the scroller to match the updated content length
                if (scroller)
                    setTimeout("scroller.refresh()", 300);

                // Initalize the load more button
                _clickhandler();
            },
            error: function() {
                console.log(\'No page found\');
            }
        });
    }
和我的加载更多按钮功能

 $(\'.load\').on(\'click\', function(event) {
            event.preventDefault(); 
            // Delete storage
            localStorage.clear();

            if(!loading) {
                loading = true;
                // Increase our pagenumber per click
                page++;
                count++;
                // Remove preloader
                $(\'.preloader\').remove();

                setTimeout(function() {
                    $(\'#batch\').css({
                        \'-webkit-transform\' : \'translateY(-\' + ($(\'#batch li\').outerHeight() * count)  + \'px)\'
                    });
                }, 30);

                // Clear storage and set a new
                localStorage.setItem(\'amount\', JSON.stringify(amount.medium));
                var getamount = localStorage.getItem(\'amount\');

                // Send the request to the handler                  
                _batchhandler(page);    
            }      

        });
一切似乎都很好,前10篇(1-10篇)帖子按照应该的方式加载,但第一次单击“加载更多”,我们会得到接下来的5个结果,但结果是第一次加载的帖子(5-10篇)。如果我们再次单击“加载更多”,我们会得到正确的结果

1 个回复
SO网友:helgatheviking

注意,我现在不能真正测试这个。然而,我认为可以从您的代码中改进以下几点。

首先,如果我们阅读codex 或者一些tips on using ajax 我们可以设置一个ajax回调函数,该函数不指向必须引导WordPress加载函数的文件。

我将假设您的所有脚本都在JS文件中,并且已正确排队:

// embed the javascript file that makes the AJAX request
wp_enqueue_script( \'wpa-95258-ajax-request\', plugin_dir_url( __FILE__ ) . \'js/ajax.js\', array( \'jquery\' ) );

// declare the URL to the file that handles the AJAX request (wp-admin/admin-ajax.php)
wp_localize_script( \'wpa-95258-ajax-request\', \'wpa-95258-ajax\', array( \'ajaxurl\' => admin_url( \'admin-ajax.php\' ) ) );
使用wp_localize_script 我们可以将一些变量传递给脚本对象,然后该对象将在脚本中可用。我们将使用此.ajax URL参数。我们还需要action 参数,因为WordPress将查找

// this hook is fired if the current viewer is not logged in
do_action( \'wp_ajax_nopriv_\' . $_REQUEST[\'action\'] );

// if logged in:
do_action( \'wp_ajax_\' . $_POST[\'action\'] );
因此,我们可以稍后使用它将回调函数附加到任何ajax操作。首先我改编了你的.ajax 要执行操作并使用WordPress ajax url:

function _batchhandler() { 
    var getamount = localStorage.getItem(\'amount\'); 

    console.log(\'amount of posts to retrive \' + JSON.parse(getamount));

    // Ajax call
    $.ajax({
        type: \'GET\',
        data: {
            posts: getamount, 
            page: page,
            category: \'work\',
            action: \'batchhandler\' // use this to add a callback
        },
        dataType: \'html\',
        url: wpa-95258-ajax.ajaxurl, //from localize script
        beforeSend: function() {
            _setHeader;
            if( page != 1 ) {
                console.log(\'Loading\');
                // Show the preloader
                $(\'body\').prepend(\'<div class="preloader"><span class="rotate"></span></div>\');
            }
            // If we reach the end we hide the show more button
            if( page >= total ) {
                $(\'.load\').hide();
            }
        },
        success: function(data) {
            console.log(page);  
            var scroll = ($(\'.thumb\').height() * posts);
            // If thumbs exist append them
            if( data.length ) { 
                // Append the data
                $(\'#batch\').append(data);

                // Remove the crappy width and height attrs from the image * Generated by WP *
                $(\'img\').removeAttr(\'height\').removeAttr(\'width\');

                // Animate each new object in a nice way
                (function _showitem() {
                    $(\'#batch .thumb:hidden:first\').addClass(\'show\', 80, _showitem);

                    // On the last request do load any more
                    loading = false;  
                })();

                // Remove the preloader
                $(\'.preloader\').fadeOut(200, function() {
                    $(\'.preloader\').remove();   
                });
            }
            // return false;
        },
        complete: function() {
            // Delete storage
            localStorage.clear();

            // Update the scroller to match the updated content length
            if (scroller)
                setTimeout("scroller.refresh()", 300);

            // Initalize the load more button
            _clickhandler();
        },
        error: function() {
            console.log(\'No page found\');
        }
    });
}
现在我们有了一个挂钩,可以在没有引导加载程序的情况下构建回调函数了。我还建议摆脱query_posts(). 这对查询来说是不可靠的,通常建议在这里使用new WP_Query.

我已经调整了你的batchloop。php将改为回调函数:

function wp_ajax_batchhandler_callback(){

    // Our variables  
    $posts = (isset($_GET[\'numPosts\'])) ? $_GET[\'numPosts\'] : 0;  
    $page = (isset($_GET[\'pageNumber\'])) ? $_GET[\'pageNumber\'] : 0;  
    $category = (isset($_GET[\'category_name\'])) ? $_GET[\'category_name\'] : 0;  

    var_dump($posts);

    $args = array(  
        \'posts_per_page\' => $posts,
        \'category_name\'  => $category, 
        \'post_status\'    => \'publish\',
        \'orderby\'        => \'date\',
        \'order\'          => \'DESC\',
        \'paged\'          => $page 
    );

    $ajax_query = new WP_query($args);

    // our loop  
    if ($ajax_query->have_posts()) {  

        while ($ajax_query->have_posts()){  
            $ajax_query->the_post();  
            get_template_part( \'thumbs\', get_post_format() );  
        }  
    } 

    // unset($page, $posts, $category);

    wp_reset_postdata();

}
add_action( \'wp_ajax_nopriv_batchhandler\', \'batchhandler_callback\' ); //logged out users
add_action( \'wp_ajax_batchhandler\', \'batchhandler_callback\' ); //logged in users
正如我所说,我没有测试这个,但看起来您正在使用:

$page = (isset($_GET[\'pageNumber\'])) ? $_GET[\'pageNumber\'] : 0; 
获取查询中使用的页码。但是,您没有在中发送页码.ajax 所以我怀疑你是否能得到正确的分页。然而,您现在应该掌握在WordPress中进行ajax调用的适当方法,我认为可以通过传递pageNumber变量来修复分页。

结束

相关推荐

配置文件模板的jQuery滑块

我想在我的页面中显示类别下的帖子。页面加载时应显示前5篇文章,当用户单击下一步按钮/链接时,应显示下5篇文章。目前我显示该类别下的所有帖子。下面是我用来显示该类别下所有帖子的模板。我知道我需要更改代码。但我不知道如何改变。请帮忙。 <div id=\"bloggers\"> <?php $bloggers = new wp_Query(\"category_name=bloggers-blog&order=ASC&orderby=ID\");?>