Июль
30
2011

DoFollow в Disqus

DoFollow в Disqus

Read this post in English.

Поставил себе на блог систему комментирования Disqus. Для wordpress нужно только скачать плагин и зарегистрироваться на сайте. Для работы Disqus подменяет форматирование комментариев и dofollow перестает работать, пришлось лезть сначала в Google, а потом в код плагина.

В гугле было пару советов, но все они так или иначе требовали изменения в коде плагина. Я такое делать не люблю, так как при обновлении все изменения затираются.

Исследование кода плагина Disqus

К сожалению найти хуки в плагине не удалось, но зато был найден полезный кусок кода

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
add_filter('comments_template', 'dsq_comments_template');
function dsq_comments_template($value) {
global $EMBED;
global $post;
global $comments;
if ( !( is_singular() && ( have_comments() || 'open' == $post->comment_status ) ) ) {
return;
}
if ( !dsq_is_installed() || !dsq_can_replace() ) {
return $value;
}
// TODO: If a disqus-comments.php is found in the current template's
// path, use that instead of the default bundled comments.php
//return TEMPLATEPATH . '/disqus-comments.php';
$EMBED = true;
return dirname(__FILE__) . '/comments.php';
}

Этот кусок кода подменяет шаблон комментариев темы на шаблон в папке плагина. А самой интересной частью является закомментированный кусок, в будущем автор плагина собирается проверять наличие в папке темы шаблона комментариев disqus-comments.php, и если он есть, то использовать его.

Пока автор планирует, мы начинаем использовать.

Создание своего фильтра

Чтобы заставить wordpress использовать наш собственный шаблон комментариев вставляем в файл functions.php нашей темы такой код

1
2
3
4
5
function disq_comm($value)
{
return TEMPLATEPATH . '/disqus-comments.php';
}
add_filter('comments_template', 'disq_comm');

Осталось только создать файл disqus-comments.php в каталоге активной темы.

disqus-comments.php

Фактически я скопировал файлик comments.php из папки плагина дискуса, переименовал его и внес свои изменения, которые активируют dofollow для хороших комментаторов.

В начале я изменил 20-ю строку, а именно условие comment_author_url() поменял на get_comment_author_url()!=”  Это позволяет условию срабатывать.

Теперь возьмемся за саму ссылку

1
2
3
4
5
6
7
8
9
10
11
<?php if(get_comment_author_url()!='') :
{
$authorlink=get_comment_author_link();
if (strpos($authorlink, 'nofollow') !== false)
{
$pos = strpos($authorlink, 'href');
$authorlink = substr($authorlink,0,$pos ). "terget='_blank' href='http://tigor.org.ua/goto/". substr($authorlink, $pos+6);
}
}
?>
<a id="dsq-author-user-<?php echo comment_ID(); ?>" href="<?php if (strpos($authorlink, 'nofollow') !== false){echo 'http://tigor.org.ua/goto/'.get_comment_author_url().'" rel="nofollow"';} else { comment_author_url().'"';} ?> target="_blank"><?php echo comment_author(); ?></a>

Весь смысл этой конструкции в том, что если в ссылке есть nofollow, то ссылка выводится через редирект http://tigor.org.ua/goto/ссылка. За управление наличием nofollow отвечает плагин SMu DoFollow.

