Answer the question
In order to leave comments, you need to log in
Why is admin-ajax throwing a 400 error?
Here is my code on the page.
<?php
$total_rows = count(get_field('review')); # всего изображений
$count = 0; # счётчик
$number = 2; # сколько изображений отображать на каждой странице
?>
<?php
// Если есть вложенные поля (изображения)
if (have_rows('review')) { ?>
<div class="reviews-wrap">
<?php
while (have_rows('review')) {
the_row();
if ($count == $number) {
break; # если показали все изображения, выходим из цикла
} ?>
<div class="reviews-wrap__item">
<div class="head">
<h4 class="name"><?php the_sub_field('name'); ?></h4>
<?php
$image = get_sub_field('logo');
if( !empty( $image ) ): ?>
<div class="image">
<img src="<?php echo esc_url($image['url']); ?>" alt="<?php echo esc_attr($image['alt']); ?>" />
</div>
<?php endif; ?>
</div>
<div class="position"><?php the_sub_field('position'); ?></div>
<div class="quote"><?php the_sub_field('quote'); ?></div>
</div>
<?php
$count++;
} ?>
</div>
<?php } ?>
<div class="o-dark-btn acf-loadmore" onclick="javascript: reviews_show_more();">Load more</div>
<!-- AJAX загрузка -->
<script>
let my_repeater_field_post_id = <?php echo $post-> ID; ?>;
let my_repeater_field_offset = <?php echo $number; ?>;
let my_repeater_field_nonce = '<?php echo wp_create_nonce('my_repeater_field_nonce'); ?>';
let my_repeater_ajax_url = '<?php echo admin_url('admin-ajax.php'); ?>';
let my_repeater_more = true;
function reviews_show_more() {
// делаем AJAX запрос
jQuery.post(my_repeater_ajax_url, {
// AJAX, который мы настроили в PHP
'action': 'reviews_show_more',
'post_id': my_repeater_field_post_id,
'offset': my_repeater_field_offset,
'nonce': my_repeater_field_nonce
}, function (json) {
// добавляем контент в контейнер
// этот идентификатор должен соответствовать контейнеру
// к которому вы хотите добавить контент
jQuery('.reviews-wrap').append(json['content']);
// обновим смещение
my_repeater_field_offset = json['offset'];
// проверим, есть ли еще что загрузить
if (!json['more']) { // если нет, то скроем кнопку загрузки
jQuery('.acf-loadmore').css('display', 'none');
}
}, 'json');
}
</script>
<?php
/**
* ACF AJAX подгрузка
*/
// добавляем action для авторизованных пользователей
add_action('wp_ajax_acf_repeater_show_more', 'reviews_show_more');
// добавляем action для не авторизованных пользователей
add_action('wp_ajax_nopriv_acf_repeater_show_more', 'reviews_show_more');
function reviews_show_more()
{
// валидация Nonce («Одноразовые числа»)
if (!isset($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'my_repeater_field_nonce')) {
exit;
}
// убедимся, что у нас есть другие значения
if (!isset($_POST['post_id']) || !isset($_POST['offset'])) {
return;
}
$show = 3; // по сколько отображать
$start = $_POST['offset'];
$end = $start + $show;
$post_id = $_POST['post_id'];
// используем объектный буфер для захвата вывода html (объектные буферы упрощают работу с кодом)
// в качестве альтернативы вы можете создать переменную вроде $html
// и добавлять содержимое в эту строку
ob_start();
if (have_rows('review', $post_id)) {
$total = count(get_field('review', $post_id));
$count = 0;
while (have_rows('review', $post_id)) {
the_row();
if ($count < $start) {
// продолжаем показывать и увеличивать счётчик
$count++;
continue;
}
?>
<div class="reviews-wrap__item">
<div class="head">
<h4 class="name"><?php the_sub_field('name'); ?></h4>
<?php
$image = get_sub_field('logo');
if( !empty( $image ) ): ?>
<div class="image">
<img src="<?php echo esc_url($image['url']); ?>" alt="<?php echo esc_attr($image['alt']); ?>" />
</div>
<?php endif; ?>
</div>
<div class="position"><?php the_sub_field('position'); ?></div>
<div class="quote"><?php the_sub_field('quote'); ?></div>
</div>
<?php
$count++;
if ($count == $end) {
break; # если показали все строки повторителя, выходим из цикла
}
}
}
$content = ob_get_clean();
// проверим, показали ли мы последний элемент
$more = false;
if ($total > $count) {
$more = true;
}
// выводим наши 3 значения в виде массива в кодировке json
echo json_encode(array('content' => $content, 'more' => $more, 'offset' => $end));
exit;
}
jQuery.post(my_repeater_ajax_url, {
<div class="o-dark-btn acf-loadmore" onclick="javascript: reviews_show_more();">Load more</div>
Answer the question
In order to leave comments, you need to log in
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question