Задать вопрос
@podkudahka
крутой

Почему admin-ajax выдает ошибку 400?

Вот мой код на странице.
<?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>

вот в functions.php
<?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>
  • Вопрос задан
  • 91 просмотр
Подписаться 1 Простой 2 комментария
Решения вопроса 1
@its2easyy
Если
add_action('wp_ajax_acf_repeater_show_more', 'reviews_show_more');
то action в js должен быть acf_repeater_show_more, а не reviews_show_more
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы