Filtrarea articolelor după mai multe taxonomii
Am o pagină pe care doresc să afișez toate postările unui tip personalizat de postare, să-i spunem "persoane". Vreau să permit utilizatorului să filtreze toate persoanele după mai multe (!) taxonomii: vârstă, oraș, profesie, nivel de experiență. Cea mai bună metodă ar fi prin selectarea casetelor de bifare și obținerea rezultatelor imediat prin Ajax fără reîncărcarea paginii.
Cred că acesta este un lucru pe care mulți dezvoltatori WordPress îl doresc să realizeze. Din păcate, nu am găsit niciun tutorial potrivit pentru a realiza acest lucru. Dar trebuie să fie ceva simplu pentru dezvoltatorii experimentați WordPress...
Poate cineva să ofere un șablon de cod pentru cum să construiești o pagină de filtrare pentru tipul de postare personalizat descris mai sus?
Știu deja cum să filtrez postările după o singură taxonomie, folosind jQuery. Acesta este codul pe care l-am folosit până acum:
<!-- ȘABLON DE PAGINĂ PENTRU AFIȘAREA TUTUROR POSTĂRILOR DE TIPUL "PERSOANE" -->
<!-- LISTA TUTUROR INTRĂRILOR DIN TAXONOMIA "ORASE" -->
<div class="orase">
<a href="#" id="toate">Toate orașele</a>
<?php
// Obține toți termenii unei taxonomii
$taxonomy = 'orase';
$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>
<!-- AFIȘAREA PERSOANELOR -->
<div class="prezentare_generala_persoane">
<?php
$args= array(
'post_type' => 'persoane',
'post_status' => 'publish',
'meta_key' => 'cod_postal',
'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);
?>
<!-- afișează valoarea taxonomiei selectate în clasa div-ului persoană -->
<div class="persoana <?php echo $post_terms_space_separated; ?>">
<!-- descrierea persoanei -->
</div>
<?php endwhile; endif; wp_reset_query(); ?>
</div>
<!-- JQUERY PENTRU FILTRAREA PERSOANELOR DUPĂ TAXONOMIA "ORAS" -->
<script>
jQuery(document).ready(function() {
// Click pe un oraș
jQuery('a[data-target]').click(function() {
jQuery('.persoana').show().not('.' + this.dataset.target).hide();
});
// Click pe "Toate orașele"
jQuery('#toate').click(function(e) {
e.preventDefault();
jQuery('.persoana').show();
});
});
</script>
Acest cod funcționează perfect. Dar noua mea provocare este filtrarea persoanelor după mai multe taxonomii - nu doar după oraș, ci și după vârstă, profesie și nivel de experiență. Cum trebuie să modific codul meu pentru a realiza acest lucru? Implementarea prin Ajax ar fi metoda preferabilă, desigur.
În primul rând, ar trebui să folosești WP_Query în loc de query_posts.
Consultă parametrii de Taxonomy Parameters.
Mai ales tax_query
și relation
.
// Repostare din linkul de mai sus
$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'
)
)
);
SAU, dacă preferi să o declari mai târziu, în interiorul loop-ului, verifică array_key_exists. Ai putea rula loop-ul din nou, dar de data aceasta verificând fiecare post pentru termenii potriviți.
// NU MAI FUNCȚIONEAZĂ, WORDPRESS A MODIFICAT STRUCTURA ARRAY-ULUI 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') ) ) {
// afișează postul
} */
SAU, ai putea face totul în jQuery (de exemplu) dacă deja încarci toate postările pe pagină. Ai putea afișa atribute data
pentru fiecare post, conținând termenii cu care sunt etichetate.
<!-- De exemplu // Unde 111 și 222 se referă la id-ul termenului -->
<div class="person" data-age="id111" data-city="id222"></div>
Și apoi pur și simplu .hide()
pentru cele care nu se potrivesc cu termenii selectați pentru filtrare.

Nu este o întrebare nouă, totuși, astăzi nu suntem obligați să folosim jQuery și WP_Query
pentru a face astfel de lucruri să funcționeze.
Mai mult decât atât, în temele WordPress Block nu putem nici măcar folosi WP_Query
pentru a crea un filtru după taxonomii.
În opinia mea, trebuie să folosim următoarele:
- Blocul Query Loop (disponibil ca parte a editorului de site WordPress)
- Interactivity API (care ne permite să facem filtrul nostru complet AJAX)
- Un bloc de filtrare după taxonomii (care va interacționa atât cu Interactivity API, cât și cu blocul Query Loop și va filtra postările sau tipurile de postări personalizate pentru noi).
Deoarece primele două lucruri sunt disponibile în WordPress în mod implicit în zilele noastre, avem nevoie doar de blocul de filtrare după taxonomii pentru a-l face să funcționeze. Aș recomanda să aruncați o privire la acesta: https://rudrastyh.com/plugins/taxonomy-filter-block.
