Как изменить навигационное меню на странице "Мой аккаунт" в WooCommerce
Я хочу изменить боковое навигационное меню "Мой аккаунт" в WooCommerce.
Для этого я внес изменения в woocommerce/templates/myaccount/navigation.php
.
Проблемы с таким подходом:
- Я могу добавлять новые пункты только в начало или конец меню. Но мне нужно разместить их на 2-й и 3-й позиции...
- При обновлении WC файл может измениться...
Какой наилучший способ настроить навигационное меню "Мой аккаунт" в WooCommerce под свои нужды?

Для этого вам не нужно изменять файл woocommerce/templates/myaccount/navigation.php
.
Лучший способ настроить пункты меню навигации "Мой аккаунт" — это использовать:
- Фильтр
woocommerce_account_menu_items
для добавления новых пунктов в меню. - Функцию
array_slice()
для переупорядочивания пунктов так, как вам нужно.
Таким образом, используя фильтр woocommerce_account_menu_items
, вы идеально интегрируете свои собственные пункты в WooCommerce, так как:
- Есть возможность переопределить конечные точки (endpoints) ваших пунктов через страницу настроек "Аккаунт" в WC.
- WC автоматически обновляет URL ссылок пунктов, например, при изменении структуры постоянных ссылок.
Пример кода:
// Обратите внимание на низкий приоритет хука, это даст другим плагинам время добавить свои пункты...
add_filter( 'woocommerce_account_menu_items', 'add_my_menu_items', 99, 1 );
function add_my_menu_items( $items ) {
$my_items = array(
// конечная точка => метка
'2nd-item' => __( '2nd Item', 'my_plugin' ),
'3rd-item' => __( '3rd Item', 'my_plugin' ),
);
$my_items = array_slice( $items, 0, 1, true ) +
$my_items +
array_slice( $items, 1, count( $items ), true );
return $my_items;
}
Примечание 1: URL-адрес ссылок ваших пунктов автоматически определяется WooCommerce здесь. Для этого WC просто добавляет конечную точку, определённую в фильтре выше, к URL страницы "Мой аккаунт". Поэтому корректно указывайте конечные точки для своих пунктов.
Примечание 2: В вашем вопросе кажется, что вы изменили шаблон WooCommerce напрямую в ядре...
woocommerce/templates/myaccount/navigation.php
Если вам необходимо изменить шаблон WC, правильный способ — скопировать путь шаблона относительно папки woocommerce/templates
в папку woocommerce
вашей темы/плагина. Например, в нашем случае шаблон нужно вставить в:
child-theme/woocommerce/myaccount/navigation.php
.

Привет, я пробую этот метод, добавляя код в functions.php, но ссылки появляются только в верхней навигации, а не в боковом меню. Есть какие-то предложения?

Кастомизация аккаунта WooCommerce и добавление новых элементов состоит из нескольких шагов:
Первый шаг: Создание ссылок:
Необходимо использовать фильтр woocommerce_account_menu_items
для изменения существующих пунктов меню или добавления новых. Например, я добавляю пункт под названием Избранное:
add_filter( 'woocommerce_account_menu_items', function($items) {
$items['wishlist'] = __('Избранное', 'textdomain');
return $items;
}, 99, 1 );
Примечание: Я показал самый простой способ. Вы можете использовать array_slice, если хотите разместить пункт меню в нужной позиции.
P.S: Если нужно удалить или изменить существующие пункты, делается это так:
add_filter( 'woocommerce_account_menu_items', function($items) {
unset($items['downloads']); // Удаляем пункт "Загрузки"
$items['orders'] = __('Мои заказы', 'textdomain'); // Меняем название для "Заказы"
return $items;
}, 99, 1 );
Шаг 2: Добавление rewrite endpoints:
Для каждого добавляемого пункта нужно создать endpoint:
add_action( 'init', function() {
add_rewrite_endpoint( 'wishlist', EP_ROOT | EP_PAGES );
// Повторите строку выше для других пунктов ...
} );
После добавления новых endpoints необходимо сбросить правила перезаписи. Это можно сделать, перейдя в wp-admin/settings/permalinks и нажав кнопку сохранить, либо с помощью функции flush_rewrite_rules()
.
Шаг 3: Отображение содержимого нового пункта
Для отображения содержимого новых пунктов используйте хук woocommerce_account_{myEndPoint}_endpoint
. В нашем примере я создал файл wishlist.php
в директории темы woocommerce/myaccount/
и вывожу его содержимое так:
add_action( 'woocommerce_account_wishlist_endpoint', function() {
wc_get_template_part('myaccount/wishlist');
});

Также полезно использовать функцию register_activation_hook()
для регистрации метода активации, который будет вызывать flush_rewrite_rules()
, чтобы избежать многократной очистки правил при каждой загрузке страницы и чтобы не нужно было запоминать о необходимости сохранять постоянные ссылки. Таким образом, это сработает только один раз при активации и будет "просто работать". Не забудьте выполнить add_rewrite_endpoint()
перед этим, чтобы он зарегистрировался.
