私は投稿が複数の返信/フィードバックを持つことができるシステムを開発しています。今のところ私はそれぞれのコメントをシリアライズされたpostmeta
として保存しています。しかし、今日になって、同じ目的で既存のcomments
テーブルを使用できること、そしてcommentmeta
テーブルがある場合は追加のデータをそこに格納できることがわかりました。
それで、私は wp_insert_comment()
を使い始めました、そして wp_new_comment()
をもっと強固なものにしたいと思います、ここで comment_type
パラメータ私はそれが格納されていることがわかりました:
null
、pingback
、trackbacks
wp_posts
のpost_type
列と似ているように見えますが、実際にはそうなのでしょうか。特定の種類のコメント/フィードバックを追跡するために、私のカスタムcomment_type
をそこに格納しても安全ですか?
コメントタイプは投稿タイプに似ていますが、投稿タイプが1つ以上の投稿タイプをクエリできるのと同じように、特定の種類のコメントのみをクエリできるという点が異なります。
コア投稿タイプ(page、post)と同じように、コアコメントタイプもあります:'comment'
、'pingback'
、'trackback'
。
この2つの違いは、デフォルトではWP_Query
は厳密には要求されていない投稿タイプを取得せず、'post'
投稿タイプのみを取得することです。
集計表では、 WP_Comment_Query
、デフォルトでは、すべてのコメントタイプが該当します。
多くのテーマはコメントを表示するために wp_list_comments()
を使います。
この関数には、コメントタイプを表示に設定できる'type'
引数があります。
たとえば、デフォルトのテーマを見ると、その関数 は型引数 なしで使用されます。つまり、カスタムコメントタイプを使用していても、ほとんどのテーマでspecialcommentsが "通常の"コメントの中に表示されます。
この問題を解決するには、 'pre_get_comments'
フックを使用して、カスタムコメントタイプが「標準」のコメントタイプに沿って取得されないようにします。
/* Assuming 'my_custom_comment_type' is the name of custom comment type */
add_action( 'pre_get_comments', function(\WP_Comment_Query $query) {
/* only allow 'my_custom_comment_type' when is required explicitly */
if ( $query->query_vars['type'] !== 'my_custom_comment_type' ) {
$query->query_vars['type__not_in'] = array_merge(
(array) $query->query_vars['type__not_in'],
array('my_custom_comment_type')
);
}
});
上記のコードを使用して、'my_custom_comment_type'
を安全に使用して、標準のコメントと混同されないようにすることができます。
その後、カスタムコメントを取得する必要があるときは、コメントタイプslugを明示的に渡す必要があり、すべてうまくいくはずです。
ただし、 wp_list_comments()
または get_comments()
のように、コメントの取得に通常使用される関数は、承認されていない(またはスパム)コメントを自動的に除外します。
実際、設定によっては、カスタムコメントを保存するために wp_new_comment()
を使用すると、承認されていないものとして保存される可能性があり、適切な'type'
引数を明示的に使用してもそれらのコメントを解釈できません。
これを避けるために、3つの可能性があります。
'status'
(またはget_comments()
)のWP_Comment_Query
引数を"all"
に設定してください。これにより、承認されているかどうかにかかわらず、すべてのコメントが修正されますwp_insert_comment()
を使用し、'approved'
引数を1
に設定します。カスタムコメントタイプを持つ承認済みコメントとして常に保存するには、フィルタ 'pre_comment_approved' を使用します。
add_filter( 'pre_comment_approved', function( $approved, $data ) {
return isset($data['comment_type']) && $data['comment_type'] === 'my_custom_comment_type'
? 1
: $approved;
}, 20, 2);