Nummer / id des custom post type Posts
-
Hallo, ich hab einen custom post type „portfolio“.
Nun will ich in der Ansicht eines portfolio-eintrags die Nummer des Eintrags sowie die Gesamtzahl der Einträge anzeigen, also in etwa so:
3 / 18
Die Gesamtzahl hab ich schon so bekommen:
wp_count_posts(‚portfolio‘);Aber wie erhalte ich die Zahl des aktuellen Eintrags (hier die 3).
Denn get_the_ID() gibt die Id zurück bei der alle post types berücksichtigt werden, in meinem Fall 80 :-/
-
Wenn es eine frei gewählte Seriennummer sein soll, kannst du ein Custom Field verwenden. Ansonsten würde ich in die Loop einen Zähler einbauen und diesen mit ausgeben:
// WP_Query arguments $args = array ( 'post_type' => array( 'portfolio' ), ); // The Query $query = new WP_Query( $args ); $nummer = 1; // The Loop if ( $query->have_posts() ) { while ( $query->have_posts() ) { $query->the_post(); // vor dem Titel die Nummer ausgeben echo '<h1>' . $number; the_title(); echo '</h1>'; the_content(); $number++; } } else { // no posts found } // Restore original Post Data wp_reset_postdata();
Danke, aber wie bekomme ich das mit einem single post hin?
get_header(); ?> <?php if (have_posts()) : ?> <?php // Start the loop while (have_posts()) : the_post(); ?> <?php // Insert the post content get_template_part( 'content', get_post_type() ); ?> <?php endwhile; ?> <?php else : ?> <?php // If no content, include the "No post found" template get_template_part( 'content', 'none' ); ?> <?php endif; ?> <?php get_footer(); ?>
also innerhalb der content-portfolio.php dann am besten …
In
content-portfolio.php
wirst du auch eine Loop finden. Dort baust du den Counter ein:echo $number; //und am Ende der Loop $number++;
Damit du keine Fehlermeldung bekommst und der Zähler nicht bei 0 anfängt, musst du in der
single.php
noch die Variable setzen:get_header(); ?> <?php $number = 1; ?> <?php if (have_posts()) : ?>
Alternativ könntest du auch die Portfolio-Beiträge als nummerierte Liste ausgeben, aber das ist vielleicht zu einfach* … 😀
(Dazu würdest du in single.php oberhalb und unterhalb der Loop das Tag
<ol>
bzw.</ol>
verwenden und in content-portfolio.php in der Loop ein
<li>
…</li>
hinzufügen.)*Das macht natürlich nur Sinn, wenn du alle Portfolio-Posts auf einer Seite ausgibst.
Ne, in der content.portfolio.php ist kein loop drin.
Hab extra mal geschaut obs mein fehler ist, aber in der content-single.php von twentysixteen ist auch kein loop vorhanden.
Aber vielleicht hast du das auch anders gemeint.
Man ist in der single halt IM loop.Die Number und das zählen in die single.php einzubauen klappt aber auch logischerweise so nicht, weil es ja nur EIN post ist, der in der single vorhanden ist. Daher ist die $number auch immer 1.
Also wenn man es so macht:
get_header(); ?> <?php // Start the loop $number = 1; while (have_posts()) : the_post(); ?> <?php // Insert the post content get_template_part( 'content', get_post_type() ); ?> <?php echo "number ".$number; $number ++; endwhile; ?> <?php get_footer(); ?>
Die Number und das zählen in die single.php einzubauen klappt aber auch logischerweise so nicht, weil es ja nur EIN post ist, …
Ups, da hast du natürlich völlig Recht; da war ich wohl mit den Gedanken woanders (und Custom Post Type … single.php … das klang erstmal OK). Statt dessen musst du natürlich das Template nehmen, das für die Auflistung der Beiträge zuständig ist.
Du meinst die Geschichte hier? https://codex.wordpress.org/Pagination
Und wie bekomm ich hier die Nummer des aktuellen posts?
Du meinst die Geschichte hier? https://codex.wordpress.org/Pagination
Hm?
Und wie bekomm ich hier die Nummer des aktuellen posts?
Das habe ich doch beschrieben: Counter in die Loop einbauen und bei jedem Durchlauf die Zahl eingeben. Wenn du eine andere Nummerierung brauchst, kannst du das mit Custom Fields machen. Wenn du nicht mit einem Counter arbeiten möchtest, kannst auch die Posts als List Items
<li>
einer nummerierte Liste<ol>
ausgeben, was aber nicht mehr funktioniert, wenn du die Posts auf mehreren Seiten ausgibst.Ich brauch keine andere Nummerierung und auch keine Liste. Ich brauche lediglich die Nummer des einen Posts in der Einzelansicht, was wie von dir oben beschrieben ja nicht funktioniert, wie du auch festgestellt hast.
3/18
Wie soll das auch gehen? Der Loop enthält bei der Einzelansicht nur den Einzelbeitrag (oder die Einzelseite). Da kann nichts gezählt werden. Mit current_post könntest du sonst den Index bekommen, aber der wäre in der Einzelansicht ja auch immer 1.
Der einfachste Weg für die Einzelansicht wäre wohl, was Bego weiter oben schon schrieb, einfach ein benutzerdefiniertes Feld zu nutzen:
Wenn es eine frei gewählte Seriennummer sein soll, kannst du ein Custom Field verwenden.
Das kannst du einfach in der single.php ausgeben.
Gruß, Torsten
… oder so:
<?php if ( 'portfolio' == get_post_type() ) { $slug = $post->post_name; $args = array( 'post_type' => 'portfolio', 'order' => 'ASC' ); $portfolio = new WP_Query( $args ); $count = 1; if ( $portfolio->have_posts() ) { while ( $portfolio->have_posts() ) { $portfolio->the_post(); if ( $slug == $post->post_name ) { echo 'Nummer: ' . $count; } $count++; } } $published_posts = wp_count_posts( 'portfolio' )->publish; echo ' von '. $published_posts; wp_reset_postdata(); } //end if post type ?>
(an entsprechender Stelle in der content-single.php einzugeben).
Zugegeben wird hier die Ausgabe einer laufenden Nummer mit einer eigenen Query und Loop teuer erkauft. Wahrscheinlich wäre es erheblich effizienter, ein Custom Field beim Speichern mit einem fortlaufenden Wert zu füllen und diesen dann im Template abzufragen.
Alternativ könnte statt der Loop der Index im Query-Objekt abgefragt werden. Hier bin ich mit meinen bescheidenen Programmierkenntnissen aber am assoziativen Array gescheitert.@torsten Landsiedel: Das mit dem custom field würde zwar funktionieren, ist aber meiner Meinung nach schlechter Stil und Erzeugung redundanter Daten. Obendrein ist das schlecht wartbar. Was ist, wenn ein Portfolio-Eintrag gelöscht wird? Dann müsste man die anderen Updaten mit den korrigierten custom ids.
@bego Mario Garde:Ja, ein extra query ist wohl das letzte Mittel zur Lösung.
Ich dachte, dass es vielleicht eine eingebaute Funktion gibt, die das bereitstellt, die pagination eben.
Es gibt ja z.B. get_next_post().
Aber ich sehe gerade, dass WP von Haus aus keine Pagination in dem Format << 1 2 3 4 >> hat, wo ja die Nummer eben der Nummer entspräche, wenn es pro Seite nur 1 Post gibt.Danke euch jedenfalls, werd ich halt nen extra query machen.
Na, das motiviert ja jetzt ungemein. Viel Erfolg …
Hier die Lösung ohne Loop:
<?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 ?>
Aber ich sehe gerade, dass WP von Haus aus keine Pagination in dem Format << 1 2 3 4 >> hat
Doch hat es, seit 4.1:
https://codex.wordpress.org/Function_Reference/the_posts_pagination
- Das Thema „Nummer / id des custom post type Posts“ ist für neue Antworten geschlossen.