Вопрос или проблема
Я создаю плагин с классом и методами.
Этот класс вызывается через тему (жестко закодирован) для подключения и локализации моего 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) и предложить решение.
Анализ проблемы
-
Неправильный вызов метода:
Вы упомянули, что вы создаете экземпляр класса в файле темы. Если экземпляр вызывается в неправильное время или до того, как WordPress загружает необходимые скрипты и стили, это может привести к проблемам. Убедитесь, что вызов происходит в нужный момент жизненного цикла WordPress, например, вinit
илиwp_enqueue_scripts
. -
Неверный путь к файлам:
Убедитесь, что ваши JavaScript и CSS файлы действительно загружаются. При помощи инструментов разработчика в браузере проверьте, корректно ли загружаются ваши скрипты и стили. Попробуйте также временно упростить пути для тестирования. -
Проверка nonce:
Убедитесь, чтоnonce
корректен. Параметрsecurity
должен соответствовать значению, созданному с помощьюwp_create_nonce('my_nonce')
. Если вы получите неправильное значение, AJAX вызов не пройдет проверку. -
Конфликт с другими плагинами или темой:
Проверьте, нет ли конфликтов с другими плагинами или в вашей теме, которые могли бы привести к ошибке.
Возможное решение
Измененный вызов конструктора:
Вместо того чтобы вызывать все в одном конструкторе, вы можете создать отдельный метод для инициализации, который будет включать ваши скрипты и стили. Это обеспечит правильную последовательность.
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 вызове. Если проблема сохраняется даже после внесения изменений, проверяйте каждую часть кода по отдельности, чтобы локализовать причину.