¿Cómo consultar un tipo de entrada personalizada con una taxonomía personalizada?
Necesito obtener cualquier entrada que use una taxonomía personalizada.
$args = array(
'post_type' => 'adverts',
'advert_tag' => 'politics' // No parece funcionar.
);
query_posts($args);
while ( have_posts() ) : the_post();
//Mostrar Entradas
endwhile;
Declaración de la Taxonomía:
add_action( 'init', 'add_custom_taxonomy', 0 );
function add_custom_taxonomy() {
register_taxonomy('advert_tag', 'Adverts',
array(
'hierarchical' => true,
'labels' => array(
'name' => _x( 'Etiquetas de Anuncios', 'nombre general de taxonomía' ),
'singular_name' => _x( 'Etiqueta de Anuncio', 'nombre singular de taxonomía' ),
'search_items' => __( 'Buscar Etiquetas de Anuncios' ),
'all_items' => __( 'Todas las Etiquetas de Anuncios' ),
'parent_item' => __( 'Etiqueta de Anuncio Superior' ),
'parent_item_colon' => __( 'Etiqueta de Anuncio Superior:' ),
'edit_item' => __( 'Editar Etiqueta de Anuncio' ),
'update_item' => __( 'Actualizar Etiqueta de Anuncio' ),
'add_new_item' => __( 'Añadir Nueva Etiqueta de Anuncio' ),
'new_item_name' => __( 'Nuevo Nombre de Etiqueta de Anuncio' ),
'menu_name' => __( 'Etiquetas de Anuncios' ),
),
'rewrite' => array(
'slug' => 'etiquetas-anuncios',
'with_front' => false,
'hierarchical' => true
),
);
}
Declaración del Tipo de Entrada Personalizada:
add_action( 'init', 'create_post_type' );
function create_post_type() {
register_post_type( 'Adverts',
array(
'labels' => array(
'name' => __( 'Anuncios' ),
'singular_name' => __( 'Anuncio' ),
'add_new' => __( 'Añadir Nuevo' ),
'add_new_item' => __( 'Añadir un Nuevo Anuncio' ),
'edit' => __( 'Editar' ),
'edit_item' => __( 'Editar Anuncio' ),
'new_item' => __( 'Nuevo Anuncio' ),
'view' => __( 'Ver' ),
'view_item' => __( 'Ver Anuncio' ),
'search_items' => __( 'Buscar Anuncios' ),
'not_found' => __( 'No se encontraron Anuncios' ),
'not_found_in_trash' => __( 'No se encontraron Anuncios en la Papelera' ),
),
'supports' => array(
'title',
'thumbnail',
),
'has_archive' => true,
'menu_position' => 10,
'public' => true,
'rewrite' => array(
'slug' => 'anuncios'
),
'taxonomies' => array('advert_tag')
)
);
}
En primer lugar, nunca uses query_posts()
, lee más sobre esto aquí: ¿Cuándo deberías usar WP_Query vs query_posts() vs get_posts()?.
Tienes que usar WP_Query
para obtener los posts que necesitas. Lee la documentación para ello. En tu caso, la consulta podría ser así:
$the_query = new WP_Query( array(
'post_type' => 'Adverts',
'tax_query' => array(
array (
'taxonomy' => 'advert_tag',
'field' => 'slug',
'terms' => 'politics',
)
),
) );
while ( $the_query->have_posts() ) :
$the_query->the_post();
// Mostrar Posts ...
endwhile;
/* Restaurar los Datos originales del Post
* Nota: Como estamos usando new WP_Query no estamos alterando
* el $wp_query original y no necesita ser reseteado.
*/
wp_reset_postdata();

Acabo de notar que parece extraer todas las entradas con el tipo de publicación personalizada 'Adverts'. Sin embargo, esto parece hacer el trabajo:
$the_query = new WP_Query( array( 'post_type' => 'Adverts', 'advert_tag' => 'politics' ));

@Stephen {tax} fue descontinuado desde la versión 3.1 en favor de {tax_query} y se introdujo {tax_query}. Esto todavía funciona pero no deberíamos usar las funciones deprecadas.
tax_query se usa con un array de consultas de taxonomía. Yo estaba trabajando en un Custom Post Type de FAQs y funcionó para mí prácticamente de la misma manera que el argumento de slug de taxonomía {tax} en WP_Query.

Estoy utilizando esta consulta para obtener entradas personalizadas (Entradas FAQs) con su taxonomía personalizada (faq_category). Dado que el parámetro {taxonomy} en los argumentos de WP_Query quedó obsoleto desde la versión 3.1 y se introdujo {tax_query}. A continuación está el código que funciona perfectamente.
$query = new WP_Query( array(
'post_type' => 'faqs', // nombre del tipo de entrada
'tax_query' => array(
array(
'taxonomy' => 'faq_category', // nombre de la taxonomía
'field' => 'term_id', // term_id, slug o name
'terms' => 48, // id del término, slug del término o nombre del término
)
)
) );
while ( $query->have_posts() ) : $query->the_post();
// realizar operaciones aquí....
endwhile;
/**
* reiniciar la consulta original
* debemos usar esto para reiniciar wp_query
*/
wp_reset_query();

Esta es la respuesta correcta - la respuesta aceptada no filtrará por taxonomía ya que tax_query requiere un array de arrays. Este método anidado es esencial para que esto funcione. Gracias por tu respuesta )

