Filtrare post per più tassonomie

15 lug 2014, 22:49:45
Visualizzazioni: 14.8K
Voti: 2

Ho una pagina in cui voglio mostrare tutti i post di un custom post type specifico, chiamiamolo "persone". Voglio permettere all'utente di filtrare tutte le persone per più (!) tassonomie: età, città, professione, livello di esperienza. Il modo migliore sarebbe tramite checkbox e ottenere i risultati immediatamente via ajax senza ricaricare la pagina.

Penso che questo sia qualcosa che molti sviluppatori WordPress vogliono realizzare. Sfortunatamente, non ho trovato tutorial adatti per ottenere questo risultato. Ma deve essere qualcosa di semplice per sviluppatori WordPress esperti...

Qualcuno può fornire un template di codice per costruire una pagina di filtro per il custom post type descritto sopra?

So già come filtrare i post per una sola tassonomia, usando jQuery. Questo è il codice che ho usato finora:

<!-- TEMPLATE DELLA PAGINA PER LA VISUALIZZAZIONE DI TUTTI I POST DEL CUSTOM POST TYPE "PERSONE" -->

        <!-- LISTA DI TUTTI I TERMINI DELLA TASSONOMIA "CITTÀ" -->
        <div class="cities">

        <a href="#" id="all">Tutte le città</a>             
        <?php
        // Ottieni tutti i termini di una tassonomia
        $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>

        <!-- OUTPUT DELLE PERSONE -->

        <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);
                ?>

                <!-- output del valore della tassonomia selezionata nella classe del div persona -->
                <div class="person <?php echo $post_terms_space_separated; ?>">
                    <!-- descrizione della persona -->                          
                </div>                  

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

        </div>

<!-- MIO JQUERY PER FILTRARE LE PERSONE TRAMITE LA TASSONOMIA "CITTÀ" -->
<script>
    jQuery(document).ready(function() {

        // Click su una città
        jQuery('a[data-target]').click(function() {
              jQuery('.person').show().not('.' + this.dataset.target).hide();

        });

        // Click su "Tutte le città"
        jQuery('#all').click(function(e) {
              e.preventDefault();
              jQuery('.person').show();

        });

    });

</script>

Questo codice funziona perfettamente. Ma la mia nuova sfida è filtrare le persone per più di una tassonomia - non solo per la città, ma anche per età, professione e livello di esperienza. Come devo modificare il mio codice per ottenere questo risultato? Ottenere questo via Ajax sarebbe ovviamente il metodo preferibile.

0
Tutte le risposte alla domanda 2
0

Prima di tutto, dovresti utilizzare WP_Query invece di query_posts.

Dai un'occhiata ai Parametri di Tassonomia.

Principalmente tax_query e relation.

// Ripubblicato dal link sopra
   $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'
            )
        )
    );

OPPURE, se preferisci dichiararlo dopo, all'interno del loop, dai un'occhiata a array_key_exists. Potresti eseguire nuovamente il loop ma questa volta controllare ogni post per i termini corrispondenti.

// NON FUNZIONA PIÙ, WORDPRESS HA CAMBIATO LA STRUTTURA DELL'ARRAY DI get_the_terms() -- OTTOBRE 2015
   /* if( array_key_exists( 111, get_the_terms($post->ID,'age') ) &&  array_key_exists( 222, get_the_terms($post->ID,'city') ) ) { 
      // mostra il post
    } */

OPPURE, potresti farlo tutto in jQuery (ad esempio) se stai già caricando tutti i post sulla pagina. Potresti aggiungere attributi data per ogni post contenenti i termini con cui sono taggati.

<!-- Ad esempio // Dove 111 e 222 si riferiscono all'id del termine -->
<div class="person" data-age="id111" data-city="id222"></div>

E poi semplicemente .hide() quelli che non corrispondono ai termini selezionati per il filtro.

15 lug 2014 23:36:01
0

Non è una domanda nuova, tuttavia oggi non siamo più costretti a utilizzare jQuery e WP_Query per far funzionare cose del genere.

Inoltre, nei temi a blocchi di WordPress non possiamo nemmeno utilizzare WP_Query per creare un filtro basato su tassonomie.

Secondo me, dobbiamo utilizzare i seguenti elementi:

  • Il blocco Query Loop (disponibile come parte dell'editor del sito WordPress)
  • Interactivity API (che ci permette di rendere il nostro filtro completamente AJAX)
  • Un blocco filtro per tassonomie (che interagirà sia con Interactivity API che con il blocco Query Loop per filtrare post o tipi di post personalizzati per noi).

Dato che i primi due elementi sono disponibili di default in WordPress al giorno d'oggi, ci serve solo il blocco filtro per tassonomie per farlo funzionare. Consiglio di dare un'occhiata a questo: https://rudrastyh.com/plugins/taxonomy-filter-block.

2 gen 2025 07:59:53