Эта функция добавляет вкладку «Специальная страница» в список вкладок «Моя учетная запись»:
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( 'wp_loaded', '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' );
Важный: После этого перейдите в Dashboard> Настройки> Постоянные ссылки и нажмите «Сохранить настройки» для сброса правил перезаписи (спасибо @optimiertes)
Источник: Страница «Моя учетная запись»
Первый my-account/special-page/
должно быть myaccount/special-page/
в 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_stylesheet_directory()
… Вставьте этот код в файл function.php вашей активной дочерней темы или темы.
Чтобы избежать 404 ошибка «страница не найдена», вам нужно будет обновить правила перезаписи, добавив в ваш код:
flush_rewrite_rules();
Обновить: в заключение Dario нашел рабочее решение. Посмотри на его ответ.
Рекомендации:
В woocommerce есть лучший способ использовать шаблон на вашей пользовательской странице:
function my_custom_endpoint_content() {
wc_get_template( 'myaccount/special-page.php' );
}
add_action( 'woocommerce_account_special-page_endpoint', 'my_custom_endpoint_content' );
это должно работать без использования фильтра wc_get_template.