Скрытие комментариев в Woo Tabs
Для WordPress есть тема Continuum, в которой есть виджет Woo Tabs. И на одной из его вкладок есть “Последние комментарии”, где отображаются комментарии без учёта закрытости поста, установленной плагином User Access Manager. Естественно, это надо исправить.
Вот этот виджет:
То есть, если пост с ограниченным доступом, и в нём есть комментарии, то они будут видны в этом виджете для всех посетителей сайта.
На самом деле, у нас эта тема давно не обновлялась, потому в новых версиях, возможно, это уже исправлено. Но мы тему уже так закастомизировали, что обновиться теперь будет непросто.
В общем, нам понадобилось внести изменения в файле /path2wordpress/wp-content/themes/сontinuum/includes/theme-functions.php
:
/*-----------------------------------------------------------------------------------*/
/* WooTabs - Latest Comments */
/*-----------------------------------------------------------------------------------*/
if (!function_exists('woo_tabs_comments')) {
function woo_tabs_comments( $posts = 5, $size = 35 ) {
global $wpdb;
$sql = "SELECT DISTINCT ID, post_title, post_password, comment_ID,
comment_post_ID, comment_author, comment_author_email, comment_date_gmt, comment_approved,
comment_type,comment_author_url,
SUBSTRING(comment_content,1,50) AS com_excerpt
FROM $wpdb->comments
LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID =
$wpdb->posts.ID)
WHERE comment_approved = '1' AND comment_type = '' AND post_password = ''
AND NOT EXISTS(SELECT * FROM wp_uam_accessgroup_to_object WHERE object_id = ID)
ORDER BY comment_date_gmt DESC LIMIT ".$posts;
$comments = $wpdb->get_results($sql);
foreach ($comments as $comment) {
?>
<li>
<?php echo get_avatar( $comment, $size ); ?>
<a href="<?php echo get_permalink($comment->ID); ?>#comment-<?php echo $comment->comment_ID; ?>" title="<?php _e('on ', 'woothemes'); ?> <?php echo $comment->post_title; ?>">
<?php echo strip_tags($comment->comment_author); ?>: <?php echo strip_tags($comment->com_excerpt); ?>...
</a>
<div class="fix"></div>
</li>
<?php
}
}
}
Решение несколько топорное, изящней было бы составить запрос так, чтобы комментарии всё-таки показывали тем, кому можно, но для начала сойдёт и так.
Если же у вас не стоит плагин по управлению правами пользователей (UAM, из которого помимо прочего создаётся эта таблица wp_uam_accessgroup_to_object
), то запрос можно переделать так (исключить приватные посты из выборки):
// ...
global $wpdb;
$sql = "SELECT DISTINCT ID, post_title, post_password, comment_ID,
comment_post_ID, comment_author, comment_author_email, comment_date_gmt, comment_approved,
comment_type, post_status, comment_author_url,
SUBSTRING(comment_content,1,50) AS com_excerpt
FROM $wpdb->comments
LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID)
WHERE comment_approved = 1 AND (post_password IS NULL OR post_password = '') AND (comment_type IS NULL OR comment_type = '') AND post_type = 'post' AND post_status = 'publish'
ORDER BY comment_date_gmt DESC LIMIT ".$posts;
$comments = $wpdb->get_results($sql);
// ...
И на всякий случай этот же запрос в “чистом” SQL, чтобы можно было потестировать напрямую в базе:
SELECT DISTINCT ID, comment_date_gmt, post_password, comment_ID, comment_post_ID, comment_author, comment_approved, comment_type, post_password, post_status
FROM wp_comments AS c
LEFT OUTER JOIN wp_posts AS p ON c.comment_post_ID = p.ID
WHERE comment_approved = 1 AND (post_password IS NULL OR post_password = '') AND (comment_type IS NULL OR comment_type = '') AND post_type = 'post' AND post_status = 'publish'
ORDER BY comment_date_gmt DESC
LIMIT 11;
Social networks
Zuck: Just ask
Zuck: I have over 4,000 emails, pictures, addresses, SNS
smb: What? How'd you manage that one?
Zuck: People just submitted it.
Zuck: I don't know why.
Zuck: They "trust me"
Zuck: Dumb fucks