Benutzerdefinierten Beitragstyp nach benutzerdefiniertem Taxonomietyp durchlaufen? (Ordnen von WordPress-Beiträgen nach Kategorie oder Anzeigen von benutzerdefinierten Beitragstypen nach Taxonomiebegriff)

Lesezeit: 6 Minuten

Benutzeravatar von Diogenes
Diogenes

Ich möchte eine Seite haben, die alle Beiträge nach Kategorien getrennt anzeigt. Die Idee ist, die Kategorien abzurufen und dann alle Posts für jede Kategorie zu durchlaufen. Das Problem wird durch die Tatsache kompliziert, dass ich alle Posts eines bestimmten benutzerdefinierten Typs durchlaufen möchte, wobei ich eine benutzerdefinierte Taxonomie als Kategorien verwende. (WordPress 3 läuft)

In meiner functions.php ist mein benutzerdefinierter Beitragstyp als „video“ und die benutzerdefinierte Taxonomie als „video_types“ registriert.

In meiner benutzerdefinierten Seitenvorlage, die alle Videos nach Kategorien geordnet anzeigen soll, ist dies der Code, der keine Beiträge zurückgibt (und sie sind da, habe ich überprüft):

<?php 
  $categories = get_categories(array(
    'taxonomy' => 'video_types'
  )); 
  foreach ($categories as $cat):
?>
 <section id="<?php $cat->slug ?>" class="video-category">
     <?php
  query_posts(array(
      'cat' => $cat->cat_ID,
      'posts_per_page' => -1
         ));
     ?>
     <h2><?php single_cat_title(); ?></h2>
    <p class="description"><?php echo category_description($cat->cat_ID); ?></p>
  <?php while (have_posts()) : the_post(); ?>
      <?php
       $category = get_the_category(); 
            echo $category[0]->cat_name;
      ?>
      <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
      <article class="video">
        <h3><?php the_title(); ?></h3>
        <p>
          <?php the_content() ?>
        </p>
      </article>
  <?php endwhile; ?>
 </section>
<?php endforeach; ?>

Benutzeravatar von Diogenes
Diogenes

Jeez, sobald Sie herausgefunden haben, dass jedes Element einer benutzerdefinierten Taxonomie als Begriff bezeichnet wird (in den WordPress-Dokumenten für den Noob nicht sofort offensichtlich), ist es viel einfacher, danach zu suchen. Diese Lösung ist ohne all die benutzerdefinierten Abfragen leichter zu verstehen.

<?php
// A term is an item of a taxonomy (e.g. "Promotional" could be a term for the taxonomy "video_type")
// ...so $categories could be $terms and it would still make sense
$categories = get_terms('taxonomy_name');
foreach( $categories as $category ):
?>
  <section class="category-<?php echo $category ?>">
    <h2><?php echo $category->name; // Print the cat title ?></h2>
    <p class="description"><?php echo $category->description ?></p>
    <div class="<?php echo $category->post_type ?>-list">
      <?php
      //select posts in this category (term), and of a specified content type (post type) 
      $posts = get_posts(array(
        'post_type' => 'custom_post_type_name',
        'taxonomy' => $category->taxonomy,
        'term' => $category->slug,
        'nopaging' => true, // to show all posts in this category, could also use 'numberposts' => -1 instead
      ));
      foreach($posts as $post): // begin cycle through posts of this category
        setup_postdata($post); //set up post data for use in the loop (enables the_title(), etc without specifying a post ID)
      ?>
        // Now you can do things with the post and display it, like so
        <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
          <h3><?php the_title(); ?></h3>
          <?php 
            // Getting custom field data example
            echo get_post_meta($post->ID, 'field_key', true); 
          ?>
          <?php the_content() ?>
        </article>
      <?php endforeach; ?>
    </div>
  </section>
<?php endforeach; ?>

Und dann können eventuelle Verständnislücken gefüllt werden, indem die Funktionen oben im WordPress-Codex gesucht werden. Im obigen Code wäre für meine spezifische Anwendung custom_post_type_name video und taxonomy_name wäre video_type (oder video_types, ich vergesse).

  • Danke für den Tipp. Ein paar Tippfehler für diejenigen, die dies als Leitfaden verwenden. Eins zu vielen Klammern beim ersten get_terms-Aufruf. Außerdem sollte die Abschnittsklasse Kategorie nicht das vollständige Objekt verwenden, sondern den Namen des Kategorieobjekts. Ansonsten sehr schön!

    – Paul T

    4. August 2013 um 0:13 Uhr

  • @PaulT Was hat es mit dem Kategorieobjektnamen auf sich? Können Sie ein Code-Snippet bereitstellen? (Guter Fang bei diesem anderen Tippfehler, übrigens).

    – Diogenes

    5. August 2013 um 2:00 Uhr

  • richtige Antwort für meine Zweifel. Ich habe 4-5 Stunden nach dieser Antwort gesucht.,. Danke Kumpel

    – Schihab mm

    23. Dezember 2015 um 11:04 Uhr


