Как сделать фильтр по произвольным таксономиям в wordpress?

Пользователь

от enid , в категории: PHP , 9 месяцев назад

Как сделать фильтр по произвольным таксономиям в wordpress?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от nicolette.stoltenberg , 9 месяцев назад

@enid 

Для создания фильтра по произвольным таксономиям в WordPress необходимо выполнить следующие шаги:

  1. Создать произвольную таксономию с помощью функции register_taxonomy(). Пример:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
function custom_taxonomy() {
  $labels = array(
    'name' => 'Custom Taxonomy',
    'singular_name' => 'Custom Taxonomy',
  );
 
  $args = array(
    'labels'            => $labels,
    'public'            => true,
    'show_admin_column' => true,
    'hierarchical'      => true,
    'show_in_rest'      => true,
  );
 
  register_taxonomy( 'custom_taxonomy', array( 'post' ), $args );
}
add_action( 'init', 'custom_taxonomy' );


  1. Создать форму для выбора терминов таксономии с помощью функции wp_dropdown_categories(). Пример:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<form action="<?php echo esc_url( home_url( '/' ) ); ?>" method="get">
  <select name="custom_taxonomy">
    <option value="">All</option>
    <?php 
    $terms = get_terms( array(
      'taxonomy' => 'custom_taxonomy',
      'hide_empty' => false,
    ) );
    foreach ( $terms as $term ) {
      $selected = ( $_GET['custom_taxonomy'] == $term->slug ) ? 'selected' : '';
      echo '<option value="' . $term->slug . '" ' . $selected . '>' . $term->name . '</option>';
    }
    ?>
  </select>
  <input type="submit" value="Filter">
</form>


  1. Вывести отфильтрованные записи на странице с помощью функции WP_Query(). Пример:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$args = array(
  'post_type' => 'post',
);
 
if ( isset( $_GET['custom_taxonomy'] ) && ! empty( $_GET['custom_taxonomy'] ) ) {
  $args['tax_query'] = array(
    array(
      'taxonomy' => 'custom_taxonomy',
      'field' => 'slug',
      'terms' => $_GET['custom_taxonomy'],
    )
  );
}
 
$query = new WP_Query( $args );
 
if ( $query->have_posts() ) {
  while ( $query->have_posts() ) {
    $query->the_post();
    // вывод постов
  }
  wp_reset_postdata();
} else {
  // сообщение об отсутствии постов
}