Ajax loading duplicate post

时间:2012-12-28 作者:Jeremy Love

我想首先为这篇文章这么长表示歉意,但我觉得它可能会帮助其他人,因为我有这个问题,我想我最好尽可能详细。

我有一个问题,这是循环。php文件多次加载同一帖子,我尝试了防止重复帖子的方法,但没有任何效果。正如您在下面看到的,我正在加载要发布到ajax函数中的函数,我得到了一个成功的调用,但此时我不确定循环文件是否是问题所在。当站点第一次加载时,它加载第一组帖子,然后当它获得第二组帖子时,它很好,但之后的所有内容都是相同的帖子,它就像加载循环文件,但查询被卡住了。

有什么建议吗?非常感谢您的帮助。

环php文件

<div class="post-left">
<?php query_posts(array(\'post__not_in\' => $id_merge,\'posts_per_page\'=>\'2\'));
      $do_not_duplicate = $post->ID;

 if (have_posts()) : while (have_posts()) : the_post();
 if( $post->ID == $do_not_duplicate ) continue;
 $ids[] = get_the_ID(); ?>
<div class="images-grid-page-wrapper">
<?php the_title(); ?>
</div>
<?php endwhile; endif; // End the loop. Whew. ?>
</div>


<div class="post-mid">
<?php query_posts(array(\'post__not_in\' => $id_merge,\'posts_per_page\'=>\'3\'));
      $do_not_duplicate = $post->ID;

 if (have_posts()) : while (have_posts()) : the_post();
 if( $post->ID == $do_not_duplicate ) continue;

 $ids[] = get_the_ID(); ?>
<div class="images-grid-page-wrapper">
<?php the_title(); ?>
</div>
<?php endwhile; endif; // End the loop. Whew. ?>
</div>
功能。php

add_action(\'wp_ajax_infinite_scroll\', \'wp_infinitepaginate\');           // for logged in user
add_action(\'wp_ajax_nopriv_infinite_scroll\', \'wp_infinitepaginate\');    // if user not logged in

function wp_infinitepaginate(){
    $loopFile        = $_POST[\'loop_file\'];
    get_template_part( $loopFile );
    exit;
}
阿贾克斯

jQuery(document).ready(function($) {
    var count = 1;
    var total = <?php echo $wp_query->max_num_pages; ?>;
    $(window).scroll(function(){
            if  ($(window).scrollTop() == $(document).height() - $(window).height()){
               if (count > total){
                    return false;
               }else{
                    loadArticle(count);
               }
               count++;
            }
    }); 

    function loadArticle(){    
            $(\'a#inifiniteLoader\').show(\'fast\');
            $.ajax({
                url: "<?php bloginfo(\'wpurl\') ?>/wp-admin/admin-ajax.php",
                type:\'POST\',
                data: "action=infinite_scroll&loop_file=loop", 
                success: function(html){
                    $(\'a#inifiniteLoader\').hide(\'1000\');
                    $("#content").append(html);    // This will be the div where our content will be loaded
                }
            });
        return false;
    }
});

1 个回复
SO网友:fischi

你有几件事要考虑。

让我们以浏览器的方式开始。

您构建了HTML,目前为止还不错,包含了站点的结构和所有内容。未显示文章。

浏览器要做的下一步是进行AJAX调用。

以下是首先要考虑的事情。在您的文档中。ready函数您不会将帖子的偏移量发送到AJAX php函数。据我从您的代码中所知,在调用函数时,您总是希望显示5篇文章。

因此,请考虑:

起初,计数为0。每次成功重新加载,计数将增加5。您应该将此部分放入AJAX调用的成功部分。此外,AJAX php函数必须知道要传递的帖子的偏移量。

另一件需要考虑的事情是,您的站点上可能有另一个查询,而不是AJAX函数中的查询。所以要确保var total 是正确的数字,但我现在不会再深入讨论这个问题,把它当作你的了。你明白了。

您的Javascript应如下所示:

jQuery(document).ready(function($) {
    var count = 0;
    var total = <?php echo $wp_query->max_num_pages; ?>;
    $(window).scroll(function(){
            if ($(window).scrollTop() == $(document).height() - $(window).height()){
               if (count > total){
                    return false;
               }else{
                    loadArticle(count);
               }
            }
    }); 

    function loadArticle(count){    
            $(\'a#inifiniteLoader\').show(\'fast\');
            // I prefer doing the ajaxdata with an array
            var ajaxdata = { 
               \'action\' : \'infinite_scroll\'
               \'offset\' : count
            }
            $.ajax({
                url: "<?php bloginfo(\'wpurl\') ?>/wp-admin/admin-ajax.php",
                type:\'POST\',
                data: ajaxdata, 
                success: function(html){
                    $(\'a#inifiniteLoader\').hide(\'1000\');
                    $("#content").append(html);    // This will be the div where our content will be loaded
                        count = count + 5; // Increase the number of posts that are already shown.
                }
            });
        return false;
    }
});
正如您所看到的,我为ajaxdata创建了一个数组——这样看更容易。我还删除了loopfile=loop, 正如你在后面看到的,因为我会用另一种方式来回答。

到目前为止还不错——现在我们应该考虑构建稍微不同的AJAX响应。你注册的方式是对的,但我不会用get_template_part, 执行另一个函数,传递变量。

AJAX函数的注册如下:

add_action(\'wp_ajax_infinite_scroll\', \'wp_infinitepaginate\');           // for logged in user
add_action(\'wp_ajax_nopriv_infinite_scroll\', \'wp_infinitepaginate\');    // if user not logged in

function wp_infinitepaginate(){
    load_ajax_results($_POST[\'count\']);
    exit;
}
最后一步是将输出放在一起的实际函数。你可以把这个放在任何地方functions.php 或其他文件。我更喜欢创建文件ajax-functions.php 包括在我的functions.php, 包含上述所有函数(当然Javascript除外)

<?php

    function load_ajax_results( $offset ) {
    // I use the $_POST[\'count\'] as $offset here
?>

    <div class="post-left">
    <?php
        $args = array(
            \'numberposts\' => \'2\', // 2 Posts to show here
            \'offset\'      => $offset // the number of Posts to skip, given by the AJAX call
        );
        query_posts( $args ); // nothing else should be needed

        if (have_posts()) : while (have_posts()) : the_post();
        ?>
            <div class="images-grid-page-wrapper">
                <?php the_title(); ?>
            </div>
        <?php endwhile; endif; // End the loop. Whew. ?>
        <?php wp_reset_query(); // reset it ?>
    </div>


    <div class="post-mid">
    <?php 
        $offset = $offset + 2; // because we had 2 Posts before
        $args = array(
            \'numberposts\' => \'3\', // 3 Posts to show here
            \'offset\'      => $offset // the number of Posts to skip, given by the AJAX call
        );
        query_posts( $args ); // nothing else should be needed

        if (have_posts()) : while (have_posts()) : the_post();
        ?>
            <div class="images-grid-page-wrapper">
                <?php the_title(); ?>
            </div>
        <?php endwhile; endif; // End the loop. Whew. ?>
    </div>

<?php

    }

?>
当我在这里使用偏移量时,我不必检查之前是否已经显示过任何帖子。

您遇到的主要问题是在考虑AJAX函数时出错。此函数不知道浏览器中发生了什么,因此您必须告诉它要显示哪些帖子。每次调用它时,它都是一个新实例,因此不会存储上次传递的帖子的值。

没有在我的安装上测试这个,但我希望你了解它背后的想法。如果有任何错误,对不起,如果有任何问题,请评论:)

结束