По-умолчанию фильтровать записи можно по датам и рубрикам, а мы будем по произвольным полям. И не только записи, но и страницы, и вообще любые другие post_type.

Допустим, у нас есть продукты post_type product. Нам нужно их фильтровать в административном разделе сайта по статусу (произвольное поле status), которое имеет два значения: «в наличии» (значение in_stock) и «продано» (значение sold).

Правки вносим в functions.php файл темы. Для этого он и существует.

<?php
/*  Добавляем нижеописаную функцию к хуку restrict_manage_posts */
add_action( 'restrict_manage_posts', 'custom_restrict_manage_posts__show_field' );

/*  Описание функции, которая выводит в админке поле  */
function custom_restrict_manage_posts__show_field() {

  /*  post_type по-умолчанию или из GET */ 
  $type = 'post';
  if (isset($_GET['post_type'])) 
    $type = $_GET['post_type'];

  /*  Если post_type "product" */
  if ($type == 'product'): 

    /*  Указываем значения для выпадающего списка */
    $values = array(
      'В наличии' => 'in_stock', 
      'Продано'   => 'sold',
    ); ?>
    <select name="status">
      <option value="">Все статусы</option>
      <?php 
        $current_v = isset($_GET['status'])? $_GET['status']:''; 
        foreach ($values as $label => $value) :
        printf
          (
            '<option value="%s"%s>%s</option>',
            $value,
            $value == $current_v ? ' selected="selected"':'',
            $label
          );
        endforeach;
      ?>
    </select>
  <?php 
  endif; 
} 

/*  Добавляем нижеописаную функцию к хуку parse_query */
add_filter( 'parse_query', 'custom_posts_filter' ); 

/*  Описание функции, которая фильтрует данные   */ 
function custom_posts_filter( $query ) { 
    
  global $pagenow; 
  $type = 'post'; 

  if (isset($_GET['post_type'])) 
    $type = $_GET['post_type']; 
  
  $query->query_vars['meta_value'] = $_GET['status'];
    
}

На этом все!


Комментариев нет

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*

*

*