使用WP_QUERY分页的延迟加载

时间:2016-02-19 作者:karlo jay bueno

我一直在考虑使用WP_Query\'s分页以进行自定义延迟加载。有没有办法利用WP_Query\'是否为延迟加载分页?

例如,我必须在第一次加载中加载24篇文章,当滚动到达底部时,它将延迟加载下一篇24篇文章。

这可能吗?

2 个回复
最合适的回答,由SO网友:N00b 整理而成

看看这个粗略的例子。这需要一点调整,但总的来说,它做的是你想要的——如果用户单击一个按钮,它会加载X个数量的下一篇文章,而这个按钮应该在已经加载的文章下面。

如果您想在用户向下滚动时自动加载更多帖子,只需将click事件替换为其他一些关注滚动的代码即可。网上有很多例子。

密切关注jQuery(\'some-html-element\')-s, 确保重命名这些元素名称或更改自己的名称HTML 要使其适合总帖子数:如果希望用户查看总帖子数或使用CSS opacity 隐藏它。它仍然需要在某个地方,以便有一个存储值的地方This goes to your main .js:

此函数处理所有DOM操作和ajax。你想怎么叫都行。

//ajaxLock is just a flag to prevent double clicks and spamming
var ajaxLock = false;

if( ! ajaxLock ) {

    function ajax_next_posts() {

        ajaxLock = true;

        //How many posts there\'s total
        var totalPosts = parseInt( jQuery( \'#total-posts-count\' ).text() );
        //How many have been loaded
        var postOffset = jQuery( \'.single-post\' ).length;
        //How many do you want to load in single patch
        var postsPerPage = 24;

        //Hide button if all posts are loaded
        if( totalPosts < postOffset + ( 1 * postsPerPage ) ) {

            jQuery( \'#more-posts-button\' ).fadeOut();
        }

        //Change that to your right site url unless you\'ve already set global ajaxURL
        var ajaxURL = \'http://www.my-site.com/wp-admin/admin-ajax.php\';

        //Parameters you want to pass to query
        var ajaxData = \'&post_offset=\' + postOffset + \'&action=ajax_next_posts\';

        //Ajax call itself
        jQuery.ajax({

            type: \'get\',
            url:  ajaxURL,
            data: ajaxData,
            dataType: \'json\',

            //Ajax call is successful
            success: function ( response ) {

                //Add new posts
                jQuery( \'#posts-container\' ).append( response[0] );
                //Update the count of total posts
                jQuery( \'#total-posts-count\' ).text( response[1] );

                ajaxLock = false;
            },

            //Ajax call is not successful, still remove lock in order to try again
            error: function () {

                ajaxLock = false;
            }
        });
    }
}
<小时>This goes to your main .js:

这是一个如何使用按钮调用上述函数的示例,我认为这更好,用户可以选择是否希望看到更多。。

//Load more posts button
jQuery( \'#more-posts-button\' ).click( function( e ) {

    e.preventDefault(); 

    ajax_next_posts(); 

});
<小时>This goes to functions.php or create a mu-plugin:

这是在您的服务器中“运行”的函数,ajax调用它,它完成任务并返回结果。

//More posts - first for logged in users, other for not logged in
add_action(\'wp_ajax_ajax_next_posts\', \'ajax_next_posts\');
add_action(\'wp_ajax_nopriv_ajax_next_posts\', \'ajax_next_posts\');

function ajax_next_posts() {

    //Build query
    $args = array(
        //All your query arguments
    );

    //Get offset
    if( ! empty( $_GET[\'post_offset\'] ) ) {

        $offset = $_GET[\'post_offset\'];
        $args[\'offset\'] = $offset;

        //Also have to set posts_per_page, otherwise offset is ignored
        $args[\'posts_per_page\'] = 24;
    }

    $count_results = \'0\';

    $query_results = new WP_Query( $args );

    //Results found
    if ( $query_results->have_posts() ) {

        $count_results = $query_results->found_posts;

        //Start "saving" results\' HTML
        $results_html = \'\';
        ob_start();

        while ( $query_results->have_posts() ) { 

            $query_results->the_post();

            //Your single post HTML here
        }    

        //"Save" results\' HTML as variable
        $results_html = ob_get_clean();  
    }

    //Build ajax response
    $response = array();

    //1. value is HTML of new posts and 2. is total count of posts
    array_push ( $response, $results_html, $count_results );
    echo json_encode( $response );

    //Always use die() in the end of ajax functions
    die();  
}

SO网友:MrFox

我一直在使用无限卷轴。

以下是我在脚本中使用的内容。js公司

$(function(){
    var $container = $(\'#ms-container\');
    $container.imagesLoaded(function(){
      $container.masonry({
        itemSelector : \'.ms-item\',


      });
    });
//var templateUrl = object_name.templateUrl;
//var src =  "\'"+templateUrl+"/images/loader.gif\' ";

$container.infinitescroll({
      navSelector  : \'#navigation\',    // selector for the paged navigation 
      nextSelector : \'#navigation a\',  // selector for the NEXT link (to page 2)
      itemSelector : \'.ms-item\', 


      loading: {
          finishedMsg: $(\'<div class="finmsg">No More Posts.</div>\'),
          msgText: \'\',
          img: \'\',
          speed: 0
        }
      },
      // trigger Masonry as a callback
      function( newElements ) {
        // hide new items while they are loading
        var $newElems = $( newElements ).css({ opacity: 0 });
        // ensure that images load before adding to masonry layout
        $newElems.imagesLoaded(function(){
          // show elems now they\'re ready
          $newElems.animate({ opacity: 1 });
          $container.masonry( \'appended\', $newElems, true ); 
        });
      }
    );
});
我用的是砖石,所以你可能需要调整一下。存档页面上的总体容器为

<div id="ms-container">
因此:

var $container = $(\'#ms-container\');
我的存档页面上显示的每个帖子的容器是:

<div class="ms-item col-sm-4">
因此:

itemSelector : \'.ms-item\',
这是我在存档页面底部使用的分页:

      <div id ="navigation" class="pagination pull-left prevnext">
      <ul class="list-inline clearfix">
        <li class="text-left pull-left"><?php previous_posts_link( \'<span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span> Previous\' );?></li>
        <li class="text-right pull-right"><?php next_posts_link( \'Next <span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span>\'); ?></li>
      </ul>
      </div>
如果我没记错的话,这就是我得到如何做的信息的地方:https://stackoverflow.com/questions/9766515/imagesloaded-method-not-working-with-jquery-masonry-and-infinite-scroll

相关推荐

GET_POSTS查询大约需要40秒来执行

我在get\\u帖子中有一个元查询,它需要花很长时间才能完成。它工作得很好,但只是时间太长了。我有一个名为event. 在每个event 发布后,有自定义元数据:post\\U sort\\U日期(事件日期YmdHis 格式,用于排序)我需要做的是获取下一个事件,该事件相对于$year 和$month 变量。所以如果$year = 2021 和$month = 10 (2021 10月)然后应该在2021 11月或之后找到第一个事件。我下面的查询很好,但很慢。执行大约需要40秒,我不知道为什么。$next