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.
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. |