Почему не работает мой AJAX-вызов?

5 сент. 2013 г., 12:16:49
Просмотры: 24.1K
Голосов: 1

У меня есть похожий рабочий код в файле functions.php темы, но я хочу перенести его в плагин. Я собрал следующий код, но почему-то этот метод имеет проблемы с AJAX-вызовом и всегда возвращает ноль.

Предполагается, что форма будет находиться во фронтенде и должна быть доступна как авторизованным, так и НЕ авторизованным пользователям.

Вот код моего плагина:

/*
Plugin Name: AAA Hello World
Plugin URI: http://helloworld.com
Description: AJAX ответ на отправку формы
Version: 1.0
Author: John Doe
Author URI: http://helloworld.com
*/

class RespondToMyClicks {

  function __construct() {

    add_action( 'wp_enqueue_scripts', array( &$this, 'click_response_styles' ) );
    add_action( 'wp_enqueue_scripts', array( &$this, 'click_response_scripts' ) );

    if( is_admin() ) {
      add_action( 'wp_ajax_the_ajax_hook', array( &$this, 'process_clicky_form' ) );
      add_action( 'wp_ajax_nopriv_the_ajax_hook', array( &$this, 'process_clicky_form' ) );
    }

    add_shortcode( 'click_response_form', array( &$this, 'click_response_form' ) );

  }

  public function click_response_styles() {

    wp_register_style( 'respond-to-my-clicks', plugins_url( dirname( plugin_basename( __FILE__ ) ) . '/styles.css' ) );
    wp_enqueue_style( 'respond-to-my-clicks' );

  }

  public function click_response_scripts() {

    wp_enqueue_script( 'respond-to-my-clicks', plugin_dir_url( __FILE__ ) . 'ajax.js', array( 'jquery' ) );
    wp_localize_script( 'respond-to-my-clicks', 'the_ajax_script', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );

  }

  public function process_clicky_form() {
    if( !empty( $_POST ) && wp_verify_nonce( $_POST['post_filtration'], 'post_filter_action' ) ) {
      echo "Hello World";
      die();
    }
  }

  public function click_response_form() {
    $the_form = '<form id="theForm" method="post" action="">' . 
    wp_nonce_field( 'post_filter_action', 'post_filtration' ) . 
    '<input name="action" type="hidden" value="the_ajax_hook" />
        <label class="check"><input type="checkbox" name="change_me"  value="" onChange="submit_me();" /> Нажмите для получения ответа</label>
    </form>
    <div id="response_area"></div>';
    return $the_form;
  }

}

new RespondToMyClicks();

А вот код моего JavaScript файла:

    function submit_me() {

        jQuery("#response_area").fadeOut("slow");

        jQuery.post(the_ajax_script.ajaxurl, 
        jQuery("#theForm").serialize(),
            function(response_from_the_action_function){
                jQuery("#response_area").html(response_from_the_action_function).fadeIn("fast");
            }
        )

    }

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

5
Комментарии

Я попробовал ваш код: он работает идеально! Вы уверены, что ваш js-файл называется именно ajax.js и находится в той же папке, что и файл плагина?

gmazzap gmazzap
5 сент. 2013 г. 17:20:50

Удаляю свой ответ, он совершенно бесполезен. Извините. Согласен с @G.M., я только что протестировал ваш код, и он работает.

iEmanuele iEmanuele
5 сент. 2013 г. 17:33:48

Чёрт! Как так может быть? Да, G.M., файл ajax.js загружается нормально, потому что я вижу запись о нём в секции head документа, и при клике на ссылку файл отображается, так что, полагаю, с этим всё в порядке. Я собираюсь вырезать похожий код из моей темы, чтобы проверить, не конфликтует ли он, возможно. Я ВСЁ ЕЩЕ получаю 0 в ответе, а не "Hello World".

Suzanne Suzanne
5 сент. 2013 г. 21:08:33

Хорошо... прежде всего, спасибо за ваши комментарии, ребята. Каждый отзыв важен, даже если он кажется бесполезным. Говоря мне, что это РАБОТАЕТ, вы просто даёте мне понять, что проблема в чём-то другом в установке, и это БЫЛО полезно. Оказалось, что мой плагин кеширования сохранил предыдущую версию моего кода и продолжал отдавать её мне, когда я не был авторизован. ЧЁРТ.

Suzanne Suzanne
5 сент. 2013 г. 21:16:58

Хм... можете ли вы, ребята, попробовать это, НЕ будучи авторизованными? Проблема с кешированием исправила это только для авторизованных пользователей. Сейчас для неавторизованных пользователей в области ответа возвращается весь документ целиком.

Suzanne Suzanne
5 сент. 2013 г. 21:35:39
Все ответы на вопрос 1
0

Итак, теперь у меня есть полное решение проблемы. Оно состояло из двух частей:

  1. Кеширование было первой частью проблемы. Я очистил кеш и временно отключил плагин кеширования.
  2. Вторая, менее очевидная проблема заключалась в том, что для НЕ авторизованных пользователей AJAX-запрос возвращал весь HTML-документ в области ответа. Оказалось, что в моем файле functions.php была функция "редиректа", которая вызывала это. Она предназначена для перенаправления пользователей с ролью ниже автора обратно во фронтенд, чтобы они никогда не получали доступ к бэкенду, а admin-ajax.php технически работает со стороны админки, что и было проблемой.
5 сент. 2013 г. 22:39:59