Ajax form submit in Post Metabox

У меня есть специальный текстовый файл MetaBox, назначенный для публикации.

У меня есть функция, работающая на post save_action.

Однако мне было интересно, могу ли я получить кнопку внутри метабокса, чтобы запустить функцию при щелчке без обновления страницы?

Да, ты можешь. Вот пример кода, который поможет вам начать работу и некоторые ссылки для отслеживания.

Добавьте в свою форму кнопку и поле nonce

<input type="hidden" name="my_ajax_nonce" value="<?php echo wp_create_nonce('my_ajax_action');?>" /> <button id="submit-my-form" type="submit"><?php _e('Save custom meta data')?></button> 

Вам необходимо создать и зарегистрировать свою функцию, которую вы хотите выполнить, с помощью вызова AJAX:

 function my_ajax_action() { if(!wp_verify_nonce( $_POST['my_ajax_nonce'], 'my_ajax_action' )) { die(-1); } //TODO: Add your button saving stuff here. var_dump($_POST['form_data']); exit; } function my_ajax_action_init() { if ($_POST['action'] == 'my_ajax_action') { do_action('wp_ajax_my_ajax_action'); } } if (is_admin()){ add_action('wp_ajax_my_ajax_action', 'my_ajax_action'); } add_action( 'init', 'my_ajax_action_init'); 

ПРИМЕЧАНИЕ. Зачем вызывать действие AJAX для init, а не когда плагин загружается? Потому что нам нужно правильно настроить WordPress, прежде чем мы сделаем волшебство AJAX.

Теперь добавьте материал JS в дополнительный файл my.ajax.action.js

 jQuery(document).ready(function($) { $('body').on('click', '#submit-my-form', function(e) { e.preventDefault(); var $me = $(this), action = 'my_ajax_action'; var data = $.extend(true, $me.data(), { action: action, form_data: $('#post').serializeArray() }); $.post(ajaxurl, data, function(response) { if(response == '0' || response == '-1'){ //TODO: Add Error handling (Wrong nonce, no permissions, …) here. } else { //TODO: Do stuff with your response (manipulate DOM, alert user, …) } }); }); }); 

Не забудьте вставить свой сценарий в очередь.

 function my_enqueue_scripts() { wp_enqueue_script( 'my-ajax-action', plugins_url('my.ajax.action.js', __FILE__), array('jquery'), NULL, true); } add_action( 'admin_enqueue_scripts', 'my_enqueue_scripts'); 

ПРИМЕЧАНИЕ . Глобальный JS var adminurl автоматически включается в WP-сервер.

дальнейшее чтение

  • AJAX в плагинах
  • одноразовые
  • Крючок действия: admin_enqueue_scripts
  • Action Hook: init