使用页面 id 获取页面菜单最顶层的菜单项 - wordpress

问题描述 投票:0回答:2

我希望能够使用子菜单页面 id 获取子菜单最顶层菜单项的标签。

例如: - 我有测试页面的页面 ID。所以,我想获取文本 L1,它是测试菜单的最顶层父菜单

注意:测试页面不是当前页面 - 我只显示其页面 ID。

wordpress menu navigation
2个回答
1
投票

我使用下面的代码来解决我的问题。

function get_l1_menu_label( $page_id, $menu = 'primary-menu' ) {

    //get menu
    $all_menus = new WP_Query( [
        'post_type'         => [ 'nav_menu_item' ],
        'meta_key'          => '_menu_item_object_id',
        'meta_value'        => $page_id, // page id here
        'tax_query'         => [
            [
                'taxonomy'  => 'nav_menu',
                'field'     => 'slug',
                'terms'     => $menu, //menu slug here
            ]
        ],
        'fields'            => 'ids'
    ] );

    $current_page_menu_id = $all_menus->posts[0];

    if ( !$current_page_menu_id ) {
        //looks like the page is not menu
         return '';
    }

    $parent_menu_id = (int) get_parent_menu_label_recursion($current_page_menu_id);

    //get the custom nav title set in menu admin
    $title = get_the_title( $parent_menu_id );

    if ( $title !== '' ) {
        return $title;
    } else {
        //the page orginal title is the label
        $parent_menu_page_id =  get_post_meta( $parent_menu_id, '_menu_item_object_id', true );
        return get_the_title( $parent_menu_page_id );
    }
}

//recursive function to fetch a top most parent id in nav menu
function get_parent_menu_label_recursion($menu_id) {
    
    $parent_menu_id = (int) get_post_meta( $menu_id, '_menu_item_menu_item_parent', true );
    
    if ( $parent_menu_id !== 0 ) {
        //the parent exist - send the parent menu
        return get_parent_menu_label_recursion($parent_menu_id);
    } else {
        //the menu sent to this function is the top most menu
        return $menu_id;
    }
}

希望这对某人有帮助。


0
投票

我有一个非常相似的需求,除了我需要获取菜单 ID。

这是我的记录代码。

/**
     * Get all menus that use the given post id in its menu items
     * Returns an array of menu id (not menu items id) as a post can be called in several menus
     * php >= 7.4 (for lower version you need to replace [...$menus_ids, ...$related_ids] by array_merge($menus_ids, $related_ids)
     * @param int|bool $post_id
     * @return array
     */
    function get_post_menus($post_id = false)
    {
      // Get the current post if not
      if (!$post_id && !is_numeric($post_id)) $post_id = get_queried_object_id();
      // get every menu items related to this post
      $menu_items = wp_get_associated_nav_menu_items($post_id);

      // for each menu item, get the menu
      $menus_ids = [];
      foreach ($menu_items as $menu_item_id) {
        $menus = wp_get_object_terms($menu_item_id, 'nav_menu');
        if (is_array($menus)) {
          $related_ids = array_map(function ($term) {
            return $term->term_id;
          }, $menus);
          $menus_ids = [...$menus_ids, ...$related_ids];
        }
      }
      return $menus_ids;
    }

像这样使用它:

 $menu_ids = get_post_menus();
 // or
 $post_id = 12;
 $menu_ids = get_post_menus($post_id);
© www.soinside.com 2019 - 2024. All rights reserved.