Как при создании нового меню добавить в него пункты
Задача: нужно добавить в меню при его создании в админке все рубрики сайта, учитывая их иерархию, а также учитывая, что меню назначена область меню "Подвал сайта" (footer).
add_action( 'wp_create_nav_menu', function ( $term_id ) {
// Если вручную что-то было добавлено в меню - прерываем процесс
if ( ! empty( $_REQUEST['menu-item'] ) ) {
return;
}
// Если не выбрана локация footer - прерываем процесс
if ( ! isset( $_REQUEST['menu-locations']['footer'] ) ) {
return;
}
// Получаем рубрики (или что угодно)
$items = get_categories( [ 'hide_empty' => false ] );
// Если нет терминов - прерываем процесс
if ( ! $items ) {
return;
}
foreach ( $items as $key => $term ) {
$result = wp_update_nav_menu_item( $term_id, 0, [
'menu-item-type' => 'taxonomy',
'menu-item-object' => $term->taxonomy,
'menu-item-object-id' => $term->term_id,
] );
if ( is_wp_error( $result ) ) {
error_log( print_r( $result->get_error_message(), true ) );
} else {
$items[ $key ]->db_id = $result;
}
}
// Находит значение родительского ID пункта меню термина по родителю термина
$get_parent = static function ( WP_Term $term ) use ( $items ) {
foreach ( $items as $_term ) {
if ( $term->parent === $_term->term_id ) {
return $_term->db_id;
}
}
return 0;
};
// Присваиваем родителя в рамках меню
foreach ( $items as $key => $term ) {
$parent = $get_parent( $term );
wp_update_post( wp_slash( [
'ID' => $term->db_id,
'post_parent' => $parent,
'meta_input' => [
'_menu_item_menu_item_parent' => $parent,
],
] ) );
}
} );
