函数文档

wp_delete_nav_menu()

💡 云策文档标注

概述

wp_delete_nav_menu() 函数用于删除一个导航菜单,包括其关联的菜单项和主题位置设置。它接受菜单ID、slug、名称或对象作为参数,并返回操作结果。

关键要点

  • 参数 $menu 可以是整数、字符串或 WP_Term 对象,表示菜单的ID、slug、名称或对象。
  • 返回值:成功时返回 true,失败时返回 false 或 WP_Error 对象。
  • 函数内部会先获取菜单对象,删除关联的菜单项(通过 wp_delete_post),然后删除菜单术语(通过 wp_delete_term)。
  • 还会更新主题的导航菜单位置设置,移除被删除菜单的分配。
  • 成功删除后,会触发 wp_delete_nav_menu 动作钩子。

代码示例

function wp_delete_nav_menu( $menu ) {
    $menu = wp_get_nav_menu_object( $menu );
    if ( ! $menu ) {
        return false;
    }

    $menu_objects = get_objects_in_term( $menu->term_id, 'nav_menu' );
    if ( ! empty( $menu_objects ) ) {
        foreach ( $menu_objects as $item ) {
            wp_delete_post( $item );
        }
    }

    $result = wp_delete_term( $menu->term_id, 'nav_menu' );

    // Remove this menu from any locations.
    $locations = get_nav_menu_locations();
    foreach ( $locations as $location => $menu_id ) {
        if ( $menu_id === $menu->term_id ) {
            $locations[ $location ] = 0;
        }
    }
    set_theme_mod( 'nav_menu_locations', $locations );

    if ( $result && ! is_wp_error( $result ) ) {
        /**
         * Fires after a navigation menu has been successfully deleted.
         *
         * @since 3.0.0
         *
         * @param int $term_id ID of the deleted menu.
         */
        do_action( 'wp_delete_nav_menu', $menu->term_id );
    }

    return $result;
}

注意事项

  • 删除菜单前,确保没有其他功能依赖该菜单,以避免意外错误。
  • 函数会递归删除所有关联的菜单项,操作不可逆,请谨慎使用。
  • 触发 wp_delete_nav_menu 钩子时,可以添加自定义回调函数进行后续处理。

📄 原文内容

Deletes a navigation menu.

Parameters

$menuint|string|WP_Termrequired
Menu ID, slug, name, or object.

Return

bool|WP_Error True on success, false or WP_Error object on failure.

Source

function wp_delete_nav_menu( $menu ) {
	$menu = wp_get_nav_menu_object( $menu );
	if ( ! $menu ) {
		return false;
	}

	$menu_objects = get_objects_in_term( $menu->term_id, 'nav_menu' );
	if ( ! empty( $menu_objects ) ) {
		foreach ( $menu_objects as $item ) {
			wp_delete_post( $item );
		}
	}

	$result = wp_delete_term( $menu->term_id, 'nav_menu' );

	// Remove this menu from any locations.
	$locations = get_nav_menu_locations();
	foreach ( $locations as $location => $menu_id ) {
		if ( $menu_id === $menu->term_id ) {
			$locations[ $location ] = 0;
		}
	}
	set_theme_mod( 'nav_menu_locations', $locations );

	if ( $result && ! is_wp_error( $result ) ) {

		/**
		 * Fires after a navigation menu has been successfully deleted.
		 *
		 * @since 3.0.0
		 *
		 * @param int $term_id ID of the deleted menu.
		 */
		do_action( 'wp_delete_nav_menu', $menu->term_id );
	}

	return $result;
}

Hooks

do_action( ‘wp_delete_nav_menu’, int $term_id )

Fires after a navigation menu has been successfully deleted.

Changelog

Version Description
3.0.0 Introduced.