Вопрос или проблема
Я использую WordPress в качестве сайта для петиций и изменяю систему комментариев, чтобы она работала как регистрация на петицию. Я хотел бы узнать, как я могу ограничить пользователя, чтобы он оставлял только один комментарий на пост. Пока что я могу ограничить каждого пользователя одним комментарием на всем сайте WordPress, как показано в коде ниже, но это не то, чего я хочу добиться.
Итак, как я могу ограничить каждого пользователя одним комментарием на пост?
<?php
/*
* Шаблон одной петиции
* @package WordPress
* @subpackage Twenty_Thirteen
* @since Twenty Thirteen 1.0
* автор шаблона: Facinet Toure
* URL сайта: http://mongage.com
*/
get_header(); ?>
<div id="primary" class="content-area">
<div id="content" class="site-content" role="main">
<?php /* Петля */ ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php //get_template_part( 'content', get_post_format() ); ?>
<!-- формат поста -->
<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
<header class="entry-header">
<?php if ( has_post_thumbnail() && ! post_password_required() ) : ?>
<div class="entry-thumbnail">
<?php the_post_thumbnail('full'); ?>
</div>
<?php endif; ?>
<h1 class="entry-title">
<?php the_title(); ?>
</h1>
<p><span class="rounded-corners alignleft"><?php echo get_avatar( $post->post_author, 74 ) ?></span>
<span class="author"><?php the_author_meta( 'display_name' ); ?></span>
<span> | </span>В этом посте сейчас
<?php comments_number( 'нет ответов', 'один ответ', '% ответов' ); ?>
.</p>
</header>
<!-- .entry-header -->
<div class="entry-content">
<?php the_content( __( 'Продолжить чтение <span class="meta-nav">→</span>', 'twentythirteen' ) ); ?>
<?php wp_link_pages( array( 'before' => '<div class="page-links"><span class="page-links-title">' . __( 'Страницы:', 'twentythirteen' ) . '</span>', 'after' => '</div>', 'link_before' => '<span>', 'link_after' => '</span>' ) ); ?>
</div>
<!-- .entry-content -->
<footer class="entry-meta">
<?php twentythirteen_entry_meta(); ?>
<?php if ( comments_open() && ! is_single() ) : ?>
<span class="comments-link">
<?php comments_popup_link( '<span class="leave-reply">' . __( 'Подписать петицию', 'twentythirteen' ) . '</span>', __( 'На данный момент один комментарий', 'twentythirteen' ), __( 'Посмотреть все % комментариев', 'twentythirteen' ) ); ?>
</span><!-- .comments-link -->
<?php endif; // comments_open() ?>
<?php edit_post_link( __( 'Редактировать', 'twentythirteen' ), '<span class="edit-link">', '</span>' ); ?>
<?php if ( is_single() && get_the_author_meta( 'description' ) && is_multi_author() ) : ?>
<?php get_template_part( 'author-bio' ); ?>
<?php endif; ?>
</footer>
<!-- .entry-meta -->
</article>
<!-- #post -->
<p> В этом посте сейчас
<?php comments_number( 'нет ответов', 'один ответ', '% ответов' ); ?>
. </p>
<?php twentythirteen_post_nav(); ?>
<ol reversed class="commentlist">
<?php
//Собираем комментарии для конкретной страницы/поста
$comments = get_comments(array(
'post_id' => $post->ID,
'status' => 'approve' //Измените это значение на нужный тип комментариев
));
//Отображаем список комментариев
wp_list_comments(array(
'per_page' => -1, //Включить пагинацию комментариев
'reverse_top_level' => false, //Показывать последние комментарии в начале списка,
'max_depth' => '1',
'avatar_size' => 0,
), $comments);
?>
</ol>
<?php // проверить, комментировал ли пользователь ранее данный пост
global $current_user;
if ( !is_user_logged_in() ) {
echo 'вы должны войти, чтобы подписать петицию';
} else {
$args = array('user_id' => $current_user->ID);
$usercomment = get_comments($args);
if(count($usercomment) >= 1) {
echo '<p>Вы уже подписали эту петицию. Пожалуйста, поделитесь с семьей и друзьями</p>';
} else { comment_form();
}
}?>
<?php endwhile; ?>
</div>
<!-- #content -->
</div>
<!-- #primary -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>
// Проверка, комментировал ли пользователь ранее данный пост.
global $current_user, $post;
if ( ! is_user_logged_in() ) {
// Показать форму комментариев, если пользователь не вошел в систему.
comment_form();
} else { // Пользователь вошел...
// Получаем комментарии для вошедшего пользователя.
$usercomment = get_comments( array (
'user_id' => $current_user->ID,
'post_id' => $post->ID,
) );
// Если пользователь комментировал, выводим сообщение.
if ( $usercomment ) {
echo '<p>Вы уже подписали эту петицию. Пожалуйста, поделитесь с семьей и друзьями</p>';
} else { // Иначе показываем форму комментариев.
comment_form();
}
}
Теперь код проверяет, комментировал ли пользователь ранее конкретно этот пост, а не весь сайт. Надеюсь, что другим это будет полезно.
.
Ответ или решение
Чтобы ограничить пользователей одной подписью на петицию для каждого поста в WordPress, необходимо настроить систему комментариев так, чтобы она позволяла оставлять лишь один комментарий на публикацию. Опишем, как именно это реализовать, используя платформу WordPress.
Теория:
В WordPress комментарии для разных постов хранятся в таблице базы данных wp_comments
. Каждый комментарий связан с конкретным постом и пользователем, оставившим этот комментарий. Для ограничения пользователей одной подписью на петицию необходимо убедиться, что перед отображением формы комментариев ведется проверка, оставлял ли пользователь комментарий к данному посту.
Существуют различные способы программно ограничить возможность комментирования: через фильтры и действия WordPress, используя кастомные проверки в PHP.
Пример:
Существующий код в вашем решении пытается разрешить пользователю оставлять комментарий только на один пост. Комментарии под конкретным постом проверяются на наличие комментария от авторизованного пользователя. Логика выглядит следующим образом:
<?php
// Определяем текущего пользователя и пост.
global $current_user, $post;
// Если пользователь не авторизован, выводим сообщение о необходимости входа.
if ( ! is_user_logged_in() ) {
echo 'Вы должны войти в систему, чтобы подписать петицию';
} else {
// Получаем комментарии пользователя к текущему посту.
$usercomment = get_comments( array(
'user_id' => $current_user->ID,
'post_id' => $post->ID,
) );
// Если комментарий уже существует, выводим сообщение об этом.
if ( $usercomment ) {
echo '<p>Вы уже подписали эту петицию. Поделитесь ею с друзьями и семьей.</p>';
} else {
// Если нет, показываем форму комментария.
comment_form();
}
}
?>
Применение:
-
Подключите PHP код в шаблоне: Необходимо убедиться, что установленные проверки подключены в файле шаблона (например, в
single.php
или аналогичном для вашего случая). Это можно сделать через условие в коде WordPress, в месте, где вызываетсяcomment_form()
. -
Настройка WordPress:
- Убедитесь, что система комментариев включена в настройках WordPress для всех постов, к которым вы хотите ограничить комментарии.
-
Тестирование и отладка:
- После внесения изменений, протестируйте их в различных сценариях: авторизованный пользователь, анонимный пользователь, существующие комментарии и первое комментирование.
- В случае возникновения ошибок, используйте инструменты отладки WordPress или консоли для вывода значений переменных и логов.
-
Улучшение UX:
- Рекомендуется улучшить сообщение, видимое пользователям, которые уже оставили комментарий. Текущая версия ограничена одним текстом на французском языке. Поддержка многоязычности может быть введена через использование функций i18n WordPress, чтобы показывать сообщения на языке, который выбран для сайта.
В результате таких настроек платформа WordPress будет обрабатывать комментарии так, что каждый пользователь сможет "подписать" петицию лишь один раз на публикацию, что полностью соответствует документации и лучшим практикам WordPress. Это решение будет гибким и легко интегрируемым в существующие WordPress-сайты, которые нужно адаптировать под функциональность петиций.