私のブログのコメントを処理するには、 disqus を使用します。
私はまた、さまざまな投稿から相互に(そして外部のソースからの)前後にpingbackをするのが好きです。
しかし、私は本日、ポストの一番下にあるコメント数に「コメント」の総数(pingbackを含む)が表示されるのに対し、のみDisqusコメントが実際に表示されることに気づきました。
PingbackをおよびDisqusのコメントを表示するにはどうすればよいですか。
あなたが言及したプラグインはただ一つの関数ですので、それはあなたの設定にはそれほど重すぎてはいけません。 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 13とTwenty 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
その後、必要に応じてレイアウトを調整できます。
これは、このソリューションを実装した場合の出力例です。
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
クラスほど洗練されていません。
これが役に立つことを願っています。
これは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 );