Filtrar publicaciones por múltiples taxonomías en WordPress

15 jul 2014, 22:49:45
Vistas: 14.8K
Votos: 2

Tengo una página en la que quiero mostrar todas las publicaciones de un tipo de contenido personalizado, llamémoslo "personas". Quiero permitir al usuario filtrar todas las personas por múltiples (!) taxonomías: edad, ciudad, profesión, nivel de experiencia. La mejor manera de hacerlo sería mediante casillas de verificación y obtener los resultados inmediatamente vía AJAX sin recargar la página.

Creo que esto es algo que muchos desarrolladores de WordPress quieren implementar. Desafortunadamente, no he encontrado ningún tutorial adecuado para lograrlo. Pero debe ser algo fácil de hacer para desarrolladores experimentados de WordPress...

¿Alguien puede proporcionar una plantilla de código sobre cómo construir una página de filtro para el tipo de contenido personalizado descrito anteriormente?

Ya sé cómo filtrar publicaciones por solo UNA taxonomía, mediante jQuery. Este es el código que he usado hasta ahora:

<!-- PLANTILLA DE PÁGINA PARA VISTA GENERAL DE TODAS LAS PUBLICACIONES DEL TIPO DE CONTENIDO PERSONALIZADO "PERSONAS" -->

        <!-- LISTA DE TODOS LOS TÉRMINOS DE LA TAXONOMÍA "CIUDADES"  -->
        <div class="cities">

        <a href="#" id="all">Todas las ciudades</a>             
        <?php
        // Obtener todos los términos de una taxonomía
        $taxonomy = 'cities';
        $terms = get_terms($taxonomy); 
        if ( $terms && !is_wp_error( $terms ) ) :
        foreach ( $terms as $term ) { ?>
            <a href="javascript:void(0);" data-target="<?php echo $term -> slug; ?>"><?php echo $term -> name; ?></a>
         <?php } endif; ?>

        </div>

        <!-- MOSTRAR PERSONAS -->

        <div class="overview_persons">

            <?php  
            $args= array(
                'post_type' => 'persons', 
                'post_status' => 'publish',
                'meta_key' => 'zip',
                'orderby' => 'meta_value_num',
                'order' => 'ASC',
                'posts_per_page' => -1
            );
            query_posts($args);

            if ( have_posts() ) : while ( have_posts() ) : the_post(); 

                $post_terms = wp_get_post_terms( $post->ID, $taxonomy, array( "fields" => "slugs" ) );
                $post_terms_space_separated = implode(" ", $post_terms);
                ?>

                <!-- mostrar el valor de la taxonomía seleccionada en la clase del div de persona -->
                <div class="person <?php echo $post_terms_space_separated; ?>">
                    <!-- descripción de la persona -->                          
                </div>                  

            <?php endwhile; endif; wp_reset_query(); ?>

        </div>

<!-- MI JQUERY PARA FILTRAR PERSONAS POR LA TAXONOMÍA "CIUDAD" -->
<script>
    jQuery(document).ready(function() {

        // Clic en una ciudad
        jQuery('a[data-target]').click(function() {
              jQuery('.person').show().not('.' + this.dataset.target).hide();

        });

        // Clic en "Todas las ciudades"
        jQuery('#all').click(function(e) {
              e.preventDefault();
              jQuery('.person').show();

        });

    });

</script>

Este código funciona perfectamente bien. Pero mi nuevo desafío es filtrar personas por más de una taxonomía, no solo por la ciudad, sino también por la edad, profesión y nivel de experiencia. ¿Cómo necesito modificar mi código para lograr esto? Lograrlo mediante AJAX sería la forma preferible, por supuesto.

0
Todas las respuestas a la pregunta 2
0

En primer lugar, deberías usar WP_Query en lugar de query_posts.

Echa un vistazo a los Parámetros de Taxonomía.

Principalmente tax_query y relation.

// Repost del enlace anterior
   $args = array(
        'post_type' => 'post',
        'tax_query' => array(
            'relation' => 'AND',
            array(
                'taxonomy' => 'movie_genre',
                'field' => 'slug',
                'terms' => array( 'action', 'comedy' )
            ),
            array(
                'taxonomy' => 'actor',
                'field' => 'id',
                'terms' => array( 103, 115, 206 ),
                'operator' => 'NOT IN'
            )
        )
    );

O, si prefieres declararlo después, dentro del bucle, echa un vistazo a array_key_exists. Podrías ejecutar el bucle nuevamente pero esta vez verificar cada publicación para los términos coincidentes.

// YA NO FUNCIONA, WORDPRESS HA CAMBIADO LA ESTRUCTURA DEL ARRAY DE get_the_terms() -- OCT 2015
   /* if( array_key_exists( 111, get_the_terms($post->ID,'age') ) &&  array_key_exists( 222, get_the_terms($post->ID,'city') ) ) { 
      // mostrar la publicación
    } */

O, podrías hacerlo todo en jQuery (por ejemplo) si ya vas a cargar todas las publicaciones en la página de todos modos. Podrías mostrar atributos data para cada publicación que contengan los términos con los que están etiquetadas.

<!-- Por ejemplo // Donde 111 y 222 se refieren al ID del término -->
<div class="person" data-age="id111" data-city="id222"></div>

Y luego simplemente .hide() los que no coincidan con los términos seleccionados para filtrar.

15 jul 2014 23:36:01
0

No es una pregunta nueva, sin embargo, hoy en día no estamos obligados a usar jQuery y WP_Query para hacer que cosas como esa funcionen.

Además, en los Temas de Bloques de WordPress ni siquiera podemos usar WP_Query para crear un filtro por taxonomías.

En mi opinión, necesitamos usar lo siguiente:

  • El bloque de Bucle de Consulta (disponible como parte del editor de sitios de WordPress)
  • Interactivity API (que nos permite hacer nuestro filtro completamente AJAX)
  • Un bloque de filtro de taxonomías (que interactuará tanto con Interactivity API como con el bloque de bucle de consulta y filtrará publicaciones o tipos de contenido personalizados por nosotros).

Dado que las dos primeras cosas están disponibles en WordPress por defecto hoy en día, solo necesitamos el bloque de filtro de taxonomías para que funcione. Recomendaría echar un vistazo a este: https://rudrastyh.com/plugins/taxonomy-filter-block.

2 ene 2025 07:59:53