Вызов Ajax из плагина с использованием класса

Вопрос или проблема

Я создаю плагин с классом и методами.

Этот класс вызывается через тему (жестко закодирован) для подключения и локализации моего JavaScript. Он также подготавливает его для AJAX. Однако я продолжаю получать ОШИБКА: 400

POST http://www.devsite.local/wp-admin/admin-ajax.php 400 (Неверный запрос)

Я запускал AJAX вне класса в нескольких плагинах и в файле functions.php без проблем, но не могу заставить его работать внутри класса.

Вот мой код:

class CCYTFeatured {
public function __construct(){
        $this->cc_yt_scripts();
        add_action( 'wp_enqueue_scripts', array($this, 'cc_yt_scripts' ));

        add_action( 'wp_ajax_cc_yt_featured', array( $this, 'cc_yt_featured' ) );
        add_action( 'wp_ajax_nopriv_cc_yt_featured', array( $this, 'cc_yt_featured' ) );

}
// Загружаем CSS И JAVA ДЛЯ ФРОНТЕНДА
public function cc_yt_scripts() {
    wp_register_style( 'cc_yt_style',
        plugins_url( '/css/cc_yt.css', __FILE__ ),
        array(),
        cc_yt_version()
        );
    wp_enqueue_style('cc_yt_style');

    // JAVASCRIPT
    wp_register_script( 'cc_yt_javascript',
        plugins_url( '/js/cc_yt.js', __FILE__ ),
        array('jquery'),
        cc_yt_version(),
        true
    );
    wp_enqueue_script('cc_yt_javascript');
    wp_localize_script(
        'cc_yt_javascript',
        'cc_yt_script',
        array(
            'ajaxurl'   => admin_url( 'admin-ajax.php' , __FILE__ ),
            'ajax_nonce' => wp_create_nonce('my_nonce'),
        )
    );
}
public function cc_yt_featured(){

    check_ajax_referer( 'my_nonce', 'security' );
    echo json_encode('Я ЗДЕСЬ, ВЫ МОЖЕТЕ НАС НАЙТИ');
}
}

Вот мой вызов AJAX на JavaScript:

jQuery.ajax({
    url: cc_yt_script.ajaxurl,
    type : 'POST',
    data: {
        action : 'cc_yt_featured',
        security: cc_yt_script.ajax_nonce,
        post: 'бананы',
    },
    success: function(response) {
        console.log('ЭТО ОТВЕТ:  '+ response);
    }
});

Я продолжаю получать ту же ошибку, не могу понять, что не так с моим классом:

Вот как я его вызываю.

$cc_yt = new CCYTFeatured;

Я жестко закодировал этот вызов внутри файла темы. Это успешно подключает стили и скрипты.

Запрос AJAX выглядит следующим образом:

http://www.devsite.local/wp-admin/admin-ajax.php?action=cc_yt_featured&security=79e39910b8&post=бананы

Кто-нибудь может подсказать, что я делаю не так?

Спасибо!

Весь код правильный, кроме способа вызова.

Я создал другой метод для __construct, а затем вызвал его в самом плагине, чтобы скрипты и стили подключались перед шаблонами. В моем шаблоне я снова вызвал класс и методы, которые мне нужны. Я больше не создавал свой метод сразу.

Ответ или решение

Ваш вопрос касается реализации AJAX вызовов в плагине WordPress через класс, что может быть непростой задачей. На основе предоставленного вами кода и описанных проблем, можно выделить несколько моментов, которые могут быть причиной ошибки 400 (Bad Request) и предложить решение.

Анализ проблемы

  1. Неправильный вызов метода:
    Вы упомянули, что вы создаете экземпляр класса в файле темы. Если экземпляр вызывается в неправильное время или до того, как WordPress загружает необходимые скрипты и стили, это может привести к проблемам. Убедитесь, что вызов происходит в нужный момент жизненного цикла WordPress, например, в init или wp_enqueue_scripts.

  2. Неверный путь к файлам:
    Убедитесь, что ваши JavaScript и CSS файлы действительно загружаются. При помощи инструментов разработчика в браузере проверьте, корректно ли загружаются ваши скрипты и стили. Попробуйте также временно упростить пути для тестирования.

  3. Проверка nonce:
    Убедитесь, что nonce корректен. Параметр security должен соответствовать значению, созданному с помощью wp_create_nonce('my_nonce'). Если вы получите неправильное значение, AJAX вызов не пройдет проверку.

  4. Конфликт с другими плагинами или темой:
    Проверьте, нет ли конфликтов с другими плагинами или в вашей теме, которые могли бы привести к ошибке.

Возможное решение

Измененный вызов конструктора:

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

class CCYTFeatured {
    public function __construct(){
        add_action( 'wp_enqueue_scripts', array($this, 'cc_yt_scripts' ) );

        add_action( 'wp_ajax_cc_yt_featured', array( $this, 'cc_yt_featured' ) );
        add_action( 'wp_ajax_nopriv_cc_yt_featured', array( $this, 'cc_yt_featured' ) );
    }

    public function cc_yt_scripts() {
        // ... здесь остается ваш код для регистрации и подключения стилей и скриптов
    }

    public function cc_yt_featured(){
        check_ajax_referer( 'my_nonce', 'security' );

        // Обработка вашего AJAX запроса
        echo json_encode('IM HERE, YOU CAN FIND US');
        wp_die(); // Завершение выполнения AJAX вызова
    }
}

// Вызов класса
function initialize_cc_yt_featured() {
    new CCYTFeatured();
}
add_action('plugins_loaded', 'initialize_cc_yt_featured');

Завершение AJAX вызова:
Не забывайте добавлять wp_die(); в конце вашего метода cc_yt_featured. Это завершает выполнение WordPress и предотвращает вывод лишнего контента.

Тестирование JavaScript AJAX вызова:
Ваш JavaScript выглядит правильно. Проверьте результат в консоли браузера. Вот как должно выглядеть окончательное тестирование:

jQuery(document).ready(function($) {
    jQuery.ajax({
        url: cc_yt_script.ajaxurl,
        type : 'POST',
        data: {
            action : 'cc_yt_featured',
            security: cc_yt_script.ajax_nonce,
            post: 'bananas',
        },
        success: function(response) {
            console.log('THIS IS THE RESPONSE:  ' + response);
        },
        error: function(xhr, status, error) {
            console.log('AJAX Error: ' + status + error);
        }
    });
});

Это поможет вам более детально отследить ошибки в вашем процессе.

Заключение

Следуя перечисленным выше советам и рекомендациям, вы должны быть в состоянии устранить ошибку 400 в вашем AJAX вызове. Если проблема сохраняется даже после внесения изменений, проверяйте каждую часть кода по отдельности, чтобы локализовать причину.

Оцените материал
Добавить комментарий

Капча загружается...