WordPress macht eine Abfrage vorhandener Beiträge, bevor das Template aufgerufen wird. Das Template kann sich mit der Loop direkt auf diese Abfrage beziehen: Hast Du was gefunden? Dann liste die Inhalte auf.
Eine neue Abfrage (new WP_Query()) würde nun bedeuten, das Ergebnis der bereits vorgenommenen Abfrage einfach zu verwerfen, weil man ja eigentlich etwas anderes abfragen möchte (in deinem Fall die normalen Beiträge und zusätzlich die Beiträge einer benutzerdefinierten Beitragsart). Statt dessen sollte man den Hook pre_get_posts
verwenden, um WordPress noch vor der ursprünglichen Abfrage mitzuteilen, dass man gerne zusätzliche Inhalte abrufen möchte:
function my_show_traveldirectory($query) {
//Wenn es sich um die Haupt-Abfrage auf der Seite "Travel Directory" handelt …
if ( $query->is_main_query()&&is_page('Travel Directory') ) {
//… zeige normale Beiträge und Beitragsart travel_directory
$query->set('post_type', array( 'post', 'travel_directory' ) );
}
}
add_action('pre_get_posts','my_show_traveldirectory');
Natürlich kann man das beliebig anpassen, z.B. dass auf der Seite nur die Beitragsart „Travel Directory“ ausgegeben wird.
Für weitere Abfragen kann man natürlich new WP_Query()
verwenden, sollte dann aber als Argument die Beitragsart mit angeben.
// WP_Query arguments
$args = array (
'post_type' => array( 'travel_directory' ),
);
// The Query
$query = new WP_Query( $args );
// The Loop
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
// do something
}
} else {
// no posts found
}
// Restore original Post Data
wp_reset_postdata();
Hi Bego Mario Garde.
Erst einmal tausend Danke für deine schnelle und ausführliche Antwort. Soweit habe ich, dass was du geschrieben hast verstanden und zum grundsätzlichen Verständnis hat mir das bereits sehr weitergeholfen (ich muss dazu sagen, dass ich – wie du vermutlich merkst – noch nicht so viel Erfahrungen mit PHP habe).
Wenn ich das richtig verstanden habe, müsste WordPress mir dann bei diesem Code auch die travel directory Beiträge mit auswerfen… Allerdings klappt das nicht.
$args = array (
'post_type' => array( 'travel-directory' ),
);
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) {
<?php
while ( $the_query->have_posts() ) : $the_query->the_post();
get_template_part( 'content-post'.$template_part, get_post_format() );
endwhile;
/* Restore original Post Data */
wp_reset_postdata();
?>
<?php
} // end have_posts()
Was mache ich falsch?
Danke für die Hilfe!!
Stimmt denn die Bezeichnung des Custom Post Type?
Ja, diese lautet travel-directory.
In deinem Code sehe ich keinen Fehler. Wo hast Du den Code denn eingefügt? Vielleicht verwendet WordPress ein ganz anderes Template? Füg doch mal ein paar Sonderzeichen ein, um zu testen, ob Dein Code überhaupt verwendet wird:
while ( $the_query->have_posts() ) : $the_query->the_post();
echo 'Ja, die Loop wird angezeigt!';
get_template_part( 'content-post'.$template_part, get_post_format() );
endwhile;
… Das ist jetzt ein wenig peinlich 😉
In der Tat habe ich einfach die ganze Zeit an der falschen Datei gearbeitet. Meine Änderung hatte ich am parent-theme gemacht, obwohl diese von einem child-theme File überschrieben wurde. Jetzt funktioniert es. 1000 Dank!! Allerdings zeigt WordPress mir nun auf einmal ALLE Beiträge an, vorher hatte ich durch $posts_per_page = '4';
die Anzahl definiert.
…mit showposts statt posts_per_page hat es geklappt. Nun ist also alles, wie ich es mir vorgestellt hatte.
Vielen lieben Dank für die Hilfsbereitschaft am Wochenende 😉