Как добавить новый эндпоинт в WooCommerce
Я использую WooCommerce для сайта, где клиент продает программное обеспечение. Одна из функций, которую мне нужно добавить - это кнопка "Запросить лицензию" на странице моего аккаунта.
У меня уже есть функция, которая это делает в файле request-license.php в папке woocommerce моей темы, но у меня возникли проблемы с добавлением нового эндпоинта.
Когда вы нажимаете "Просмотр", эндпоинт вызывает файл view-order.php, поэтому я хочу, чтобы при нажатии на кнопку запроса лицензии вызывался request-license.
Вот как это вызывается:
<?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' => __( 'Оплатить', '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' => __( 'Отменить', 'woocommerce' )
);
}
$actions['license'] = array(
'url' => $order->get_request_license_url(),
'name' => __( 'Запросить лицензию', 'woocommerce' )
);
$actions['view'] = array(
'url' => $order->get_view_order_url(),
'name' => __( 'Просмотр', '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>';
}
}
?>
Я знаю, что мне нужно создать функцию get_request_license_url(), но не уверен, как ее реализовать. Надеюсь получить здесь помощь.

похоже, что WooCommerce не предоставляет фильтров при регистрации своих конечных точек, https://github.com/woothemes/woocommerce/blob/master/includes/class-wc-query.php#L84
поэтому вам нужно добавить свою новую конечную точку через хуки init, вот так:
add_action( 'init', 'add_endpoint' );
function add_endpoint(){
add_rewrite_endpoint( 'license', EP_ROOT | EP_PAGES );
}
затем вам нужно выполнить фильтрацию wc_get_template
, чтобы вызвать ваши файлы, когда запрос соответствует вашей конечной точке
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;
}
таким образом, когда вы посещаете страницу личного кабинета с конечной точкой license
,
например http://yourdomain.com/my-account/license/
, будет отображаться ваш пользовательский код

Не уверен, с какой именно версии, но WooCommerce имеет фильтр для изменения query vars: https://github.com/woocommerce/woocommerce/blob/master/includes/class-wc-query.php#L195