Для ленивых привожу полный текст моего файла disqus-comments.php, главное не забудьте убрать в строке редиректа мой адрес.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<?php
if (DISQUS_DEBUG) {
echo "<p><strong>Disqus Debug</strong> thread_id: ".get_post_meta($post->ID, 'dsq_thread_id', true)."</p>";
}
?>
<div id="disqus_thread">
<?php if (!get_option('disqus_disable_ssr')): ?>
<?php
// if (is_file(TEMPLATEPATH . '/comments.php')) {
// include(TEMPLATEPATH . '/comments.php');
// }
?>
<div id="dsq-content">
<ul id="dsq-comments">
<?php foreach ($comments as $comment) : ?>
<li id="dsq-comment-<?php echo comment_ID(); ?>">
<div id="dsq-comment-header-<?php echo comment_ID(); ?>">
<cite id="dsq-cite-<?php echo comment_ID(); ?>">
<?php if(get_comment_author_url()!='') :
{
$authorlink=get_comment_author_link();
if (strpos($authorlink, 'nofollow') !== false)
{
$pos = strpos($authorlink, 'href');
$authorlink = substr($authorlink,0,$pos ). "terget='_blank' href='http://tigor.org.ua/goto/". substr($authorlink, $pos+6);
}
}
?>
<a id="dsq-author-user-<?php echo comment_ID(); ?>" href="<?php if (strpos($authorlink, 'nofollow') !== false){echo 'http://tigor.org.ua/goto/'.get_comment_author_url().'" rel="nofollow"';} else { echo comment_author_url().'"';} ?> target="_blank"><?php echo comment_author(); ?></a>
<?php else : ?>
<span abraka id="dsq-author-user-<?php echo comment_ID(); ?>"><?php echo comment_author(); ?></span>
<?php endif; ?>
</cite>
</div>
<div id="dsq-comment-body-<?php echo comment_ID(); ?>">
<div id="dsq-comment-message-<?php echo comment_ID(); ?>"><?php echo wp_filter_kses(comment_text()); ?></div>
</div>
</li>
<?php endforeach; ?>
</ul>
</div>
<?php endif; ?>
</div>
<script type="text/javascript">
var disqus_url = '<?php echo get_permalink(); ?>';
var disqus_identifier = '<?php echo dsq_identifier_for_post($post); ?>';
var disqus_container_id = 'disqus_thread';
var disqus_domain = '<?php echo DISQUS_DOMAIN; ?>';
var disqus_shortname = '<?php echo strtolower(get_option('disqus_forum_url')); ?>';
var disqus_title = <?php echo cf_json_encode(dsq_title_for_post($post)); ?>;
<?php if (false && get_option('disqus_developer')): ?>
var disqus_developer = 1;
<?php endif; ?>
var disqus_config = function () {
var config = this; // Access to the config object
/*
All currently supported events:
* preData — fires just before we request for initial data
* preInit - fires after we get initial data but before we load any dependencies
* onInit - fires when all dependencies are resolved but before dtpl template is rendered
* afterRender - fires when template is rendered but before we show it
* onReady - everything is done
*/
config.callbacks.preData.push(function() {
// clear out the container (its filled for SEO/legacy purposes)
document.getElementById(disqus_container_id).innerHTML = '';
});
<?php if (!get_option('disqus_manual_sync')): ?>
config.callbacks.onReady.push(function() {
// sync comments in the background so we don't block the page
DISQUS.request.get('?cf_action=sync_comments&post_id=<?php echo $post->ID; ?>');
});
<?php endif; ?>
<?php
$sso = dsq_sso();
if ($sso) {
foreach ($sso as $k=>$v) {
echo "this.page.{$k} = '{$v}';\n";
}
}
?>
};
var facebookXdReceiverPath = '<?php echo DSQ_PLUGIN_URL . '/xd_receiver.htm' ?>';
</script>
<script type="text/javascript">
var DsqLocal = {
'trackbacks': [
<?php
$count = 0;
foreach ($comments as $comment) {
$comment_type = get_comment_type();
if ( $comment_type != 'comment' ) {
if( $count ) { echo ','; }
?>
{
'author_name': <?php echo cf_json_encode(get_comment_author()); ?>,
'author_url': <?php echo cf_json_encode(get_comment_author_url()); ?>,
'date': <?php echo cf_json_encode(get_comment_date('m/d/Y h:i A')); ?>,
'excerpt': <?php echo cf_json_encode(str_replace(array("\r\n", "\n", "\r"), '<br />', get_comment_excerpt())); ?>,
'type': <?php echo cf_json_encode($comment_type); ?>
}
<?php
$count++;
}
}
?>
],
'trackback_url': <?php echo cf_json_encode(get_trackback_url()); ?>
};
</script>
<script type="text/javascript">
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript';
dsq.async = true;
dsq.src = 'http://' + disqus_shortname + '.' + disqus_domain + '/embed.js?pname=wordpress&pver=<?php echo DISQUS_VERSION; ?>';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
Неправильная раскладка: вщащддщц d вшыйгы

Понравилась статья? Посоветуйте друзьям!

, , , ,


Понравилась статья? Подпишись на рассылку по E-Mail или в RSS.
  • Ого, в Друпале все на много проще делается.

  • В вордпресе тоже можно обойтись удалением одного слова. Но я предпочитаю правильный способ, а не простой.

  • А чем хорош Дискус? Я пробовал, но что-то не понравилось, хотя возможность авторизоваться с помощью разных сервисов интересна, но и только.

  • Хотелось сделать нормальную, древовидную структуру комментариев, но лень разбираться в коде шаблона.
    Ну и плюс он грузится отдельным скриптом, очень помогает, когда хочется держать в кеше страницы часами, но не лишать пользователей нормально общаться. Вот я у тебя оставил комментарии, и страница с записью уже как минимум 3 раза обрабатывалась PHP, а эта страница обновится часов через 5, в течении которых nginx будет брать статический HTML с диска.

  • [...] У этой статьи есть русская версия. [...]

  • [...] код и СохранитьСкриншотКусок кода из статьи про Dofollow в Disqus. История версий0.1Редактор кодаПодсветка [...]

  • Аноним

    )спасибо за инструкцию

  • Я вносить изменения в код не стал, самое главное это борьба со спамом

  • А с какими версиями Дискуса работает этот прием?