Как показать комментарии и отклики на запросы?
Я использую disqus для обработки комментариев в моем блоге.
Мне также нравится получать отклики от различных сообщений друг другу (и из внешних источников.
Однако сегодня я заметил, что, хотя количество комментариев в нижней части сообщения будет показывать общее количество "комментариев" (включая отклики), на самом деле отображаются только комментарии Disqus.
Как я могу заставить пингбэки появляться , а также Дискусы комментарии?
2 answers
Упомянутый вами плагин - это всего лишь одна функция, поэтому он не должен быть слишком тяжелым для вашей настройки. Он использует фильтр comments_template
для ввода обратных сигналов / обратные ссылки перечислите на своей странице.
Но плагин использует дополнительный ручной 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'
имеет важное значение, поскольку он отфильтровывает все типы комментариев, кроме обратных ссылок и обратных ссылок.
Обратите внимание, что мы позволяем 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
.
Я надеюсь, что это поможет.
Это отобразит их перед формой комментария 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 );