добавить действие и Ajax
Я разрабатываю плагин и начал с WPPB и Wordpress 4.3.1. Я назвал его dogmaweb. Мне нужно отправить форму в плагин через Ajax. Форма создается самим плагином. В моем class-dogmaweb.php Я пытаюсь добавить действие, которое обрабатывает данные формы на стороне сервера, и вот что я придумал до сих пор:
public function enqueue_scripts()
{
$script_handle = 'userprofilesumbit';
add_action( 'wp_ajax_'.$script_handle, array($this, 'userprofileform_process') );
add_action( 'wp_ajax_nopriv_'.$script_handle, array($this, 'userprofileform_process') );
wp_register_script( $script_handle, plugins_url() . '/public/js/dogmaweb-public.js' );
$userprofilesumbit_data = array('ajax_url' => admin_url( 'admin-ajax.php' ), 'form_action' => $script_handle, 'form_id' => '#'.Dogmaweb::$userprofileform_id);
wp_localize_script($script_handle, 'submit_params', $userprofilesumbit_data);
wp_enqueue_script($script_handle);
}
Симптом проблемы заключается в том, что admin-ajax.php не вызывает мою функцию и возвращает 0. Я прошелся по коду WordPress, чтобы понять, почему (я использую Netbeans и xdebug). Проблема в том, что эти строки кода в plugin.php не находите $tag
в массиве $wp_filter
. Переменная $tag
в этот момент содержит "wp_ajax_userprofilesumbit"
, что в точности соответствует тому, что я указал для аргумента $hook
функции add_action (я использовал ту же переменную $script_handle
, которую вы можете видеть в моем коде).
Я также прошел через код add_action
и уверен, что глобальный массив $wp_filter
содержит ключ "wp_ajax_userprofilesumbit"
, когда add_action
возвращается после того, как я его вызову. Однако я также уверен, что он больше не содержит этого ключа, когда plugin.php выполняет (вызывается admin-ajax.php ).
Почему мой фильтр удаляется из $wp_filter
? Что я делаю не так?
2 answers
Я просмотрел код плагина, и вы можете попробовать использовать метод define_public_hooks()
класса Plugin_Name
для регистрации обратных вызовов действий ajax класса Plugin_Name_Public
:
/**
* Register all of the hooks related to the public-facing functionality
* of the plugin.
*
* @since 1.0.0
* @access private
*/
private function define_public_hooks() {
$plugin_public = new Plugin_Name_Public( $this->get_plugin_name(), $this->get_version() );
$this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_styles' );
$this->loader->add_action( 'wp_enqueue_scripts', $plugin_public, 'enqueue_scripts' );
// Add your ajax actions here instead
$script_handle = 'userprofilesumbit';
$this->loader->add_action( 'wp_ajax_' . $script_handle, $plugin_public, 'userprofileform_process' );
$this->loader->add_action( 'wp_ajax_nopriv_' . $script_handle, $plugin_public, 'userprofileform_process' );
}
Что там происходит, так это то, что вам нужно двигаться:
add_action( 'wp_ajax_'.$script_handle, array($this, 'userprofileform_process') );
add_action( 'wp_ajax_nopriv_'.$script_handle, array($this, 'userprofileform_process') );
Из функции enqueue_scripts
, потому что способ ее настройки эти действия не были подключены, потому что эта функция будет выполняться только для интерфейсных действий.