web-dev-qa-db-ja.com

Disqusのコメントとpingbackを表示するにはどうすればいいですか?

私のブログのコメントを処理するには、 disqus を使用します。

私はまた、さまざまな投稿から相互に(そして外部のソースからの)前後にpingbackをするのが好きです。

しかし、私は本日、ポストの一番下にあるコメント数に「コメント」の総数(pingbackを含む)が表示されるのに対し、のみDisqusコメントが実際に表示されることに気づきました。

PingbackをおよびDisqusのコメントを表示するにはどうすればよいですか。

1
warren

あなたが言及したプラグインはただ一つの関数ですので、それはあなたの設定にはそれほど重すぎてはいけません。 comments_templateフィルタを使って、pingbacks/trackbacksリストをページに挿入します。

しかし、プラグインは余分な手動のSQLクエリを使用しており、テンプレートは手作業で作成されているので、改良や単純化の余地があります。

wp_list_comments()付きの簡単なデモプラグイン:

あなたは例えば試すことができます:

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

あなたのテーマがコールバックを使っているなら、それに応じてmy_theme_comment部分を調整することができます。 Twenty 12テーマはtwentytwelve_commentコールバックを使用しますが、Twenty 13Twenty 14私の知る限りでは、テーマはそのようなコールバックを使用しません。

$type => 'pings'入力パラメータは、pingbacksおよびtrackbacks以外のすべてのコメントタイプを除外するため、重要です。

wp_list_comments() にテンプレートの設定作業をすべて任せていることに注意してください。

wp_list_comments()のないモジュラーデモソリューション:

comments_arrayフィルタからpingを除外することもできます。

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

メインコンテナクラスは次のとおりです。

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

データソースは次のとおりです。

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

そしてレイアウトは次のように定義されます。

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

その後、必要に応じてレイアウトを調整できます。

これは、このソリューションを実装した場合の出力例です。

pings with disqus

追加のget_comments()を持つソリューション:

もう1つの方法(追加の作業とクエリを伴う)は、リストを作成することです。次に例を示します。

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() は、 WP_Comment_Query クラスのラッパーです。私はおそらくこの道をたどらず、代わりに他の解決策を使うでしょう。

WP_Comment_Queryクラスを直接使用することもできますが、WP_Queryクラスほど洗練されていません。

これが役に立つことを願っています。

4
birgire

これはDISQUSコメントフォームの前にそれらを表示しますが、カウントはしません

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