wordpress 中的选项更新无法同时调用

问题描述 投票:0回答:1

我们正在举办一个约有 1000 名用户的活动,他们每天都必须提交一些内容。当他们提交时,他们的电子邮件将存储在 WordPress 选项的列表中。

我遇到了两个用户同时提交条目的问题 - 以下函数同时被调用两次:

function tw_add_user_to_submitted_today_list($user_email){

  $tw_settings = get_option("tw_settings");
  if (!in_Array($user_email, $tw_settings['submitted_today'])){
    array_push( $tw_settings['submitted_today'], $user_email);
    update_option("tw_settings", $tw_settings);
  }
}

其中一个用户未添加到列表中,因为列表在重新保存之前已被覆盖。

我一直在思考更好的或不同的方法来做到这一点。例如,有没有办法检查进程是否已经在运行?

wordpress
1个回答
0
投票

在异步请求中,更新数据库中的行(尽管非常罕见)可能会导致数据丢失。可以通过添加和删除行来存储数据,而不是更新。

我建议使用 update_metadata()get_metadata()

// Adds an email address to the email list in the database.
// If the email address is already in the list, no action is taken.
function add_email_to_list_atakanau( $email ) {
    $admin_user_id = 123; // ID of the (user) object metadata is for.
    // Check if the email address exists.
    if ( get_metadata( 'user', $admin_user_id, 'email_list', true ) ) {
        $email_list = get_metadata( 'user', $admin_user_id, 'email_list' );
        if ( in_array( $email, $email_list ) ) {
            return;
        }
    }

    // Add the email address to the list.
    add_metadata( 'user', $admin_user_id, 'email_list', $email );
}

在此示例中,元数据已添加到用户配置文件中。您可以使用您自己的用户ID。

$admin_user_id = 123;

或其他数据来源:

$元类型: 对象元数据的类型。接受“帖子”、“评论”、“术语”、“用户”或具有关联元表的任何其他对象类型。

每个数据值都存储在数据库的新行中。所以不存在覆盖问题:

元_id 用户ID 元键 元值
1000 123 电子邮件列表 [电子邮件受保护]
1001 123 电子邮件列表 [电子邮件受保护]

此外,对于读取和删除:

// Removes an email address from the email list in the database.
function remove_email_from_list_atakanau( $email ) {
    delete_metadata( 'user', 123, 'email_list', $email );
}

// Gets the email list from the database.
function get_email_list_atakanau() {
    return get_metadata( 'user', 123, 'email_list' );
}
© www.soinside.com 2019 - 2024. All rights reserved.