Добрый день!
У меня есть кастомный тип записей (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()` для очистки входящих данных.
<blockquote><pre><code class="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></code></pre></blockquote> <br/> <br/> Тут не ясно что в $filtersData, зачем два admin-ajax.php и почему все data-атрибуты пустые. Js обработчика в вашем вопросе вообще нет <br/> <br/> У меня так работает, в html формируются параметры текущего запроса из <b>$wp_query->query</b> <br/> <br/> <pre><code class="php">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 );</code></pre> <br/> <br/> Это шаблон клика в js, данные подтягиваются из ajax_obj.query, их же можно отредактировать на фильтре <code>ajax_localize_params</code> в php <br/> <br/> <pre><code class="javascript">$( '#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();
} );</code></pre>