Post-Offset / Post-Seiten-Offset in einzelner Post-Seite (außerhalb der Schleife) erhalten

Ich würde gerne wissen, wie ich den Offset eines benutzerdefinierten Posts oder seiner Seite außerhalb der get_posts-Schleife erhalten könnte.

Ich entwickelte eine externe Webanwendung, die mit dem JSON-API-Plugin eine Verbindung zum WordPress-Blog herstellt, und zeigt eine bestimmte Posts-Seite mit einer AJAX-Anfrage wie:

?json=get_posts&orderby=date&order=desc&count=x&page=n 

(Dies wird die n-te Seite von x Posts zurückgeben)

Das funktioniert gut, aber jetzt möchte ich einen Link auf der “single post” -Seite des WordPress-Blogs zu dieser Anwendung setzen, wie “Zeige diesen Beitrag in der App”, mit dem aktuellen Seitenversatz als Parameter. So kann ich diesen Parameter in der App lesen und Beiträge der Seite erhalten, die den Beitrag enthält, und diesen Beitrag markieren (als Parameter gesendet).

Wenn ich den Offset bekomme, kann ich die richtige Seite mit einem Modulo-Operator anzeigen:

Wenn offset = 22 und count = 10, Seite 3 anzeigen und Post Nr. 2 markieren

 page = Math.ceil(offset / count); post_to_highlight_position = offset % count; 

Weißt du, wie ich das machen könnte? oder ob es einen besseren Weg gibt, dies zu erreichen?

Solutions Collecting From Web of "Post-Offset / Post-Seiten-Offset in einzelner Post-Seite (außerhalb der Schleife) erhalten"

Ich glaube nicht, dass Sie einen Offset der Seite außerhalb der Schleife erhalten können, da dies außerhalb des Kontextes liegt. Der Offset kann abhängig von den Argumenten variieren, die Sie zum Abrufen von Posts für die Schleife verwenden.

Am einfachsten ist es, den Offset in der App zu berechnen. Sie müssen post_id als Attribut übergeben und dann alle Posts durchlaufen, die von ?json=get_posts&orderby=date&order=desc&count=x&page=n und vergleichen Sie ihre IDs mit denen, die Sie als Attribut erhalten haben.

Ich hoffe es macht Sinn.

Der “Offset” hängt von der Abfrage ab – Sortierreihenfolge, Bedingungen wie Kategorie oder Tag, Meta-Abfragen usw. – und ändert sich jedes Mal, wenn ein Beitrag zum Blog hinzugefügt wird. Es ist nicht etwas, das du so sehr “lernst”, als etwas, was du berechnet hast.

Auf einer “einzelnen Post” -Seite ist die Abfrage ziemlich einfach und gibt einen einzigen Post zurück – das heißt 0 Offset. Angenommen, Sie benötigen den Offset im Archiv, müssen Sie die Archivabfrage (mit den jeweils geltenden Parametern) ausführen und die Ergebnisse durchlaufen, bis Sie den gewünschten Beitrag gefunden haben. Das ist eine ziemlich schwere Last auf dem Server.

Es gibt diese ziemlich komplexe Abfrage – keine Ahnung, ob sie funktioniert: https://stackoverflow.com/q/3614666/1735890 Sie müssten das in WordPress umwandeln.

Danke für deine Antworten, es ist mir endlich gelungen, mit einer benutzerdefinierten SQL-Abfrage zu tun, was ich wollte 🙂

So habe ich das erreicht: Zuerst habe ich die SQL-Abfrage mit WP_QUERY generiert, indem ich diesen Code hinzugefügt habe:

 $query = new WP_Query( $query_args ); //write the SQL query echo $query->request; 

Ich habe etwas wie:

 SELECT wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'work' AND (wp_posts.post_status = 'publish') ORDER BY wp_posts.post_date DESC 

Das gibt die vollständige Liste der Beiträge zurück, sortiert nach dem neuesten zuerst. Dann habe ich den offset hinzugefügt, indem ich einfach eine Offset-Variable deklarierte und sie in jeder Zeile so inkrementiere:

 SET @offset=0; SELECT wp_posts.ID, @offset := @offset + 1 AS offset FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'work' AND (wp_posts.post_status = 'publish') ORDER BY wp_posts.post_date DESC 

Im letzten Schritt habe ich diese Liste von ID + Offset-Zuordnungen nach Post-ID gefiltert und die benutzerdefinierten Zeilen ( page und position ) hinzugefügt:

 SET @offset=0; SELECT ID, offset - 1 AS offset, CEIL(offset / 10) AS page, (offset - 1) % 10 AS position FROM (SELECT wp_posts.ID, @offset := @offset + 1 AS offset FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'work' AND (wp_posts.post_status = 'publish') ORDER BY wp_posts.post_date DESC) AS OFFSETS WHERE ID = 83 

(wobei 83 die gesuchte Post ID und 10 die Anzahl der Posts pro Seite ist)

Ich habe offset - 1 AS offset , um Offsets von 0 zu erhalten, aber Sie können offset einfach verwenden, um Offsets von 1 zu erhalten.

Dies wird die folgenden Tabellen zurückgeben:

id = 83, Beiträge pro Seite = 10:

 ID | offset | page | position 83 | 16 | 2 | 6 

-> 6. Stelle auf Seite 2

id = 10, Beiträge pro Seite = 5:

 ID | offset | page | position 10 | 33 | 7 | 3 

-> 3. Stelle auf Seite 7

Ich hoffe, das wird jemandem helfen! 🙂

Dies ist für ein bisschen ein anderes Problem, und ich weiß nicht, wie aktiv das ist, aber ich stieß darauf, ein ähnliches Problem zu lösen und wollte meine Lösung für alle, die auf diesen Beitrag in der Zukunft.

Ich nahm im Grunde an, dass ich die Informationen verarbeiten musste, wie in seiner Antwort beschrieben. Ich habe diese function zu meiner functions.php-Datei hinzugefügt und sie dann in meiner single.php-Datei aufgerufen und als $ page_number-Variable gespeichert. Da ich nun die richtige Seitennummer hatte, konnte ich sie einfach an die Postarchiv-URL im Link anhängen.

Beachten Sie, dass Sie nur die Abfrage $ args aktualisieren müssen, um dieselben Parameter wiederzugeben, die Ihre Archivseite verwendet.

In den functionen.php

 function get_archive_page_num( $post_id ){ $post_type = get_post_type( $post_id ); $index = ''; $archive_page_number = ''; $per_page = get_option('posts_per_page'); $args = array( 'post_type' => $post_type, 'posts_per_page' => -1, 'orderby' => 'date', 'order' => 'DESC' ); $posts = get_posts( $args ); foreach($posts as $key=>$post){ $this_id = $post->ID; if($this_id === $post_id){ $index = $key; $archive_page_number = ceil( $index / $per_page ); } } return $archive_page_number; } 

In jeder Datei benötigen Sie den Paginierungslink für – single.php zum Beispiel

 $post_id = $post->ID $post_page = get_archive_page_num( $post_id ); $link = get_post_type_archive_link( $post->post_type ); echo "Back to Archive"; 

Wenn die $post->ID = 1234 , würde dies zu einem Element auf der Archivseite mit id="post-1234" , falls es existiert. Hoffe das hilft jemandem!