Cómo agregar un nuevo endpoint en WooCommerce
Estoy usando WooCommerce para un sitio web donde el cliente vende software. Una de las opciones que debo agregar es un botón para solicitar licencia en la página Mi cuenta.
Ya tengo la función que hace esto en un archivo request-license.php dentro de la carpeta de WooCommerce en mi tema, pero estoy teniendo problemas para agregar el nuevo endpoint.
Cuando haces clic en Ver, el endpoint llama al archivo view-order.php, así que quiero que llame a request-license cuando se haga clic en el botón de solicitar licencia.
Aquí está cómo se llama:
<?php
$actions = array();
// Acciones para estados de pedido válidos para pago
if ( in_array( $order->get_status(), apply_filters( 'woocommerce_valid_order_statuses_for_payment', array( 'pending', 'failed' ), $order ) ) ) {
$actions['pay'] = array(
'url' => $order->get_checkout_payment_url(),
'name' => __( 'Pagar', 'woocommerce' )
);
}
// Acciones para estados de pedido válidos para cancelación
if ( in_array( $order->get_status(), apply_filters( 'woocommerce_valid_order_statuses_for_cancel', array( 'pending', 'failed' ), $order ) ) ) {
$actions['cancel'] = array(
'url' => $order->get_cancel_order_url( wc_get_page_permalink( 'myaccount' ) ),
'name' => __( 'Cancelar', 'woocommerce' )
);
}
// Nueva acción para solicitar licencia
$actions['license'] = array(
'url' => $order->get_request_license_url(),
'name' => __( 'Solicitar Licencia', 'woocommerce' )
);
// Acción para ver el pedido
$actions['view'] = array(
'url' => $order->get_view_order_url(),
'name' => __( 'Ver', 'woocommerce' )
);
// Filtro para modificar las acciones
$actions = apply_filters( 'woocommerce_my_account_my_orders_actions', $actions, $order );
if ( $actions ) {
foreach ( $actions as $key => $action ) {
echo '<a href="' . esc_url( $action['url'] ) . '" class="button ' . sanitize_html_class( $key ) . '">' . esc_html( $action['name'] ) . '</a>';
}
}
?>
Sé que debo crear la función get_request_license_url() pero no estoy seguro de cómo implementarla. Espero poder recibir algo de ayuda aquí.

parece que WooCommerce no tiene ningún filtro al registrar sus endpoints, https://github.com/woothemes/woocommerce/blob/master/includes/class-wc-query.php#L84
por lo que necesitas agregar tu nuevo endpoint en los hooks init, así:
add_action( 'init', 'add_endpoint' );
function add_endpoint(){
add_rewrite_endpoint( 'license', EP_ROOT | EP_PAGES );
}
luego debes hacer algún filtrado en wc_get_template
para llamar a tus archivos cuando la solicitud coincida con tu endpoint
add_filter( 'wc_get_template', 'custom_endpoint', 10, 5 );
function custom_endpoint($located, $template_name, $args, $template_path, $default_path){
if( $template_name == 'myaccount/my-account.php' ){
global $wp_query;
if(isset($wp_query->query['license'])){
$located = get_template_directory() . '/your-path-to-file.php';
}
}
return $located;
}
así que cuando visites la página de mi cuenta con el endpoint license
,
digamos http://yourdomain.com/my-account/license/
, mostrará tu código personalizado

No estoy seguro desde qué versión, pero WooCommerce sí tiene un filtro para modificar las variables de consulta: https://github.com/woocommerce/woocommerce/blob/master/includes/class-wc-query.php#L195
