I am using WordPress as a petition site and hacking the comments system to work as the petition signup. I would like to find out how I can limit a user to post only one comment per post. So far I can limit each user to one comment on the whole WordPress site as shown in the code below, but that’s not what I am looking to accomplish.
Again, how can I limit each user to one comment per post?
<?php
/*
* Single Petition Template
* @package WordPress
* @subpackage Twenty_Thirteen
* @since Twenty Thirteen 1.0
* template author: Facinet Toure
* website URL: http://mongage.com
*/
get_header(); ?>
<div id="primary" class="content-area">
<div id="content" class="site-content" role="main">
<?php /* The loop */ ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php //get_template_part( 'content', get_post_format() ); ?>
<!-- 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>This post currently has
<?php comments_number( 'no responses', 'one response', '% responses' ); ?>
.</p>
</header>
<!-- .entry-header -->
<div class="entry-content">
<?php the_content( __( 'Continue reading <span class="meta-nav">→</span>', 'twentythirteen' ) ); ?>
<?php wp_link_pages( array( 'before' => '<div class="page-links"><span class="page-links-title">' . __( 'Pages:', '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">' . __( 'Sign the petition', 'twentythirteen' ) . '</span>', __( 'One comment so far', 'twentythirteen' ), __( 'View all % comments', 'twentythirteen' ) ); ?>
</span><!-- .comments-link -->
<?php endif; // comments_open() ?>
<?php edit_post_link( __( 'Edit', '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> This post currently has
<?php comments_number( 'no responses', 'one response', '% responses' ); ?>
. </p>
<?php twentythirteen_post_nav(); ?>
<ol reversed class="commentlist">
<?php
//Gather comments for a specific page/post
$comments = get_comments(array(
'post_id' => $post->ID,
'status' => 'approve' //Change this to the type of comments to be displayed
));
//Display the list of comments
wp_list_comments(array(
'per_page' => -1, //Allow comment pagination
'reverse_top_level' => false, //Show the latest comments at the top of the list,
'max_depth' => '1',
'avatar_size' => 0,
), $comments);
?>
</ol>
<?php // check if user has previously commented the post
global $current_user;
if ( !is_user_logged_in() ) {
echo 'you must be logged in to sign the petition';
} else {
$args = array('user_id' => $current_user->ID);
$usercomment = get_comments($args);
if(count($usercomment) >= 1) {
echo '<p>Vous avez déjà signé cette pétition. S'il vous plaît partager avec votre famille et vos amis</p>';
} else { comment_form();
}
}?>
<?php endwhile; ?>
</div>
<!-- #content -->
</div>
<!-- #primary -->
<?php get_sidebar(); ?>
<?php get_footer(); ?>
Now the code is checking if the user has previously commented on that specific post instead of the whole site. Hope others will find it helpful.