2010-10-03 15 views
10

quiero tener una página que muestra todos los mensajes, separados por categoría. La idea es obtener las categorías y luego repetir todas las publicaciones para cada categoría. El problema se complica por el hecho de que quiero iterar a través de todas las publicaciones de un tipo personalizado dado, usando una taxonomía personalizada como categorías. (Ejecución de Wordpress 3)¿Ir iterar a través del tipo de publicación personalizada por tipo de taxonomía personalizada? (Solicitud de mensajes wordpress por categoría, o mostrar a medida Tipo mensaje por término taxonomía)

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í, lo 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; ?> 

Respuesta

15

Por Dios, una vez que descubres que cada artículo de una taxonomía personalizada se llama un término (no es obvio de inmediato en los documentos de wordpress para el novato), es mucho más fácil de buscar. Esta solución es más fácil de entender sin todas las consultas personalizadas.

<?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 luego cualquier falta de comprensión se puede completar buscando las funciones anteriores en el wordpress codex. En el código anterior, para mi aplicación específica, custom_post_type_name sería video, y taxonomy_name sería video_type (o video_types, se me olvida).

+0

Siempre me olvido de esto. – emc

+0

Gracias por el consejo. Un par de errores tipográficos para aquellas personas que usan esto como una guía. Uno a muchos paréntesis en la llamada get_terms inicial. Además, la clase de sección de categoría no debe usar el objeto completo, sino el nombre del objeto de categoría. Aparte de eso, muy agradable! –

+0

@PaulT ¿Qué hay sobre el nombre del objeto de categoría? ¿Puedes proporcionar un fragmento de código? (Buena captura de ese otro error tipográfico, por cierto). – Diogenes

2

Usted podría intentar otro enfoque. Intente usar get_posts para obtener sus publicaciones ordenadas por su taxonomía personalizada, configure una variable que inicialmente sea una cadena vacía (llamada $ current_cat o algo así), y con cada ciclo de los resultados, verifique la taxonomía y compárela con $ current_cat - si diferente, imprima un encabezado para la nueva categoría y luego la entrada, si es el mismo, 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 usar simplemente taxonomy_name => 'value' dentro de su consulta, una taxonomía personalizada no será tocada por cat en una consulta.

Quiero saber si necesita más detalles.

edición: 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 this pueden ser útiles para el uso de get_posts.

+0

Hola, hombre, gracias por la respuesta. ¿Puedes explicar tu método un poco más? Específicamente, la primera parte sobre el uso de obtener publicaciones. – Diogenes

+0

Ah, y debo señalar que la razón por la que quería obtener las categorías primera era porque necesito su descripción de la página, con la idea de tener un nombre de categoría, descripción, y luego todos los videos (post_type => 'vídeo') en esa categoría (o "video_type") para cada tipo de video. – Diogenes

+0

Totalmente factible - editando la respuesta anterior con algún código. – Gavin

Cuestiones relacionadas