WordPress-Paginierung: Ein einfaches Dienstprogramm (und warum)
Beim Erstellen von Vorlagen für WordPress haben Sie im Allgemeinen Paginierungsfunktionen, die von der Anwendung selbst stammen.
Dazu gehören Dinge wie:
Und es gibt ein paar andere Posts, die Ihnen eine größere Granularität in Bezug auf Taxonomien geben, wie z. B. get_adjacent_post().
Ich empfehle, alle oben genannten Links zu lesen, da sie nützlich sind, wenn Sie ein Thema erstellen, mit benutzerdefinierten Beitragstypen arbeiten oder einfach nach einem tieferen Verständnis einiger der gängigen Vorlagen-Tags suchen.
Wenn Sie jedoch nach einer einfachen Möglichkeit suchen, Ihr WordPress-Paginierungsdienstprogramm zu schreiben (was ich gleich erklären werde), dann wird der Rest dieses Beitrags genau das abdecken.
Benutzerdefinierte WordPress-Paginierung
Erstens, wenn Sie eine Webanwendung für jemanden erstellen, gibt es zwangsläufig Nuancen, in denen die native WordPress-Funktionalität möglicherweise nicht funktioniert. Vielleicht funktioniert es nicht wie erwartet, es funktioniert nicht wie beabsichtigt oder es erfüllt nicht Ihre Anforderungen.
Was auch immer der Fall ist, das bedeutet nicht, dass die Paginierung nicht so aufgebaut werden kann, dass sie Ihren Zwecken dient. Schließlich ist der Kern der Paginierung – insbesondere in Bezug auf die einzelne Post-Paginierung – im Wesentlichen dies:
Prüfen Sie anhand des aktuellen Beitrags, ob ein Beitrag davor vorhanden ist, und prüfen Sie, ob ein Beitrag danach vorhanden ist. Wenn eine der beiden Arten von Posts vorhanden ist, geben Sie einen Link dazu an. ansonsten nicht.
Von hier aus können wir feststellen, dass wir die folgenden Funktionen benötigen:
- eine Möglichkeit festzustellen, ob ein Beitrag hinter dem aktuellen Beitrag existiert,
- eine Möglichkeit festzustellen, ob ein Beitrag nach dem aktuellen Beitrag existiert,
- eine Möglichkeit, einen bestimmten Beitrag abzurufen,
- eine Möglichkeit, den Permalink für den angegebenen Beitrag zu erhalten.
Ich arbeite jedoch sehr genau in der obigen Sprache, da ein Beitrag, der „hinter“ oder „nach“ einem bestimmten Beitrag steht, möglicherweise keine ID hat, die um eins kleiner ist als die ID des aktuellen Beitrags.
Es ist einfach der erste Beitrag, der veröffentlicht wird, und kann in beide Richtungen abgerufen werden, richtig?
In Anbetracht dessen bedeutet dies, dass wir zwei Abfragen benötigen:
- eine Abfrage, um den Beitrag hinter dem aktuellen Beitrag abzurufen,
- eine Abfrage zum Abrufen des Beitrags nach dem aktuellen Beitrag.
Für dieses Beispiel gehe ich davon aus, dass Sie über die Funktion get_the_ID() Zugriff auf die ID des aktuellen Beitrags haben .
Holen Sie sich einen Beitrag hinter dem aktuellen Beitrag
Dazu müssen wir eine einfache Abfrage erstellen, die einen veröffentlichten Beitrag aus der Datenbank des angegebenen Beitragstyps abruft und sich auf die Position des aktuellen Beitrags bezieht.
Wir können dies tun, indem wir die Ergebnismenge auf eins beschränken, die Ergebnisse in absteigender Reihenfolge ordnen und den Wert der Beitrags-ID vergleichen:
<?php
global $wpdb;
$results = $wpdb->get_results(
$wpdb->prepare(
"
SELECT *
FROM $wpdb->posts
WHERE ID < (SELECT ID
FROM $wpdb->posts
WHERE ID = %d
AND post_type = '%s'
AND post_status = '%s'
ORDER BY ID DESC) AND post_type = '%s'
AND post_status = '%s'
ORDER BY ID DESC
LIMIT 1
",
get_the_ID(),
'acme-custom-post-type',
'publish',
'acme-custom-post-type',
'publish') );
Dies wird eine Reihe von Ergebnissen zurückgeben, die wir in Kürze sehen werden.
Holen Sie sich den Beitrag nach dem aktuellen Beitrag
Für den nächsten Beitrag schreiben wir eine ähnliche Abfrage. Aber stattdessen suchen wir nach dem nächsten Wert, der größer ist und der vor der aktuellen ID liegt:
<?php
global $wpdb;
$results = $wpdb->get_results(
$wpdb->prepare(
"
SELECT *
FROM $wpdb->posts
WHERE ID > (SELECT ID
FROM $wpdb->posts
WHERE ID = %d
AND post_type = '%s'
AND post_status = '%s'
ORDER BY ID ASC) AND post_type = '%s'
AND post_status = '%s'
ORDER BY ID ASC
LIMIT 1
",
get_the_ID(),
'acme-custom-post-type',
'publish',
'acme-custom-post-type',
'publish') );
Jetzt brauchen wir ein paar Funktionen, um festzustellen, ob Beiträge vorhanden sind. Wir können dies mit dem zurückgegebenen Ergebnisarray tun.
Überprüfen Sie, ob ein Beitrag existiert
Beachten Sie, dass im folgenden Beispiel die Funktion das Array von Ergebnissen akzeptiert und einfach zurückkehrt, wenn es einen vorherigen Beitrag gibt. Die Ergebnisse, die an diese Funktion übergeben werden, sollten aus der vorherigen Post-Abfrage oben stammen.
Zweitens, beachten Sie, dass es privat ist. Möglicherweise möchten Sie Ihre öffentlich machen, je nachdem, wie Sie Ihre Vorlagen erstellen möchten.
<?php
/**
* @param array $results the results of the query to determined if there are past posts
*
* @return bool true if there is a previous post; otherwise, false
*/
private function hasPreviousPost($results)
{
return isset($results[0]);
}
Und dann sieht es für den nächsten Beitrag genauso aus, aber denken Sie daran, dass die Ergebnisse, die an diese Funktion übergeben werden, von einer anderen Abfrage stammen.
<?php
/**
* @param array $results the results of the query to determined if there are future posts
*
* @return bool true if there is a next post; otherwise, false
*/
private function hasNextPost($results)
{
return isset($results[0]);
}
Und schließlich können wir diese bedingten Funktionen verwenden, um den Permalink zu erhalten.
Holen Sie sich den Link
Denken Sie daran, dass die Art und Weise, wie Sie diese Funktion verwenden, von der von mir bereitgestellten Implementierung abweichen kann. Wenn es also nicht privat sein muss, ändern Sie seine Sichtbarkeit und verwenden Sie es nach Bedarf in Ihrer Vorlage.
<?php
/**
* @param array $results the results of the array from which to retrieve the post ID
*
* @return string the ID of the post to which we're going to link
*/
private function getPostLink($results)
{
return get_the_permalink($results[0]->ID);
}
Beachten Sie schließlich, dass diese Funktion die Ergebnisse akzeptiert, die Sie von beiden Abfragen übergeben, und die ID-Eigenschaft aus dem ersten Index der Ergebnisse abruft.
Dies liegt daran, dass die Ergebnisse auf eins beschränkt sind und von Ihrer Verwendung der bedingten Funktionen abhängen. Das heißt, Sie können Folgendes tun:
- Wenn es einen nächsten Beitrag gibt, erhalten Sie den Link zum nächsten Beitrag
Ihre Implementierung kann jedoch variieren.
Warum wird dies benötigt?
Es ist möglicherweise nicht erforderlich. Das ist die ganze Sache: Wenn Sie WordPress sofort mit sehr wenig Anpassung oder Erweiterung verwenden und nichts über das hinaus tun müssen, was es bieten kann, brauchen Sie dies möglicherweise nicht.
Wenn Sie andererseits nach einer Möglichkeit suchen, die WordPress-Paginierungsfunktion für einen einzelnen Beitrag einzuführen, dann ist dies eine Möglichkeit, die den Fall von Beiträgen richtig handhaben kann, die einem bestimmten Beitragstyp angehören, aber nicht keine sequentiellen IDs haben (und die nur mit einem Post-Veröffentlichungsstatus funktionieren).