Support » Plugins » Custom post type in Loop einfügen

  • Gelöst raoul_k

    (@raoul_k)


    Hi.

    Ich versuche einen custom post type (mit dem Titel „travel-directory“) in einen Loop auf meiner Seite zu bringen. Bisher werden in diesem Loop lediglich die normalen Blogeinträge angezeigt, ich möchte nun die custom post types ebenefalls mit drin haben.

    Ich hab schon einiges probiert (z.B. das), aber ich kriege es einfach nicht hin.

    Dies hier ist der bisherige Code, in dem der custom post type mit rein soll:

    // The Query
    $args['posts_per_page'] = $posts_per_page;
    if (!empty($categories) && $categories[0] !== 'none') {
    	$args['category__and'] = $categories;
    }
    
    $the_query = new WP_Query( $args );
    
    // The Loop
    if ( $the_query->have_posts() ) {
    
    	?>
    	<section class="regular <?php echo esc_attr($blog_class) ?>" <?php echo  $styles; // escaped above ?>>
    		<div class="container">
    
    			<div class="title-row">
    			  <?php if (!empty($section_title)) : ?>
    				<h3 class="title-entry"><?php esc_attr_e($section_title) ?></h3>
    			  <?php endif; ?>
    			  <?php if (!empty($category_link) && !empty($section_more)) : ?>
    				<a href="<?php echo esc_url($category_link); ?>" class="btn btn-primary btn-xs"><?php esc_attr_e($section_more) ?> &nbsp; <i class="fa fa-angle-right"></i></a>
    			  <?php endif; ?>
    			</div>
    
    			<div class="row">
    				<?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();
    
    				?>
    			</div> <!-- /.row -->
    		</div> <!-- /.container -->
    	</section>
    
    	<?php
    
    } // end have_posts()

    Ich bin für jede Hilfe unendlich dankbar.

Ansicht von 7 Antworten - 1 bis 7 (von insgesamt 7)
  • 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();
    Thread-Ersteller raoul_k

    (@raoul_k)

    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?

    Thread-Ersteller raoul_k

    (@raoul_k)

    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;
    Thread-Ersteller raoul_k

    (@raoul_k)

    … 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.

    Thread-Ersteller raoul_k

    (@raoul_k)

    …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 😉

Ansicht von 7 Antworten - 1 bis 7 (von insgesamt 7)
  • Das Thema „Custom post type in Loop einfügen“ ist für neue Antworten geschlossen.