WordPress Custom Post Types in den Loop holen

Custom Post Types von WordPress können über diverse Wege in den Loop geholt werden, einige möchte ich hier aufzeigen.

Die Zeiten ändern sich.

Dieser Beitrag scheint älter als 7 Jahre zu sein – eine lange Zeit im Internet. Der Inhalt ist vielleicht veraltet.

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.

Custom Post Types Beispiele
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;
}

Kommentare sind geschlossen.