Gesucht wurde eine Lösung sich auf einer Übersichtseite alle Beiträge und Seiten eines bestimmten Buchstabens anzeigen zu lassen. Hier Angaben zur Umsetzung:
Wie dem Bild zu entnehmen, wollte ich alle Künstlerseiten und Musikalben die mit „C“ anfangen dargestellt bekommen. Oben die Pages (das sind Künstlerdiskografien) und darunter die Posts (das sind restlichen Alben).
Pages mit „C“
Um sich alle Seiten bzw. Unterseiten anzeigen lassen, braucht es nicht viel in WordPress:
<?php wp_list_pages ('child_of=1701&title_li=' ); ?>
Das erzeugt eine Auflistung aller Unterseiten (Kinder) von der Seite 1701.
Doch ich will hier aus dieser Liste nur die Unterseiten mit dem Anfangsbuchstaben „C“. Da wird es schon etwas komplizierter, im Seiten-Template steht dann folgendes:
<?php
$args = array(
'post_type' => 'page',
'post_parent' => 1701,
'startswith' => 'C',
'orderby' => 'title',
'order' => 'ASC'
);
$the_query = new WP_Query( $args );
?>
<?php if ( $the_query->have_posts() ) : ?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<div class="post" id="post-<?php the_ID(); ?>">
<div class="discobox"><a href="<?php the_permalink(); ?>"><?php echo get_the_post_thumbnail( $page->ID, 'thumbnail' ); ?><?php the_title(); ?></a>
</div>
</div><!-- Ende post -->
<?php endwhile; wp_reset_postdata(); endif; ?>
Kurze Erklärung: In dem array lege ich fest wo und was gesucht wird:
Es werden Seiten gesuchten von der Oberseite (den Eltern 1701), die mit dem Anfangsbuchstaben „C“ beginnen und diese sortiert werden von A bis Z (also Ca, Cb, Cc, Cd…)
Das Ergebnis dieser Suche (query) soll dann dargestellt werden als Link mit Thumbnail.
Doch das wird nicht direkt funktionieren, da die obige Angabe im array ’startswith‘ keine WP Funktion ist.
Diesen Filter müssen wir erstmal anlegen.
functions.php – Der Filter
Der Filter ist quasi das Kernstück für die alphabetische Umsetzung. Hier hatte ich mich im WP-Forum umgehört und der User b3317133 hat mir den freundlicherweise erstellt.
add_filter( 'posts_where', 'startswithfilter', 10, 2 );
function startswithfilter( $sql, $wp_query ) {
global $wpdb;
if ( $startswith = $wp_query->get( 'startswith' ) ) {
$sql .= $wpdb->prepare( " AND $wpdb->posts.post_title LIKE %s ", $wpdb->esc_like( $startswith ) . "%" );
}
return $sql;
}
Dieser Code arbeitet mit der posts_where Klausel die tatsächlich filtert und nicht nur Bereiche ausblendet. Somit also einen geringen Datensatz hat.
Den Code für die eigene Nutzung einfach 1 zu 1 kopieren und in der functions.php einfügen.
Für Pages klappt es jetzt bereits, wenn der obige Page-Code im Seiten Template eingetragen wurde (und die Übersichtseite auch mit dem Template verbunden ist) und der Filter in der functions.php eingesetzt wurde. Jetzt fehlen noch die Beiträge. Der Filter funktioniert auch dafür.
Posts mit „C“
Ähnlich wie bei Pages braucht es zunächst die Angaben im array wo was zu finden ist und anschließend wie das Ergebnis (query) angezeigt wird.
Im array frage ich alle posts ab aus der Kategorie 15, aber ohne die Unterkategorie 8. Es soll der Titel angezeigt werden und ohne Beschränkung der Anzahl.
<?php
$args = array(
'post_type' => 'post',
'cat' => '15,-8',
'orderby' => 'title',
'order' => 'ASC',
'startswith' => 'C',
'posts_per_page' => '-1'
);
$the_query = new WP_Query( $args );
?>
<div class="listeaz">
<ul>
<?php if ( $the_query->have_posts() ) : ?>
<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; wp_reset_postdata(); endif; ?>
</ul>
</div><!-- Ende listeaz -->
Bei der Darstellung habe ich hier einfach den Titel als Link (ohne thumbnail) als Liste.
Das Resultat ist im Bild zu sehen, oder direkt im Blog: funkygog Musik Archiv C
Schreibt man einen neuen Beitrag oder eine neue Seite so wird dieser automatisch dem Buchstaben zugeordnet.
2 Kommentare
Vielen Dank für den Hinweis auf die richtige Platzierung des Reset Postdata. Habe den Code oben darauf geändert.
Tipp: wp_reset_postdata() besser in den if block, direkt nach endwhile, es wird nur benötigt, wenn $the_query->the_post() genutzt wird.