Je souhaite faire passer un nav_menus personnalisé dans un flux RSS afin de pouvoir le saisir sur d'autres sites pour créer le même menu personnalisé sur plusieurs sites.
Ce que je ne peux pas comprendre en consultant la base de données, c'est comment WP stocke les données dont il a besoin pour savoir quels éléments sont parent> relatifs à la hiérarchie. Comment sait-il que les pages "enfants" doivent être sorties séparément, même si elles ne sont pas "officiellement" définies comme parent> enfant (à partir de l'écran d'édition), uniquement de manière visuelle dans la zone Menus?
Je ne peux que regarder le type de publication de nav_menu_item dans la base de données et la colonne menu_order répertorie les éléments en ordre croissant, mais rien ne semble référencer la relation menu> sous-menu.
Merci pour tout ce que vous pouvez me dire.
nav_menu_item
.menu_order
_menu_item_menu_item_parent
contenant l'ID nav_menu_item
parent.Pour créer des listes imbriquées, WordPress recherche _menu_item_menu_item_parent
sur chaque élément. S'il existe un élément portant cet ID, ces publications seront regroupées dans une nouvelle sous-liste. C'est essentiellement ce que fait la classe Walker_Nav_Menu
.
Pour illustrer cela, utilisez un petit plugin:
<?php
/**
* Plugin Name: Inspect Nav Menu Items
* Plugin URI: http://wordpress.stackexchange.com/q/70872
*/
add_filter( 'wp_nav_menu_args', 'wpse_70872_inspect_nav_menu_items' );
function wpse_70872_inspect_nav_menu_items( $dummy = 1 )
{
if ( 'wp_nav_menu_args' === current_filter() )
{
add_action( 'shutdown', __FUNCTION__ );
return $dummy;
}
// If we made it so far this function was called on 'shutdown'.
$nav_items = get_posts(
array (
'numberposts' => -1,
'post_type' => 'nav_menu_item'
)
);
$out = array ();
foreach ( $nav_items as $nav_item )
{
$out[] = array (
// general post data
'post_data' => $nav_item,
// meta data
'meta' => get_post_custom( $nav_item->ID ),
// Name of the menu
'terms' => wp_get_object_terms( $nav_item->ID, 'nav_menu' ),
);
}
print '<pre>' . esc_html( var_export( $out, TRUE ) ) . '</pre>';
}
Le résultat pourrait ressembler à ceci:
array (
0 =>
array (
'post_data' =>
stdClass::__set_state(array(
'ID' => 695,
'post_author' => '1',
'post_date' => '2012-10-29 23:24:13',
'post_date_gmt' => '2012-10-29 23:24:13',
'post_content' => ' ',
'post_title' => '',
'post_excerpt' => '',
'post_status' => 'publish',
'comment_status' => 'open',
'ping_status' => 'open',
'post_password' => '',
'post_name' => '695',
'to_ping' => '',
'pinged' => '',
'post_modified' => '2012-10-29 23:24:13',
'post_modified_gmt' => '2012-10-29 23:24:13',
'post_content_filtered' => '',
'post_parent' => 0,
'guid' => 'http://wpse.mu.wp/?p=695',
'menu_order' => 9,
'post_type' => 'nav_menu_item',
'post_mime_type' => '',
'comment_count' => '0',
'filter' => 'raw',
)),
'meta' =>
array (
'_menu_item_type' =>
array (
0 => 'taxonomy',
),
'_menu_item_menu_item_parent' =>
array (
0 => '693',
),
'_menu_item_object_id' =>
array (
0 => '12',
),
'_menu_item_object' =>
array (
0 => 'category',
),
'_menu_item_target' =>
array (
0 => '',
),
'_menu_item_classes' =>
array (
0 => 'a:1:{i:0;s:0:"";}',
),
'_menu_item_xfn' =>
array (
0 => '',
),
'_menu_item_url' =>
array (
0 => '',
),
),
'terms' =>
array (
0 =>
stdClass::__set_state(array(
'term_id' => '105',
'name' => 'Test 1',
'slug' => 'test-1',
'term_group' => '0',
'term_taxonomy_id' => '106',
'taxonomy' => 'nav_menu',
'description' => '',
'parent' => '0',
'count' => '9',
)),
),
),
1 =>
array (
'post_data' =>
stdClass::__set_state(array(
'ID' => 694,
'post_author' => '1',
'post_date' => '2012-10-29 23:24:12',
'post_date_gmt' => '2012-10-29 23:24:12',
'post_content' => ' ',
'post_title' => '',
'post_excerpt' => '',
'post_status' => 'publish',
'comment_status' => 'open',
'ping_status' => 'open',
'post_password' => '',
'post_name' => '694',
'to_ping' => '',
'pinged' => '',
'post_modified' => '2012-10-29 23:24:12',
'post_modified_gmt' => '2012-10-29 23:24:12',
'post_content_filtered' => '',
'post_parent' => 0,
'guid' => 'http://wpse.mu.wp/?p=694',
'menu_order' => 8,
'post_type' => 'nav_menu_item',
'post_mime_type' => '',
'comment_count' => '0',
'filter' => 'raw',
)),
'meta' =>
array (
'_menu_item_type' =>
array (
0 => 'taxonomy',
),
'_menu_item_menu_item_parent' =>
array (
0 => '693',
),
'_menu_item_object_id' =>
array (
0 => '11',
),
'_menu_item_object' =>
array (
0 => 'category',
),
'_menu_item_target' =>
array (
0 => '',
),
'_menu_item_classes' =>
array (
0 => 'a:1:{i:0;s:0:"";}',
),
'_menu_item_xfn' =>
array (
0 => '',
),
'_menu_item_url' =>
array (
0 => '',
),
),
'terms' =>
array (
0 =>
stdClass::__set_state(array(
'term_id' => '105',
'name' => 'Test 1',
'slug' => 'test-1',
'term_group' => '0',
'term_taxonomy_id' => '106',
'taxonomy' => 'nav_menu',
'description' => '',
'parent' => '0',
'count' => '9',
)),
),
),
// … and so on. It is a long list.