在 WordPress 中,按照官方的标准,如果需要使用 Ajax,我们需要通过注册 Ajax 动作到 admin_ajax 上,如果需要添加页面,我们直接在后台并添加页面就行了。有没有一种简单方便的办法,不用在页面管理处添加页面来实现自定义页面,也不用 admin_ajax 来实现 Ajax 操作呢?答案自然是有的。
为了实现这个目的,我们需要借助 WordPress Dispatcher PHP 库,我么可以把这个库下载下来,包含到我们的主题或插件中,也可以走捷径,通过 Composer 安装。
通过 Composer 安装 WordPress Dispatcher PHP 库
WordPress Dispatcher 已经提交到了 Composer 官方列表中,我们可以直接通过 Composer 安装管理这个库。
composer require thefold/wordpress-dispatcher
通过 Composer 生成的 autoload 文件自动加载 wordpress-dispatcher 类
Composer 安装后,会自动为我们创建包含了所有安装包的自动加载文件,我们只需要引入这个文件,就可以使用所安装的 PHP 库的所有功能。
// 加载 composer 安装的库
require_once( dirname( __FILE__ ) . '/../vendor/autoload.php' );
use \TheFold\WordPress\Dispatch;
使用 WordPress Dispatcher 创建 WordPress Url
拿我最近开发的一个项目中的在线充值功能为例吧,下面的代码中,online_charge
就是我们创建的在线充值的 URL,我们通过 Ajax 把数据提交到/online_charge/
URL中,该 URL 对应的函数就会自动执行,在本例中,该动作就是生成订单,并跳转到Alipay paymentThe
// 在线充值
new Dispatch( [
'online_charge' => function ( $request ) {
$mount = trim( $_POST['mount'] );
$tn = "p4" . order_no();
# 计算总金额
$total_fee = array_sum( $mount ); # 计算总金额
// 创建订单数据, 可以是前台提交, 也可以是自动生成
$options = [
'out_trade_no' => $tn, //生成唯一订单号
'subject' => '在线充值', //订单标题
'total_fee' => $total_fee, //订单总金额
];
// 获取支付网关
$gateway = get_gate_way();
$response = $gateway->purchase( $options )->send();
// 直接跳转到支付宝支付
$response->redirect();
},
] );
使用自定义模板代替回调函数的具体功能
有时候,我们需要使用自定义页面模板来展示内容,这也很简单,直接在回调函数中包含需要使用的模板就可以了,页面的具体内容在模板中定义,URL 中的变量也可以直接在模板中使用。
new Dispatch( [
'orders/([a-z]*)' => function ( $request, $status="all" ) {
include( get_template_directory() . '/page-orders.php' );
},
] );
路由对应类中的方法,这样可以更好的组织路由和类。
new Dispatch([
'checkout/' => [new CheckoutController, 'index'],
'checkout/([a-z]+)' => [new CheckoutController, 'show', [$request, $id]],
// 后面的参数中,$request = checkout/([a-z]+); $id = ([a-z]+);
]);
通过 WordPress Dispatcher,我们把注册 Ajax 操作的动作直接绕过去了,在需要大量 Ajax 操作的主题或插件中,这无疑帮我们节省了很多代码,同时也让我们的代码逻辑更加清晰了。
3 thoughts on “在 WordPress 中使用 WordPress Dispatcher 创建自定义路由链接 URL”
赞一个 这个真好用啊 这样路由设置就简单多了
最后的例子:
, array($request, $id), 是代表另外一个数组元素吗,会不会有问题?
应该是少一个括号,已经修改过来了。