函数文档

wp_ajax_menu_get_metabox()

💡 云策文档标注

概述

wp_ajax_menu_get_metabox() 是一个 WordPress AJAX 处理函数,用于根据用户请求动态检索菜单元框内容。它通过检查用户权限和请求参数,生成相应的元框 HTML 并返回 JSON 格式数据。

关键要点

  • 函数通过 AJAX 处理菜单元框的获取,要求用户具有 'edit_theme_options' 权限。
  • 根据 $_POST['item-type'] 参数('post_type' 或 'taxonomy')决定调用 wp_nav_menu_item_post_type_meta_box 或 wp_nav_menu_item_taxonomy_meta_box 回调函数。
  • 使用 get_post_types() 或 get_taxonomies() 获取对象列表,并应用 nav_menu_meta_box_object 过滤器。
  • 输出 JSON 响应,包含 replace-id 和 markup 字段,用于前端更新菜单界面。

代码示例

if ( isset( $_POST['item-type'] ) && 'post_type' === $_POST['item-type'] ) {
    $type     = 'posttype';
    $callback = 'wp_nav_menu_item_post_type_meta_box';
    $items    = (array) get_post_types( array( 'show_in_nav_menus' => true ), 'object' );
} elseif ( isset( $_POST['item-type'] ) && 'taxonomy' === $_POST['item-type'] ) {
    $type     = 'taxonomy';
    $callback = 'wp_nav_menu_item_taxonomy_meta_box';
    $items    = (array) get_taxonomies( array( 'show_ui' => true ), 'object' );
}

注意事项

  • 函数在 WordPress 3.1.0 版本引入,需确保兼容性。
  • 使用 wp_die() 终止执行,确保 AJAX 请求正确处理。
  • 注意 $_POST 参数的安全性,函数依赖用户输入来生成元框内容。

📄 原文内容

Handles for retrieving menu meta boxes via AJAX.

Source

function wp_ajax_menu_get_metabox() {
	if ( ! current_user_can( 'edit_theme_options' ) ) {
		wp_die( -1 );
	}

	require_once ABSPATH . 'wp-admin/includes/nav-menu.php';

	if ( isset( $_POST['item-type'] ) && 'post_type' === $_POST['item-type'] ) {
		$type     = 'posttype';
		$callback = 'wp_nav_menu_item_post_type_meta_box';
		$items    = (array) get_post_types( array( 'show_in_nav_menus' => true ), 'object' );
	} elseif ( isset( $_POST['item-type'] ) && 'taxonomy' === $_POST['item-type'] ) {
		$type     = 'taxonomy';
		$callback = 'wp_nav_menu_item_taxonomy_meta_box';
		$items    = (array) get_taxonomies( array( 'show_ui' => true ), 'object' );
	}

	if ( ! empty( $_POST['item-object'] ) && isset( $items[ $_POST['item-object'] ] ) ) {
		$menus_meta_box_object = $items[ $_POST['item-object'] ];

		/** This filter is documented in wp-admin/includes/nav-menu.php */
		$item = apply_filters( 'nav_menu_meta_box_object', $menus_meta_box_object );

		$box_args = array(
			'id'       => 'add-' . $item->name,
			'title'    => $item->labels->name,
			'callback' => $callback,
			'args'     => $item,
		);

		ob_start();
		$callback( null, $box_args );

		$markup = ob_get_clean();

		echo wp_json_encode(
			array(
				'replace-id' => $type . '-' . $item->name,
				'markup'     => $markup,
			)
		);
	}

	wp_die();
}

Hooks

apply_filters( ‘nav_menu_meta_box_object’, WP_Post_Type|false $post_type )

Filters whether a menu items meta box will be added for the current object type.

Changelog

Version Description
3.1.0 Introduced.