Itérer par type de poste personnalisé par type de taxonomie personnalisée? (Commande messages par catégorie wordpress, ou l'affichage du type personnalisé message par terme de taxonomie)

StackOverflow https://stackoverflow.com/questions/3848608

  •  27-09-2019
  •  | 
  •  

Question

Je veux avoir une page qui affiche tous les messages, séparés par catégorie. L'idée est d'obtenir les catégories et itérer ensuite par tous les messages pour chaque catégorie. Le problème est compliqué par le fait que je veux itérer tous les messages d'un type personnalisé donné, en utilisant une taxonomie personnalisée en tant que catégories. (Running Wordpress 3)

Dans mon functions.php, mon type de poste personnalisé est enregistré comme « vidéo » et la taxonomie personnalisée comme « video_types ».

Dans mon modèle de page personnalisé qui est censé montrer toutes les vidéos classées par catégories, c'est le code qui ne renvoie aucun message (et ils sont là, j'ai vérifié):

<?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; ?>
Était-ce utile?

La solution

Jeez, une fois que vous que chaque élément d'une taxonomie personnalisée est appelée un terme (pas évident dans la documentation de WordPress pour le Noob), tout est beaucoup plus simple à rechercher. Cette solution est plus facile à comprendre sans tous les trucs de requête personnalisée.

<?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; ?>

Et les lacunes dans la compréhension peuvent être remplis en recherchant les fonctions ci-dessus dans le codex wordpress. Dans le code ci-dessus, pour mon application spécifique, custom_post_type_name serait vidéo et taxonomy_name serait video_type (ou video_types, j'oublie).

Autres conseils

Vous pouvez essayer une autre approche. Essayez d'utiliser get_posts pour obtenir vos messages triés par votre taxonomie personnalisée, définissez une variable qui est d'abord une chaîne vide (appelée $ current_cat ou quelque chose), et chaque boucle des résultats, vérifier la taxonomie et la comparer avec $ current_cat - si différent, imprimez un en-tête de la nouvelle catégorie, puis l'entrée, si le même, imprimer une entrée comme d'habitude.

Une question claire avec votre code (je crois) est que vous n'êtes pas correctement votre taxonomie interrogation personnalisée. Vous devez utiliser simplement taxonomy_name => 'value' dans votre requête, une taxonomie personnalisée ne sera pas touché par cat dans une requête.

Laissez-moi savoir si vous avez besoin de plus de détails.

edit: plus de détails!

// 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;

Cela devrait le faire -. Et ce peut être utile pour l'utilisation get_posts

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top