我们正在举办一个约有 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);
}
}
其中一个用户未添加到列表中,因为列表在重新保存之前已被覆盖。
我一直在思考更好的或不同的方法来做到这一点。例如,有没有办法检查进程是否已经在运行?
在异步请求中,更新数据库中的行(尽管非常罕见)可能会导致数据丢失。可以通过添加和删除行来存储数据,而不是更新。
我建议使用 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;
或其他数据来源:
$元类型: 对象元数据的类型。接受“帖子”、“评论”、“术语”、“用户”或具有关联元表的任何其他对象类型。
每个数据值都存储在数据库的新行中。所以不存在覆盖问题:
此外,对于读取和删除:
// 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' );
}