我正在编写一个扩展Woocommerce的Wordpress插件,该插件需要存储有关用户的其他信息。
我知道有一个专用于此的单独的wp_user_meta表,但是我宁愿使用自定义表,因为我打算将Wordpress / Woocommerce用作初始平台,然后希望扩展至其他平台。数据也会经常查询。
此定制表需要每个用户一个条目,该条目由wp_user中的ID定义,因此本质上是一对一的关系。自定义表的示例架构是:
CREATE TABLE {$wpdb->prefix}custom_table (
custom_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
user_id BIGINT UNSIGNED NOT NULL,
custom_data varchar(200) NULL,
FOREIGN KEY (user_id) REFERENCES wp_users(ID),
PRIMARY KEY (custom_id)
)
我的问题是使用Wordpress,如何确保维持一对一关系?
我知道我将必须运行初始设置才能在自定义表中为现有用户创建条目。
除此之外,是否允许用户在用户生命周期中完全更改其ID?使用注册/删除挂钩来确保自定义表中的数据是最新的情况吗? (或者在wp_user表中发生删除操作时,删除操作会级联到其他表中)
答案 0 :(得分:1)
AFAIK,用户无法更改其ID或用户名(因为这会导致很多问题),所以您可以在这方面做到这一点。
此外,还有一些“陷阱”!您需要注意:
您的查询将失败,因为与user_id
中的ID
列定义的方式不完全相同。您有:wp_users
。应该是:user_id BIGINT UNSIGNED NOT NULL
。
要确保user_id BIGINT(20) UNSIGNED NOT NULL
是唯一的并保持一对一关系,您需要在查询中添加user_id
。
您的表必须使用完全相同的storage engine。在查询中,您没有为其定义存储引擎,因此MySQL将回退到默认引擎,该默认引擎可能与UNIQUE(user_id)
表使用的默认引擎相同或不同。如果不是同一查询,则查询将再次失败,并且将不会创建您的表。
以下是修改后的查询,假设wp_users
使用MyISAM存储引擎:
wp_users
如果要确保您的表使用与CREATE TABLE {$wpdb->prefix}custom_table (
custom_id bigint unsigned NOT NULL AUTO_INCREMENT,
user_id bigint(20) unsigned NOT NULL,
custom_data varchar(200) NULL,
FOREIGN KEY (user_id) REFERENCES wp_users(ID) ON DELETE CASCADE,
PRIMARY KEY (custom_id)
UNIQUE (user_id)
) ENGINE=MyISAM
表完全相同的存储引擎,并且在创建表之前执行此查询,则会告诉您需要哪个表:
wp_users
答案 1 :(得分:1)
作为参考的代码段-请注意应该检查数组大小等,但是这样做可以使我朝正确的方向前进。谢谢@cabrarahector
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
global $wpdb;
$query = "SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA='{$wpdb->dbname}' AND TABLE_NAME='{$wpdb->users}';";
$engine = $wpdb->get_results( $query )[0]->ENGINE;
$sql = "CREATE TABLE {$wpdb->prefix}custom_table (
custom_id bigint unsigned NOT NULL AUTO_INCREMENT,
user_id bigint(20) unsigned NOT NULL,
custom_data varchar(200) NULL,
FOREIGN KEY (user_id) REFERENCES wp_users(ID) ON DELETE CASCADE,
PRIMARY KEY (custom_id),
UNIQUE (user_id)
) ENGINE={$engine};";
dbDelta($sql);
这将在数据库中创建自定义表