WooCommerce: назначение конечной точки настраиваемому шаблону на моих учетных страницах

Эта функция добавляет вкладку «Специальная страница» в список вкладок «Моя учетная запись»:

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 вашей активной дочерней темы или темы.


Обновление: Наконец, Дарио нашел рабочее решение. Посмотрите на его ответ.

Рекомендации:

  • Страница с вкладкой «Моя учетная запись» (официальный Woocommerce 2.6+): создание новых конечных точек
  • Как добавить новую конечную точку в woocommerce (старая и неполная)