Как можно получить URL или ID поста в WordPress из файла functions.php, когда страница обрабатывается через AJAX?

Добрый день! 

У меня есть кастомный тип записей (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>Измените параметры и&nbsp;попробуйте снова</p>', 'total_posts' => 0, 'get' => $rooms]);
}
```

Затем идет шаблон самой карточки. Как мне правильно реализовать передачу параметров через дополнительные поля новой страницы для фильтрации карточек?
  • 17 апреля 2025 г. 9:45
Ответы на вопрос 2
Чтобы передать параметры через дополнительные поля новой страницы и использовать их для фильтрации карточек в 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();
} );
Похожие вопросы