如何扩展woocommerce api端点?

时间:2017-02-21 16:28:03

标签: php wordpress woocommerce woocommerce-rest-api

我试图在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,或者我对此错了?

2 个答案:

答案 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更新这些值。所以这根本不是解决方案。仍在研究解决方案...