函数文档

wp_refresh_post_lock()

💡 云策文档标注

概述

wp_refresh_post_lock() 是一个 WordPress 函数,用于在新建/编辑文章屏幕中检查并刷新文章锁定状态,通常与 Heartbeat API 配合使用。它处理来自客户端的锁定请求,验证用户权限,并返回锁定状态信息或更新锁定。

关键要点

  • 函数用于检查文章是否被其他用户锁定,并在必要时刷新锁定。
  • 接收 Heartbeat 响应、POST 数据和屏幕 ID 作为参数,返回更新后的 Heartbeat 响应。
  • 验证用户是否有编辑文章的权限,并调用 wp_check_post_lock() 和 wp_set_post_lock() 来管理锁定。
  • 如果文章被锁定,返回包含用户信息的错误;否则,设置新锁定并返回相关信息。

代码示例

function wp_refresh_post_lock( $response, $data, $screen_id ) {
    if ( array_key_exists( 'wp-refresh-post-lock', $data ) ) {
        $received = $data['wp-refresh-post-lock'];
        $send     = array();

        $post_id = absint( $received['post_id'] );

        if ( ! $post_id ) {
            return $response;
        }

        if ( ! current_user_can( 'edit_post', $post_id ) ) {
            return $response;
        }

        $user_id = wp_check_post_lock( $post_id );
        $user    = get_userdata( $user_id );

        if ( $user ) {
            $error = array(
                'name' => $user->display_name,
                'text' => sprintf( __( '%s has taken over and is currently editing.' ), $user->display_name ),
            );

            if ( get_option( 'show_avatars' ) ) {
                $error['avatar_src']    = get_avatar_url( $user->ID, array( 'size' => 64 ) );
                $error['avatar_src_2x'] = get_avatar_url( $user->ID, array( 'size' => 128 ) );
            }

            $send['lock_error'] = $error;
        } else {
            $new_lock = wp_set_post_lock( $post_id );

            if ( $new_lock ) {
                $send['new_lock'] = implode( ':', $new_lock );
            }
        }

        $response['wp-refresh-post-lock'] = $send;
    }

    return $response;
}

注意事项

  • 此函数是 WordPress 核心的一部分,自版本 3.6.0 引入,主要用于后台文章编辑界面的并发控制。
  • 开发者应确保在调用时正确处理 Heartbeat API 的数据流,避免权限或数据验证问题。
  • 相关函数如 wp_check_post_lock() 和 wp_set_post_lock() 可用于自定义实现类似功能。

📄 原文内容

Checks lock status on the New/Edit Post screen and refresh the lock.

Parameters

$responsearrayrequired
The Heartbeat response.
$dataarrayrequired
The $_POST data sent.
$screen_idstringrequired
The screen ID.

Return

array The Heartbeat response.

Source

function wp_refresh_post_lock( $response, $data, $screen_id ) {
	if ( array_key_exists( 'wp-refresh-post-lock', $data ) ) {
		$received = $data['wp-refresh-post-lock'];
		$send     = array();

		$post_id = absint( $received['post_id'] );

		if ( ! $post_id ) {
			return $response;
		}

		if ( ! current_user_can( 'edit_post', $post_id ) ) {
			return $response;
		}

		$user_id = wp_check_post_lock( $post_id );
		$user    = get_userdata( $user_id );

		if ( $user ) {
			$error = array(
				'name' => $user->display_name,
				/* translators: %s: User's display name. */
				'text' => sprintf( __( '%s has taken over and is currently editing.' ), $user->display_name ),
			);

			if ( get_option( 'show_avatars' ) ) {
				$error['avatar_src']    = get_avatar_url( $user->ID, array( 'size' => 64 ) );
				$error['avatar_src_2x'] = get_avatar_url( $user->ID, array( 'size' => 128 ) );
			}

			$send['lock_error'] = $error;
		} else {
			$new_lock = wp_set_post_lock( $post_id );

			if ( $new_lock ) {
				$send['new_lock'] = implode( ':', $new_lock );
			}
		}

		$response['wp-refresh-post-lock'] = $send;
	}

	return $response;
}

Changelog

Version Description
3.6.0 Introduced.