Die Standardfunktionalität von Sticky Post mit WP_Query wird bei der Verwendung von AJAX ignoriert

Ich schreibe eine benutzerdefinierte Ajax-Seitennummerierung für eine Blog-Archivseite und stoße auf ein Problem mit Haftnotizen.

Die Standardfunktionalität von sticky-Posts bei Verwendung eines WP_Query-Aufrufs besteht darin, alle oben aufgeführten, sticky-Posts zu sortieren, sofern nicht explizit anders angegeben.

Mein AJAX funktioniert errorsfrei und zeigt die angeforderten Posts ohne Probleme an und kann nach Kategorie und Feature-Paginierung (mit posts_per_page und Offset) sortiert werden.

Das einzige Problem besteht darin, dass die abgerufenen Posts keine klebrigen Posts im Vordergrund, sondern in ihrer natürlichen Reihenfolge auflisten. Die richtige Gruppe von Posts wird abgefragt, aber sie werden nicht korrekt sortiert.

Mein Argument ist:

$args = array( 'posts_per_page' => 10, 'order' => 'DESC', 'cat' => (php value retrieved from AJAX, so it changes based on user input), 'offset' => (determined via data attributes to calculate page number. $offset = ( current_page_number - 1 ) * posts_per_page ) ) $blog_posts = new WP_Query( $args ); 

Wenn ich print_r $ blog_posts, ist die Reihenfolge der Beiträge in der Standardreihenfolge (ähnlich wie wenn Sie get_posts anstelle von WP_Query verwenden würden)

Wenn ich diese genaue Abfrage auf einer beliebigen Seite (oder Post, benutzerdefinierte Post-Post, Archiv, usw.) verwenden, gibt die WP_Query -function in der richtigen Reihenfolge mit klebrigen Beiträge oben zurück. Ist das ein Fehler, auf den sonst jemand gestoßen ist? Der Code läuft gut, ich frage mich, ob das ein WordPress-coreerrors ist?

Ich kann nicht zwei separate Abfragen durchführen – eine mit nur klebrigen Beiträgen, und dann der Rest ohne haftende Beiträge aufgrund der benutzerdefinierten Seitennummerierung.

Vielen Dank


Bearbeiten Sie, mit einer Lösung von Arten:

Nachdem ich viel gegoogelt habe, ohne Erfolg zu haben, gab mir der folgende Beitrag eine Idee:

WP_Query: Warum ist ein klebriger Beitrag nicht das erste Element in der Schleife?

Darin wird erwähnt, dass WP_Query Folgendes überprüft, bevor Sticky Posts am oberen Rand sortiert werden:

 if ( $this->is_home && $page <= 1 && is_array($sticky_posts) && !empty($sticky_posts) && !$q['ignore_sticky_posts'] ) { 

Da ich meine Abfrage in einer function ausgeführt habe, die unabhängig von AJAX aufgerufen wurde, gab es keine Post- oder Seiten-ID, die diesem bestimmten Codeschnipsel zugeordnet war. Daher konnte WP_Query seine Bedingung nicht erfüllen, um die standardmäßige function sticky_post auszuführen.

“get_posts” erlaubt es nicht, dass klebrige Posts oben angezeigt werden, da es “ignore_sticky_posts” automatisch auf “true” setzt.

Auf der WP-Entwicklerseite finden Sie get_posts ( https://developer.wordpress.org/reference/functions/get_posts/ ). In Zeile 1591 des Code-Snippets sehen Sie:

 $r['ignore_sticky_posts'] = true; 

explizit vor dem Zurückgeben der Abfrage festgelegt werden.

Daher können wir weder WP_Query noch get_posts in dieser bestimmten Instanz verwenden.

Meine Lösung war folgendes:

 // get_posts of all the possible posts, with your desired parameters and post-per-page set to -1 $all_posts = get_posts( $args ); // check if there are any sticky posts $sticky = get_option( 'sticky_posts' ); // there are sticky posts, do this psuedo-code if ( is_array($sticky) && !empty($sticky) ) { // do a get_post query for ONLY the sticky posts posts that are in your desired $args array $args['post__in'] = $sticky; $sticky_posts = get_posts( $args ); // merge $total_stories_id into the end of $sticky $merged = array_merge( $sticky_posts, $all_posts ); // remove duplicates and re-indexes $array = array_values( array_unique( $merged ) ); // return a slice of X elements, starting at the $offset location $return_array = array_slice( $array , [calculated post offset], [your desired post-per-page] ); } else { // else, do wordpress default (wp_query or get_posts, it doesn't matter) $return_array = get_posts( $args ); } 

Um die Größe der Arrays zu reduzieren, habe ich:

 wp_list_pluck( [array], 'ID' ); 

auf den 2 get_posts-Arrays. Sie müssen das nicht tun, es hängt wirklich davon ab, welche Art von Daten Sie über AJAX zurückgeben.

Ich hoffe, das hilft jedem anderen!

Solutions Collecting From Web of "Die Standardfunktionalität von Sticky Post mit WP_Query wird bei der Verwendung von AJAX ignoriert"