V
V
Vasily Khryagin2021-02-16 10:08:37
AJAX
Vasily Khryagin, 2021-02-16 10:08:37

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>

here in 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;
}

and in the console it swears at this line
jQuery.post(my_repeater_ajax_url, {
and this
<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

1 answer(s)
I
its2easyy, 2021-02-16
@podkudahka

If a

add_action('wp_ajax_acf_repeater_show_more', 'reviews_show_more');
then the action in js should be acf_repeater_show_more and not reviews_show_more

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question