要访问服务器端功能,需要使用从JS触发服务器事件AJAX, JSON API, XML/RPC, custom endpoints, 甚至template_redirect hooks. 一定要撒很多水nonces 执行主要功能时。
这项简单且行之有效的技术是AJAX 呼叫当AJAX接收到action
当用户登录或注销时(nopriv)。
add_action( \'wp_ajax_add_foobar\', \'prefix_ajax_add_foobar\' );
add_action( \'wp_ajax_nopriv_add_foobar\', \'prefix_ajax_add_foobar\' );
function prefix_ajax_add_foobar() {
// Handle request then generate response using WP_Ajax_Response
}
然后通过JS触发操作。响应是您在处理程序中输出的任何内容,但通常
wp_send_json_success 很好用。
jQuery.post(
ajaxurl,
{
\'action\': \'add_foobar\',
\'data\': \'foobarid\'
},
function(response){
alert(\'The server responded: \' + response);
}
);
如果JS需要在运行时访问服务器变量,请考虑使用
wp_localize_script 超过文本翻译。这确实是您在加载脚本之前传递内联JS的机会。从而确保JS能够访问应用程序所需的正确URL、设置和状态。
ajaxurl
对于某些人来说可能存在,但将其本地化到变量将确保它是正确的url。
// Register the script
wp_register_script( \'some_handle\', \'path/to/myscript.js\' );
// Localize the script with new data
$translation_array = array(
\'some_string\' => __( \'Some string to translate\', \'plugin-domain\' ),
\'a_value\' => \'10\'
);
wp_localize_script( \'some_handle\', \'object_name\', $translation_array );
// Enqueued script with localized data.
wp_enqueue_script( \'some_handle\' );
The
JSON API 也是一个很好的选择,非常容易设置。主要的缺点是,它的核心只有几个星期的时间(从4.4开始),并且没有完全建立(到4.5为止)。如果你不介意生活在边缘,你可以在短时间内与
custom endpoints.
function my_awesome_func( $data ) {
$posts = get_posts( array(
\'author\' => $data[\'id\'],
) );
if ( empty( $posts ) ) {
return null;
}
return $posts[0]->post_title;
}
add_action( \'rest_api_init\', function () {
register_rest_route( \'myplugin/v1\', \'/author/(?P<id>\\d+)\', array(
\'methods\' => \'GET\',
\'callback\' => \'my_awesome_func\',
) );
} );
<小时>
XML RPC 非常酷,每个人都在切换到JSON API,如果他们可以帮助的话。这是一个经过验证的解决方案,但如今谁想要XML呢?
add_filter(\'xmlrpc_methods\', function ($methods) {
$methods[\'myNamespace.getTotalImageCount\'] = \'rpc_myNamespace_getTotalImageCount\';
return $methods;
});
function rpc_myNamespace_getTotalImageCount($args)
{
return array_sum((array)wp_count_attachments(\'image\'));
}
add_action(\'parse_request\', function () {
// PULL USER CREDS FROM CURRENT USER
global $current_user;
$user = $current_user->user_login;
$password = $user->data->user_pass;
include_once(ABSPATH . WPINC . \'/class-IXR.php\');
include_once(ABSPATH . WPINC . \'/class-wp-http-ixr-client.php\');
$xmlrpc_url = home_url(\'xmlrpc.php\');
$client = new WP_HTTP_IXR_CLIENT($xmlrpc_url);
// CALL OUR CUSTOM METHOD
$response = $client->query(\'myNamespace.getTotalImageCount\', array(0, $user, $password));
echo \'Response:<pre>\';
$count = $client->message->params[0];
print_r("{$count} total images");
echo \'</pre>\';
wp_die(\'FIN\');
});
如果你对应该使用多少AJAX感到好奇,那就看看WordPress的未来吧。com的pet项目
Calypso 在这里,他们使用尽可能多的JS重新定义管理后端。
除非有人关闭JS,否则所有这些选项都很好,所以在构建网站时请记住这一点。
在这一过程中,也有一些工具可以提供帮助。
Postman - REST Client Chrome扩展可以测试GET和POST请求-DEMO.
Monkeyman Rewrite Analyzer WP插件可以双重检查您的自定义rewrite endpoints 工作正常。