Использование Ajax с файлом класса
На данный момент у меня есть ajax, который работает (я получаю успешный ответ [200]), но возникает проблема с хуками действий при ответе. JSON-объект не возвращается, вместо этого я получаю 0.
У меня есть die(); после return, поэтому я думаю, что проблема в том, что хук не работает.
Я пробовал несколько методов в конструкторе класса, но я не уверен, правильный ли это подход. Я делал это раньше с плагином, но сейчас это внутри темы.
Form.php
(включено в functions.php с помощью add_action('after_setup_theme')
public function __construct(){
// Тест #1
add_action( 'wp_ajax_nopriv_process_reservation', array( &$this, 'process_reservation' ) );
// Тест #2
add_action( 'wp_ajax_process_reservation', &$this->process_reservation ); //с и без '&' перед $this
// Тест #3 (это неправильно)
add_action( 'wp_ajax_nopriv_process_reservation', $this->process_reservation );
//Если обернуть это в **add_action('init',function(){... *** тогда не загружается
wp_enqueue_script('ajax_script',THEME_MODULES_URL.'/Reservations/form.js',array('jquery'),TRUE);
wp_localize_script( 'ajax_script', 'myAjax', array(
'ajaxurl' => admin_url( 'admin-ajax.php' ), //не изменяйте это
'itemNonce' => wp_create_nonce("ajax_nonce"), //не изменяйте это
));
}
На всякий случай, вот также моя тестовая функция обратного вызова на данный момент
private function process_reservation(){
check_ajax_referer( 'process_reservation_nonce', 'nonce' );
if( true )
wp_send_json_success( 'ok' );
else
wp_send_json_error( array( 'error' => $custom_error ) );
}
Данные формы в консоли XHR показывают, что передаются и action, и nonce
action:process_reservation
ajax_nonce:6f155a1e17
Я достаточно работал с Ajax, чтобы знать, чего ожидать, поэтому я почти уверен, что проблема здесь с хуками, возможно, что-то со scope темы, чего я не понимаю. В любом случае, любые предложения или помощь от сообщества будут очень полезны! Заранее спасибо
Ошибки, которые я обнаружил в вашем коде:
Одна была указана @helgatheviking в комментарии: Ajax-колбэк должен быть public
методом, а не private
.
Не знаю, как вы инициализируете этот класс, но wp_enqueue_script
&_style
(в единственном числе) должны быть обёрнуты в хук wp_enqueue_scripts
(WP_DEBUG выводит уведомление).
Вы можете убрать <b>&</b>
из $this
, это остаток от PHP 4. Вот рабочий пример:
class MyTheme
{
public function __construct()
{
add_action( 'wp_footer', array( $this, 'aux_function' ) );
add_action( 'wp_enqueue_scripts', array( $this, 'init_plugin' ) );
add_action( 'wp_ajax_process_reservation', array( $this, 'process_reservation' ) );
add_action( 'wp_ajax_nopriv_process_reservation', array( $this, 'process_reservation' ) );
}
public function aux_function()
{
echo '<h4><a href="#" id="wpse">TEST AJAX</a></h4>';
}
public function init_plugin()
{
wp_enqueue_script(
'ajax_script',
plugins_url( '/test.js',__FILE__ ),
array('jquery'),
TRUE
);
wp_localize_script(
'ajax_script',
'myAjax',
array(
'url' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( "process_reservation_nonce" ),
)
);
}
public function process_reservation()
{
check_ajax_referer( 'process_reservation_nonce', 'nonce' );
if( true )
wp_send_json_success( 'Ajax здесь!' );
else
wp_send_json_error( array( 'error' => $custom_error ) );
}
}
new MyTheme();
test.js
jQuery(document).ready(function($)
{
$('#wpse').click(function(e)
{
e.preventDefault();
var data = {
action: 'process_reservation',
nonce: myAjax.nonce
};
$.post( myAjax.url, data, function( response )
{
$('#wpse').html( response.data );
});
});
});

Используя ваш пример, я заставил это работать, но когда я начал преобразовывать его по частям, снова возникли проблемы с хуками. Например, обертка add_action( 'init', function() {
вокруг wp_enqueue()
ломает код; скрипт добавляется в очередь только когда я убираю эту обертку. Единственное отличие, которое я вижу в вашем примере - ваш код находится в файле functions.php, а мой - в отдельном файле, подключаемом через add_action('after_setup_theme', 'load_class_file');
внутри functions.php

Например, в данный момент в моем __contructor()
даже такой простой код, как ваш add_action( 'wp_head', function() {
echo '<h4><a href="#" id="wpse">TEST AJAX</a></h4>';
});
не работает, если я не убираю обертку add_action

Проблема заключалась в том, что в моем functions.php я подключал файл (reservations.php) с использованием хука after_setup_theme
add_action('after_setup_theme', 'init_cpts');
А затем внутри подключаемого файла я загружал файлы классов с использованием хука init
. Я думал, что это нормально, так как init
выполняется после after_setup_theme
, это выглядело так:
function load_classes(){
require_once( PATH_TO_FILE .'/Class.php');
}
add_action('init','load_classes');
Проблема, как упоминалось в ветке @brasofilo, заключалась в том, что любые хуки, которые я пытался использовать внутри файла класса, переставали работать, потому что на этот момент хук init
уже был выполнен.
Чтобы исправить это, я просто удалил функцию load_classes(), как показано выше, и вместо этого использовал require_once
непосредственно в самом файле (который подключается через after_setup_theme
). Тогда решение @brasofilo сработало идеально, так что не забудьте +1 его ответ.

Как насчет того, чтобы самому проголосовать за его ответ? ;)

Я пробовал, но моей репутации недостаточно (11), нужно 15. Как только наберу еще немного очков репутации, обязательно сделаю. Спасибо @JohannesPille
