Listar todas las entradas en un tipo de entrada personalizada por taxonomía
¿Hay alguna manera de listar todas las entradas en un tipo de entrada personalizada específica y organizarlas por el término de taxonomía personalizada adjunto a ellas?
Por ejemplo:
Término de Taxonomía #1
Tipo de Entrada
Tipo de Entrada
Tipo de Entrada
Término de Taxonomía #2
Tipo de Entrada
Tipo de Entrada
Cualquier ayuda sería muy apreciada.
Gracias.

Prueba esto
$custom_terms = get_terms('custom_taxonomy');
foreach($custom_terms as $custom_term) {
wp_reset_query();
$args = array('post_type' => 'custom_post_type',
'tax_query' => array(
array(
'taxonomy' => 'custom_taxonomy',
'field' => 'slug',
'terms' => $custom_term->slug,
),
),
);
$loop = new WP_Query($args);
if($loop->have_posts()) {
echo '<h2>'.$custom_term->name.'</h2>';
while($loop->have_posts()) : $loop->the_post();
echo '<a href="'.get_permalink().'">'.get_the_title().'</a><br>';
endwhile;
}
}
Obtenemos todos los términos de una taxonomía, iteramos a través de ellos y generamos un enlace con el título para cada publicación que pertenece a ese término. Si necesitas reordenar los términos de la taxonomía, puedes hacerlo fácilmente con un plugin. Reorder Taxonomy, creo. Pero ten en cuenta que este plugin añade(!) otra columna a tu tabla al activarse y no la elimina al desactivarse!

Hola @GhostToast Esto funciona genial, tengo una pregunta directa, ¿cómo puedo filtrar esto por taxonomía? Tengo tenis, golf, fútbol, voleibol, este código los trae todos con sus posts que tienen la taxonomía marcada. ¿Cómo puedo filtrar para mostrar solo la taxonomía de Fútbol con sus posts?

@RodrigoZuluaga entonces sería una consulta simple. Elimina $custom_terms
y el foreach()
y simplemente define 'terms'
manualmente con el slug o lo que necesites.

No es una solución particularmente elegante, pero puedes crear múltiples consultas, cada una para términos específicos y luego mostrarlos. Ojalá alguien encuentre una forma más bonita de extraer automáticamente los términos para modificar la salida/ordenación. Pero esto te puede servir para empezar.
<?php
// Primera consulta para entradas que coincidan con term1
$args = array(
'tax_query' => array(
array(
'taxonomy' => 'taxonomy_1',
'field' => 'slug',
'terms' => array( 'term1' )
),
),
'post_type' => 'my-post-type'
);
$query = new WP_Query( $args );
if ( have_posts() ) {
$term = $query->queried_object;
echo 'Todas las entradas encontradas en ' . $term->name;
while ( have_posts() ) : the_post();
// Mostrar lo que necesites
the_title();
the_content();
endwhile;
}
// REINICIAR LAS VARIABLES DE CONSULTA
wp_reset_query();
// Segunda consulta para term2
$args = array(
'tax_query' => array(
array(
'taxonomy' => 'taxonomy_1',
'field' => 'slug',
'terms' => array( 'term2' )
),
),
'post_type' => 'my-post-type'
);
$query = new WP_Query( $args );
if ( have_posts() ) {
$term = $query->queried_object;
echo 'Todas las entradas encontradas en ' . $term->name;
while ( have_posts() ) : the_post();
// Mostrar lo que necesites
the_title();
the_content();
endwhile;
}

¡Excelente! La solución de GhostOne era exactamente lo que estaba buscando. En mi caso, el tipo de contenido personalizado era 'minining_accidents' y las taxonomías personalizadas asociadas eran 'accident-types' que tenían múltiples términos bajo ella. Mi idea era crear un widget personalizado para mostrar una lista de publicaciones bajo los términos de esta taxonomía personalizada. En mis pruebas obtuve justo lo que quería. El resto fue solo pulir detalles. Aquí está mi código:
function fn_get_list_of_mining_accident_types()
{
$custom_taxonomy='accident-types';
$custom_terms = get_terms($custom_taxonomy);
$str_return='<ul>';
foreach($custom_terms as $custom_term)
{
wp_reset_query();
$args = array(
'post_type' => 'minining_accidents',
'tax_query' => array(
array(
'taxonomy' => $custom_taxonomy,
'field' => 'slug',
'terms' => $custom_term->slug,
),
),
);
$loop = new WP_Query($args);
$term_name=$custom_term->name;
$term_slug=$custom_term->slug;
$term_link=get_term_link($term_slug, $custom_taxonomy);
$str_return.='<li><a href="'.$term_link.'">'.$term_name.'</a>';
if($loop->have_posts())
{
$str_return.='<ol>';
while($loop->have_posts()) : $loop->the_post();
$str_return.='<li><a href="'.get_permalink().'">'.get_the_title().'</a></li> ';
endwhile;
$str_return.='</ol>';
}
$str_return.='</li>';
}
$str_return.='</ul>';
return $str_return;
}
¡Sí! Siempre existe la opción de seguir mejorando el código.

Esta es una solución larga que probé antes de llegar a este hilo. Espero que esto pueda ayudar a alguien a entender mejor.
<?php
// Obtener lista de todos los términos de taxonomía -- En términos simples, títulos de categorías
$args = array(
'taxonomy' => 'project_category',
'orderby' => 'name',
'order' => 'ASC'
);
$cats = get_categories($args);
// Para cada término de la taxonomía personalizada, obtener sus posts por term_id
foreach($cats as $cat) {
?>
<a href="<?php echo get_category_link( $cat->term_id ) ?>">
<?php echo $cat->name; ?> <br>
<?php // echo $cat->term_id; ?> <br>
</a>
<?php
// Argumentos de la consulta
$args = array(
'post_type' => 'portfolio', // el tipo de post
'tax_query' => array(
array(
'taxonomy' => 'project_category', // el vocabulario personalizado
'field' => 'term_id', // term_id, slug o name (Define por qué quieres buscar el término siguiente)
'terms' => $cat->term_id, // proporciona los slugs de los términos
),
),
);
// La consulta
$the_query = new WP_Query( $args );
// El bucle
if ( $the_query->have_posts() ) {
echo '<h2> Lista de posts etiquetados con esta etiqueta </h2>';
echo '<ul>';
$html_list_items = '';
while ( $the_query->have_posts() ) {
$the_query->the_post();
$html_list_items .= '<li>';
$html_list_items .= '<a href="' . get_permalink() . '">';
$html_list_items .= get_the_title();
$html_list_items .= '</a>';
$html_list_items .= '</li>';
}
echo $html_list_items;
echo '</ul>';
} else {
// no se encontraron posts
}
wp_reset_postdata(); // reiniciar la variable global $post;
?>
<?php } ?>

Para mostrar una lista de entradas personalizadas desde una taxonomía personalizada
$args = array(
'tax_query' => array(
array(
'taxonomy' => 'your-custom-taxonomy', // Tu taxonomía personalizada
'field' => 'slug', // Campo a usar para la consulta
'terms' => array( 'your-term' ) // Términos específicos a buscar
),
),
'post_type' => 'your-post-type' // Tipo de entrada personalizada
);
$loop = new WP_Query($args);
if($loop->have_posts()) {
$term = $wp_query->queried_object;
while($loop->have_posts()) : $loop->the_post();
//Salida personalizada
echo '<li><a href="'.get_permalink().'">'.get_the_title().'</a></li>';
endwhile;
}
Título
- Elemento de lista
- Elemento de lista
- Elemento de lista
