Добрый день! У меня есть кастомный тип записей (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(); } );