YITH Live Push Notifications 的底层事件源与消息管线
YITH Live Push Notifications 的底层事件源与消息管线
YITH Live Push Notifications for WooCommerce 的核心不是“弹个通知”这么简单,而是把 WooCommerce 的业务事件实时转成可投递的消息流。底层一般分三层:事件源(Hooks)→ 消息队列/存储(DB/Transient)→ 推送适配器(Web Push / OneSignal / Firebase 或自带通道)。 在事件源层,它会订阅多个关键钩子,比如下单、付款完成、订单状态变更、低库存、商品上新等。每触发一次,就会生成一个“通知对象”,包含 type、title、body、target、payload(order_id/product_id/user_id)以及过期时间。 消息管线的关键在于“异步化 + 去重”。如果订单状态在短时间内连续变化(processing→completed),插件必须避免连发两条相同通知;通常会用 meta 或 hash 做 idempotency。然后将通知写入自定义表(更稳)或 post_meta/transient(更轻),再由前端轮询/长连接或后台 cron 统一投递。对于 Web Push 场景,投递阶段需要维护订阅端点(endpoint、p256dh、auth),并按用户授权状态过滤。
关键钩子与代码骨架:生成通知、入库、推送
下面用简化骨架说明它的实现思路(与真实插件的 hook 设计一致):
// 1) 监听订单完成事件 -> 生成通知对象
add_action('woocommerce_order_status_completed', function($order_id){
$order = wc_get_order($order_id);
$data = [
'type' => 'order_completed',
'title' => 'New Order Completed',
'body' => sprintf('#%d - %s', $order_id, $order->get_formatted_billing_full_name()),
'target' => 'admin', // or user/vendor
'payload' => ['order_id'=>$order_id],
'hash' => md5('order_completed_'.$order_id),
'created' => time()
];
yith_lpns_store_notification($data);
yith_lpns_dispatch_async($data['hash']);
});
// 2) 入库(示例:写入自定义表 / option)
function yith_lpns_store_notification($data){
global $wpdb;
$table = $wpdb->prefix.'yith_lpns_notifications';
$wpdb->insert($table, [
'hash' => $data['hash'],
'type' => $data['type'],
'title' => $data['title'],
'body' => $data['body'],
'payload' => wp_json_encode($data['payload']),
'status' => 'pending',
'created' => $data['created'],
]);
}
// 3) 异步投递(cron/队列)
function yith_lpns_dispatch_async($hash){
if (wp_next_scheduled('yith_lpns_send_job', [$hash])) return; // 去重
wp_schedule_single_event(time()+5, 'yith_lpns_send_job', [$hash]);
}
add_action('yith_lpns_send_job', function($hash){
$notif = yith_lpns_get_notification($hash);
if(!$notif || $notif->status!=='pending') return;
$subs = yith_lpns_get_subscribers($notif->target);
foreach($subs as $sub){
// Web Push/Firebase 适配层
yith_lpns_send_to_endpoint($sub, $notif);
}
yith_lpns_mark_sent($hash);
});
这个流程体现了插件的底层价值:
- 用 WooCommerce 事件作为消息触发器,不侵入业务;
- 通知对象结构化,便于扩展不同类型推送;
- 异步队列 + hash 去重,保证高并发下不炸通知;
- 推送通道可插拔,Web Push/第三方服务只是一层适配。
如果你要二开这类插件,重点就是维护好事件订阅的边界、通知对象 schema 的稳定性,以及投递层的幂等与失败重试策略。
评论 0