¿Puedo almacenar mi tipo de comentario personalizado en la tabla wp_comments?

2

Estoy desarrollando un sistema donde una publicación puede tener múltiples respuestas / comentarios. A partir de ahora, estoy almacenando cada uno de los comentarios como un postmeta serializado. Pero hoy mismo me di cuenta de que puedo usar la tabla comments existente para el mismo propósito, y donde hay una tabla commentmeta también puedo almacenar datos adicionales allí.

Así que vine usando wp_insert_comment() , y espero que una más sólida sea wp_new_comment() , donde presenté con el Parámetro comment_type . Encontré que almacena:

  • null para el tipo de comentario predeterminado 'comentarios',
  • pingback para 'pingbacks', y
  • trackbacks para 'trackbacks'

Como parece similar a la columna wp_posts ' post_type , ¿pero es así en realidad? ¿Es seguro almacenar mi comment_type personalizado allí para realizar un seguimiento de ciertos tipos de comentarios / opiniones?

    
pregunta Mayeenul Islam 04.05.2015 - 19:08

1 respuesta

4

El tipo de comentario es similar al tipo de publicación, porque permite consultar solo un tipo específico de comentarios, al igual que el tipo de publicación permite consultar uno o más tipos de publicación.

Y al igual que los tipos de publicaciones principales (página, publicación), también existen tipos de comentarios básicos: 'comment' , 'pingback' , 'trackback' .

Una diferencia entre los dos es que, de forma predeterminada, WP_Query no obtiene tipos de publicación que no son explícitamente necesarios, sino solo el tipo de publicación 'post' .

En el país, WP_Comment_Query , por defecto, todos los tipos de comentarios.

Muchos temas utilizan wp_list_comments() para mostrar los comentarios.

Esa función tiene un argumento 'type' que permite configurar el tipo de comentario para mostrar.

Si observa, por ejemplo, los temas predeterminados, esa función se utiliza sin el argumento de tipo . Esto significa que, incluso si utiliza un tipo de comentario personalizado, la mayoría de los temas mostrarán comentarios especiales entre los comentarios "regulares".

Para solucionar este problema, puedes usar el enlace 'pre_get_comments' para evitar que tus tipos de comentarios personalizados sean buscados en los tipos de comentarios "estándar":

/* 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')
      );
   }
});

Al usar el código de arriba, puedes usar con seguridad 'my_custom_comment_type' para almacenar comentarios que no se mezclarán con los comentarios estándar.

Después de eso, cuando necesites obtener tus comentarios personalizados, debes pasar explícitamente la barra de tipo de comentario y todo debería funcionar bien.

Sin embargo, tenga en cuenta que las funciones que normalmente se usan para recuperar comentarios, como wp_list_comments() o get_comments() excluye automáticamente los comentarios que no están aprobados (o spam).

De hecho, dependiendo de su configuración, si usa wp_new_comment() para almacenar sus comentarios personalizados, es posible que se almacenen como no aprobadas y no podrá realizar esos comentarios incluso si usa el argumento 'type' adecuado.

Para evitar esto, hay 3 posibilidades:

  • siempre use el argumento 'status' de WP_Comment_Query (o get_comments() ) establecido en "all" al obtener el tipo de comentarios personalizados: de esta manera, todos los comentarios se borrarán, sin importar si se aprueban o no
  • use el wp_insert_comment() más bajo para guardar el comentario y establezca el argumento 'approved' en 1
  • use el filtro 'pre_comment_approved' para almacenar siempre los comentarios aprobados que tengan su tipo de comentario personalizado:

    add_filter( 'pre_comment_approved', function( $approved, $data ) {
        return isset($data['comment_type']) && $data['comment_type'] === 'my_custom_comment_type'
           ? 1
           : $approved;
    }, 20, 2);
    
respondido por el gmazzap 04.05.2015 - 23:03

Lea otras preguntas en las etiquetas