Вопрос или проблема
Меня спросил клиент о возможности переноса меню из одной установки WP в другую, при этом это независимые установки, каждая для своего домена. Суть в том, что я разработал веб-сайт на WP (с использованием Woocommerce), а через несколько месяцев мы разработали блог с другой структурой макета, но сохранив визуальную идентификацию для бренда. Теперь она хочет перенести основное меню с главного сайта в блог, и все пункты этого меню должны быть динамическими, чтобы, если она решит добавить другую категорию в это меню, оно также автоматически отображалось в блоге.
Возможно ли сделать что-то подобное, например, интегрировать одну установку WP с другой? В основном мне нужно перенести меню из одной установки WP в другую, каждая из которых находится на отдельном домене. Может кто-то помочь мне с этой большой проблемой??
Спасибо всем!
На самом деле это вполне возможно, однако есть несколько специфических моментов, которые вам нужно выполнить, чтобы это заработало.
Сначала создайте файл в вашей установке WordPress, на которой в настоящее время есть это меню. Для примера мы назовем его myoutsidermenu.php в теме под названием theme_name. Когда вы закончите, отредактируйте php-код так, чтобы он выводил элемент меню в этот файл, используя движок WordPress. Я полагаю, вы можете включить CSS-стили для самого меню, но это не совсем обязательно. Помните, что этот файл должен содержать только меню и никаких других элементов WordPress, иначе они будут включены на принимающей стороне, что может вызвать проблемы.
Когда вы закончите, на принимающей стороне, где вы хотите, чтобы ваше меню отображалось, поместите следующий код:
<?php
$doc = new DOMDocument();
$doc->loadHTMLFile('http://example.com/wp-content/themes/theme_name/myoutsidermenu.php');
echo $doc->saveHTML();
?>
Где URL соответствует URL файла, который выводит элемент меню. Теперь помните, что нужно включить стили CSS где-то на вашей принимающей стороне, чтобы отображалось так, как вы хотите.
Я не уверен насчет любых лучших практик здесь, но это должно сработать.
<?php
error_reporting(0);
$doc = new DOMDocument();
$doc->loadHTMLFile('http://example.com/wp-content/themes/theme_name/myoutsidermenu.php');
echo $doc->saveHTML();
?>
Обратите внимание, я добавил отключение сообщений об ошибках, так как этот вышеуказанный метод выводит предупреждения при получении данных из разных доменов.
Вместо того чтобы передавать статические файлы, как предлагают другие ответы, вы можете использовать пользовательские ленты, чтобы обеспечить обмен информацией между сайтами. В многосайтовом экземпляре, над которым я работал, сайт, предоставляющий меню, имел класс, который делал это:
public function add_custom_menu_feed() {
add_feed( 'feed_path_here', [ $this, 'menu_feed' ] );
}
public function menu_feed() {
header( 'Content-Type: application/json' );
echo json_encode( $this->menu );
}
Функция add_custom_menu_feed
должна добавляться как действие на хуке init
.
Эти функции предоставляют объект JSON с ссылками на меню; переменная $this->menu
формируется функцией ниже на исходном сайте. Но вы также можете легко заставить ее выводить целое HTML-меню, если измените заголовок Content-Type и будете выводить разметку вместо JSON.
Затем все сайты, использующие меню, делают это:
public function get_menu() {
if ( ! $this->menu ) {
// Если мы на сайте, который фактически имеет меню,
// получаем его напрямую. Как работает метод construct_local_menu
// не имеет значения для концепции ленты; он просто
// получает то, что нам нужно из меню с идентификатором main-menu.
$this->menu = this->construct_local_menu( 'main-menu');
}
if ( ! $this->menu ) {
// Если меню все еще пусто, мы не на сайте
// который его хостит, поэтому мы должны получить нашу пользовательскую ленту.
$this->menu = json_decode(
wp_remote_retrieve_body(
wp_remote_get('https://site-providing-the-menu.example.com/feed_path_here')
),
true
);
}
return $this->menu;
}
Проверка if( ! $this->menu)
просто гарантирует, что мы получим это только один раз за загрузку страницы, независимо от того, сколько раз мы используем это меню. Эта логика может быть не обязательной, если вы получаете отрендеренный HTML и сразу его выводите. Также, конечно, json_decode
не обязателен, если вы не получаете данные в формате JSON. Но часть wp_remote_retrieve_body(wp_remote_get())
– это то место, где мы получаем ленту, чтобы затем сделать с ней то, что нам нужно.
Ответ или решение
Синхронизация меню навигации между несколькими независимыми установками WordPress может быть осуществлена, однако потребует определенных усилий и технического подхода. Ниже приведены основные методы и этапы, которые помогут вам добиться желаемого результата.
1. Создание PHP-файла для меню
Первый шаг – создать файл в теме WordPress, которая содержит меню, которое вы хотите поделиться. Допустим, вы назовете этот файл myoutsidermenu.php
и поместите его в папку темы, к примеру, в wp-content/themes/theme_name/
.
Внутри этого файла вам нужно использовать функцию wp_nav_menu()
для динамического отображения меню. Файл должен содержать только код, необходимый для вывода меню, без каких-либо других элементов WordPress, чтобы избежать проблем с выводом на конечном сайте.
Пример кода для вывода меню:
<?php
// Предположим, что ваше меню называется 'main-menu'
wp_nav_menu(array('theme_location' => 'main-menu'));
?>
2. Получение меню на стороне получателя
На сайте, на который вы хотите вывести меню, используйте следующий PHP-код, чтобы загружать ваш файл myoutsidermenu.php
:
<?php
$doc = new DOMDocument();
@$doc->loadHTMLFile('http://example.com/wp-content/themes/theme_name/myoutsidermenu.php'); // Замените URL на тот, который соответствует вашей установке
echo $doc->saveHTML();
?>
Этот код извлекает HTML-код меню с вашего исходного сайта и выводит его на втором сайте.
3. Использование «Кастомных фидов» для лучшей интеграции
Для более надежного и безопасного подхода можно создать специальные фиды для обмена данными между сайтами. Например, вы можете создать JSON-ответ с меню. Это особенно полезно, если вам необходимо обеспечивать кросс-доменные запросы.
Пример кода для создания фида:
public function add_custom_menu_feed() {
add_feed('my_custom_menu_feed', [$this, 'menu_feed']);
}
public function menu_feed() {
header('Content-Type: application/json');
echo json_encode($this->menu); // Здесь $this->menu - это массив с элементами меню.
}
Затем, на сайте получателе, вы можете получить меню через WP HTTP API:
public function get_menu() {
// Проверяем, если меню уже загружено
if (!$this->menu) {
$this->menu = json_decode(wp_remote_retrieve_body(wp_remote_get('https://source-site.com/my_custom_menu_feed')), true);
}
return $this->menu;
}
Заключение
Синхронизация меню между двумя независимыми установками WordPress возможна благодаря созданию PHP-файлов и обработке данных через фиды. Выбор конкретного метода зависит от ваших потребностей и уровня навыков в программировании. Использование фидов предпочтительнее, так как это более гибкий и безопасный способ обмена данными между сайтами. Если вам необходима помощь в реализации, вы всегда можете обратиться к профессиональным разработчикам WordPress.
Этот подход обеспечит, что любые изменения, внесенные в меню на одном сайте, автоматически будут отражены на другом, что позволит поддерживать консистентность и актуальность меню на нескольких доменах.