С помощью функций API я хочу определить новое меню навигации , выбрать его в текущей теме, а затем вставить несколько страниц в качестве элементов меню. Это должно быть сделано, например, при активации темы.
Посредством (умеренно болезненного) процесса обратного инжиниринга базы данных вставляются и обновляются после ручной настройки меню и элементов навигации, я собрал воедино следующие шаги, где «footer-nav» - идентификатор порции меню навигации I ». м создание:
if (!term_exists('footer-nav', 'nav_menu')) {
$menu = wp_insert_term('Footer nav', 'nav_menu', array('slug' => 'footer-nav'));
// Select this menu in the current theme
update_option('theme_mods_'.get_current_theme(), array("nav_menu_locations" => array("primary" => $menu['term_id'])));
// Insert new page
$page = wp_insert_post(array('post_title' => 'Blog',
'post_content' => '',
'post_status' => 'publish',
'post_type' => 'page'));
// Insert new nav_menu_item
$nav_item = wp_insert_post(array('post_title' => 'News',
'post_content' => '',
'post_status' => 'publish',
'post_type' => 'nav_menu_item'));
add_post_meta($nav_item, '_menu_item_type', 'post_type');
add_post_meta($nav_item, '_menu_item_menu_item_parent', '0');
add_post_meta($nav_item, '_menu_item_object_id', $page);
add_post_meta($nav_item, '_menu_item_object', 'page');
add_post_meta($nav_item, '_menu_item_target', '');
add_post_meta($nav_item, '_menu_item_classes', 'a:1:{i:0;s:0:"";}');
add_post_meta($nav_item, '_menu_item_xfn', '');
add_post_meta($nav_item, '_menu_item_url', '');
wp_set_object_terms($nav_item, 'footer-nav', 'nav_menu');
}
Это похоже на работу, но:
- это надежный и элегантный способ сделать это?
- я пропускаю что-то совершенно очевидное, что сделало бы все это в одной строке кода?
menus
navigation
api
julien_c
источник
источник
В качестве дополнения к ответу ZaMoose, вот как вы можете создать пункт меню «Тип страницы » (не « Пользовательский »):
Предполагая, что вы знаете только слаг страницы, например.
источник
У меня есть несколько проблем с принятым ответом - это не делает его неправильным, но я опубликую свой собственный код ниже, который, я думаю, мог бы дать лучший результат для некоторых людей, так как у меня был тот же вопрос, но я хотел сделать то же самое вещь с меньшим количеством кода.
Во-первых, приведенный выше код создает элементы навигации типа «URL», что хорошо для некоторых людей, но я хочу ссылаться на страницы, а не на URL, потому что это важная функция навигации WordPress, и клиенты неизбежно перемещают объекты, поэтому я никогда не использую URL тип элемента навигации.
Кроме того, размещенный код обрабатывает только плоский массив детей. Я создал функцию для рекурсивного объявления новых элементов навигации, сохранения их возвращенных метаданных (в основном идентификатора после создания в цикле) и параметра для принятия дочерних элементов.
Просто отредактируйте,
$nav_items_to_add
а остальное обрабатывается рекурсивно. В каждом массиве есть 3 обязательных ключа. Во-первых, ключ массива - это слаг, так же'shop' => array( ... )
как и то, что вы хотите для страницы с слагомshop
.['title']
это способ, которым элемент навигации будет помечен на передней части.path
это путь к странице в иерархии страниц WordPress, так что он идентичен слагу, если страница является родительскимshop
элементом верхнего уровня, и если бы он был потомком,home
то это было бы'path' => 'home/shop'
.Последний необязательный ключ массива - это место,
['parent']
где вы можете объявить другой ключ в массиве как родительский для текущего. Важно отметить, что элементы добавляются рекурсивно, поэтому родительский элемент должен существовать до того, как вы попытаетесь создать дочерний элемент. Это означает, что объявление должно произойти для родительского элемента nav, прежде чем он станет дочерним.источник
Добавить пункт меню программно. Вы можете подключиться к
wp_nav_menu_items
фильтру. поместите ниже код в вашей теме functions.php, чтобы добавить пункт меню входа / выхода в главном меню. «Основной» - это имя / идентификатор зарегистрированного меню.источник