web-dev-qa-db-fra.com

Comment afficher les commentaires et les pingback de Disqus?

J'utilise disqus pour gérer les commentaires sur mon blog.

J'aime aussi avoir des pingbacks de divers messages (et de sources extérieures).

Cependant, j’ai remarqué aujourd’hui que, si le nombre de commentaires au bas d’un message indique le nombre total de "commentaires" (y compris les pingbacks), seulement , les commentaires de Disqus sont réellement affichés.

Comment faire en sorte que les pingback apparaissent ainsi que les commentaires Disqus?

1
warren

Le plugin que vous avez mentionné n’est qu’une fonction unique, il ne devrait donc pas être trop lourd pour votre configuration. Il utilise le filtre comments_template pour injecter la liste de pingbacks / dans votre page.

Mais le plugin utilise une requête SQL manuelle supplémentaire et le modèle est construit à la main. Il y a donc de la place pour des améliorations/simplifications.

Un plugin de démonstration simple avec wp_list_comments():

Vous pouvez essayer par exemple:

<?php
/** Plugin Name: Display a list of pingbacks and trackbacks with the Disqus plugin **/

add_filter( 'comments_template', function( $theme_template) {

    // Check if the Disqus plugin is installed:
    if( ! function_exists( 'dsq_is_installed' ) || ! dsq_is_installed() )
        return $theme_template;

    // Comment callback:
    $callback = 'my_theme_comment';  // Adjust to your needs.       
    if( ! function_exists( $callback ) )
        $callback = null;

    // List comments with filters:
    $pings = wp_list_comments( 
        array(  
            'callback' => $callback, 
            'type'     => 'pings', 
            'style'    => 'ol', 
            'echo'     => 0 
        ) 
    ); 

    // Display:
    if( $pings )
        printf( "<div><ol class=\"pings commentlist\">%s</ol></div>", $pings );

    return $theme_template;

}, 9 );

Si votre thème utilise un rappel , vous pouvez ajuster la partie my_theme_comment en conséquence. Le thème vingt douze utilise le callback twentytwelve_comment mais le vingt treize et vingt vingt les thèmes n’utilisent pas un tel rappel, à ma connaissance.

Le paramètre d'entrée $type => 'pings' est important, car il filtre tous les types de commentaires à l'exception de , des pingbacks et des rétroliens .

Notez que nous laissons wp_list_comments() faire tout le travail difficile pour configurer le modèle.

Une solution de démonstration modulaire sans wp_list_comments():

Vous pouvez également filtrer les pings, à partir du filtre comments_array, avec:

add_action( 'wp', 
    function(){
        // Check if the Disqus plugin is installed:
        if( function_exists( 'dsq_is_installed' ) && dsq_is_installed() )
        {
            // Display the list of pings:     
            $pings = new PingsList( new PingsView, new PingsData );
            $pings->init();
        }
    }
);

où la classe de conteneur principale est:

class PingsList
{
    protected $pd   = null;
    protected $pw   = null;

    public function __construct( PingsView $pw, PingsData $pd )
    {
        $this->pw = $pw;
        $this->pd = $pd;
    }   
    public function init()
    {
        $this->pd->init();      
        add_filter( 'comments_template',    array( $this, 'comments_template' ), 9 );
    }
    public function comments_template( $theme_template )
    {
        $this->pw->template( $this->pd->get_data() );
        return $theme_template ;
    }
} // end class

et la source de données est:

interface IPingsData
{
    public function init();
    public function get_data();
}
class PingsData implements IPingsData
{
    protected $pings    = array();

    public function init( )
    {
        add_filter( 'comments_array', array( $this, 'comments_array' ), 10, 2 );
    }
    public function get_data()
    {       
        return $this->pings;
    }
    public function comments_array( $comments, $post_id )
    {
        foreach( $comments as $key => $comment )
        {
            if( in_array( $comment->comment_type, array( 'pingback', 'trackback' ) ) )
            {
                $this->pings[] = $comment; 
            }
        }
        return $comments;
    }       
} // end class

et la mise en page est définie avec:

interface IPingsView
{
    public function template( $pings );
}
class PingsView implements IPingsView
{       
    public function template( $pings = array() )
    {
    ?>
    <div id="pings">
        <h2><?php printf( __( 'Pingbacks/Trackbacks (%d)' ), count( $pings ) );?> </h2>
        <ol class="pings commentlist">
        <?php foreach( $pings as $ping ): $GLOBALS['comment'] = $ping; ?>           
            <li <?php comment_class(); ?> id="comment-<?php comment_ID(); ?>">
                <p>
                    <?php comment_author_link(); ?> 
                    <?php edit_comment_link( 
                          __( '(Edit)' ), '<span class="edit-link">', '</span>' ); ?>
                </p>
                <div class="comment-content">
                    <?php comment_text(); ?>
                </div>
            </li>               
        <?php endforeach; ?>
        </ol>
    </div>
    <?php
    }
} // end class

Vous pouvez ensuite adapter la mise en page à vos besoins.

Voici un exemple de la sortie avec cette solution implémentée:

pings with disqus

Une solution avec une get_comments() supplémentaire:

Une autre façon (avec du travail supplémentaire et des requêtes!) Serait de construire la liste, avec par exemple:

add_filter( 'comments_template', 
    function( $theme_template)
    {
        $pings = get_comments(
            array( 
              'post_id' => get_the_ID(),
              'type'    => 'pings', 
              'status'  => 'approve' ) 
        );

        foreach( (array) $pings as $ping )
        {
            // ... output ...
        }
        return $theme_template;
    }
, 9 );

get_comments() est simplement un wrapper pour la classe WP_Comment_Query . Je n'irais probablement pas dans cette voie et utiliserais les autres solutions à la place.

Vous pouvez également utiliser directement la classe WP_Comment_Query, mais elle n’est pas aussi sophistiquée que la classe WP_Query.

J'espère que ça aide.

4
birgire

Cela les affichera avant le formulaire de commentaire DISQUS mais pas le compte

add_filter( 'comments_template', function( $pings_before_dsq_comments) {

if( !function_exists( 'dsq_is_installed' ) || !dsq_is_installed() )
    return $pings_before_dsq_comments;

wp_list_comments( 
 array(
'style'             => 'ul',
'type'              => 'pings'
)); 

return $pings_before_dsq_comments;
}, 9 );
1
Brad Dalton