Gavins Benutzeravatar
Gavin

Vielleicht versuchen Sie es mit einem anderen Ansatz. Versuchen Sie, get_posts zu verwenden, um Ihre Posts nach Ihrer benutzerdefinierten Taxonomie zu sortieren, richten Sie eine Variable ein, die anfänglich eine leere Zeichenfolge ist (namens $current_cat oder so), und überprüfen Sie bei jeder Schleife der Ergebnisse die Taxonomie und vergleichen Sie sie mit $current_cat – if anders, drucke eine Überschrift für die neue Kategorie und dann den Eintrag, falls gleich, drucke einen Eintrag wie gewohnt aus.

Ein klares Problem mit Ihrem Code (glaube ich) ist, dass Sie Ihre benutzerdefinierte Taxonomie nicht richtig abfragen. Sie sollten einfach verwenden taxonomy_name => 'value' Innerhalb Ihrer Abfrage wird eine benutzerdefinierte Taxonomie nicht berührt cat in einer Abfrage.

Lassen Sie mich wissen, wenn Sie weitere Einzelheiten benötigen.

edit: Mehr Details!

// get a list of categories, in this case your custom taxonomy (your_taxonomy_name)
$querystr = "SELECT terms.* FROM $wpdb->term_taxonomy tax LEFT JOIN $wpdb->terms terms ON tax.term_id = terms.term_id WHERE tax.taxonomy = 'your_taxonomy_name'";

$categories = $wpdb->get_results($querystr, OBJECT);

foreach( $categories as $category ): // begin a loop through those terms (categories in your custom taxonomy)
    echo '<div class="category-header"><h3>'.$category->name.'</h3>'; // print the cat title
    echo '<p class="category-description">'.strip_tags(term_description($category->term_id,'your_taxonomy_name')).'</p></div>'; // cat description

    $posts = get_posts( array( 'your_taxonomy_name' => $category->name, 'post_type' => 'your_post_type' ) ) //select posts in this category, and of a specified content type
    foreach($posts as $post) : // begin cycle through posts of this category
        setup_postdata($post); //set up post data for use in the loop (enables the_title(), etc without specifying a post ID)

        [ ... ] // do things with your post (display it)

    endforeach;

endforeach;

Das sollte es tun – und Dies kann für die Verwendung von get_posts hilfreich sein.

  • Hey Mann, danke für die Antwort. Kannst du deine Methode ein bisschen näher erläutern? Insbesondere der erste Teil über die Verwendung von Get-Posts.

    – Diogenes

    21. Oktober 2010 um 7:41 Uhr

  • Oh, und ich sollte anmerken, dass der Grund, warum ich zuerst die Kategorien erhalten wollte, darin bestand, dass ich ihre Beschreibung für die Seite benötige, wobei die Idee darin besteht, einen Kategorienamen, eine Beschreibung und dann alle Videos zu haben (post_type => ‘video’). in dieser Kategorie (oder “video_type”) für jeden Videotyp.

    – Diogenes

    21. Oktober 2010 um 9:05 Uhr

  • Das schien zu funktionieren, um den richtigen Beitragstyp herunterzuziehen, zeigt aber nur 15 Beiträge anstelle von allen an (also kann ich nicht testen, ob es nach Kategorie gezogen wird, da es mehr als 15 Beiträge in der ersten Kategorie gibt). Gibt es eine Möglichkeit, diese Einschränkung zu umgehen?

    – Diogenes

    1. November 2010 um 5:13 Uhr

  • Fügen Sie dies hinzu get_posts: numberposts => -1

    – Gawin

    1. November 2010 um 12:06 Uhr

1394340cookie-checkBenutzerdefinierten Beitragstyp nach benutzerdefiniertem Taxonomietyp durchlaufen? (Ordnen von WordPress-Beiträgen nach Kategorie oder Anzeigen von benutzerdefinierten Beitragstypen nach Taxonomiebegriff)

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy