Почему не работает мой 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");
}
)
}
Я слишком долго смотрю на этот код и пробовал разные варианты, так что, надеюсь, кто-то сможет указать на очевидное, потому что я просто не вижу проблему. Спасибо!

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

Suzanne
105
5 сент. 2013 г. 22:39:59
Похожие вопросы
2
ответов
2
ответов