自定义实现与标准API使用相比,使用WP AJAX API是一种可行的方法。首先,您可以访问完整的WP API集,您可以利用标准jQuery$.ajax()
和类似的API调用,并且您正在运行standard conform,可以通过文章或本网站上的答案访问web上传播的所有知识。短期内,你可能会认为自己速度更快,但长期而言,你只是切断了所有帮助来源。
示例:调试您必须实现自定义调试路由,而WordPress AJAX有很多of sources 这将帮助你避开它。
外部数据库最好使用$wpdb
班
class CustomDatabaseHandler extends wpdb
{
// Overwrite what you need here
}
更多信息
in this answer.
开销
使用WP-AJAX时的主要“问题”/性能缺陷是
admin-ajax.php
实际上重新加载整个WordPress核心。可以替换此文件,如图所示
by @Rarst in this answer 有一个自定义文件,可以减少影响,只加载您需要的内容。
我每天都在做自定义应用程序:在WordPress之外开发应用程序,然后通过Composer(或您正在使用的任何软件包管理器)将其拉入,然后从插件文件夹中的一个简单文件中加载,除了调用我们的自动加载程序外,什么都没有问题,控制器和将其声明为插件的标题注释。
<?php
/** Plugin Name: Custom Application as Plugin */
# Composer autoloader
include_once __DIR__.\'/vendor/autoload.php\';
add_action( \'plugins_loaded\', function()
{
// Initialize your plugin here
} );
这就是你所需要的。
如果您运行的是角度。js、Ember或Backbone WeApp 没问题。WP-AJAX将毫无问题地使用它。
众所周知,安全性WordPress重用其nonce。这并不会真正公开任何内容或打开一个安全整体,但您可以更进一步,生成一个新的nonce(也适用于每个请求),进行调用。。。ubersecure。
总的来说,你的插件只能做以下几点:
// Public or private?
// \'wp_enqueue_scripts\'/\'admin_enqueue_scripts\'
// or only on login?
// \'login_enqueue_scripts\'
add_action( \'wp_enqueue_scripts\', function()
{
$name = \'handle\';
wp_register_script(
$name,
plugins_url( \'assets/ajax.js\', __FILE__ ),
[ \'jquery\' ],
filemtime( plugins_dir_path( __FILE__ ).\'assets/ajax.js\' ),
true
);
wp_enqueue_script( $name );
wp_localize_script(
$name,
"{$name}Obj", // This string is what gives you access to below array
[
\'ajaxurl\' => admin_url( \'admin-ajax.php\' ),
\'_ajax_nonce\' => wp_create_nonce( "{$name}_action" ),
\'action\' => "{$name}_action",
\'data\' => [ /* additional data as array */ ],
]
);
} );
您只需注册它和AJAX回调,就完成了:
// Public or private?
add_action( "wp_ajax_{$name}_action", \'ajaxCb\' );
add_action( "wp_ajax_nopriv_{$name}_action", \'ajaxCb\' );
public function ajaxCb( $data )
{
check_ajax_referer( $data[\'action\'] );
# @TODO sanitize data here:
// filter_var() filter_var_array() and filter_input()
# @TODO Custom logic here
// Error?
if ( is_wp_error( $thing ) )
wp_send_json_error( $data );
// Success!
wp_send_json_success( $data );
}
注:全面
example Gist 关于如何使用
filter_var_array()
.
你是阿贾克斯。js文件的外观如下所示:
/*global jQuery, $, handleObj */
( function( $, plugin ) {
"use strict";
var pass = $( \'#password__field\' ).val(),
name = $( \'#name__field\' ).val();
// @TODO other setup tasks for static vars in here
$.ajax( {
url : plugin.ajaxurl,
data : {
action : plugin.action,
_ajax_nonce : plugin._ajax_nonce,
userName : name,
passWord : pass
},
beforeSend : function( d ) {
// @TODO Add loading animation
}
} )
.done( function( response, textStatus, jqXHR ) {
// @TODO Clear loading animation
if ( ! response.success ) {
// @TODO Custom error
}
else {
// @TODO success
}
} )
.fail( function( jqXHR, textStatus, errorThrown ) {
console.log( errorThrown );
} );
} ( jQuery, handleObj || {} ) );
除了填补上面代码中显示的空白/应用程序逻辑之外,真的没有什么可做的了。