반응형
Wordpress/PHP/Ajax 게시물 추가 로드
워드프레스 카테고리 페이지에 코드가 있는데 그래픽을 클릭하면 더 많은 게시물이 로드됩니다. 이 경우 15.
처음 누르면 아주 잘 작동합니다.그러나 한 번 더 누르면 다음 게시물 세트(즉, 세 번째)를 가져오는 것이 아니라 두 번째 게시물을 가져옵니다.
문제는 오프셋(offset), 즉 그것이 시작되는 곳이라는 것을 알고 있습니다.따라서 처음 누르면 오프셋이 16, 두 번째 시간 31, 세 번째 시간 46 등이 되어야 합니다.
하지만 제가 어려움을 겪고 있는 곳은 이 오프셋을 통과하고 있습니다.
이게 js입니다.
$('#do-show-more-posts').live('click', function(){
if( $(this).data("o-set")){
$offset=$(this).data("o-set");
}else
{
$offset=16 ; //assume this is 16 initially
}
var post_type = $(this).attr('post-type');
var parent = $(this).attr('parent-id');
var offset = $('.article').size();
$(this).fadeTo(0,0);
$('.load-more-posts-wrapper .loader').addClass('show');
$.post( ajaxurl, { action: 'load_more_posts', post_type : post_type, parent : parent, offset : offset }, function(data){
$load_more = $('.load-more-posts-wrapper');
$load_more.find('.loader').removeClass('show');
$load_more.find('.link').removeAttr('style');
var load_more_button = '<div class="load-more-posts-wrapper">' + $load_more.html() + '</div>';
$load_more.remove();
if( data == '' || data == 'udefined' || data == 'No More Posts' || data == 'No $args array created' ){
data = '';
load_more_button = '<div class="load-more-posts-wrapper">There are no more posts.</div>';
setTimeout("$('.load-more-posts-wrapper').fadeTo(1800,0)", 8000 );
}
$('#content').append( data );
$('#content').append( load_more_button );
$(this).data("o-set",$offset);
});
});
이것이 PHP입니다.
function load_more_posts() {
if( isset($_POST['post_type']) && $_POST['post_type'] == 'publication' ){
$args = array(
'offset' => $_POST['offset'],
'orderby' => 'post_date',
'order' => 'DESC',
'post_type' => 'article',
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => 'related-publication',
'value' => $_POST['parent'],
'meta_compare' => 'IN'
)
)
);
} else if(isset($_POST['post_type']) && $_POST['post_type'] == 'category') {
$args = array(
'cat' => $_POST['parent'],
'offset' => $_POST['offset'],
'post_type' => array('post','article','publication')
);
} else {
// print_r($args);
}
$Query = new WP_Query( $args );
//print_r($Query);
if ( $Query->have_posts() ) {
while ( $Query->have_posts() ) {
$Query->the_post();
get_template_part('loop', 'xxxry');
}
} else {
// print_r($args);
}
exit;
}
저는 오프셋 값을 유지하는 세션을 만들 생각이 있었습니다. 하지만 그것은 효과가 없는 것 같았습니다.또한 해당 카테고리 페이지로 누군가 돌아올 경우 어떻게 삭제해야 할지도 잘 모르겠습니다.
제가 사용한 코드는 다음과 같습니다.
if (isset($_SESSION['posts_start'])){
$_POST['offset']=$_SESSION['posts_start']+15;
$_SESSION['posts_start']=$_POST['offset'];
} else {
$_POST['offset']=15;
$_SESSION['posts_start']=$_POST['offset'];
}
저는 그것을 php 기능의 시작 부분에 넣었습니다.이미 세션이 있었다면 15개의 추가를 등록하지 않은 것 같습니다.
오프셋을 사용하는 대신 다음을 사용할 수 있습니다.posts_per_page
그리고.paged
WP_Queryargs의 매개 변수입니다.
function load_more_posts() {
//...
$args = array(
'posts_per_page' => $_POST['offset'],
'paged' => $_POST['page'],
'orderby' => 'post_date',
'order' => 'DESC',
'post_type' => 'article',
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => 'related-publication',
'value' => $_POST['parent'],
'meta_compare' => 'IN'
)
)
);
//...
}
그리고 당신의 JS에서:
//EDIT2: (global page variable
$(document).ready(function(){
//...
var page = 1; //don't redefine this variable each time you click.
$('#do-show-more-posts').live('click', function(){
//...
$.post( ajaxurl, { action: 'load_more_posts', post_type : post_type, parent : parent, offset : $offset, page : page++ }, function(data){
//EDIT: --------------------------------------------------------------------------------------------------- ^
$load_more = $('.load-more-posts-wrapper');
$load_more.find('.loader').removeClass('show');
$load_more.find('.link').removeAttr('style');
var load_more_button = '<div class="load-more-posts-wrapper">' + $load_more.html() + '</div>';
$load_more.remove();
if( data == '' || data == 'udefined' || data == 'No More Posts' || data == 'No $args array created' ){
data = '';
load_more_button = '<div class="load-more-posts-wrapper">There are no more posts.</div>';
setTimeout("$('.load-more-posts-wrapper').fadeTo(1800,0)", 8000 );
}
$('#content').append( data );
$('#content').append( load_more_button );
$(this).data("o-set",$offset);
});
}
//...
}
언급URL : https://stackoverflow.com/questions/14630356/wordpress-php-ajax-load-more-posts
반응형
'programing' 카테고리의 다른 글
웹 및 모바일용 ASP.NET 웹 API 소셜 인증 (0) | 2023.09.14 |
---|---|
.ready() 중에 문서 제목을 변경하려면 어떻게 해야 합니까? (0) | 2023.09.14 |
코드를 통해 요소 또는 팝업을 트리거하는 방법 (0) | 2023.09.14 |
열 별칭을 동일한 선택에 사용 (0) | 2023.09.14 |
array_parray 대 $array[] = ...어느것이 가장 빠릅니까? (0) | 2023.09.14 |