私はカスタム遅延ロードをするためにWP_Query
のページ付けを使うことを考えていました。遅延ロードのためにWP_Query
のページ付けを利用する方法はありますか?
たとえば、最初のロードで24件の投稿をロードする必要があり、スクロールが一番下に達すると、次の24件の投稿を遅延ロードします。
これは可能ですか?
この大まかな例を見てください。これには少し調整が必要ですが、全体としてはあなたが望むことをします - ユーザーが既にロードされている投稿の下にあるべきボタンをクリックすると、X個の次の投稿をロードします。
ユーザーが下にスクロールしたときに自動的に追加の投稿をロードしたい場合は、clickイベントをスクロールを見据えた他のコードに置き換えてください。オンラインでたくさんの例があります。
jQuery('some-html-element')-s
を見張って、これらの要素名を変更するか、あなた自身のHTML
name__をそれらが合うように変更することを忘れないでくださいCSS
opacity
name__を使用して非表示にする場合は、表示させることができます。値を格納する場所を確保するためには、まだどこかにある必要があります。これはあなたのメインの.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;
}
});
}
}
これはあなたのメインの.jsに行きます:
これはボタンで上記の関数を呼び出す方法の例です、これは私の意見ではより良いです、彼/彼女がもっと見たいのであればユーザーが選択できます..
//Load more posts button
jQuery( '#more-posts-button' ).click( function( e ) {
e.preventDefault();
ajax_next_posts();
});
これはfunctions.phpに行くか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();
}
私はこれに無限スクロールを使っています。
これが私がscript.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