A través de las funciones de la API, quiero definir un nuevo menú de navegación , seleccionarlo en el tema actual y luego insertar algunas páginas como elementos del menú. Esto se debe hacer, por ejemplo, en la activación de un tema.
A través de un proceso (moderadamente doloroso) de ingeniería inversa, la base de datos se inserta y actualiza después de configurar manualmente el menú de navegación y los elementos, he reunido los siguientes pasos, donde 'footer-nav' es la identificación de la barra del menú de navegación I ' m creando:
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');
}
Esto parece funcionar, pero:
- ¿Es una forma robusta y elegante de hacerlo?
- ¿Me estoy perdiendo algo totalmente obvio que haría todo esto en una sola línea de código?
fuente
Como complemento a la respuesta de ZaMoose, así es como crearía un elemento de menú "Tipo de página " (no uno " Personalizado "):
Asumiendo que solo conoces la babosa de la página, por ejemplo.
fuente
Tengo algunos problemas con la respuesta aceptada, eso no lo hace incorrecto, pero publicaré mi propio código a continuación, que creo que podría tener un mejor resultado para algunas personas, ya que tenía la misma pregunta pero quería hacer lo mismo cosa con menos código.
Primero, el código anterior crea elementos de navegación de tipo "URL", lo cual está bien para algunas personas pero quiero vincular a PÁGINAS, no a URL porque esta es una característica importante de las navegaciones de WordPress y los clientes inevitablemente mueven las cosas para que nunca use la URL tipo de elemento de navegación.
Además, solo una matriz plana de niños es manejada por el código publicado. He creado una función para declarar recursivamente los nuevos elementos de navegación, almacenar sus metadatos devueltos (principalmente ID después de haber sido creados en el bucle) y un parámetro para aceptar hijos.
Solo edite
$nav_items_to_add
y el resto se maneja de forma recursiva. Hay 3 claves requeridas en cada matriz. Primero, la clave de la matriz es la babosa, por'shop' => array( ... )
lo que es lo que desea para una página con la babosashop
.['title']
es la forma en que se etiquetará el elemento de navegación en la parte frontal.path
es la ruta a la página dentro de la jerarquía de páginas de WordPress, por lo que es idéntica a la babosa si la página es un padre de nivel superior, y sishop
fuera un hijo dehome
entonces, lo sería'path' => 'home/shop'
.La última clave de matriz opcional es
['parent']
donde puede declarar otra clave en la matriz como la principal de la actual. Es importante tener en cuenta que los elementos se agregan de forma recursiva, por lo que el padre tiene que existir antes de intentar crear un hijo. Esto significa que la declaración debe ocurrir para el elemento de navegación principal antes de que sea secundario.fuente
Para agregar un elemento de menú mediante programación. Puedes enganchar para
wp_nav_menu_items
filtrar. coloque el siguiente código en su tema functions.php para agregar un elemento de menú de inicio / cierre de sesión en el menú principal. 'Principal' es el nombre / id del menú registrado.fuente