Frage: Auf meiner Website habe ich zur Darstellung eines Portfolios einen Custom Post Type eingerichtet. Nun möchte ich gerne in der Einzelansicht zu jedem Portfolio-Eintrag eine fortlaufende Nummer anzeigen. Die Nummerierung soll automatisch angepasst werden, wenn ich mich entscheide, einen Portfolio-Eintrag zu löschen. Geht das?
WordPress speichert alle möglichen Inhalte als Post ab, unabhängig davon, um welche Inhaltsart es sich handelt. Dadurch werden in der Datenbanktabelle wp_posts
automatisch Seiten und Beiträgen, benutzerdefinierten Beitragsarten, Revisionen, Anhängen (Attachments) und Menüs fortlaufend IDs zugeordnet; die IDs für die Beitragsart Portfolio sind also mit einiger Wahrscheinlichkeit nicht fortlaufend.
Um eine fortlaufende Nummrierung zu erhalten, wird im Template single.php
bei Anzeige eines Portfolio-Eintrags zunäst eine neue Abfrage aller Portfolio-Beiträge vorgenommen.
Die Argumente für die Abfrage geben an, dass nur
- Beiträge der Beitragsart Portfolio,
- nur veröffentlichte Beiträge,
- beliebige viele Beiträge,
- von diesen Beiträgen nur die IDs und
- die Reihenfolge aufsteigend nach dem Datum der Erfassung
abgerufen werden sollen. Das Ergebnis ist ein Array mit den IDs aller Portfolio-Einträge in der gewünschten Reihenfolge.
<?php if ( 'portfolio' == get_post_type() ) { $args = array( 'post_type' => 'portfolio', 'post_status' => 'publish', 'posts_per_page' => -1, 'fields' => 'ids', 'order' => 'ASC', ); $the_query = get_posts( $args );
Anschließend werden die IDs in diesem Array mit der ID des aktuell angezeigten Portfolio-Eintrags abgeglichen und die Position der ID im Array ausgelesen. (Die ID aus der Anzeige des aktuellen Portfolio-Eintrags wird vor der Abfrage, der Vergleich dieser ID mit dem Array nach der Abfrage ausgelesen.)
// vor der Abfrage $this_post_id = get_the_id(); // nach der Abfrage $key = array_search( $this_post_id , $the_query );
Die Gesamtzahl aller Beiträge der Beitragsart Portfolio lässt sich mit der WordPress-Funktion wp_count_posts()
auslesen, wobei wir auch hier zusätzlich angeben, dass nur veröffentlichte Beiträge gezählt werden sollen.
$published_posts = wp_count_posts( 'portfolio' )->publish;
Nun können die ermittelten Daten noch ausgegeben werden:
echo 'Nummer ' . $key . ' von '. $published_posts; }//end if post type ?>
Die Ausgabe erfolgt jetzt in der Form Nummer 17 von 42.
Hier nochmal der gesamte Code:
<?php if ( 'portfolio' == get_post_type() ) { $this_post_id = get_the_id(); $args = array( 'post_type' => 'portfolio', 'post_status' => 'publish', 'posts_per_page' => -1, 'fields' => 'ids', 'order' => 'ASC', ); $the_query = get_posts( $args ); $key = array_search( $this_post_id , $the_query ); $key++; $published_posts = wp_count_posts( 'portfolio' )->publish; echo 'Nummer ' . $key . ' von '. $published_posts; } //end if post type ?>