我试图在woocommerce api中扩展客户端点,以包含我在我的functions.php中创建的一些自定义字段。 但我无法理解如何做到这一点。
我已经将woocommerce插件中的class-wc-rest-customers-controller.php
(woocommerce / includes / api /)复制到我主题中的woocommerce文件夹中,当您想要编辑它们时,应该使用woocommerce文件。
这是我的class-wc-rest-customers-controller.php的样子: https://www.pastebucket.com/561405
我现在的计划是编辑该文件的副本,以包含我在functions.php中添加的custom_fields。但是我无法解决这个问题。
这是我的functions.php中的代码,我添加了自定义字段: https://www.pastebucket.com/561406
感觉就像是在-wc-rest-customers-controller.php的第475行的函数中,但我不确定。
所以我想知道我应该在哪里以及如何将自定义字段添加到此class-wc-rest-customers-controller.php
,或者我对此错了?
答案 0 :(得分:1)
文件替代仅将AFAIK应用于模板。在这种情况下,您尝试覆盖一个不同的类。
正如您所写,直接对WooCommerce目录中的文件进行更改不是一个好主意。实际上,除非通过操作和过滤器,否则我根本不建议更改本机终结点。
改变WC REST API端点行为的一种好方法,可重用且面向未来,将是创建自己的端点,该端点简单地扩展 Woocommerce控制器类,并覆盖方法需要定制。最好不要覆盖整个方法,而应在自定义方法中包括对父方法的调用。
示例解决方案:(尚未测试此特定产品,但最近做了一个非常相似的产品)
wp-content/plugins/
woocommerce/
your-plugin/
includes/
class-your-plugin.php
your-plugin.php
your-plugin.php
<?php
defined( 'ABSPATH' ) || exit;
add_action('rest_api_init', function(){
require_once __DIR__ . '/includes/class-your-plugin.php';
$controller = new Your_Custom_Class();
$controller->register_routes();
} );
includes/class-your-plugin.php
<?php
defined( 'ABSPATH' ) || exit;
/**
* Class Your_Custom_Class
*/
class Your_Custom_Class extends WC_REST_Customers_Controller {
/**
* Endpoint namespace.
* Use the wc- prefix to make use of WooCommerce authentication for third-parties.
* @see /wp-content/plugins/woocommerce/includes/api/class-wc-rest-authentication.php:63
*
* @var string
*/
protected $namespace = 'wc-your-route/v1';
public function register_routes() {
register_rest_route(
$this->namespace,
'/' . $this->rest_base . '/your-custom-route',
array(
array(
'methods' => WP_REST_Server::EDITABLE,
'callback' => array( $this, 'your_customized_function' ),
'permission_callback' => array( $this, 'get_items_permissions_check' ),
'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
),
'schema' => array( $this, 'get_item_schema' ),
)
);
}
/**
* Your custom function
*/
protected function your_customized_function( $arg1, $arg2) {
/*******************************
// IMPLEMENT CUSTOM CODE HERE
*******************************/
parent::the_name_of_the_original_function( $arg1, $arg2 );
/*******************************
// IMPLEMENT CUSTOM CODE HERE
*******************************/
}
通过这种方式,您可以根据自己的需要自由扩展API,利用WC API的所有当前和将来功能,并保留本机API ..... native。
虽然这应该是一种干净且“正确”的解决方案,但我建议您在没有扎实了解PHP类和继承以及良好的IDE的情况下,不建议您采用此方法。
答案 1 :(得分:0)
所以我似乎设法解决了这个问题。 我无法通过将其复制到my-theme-folder / woccomerce / includes / api /
来覆盖class-wc-rest-customers-controller.php
所以我只是覆盖它并保留原始的备份。但我现在还需要备份我覆盖的class-wc-rest-customers-controller.php
文件。
这不是正确的做法,但这是我解决问题的唯一方法。
更新:似乎我无法通过api更新这些值。所以这根本不是解决方案。仍在研究解决方案...