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