Вопрос или проблема
Я пытаюсь прочитать JSON-файл, который был успешно экспортирован с помощью wp_send_json_success
, однако я не могу перебрать массив в файле, так как, похоже, не могу получить доступ к $menu->terms
. Что я упускаю?
$json_content = file_get_contents( ABSPATH . '/menu.json', true );
$menus = json_decode( $json_content );
if ( ! empty( $menus ) ) {
foreach ( $menus as $menu ) {
// Получаем внутреннее меню по слагу.
$internal_menu = get_term_by( 'slug', 'primary', 'nav_menu' );
// Проверяем, существует ли меню с указанным именем.
$menu_exists = wp_get_nav_menu_object( 'Primary' );
if ( $menu_exists ) {
// Если меню существует, удаляем его.
wp_delete_nav_menu( 'Primary' );
}
// Создаем новое меню с тем же именем.
$menu_id = wp_create_nav_menu( 'Primary' );
// Строим аргументы для новых пунктов меню.
$args = array();
$index = 0;
if ( ! empty( $menu->terms ) ) {
foreach ( $menu->terms as $menu_item ) {
// Пропускаем, если статус поста - 'draft'.
if ( 'draft' === $menu_item->post_status ) {
continue;
}
// Обрабатываем элемент меню в зависимости от его типа.
$args_menu_item = process_menu_item( $menu_item );
// Обновляем пункт навигационного меню и получаем обновленный ID.
$nav_menu_item_update = wp_update_nav_menu_item( $menu_id, 0, $args_menu_item );
// Обновляем ID объекта в аргументах.
$args_menu_item['menu-item-object-id'] = $nav_menu_item_update;
$args[ $index++ ] = $args_menu_item;
}
}
// Обновляем родительский ID для пунктов меню.
update_parent_id( $menu_id, $args );
}
}
}
Ответ или решение
Чтобы прочитать JSON-файл и получить доступ к его свойствам, необходимо выполнить несколько шагов, которые являются частью вашего кода. Давайте рассмотрим, как правильно извлечь данные из вашего JSON-файла, а также исправим несколько возможных недоразумений, которые могут привести к проблемам, с которыми вы столкнулись.
Шаги для чтения JSON-файла и получения доступа к его свойствам
-
Чтение файла: Используйте
file_get_contents()
, чтобы загрузить содержимое вашего JSON-файла. Убедитесь, что путь к файлу задан правильно. -
Декодирование JSON: После чтения файла используйте
json_decode()
, чтобы преобразовать JSON-строку в объект PHP или ассоциативный массив. Стоит отметить, что если вы хотите получить ассоциативный массив, добавьте второй аргументtrue
к функцииjson_decode()
. -
Проверка и перебор данных: Перед тем как получить доступ к свойству, проверьте, не является ли результат пустым. Если у вас есть массив объектов, убедитесь, что вы перебираете их правильно.
Пример кода
Вот ваш код с некоторыми улучшениями и исправлениями:
$json_content = file_get_contents( ABSPATH . '/menu.json' );
$menus = json_decode( $json_content );
if ( ! empty( $menus ) && is_array( $menus ) ) {
foreach ( $menus as $menu ) {
// Получение внутреннего меню по слагу.
$internal_menu = get_term_by( 'slug', 'primary', 'nav_menu' );
// Проверка существует ли меню с указанным именем.
$menu_exists = wp_get_nav_menu_object( 'Primary' );
if ( $menu_exists ) {
// Если меню существует, удаляем его.
wp_delete_nav_menu( 'Primary' );
}
// Создаем новое меню с таким же именем.
$menu_id = wp_create_nav_menu( 'Primary' );
// Массив аргументов для новых элементов меню.
$args = array();
$index = 0;
// Проверка наличия свойств в объекте меню
if ( ! empty( $menu->terms ) && is_array( $menu->terms ) ) {
foreach ( $menu->terms as $menu_item ) {
// Пропускаем элементы со статусом 'draft'.
if ( 'draft' === $menu_item->post_status ) {
continue;
}
// Обработка элемента меню
$args_menu_item = process_menu_item( $menu_item );
// Обновление элемента навигационного меню и получение обновленного ID.
$nav_menu_item_update = wp_update_nav_menu_item( $menu_id, 0, $args_menu_item );
// Обновление ID объекта в аргументах.
$args_menu_item['menu-item-object-id'] = $nav_menu_item_update;
$args[ $index++ ] = $args_menu_item;
}
}
// Обновление родительских ID для элементов меню.
update_parent_id( $menu_id, $args );
}
}
Замечания
-
Проверка массива: Убедитесь, что перед циклом
foreach
вы проверяете, является ли$menus
массивом, чтобы избежать возможных ошибок. -
Правильный доступ к свойству: В вашем коде вы использовали
>
, что является HTML-энтитетом для символа>
. Вам нужно использовать->
для доступа к свойствам объекта. -
Файлы и пути: Убедитесь, что путь к вашему JSON-файлу правильный (в вашем случае
ABSPATH . '/menu.json'
).
Следуя этим рекомендациям и исправлениям, вы сможете успешно читать ваш JSON-файл и получать доступ к его свойствам. Если возникнут дополнительные проблемы, обратите внимание на ошибки, которые могут возникнуть, или проверьте структуру вашего JSON-файла для уверенности, что она соответствует ожидаемым значениям в коде.