it-swarm-eu.dev

Jak zobrazit Disqus komentáře a pingbacks?

Používám disqus ke zpracování komentářů na svém blogu.

Také mám rád pingbacky z různých míst tam a zpět (a z vnějších zdrojů).

Všiml jsem si však dnes, že zatímco počet komentářů ve spodní části příspěvku ukáže celkový počet komentářů (včetně pingbacků), pouze komentáře Disqus jsou zobrazeny skutečně.

Jak mohu získat pingbacks stejně jako komentáře ?

1
warren

Zápis, který jste zmínil, je pouze jedna funkce, takže by neměl být příliš těžký na nastavení. Použije filtr comments_template k vložení pingbacks / seznamu zpětných odkazů do vaší stránky.

Ale plugin používá extra ruční SQL dotaz a šablona je vytvořena ručně, takže je zde prostor pro zlepšení/zjednodušení.

Jednoduchý demo plugin s wp_list_comments():

Můžete zkusit například:

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

Pokud váš motiv používá zpětné volání , můžete příslušnou část my_theme_comment upravit. Téma Twenty Twelve používá zpětné volání twentytwelve_comment, ale dvacet třináct a dvacet čtrnáct čtrnácti motivy nepoužívají takové zpětné volání, podle mých znalostí.

Vstupní parametr $type => 'pings' je důležitý, protože filtruje každý typ komentáře s výjimkou pingbacks a zpětných odkazů .

Všimněte si, že jsme nechali wp_list_comments() provést veškerou tvrdou práci nastavení šablony.

Modulární demo řešení bez wp_list_comments():

Můžete také filtrovat pingy z filtru comments_array pomocí:

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

kde hlavní třída kontejneru je:

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

a zdrojem dat je:

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

a rozvržení je definováno pomocí:

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

Rozvržení pak můžete upravit podle svých potřeb.

Zde je příklad výstupu s implementovaným řešením:

pings with disqus

Řešení s extra get_comments():

Dalším způsobem (s některými dalšími pracemi a dotazy) by bylo sestavení seznamu, například:

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

kde get_comments() je jen obálka třídy WP_Comment_Query . Pravděpodobně bych tuto trasu nešel a místo toho použil jiná řešení.

Můžete také použít třídu WP_Comment_Query přímo, ale není to tak sofistikované jako třída WP_Query.

Doufám, že to pomůže.

4
birgire

Zobrazí se před komentářem DISQUS, ale ne s počtem

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