Плагин: внешний интерфейс API AJAX для синхронизации с таблицами

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

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

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

По какой-то причине я изо всех сил пытаюсь подумать о том, каким способом добиться этого, и надеялся на то, чтобы немного поработать над использованием методов WP, а не с помощью взлома. Мое следование из разработки плагинов, пытаясь снова найти мои ноги.

Эскиз / Концепция

Чтобы делать запросы к удаленным / внешним API, используйте WP HTTP API . Более подробно примеры / подробности можно найти в некоторых моих ответах здесь .

Затем просто добавьте страницу администратора с помощью add_submenu_page() или add_menu_page() или связанных функций.

Наконец добавьте скрипт через wp_register/enqueue_script() в admin_enqueue_scripts -hook. Там вы запускаете вызов ajax (поиск архивов) и обновляете свои таблицы.

Использовать ajax в плагинах

Это довольно просто. Вот быстрый макет. Он показывает все, что необходимо для выполнения всех возможных вызовов AJAX. Я разделил регистрацию и очередность скрипта, чтобы вы могли поставить в очередь сценарий, когда и где вам нужно.

одноразовые

Проверки Nonce и referrer уже реализованы для обеспечения безопасности. Он использует постоянную схему именования, поэтому он становится менее запутанным (особенно с проверками nonce).

Конструкция ООП с общим именем

PHP:

 class WPSEexampleAJAX { public $name = 'wpse'; public function __construct() { add_action( 'wp_loaded', array( $this, 'scriptsRegister' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'scriptsEnqueue' ) ); // Logged in users - everybody in Admin add_action( "wp_ajax_{$this->name}_action", array( $this, 'ajaxCb' ) ); // Guests/not logged in add_action( "wp_ajax_nopriv_{$this->name}_action", array( $this, 'ajaxCb' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'scriptsLocalize' ) ); } public function scriptsRegister( $page ) { $file = 'WPSEexample.js'; wp_register_script( $this->name, plugins_url( "assets/scripts/{$file}", __FILE__ ), array( 'jquery', // 'add other possible dependencies in here', ), filemtime( plugin_dir_path( __FILE__ )."assets/scripts/{$file}" ), true ); } public function scriptsEnqueue( $page ) { wp_enqueue_script( $this->name ); } public function scriptsLocalize( $page ) { wp_localize_script( $this->name, "{$this->name}Object", array( 'ajaxurl' => admin_url( 'admin-ajax.php' ), '_ajax_nonce' => wp_create_nonce( "{$this->name}_action" ), 'action' => "{$this->name}_action", 'post_type' => get_current_screen()->post_type, // 'foo' => 'bar', ) ); } public function ajaxCb() { $data = array_map( 'esc_attr', $_GET ); check_ajax_referer( $data['action'] ); // DO STUFF IN HERE wp_send_json_success( array( // 'foo' => 'bar', ) ); } } 

JavaScript – фактический AJAX send / catch

Внутри зарегистрированного файла JavaScript вы просто запускаете вызов ajax и извлекаете результат. В настоящее время у вас есть разные точки, где вы можете перехватить или поймать результат. Скрипт на самом деле ничего не делает, а просто входит в консоль. Объект wpseObject который был локализован, имеет псевдоним в вызове функции, поэтому вы можете просто использовать plugin . Мне нравится делать это таким образом, поэтому я могу легко идентифицировать локализованный объект позже (также короче, чтобы писать). Это просто мое личное соглашение об именах.

 ( function( $, plugin ) { "use strict"; $.ajax( { url : plugin.ajaxurl, data : { action : plugin.action, _ajax_nonce : plugin._ajax_nonce, foo : plugin.foo, }, beforeSend : function( d ) { console.log( 'AJAX Before send', d ); } } ) .done( function( response, textStatus, jqXHR ) { // console.log( 'AJAX done', data, textStatus, jqXHR, jqXHR.getAllResponseHeaders() ); } ) .fail( function( jqXHR, textStatus, errorThrown ) { console.log( 'AJAX failed', jqXHR.getAllResponseHeaders(), textStatus, errorThrown ); } ) .then( function( jqXHR, textStatus, errorThrown ) { console.log( 'AJAX after', jqXHR, textStatus, errorThrown ); } ); } )( jQuery || {}, wpseObject || {} ); 

Дополнительная информация о различных частях для $.ajax() в официальной документации jQuery .

Подсказка: убедитесь, что вы всегда используете jQuery из ядра WordPress и нет версии CDN. Кроме того, вы, вероятно, попадете в стену с конфликтами или устаревшими версиями, если пользователь обновит ядро, но не ваш плагин.