Iterar a través de encargo del tipo convencional o por tipo de taxonomía personalizada? (Solicitud de mensajes wordpress por categoría, o exhibir tipo personalizado mensaje por término taxonomía)

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

  •  27-09-2019
  •  | 
  •  

Pregunta

Quiero tener una página que muestra todos los mensajes, separados por categoría. La idea es conseguir que las categorías, y luego iterar a través de todos los mensajes para cada categoría. El problema se complica por el hecho de que yo quiero para recorrer todos los mensajes de un tipo personalizado dado, utilizando una taxonomía personalizada como las categorías. (Running Wordpress 3)

En mi functions.php, mi costumbre tipo de mensaje está registrada como "video" y la taxonomía personalizada como "video_types".

En mi plantilla de página personalizada que se supone que muestra todos los vídeos ordenados por categorías, este es el código que no muestra ningún mensajes (y que están ahí, he comprobado):

<?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; ?>
¿Fue útil?

Solución

Por Dios, una vez que darse cuenta de que cada elemento de una taxonomía personalizada se llama un término (no inmediatamente obvia en la documentación de WordPress para el novato), todo es mucho más fácil de buscar. Esta solución es más fácil de entender sin todo el material de consulta personalizada.

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

Y a continuación, las deficiencias en la comprensión pueden ser llenados mediante la búsqueda en las funciones anteriores en el códice de WordPress. En el código anterior, para mi aplicación específica, custom_post_type_name sería de vídeo, y taxonomy_name sería video_type (o video_types, no me acuerdo).

Otros consejos

Es posible intentar otra diferente. Trate de usar get_posts para obtener sus mensajes ordenados por su taxonomía personalizada, configure una variable que es inicialmente una cadena vacía (denominada $ current_cat o algo así), y con cada bucle de los resultados, comprobar la taxonomía y compararlo con $ current_cat - si diferente, imprimir un encabezado para la nueva categoría y después de la entrada, si la misma, imprima una entrada como de costumbre.

Un tema claro con su código (creo) es que no se está consultando correctamente su taxonomía personalizada. Debería utilizar simplemente taxonomy_name => 'value' dentro de su consulta, una taxonomía personalizada no será tocado por cat en una consulta.

Avísame si necesita más detalles.

editar: más información!

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

Eso debería hacerlo -. Y este puede ser útil para el uso de get_posts

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top