Как добавить новый эндпоинт в WooCommerce

1 сент. 2015 г., 20:02:10
Просмотры: 19K
Голосов: 7

Я использую WooCommerce для сайта, где клиент продает программное обеспечение. Одна из функций, которую мне нужно добавить - это кнопка "Запросить лицензию" на странице моего аккаунта.

У меня уже есть функция, которая это делает в файле request-license.php в папке woocommerce моей темы, но у меня возникли проблемы с добавлением нового эндпоинта.

Скриншот страницы моего аккаунта в 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(), но не уверен, как ее реализовать. Надеюсь получить здесь помощь.

1
Комментарии

Вы можете найти ответ по этой ссылке. https://github.com/woocommerce/woocommerce/wiki/Customising-%22My-Account%22-tabs

vijay vijay
22 февр. 2017 г. 14:29:44
Все ответы на вопрос 1
1

похоже, что 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/, будет отображаться ваш пользовательский код

11 дек. 2015 г. 15:20:51
Комментарии

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

Marian Marian
8 мая 2019 г. 10:38:37