По-умолчанию фильтровать записи можно по датам и рубрикам, а мы будем по произвольным полям. И не только записи, но и страницы, и вообще любые другие 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'];
    
}

На этом все!


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

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

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

*

*

*