Вопрос или проблема
Я использую эту функцию, чтобы переключиться на навигацию моего основного сайта и отображать ее на всех подсайтах в моей многосайтовой сети. В идеале ссылки должны иметь следующий формат:
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>';
}
}
Пояснение изменений:
-
Основной блог: Мы сохраняем текущий идентификатор блога в переменной
$current_blog_id
, затем переключаемся на блог с ID 1. -
Получение элементов меню: Вместо использования
wp_nav_menu()
, мы используемwp_get_nav_menu_items()
для получения массива элементов меню. Это позволяет нам обрабатывать каждый элемент меню индивидуально. -
Корректные URL: Мы используем
home_url()
для генерации полного URL с основным доменным именем, что позволяет нам избежать проблем с присутствием/subsite/
в ссылках. -
Вывод HTML: Мы вручную выводим элементы списка
<li>
, что позволяет более гибко управлять HTML.
С помощью данного кода вы сможете получить правильные URL для ваших меню на всех подсайтах сетевого блога. Не забудьте заменить 'Main Menu'
и 'main-nav'
на те значения, которые соответствуют вашей конфигурации меню.