Как изменить порядок меню на странице «Моя учетная запись» в WooCommerce?

Я хотел бы знать, как изменить порядок вкладок меню на странице «Моя учетная запись» в WooCommerce.

Я добавил новое меню под названием «Партнерская панель», используя следующий код ниже, но я хочу показать его перед меню «Выход», чтобы оно отображалось между меню «Сведения об учетной записи» и «Выйти».

Таким образом, порядок будет таким.

1- Панель управления
2- Заказы
3- Купоны
4- Адреса
5- Данные учетной записи
6- Партнерская панель
7- Выйти

Пожалуйста, смотрите скриншот.

//First hook that adds the menu item to my-account WooCommerce menu 
 
function affiliate_home_link( $menu_links ){
 
    // we will hook "womanide-forum" later
    $new = array( 'affiliate-home' => 'Affiliate Dashboard' );
 
    // or in case you need 2 links
    // $new = array( 'link1' => 'Link 1', 'link2' => 'Link 2' );
 
    // array_slice() is good when you want to add an element between the other ones
    $menu_links = array_slice( $menu_links, 0, 5, true ) 
    + $new 
    + array_slice( $menu_links, 5, NULL, true );
 
 
    return $menu_links;
 
 
}
add_filter ( 'woocommerce_account_menu_items', 'affiliate_home_link' );

// Second Filter to Redirect the WooCommerce endpoint to custom URL
function affiliate_home_hook_endpoint( $url, $endpoint, $value, $permalink ){
 
    if ( $endpoint === 'example-forum' ) {
       
        // This is where you add the custom URL, it could be external like, in this case, we need to go to my profile on the bbpress froum
        // I will use this function (bp_core_get_username( bp_loggedin_user_id() );) to get my profile user id and add it to the URL as shown below 
        
        $url = site_url() .'/affiliate-home/' . bp_core_get_username( bp_loggedin_user_id() );
 
    }
    return $url;
 
}
 
 
add_filter( 'woocommerce_get_endpoint_url', 'forum_example_hook_endpoint', 10, 4 );

Любая помощь будет оценена.

Спасибо!

Как убрать количество товаров в категории WooCommerce
Как убрать количество товаров в категории WooCommerce
По умолчанию WooCommerce показывает количество товаров рядом с категорией, как показано ниже.
2
1
1 614
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете переставить свои $menu_items в той же функции следующим образом:

function affiliate_home_link( $menu_links ){

    // Remove the logout menu item, will re-add later
    $logout_link = $menu_links ['customer-logout'];
    unset( $menu_links ['customer-logout'] );
 
    $menu_links ['affiliate-home'] = __( 'Affiliate Dashboard', 'your-plugin-or-theme-textdomain' );

    // Insert back the logout item.
    $menu_links ['customer-logout'] = $logout_link;
   
    return $menu_links;          
}
add_filter ( 'woocommerce_account_menu_items', 'affiliate_home_link', 10, 1 );

Проверено работает: https://i.imgur.com/DM1eMWH.png

Добавление этого кода говорит о том, что я не могу повторно объявить ту же функцию «affiliate_home_link». Итак, какую функцию я должен использовать?

Hayder Allawi 26.12.2020 16:56

@HayderAllawi вы заменили свою функциюaffiliate_home_link на мою выше? Это то, что вы должны делать! Мой делает то же самое, что вы пытались добиться: добавьте кнопки партнерской панели и поместите их прямо перед выходом из системы.

Tami 27.12.2020 14:36

Я не мог понять, что вы имеете в виду. Что-то не так с кодом, так как я не могу повторно объявить ту же функцию -->affiliate_home_link. Я попытался изменить функцию, но возникает та же ошибка.

Hayder Allawi 27.12.2020 21:52

«Я не могу повторно объявить одну и ту же функцию» => Это может произойти только в том случае, если вы пытаетесь использовать точное «имя» функции (в данном случае partner_home_link) более одного раза.

Tami 28.12.2020 01:14

Если вы удалите свою функциюaffiliate_home_link и вместо нее будете использовать ту, которую я разместил выше, этой проблемы с повторным объявлением возникнуть не должно. Кроме того, с тем, что выше, вам больше не понадобится ваш. Имеет ли это смысл?

Tami 28.12.2020 01:14

я изменил функцию в своем исходном коде и поместил ваш код, он не объявлял ошибку, но не работал.

Hayder Allawi 28.12.2020 10:36

Это странно, @HayderAllawi, я использовал это много раз и наверняка работает. Но я написал функцию выше, не тестируя ее. Я проверю его правильно и обновлю ответ, если он действительно не работает.

Tami 28.12.2020 13:16

@HayderAllawi моя функция отлично работает как есть. Добавил его на сайт WooCommerce, и вот результат, с настраиваемой ссылкой на партнерскую панель прямо над ссылкой «Выйти»: i.imgur.com/DM1eMWH.png

Tami 28.12.2020 13:25

Вы можете использовать настраиваемый фильтр и установить приоритеты для каждой конечной точки с нулевым приоритетом по умолчанию для каждой. Это был мой подход, когда мне нужно было настроить меню для ряда пользовательских элементов.

public function filter_woocommerce_account_menu_items( $items ) {
    // Custom menu item
    $items['quick-order-form'] = 'Quick Order Form';
    
    // Sort based on priority
    uksort( $items, function ( $a, $b ) {
        $priority  = [
            'quick-order-form' => 4,
            'customer-logout'  => 5
        ];

        // Check if priority has been set otherwise set to zero
        $aPriority = $priority[ $a ] ?? 0;
        $bPriority = $priority[ $b ] ?? 0;

        // Equal priorities can stay where they are in the array
        if ( $aPriority == $bPriority ) {
            return 0;
        }

        // Adjust sort based on which endpoint has more priority
        return ( $aPriority < $bPriority ) ? - 1 : 1;
    } );

    return $items;
}
add_filter ( 'woocommerce_account_menu_items', 'filter_woocommerce_account_menu_items' );

Другие вопросы по теме