Как фильтровать пользовательские типы сообщений по таксономии с помощью флажков?

avatar
qb1234
9 августа 2021 в 00:30
266
2
0

Я пытаюсь отфильтровать свои сообщения из пользовательского типа сообщений, который называется «курсы». Я создал пользовательскую таксономию под названием «course_types», которая имеет 2 термина; «Групповые курсы» и «Отдельные курсы». У меня есть форма с флажками, с помощью которой я хотел бы фильтровать пользовательские сообщения и использовать различные комбинации операторов tax_query («И, ИЛИ, НЕ В и т. д.»), но я не могу достичь ожидаемых результатов. . Любая помощь по этому вопросу будет принята с благодарностью. Спасибо, ребята.

Запрос

<?php
$args = 
    array(
        'post_type' => 'courses',
        'tax_query' => array(
            array(
                'taxonomy' => 'course_types',
                'field' => 'term_id',
                'terms' => $_GET['course_types'],
            ),
            'relation' => 'AND',
        ),
    )

 ?>

Форма с флажками

 <form method="GET">
  <?php $terms = get_terms( array(
    'taxonomy' => 'course_types',
    'hide_empty' => false,
  ) 
);
 foreach($terms as $term) {
     echo '<label><input type="checkbox" name="course_types[]" value="' . $term->name 
.'">' . $term->name . '</label>';
} ?>
<input type="submit" value="Filter">

</form>


<?php

Результаты

$the_query = new WP_Query( $args );

// The Loop
if ( $the_query->have_posts() ) {
while ( $the_query->have_posts() ) {
    $the_query->the_post();
    get_template_part( 'template-parts/content', 'courses' );
}
} else {
// no posts found
}
/* Restore original Post Data */
wp_reset_postdata();
                        
?>  

example screenshot

Источник

Ответы (2)

avatar
Fernanda Correa
16 марта 2022 в 22:01
0

Запрос должен содержать условие, если оно не отфильтровано. Я использовал троицу.

<?php
$terms = get_terms( 'course_types' ); 
$term_ids = wp_list_pluck( $terms, 'term_id' );
$args = 
array(
    'post_type' => 'courses',
    'tax_query' => array(
        array(
            'taxonomy' => 'course_types',
            'field' => 'term_id',
            'terms' => $_GET ? $_GET['course_types'] : $term_ids,
        ),
        'relation' => 'AND',
    ),
);

?>
avatar
qb1234
9 августа 2021 в 03:36
0

Оказалось, что проблема заключалась в том, что форма возвращала имя ("Отдельные курсы" и "Комплектные курсы"), но запрос ожидал term_id.

Исправленный код

<form method="GET">
<?php $terms = get_terms( array(
    'taxonomy' => 'course_types',
    'hide_empty' => false,
) );
foreach($terms as $term) {
     echo '<label><input type="checkbox" name="course_types[]" value="' 
. $term->term_id .'">' . $term->name . '</label>';
} ?>
<input type="submit" value="Filter">
</form>