Sí, esto también me ayudó a hacer funcionar la plantilla de taxonomías. ¡Gracias!

Hola @AamerShahzad tengo exactamente la misma pregunta y usé tu respuesta pero la página no está mostrando ninguna entrada. ¿Podrías ayudarme? https://stackoverflow.com/questions/55783769/how-do-i-pull-only-one-category-from-custom-post-type-in-a-template

Aquí está el código que funciona como magia. Estoy obteniendo todas las entradas para el post_type personalizado "university_unit" con la taxonomía personalizada "unit_type" y múltiples términos de taxonomía como "directorate" y "office". Espero que esto ayude.
<?php
// Argumentos para la consulta de unidades universitarias
$args = array(
'post_type' => 'university_unit',
'posts_per_page' => -1, // Obtener todos los posts
'orderby' => 'title',
'order' => 'ASC',
'tax_query' => array(
array(
'taxonomy' => 'unit_type',
'field' => 'slug',
'terms' => array('directorate', 'office')
)
)
);
$Query = new WP_Query($args);
if($Query -> have_posts()):
while($Query -> have_posts()):
$Query -> the_post();
?>
<div class="cm-post-list-item">
<article>
<div class="cm-post-head">
<h3 class="cm-text-blue">
<a href="<?php the_permalink(); ?>"><?php the_title();?></a>
</h3>
</div>
<div class="cm-post-body"><?php the_excerpt();?></div>
</article>
</div>
<?php
endwhile;
else:
"No se encontraron Oficinas Administrativas. Intente más tarde";
endif;
wp_reset_postdata();
?>

Esto me ayudó a obtener todos los posts listados bajo cada término para una taxonomía personalizada de CPT
<?php
// Obtener lista de todos los términos de taxonomía -- En categorías simples título
$args = array(
'taxonomy' => 'project_category',
'orderby' => 'name',
'order' => 'ASC'
);
$cats = get_categories($args);
// Para cada término de 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 de abajo)
'terms' => $cat->term_id, // proporciona los slugs de los términos
),
),
);
// La consulta
$the_query = new WP_Query( $args );
// El Loop
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 global $post;
?>
<?php } ?>

Esta respuesta ya no es válida debido a que WordPress cambió su información de parámetros de taxonomía. Por favor utiliza esta forma. Funcionará. A mí me funciona. "tax_query" se reemplaza por "tax". Espero que funcione.
$the_query = new WP_Query( array(
'post_type' => 'Adverts',
'tax' => array(
array (
'taxonomy' => 'advert_tag',
'field' => 'slug',
'terms' => 'politics',
)
),
) );
while ( $the_query->have_posts() ) :
$the_query->the_post();
// Mostrar Entradas ...
endwhile;
/* Restaurar los Datos Originales del Post
* Nota: Debido a que estamos usando new WP_Query no estamos alterando
* el $wp_query original y no necesita ser reiniciado.
*/
wp_reset_postdata();

Es exactamente lo contrario - tax
era la forma antigua, tax_query
es la forma actual (v3.1+).

WordPress es famoso por mantener la compatibilidad con versiones anteriores. La forma antigua todavía funciona, pero está obsoleta, por lo que eventualmente podría eliminarse y es más seguro usar el método más nuevo.
