¿Cómo puedo extender los puntos finales de API de woocommerce?

3 minutos de lectura

Estoy tratando de extender el punto final del cliente en la API de woocommerce para incluir algunos campos personalizados que he creado en mi functions.php. Pero no puedo entender cómo hacerlo.

he copiado el class-wc-rest-customers-controller.php desde el complemento de woocommerce (woocommerce/includes/api/) a mi carpeta de woocommerce en mi tema, como debe hacer con los archivos de woocommerce cuando quiera editarlos.

Así es como se ve mi class-wc-rest-customers-controller.php:
https://www.pastebucket.com/561405

Mi plan ahora era editar esta copia del archivo para incluir mis custom_fields que agregué en functions.php. Pero no puedo resolver esta parte.

Este es el código de mi functions.php con el que agregué mis campos personalizados:
https://www.pastebucket.com/561406

Parece que está en la función de la línea 475 en class-wc-rest-customers-controller.php, pero no estoy seguro. Así que me pregunto dónde y cómo debo agregar mis campos personalizados a esto class-wc-rest-customers-controller.php o estoy completamente equivocado acerca de esto?

  • probaste class My_Rest_server extends WC_REST_Controller {...}

    –Hamid Araghi

    28 de enero de 2021 a las 17:24

avatar de usuario
jgangso

Las anulaciones de archivos se aplican AFAIK solo para plantillas. En este caso, está intentando anular una clase, que es diferente.

Como escribió, no es una buena idea realizar los cambios directamente en el archivo dentro del directorio de WooCommerce. De hecho, no recomendaría cambiar el punto final nativo en absoluto, excepto a través de acciones y filtros.

Una forma buena, reutilizable y preparada para el futuro de cambiar el comportamiento de un punto final de la API REST de WC sería crear su propio punto final que simplemente extiende la clase de controlador de Woocommerce y anula los métodos que deben personalizarse. Preferiblemente, intente no anular todo el método, pero incluya la llamada al método principal en su método personalizado.

Solución de ejemplo: (no he probado este en particular, pero hice uno muy similar recientemente)

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,
        "https://stackoverflow.com/" . $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
    *******************************/
}

De esta manera, puede ampliar libremente la API para sus propias necesidades, aprovechar todas las funciones actuales y futuras de la API de WC y conservar la API nativa… bueno… nativa.

Si bien esta debería ser una solución limpia y “correcta”, no recomendaría seguir este camino sin una comprensión sólida de las clases y la herencia de PHP, así como un buen IDE con el que trabajar.

avatar de usuario
henrik johansson

Así que parece que logré resolverlo. No pude sobrescribir el class-wc-rest-customers-controller.php copiándolo en my-theme-folder/woccomerce/includes/api/

Entonces, en lugar de eso, simplemente lo sobrescribí y mantuve una copia de seguridad del original. Pero ahora también necesito mantener una copia de seguridad de la class-wc-rest-customers-controller.php archivo con el que sobrescribí.

Esta no es la forma correcta de hacerlo, pero esta era la única forma en que podía resolver mi problema.

ACTUALIZAR: Parece que no puedo actualizar estos valores a través de la API. Así que esto no era una solución en absoluto.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad