Вопрос или проблема
У меня есть настраиваемый WP_query, который очень просто фильтрует настраиваемый тип записи:
<?php $query = new WP_Query(
array(
'post_type' => 'professionals',
'search_filter_id' => '204'
) );
?>
и вывод выглядит следующим образом:
<div id="results">
<?php if ( $query->have_posts() ) : ?>
<?php while ( $query->have_posts() ) : $query->the_post(); ?>
<div class="col-md-3">
<div class="flip-container" ontouchstart="this.classList.toggle('hover');">
<div class="flipper">
<div class="front">
<img src="https://wordpress.stackexchange.com/questions/311308/<?php the_field(thumbnail_image);?>">
</div>
<div class="back">
<h2><?php the_title(); ?></h2>
<h4 class="flip-bottom"><?php the_field('position'); ?><br><?php the_field('telephone'); ?></h4>
</div>
</div>
</div>
<div class="pro-meta"><?php the_title(); ?><br>
<?php the_field('position'); ?></div>
</div>
<?php endwhile; wp_reset_postdata(); ?>
<?php else : ?>
No results
<?php endif; ?>
</div>
Это выводится точно так, как я хотел (есть анимация переворота при наведении, но не обращайте внимания на это!).
Затем я использую Search and Filter Pro, чтобы добавить выпадающие фильтры для некоторых настраиваемых полей: практика, должность и юридическая школа. Эти поля добавляются к типу записи через Advanced Custom Fields Pro.
Это обновляет WP_Query через ajax, обновляя результаты контейнера #results. Это тоже работает хорошо.
Однако я также хочу фильтровать запрос по первой букве настраиваемого поля. Я прикрепил скриншот фильтра, который хочу закодировать…
Фактически, это все буквы алфавита, и при нажатии на одну из этих букв WP_Query обновляется, чтобы фильтровать результаты (с помощью Ajax) и показывать только те, у кого первая буква их фамилии совпадает. Так что если я нажму “D”, я увижу результаты для тех, у кого фамилия начинается с D. “Фамилия” также является настраиваемым полем в типе записи.
Я не думаю, что это возможно в рамках плагина Search and Filter Pro (?), поэтому, скорее всего, ищу решение, которое будет закодировано в архивный файл postype.php, но которое всё же работает с существующими фильтрами плагинов!
Спасибо 🙂
Если Search and Filter Pro не помогает с этим сразу, то потребуется больше усилий, чтобы это достичь.
Что бы я сделал:
Переместите запрос в отдельную функцию, которая останется в файле functions.php. Она будет возвращать результаты запроса (пример ниже).
function theme_prefix_return_professionals($type="professionals", $fid = '204') {
$letter="";
$post_type = $type;
$filter_id = $fid;
$args = array(
'post_type' => $post_type,
'post_status' => 'publish',
'search_filter_id' => $filter_id
);
$query = new WP_Query($args);
return $query;
}
Подключите эту функцию в ajax_priv и ajax_no_priv.
Создайте jQuery-функцию, которая срабатывает при щелчке по буквам и передает букву в функцию (функцию нужно будет расширить для этого, также используйте некоторые лучшие практики, такие как проверка nonce и так далее).
Когда действие запускается с помощью jQuery, мы добавляем новый параметр в $args, так что функция расширится до следующего:
function theme_prefix_return_professionals($type="professionals", $fid = '204') {
$letter="";
$post_type = $type;
$filter_id = $fid;
$args = array(
'post_type' => $post_type,
'post_status' => 'publish',
'search_filter_id' => $filter_id
);
if ($_POST['letter']) {
$letterVal="^" . $_POST['letter'];
$args['meta_query'][] = array(
'key' => 'proffesional_surename',
'value' => $letterVal,
'compare' => 'REGEXP',
);
}
$query = new WP_Query($args);
return $query;
}
Затем мы обновляем div с возвращенными данными запроса (наиболее вероятно, возвращёнными как JSON).
Здесь гораздо больше работы, таких как соображения безопасности (экранирование значений, добавление и проверка nonce, возвращение JSON), но это потребует от меня решить проблему за вас и потратить на это целый час.
Надеюсь, я помог вам разобраться с этим самостоятельно и дал вам представление о том, как к этому подойти.
Ответ или решение
Чтобы реализовать фильтрацию WP_Query по первой букве пользовательского поля, при этом используя возможности Search and Filter Pro, потребуется несколько шагов. Давайте рассмотрим, как можно этого достичь, учитывая предоставленные вами требования.
Проблема
Вы хотите фильтровать результаты по первой букве фамилии, указанной в пользовательском поле surname
, при помощи AJAX, чтобы список обновлялся динамически. Это потребует небольшого вмешательства в код WordPress.
Решение
-
Создание Функции Обработки Запроса
Начнем с переноса WP_Query в отдельную функцию в файле
functions.php
. Эта функция будет у нас обрабатывать запросы и возвращать результаты:function theme_prefix_return_professionals($type="professionals", $fid = '204') { $post_type = $type; $filter_id = $fid; $args = array( 'post_type' => $post_type, 'post_status' => 'publish', 'search_filter_id' => $filter_id ); if (isset($_POST['letter'])) { $letterVal="^" . sanitize_text_field($_POST['letter']); $args['meta_query'] = array( array( 'key' => 'surname', 'value' => $letterVal, 'compare' => 'REGEXP', ), ); } $query = new WP_Query($args); return $query; }
Обратите внимание на защиту данных пользователя с помощью
sanitize_text_field
для дополнительной безопасности. -
Аякс-Обработчики
Нужно создать обработчики для AJAX-запросов. Добавьте эти действия в
functions.php
:add_action('wp_ajax_filter_by_letter', 'filter_by_letter_callback'); add_action('wp_ajax_nopriv_filter_by_letter', 'filter_by_letter_callback'); function filter_by_letter_callback() { $query = theme_prefix_return_professionals(); if ($query->have_posts()) { while ($query->have_posts()) : $query->the_post(); // Формат вывода поста echo '<div>' . get_the_title() . '</div>'; endwhile; wp_reset_postdata(); } else { echo 'No results'; } wp_die(); }
-
JavaScript для Аякс-Запросов
Добавьте следующий JavaScript в ваш шаблон, чтобы обработка кликов для букв:
<script> jQuery(document).ready(function($) { $('.letter-filter').on('click', function(e) { e.preventDefault(); var letter = $(this).text(); $.ajax({ url: '<?php echo admin_url('admin-ajax.php'); ?>', type: 'POST', data: { action: 'filter_by_letter', letter: letter }, success: function(data) { $('#results').html(data); } }); }); }); </script>
Убедитесь в том, что элементы с классом
letter-filter
являются кнопками или ссылками, которые пользователь будет использовать для выбора буквы.
Заключение
С помощью приведенных выше настроек вы можете эффективно осуществлять фильтрацию вашей пользовательской WP_Query по первой букве заданного поля. Это не только обеспечит функциональность, которую вы ищете, но и улучшит взаимодействие пользователей с вашим сайтом благодаря интерактивным фильтрам.
Эти шаги требуют знания PHP, JavaScript и использования AJAX в WordPress. Убедитесь, что после реализации вы также протестируете функциональность на наличие ошибок и убедитесь, что все работает должным образом.