Diógenes
Quiero tener una página que muestre todas las publicaciones, separadas por categoría. La idea es obtener las categorías y luego recorrer todas las publicaciones de cada categoría. El problema se complica por el hecho de que quiero recorrer todas las publicaciones de un tipo personalizado dado, usando una taxonomía personalizada como categorías. (Ejecutando WordPress 3)
En mi functions.php, mi tipo de publicación personalizada 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 videos ordenados por categoría, este es el código que no devuelve ninguna publicación (y están ahí, lo verifiqué):
<?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; ?>
Diógenes
Por Dios, una vez que te das cuenta de que cada elemento de una taxonomía personalizada se llama un término (no inmediatamente obvio 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 brecha en la comprensión se puede llenar buscando 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 video y taxonomy_name sería video_type (o video_types, lo olvidé).
-
Gracias por el consejo. Un par de errores tipográficos para aquellas personas que usan esto como guía. Uno a varios paréntesis en la llamada inicial a get_terms. 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!
– Pablo T.
4 de agosto de 2013 a las 0:13
-
@PaulT ¿Qué es eso del nombre del objeto de categoría? ¿Puede proporcionar un fragmento de código? (Buena captura en ese otro error tipográfico, por cierto).
– Diógenes
5 de agosto de 2013 a las 2:00
-
respuesta correcta a mi duda. busqué 4-5 horas para esta respuesta.,. Gracias amigo
– shihab mm
23 de diciembre de 2015 a las 11:04
gavin
Puede intentar otro enfoque. Intente usar get_posts para ordenar sus publicaciones según 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 la misma, imprima una entrada como de costumbre.
Un problema claro con su código (creo) es que no está consultando correctamente su taxonomía personalizada. Deberías estar usando simplemente taxonomy_name => 'value'
dentro de su consulta, una taxonomía personalizada no será tocada por cat
en una consulta.
Avísame si necesitas más detalles.
editar: ¡Más detalles!
// 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 usar get_posts.
-
Hey hombre, gracias por la respuesta. ¿Puedes ir a explicar un poco más tu método? Específicamente la primera parte sobre el uso de obtener publicaciones.
– Diógenes
21 de octubre de 2010 a las 7:41
-
Ah, y debo señalar que la razón por la que quería obtener las categorías primero fue porque necesito su descripción para la página, la idea es tener un nombre de categoría, una descripción y luego todos los videos (post_type => ‘video’) en esa categoría (o “video_type”) para cada tipo de video.
– Diógenes
21 de octubre de 2010 a las 9:05
-
Eso pareció funcionar para mostrar el tipo de publicación correcto, pero solo muestra 15 publicaciones en lugar de todas (por lo que no puedo probar si se está extrayendo por categoría, ya que hay más de 15 publicaciones en la primera categoría). ¿Hay alguna forma de evitar esta limitación?
– Diógenes
1 de noviembre de 2010 a las 5:13
-
incluir esto en
get_posts
:numberposts => -1
– Gavin
1 de noviembre de 2010 a las 12:06