函数文档

wp_ajax_wp_remove_post_lock()

💡 云策文档标注

概述

wp_ajax_wp_remove_post_lock() 是一个 WordPress AJAX 处理函数,用于移除文章编辑锁。它验证请求参数和用户权限,并更新文章元数据以解除锁定状态。

关键要点

  • 函数通过 AJAX 处理移除文章锁的请求,确保只有当前锁定用户才能执行操作。
  • 验证包括检查 post_ID 和 active_post_lock 参数、AJAX referer、用户编辑权限以及当前用户 ID 是否匹配锁定用户。
  • 使用 wp_check_post_lock_window 过滤器调整锁定时长,并调用 update_post_meta 更新 _edit_lock 元数据。
  • 函数在验证失败或成功时调用 wp_die 返回相应状态码(0 表示失败,1 表示成功)。

代码示例

if ( empty( $_POST['post_ID'] ) || empty( $_POST['active_post_lock'] ) ) {
    wp_die( 0 );
}

$post_id = (int) $_POST['post_ID'];
$post    = get_post( $post_id );

if ( ! $post ) {
    wp_die( 0 );
}

check_ajax_referer( 'update-post_' . $post_id );

if ( ! current_user_can( 'edit_post', $post_id ) ) {
    wp_die( -1 );
}

$active_lock = array_map( 'absint', explode( ':', $_POST['active_post_lock'] ) );

if ( get_current_user_id() !== $active_lock[1] ) {
    wp_die( 0 );
}

$new_lock = ( time() - apply_filters( 'wp_check_post_lock_window', 150 ) + 5 ) . ':' . $active_lock[1];
update_post_meta( $post_id, '_edit_lock', $new_lock, implode( ':', $active_lock ) );
wp_die( 1 );

注意事项

  • 函数依赖于 AJAX 请求,必须通过 WordPress AJAX 机制调用,确保安全性和正确性。
  • 使用 wp_check_post_lock_window 过滤器时,注意参数单位为秒,默认值为 150,函数会在此基础上加 5 秒计算新锁时间。
  • 错误处理通过 wp_die 返回状态码,开发者需在前端处理这些响应以提供用户反馈。

📄 原文内容

Handles removing a post lock via AJAX.

Source

function wp_ajax_wp_remove_post_lock() {
	if ( empty( $_POST['post_ID'] ) || empty( $_POST['active_post_lock'] ) ) {
		wp_die( 0 );
	}

	$post_id = (int) $_POST['post_ID'];
	$post    = get_post( $post_id );

	if ( ! $post ) {
		wp_die( 0 );
	}

	check_ajax_referer( 'update-post_' . $post_id );

	if ( ! current_user_can( 'edit_post', $post_id ) ) {
		wp_die( -1 );
	}

	$active_lock = array_map( 'absint', explode( ':', $_POST['active_post_lock'] ) );

	if ( get_current_user_id() !== $active_lock[1] ) {
		wp_die( 0 );
	}

	/**
	 * Filters the post lock window duration.
	 *
	 * @since 3.3.0
	 *
	 * @param int $interval The interval in seconds the post lock duration
	 *                      should last, plus 5 seconds. Default 150.
	 */
	$new_lock = ( time() - apply_filters( 'wp_check_post_lock_window', 150 ) + 5 ) . ':' . $active_lock[1];
	update_post_meta( $post_id, '_edit_lock', $new_lock, implode( ':', $active_lock ) );
	wp_die( 1 );
}

Hooks

apply_filters( ‘wp_check_post_lock_window’, int $interval )

Filters the post lock window duration.

Changelog

Version Description
3.1.0 Introduced.