web-dev-qa-db-fra.com

Masquer les commentaires postés lors de l'affichage via WP_Query

J'ai écrit un shortcode qui affiche le nombre x de messages sur la page d'accueil de mon site lorsque j'ai écrit [blog posts_per_page-"3"]. C'est ici:

function getBlogPosts($atts) {

  extract(shortcode_atts(array(
    "posts_per_page" => '',
  ), $atts));

  $queryArgs = array(
    "posts_per_page" => $posts_per_page
  );

  $queryPosts = new WP_Query($queryArgs);
  $output = "";

  $output .= "<ul class='articles-list clearfix'>";

    if ( $queryPosts->have_posts() ) : while ( $queryPosts->have_posts() ) : $queryPosts->the_post();
      $output .= "<li class='clearfix ind-article'>
        <a class='article-container' href='". get_the_permalink() ."'>";
        if (has_post_thumbnail($post->ID)) {
            $output .= get_the_post_thumbnail($post->ID, 'medium'); // medium img size = 300x300. => make sure photos uploaded are at least 600x600
        }
        $output .= "<div class='article-content'>";
          $output .= "<h3 class='entry-title gamma uppercase'>". get_the_title() ."</h3>";
          $output .= "<span class='entry-meta'>". get_the_date('l jS F') ."</span>";
      $output .= "</div></a></li>";
    endwhile; endif;

  $output .= "</ul>";

  return $output;
} add_shortcode('blog', 'getBlogPosts');

Toutefois, lorsque je le fais, un formulaire de commentaire pour le message de blog est également affiché (il s’agit bien du formulaire de commentaire du message, pas de la page - il semble également ne s'agir que d’un formulaire de commentaire, pour le dernier message de blog affiché, je pense). Je veux garder les commentaires activés, mais supprimer le commentaire lorsque le shortcode est utilisé. Comment je ferais ça?

2
Tom Oakley

Le problème

N'oubliez pas d'appeler la fonction principale wp_reset_postdata(), après votre boucle while , pour restaurer l'objet global $post. Le formulaire de commentaire repose sur cet objet, que vous remplacez par votre appel $queryPosts->the_post().

Notez que la extract() n'est pas recommandée, cochez cette réponse avec @toscho, par exemple.

Supprimer des commentaires

Pour supprimer le formulaire de commentaire , lorsque vous utilisez un shortcode, vous pouvez consulter ma réponse ici .

Si vous souhaitez supprimer la liste des commentaires et le formulaire-commentaire , après le shortcode, vous pouvez essayer l'une des méthodes suivantes, dans le rappel du shortcode:

Méthode n ° 1 Supprimez les commentaires demandés via des filtres:

if( is_singular() && post_type_supports( get_post_type(), 'comments' ) )
{
    // Remove the comment form
    add_filter( 'comments_open', '__return_false' ); 

    // Remove the list of comments
    add_filter( 'comments_array', '__return_empty_array' );
}   

Méthode n ° 2 Force get_comments() à renvoyer un tableau vide:

if( is_singular() && post_type_supports( get_post_type(), 'comments' ) )
{
    // Remove the comment form
    add_filter( 'comments_open', '__return_false' );

    // Empty comments SQL query - Run only once
    add_filter( 'comments_clauses', function( $clauses )
    {
        static $count = 0;
        if( 0 === $count++ )
            $clauses['where'] .= ' AND 1=0 ';
        return $clauses;
     });
}   

Ici, nous n'exécutons le rappel du filtre qu'une seule fois, pour éviter que cela ne se produise un widget commentaires récents dans la barre latérale.

Méthode n ° 3 Modifiez le modèle de commentaire via un filtre. Créez un fichier vide comments-empty.php dans votre thème et utilisez:

if( is_singular() && post_type_supports( get_post_type(), 'comments' ) )
{
    // Modify the comment template
    add_filter( 'comments_template', function( $template )   
    {
        if( $tmp = locate_template( 'comments-empty.php' ) )
            $template = $tmp;
        return $template;
    } );
}   

Vous pouvez modifier le chemin du fichier selon vos besoins.

Méthode n ° 4 Cachez-le avec CSS. Exemple:

if( is_singular() && post_type_supports( get_post_type(), 'comments' ) )
{
    print '<style> #comments { display: none } </style>';
}
1
birgire