WordPress hat mit den Custom Post Types ein neues zeitalter für Entwickler im Umfeld WordPress eröffnet. Die Möglichkeiten sind vielfältig und in erster Linie vom Wissen des entwicklers abhängig. Trotzdem findet man im Netz immer wieder die gleichen Tutorial, die im Grunde nur das Einhängen eines Custom Post Types in WP erklären. Aber damit ist es nicht getan – zumindest nicht in den meisten Fällen und daher sind diverse weitere Schritte nötig um die Nutzung der CPT rund zu machen.
Nein, es kommt nun kein komplettes Tutorial, wie man vorgeht und was zu tun ist; zum einen liegt dies an der fehlenden Zeit und zum anderen daran, dass die Anforderungen jeder Umsetzung sehr spezifisch sind und man damit Gefahr läuft, dass man eingehängt nach Lösungen sucht. Daher werde ich Lösungen nun ab und an hier im Blog veröffentlichen; je nach zeit und Muse, was mir so unterkommt oder was ich mit anderen schon diskutiert habe.
In diesem Artikel möchte ich kurz darstellen, wie man die Inhalte der Custom Post Types in den Loop von WordPress bekommt. Damit ist kein Anspruch auf Vollständigkeit erhoben und die Kommentare stehen euch offen um zu diskutieren, zu kritisieren oder zu ergänzen.

Der Screenshot ist ein Beispiel für die Nutzung der CPT, dabei sind die Plugins Archive und Snippets entstanden, die unterschiedliche Aufgaben haben und mittels CPT recht gut abbildbar waren, insbesondere auf die Anforderungen zugeschnitten, dass man eine Oberfläche hat, die eigenständig berechtigt werden kann, je Objekt je Rolle und parallel die Nutzung von Anwendern erlaubt, die nur die Oberfläche von WP nutzen wollen bzw. kennen.
Im ersten Fall sei die Syntax dargestellt, wie man den Query nutzt und mittels Parameter den Typ des CPT übergibt. In einem Template des Themes sorgt dies dafür, dass nur dieser CPT ausgelesen wird. Alle anderen Parameter des Query bleiben unangetastet.
query_posts( 'post_type=my_post_type' )
Eine weitere Lösung unterscheidet sich im Grunde nur im Stil und dass mehrere CPTs übergeben werden, die in einem Array stecken und damit beachtet werden.
global $query_string;
parse_str( $query_string, $args );
$args['post_type'] = array( 'my_post_type', 'my_second_post_type' );
query_posts( $args );
Um den Loop von WP zu ergänzen und nicht einzuschränken, wird das Array um den Parameter des post_type ergänzt. Via array_merge werden also nur das Array um ein weiteres Array ergänzt.
global $wp_query;
$args = array_merge( $wp_query->query, array( 'post_type' => 'my_post_type' ) );
query_posts( $args );
Im weiteren lassen sich eigene Queries definieren, insbesondere wenn dies in eigenen Variablen nutzen möchte, sei es im Theme oder in Plugins.
$args = array(
'post_type' => 'my_post_type',
'post_status' => 'publish',
'posts_per_page' => -1
);
$posts = new WP_Query( $args );
if ( $posts -> have_posts() ) {
while ( $posts -> have_posts() ) {
...
}
}
wp_reset_query();
Als letztes eine Lösung, die insbesondere den Scharm hat, dass man es sauber via Plugin steuern und damit auch bei Tests leicht abschalten kann. Ebenfalls ist die Anwendung in einem Plugin so einfach zu realisieren oder die Erweiterung eines bestehenden Themes via Child Theme oder Plugin. Über den Hook pre_get_posts kann man diverse Sachen des Query anpassen, so auch die CPTs.
Im Beispiel habe ich via Conditional Tags noch diverse Bedingungen drin, so dass man sieht, wie auf die Ausgabe im Frontend reagiert werden kann.
// $this? - example was used in class-structures
// add custom post type to wp loop
add_filter( 'pre_get_posts', array( $this, 'add_to_query') );
// ads to query
function add_to_query( $query ) {
if ( is_admin() || is_preview() )
return;
if ( ! isset( $query -> query_vars['suppress_filters'] ) )
$query -> query_vars['suppress_filters'] = FALSE;
// conditional tags for restrictions
if ( is_home() || is_front_page() && ( FALSE == $query -> query_vars['suppress_filters'] ) )
$query->set( 'post_type', array( 'post', 'my_post_type' ) );
return $query;
}
Hallo Frank,
danke für die Hinweise uzm Einfügen der CPT.
Meine Frage die sich mir die ganze Zeit stellt. Brauche ich weiterhin die Zuordnung von Kategorien. Ich erstelle gerade eine Theme die nur aus CPT besteht. Somit wäre eine Zuordnung mit Kategorien ja irgendwie sinnlos, da die CPTs nicht in den Kategorien angezeigt werden.
Oder habe ich hier einen Denkfehler.
Beste Grüße,
derDenis
@Denis: nein, die brauchst du nur, wenn dein Post Type damit arbeiten soll. Ich klemme die oft ab und mappe eigene Taxonmien.
Hi Frank,
was meinst Du mit "damit arbeiten".
meine Kaegorien sind CD-Review DVD-Review Buch-Review.
meine CPT sind CDs, DVDs und Bücher
und die Taxonomien sind Artist, Event, Verlag, Autor und Label
Ich wollte jetzt für jede CPT ein eigenes Template erstellen, sowohl für die Übersicht als auch für die Single Anzeige.
Und diese "Übersicht Template" wollte ich dann als Navigation verwegen.
Daher verste ich "damit arbeiten" nicht so richtig.
Grüße,
derDenis
@Denis: wenn du eben nicht für alle jeweils Template im Theme erstellen willst, dann kommt man über die obige Lösung zu einem Resultat. Ich erstelle oft PLugins mit CPT und dabei habe ich keinen Einfluss auf das Theme, so hole ich so die Inhalte in den Loop des Themes.