你提到的插件只是一个单一的功能,所以它不应该对你的设置太重。它使用comments_template
筛选以将pingbacks列表注入页面。
但是插件使用了额外的手动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
相应部分。主题使用
twentytwelve_comment
回调,但据我所知,二十点十三和二十点十四主题没有使用这样的回调。
这个$type => \'pings\'
输入参数很重要,因为它过滤掉了除pingbacks和trackbacks之外的所有注释类型。
请注意,我们让wp_list_comments()
完成所有设置模板的艰苦工作。
模块化演示解决方案wp_list_comments()
:
您还可以从
comments_array
过滤器,带有:
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()
:
另一种方式(需要一些额外的工作和查询!)将是构建列表,例如:
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
班
我希望这有帮助。