函数文档

parent_dropdown()

💡 云策文档标注

概述

parent_dropdown() 函数用于生成页面父级下拉菜单的 option HTML 元素,支持递归处理子页面以构建层级结构。它通过查询数据库获取页面数据,并输出格式化选项。

关键要点

  • 函数功能:打印页面父级下拉菜单的 option HTML 元素,用于在管理界面中选择页面父级。
  • 参数说明:接受 $default_page(默认选中页面ID)、$parent_page(父页面ID)、$level(深度级别)和 $post(帖子ID或WP_Post对象)四个可选参数。
  • 返回值:成功时返回 void,如果页面没有子页面则返回 false。
  • 递归机制:通过递归调用自身处理子页面,使用 $level 参数控制缩进以显示层级关系。
  • 安全处理:使用 wpdb::prepare() 进行 SQL 查询准备,esc_html() 转义输出,防止 XSS 攻击。
  • 相关函数:依赖 selected()、get_post()、wpdb::get_results() 等核心 WordPress 函数。

代码示例

function parent_dropdown( $default_page = 0, $parent_page = 0, $level = 0, $post = null ) {
    global $wpdb;

    $post  = get_post( $post );
    $items = $wpdb->get_results(
        $wpdb->prepare(
            "SELECT ID, post_parent, post_title
            FROM $wpdb->posts
            WHERE post_parent = %d AND post_type = 'page'
            ORDER BY menu_order",
            $parent_page
        )
    );

    if ( $items ) {
        foreach ( $items as $item ) {
            // A page cannot be its own parent.
            if ( $post && $post->ID && (int) $item->ID === $post->ID ) {
                continue;
            }

            $pad      = str_repeat( ' ', $level * 3 );
            $selected = selected( $default_page, $item->ID, false );

            echo "nt<option value='" . $item->ID . "' $selected>" . $pad . " " . esc_html( $item->post_title ) . "</option>";
            parent_dropdown( $default_page, $item->ID, $level + 1 );
        }
    } else {
        return false;
    }
}

注意事项

  • 该函数主要用于 WordPress 管理后台的页面编辑界面,开发者可调用它来生成自定义的父级选择下拉菜单。
  • 递归调用时需注意性能,避免在页面数量巨大时导致效率问题。
  • 参数 $post 在 4.4.0 版本中添加,允许传入帖子对象以进行更灵活的上下文处理。
  • 函数内部使用全局 $wpdb 对象进行数据库查询,确保在正确上下文中使用。

📄 原文内容

Prints out option HTML elements for the page parents drop-down.

Parameters

$default_pageintoptional
The default page ID to be pre-selected. Default 0.
$parent_pageintoptional
The parent page ID. Default 0.
$levelintoptional
Page depth level. Default 0.
$postint|WP_Postoptional
Post ID or WP_Post object.

Default:null

Return

void|false Void on success, false if the page has no children.

Source

function parent_dropdown( $default_page = 0, $parent_page = 0, $level = 0, $post = null ) {
	global $wpdb;

	$post  = get_post( $post );
	$items = $wpdb->get_results(
		$wpdb->prepare(
			"SELECT ID, post_parent, post_title
			FROM $wpdb->posts
			WHERE post_parent = %d AND post_type = 'page'
			ORDER BY menu_order",
			$parent_page
		)
	);

	if ( $items ) {
		foreach ( $items as $item ) {
			// A page cannot be its own parent.
			if ( $post && $post->ID && (int) $item->ID === $post->ID ) {
				continue;
			}

			$pad      = str_repeat( ' ', $level * 3 );
			$selected = selected( $default_page, $item->ID, false );

			echo "nt<option class='level-$level' value='$item->ID' $selected>$pad " . esc_html( $item->post_title ) . '</option>';
			parent_dropdown( $default_page, $item->ID, $level + 1 );
		}
	} else {
		return false;
	}
}

Changelog

Version Description
4.4.0 $post argument was added.
1.5.0 Introduced.