¿Cómo consultar un tipo de entrada personalizada con una taxonomía personalizada?

7 feb 2013, 15:01:12
Vistas: 267K
Votos: 53

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')
        )
    );
}
0
Todas las respuestas a la pregunta 5
2
83

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();
7 feb 2013 15:11:45
Comentarios

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 Stephen
7 feb 2013 16:21:14

@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.

Aamer Shahzad Aamer Shahzad
19 nov 2015 22:56:32
4
25

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();
19 nov 2015 23:04:52
Comentarios

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 )

Tom Dyer Tom Dyer
29 jul 2016 00:36:21

sí tienes razón, bienvenido Tom Dyer

Aamer Shahzad Aamer Shahzad
19 ago 2016 00:11:12

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

user3135691 user3135691
16 feb 2018 12:34:36

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

Desi Desi
22 abr 2019 00:34:24
0

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();
?>
29 abr 2020 02:03:47
0

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 } ?>
14 jun 2020 15:22:49
4
-1

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();
26 sept 2018 17:09:57
Comentarios

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

WebElaine WebElaine
4 ene 2019 00:50:07

Bueno, estoy trabajando con v4.5 y me funciona

mamunuzaman mamunuzaman
5 ene 2019 14:22:29

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.

WebElaine WebElaine
7 ene 2019 15:40:12

Sí, ahora cambió de tax a tax_query..

mamunuzaman mamunuzaman
11 dic 2019 12:58:14