函数文档

_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

$wp_queryWP_Queryrequired
Current WP_Query instance, passed by reference.

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.