Random Ajax Load funktioniert nur, wenn posts_per_page auf -1 gesetzt ist

Ich habe einen Post Loader Shortcode erstellt, der AJAX verwendet, um Posts zu laden. Obwohl ich die Abfrageparameter order_by und query order_by kann, sollte order_by zufällig sein . Von dem, was ich im Web gesehen habe, sind Ajax-Last und zufällige Reihenfolge nicht beste Freunde, weil sie immer wieder nachladen.

Also habe ich gedacht: Ich werde nur Post-IDs in eines meiner Elemente (als post__not_in ) setzen, das auch auf post__not_in aktualisieren und post__not_in , um diese Posts dorthin zu bringen, so dass die Ajax-Ladung sie nicht lädt (bereits geladene).

Großartig, oder? Nun, nein. Wenn ich den post_per_page Parameter als eine bestimmte Zahl festlege, post_per_page irgendeinem Grund nicht. Wenn ich es jedoch auf -1 setze, funktioniert das Laden gut.

Der Code sieht so aus:

Kurzcode

  '', 'title' => '', 'count' => '6', 'order' => '', 'orderby' => '', 'class' => '', ), $atts)); $order_val = ( $order != '' ) ? $order : ''; $order_by = ( $orderby != '' ) ? $orderby : ''; $cat_obj = get_category_by_slug($category); $cat_id = $cat_obj->term_id; $query = array( 'cat' => $cat_id, 'posts_per_page' => $count, 'orderby' => $order_by, 'order' => $order_val, ); ?> <div class="recent_posts "> 
<div class="recent_post_loader" data-orderby="" data-order="" data-cat="" data-ppp="">
have_posts() ) : while( $myposts->have_posts() ) : $myposts->the_post(); $post_ids = wp_list_pluck( $myposts->posts, 'ID' ); $post_ids_string = implode( ',', $post_ids ); $post_thumb = has_post_thumbnail( get_the_ID() ) ? '' : 'no_thumbnail'; ?>
<div class="post_info "> <a href="https://wordpress.stackexchange.com/questions/216535/random-ajax-load-only-works-with-posts-per-page-set-to-1/" class="recent_post_title">
<div class="posts_ids" data-ids="">
<?php } add_shortcode( 'show_post_excerpts', 'myslug_post_excerpts');

FUNKTION AUF AJAX CALL

 add_action( 'wp_ajax_myslug_add_recent_posts', 'myslug_add_recent_posts' ); add_action( 'wp_ajax_nopriv_myslug_add_recent_posts', 'myslug_add_recent_posts' ); function myslug_add_recent_posts(){ $cat = (isset($_POST['cat'])) ? $_POST['cat'] : ''; $ppp = (isset($_POST['ppp'])) ? $_POST['ppp'] : ''; $order_by = (isset($_POST['order_by'])) ? $_POST['order_by'] : ''; $order = (isset($_POST['order'])) ? $_POST['order'] : ''; $ids = (isset($_POST['ids'])) ? $_POST['ids'] : ''; $paged = (isset($_POST['pageNumber'])) ? $_POST['pageNumber'] : 1; if (isset($ids) && $ids != '') { $not_in = explode(',', $ids); } $output = ''; $recent_query = array( 'cat' => $cat, 'paged' => $paged, 'posts_per_page' => -1, 'orderby' => $order_by, 'order' => $order, 'post__not_in' => $not_in, ); $myposts = new WP_Query( $recent_query ); if( $myposts->have_posts() ) : while( $myposts->have_posts() ) : $myposts->the_post(); $post_thumb = has_post_thumbnail( get_the_ID() ) ? '' : 'no_thumbnail'; $output .= '
'; if(has_post_thumbnail( get_the_ID() )){ $output .= '
'.get_the_post_thumbnail( get_the_ID() ).'
'; } $output .= '
'; endwhile; endif; wp_reset_postdata(); die($output); }

AJAX CALL

 var $recent_post_loader = $('.recent_post_loader'); var $container_recent; var page_recent_number = 1; var recent_order_by, recent_order, cat_recent, recent_post_id, recent_ids, ppp_recent; $(document).on('click', '.recent_post_loader', function () { var $this = $(this); $container_recent = $this.parents('.recent_posts'); recent_order_by = $this.data('orderby'); recent_order = $this.data('order'); cat_recent = $this.data('cat'); ppp_recent = $this.data('ppp'); recent_ids = $container_recent.find('.posts_ids').attr('data-ids'); load_recent_posts(); }); function load_recent_posts() { if (!($recent_post_loader.hasClass('recent_posts_loading') || $recent_post_loader.hasClass('no_more_recent_posts'))) { page_recent_number++; var str = '&ppp=' + ppp_recent + '&cat=' + cat_recent + '&order_by=' + recent_order_by + '&order=' + recent_order + '&ids=' + recent_ids + '&pageNumber=' + page_recent_number + '&action=myslug_add_recent_posts'; $.ajax({ type: 'POST', dataType : 'html', url: myslug_ajax_posts.ajaxurl, data: str, success: function (data) { var $data = $(data); if ($data.length) { var $newElements = $data.css({ opacity: 0 }); $data.each(function(){ recent_post_id = $(this).data('post_id'); recent_ids += ','+recent_post_id; }); $container_recent.append($newElements); $container_recent.imagesLoaded(function () { $newElements.animate({ opacity: 1 }); }); $recent_post_loader.removeClass('recent_posts_loading'); } else { $recent_post_loader.addClass('no_more_recent_posts'); $container_recent.append('

' + myslug_ajax_posts.noposts + '

' ); } }, beforeSend : function () { $recent_post_loader.addClass('recent_posts_loading'); }, error : function (jqXHR, textStatus, errorThrown) { $recent_post_loader.html(jqXHR + ' :: ' + textStatus + ' :: ' + errorThrown); }, complete : function () { $recent_post_loader.removeClass('recent_posts_loading'); $container_recent.find('.posts_ids').attr('data-ids', '').attr('data-ids', recent_ids); } }); } return false; }

Wenn ich $ppp anstelle von -1 in meine function $ppp , erhalte ich keinen Post, wenn ich auf den Loader klicke.

Die -1 ist keine gute Lösung, da ich 1000 Beiträge in einer Kategorie haben könnte, und das Laden von allen ist keine praktikable Option. Ich möchte nur zeigen, 6, oder 3, oder welche Anzahl von Posts ich angeben.

Warum passiert das? Wenn ich post__not_in und die zufällige Reihenfolge passieren lasse, bekomme ich dieselben Posts, die auf Klick geladen werden. Ich bekomme die richtige Anzahl von Posts (sagen wir, ich habe 8 Posts, und 6 gezeigt, auf Klick werden die 2 Posts geladen), aber manchmal sind sie doppelt, manchmal nicht. Das funktioniert also nicht.

Der ‘Workaround’ mit post__not_in sollte funktionieren (in der Theorie).

Irgendeine Idee, warum das passiert?

Solutions Collecting From Web of "Random Ajax Load funktioniert nur, wenn posts_per_page auf -1 gesetzt ist"