Не выводятся ACF поля через Ajax WordPress

Переменная $pvar выводится и меняется при выборе option в списке select - это работает. Но мне ещё нужно вывести значения всех ACF полей что у меня в functions.php - они не выводятся. При выборе в селекте нужно выводить всё из полей.

То что у меня в functions.php:

     add_action('wp_ajax_nopriv_ajax_slide','ajax_slide');
      add_action('wp_ajax_ajax_slide','ajax_slide');
        
         function ajax_slide(){ 
     $pvar = $_POST['hash'];
      echo  $pvar;
        ?>
        
        <?php if( have_rows('dobavit_punkt')): ?>
 <?php  
$field = get_sub_field_object( 'vybor_napravleniya');
$value = $field['value'];
  
    if($value ==  $pvar):  ?>
        <?php while ( have_rows('dobavit_punkt') ) : the_row(); ?> 
        <div> // тут поля </div>
        <?php endwhile; ?>
        <?php endif; ?>
         <?php endif; ?>
        <?php
        wp_die();
        }

Мой скрипт ajax-script.js:


 jQuery(document).ready(function($){ 
    
    $("select#selectedop").on( "change", function() {
        let thisselval =  $(this).val();
        
        $.ajax({
        type:"POST",
        url: my_ajax_name.ajax_url,
        data:{  
        'action':'ajax_slide',
        'hash': thisselval
        }, success: function (data){ //received content
            $(".wr").empty();
            $(".wr").append(data);
             
        } });
        
        });
    });

Я его локализовал в functions.php:

wp_enqueue_script( 'service-ajax', get_template_directory_uri() . '/app/js/ajax-script.js', array( 'jquery' ), '0.0.2', true );
wp_localize_script( 'service-ajax', 'my_ajax_name', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );

Ответы (1 шт):

Автор решения: Viktor

Ваша проблема может быть связана с тем, что вы пытаетесь использовать функции ACF вне основного цикла WordPress или вне контекста, где эти функции могут работать.

В частности, функции have_rows и get_sub_field_object могут не работать корректно в контексте AJAX-запроса, если они не настроены правильно.

Вот несколько шагов, которые могут помочь вам решить проблему:

  • Проверка контекста вызова ACF функций:
    Убедитесь, что вы вызываете функции ACF в правильном контексте. Например, если вы используете have_rows и get_sub_field_object, убедитесь, что они вызываются в контексте поста, который содержит эти поля.

  • Передача ID поста:
    Если ваши ACF поля привязаны к определенному посту, вам нужно передать ID этого поста в AJAX-запрос и использовать его в функции обработки AJAX.

  • Использование функции get_field:
    Если ваши поля не являются повторяющимися (repeater), вы можете использовать функцию get_field для получения значений полей.

Вот пример того, как можно изменить ваш код, чтобы он работал корректно:

add_action('wp_ajax_nopriv_ajax_slide', 'ajax_slide');
add_action('wp_ajax_ajax_slide', 'ajax_slide');

function ajax_slide() {
    $pvar = $_POST['hash'];
    $post_id = $_POST['post_id']; // Передайте ID поста

    echo $pvar;

    if (have_rows('dobavit_punkt', $post_id)) :
        $field = get_sub_field_object('vybor_napravleniya', $post_id);
        $value = $field['value'];

        if ($value == $pvar) :
            while (have_rows('dobavit_punkt', $post_id)) : the_row();
                ?>
                <div> // тут поля </div>
                <?php
            endwhile;
        endif;
    endif;

    wp_die();
}

И в вашем JavaScript коде:

jQuery(document).ready(function($) {
    $("select#selectedop").on("change", function() {
        let thisselval = $(this).val();
        let post_id = $(this).data('post-id'); // Передайте ID поста

        $.ajax({
            type: "POST",
            url: my_ajax_name.ajax_url,
            data: {
                'action': 'ajax_slide',
                'hash': thisselval,
                'post_id': post_id
            },
            success: function(data) { // received content
                $(".wr").empty();
                $(".wr").append(data);
            }
        });
    });
});

И не забудьте добавить атрибут data-post-id к вашему элементу select:

<select id="selectedop" data-post-id="<?php echo get_the_ID(); ?>">
    <!-- Ваши опции -->
</select>
→ Ссылка