WooCommerce 定制开发完全指南
WooCommerce 定制开发完全指南
引言
WooCommerce 作为全球最受欢迎的开源电商插件,为开发者提供了强大的定制能力。通过掌握其核心架构和 API,你可以构建高度个性化的电商解决方案。本文将带你深入 WooCommerce 定制开发的世界,从基础概念到实战技巧,全方位解析。
💡 核心要点: WooCommerce 的定制开发主要围绕 REST API、Hooks 系统和 Filter/Action 钩子展开,合理利用这些机制可以大幅提升开发效率。
WooCommerce 架构概览
WooCommerce 采用模块化设计,每个功能模块都有独立的职责。了解其架构对于高效开发至关重要。
graph TD
A[WooCommerce 核心架构] --> B[核心组件]
A --> C[扩展机制]
A --> D[API 系统]
B --> B1[订单管理]
B --> B2[支付网关]
B --> B3[配送系统]
B --> B4[产品管理]
C --> C1[Hooks 系统]
C --> C2[Filte/Action 钩子]
C --> C3[扩展点 API]
D --> D1[REST API]
D --> D2[WC API 客户端]
D --> D3[GraphQL 支持]
1.1 核心组件
- 订单管理模块:处理订单创建、状态流转、退款等核心业务
- 支付网关模块:支持多种支付方式集成,包括 PayPal、Stripe 等
- 配送系统模块:计算运费、管理物流、支持多种配送方式
- 产品管理模块:产品分类、属性、变体管理
1.2 扩展机制
- Hooks 系统:提供标准化的扩展接口,允许开发者在不修改核心代码的情况下扩展功能
- Filter/Action 钩子:提供前后置处理机会,实现功能的动态注入
- 扩展点 API:官方提供的接口,支持插件间通信和功能集成
REST API 完全指南
WooCommerce REST API 是开发者和第三方系统集成的核心工具。它提供了完整的 CRUD 操作,支持认证、过滤和分页。
2.1 API 基础配置
首先,确保 WooCommerce REST API 已启用:
wp plugin deactivate woocommerce
wp plugin activate woocommerce
flowchart LR
A[客户端请求] --> B{认证方式}
B --> C[OAuth 2.0]
B --> D[Basic Auth]
B --> E[应用密码]
C --> F[获取 Token]
D --> G[直接访问]
E --> H[密码认证]
F --> I[调用 API]
G --> I
H --> I
2.2 产品 API 操作
通过 REST API 管理产品是电商集成的常见需求:
创建产品
POST /wp-json/wc/v3/products
Content-Type: application/json
{
"name": "高级产品套餐",
"type": "variable",
"status": "publish",
"description": "包含所有高级功能的订阅套餐",
"short_description": "限时优惠:仅限前100名",
"regular_price": "299.99",
"sale_price": "199.99",
"categories": [
{"id": 5}
],
"tags": [
{"id": 12}
],
"meta_data": [
{"key": "_is_premium", "value": true}
]
}
查询产品列表
GET /wp-json/wc/v3/products?status=publish&per_page=10&page=1
# 响应示例
{
"products": [
{
"id": 123,
"name": "高级产品套餐",
"type": "variable",
"status": "publish",
"price": "199.99",
"stock_quantity": 50
}
],
"total": 1,
"total_pages": 1,
"total_items": 1
}
2.3 订单 API 操作
订单管理是电商系统的核心功能,REST API 提供了完整的订单操作接口:
创建订单
POST /wp-json/wc/v3/orders
Content-Type: application/json
{
"payment_method": "bacs",
"payment_method_title": "银行转账",
"set_paid": false,
"billing": {
"first_name": "张三",
"last_name": "李四",
"email": "[email protected]",
"phone": "13800138000",
"address_1": "北京市朝阳区建国路88号",
"city": "北京",
"state": "北京市",
"postcode": "100000",
"country": "CN"
},
"shipping": {
"first_name": "张三",
"last_name": "李四",
"address_1": "上海市浦东新区",
"city": "上海",
"state": "上海市",
"postcode": "200000",
"country": "CN"
},
"line_items": [
{
"product_id": 123,
"quantity": 2,
"total": "399.98"
}
]
}
查询订单详情
GET /wp-json/wc/v3/orders/456?fields=id,status,total,created_at
2.4 Webhook 开发
Webhook 允许你监听 WooCommerce 事件并自动触发回调,是自动化流程的关键:
flowchart LR
A[用户下单] --> B[WooCommerce 触发事件]
B --> C[创建 Webhook]
C --> D[POST 请求到回调 URL]
D --> E[接收者处理请求]
E --> F[返回成功响应]
F --> G[删除或更新 Webhook]
event1[订单创建]
event2[订单更新]
event3[订单支付]
event4[产品更新]
B --> event1
B --> event2
B --> event3
B --> event4
创建 Webhook
POST /wp-json/wc/v3/webhooks
Authorization: Basic {token}
{
"name": "订单创建通知",
"topic": "order.created",
"delivery": "api",
"secret": "your-secret-key",
"status": "active",
"resource": "order"
}
Webhook 回调处理示例
<?php
// webhook.php
header('Content-Type: application/json');
// 验证签名
$secret = get_option('webhook_secret');
$sig = $_SERVER['HTTP_X_WC_WEBHOOK_SIGNATURE'] ?? '';
$body = file_get_contents('php://input');
if (hash_hmac('sha256', $body, $secret) !== $sig) {
http_response_code(401);
echo json_encode(['error' => 'Invalid signature']);
exit;
}
// 解析订单数据
$order_data = json_decode($body, true);
// 处理订单逻辑
$order_id = $order_data['id'];
$order = wc_get_order($order_id);
// 发送通知
send_notification($order);
// 返回成功响应
echo json_encode(['success' => true]);
exit;
function send_notification($order) {
// 这里可以实现发送邮件、短信、调用第三方 API 等
// 例如:同步到 CRM 系统、触发物流接口等
}
?>
Hooks 系统深入解析
Hooks 是 WooCommerce 扩展的核心机制,理解它对于高效定制开发至关重要。
3.1 Filter 和 Action 的区别
| 特性 | Filter | Action |
|---|---|---|
| 用途 | 修改数据 | 执行操作 |
| 返回值 | 必须返回值 | 无返回值 |
| 使用场景 | 数据过滤、转换 | 日志记录、发送邮件 |
Filter 钩子示例
<?php
/**
* 过滤订单金额显示
* @param string $formatted_price 格式化后的价格
* @param WC_Order $order 订单对象
* @return string 修改后的价格
*/
function custom_order_price_display($formatted_price, $order) {
// 在价格前添加货币符号
return '¥ ' . $formatted_price;
}
add_filter('woocommerce_get_formatted_order_total', 'custom_order_price_display', 10, 2);
Action 钩子示例
<?php
/**
* 在订单创建后执行自定义操作
*/
function custom_after_order_created($order_id) {
$order = wc_get_order($order_id);
// 记录日志
error_log("订单 {$order_id} 已创建,金额: " . $order->get_total());
// 发送通知邮件
$to = '[email protected]';
$subject = '新订单通知';
$message = "订单 #{$order_id} 创建成功,总金额: {$order->get_total()}";
wp_mail($to, $subject, $message);
// 调用第三方 API
sync_order_to_third_party($order);
}
add_action('woocommerce_new_order', 'custom_after_order_created');
3.2 常用 Hooks 列表
- 产品相关:
- woocommerce_product_options_general_settings
- woocommerce_product_data_tabs
- woocommerce_variation_options_pricing
- 订单相关:
- woocommerce_order_status_changed
- woocommerce_payment_gateway.process_payment
- woocommerce_thankyou
- 前端相关:
- woocommerce_before_single_product
- woocommerce_after_single_product_summary
- woocommerce_cart_calculate_fees
- 邮件相关:
- woocommerce_email_before_order_table
- woocommerce_email_order_details
- woocommerce_email_after_order_table
3.3 高级 Hooks 应用
动态添加商品属性
<?php
/**
* 动态添加产品属性选项
* @param array $options 属性选项数组
* @param WC_Product $product 产品对象
* @return array 修改后的选项
*/
function custom_product_attribute_options($options, $product) {
// 添加自定义选项
$options[] = '定制选项';
// 根据产品类型动态调整选项
if ($product->get_type() === 'variable') {
$options[] = '高级定制';
}
return $options;
}
add_filter('woocommerce_variation_option_names', 'custom_product_attribute_options', 10, 2);
自定义运费计算
<?php
/**
* 自定义运费计算逻辑
* @param array $rates 运费费率数组
* @param WC_Cart $cart 购物车对象
* @return array 修改后的运费费率
*/
function custom_shipping_rates($rates, $cart) {
// 添加自定义运费规则
$custom_rate = [
'method_id' => 'custom_shipping',
'instance_id' => 1,
'label' => '特别快递',
'cost' => 29.99,
'taxes' => [],
'meta_data' => []
];
// 如果购物车金额超过500元,免除运费
if ($cart->get_subtotal() > 500) {
unset($rates['custom_shipping']);
} else {
$rates['custom_shipping'] = $custom_rate;
}
return $rates;
}
add_filter('woocommerce_package_rates', 'custom_shipping_rates', 10, 2);
实战开发案例
4.1 开发自定义支付网关
创建一个自定义支付网关需要实现多个接口和方法:
<?php
if (!defined('ABSPATH')) {
exit;
}
/**
* 自定义支付网关类
*/
class WC_Gateway_Custom_Payment extends WC_Payment_Gateway {
/**
* 构造函数
*/
public function __construct() {
$this->id = 'custom_payment';
$this->icon = 'https://example.com/icon.png';
$this->has_fields = true;
$this->method_title = '自定义支付';
$this->method_description = '支持多种支付方式的自定义网关';
// 加载设置
$this->init_form_fields();
$this->init_settings();
// 从设置中获取值
$this->title = $this->get_option('title');
$this->description = $this->get_option('description');
$this->enabled = $this->get_option('enabled');
$this->testmode = 'yes' === $this->get_option('testmode');
// 保存设置
add_action('woocommerce_update_options_payment_gateways_' . $this->id, array($this, 'process_admin_options'));
// 处理支付
add_action('woocommerce_api_' . $this->id, array($this, 'webhook_handler'));
}
/**
* 初始化表单字段
*/
public function init_form_fields() {
$this->form_fields = array(
'enabled' => array(
'title' => '启用/禁用',
'type' => 'checkbox',
'label' => '启用自定义支付',
'default' => 'yes'
),
'title' => array(
'title' => '网关标题',
'type' => 'text',
'description' => '用户看到的支付方式名称',
'default' => '自定义支付'
),
'description' => array(
'title' => '描述',
'type' => 'textarea',
'description' => '支付方式描述信息',
'default' => '支持多种支付方式'
),
'testmode' => array(
'title' => '测试模式',
'type' => 'checkbox',
'label' => '启用测试模式',
'default' => 'yes'
)
);
}
/**
* 支付表单显示
*/
public function payment_fields() {
if ($this->description) {
echo wpautop(wptexturize($this->description));
}
?>
process_payment_request($order, $card_number, $expiry, $cvc);
if ($response['status'] === 'success') {
// 标记订单为待支付
$order->update_status('on-hold', __('等待自定义支付', 'woocommerce'));
$order->reduce_order_stock();
// 清空购物车
WC()->cart->empty_cart();
// 返回成功响应
return array(
'result' => 'success',
'redirect' => $this->get_return_url($order)
);
} else {
wc_add_notice($response['message'], 'error');
return false;
}
}
/**
* 调用第三方支付接口
*/
private function process_payment_request($order, $card_number, $expiry, $cvc) {
// 这里实现实际的支付逻辑
// 例如:调用第三方支付 API
// 模拟API调用
$result = $this->call_payment_api($order->get_total(), $card_number, $expiry, $cvc);
return $result;
}
/**
* Webhook 处理
*/
public function webhook_handler() {
$raw_post = file_get_contents('php://input');
$data = json_decode($raw_post, true);
// 验证 Webhook 签名
$signature = $_SERVER['HTTP_X_SIGNATURE'] ?? '';
$expected_signature = hash_hmac('sha256', $raw_post, $this->get_option('webhook_secret'));
if ($signature !== $expected_signature) {
header('HTTP/1.1 401 Unauthorized');
exit;
}
// 处理支付结果
$transaction_id = $data['transaction_id'] ?? '';
$status = $data['status'] ?? '';
if ($transaction_id && $status) {
// 更新订单状态
$order = wc_get_order_by_meta_value('_transaction_id', $transaction_id);
if ($order) {
if ($status === 'success') {
$order->payment_complete();
$order->add_order_note(__('支付成功', 'woocommerce'));
} else {
$order->update_status('failed', __('支付失败', 'woocommerce'));
}
}
}
// 返回成功响应
header('HTTP/1.1 200 OK');
exit;
}
/**
* 调用支付 API
*/
private function call_payment_api($amount, $card_number, $expiry, $cvc) {
// 这里实现实际的 API 调用逻辑
// 返回格式示例
return [
'status' => 'success',
'transaction_id' => 'TXN123456789',
'message' => '支付成功'
];
}
}
// 注册支付网关
function add_custom_payment_gateway($methods) {
$methods[] = 'WC_Gateway_Custom_Payment';
return $methods;
}
add_filter('woocommerce_payment_gateways', 'add_custom_payment_gateway');
4.2 开发自定义通知系统
创建一个灵活的通知系统,支持邮件、短信和推送通知:
<?php
/**
* 通知管理器类
*/
class WC_Notification_Manager {
private static $instance = null;
private $notifications = [];
public static function get_instance() {
if (null === self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
/**
* 注册通知
*/
public function register_notification($name, $callback, $priority = 10) {
$this->notifications[$name] = [
'callback' => $callback,
'priority' => $priority
];
// 按优先级排序
uasort($this->notifications, function($a, $b) {
return $a['priority'] - $b['priority'];
});
}
/**
* 发送通知
*/
public function send($name, $data = []) {
if (isset($this->notifications[$name])) {
return call_user_func($this->notifications[$name]['callback'], $data);
}
return false;
}
/**
* 发送邮件通知
*/
private function send_email_notification($data) {
$to = $data['to'] ?? '[email protected]';
$subject = $data['subject'] ?? '通知';
$message = $data['message'] ?? '';
$headers = ['Content-Type: text/html; charset=UTF-8'];
$message = $this->format_email_message($message, $data);
return wp_mail($to, $subject, $message, $headers);
}
/**
* 格式化邮件消息
*/
private function format_email_message($message, $data) {
$template = "
<div style='font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;'>
<h2 style='color: #333;'>{$data['subject']}</h2>
<div style='padding: 20px; background-color: #f5f5f5;'>
{$message}
</div>
<div style='margin-top: 20px; color: #666;'>
<p>发送时间:{$data['time']}</p>
</div>
</div>
";
return $template;
}
/**
* 发送短信通知
*/
private function send_sms_notification($data) {
// 这里实现短信发送逻辑
// 可以集成阿里云短信、腾讯云短信等服务
$phone = $data['phone'] ?? '';
$message = $data['message'] ?? '';
if ($phone) {
return $this->call_sms_api($phone, $message);
}
return false;
}
/**
* 调用短信 API
*/
private function call_sms_api($phone, $message) {
// 实现短信 API 调用
return true;
}
}
// 初始化通知管理器
function init_notification_manager() {
$manager = WC_Notification_Manager::get_instance();
// 注册邮件通知
$manager->register_notification('order_created', function($data) {
return $manager->send_email_notification([
'to' => $data['customer_email'],
'subject' => '订单已创建',
'message' => '您的订单 #{$data['order_id']} 已成功创建,我们将尽快处理。',
'time' => current_time('mysql')
]);
});
// 注册短信通知
$manager->register_notification('payment_complete', function($data) {
return $manager->send_sms_notification([
'phone' => $data['customer_phone'],
'message' => "【商城通知】您的订单 #{$data['order_id']} 已支付成功,发货中。",
'time' => current_time('mysql')
]);
});
// 注册推送通知
$manager->register_notification('inventory_low', function($data) {
// 实现推送通知逻辑
return true;
});
}
// 在支付完成时触发通知
add_action('woocommerce_payment_complete', function($order_id) {
$manager = WC_Notification_Manager::get_instance();
$order = wc_get_order($order_id);
// 触发订单创建通知
$manager->send('order_created', [
'order_id' => $order_id,
'customer_email' => $order->get_billing_email(),
'customer_phone' => $order->get_billing_phone()
]);
// 触发支付完成通知
$manager->send('payment_complete', [
'order_id' => $order_id,
'customer_phone' => $order->get_billing_phone()
]);
});
// 初始化通知系统
add_action('plugins_loaded', 'init_notification_manager');
常见错误与解决方案
5.1 性能问题
电商网站容易出现性能瓶颈,以下是一些常见问题和优化方案:
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 页面加载慢 | 数据库查询过多、未使用缓存 |
|
| API 响应慢 | Webhook 处理复杂、未异步化 |
|
| 内存不足 | 处理大量订单数据、循环效率低 |
|
优化示例:批量订单处理
<?php
/**
* 分批处理订单,避免内存溢出
* @param int $batch_size 每批处理数量
*/
function batch_process_orders($batch_size = 50) {
$processed = 0;
// 获取待处理的订单
$args = [
'post_type' => 'shop_order',
'post_status' => ['wc-pending', 'wc-processing'],
'posts_per_page' => $batch_size,
'paged' => 1
];
$query = new WP_Query($args);
while ($query->have_posts()) {
$query->the_post();
$order_id = get_the_ID();
$order = wc_get_order($order_id);
// 处理订单
process_order($order);
$processed++;
wp_reset_postdata();
}
wp_reset_query();
// 继续处理下一页
if ($processed > 0) {
batch_process_orders($batch_size);
}
}
function process_order($order) {
// 订单处理逻辑
// 例如:同步到 CRM、更新库存、发送通知等
}
5.2 安全问题
电商网站是黑客攻击的主要目标,安全性至关重要:
1. SQL 注入防护
<?php
// ❌ 错误示例 - 可能被 SQL 注入
$order_id = $_GET['order_id'];
$order = $wpdb->get_row("SELECT * FROM {$wpdb->prefix}posts WHERE ID = {$order_id}");
// ✅ 正确示例 - 使用参数化查询
$order_id = intval($_GET['order_id']);
$order = $wpdb->get_row($wpdb->prepare(
"SELECT * FROM {$wpdb->prefix}posts WHERE ID = %d",
$order_id
));
2. XSS 防护
<?php
// ❌ 错误示例 - 未转义输出
echo $order->get_title();
// ✅ 正确示例 - 使用 wp_kses_post 进行 HTML 过滤
echo wp_kses_post($order->get_title());
// 或使用 sanitize_text_field 进行文本过滤
echo esc_html($order->get_title());
3. CSRF 防护
<?php
// 生成 CSRF 令牌
function generate_csrf_token() {
if (!isset($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = wp_generate_password(32, true, true);
}
return $_SESSION['csrf_token'];
}
// 验证 CSRF 令牌
function verify_csrf_token() {
if (!isset($_POST['csrf_token']) ||
!isset($_SESSION['csrf_token']) ||
$_POST['csrf_token'] !== $_SESSION['csrf_token']) {
wp_nonce_verb_check('', '');
wp_die('无效的 CSRF 令牌');
}
}
// 在表单中添加令牌
function add_csrf_token_to_form() {
$token = generate_csrf_token();
echo '';
}
add_action('woocommerce_after_order_notes', 'add_csrf_token_to_form');
5.3 API 安全
保护 WooCommerce REST API 避免未授权访问:
<?php
/**
* 限制 REST API 访问
*/
add_action('rest_api_init', function () {
register_rest_route('woodev/v1', '/protected-endpoint', [
'methods' => 'GET',
'callback' => 'my_protected_endpoint',
'permission_callback' => function () {
return is_user_logged_in() && current_user_can('edit_posts');
}
]);
}, 0);
function my_protected_endpoint() {
return new WP_REST_Response(['message' => '受保护的 API'], 200);
}
最佳实践
6.1 代码组织
- 使用命名空间:避免全局命名空间污染
- 遵循 PSR 规范:提高代码可维护性
- 编写文档注释:为函数和类添加文档
- 使用 Composer:管理依赖关系
<?php
namespace WC_Gateway;
use WC_Payment_Gateway;
/**
* 自定义支付网关类
*
* @package WC_Gateway
*/
class Custom_Gateway extends WC_Payment_Gateway {
/**
* 构造函数
*/
public function __construct() {
// 类实现
}
/**
* 处理支付请求
*
* @param int $order_id 订单 ID
* @return array 支付结果
*/
public function process_payment($order_id) {
// 实现代码
}
}
6.2 测试策略
- 单元测试:测试独立的函数和类方法
- 集成测试:测试组件间的交互
- E2E 测试:模拟完整用户流程
- 性能测试:评估系统性能指标
6.3 日志记录
<?php
/**
* 记录调试日志
*/
function wc_debug_log($message, $data = []) {
if (WP_DEBUG === true) {
$log_entry = sprintf(
"[%s] %sn%sn",
current_time('mysql'),
$message,
is_array($data) ? print_r($data, true) : $data
);
error_log($log_entry);
}
}
// 使用示例
wc_debug_log('订单处理开始', [
'order_id' => 123,
'amount' => 299.99,
'currency' => 'CNY'
]);
总结
WooCommerce 定制开发是一个涉及多个层面的复杂过程。通过掌握 REST API、Hooks 系统和 Filter/Action 机制,你可以构建高度定制的电商解决方案。记住要遵循最佳实践,注重代码质量和安全性,并持续优化性能。
🎯 关键要点: WooCommerce 定制开发的核心是理解其架构和扩展机制,合理使用 API 和 Hooks 可以大大提高开发效率。持续学习新技术,关注性能优化和安全防护,是成为一名优秀 WooCommerce 开发者的关键。
参考资料
- WooCommerce 官方文档 – https://woocommerce.com/documentation/
- WordPress REST API 文档 – https://developer.wordpress.org/rest-api/
- WooCommerce Hooks 参考 – https://developer.woocommerce.com/reference/hooks/
- WC REST API 文档 – https://woocommerce.github.io/woocommerce-rest-api-docs/