我需要一个表来记录用户在 WordPress 中进行的某些操作。
截至目前,这是我已经使用的数据库模式:
id bigint(20) NOT NULL AUTO_INCREMENT,
uid bigint(20) NOT NULL,
type VARCHAR(256) NOT NULL,
data1 TEXT NOT NULL,
data2 TEXT NOT NULL,
data3 TEXT NOT NULL,
timestamp bigint(20) NOT NULL,
UNIQUE KEY id (id)
让我澄清一下:
uid: User ID of the wordpress user
type: Type of action the user made (can be 'comment', 'new_post', 'login', etc)
data1/2/3: additional data (for example, ID of comment or post made)
为了显示日志,我会查询数据库并通过特定过滤器运行以获取要为该特定日志显示的文本。所以它的工作原理是这样的:
if( $type == 'comment') {
$comment = get_comment( $data1 );
$user = get_user($uid);
echo "User {$user->name} has made a <a href='{$comment->permalink}'>comment</a>";
}
这是最有效的做事方式吗?这对我来说似乎很好,因为我不想只将 HTML 存储在要输出的日志表中。
但是,问题来了,我想在满足某些条件时隐藏特定的日志条目。例如,如果评论不再存在,我想隐藏该条目。这会给分页带来一些问题。关于如何克服这个问题有什么建议吗?
谢谢!
编辑:
myplugin_transactions
id bigint(20) NOT NULL AUTO_INCREMENT,
user_id bigint(20) NOT NULL,
type VARCHAR(256) NOT NULL,
timestamp bigint(20) NOT NULL,
UNIQUE KEY id (id)
myplugin_meta
id bigint(20) NOT NULL AUTO_INCREMENT,
txn_id bigint(20) NOT NULL,
key VARCHAR(256) NOT NULL,
data TEXT NOT NULL,
UNIQUE KEY id (id)
假设我想从 myplugin_transactions 中选择 *,其中 data1 通常为“x”而 data2 为“y”。在这种情况下我应该怎么做?
SELECT * FROM myplugin_transactions LEFT JOIN myplugin_meta ON myplugin_transactions.id = myplugin_meta.txn_id WHERE ( ... ? )
最佳答案
这个答案将是非常通用的,因为它不提供任何代码,但对于评论来说也太长了。
首先,您不应该在那些 data1
、data2
、data3
字段中存储额外的数据。您正在使用 MySQL,因此您拥有关系数据库的强大功能。使用它们。
您应该有另一个表,它有一个 ID 字段(操作的 ID)和一个数据字段。这样您就可以将 0 存储到任意数量的元数据中。我的意思是,wordpress 已经使用元数据执行此操作了吗?
其次,如果一条评论被删除,你只是想删除与其相关的 Action 吗?如果是这样,只需连接到 API。我相信 delete_comment
有一个钩子(Hook):http://codex.wordpress.org/Plugin_API/Action_Reference#Comment.2C_Ping.2C_and_Trackback_Actions
否则,如果您想保留该操作,您可以添加一个额外的字段或元数据片段,例如,deleted
。删除评论时,如上所示:挂接到 delete_comment
调用并将操作更新为 deleted = true
。然后,当您对所有操作运行查询时,排除已删除的语句,例如 ... WHERE deleted = NULL ...
等
编辑2:
要回答您的 select 语句,类似这样的方法可能有效:
SELECT * FROM myplugin_transactions
LEFT JOIN myplugin_meta AS data1
ON ( myplugin_transactions.id = data1.txn_id AND data1.key = 'data1' )
LEFT JOIN myplugin_meta AS data2
ON ( myplugin_transactions.id = data2.txn_id AND data2.key = 'data2' )
WHERE data1.data = 'x'
AND data2.data = 'y'
显然用有意义的描述替换了 data1
和 data2
关键字。
关于php - 在 WordPress 中记录用户操作的数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13729508/