Обзор
Этот видеоурок познакомит с основами создания архива WP, который выводит записи, отфильтрованные по пользовательскому полю с чекбоксами. Сначала посмотрите видео, а затем используйте код ниже, чтобы быстро начать свой проект!
Использование
Этот фрагмент кода размещается в файле functions.php и изменяет аргументы WP_Query на основе доступных параметров $_GET.
functions.php
// массив фильтров (ключ поля => имя поля)
$GLOBALS['my_query_filters'] = array(
'field_1' => 'city',
'field_2' => 'bedrooms'
);
// хук
add_action('pre_get_posts', 'my_pre_get_posts', 10, 1);
function my_pre_get_posts( $query ) {
// преждевременно выходим, если это админка
if( is_admin() ) return;
// преждевременно выходим, если это не главный запрос
// - позволяет пользовательскому коду / плагинам продолжать работу
if( !$query->is_main_query() ) return;
// получаем meta_query
$meta_query = $query->get('meta_query');
// перебираем фильтры
foreach( $GLOBALS['my_query_filters'] as $key => $name ) {
// пропустить, если не найдено в URL
if( empty($_GET[ $name ]) ) {
continue;
}
// получаем значение для этого фильтра
// например: http://www.website.com/events?city=melbourne,sydney
$value = explode(',', $_GET[ $name ]);
// добавляем meta_query
$meta_query[] = array(
'key' => $name,
'value' => $value,
'compare' => 'IN',
);
}
// обновляем meta_query
$query->set('meta_query', $meta_query);
}Этот фрагмент кода используется в файле шаблона, который выводится на странице архива для вашего типа записи.
archive-property.php
<div id="archive-filters">
<?php foreach( $GLOBALS['my_query_filters'] as $key => $name ):
// получаем настройки поля, не пытаясь загрузить значение
$field = get_field_object($key, false, false);
// устанавливаем значение, если оно доступно
if( isset($_GET[ $name ]) ) {
$field['value'] = explode(',', $_GET[ $name ]);
}
// создаем фильтр
?>
<div class="filter" data-filter="<?php echo $name; ?>">
<?php create_field( $field ); ?>
</div>
<?php endforeach; ?>
</div>
<script type="text/javascript">
(function($) {
// изменение
$('#archive-filters').on('change', 'input[type="checkbox"]', function(){
// переменные
var url = '<?php echo home_url('property'); ?>';
args = {};
// перебираем фильтры
$('#archive-filters .filter').each(function(){
// переменные
var filter = $(this).data('filter'),
vals = [];
// находим отмеченные элементы input
$(this).find('input:checked').each(function(){
vals.push( $(this).val() );
});
// добавляем в args
args[ filter ] = vals.join(',');
});
// обновляем URL
url += '?';
// перебираем args
$.each(args, function( name, value ){
url += name + '=' + value + '&';
});
// удаляем последний &
url = url.slice(0, -1);
// перезагружаем страницу
window.location.replace( url );
});
})(jQuery);
</script>Обновлено: 01.06.2026