_resolve_template_for_new_post()
云策文档标注
概述
_resolve_template_for_new_post() 是一个 WordPress 函数,用于在编辑新文章时,设置当前 WP_Query 以返回 auto-draft 状态的文章,以便进行模板解析。它通过检查查询参数和用户权限来有条件地修改查询变量。
关键要点
- 函数作用:允许 WP_Query 返回 auto-draft 文章,以支持新文章编辑时的模板解析。
- 参数:接受一个 WP_Query 实例作为必需参数,通过引用传递。
- 条件逻辑:仅对主查询生效,检查文章 ID 和状态,并验证当前用户是否有编辑权限。
- 相关函数:涉及 WP_Query::is_main_query()、WP_Query::set()、current_user_can()、remove_filter() 和 get_post() 等核心函数。
代码示例
function _resolve_template_for_new_post( $wp_query ) {
if ( ! $wp_query->is_main_query() ) {
return;
}
remove_filter( 'pre_get_posts', '_resolve_template_for_new_post' );
// Pages.
$page_id = isset( $wp_query->query['page_id'] ) ? $wp_query->query['page_id'] : null;
// Posts, including custom post types.
$p = isset( $wp_query->query['p'] ) ? $wp_query->query['p'] : null;
$post_id = $page_id ? $page_id : $p;
$post = get_post( $post_id );
if (
$post &&
'auto-draft' === $post->post_status &&
current_user_can( 'edit_post', $post->ID )
) {
$wp_query->set( 'post_status', 'auto-draft' );
}
}注意事项
- 此函数仅在 WordPress 5.9.0 版本中引入,使用时需注意版本兼容性。
- 它通过 remove_filter() 移除自身钩子,避免在后续查询中重复执行。
- 函数依赖于查询参数(如 page_id 或 p)来获取文章 ID,确保这些参数在上下文中正确设置。
原文内容
Sets the current WP_Query to return auto-draft posts.
Description
The auto-draft status indicates a new post, so allow the the WP_Query instance to return an auto-draft post for template resolution when editing a new post.
Parameters
Source
function _resolve_template_for_new_post( $wp_query ) {
if ( ! $wp_query->is_main_query() ) {
return;
}
remove_filter( 'pre_get_posts', '_resolve_template_for_new_post' );
// Pages.
$page_id = isset( $wp_query->query['page_id'] ) ? $wp_query->query['page_id'] : null;
// Posts, including custom post types.
$p = isset( $wp_query->query['p'] ) ? $wp_query->query['p'] : null;
$post_id = $page_id ? $page_id : $p;
$post = get_post( $post_id );
if (
$post &&
'auto-draft' === $post->post_status &&
current_user_can( 'edit_post', $post->ID )
) {
$wp_query->set( 'post_status', 'auto-draft' );
}
}
Changelog
| Version | Description |
|---|---|
| 5.9.0 | Introduced. |