Intereting Posts
Лучше ли в долгосрочной перспективе использовать дату публикации или пользовательскую таксономию для сортировки / разделения сообщений по годам? Каков правильный способ добавления функциональности к опубликованному плагину WordPress? Управление плагинами WP Как разрешить доступ к двум учетным записям пользователей, используя один логин? Как превратить миниатюру сообщения в фоновое изображение? Список подкатегорий с изображением Скрытие меню на мобильном телефоне только при просмотре сообщений? Как определить, какую тему wordpress использует сайт? Как я могу get_post_meta () наиболее эффективным способом? Страница параметров темы не отображается в меню администратора Удостовериться, что записи отношений терминалов wp уникальны Значок массовой информации загружает название по умолчанию из имени файла получать случайных пользователей каждый раз на основе мета-ключа Включение WordPress в API RESTful Добавление меню плагина в многопользовательском режиме

Принять вызов AJAX с данными в виде сериализованной формы

Я пытаюсь передать плагин wordpress с некоторыми данными формы через ajax, и он отлично работает, если данные формы не сериализованы, а затем сервер отвечает сообщением об ошибке. Я застрял с этим уже несколько дней, но я не могу заставить его работать. Что я делаю неправильно, это не может быть так сложно, не так ли?

Вот сообщение об ошибке:

call_user_func_array () ожидает, что параметр 1 будет действительным обратным вызовом, функция «process_request» не найдена или неверное имя функции в X: \ xampp \ htdocs \ testsite \ wp-includes \ plugin.php в строке 406

Вызов AJAX:

jQuery(document).ready(function($) { nonce: whatever //if i use this variable, it works fine var data = {action: 'process_request', add_my_data: 'whatever', 'my_data[name]':'whatever', my_nonce: nonce}; //if i use this variable, the server returns the above error . //because .serialize() doesn't include the submit button's name //and the form doesn't contain the name of the function to be called, i added them manually to the string. nonce is pulled from form. var data2 ='action=process_request&add_my_data=whatever&' + $('#my-form').serialize(); $('.my_submit_button').click(function(event) { event.preventDefault(); jQuery.ajax({ type : 'post', url : ajaxurl, timeout: 25000, data : //data (works) or data2 (doesn't work), [...] 

Странно, что данные post для 'data2' выглядят нормально и имеют тот же синтаксис, что и для «данных».

Я контролировал данные сообщения с помощью firebug:

для «данных»:

 action=process_request&add_my_data=whatever&my_data%5Bname%5D=whatever&my_nonce=1b444dd703 

для 'data2' (с формой, сериализованной, единственная разница, которую я вижу, – это референт):

 action=process_request&add_my_data=whatever&my_data%5Bname%5D=whatever&my_nonce=1b444dd703&_wp_http_referer=%2Ftestsite%2Fadmin%2Ftestpage%2F 

Функция PHP, которая обрабатывает запрос:

 function process_request() { //nonce validation left out for readability if( isset ($_POST['add_my_data']) ) { $this->add_info_array('placeholder', 'Database updated'); } //do some stuff here die(); } add_action('wp_ajax_process_request', 'process_request'); 

ОБНОВЛЕНИЕ: Проблема заключается в том, что в строке, созданной для 'data2', используется референт. Проверьте мой комментарий ниже.

При работе с AJAX и Forms в WordPress мне нравится код в действии ajax к форме, поэтому сериализация работает из коробки. На самом деле я написал статью в этом году: https://webdevstudios.com/2015/02/12/handling-ajax-in-wordpress/

Но вы здесь для ответов, а не в блоге, так что вот краткая его часть. Здесь у вас три части, сначала это HTML-форма. Вы можете воспользоваться serialize() , поместив действие в скрытое поле формы, вот пример:

 <form class="my_form"> <?php wp_nonce_field( 'my_action_nonce' ); ?> <input type="hidden" name="action" value="my_action" /> <!-- More fields here... --> <input type="submit" name="submit" value="Submit" class="submit_form_btn" /> </form> 

Обратите внимание на скрытое поле формы с именем action . Конечно, я сохранил wp_nonce_field() так как проблемы безопасности.

Вторая часть – это фактический jQuery, как указано ранее, вам не нужно обращаться к AJAX через исходный объект jQuery, поскольку вы уже передали его как $ , но это ничего не навредит, просто плохая практика.

 jQuery( document ).ready( function( $ ) { $( '.submit_form_btn' ).on( 'click', function( evt ) { // Stop default form submission evt.preventDefault(); // Serialize the entire form, which includes the action var serialized = $( '.my_form' ).serialize(); $.ajax( { url: ajaxurl, // This variable somewhere method: 'POST', data: serialized, // This is where our serialized data is } ).done( function( result ){ // Handle the result here... } ); } ); } ); 

Я попытался прокомментировать код, насколько мог, он должен иметь больше смысла, но позвольте мне объяснить. Сначала вы останавливаете preventDefault() формы методом preventDefault() объекта preventDefault() (сокращение от события).

Затем вы сериализуете данные формы и храните их в переменной. Я полагаю, вы могли бы сократить его и просто отбросить в объект данных, но это зависит от вас.

Заключительная часть, ну, вам нужно посмотреть, что вы публикуете правильно? Вот где error_log и print_r пригодится, вот как это сделать:

 <?php function handle_ajax() { // Here you verify your nonce if ( ! wp_verify_nonce( $_POST['_wpnonce'], 'my_action_nonce' ) ) { // You can either return, or use nifty json stuffs wp_send_json_error(); } // Here you should get ALL your data in a $_POST variable // or you can actually do someting like this then check your error log error_log( print_r( $_POST, 1 ) ); // This will print out the ENTIRE $_POST variable to your debug.log if you have it // enabled, if not, it goes to your PHP error log } add_action( 'wp_ajax_my_action', 'handle_ajax' ); 

Теперь, когда СЛЕДУЕТ обрабатывать ваш аякс для вас, то, что вы делаете с данными, зависит от вас.

Почему вы используете jQuery.ajax ?

Когда вы определяете jQuery(document).ready(function($) {$ становится вашей глобальной переменной jquery. WordPress jQuery noConflict Wrapper

Ваш аякс должен выглядеть так:

 $.ajax({ type : 'post', url : ajaxurl, etc : .... 

Затем вы не можете просто передать строку переменных. Вы должны сначала определить их в объекте и передать это.

Попробуй это:

 get_data = $('#my-form').serialize(); var data = {action: 'process_request', add_my_data: get_data, my_nonce: nonce}; 

Не уверен насчет сериализации, хотя … поскольку я думал, что WordPress уже сделал это во время процесса post ajax. Вам, возможно, потребуется больше исследований.