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?
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.
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.
probaste
class My_Rest_server extends WC_REST_Controller {...}
–Hamid Araghi
28 de enero de 2021 a las 17:24