WordPress / PHP / Ajax Cargar más publicaciones

Tengo un código en mi página de categorías de wordpress, donde si hacen clic en el gráfico, se cargan más publicaciones, en este caso 15.

Funciona muy bien la primera vez que se presiona. Sin embargo, una vez que se presiona de nuevo, no trae el siguiente conjunto de publicaciones (es decir, el tercero), pero trae el 2do.

Entiendo que el problema es la compensación, es decir. donde comienza Por lo tanto, la primera vez que se presiona, el desplazamiento debe ser 16, la segunda vez 31, la tercera vez 46, etc.

Sin embargo, cuando estoy teniendo dificultades, está pasando por esta compensación.

Esta es la 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 = ''; $load_more.remove(); if( data == '' || data == 'udefined' || data == 'No More Posts' || data == 'No $args array created' ){ data = ''; load_more_button = ''; setTimeout("$('.load-more-posts-wrapper').fadeTo(1800,0)", 8000 ); } $('#content').append( data ); $('#content').append( load_more_button ); $(this).data("o-set",$offset); }); }); 

Este es el 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; } 

Tuve la idea de crear una sesión con el valor de compensación, aunque eso no pareció funcionar. Además, no estoy seguro de cómo lo eliminaría en caso de que alguien vuelva a la página de esa categoría.

El código que utilicé fue este:

 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']; } 

Lo puse al principio de la función php. No pareció registrar la adición de 15 si ya había una sesión.

En lugar de utilizar el desplazamiento, puede usar posts_per_page y los parámetros paged de WP_Query args.

 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' ) ) ); //... } 

Y en tu 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 = ''; $load_more.remove(); if( data == '' || data == 'udefined' || data == 'No More Posts' || data == 'No $args array created' ){ data = ''; load_more_button = ''; setTimeout("$('.load-more-posts-wrapper').fadeTo(1800,0)", 8000 ); } $('#content').append( data ); $('#content').append( load_more_button ); $(this).data("o-set",$offset); }); } //... }