如何为WooCommerce添加具备原生验证特性的REST API端点?
如何为WooCommerce添加继承原生验证机制的自定义REST API端点
完全可以通过WooCommerce提供的钩子和控制器继承机制实现,无需手动引入验证类——WooCommerce的REST API会自动对wc/v*命名空间下的端点进行consumer key/secret校验,只要你的权限回调逻辑正确对接原生机制。
现有代码的问题点
- 硬编码文件路径:直接写死WooCommerce的插件路径,一旦插件目录变更或WooCommerce版本更新,会导致文件引入失败
- 错误使用订单类型注册:
wc_register_order_type是用来注册自定义订单类型的,你的自定义端点不需要这个操作,属于冗余代码 - 路由注册冗余:GET和POST请求可以合并到同一个
register_rest_route调用中 - 控制器继承冗余:如果只是做简单的自定义端点,继承
WC_REST_Controller比WC_REST_Posts_Controller更轻量,后者是专门处理帖子/自定义帖子类型的API控制器
优化后的实现代码
<?php /* Plugin Name: Umut API Description: WooCommerce API deneme eklentisi. Version: 1.0 Author: Umut Text Domain: umut-api Domain Path: /lang */ // 确保WooCommerce已激活 add_action('plugins_loaded', 'umut_api_init'); function umut_api_init() { if (!class_exists('WooCommerce')) { add_action('admin_notices', function() { echo '<div class="error"><p>Umut API需要WooCommerce插件激活才能使用</p></div>'; }); return; } // 引入必要的WooCommerce REST控制器类 if (!class_exists('WC_REST_Controller')) { require_once WC()->plugin_path() . '/includes/rest-api/Controllers/Version3/class-wc-rest-controller.php'; } class WC_REST_Custom_Controller extends WC_REST_Controller { protected $namespace = 'wc/v3'; protected $rest_base = 'custom'; public function register_routes() { // 合并GET和POST请求的路由注册 register_rest_route( $this->namespace, '/' . $this->rest_base, [ [ 'methods' => WP_REST_Server::READABLE, 'callback' => [$this, 'get_custom'], 'permission_callback' => [$this, 'check_permissions'], ], [ 'methods' => WP_REST_Server::CREATABLE, 'callback' => [$this, 'post_custom'], 'permission_callback' => [$this, 'check_permissions'], ], ] ); } public function get_custom($request) { return rest_ensure_response(['cevap' => 'get çalıştı']); } public function post_custom($request) { return rest_ensure_response(['cevap' => 'post çalıştı']); } // 对接WooCommerce原生权限验证 public function check_permissions($request) { // 调用WooCommerce的全局权限检查,自动处理consumer key/secret校验 return WC_REST_Authentication::check_permissions($request); } } // 通过钩子注册自定义控制器 add_filter('woocommerce_rest_api_get_rest_namespaces', 'woo_custom_api_register_controller'); } function woo_custom_api_register_controller($controllers) { $controllers['wc/v3']['custom'] = 'WC_REST_Custom_Controller'; return $controllers; } ?>
关键说明
- 自动验证机制:只要端点在
wc/v3命名空间下,并且权限回调调用WC_REST_Authentication::check_permissions,WooCommerce就会自动完成consumer key和consumer secret的校验,无需手动处理 - 安全的文件引入:使用
WC()->plugin_path()获取WooCommerce的插件路径,避免硬编码导致的错误;同时用class_exists检查类是否存在,防止重复引入 - 轻量控制器:继承
WC_REST_Controller而非帖子控制器,只保留必要的REST API基础功能,减少冗余 - 规范的响应格式:用
rest_ensure_response包装返回值,确保符合WordPress REST API的响应规范
内容的提问来源于stack exchange,提问作者mazot
相关产品推荐
相关产品推荐

