WordPress+ACF сортировка и вывод записей с фильтром по произвольным полям

Задача: вывести записи с сортировкой по дате указанной в произвольном поле плагина ACF.

Представим, у вас много записей, каждая запись имеет поле город и например выбор количества комнат.

Добавляем в functions.php темы следующий код:

// array of filters (field key => field name)
$GLOBALS['my_query_filters'] = array(
'field_1' => 'city',
'field_2' => 'bedrooms'
);

// action
add_action('pre_get_posts', 'my_pre_get_posts', 10, 1);

function my_pre_get_posts( $query ) {

// bail early if is in admin
if( is_admin() ) return;

// bail early if not main query
// - allows custom code / plugins to continue working
if( !$query->is_main_query() ) return;

// get meta query
$meta_query = $query->get('meta_query');

// loop over filters
foreach( $GLOBALS['my_query_filters'] as $key => $name ) {

// continue if not found in url
if( empty($_GET[ $name ]) ) {
continue;
}

// get the value for this filter
// eg: http://www.website.com/events?city=melbourne,sydney
$value = explode(',', $_GET[ $name ]);

// append meta query
$meta_query[] = array(
'key' => $name,
'value' => $value,
'compare' => 'IN',
);

}

// update meta query
$query->set('meta_query', $meta_query);

}

Этот фрагмент кода используется в файле шаблона, который отображается на странице архива для вашего типа сообщения.

<div id="archive-filters">
<?php foreach( $GLOBALS['my_query_filters'] as $key => $name ):  // get the field's settings without attempting to load a value
$field = get_field_object($key, false, false); // set value if available
if( isset($_GET[ $name ]) ) {
$field['value'] = explode(',', $_GET[ $name ]);
}// create filter
?>
<div class="filter" data-filter="<?php echo $name; ?>"><?php create_field( $field ); ? ></div>

</div>
<script >
(function($) {
 
 // change
 $('#archive-filters').on('change', 'input[type="checkbox"]', function(){

  // vars
  var url = '<?php echo home_url('property'); ?>';
   args = {};
  
  // loop over filters
  $('#archive-filters .filter').each(function(){
   
   // vars
   var filter = $(this).data('filter'),
    vals = [];
   
   // find checked inputs
   $(this).find('input:checked').each(function(){
 
    vals.push( $(this).val() );
 
   });
   
   // append to args
   args[ filter ] = vals.join(',');
   
  });
  
  // update url
  url += '?';
  
  // loop over args
  $.each(args, function( name, value ){
   
   url += name + '=' + value + '&';
   
  });
  
  // remove last &
  url = url.slice(0, -1);
  
  // reload page
  window.location.replace( url );

 });

})(jQuery);
</script>

Обучающее видео от Эллиота (разработчика ACF), он показывает как просто и быстро делать фильтр записей при помощи плагина:

Код из видео ищите тут — www.advancedcustomfields.com

Поделиться в социальных сетях
ВКонтакте
Facebook
WhatsApp
Telegram
Автор статьи
Метки
Выгодный хостинг
Хостинг Beget

Выгодная партнёрская программа! Верните на свой счёт 20% с любой суммы от оплаты хостинга Beget!

Новое в блоге

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

Смотрите также

Watch now

Написать в мессенджер

Связаться с нами прямо сейчас!