добавить действие и 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? Что я делаю не так?

Author: Lucio Crusca, 2015-12-14

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' );

}
 3
Author: birgire, 2015-12-14 09:03:54

Что там происходит, так это то, что вам нужно двигаться:

add_action( 'wp_ajax_'.$script_handle, array($this, 'userprofileform_process') );
add_action( 'wp_ajax_nopriv_'.$script_handle, array($this, 'userprofileform_process') );

Из функции enqueue_scripts, потому что способ ее настройки эти действия не были подключены, потому что эта функция будет выполняться только для интерфейсных действий.

 3
Author: Bordoni, 2015-12-14 08:39:28