Cum să adaugi un nou endpoint în WooCommerce
Folosesc WooCommerce pentru un site unde clientul vinde software. Una dintre opțiunile pe care trebuie să le adaug este un buton pentru cerere licență pe pagina de cont.
Deja am funcția care face asta într-un fișier request-license.php în folderul woocommerce din tema mea, dar am probleme cu adăugarea unui nou endpoint.
Când dai click pe vizualizare, endpointul apelează fișierul view-order.php, așa că vreau să apelez request-license când se dă click pe butonul de cerere licență.
Iată cum este apelat:
<?php
$actions = array();
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' => __( 'Plătește', 'woocommerce' )
);
}
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' => __( 'Anulează', 'woocommerce' )
);
}
$actions['license'] = array(
'url' => $order->get_request_license_url(),
'name' => __( 'Cerere Licență', 'woocommerce' )
);
$actions['view'] = array(
'url' => $order->get_view_order_url(),
'name' => __( 'Vizualizează', 'woocommerce' )
);
$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>';
}
}
?>
Știu că trebuie să creez funcția get_request_license_url() dar nu sunt sigur cum să o implementez. Sper să primesc ajutor aici.

Se pare că WooCommerce nu are niciun filtru atunci când își înregistrează endpoint-urile, https://github.com/woothemes/woocommerce/blob/master/includes/class-wc-query.php#L84
așa că trebuie să adăugați noul endpoint pe hook-uri de init, exact așa:
add_action( 'init', 'add_endpoint' );
function add_endpoint(){
add_rewrite_endpoint( 'licenta', EP_ROOT | EP_PAGES );
}
Apoi trebuie să faceți niște filtrare pe wc_get_template
pentru a încărca fișierele dumneavoastră când cererea se potrivește cu endpoint-ul
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['licenta'])){
$located = get_template_directory() . '/calea-catre-fisierul-tau.php';
}
}
return $located;
}
Deci, când vizitați pagina de cont cu endpoint-ul licenta
,
de exemplu http://domeniultau.ro/my-account/licenta/
, aceasta va afișa codul dumneavoastră personalizat

Nu sunt sigur de la ce versiune, dar WooCommerce are un filtru pentru modificarea variabilelor de interogare: https://github.com/woocommerce/woocommerce/blob/master/includes/class-wc-query.php#L195
