Эта функция добавляет вкладку «Специальная страница» в список вкладок «Моя учетная запись»:
add_filter( 'woocommerce_account_menu_items' , 'jc_menu_panel_nav' ); function jc_menu_panel_nav() { $items = array( 'dashboard' => __( 'Dashboard', 'woocommerce' ), 'orders' => __( 'Orders', 'woocommerce' ), 'downloads' => __( 'Downloads', 'woocommerce' ), 'edit-address' => __( 'Addresses', 'woocommerce' ), 'payment-methods' => __( 'Payment Methods', 'woocommerce' ), 'edit-account' => __( 'Account Details', 'woocommerce' ), 'special-page' => __( 'Special Page', 'woocommerce' ), // My custom tab here 'customer-logout' => __( 'Logout', 'woocommerce' ), ); return $items; }
Это приводит к следующему:
Но ссылка указывает на my-account/special-page/
и, естественно, дает ошибку 404.
Как я могу присвоить этот URL-адрес файлу с именем special-page.php
?
Наконец, я смог решить проблему, используя фрагмент, предоставленный тем же людям WooCommerce (на этой странице есть больше советов). Для всех желающих вставьте весь следующий код в functions.php:
function my_custom_endpoints() { add_rewrite_endpoint( 'special-page', EP_ROOT | EP_PAGES ); } add_action( 'init', 'my_custom_endpoints' ); function my_custom_query_vars( $vars ) { $vars[] = 'special-page'; return $vars; } add_filter( 'query_vars', 'my_custom_query_vars', 0 ); function my_custom_flush_rewrite_rules() { flush_rewrite_rules(); } add_action( 'after_switch_theme', 'my_custom_flush_rewrite_rules' );
Я думаю, что этот способ позволяет больше контролировать порядок / переименование меню:
function my_custom_my_account_menu_items( $items ) { $items = array( 'dashboard' => __( 'Dashboard', 'woocommerce' ), 'orders' => __( 'Orders', 'woocommerce' ), //'downloads' => __( 'Downloads', 'woocommerce' ), //'edit-address' => __( 'Addresses', 'woocommerce' ), //'payment-methods' => __( 'Payment Methods', 'woocommerce' ), 'edit-account' => __( 'Edit Account', 'woocommerce' ), 'special-page' => 'Special Page', 'customer-logout' => __( 'Logout', 'woocommerce' ), ); return $items; } add_filter( 'woocommerce_account_menu_items', 'my_custom_my_account_menu_items' );
В следующей функции я включил файл, чтобы поддерживать некоторый «порядок», но также допускает прямой код.
Обязательно поместите файл special-page.php
в папку myaccount
.
function my_custom_endpoint_content() { include 'woocommerce/myaccount/special-page.php'; } add_action( 'woocommerce_account_special-page_endpoint', 'my_custom_endpoint_content' );
Важно: после этого отключите / повторно активируйте тему (для сброса правил перезаписи).
Источник: вкладка Моя учетная запись
Первая my-account/special-page/
должна быть myaccount/special-page/
in woocommerce 2.6+.
Это решение является неполным, и я все еще работаю над …
Вы можете сначала использовать этот крючок:
add_action( 'init', 'add_wc_endpoint' ); function add_wc_endpoint(){ add_rewrite_endpoint( 'special-page', EP_ROOT | EP_PAGES ); }
Затем фильтрация wc_get_template
для вызова ваших файлов, когда запрос соответствует вашей конечной точке:
add_filter( 'wc_get_template', 'custom_vc_endpoint', 10, 5 ); function custom_vc_endpoint($located, $template_name, $args, $template_path, $default_path){ if( $template_name == 'myaccount/special-page.php' ){ global $wp_query; if(isset($wp_query->query['special-page'])){ $located = get_template_directory() . '/woocommerce/myaccount/special-page.php'; } } return $located; }
Если вы используете get_template_directory()
тему, замените get_template_directory()
на get_stylesheet_directory()
… Вставьте этот код в файл functions.php вашей активной дочерней темы или темы.
Обновление: Наконец, Дарио нашел рабочее решение. Посмотрите на его ответ.
Рекомендации: