it-swarm.com.de

Wie werden Disqus-Kommentare und Pingbacks angezeigt?

Ich benutze disqus , um Kommentare in meinem Blog zu bearbeiten.

Ich habe auch gerne Pingbacks von verschiedenen Posts hin und her (und von externen Quellen).

Ich habe jedoch heute festgestellt, dass die Anzahl der Kommentare am Ende eines Posts die Gesamtzahl der "Kommentare" (einschließlich Pingbacks) anzeigt, aber nur die Disqus-Kommentare tatsächlich angezeigt werden.

Wie kann ich erreichen, dass Pingbacks sowie Disqus-Kommentare erscheinen?

1
warren

Das Plugin, das Sie erwähnt haben, ist nur eine einzelne Funktion, daher sollte es nicht zu schwer für Ihr Setup sein. Es verwendet den comments_template-Filter, um die Pingbacks / Trackbacks -Liste in Ihre Seite einzufügen.

Da das Plugin jedoch eine zusätzliche manuelle SQL-Abfrage verwendet und die Vorlage von Hand erstellt wird, gibt es Raum für Verbesserungen/Vereinfachungen.

Ein einfaches Demo-Plugin mit wp_list_comments():

Sie können zum Beispiel versuchen:

<?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 );

Wenn Ihr Thema einen Rückruf verwendet, können Sie den Teil my_theme_comment entsprechend anpassen. Das Thema Twenty Twelve verwendet den Rückruf twentytwelve_comment, aber das Thema Twenty Thirteen und Twenty Fourteen . ) Themen verwenden meines Wissens keinen solchen Rückruf.

Der Eingabeparameter $type => 'pings' ist wichtig, da er alle Kommentartypen mit Ausnahme von Pingbacks und Trackbacks herausfiltert.

Beachten Sie, dass wir wp_list_comments() die ganze harte Arbeit beim Einrichten der Vorlage erledigen lassen.

Eine modulare Demo-Lösung ohne wp_list_comments():

Sie können die Pings auch aus dem comments_array-Filter herausfiltern mit:

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();
        }
    }
);

wo die Hauptcontainerklasse ist:

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

und die Datenquelle ist:

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

und das Layout wird definiert mit:

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

Anschließend können Sie das Layout an Ihre Bedürfnisse anpassen.

Hier ist ein Beispiel für die Ausgabe mit dieser Lösung:

pings with disqus

Eine Lösung mit einer zusätzlichen get_comments():

Eine andere Möglichkeit (mit ein wenig zusätzlicher Arbeit und zusätzlichen Fragen!) Wäre, die Liste zu erstellen, zum Beispiel mit:

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 );

dabei ist get_comments() nur ein Wrapper für die Klasse WP_Comment_Query . Ich würde wahrscheinlich nicht diesen Weg gehen und stattdessen die anderen Lösungen verwenden.

Sie können die WP_Comment_Query-Klasse auch direkt verwenden, sie ist jedoch nicht so komplex wie die WP_Query-Klasse.

Ich hoffe das hilft.

4
birgire

Dies zeigt sie vor dem DISQUS-Kommentarformular an, jedoch nicht die Anzahl

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