Je développe un système dans lequel une publication peut avoir plusieurs réponses/commentaires. À partir de maintenant, je stocke chacun des commentaires sous la forme d'une postmeta
sérialisée. Mais aujourd’hui, j’ai compris que je pouvais utiliser la table comments
existante dans le même but, et qu’il existe une table commentmeta
, je peux également y stocker des données supplémentaires.
Donc, je suis arrivé en utilisant wp_insert_comment()
, et j'espère qu'un plus robuste est wp_new_comment()
, où j’ai introduit avec le paramètre comment_type
. J'ai trouvé qu'il stocke:
null
pour le type de commentaire par défaut 'commentaires',pingback
pour 'pingbacks', ettrackbacks
pour 'rétroliens'Comme cela semble similaire à la colonne wp_posts
'post_type
, mais est-ce réellement comme ça? Est-il prudent d’y stocker mon comment_type
personnalisé pour garder trace de certains types de commentaires/réactions?
Le type de commentaire est similaire au type de publication, car il permet d'interroger uniquement un type spécifique de commentaires, tout comme le type de publication permet d'interroger un ou plusieurs types de publication.
Et tout comme les types de publication de base (page, publication), il existe également un type de commentaire de base: 'comment'
, 'pingback'
, 'trackback'
.
Une différence entre les deux réside dans le fait que, par défaut, WP_Query
ne récupère pas les types de publication qui ne sont pas explicitement requis, mais uniquement le type de publication 'post'
.
Au pays, WP_Comment_Query
, par défaut, définit tous les types de commentaires.
Beaucoup de thèmes utilisent wp_list_comments()
pour afficher des commentaires.
Cette fonction a un argument 'type'
qui permet de définir le type de commentaire à afficher.
Si vous examinez, par exemple, les thèmes par défaut, cette fonction est utilisée sans l'argument type . Cela signifie que, même si vous utilisez un type de commentaire personnalisé, les commentaires special / seront affichés parmi les commentaires "normaux" de la plupart des thèmes.
Pour résoudre ce problème, vous pouvez utiliser le hook 'pre_get_comments'
pour empêcher l'extraction de vos types de commentaires personnalisés le long des types de commentaires "standard":
/* 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')
);
}
});
En utilisant le code ci-dessus, vous pouvez utiliser en toute sécurité 'my_custom_comment_type'
pour stocker des commentaires qui ne seront pas mélangés avec des commentaires standard.
Après cela, lorsque vous devez récupérer vos commentaires personnalisés, vous devez explicitement passer le slug de type de commentaire et tout devrait bien fonctionner.
Toutefois, notez que les fonctions normalement utilisées pour récupérer des commentaires, telles que wp_list_comments()
ou get_comments()
excluent automatiquement les commentaires non approuvés (ou le courrier indésirable).
En fait, selon vos paramètres, si vous utilisez wp_new_comment()
pour stocker vos commentaires personnalisés, il est possible qu'ils soient stockés comme non approuvés et vous ne pourrez pas les filtrer, même si vous utilisez explicitement l'argument 'type'
approprié. .
Pour éviter cela, il y a 3 possibilités:
'status'
de WP_Comment_Query
(ou get_comments()
) défini sur "all"
lors de la récupération du type de commentaires personnalisé: de cette manière, tous les commentaires seront affichés, qu'ils soient approuvés ou non.wp_insert_comment()
de plus bas niveau pour enregistrer le commentaire et définissez l'argument 'approved'
sur 1
utilisez le filtre 'pre_comment_approved' pour toujours stocker en tant que commentaires approuvés ayant votre type de commentaire personnalisé:
add_filter( 'pre_comment_approved', function( $approved, $data ) {
return isset($data['comment_type']) && $data['comment_type'] === 'my_custom_comment_type'
? 1
: $approved;
}, 20, 2);