问题描述

我正在设置一个新的 WordPress 多站点实例,并且仍然在堆栈中处理一些扭结。目前最显著的是用户注册电子邮件由于某种原因没有被提供。结果是,几个用户名被困在一边,因为激活它们所需的确认邮件将丢失。

现在我想手动注册这些用户名,没有确认电子邮件,但是当我尝试这样做时,我会收到一个错误,称该名称是保留的,可能在几天内可用。我怎么能 un-reserve 他们?

最佳解决方案

DB 访问层& 删除行

WordPress 使用 wpdb 类来管理使用 global $wpdb 对数据库层的访问。该类提供了一个名为 delete()的方法来删除表中的行:

$wpdb->delete( $table, $where, $where_format = null );

多功能桌子激活键

WordPress 有 some MU specific tables,其中一个是 {$wpdb->prefix}signups(您的 wp-config.php 文件中设置的前缀) 。 Tables scheme here 。负责用户帐号激活的是 activation_key,在用户点击邮件中的链接之后,它将被设置。之后,activated 键将被设置为 datetime 值。在帐户激活之前,默认值为 0000-00-00 00:00:00(如果您需要查询默认值) 。另外在 tinyint /1active 的过程中,如果用户处于活动状态,则将其设置为 1

核心本身使用 wpmu_activate_signup()。看看它的一些例子。以下是更新用户条目以激活它 – 为了可读性而进行了重新修改。

$wpdb->update(
    $wpdb->signups,
    array(
        'active'    => 1,
        'activated' => current_time( 'mysql', true ),
    ),
    array( 'activation_key' => $key, )
);

针对 not-yet-activated 帐户构建查询

只要让 WP 做得很努力:

global $wpdb;
$wpdb->delete(
    $wpdb->signups,
    array( 'user_login' => 'some_login', )
);

如果您使用 (n admin) 表单执行这些请求 (例如扩展 WP_List_Table) 以指示您正在使用字符串,则可以使用第 3 个参数 (数组) 。请记住,您仍然应该对 $_POST 的值进行消毒。提示:您也可以使用 user_email

global $wpdb;
$wpdb->delete(
    $wpdb->signups,
    array( 'user_login' => 'some_login', ),
    array( '%s', )
);

次佳解决方案

如果您想要一个快速解决方案来删除数据库中针对特定用户的注册,那么应该执行以下操作:

/**
 * Delete a row in the signups table for a given username.
 *
 * @param string $user_login Username.
 * @return bool Whether the signup row was successfully deleted.
 */
function delete_activation_key_by_user( $user_login ) {
    global $wpdb;

    $success = false;

    if ( false !== $wpdb->delete( $wpdb->signups, array( 'user_login' => sanitize_text_field( $user_login ) ) ) ) {
        $success = true;
    }
    return $success;
}

var_dump( delete_activation_key_by_user( 'the_username' ) );
// bool(true|false)

您也可以在 WordPress.org repo 中使用名为 「用户激活密钥」 的插件来管理此问题,同时确定为什么不发送电子邮件。它允许您手动删除或批准 Multisite 中的用户的激活密钥。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。