1

ユーザーが 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)

通常 data1 が「x」であり、data2 が「y」である myplugin_transactions から * を選択したいとします。この場合はどうすればいいですか?

SELECT * FROM myplugin_transactions LEFT JOIN myplugin_meta ON myplugin_transactions.id = myplugin_meta.txn_id WHERE ( ... ? )
4

1 に答える 1

1

この回答は、コードを提供しないため非常に一般的なものになりますが、コメントするには長すぎます。

data1まず、これらの , data2,data3フィールドに追加のデータを格納するべきではありません。MySQL を使用しているため、リレーショナル データベースの機能を利用できます。それらを使用します。

ID フィールド (アクションの ID) とデータ フィールドを持つ別のテーブルが必要です。そうすれば、メタデータを 0 から好きなだけ保存できます。つまり、ワードプレスはすでにメタデータでこれを行っていますよね?

次に、コメントが削除された場合、それに関連するアクションを削除しますか? その場合は、API にフックするだけです。次のフックがあると思いますdelete_commenthttp://codex.wordpress.org/Plugin_API/Action_Reference#Comment.2C_Ping.2C_and_Trackback_Actions

それ以外の場合は、アクションを保持したい場合は、追加のフィールドまたはメタデータの一部を追加することができますdeleted. コメントが削除されたら、上記のようにdelete_comment呼び出しにフックし、アクションを に更新しdeleted = trueます。次に、すべてのアクションに対してクエリを実行するときに、削除されたステートメント... WHERE deleted = NULL ...などを除外します。

EDIT2:

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キーワードを意味のある説明に置き換えることは明らかです。

于 2012-12-05T18:15:44.550 に答える