Как получить правильные URL в сетевом меню (Multisite)?

Вопрос или проблема

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

http://www.mysite.com/navigation-link

но на подсайтах URL-адреса имеют вид http://www.mysite.com/subsite/navigation-link

Очевидно, что эти страницы не существуют, поэтому отображается просто пустая страница. Есть идеи, как убедиться, что URL-адреса будут как в первом примере и как я могу включить это в свою функцию?

function wp_multisite_nav_menu() {

    global $blog_id;

    $args = array(
            'menu' => 'Основное меню',
            'theme_location' => 'main-nav'

        );

    $main_blog = 1; 

    $main_blog = absint( $main_blog );


    if ( !is_multisite() || $blog_id == $main_blog ) {
        echo wp_nav_menu( $args );
        return;
    }

    else {

    switch_to_blog( 1 );

    echo wp_nav_menu( $args );

    restore_current_blog();

    }

}

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

function wp_multisite_nav_menu() {
    
    $args = [
        'menu' => 'Основное меню',
        'theme_location' => 'main-nav'
    ];

    switch_to_blog( 1 );

    echo wp_nav_menu( $args );

    restore_current_blog();
}

Ответ или решение

Чтобы исправить проблему с неправильными URL-адресами в сетевом меню (Multisite) WordPress, вам нужно будет изменить способ формирования ссылок в вашем меню. На текущий момент вы переключаетесь на главной блог и отображаете меню, но ссылки генерируются с учетом текущего блога, что приводит к проблемам с их отображением на подсайтах.

Ниже приведен исправленный код функции wp_multisite_nav_menu(), который должен обеспечить корректные URL-адреса для всех подсайтов:

function wp_multisite_nav_menu() {
    global $blog_id;

    // Определите аргументы для меню
    $args = [
        'menu' => 'Main Menu',
        'theme_location' => 'main-nav',
        'items_wrap' => '<ul>%3$s</ul>' // Добавлено для обертки в ul, можно настроить по желанию
    ];

    // Сохраняем текущий блог
    $current_blog_id = $blog_id;

    // Переключаемся на главный блог
    switch_to_blog( 1 );

    // Генерируем меню и получаем элементы
    $menu_items = wp_get_nav_menu_items( 'Main Menu' );

    // Восстанавливаем текущий блог
    restore_current_blog();

    // Генерируем HTML для меню с правильными URL
    if ( !empty( $menu_items ) ) {
        echo '<ul>';
        foreach ( $menu_items as $item ) {
            // Меняем URL на основной домен с помощью функции `home_url()`
            $url = home_url( $item->url );
            // Генерируем HTML для элемента меню
            echo '<li><a href="' . esc_url( $url ) . '" rel="nofollow">' . esc_html( $item->title ) . '</a></li>';
        }
        echo '</ul>';
    }
}

Пояснение изменений:

  1. Основной блог: Мы сохраняем текущий идентификатор блога в переменной $current_blog_id, затем переключаемся на блог с ID 1.

  2. Получение элементов меню: Вместо использования wp_nav_menu(), мы используем wp_get_nav_menu_items() для получения массива элементов меню. Это позволяет нам обрабатывать каждый элемент меню индивидуально.

  3. Корректные URL: Мы используем home_url() для генерации полного URL с основным доменным именем, что позволяет нам избежать проблем с присутствием /subsite/ в ссылках.

  4. Вывод HTML: Мы вручную выводим элементы списка <li>, что позволяет более гибко управлять HTML.

С помощью данного кода вы сможете получить правильные URL для ваших меню на всех подсайтах сетевого блога. Не забудьте заменить 'Main Menu' и 'main-nav' на те значения, которые соответствуют вашей конфигурации меню.

Оцените материал
Добавить комментарий

Капча загружается...