将自定义字段添加到特定菜单

时间:2020-11-14 作者:Justin Breen

如何将自定义字段添加到特定菜单?

例如,“我有菜单”;“主要”;ID为13。如何运行wp_nav_menu_item_custom_fields 仅当ID与当前选定的菜单匹配时挂钩?

我试着从$id 钩子的参数,但它始终返回0。我想这样检查身份证:

function add_menu_field( $item_id, $item, $depth, $args, $id ) {
    var_dump( $id );
}

add_action( \'wp_nav_menu_item_custom_fields\', \'add_menu_field\', 10, 5 );
此返回int(0) 但我的导航菜单ID是13。我是否错误地使用了这个钩子,或者是否有其他方法获取ID?我的目标是通过检查ID在特定nav上放置自定义字段。

谢谢你的帮助!

1 个回复
SO网友:Sally CJ

我是不是用错了这个钩子

不,你不是。

有没有其他方法获取ID?

是的,试试这个:

function add_menu_field( $item_id, $item, $depth, $args, $id ) {
    $id2 = 0;

    if ( ! $id && isset( $_GET[\'menu\'] ) && $_GET[\'menu\'] ) {
        $id2 = absint( $_GET[\'menu\'] );
    }
    elseif ( ! $id && ! isset( $_GET[\'menu\'] ) ) {
        // Get recently edited nav menu.
        $id2 = absint( get_user_option( \'nav_menu_recently_edited\' ) );

        if ( ! is_nav_menu( $id2 ) ) {
            $nav_menus = wp_get_nav_menus();
            $id2 = ( ! empty( $nav_menus ) ) ? $nav_menus[0]->term_id : 0;
        }
    }

    if ( 13 === $id2 && is_nav_menu( $id2 ) ) {
        echo \'<hr>add your awesome custom field here\';
    }
}
这就是WordPress在wp-admin/nav-menus.php (外观→ 菜单)页面-如果没有选择菜单($_GET[\'menu\'] 未设置),我们使用最近编辑的菜单(如果有);如果没有,则使用可用导航菜单中的第一个菜单。

备用选项(使用过滤器添加操作)

您可以使用wp_edit_nav_menu_walker 将您的操作添加到wp_nav_menu_item_custom_fields 这样,操作(即挂钩回调)将只显示自定义字段。例如:

add_filter( \'wp_edit_nav_menu_walker\', \'wpse_378190\', 10, 2 );
function wpse_378190( $class, $menu_id ) {
    $tag = \'wp_nav_menu_item_custom_fields\';
    if ( 13 === $menu_id && ! has_action( $tag, \'add_menu_field2\' ) ) {
        add_action( $tag, \'add_menu_field2\', 10, 5 );
    }

    return $class;
}

// This function is hooked to wp_nav_menu_item_custom_fields and fires only if the
// menu ID is 13. So no need to check the $id and just display your custom field.
function add_menu_field2( $item_id, $item, $depth, $args, $_id ) {
    $id = 13;
    echo \'<hr>display your awesome custom field here\';
}