Добрый день!
У меня есть кастомный тип записей (post type) с карточками, которые загружаются с помощью AJAX и фильтруются через GET-запросы. Теперь стоит задача перевести несколько из этих фильтров в SEO-дружественные URL. Я создал отдельную страницу и подключил необходимый шаблон, на котором планирую передать параметры через дополнительные поля этой новой страницы и отсортировать результат в цикле.
В самом шаблоне у меня реализовано следующее:
```html
<script>
let baseFilterData = JSON.parse('<?= json_encode($filtersData); ?>');
let ajaxFilterUrl = '<?= admin_url('admin-ajax.php?action=filter_apartments&'); ?>';
let ajaxUrl = '<?= admin_url('admin-ajax.php'); ?>';
</script>
<div class="load" data-obj-city-str="" data-max-page="" data-ajax-url="" data-current-page="1">
/* контейнер куда генерятся карточки */
</div>
```
В файле function.php для обработки запроса написано так:
```php
$my_posts = new WP_Query($args);
$total_posts = $my_posts->found_posts;
$max_pages = $my_posts->max_num_pages;
if ($my_posts->have_posts()) {
ob_start();
while ($my_posts->have_posts()) {
$my_posts->the_post();
get_template_part('template-parts/apart-list-item', null, []);
}
$content = ob_get_clean();
wp_send_json_success(['content' => $content, 'total_posts' => $total_posts, 'max_pages' => $max_pages, 'get' => $rooms]);
} else {
wp_send_json_success(['content' => '<p class="not-found">По заданным параметрам ничего нет.<br>Измените параметры и попробуйте снова</p>', 'total_posts' => 0, 'get' => $rooms]);
}
```
Затем идет шаблон самой карточки. Как мне правильно реализовать передачу параметров через дополнительные поля новой страницы для фильтрации карточек?
Чтобы передать параметры через дополнительные поля новой страницы и использовать их для фильтрации карточек в WordPress, вам нужно выполнить следующие шаги:
1. **Создание новых полей**: Используйте (например) ACF (Advanced Custom Fields) для создания пользовательских полей на вашей странице с фильтром. Эти поля могут содержать значения фильтров, которые вы хотите использовать при загрузке карточек.
2. **Получение данных из полей на странице**: В вашем шаблоне, вы можете получить значения этих полей. Примером будет следующий код в вашем шаблоне:
```php
$filter_field_1 = get_field('filter_field_1'); // замените "filter_field_1" на ключ вашего поля
$filter_field_2 = get_field('filter_field_2'); // замените "filter_field_2" на ключ вашего поля
```
Вы можете передать эти значения в JavaScript, аналогично тому, как вы это делаете сейчас, с использованием `json_encode`.
3. **Передача параметров в AJAX запросе**: В вашем JavaScript коде вы добавляете динамически данные как параметры к URL вашего AJAX запроса. Например:
```html
<script>
let baseFilterData = JSON.parse('<?= json_encode($filtersData); ?>');
let ajaxFilterUrl = '<?= admin_url('admin-ajax.php?action=filter_apartments&filter_1=' . urlencode($filter_field_1) . '&filter_2=' . urlencode($filter_field_2)); ?>';
let ajaxUrl = '<?= admin_url('admin-ajax.php'); ?>';
</script>
```
4. **Обработка AJAX запроса в `functions.php`**: В функции, которая обрабатывает ваш AJAX запрос, получите фильтры через `$_GET` или `$_POST`:
```php
add_action('wp_ajax_filter_apartments', 'my_filter_apartments');
add_action('wp_ajax_nopriv_filter_apartments', 'my_filter_apartments');
function my_filter_apartments() {
$filter_1 = isset($_GET['filter_1']) ? sanitize_text_field($_GET['filter_1']) : '';
$filter_2 = isset($_GET['filter_2']) ? sanitize_text_field($_GET['filter_2']) : '';
$args = array(
'post_type' => 'your_custom_post_type',
'meta_query' => array(
array(
'key' => 'your_meta_key_1',
'value' => $filter_1,
'compare' => '='
),
array(
'key' => 'your_meta_key_2',
'value' => $filter_2,
'compare' => '='
),
)
);
// Запрос и получение постов
$my_posts = new WP_Query($args);
// Остальной код обработки запроса...
}
```
5. **Рендер карточек**: Используйте `get_template_part()` для отображения карточек, как вы это делали.
Это основные шаги, которые вам нужно пройти, чтобы получить фильтры из пользовательских полей, передать их в AJAX запрос и обработать их на стороне сервера. Не забывайте обеспечивать безопасность, например, используя функцию `sanitize_text_field()` для очистки входящих данных.
<script> let baseFilterData = JSON.parse('<?= json_encode($filtersData); ?>'); let ajaxFilterUrl = '<?= admin_url('admin-ajax.php?action=filter_apartments&'); ?>'; let ajaxUrl = '<?= admin_url('admin-ajax.php'); ?>'; </script> <div class="load" data-obj-city-str="" data-max-page="" data-ajax-url="" data-current-page="1"> /* контейнер куда генерятся карточки */ </div>
Тут не ясно что в $filtersData, зачем два admin-ajax.php и почему все data-атрибуты пустые. Js обработчика в вашем вопросе вообще нет
У меня так работает, в html формируются параметры текущего запроса из $wp_query->query
global $wp_query; // Parameters for the ajax handler. $ajax_localize = array( 'url' => admin_url( 'admin-ajax.php' ), 'query' => $wp_query->query, 'lang' => determine_locale(), 'nonce' => wp_create_nonce( 'ajax-nonce' ), ); $ajax_localize = apply_filters( 'ajax_localize_params', $ajax_localize ); wp_localize_script( 'jquery', 'ajax_obj', $ajax_localize );
Это шаблон клика в js, данные подтягиваются из ajax_obj.query, их же можно отредактировать на фильтреajax_localize_paramsв php
$( '#primary' ).on( 'click', '.loadmore', function( e ) { $.ajax( { url: ajax_obj.url, // Ajax url from function ajax_localize_params(). type:'POST', data: { 'action': 'loadmore_handler', // Handler name. 'query': ajax_obj.query, // Query from function ajax_localize_params(). }, beforeSend: function() { }, complete: function() { }, success:function( response ) { } } ); e.preventDefault(); } );