register_nav_menus, затем программно создавать меню

У меня есть вызов register_nav_menus в функциях моей темы.php:

 //register nav menu and footer nav. register_nav_menus( array( 'main-nav' => 'Main Navigation', 'footer-nav' => 'Footer Navigation' ) ); 

Это отлично работает, но я хотел бы сделать дополнительный шаг по программному созданию меню и присвоить его «main-nav», чтобы автоматически добавлять новые страницы.

Эта тема используется в качестве отправной точки для установки wordpress, поэтому я хотел бы включить эту функцию, чтобы сохранить немного времени на повторяющихся задачах, таких как ручное создание этих меню через внешний вид -> меню.

Кто-нибудь знает как это сделать?

Solutions Collecting From Web of "register_nav_menus, затем программно создавать меню"

Нет необходимости создавать / обновлять пользовательские меню программно, просто чтобы сделать то, что вы пытаетесь сделать.

Просто wp_nav_menu() на wp_nav_menu() fallback, wp_page_menu() или определите свой собственный пользовательский обратный вызов, например, для вывода wp_list_pages() .

Вызов:

 `wp_nav_menu( array( 'theme_location' => 'main-nav' ) );` 

… будет, если пользовательское меню не было назначено в 'main-nav' темы 'main-nav' , выведите это:

 `wp_page_menu()`. 

Если вы хотите более мелкомасштабное управление, например, для явного контроля глубины меню, вы можете сделать следующее:

 wp_nav_menu( array( 'theme_location' => 'main-nav', 'depth' => 3, 'container_class' => 'nav', 'menu_id' => 'main-nav', 'fallback_cb' => 'wpse87933_main_nav_cb' ) ); 

… и затем определите свой обратный вызов следующим образом:

 function wpse87933_main_nav_cb() { ?> <div class="nav"> <ul id="main-nav"> <?php wp_list_pages( array( 'depth' => 3, 'title_li' => '' ) ); ?> </ul> </div> <?php } 

Вы даже упростили ситуацию, используя has_nav_menu() условное:

 if ( has_nav_menu( 'main-nav' ) ) { wp_nav_menu( array( 'theme_location' => 'main-nav', 'depth' => 3, 'container_class' => 'nav', 'menu_id' => 'main-nav' ) ); } else { ?> <div class="nav"> <ul id="main-nav"> <?php wp_list_pages( array( 'depth' => 3, 'title_li' => '' ) ); ?> </ul> </div> <?php } 

В этот момент вам просто нужно помнить о различиях классов CSS между тремя функциями:

  • wp_nav_menu() CSS-классы
  • wp_page_menu() Классы CSS
  • wp_list_pages() Классы CSS

Выяснилось, как это сделать на основе ответа на этот вопрос: программно добавить меню навигации и пункты меню

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

 //register nav menu and footer nav. register_nav_menus( array( 'main-nav' => 'Main Navigation', 'footer-nav' => 'Footer Navigation' ) ); //now see if the main navigation menu is there - if not, create it. if (!wp_get_nav_menu_object('Main Navigation')) { $menu_id = wp_create_nav_menu('Main Navigation'); //create the menu $locations = get_theme_mod('nav_menu_locations'); //get the menu locations $locations['main-nav'] = $menu_id; //set our new menu to be the main nav set_theme_mod('nav_menu_locations', $locations); //update } 

Недостатком этого является то, что если администратор удалит основное меню навигации, он снова будет создан (что может раздражать) – поэтому я включил код меню создания в функцию, которая работает только один раз, при установке темы. Страницы с этим кодом не добавлены, но наличие подходящих меню, определенных и уже назначенных для их тематических мест, упростит вопросы для не-кодеров, создающих сайты с моей темой, и больше вопросов о том, почему определенные страницы отображаются в навигационном меню, когда навигационное меню еще не создано 🙂