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
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;
}
}