Discussion:
Ajax Button Submission Failing - 50% of the time? Comment Voting Plugin Help
BenderisGreat
2013-11-18 06:21:36 UTC
Permalink
I wrote this code today, and I cant figure why half the time the json
response is a failure. Its a comment voting plugin, and its my second
plugin I have ever coded. Could you guys please take a look and if
something stands out as an obvious issue share that with me?

The idea was to have a reddit.com style voting system. You can click upvote
or downvote - and if you have already upvoted and click upvote it removed
your vote alrogether. Same goes for downvote. The codes record in the
database about 40% of the time from my testing. The comments I am testing
on ARE threaded, and I thought maybe that played a role but looking at the
comment IDs they all match up so I am unsure what the cause could be.

Here is the entirety of my code:

*CREATE DB CODE: *
function ams_comment_voting_database()
{
global $wpdb;
global $ams_comment_voting;
$ams_comment_voting = $wpdb->prefix . 'ams_comment_voting';

if($wpdb->get_var("show tables like '$ams_comment_voting'") !=
$ams_comment_voting)
{

$sql = "CREATE TABLE ". $ams_comment_voting ." (
id mediumint(9) NOT NULL AUTO_INCREMENT,
voter_id int(6) NOT NULL,
comment_id int(6) NOT NULL,
comment_pid int(6) NOT NULL,
author_id int(6) NOT NULL,
vote_value tinyint(1) NOT NULL,
UNIQUE KEY id (id)
PRIMARY KEY (voter_id, comment_id)
);";

require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
$wpdb->query($sql);
}
}

register_activation_hook(__FILE__,'ams_comment_voting_database');



* VOTING FUNCTIONS & SCRIPTS *

<?php //comment voting system
add_action( 'wp_enqueue_scripts', 'amc_comment_vote_ajax' );

function amc_comment_vote_ajax() {
wp_register_script( "amc_comment_vote",
WP_PLUGIN_URL.'/vote_comm/js/amc_comment_vote.js', array('jquery') );
wp_localize_script( 'amc_comment_vote', 'anotherAjax', array( 'ajaxurl'
=> admin_url( 'admin-ajax.php' )));

wp_enqueue_script( 'jquery' );
wp_enqueue_script( 'amc_comment_vote' );

}


function ams_comment_vote_count($content) {
global $wpdb, $comment;

$comment_ID = get_comment_ID();
$comment = get_comment($comment_ID);
$cuid = $comment->comment_ID;
$vote_up = '<button id="upvote" type="button"
data-comment="'.$comment_ID.'"></button>';
$vote_down = '<button id="downvote" type="button"
data-comment="'.$comment_ID.'" ></button>';

$count_votes = $wpdb->get_col( $wpdb->prepare ( "SELECT SUM(vote_value)
FROM ".$wpdb->prefix."ams_comment_voting WHERE comment_id = %d",
$comment_ID));
foreach ($count_votes as $id => $cID) {

if (!$cID) {
return '<div id="vote_buttons"><div class="votes">0</div> Votes' . $vote_up
. $vote_down . '<br></div>' . $content;
}

return '<div id="vote_buttons"><div class="votes">' . $cID . '</div> Votes'
. $vote_up . $vote_down . '<br></div>' . $content;
}
}
add_action('comment_text', 'ams_comment_vote_count');


add_action('wp_ajax_amc_comment_vote', 'amc_comment_vote');
add_action('wp_ajax_nopriv_amc_comment_vote', 'amc_comment_vote');
function amc_comment_vote() {
global $wpdb, $comment, $post, $current_user;
get_currentuserinfo();


$cID = $_POST['commentid'];
$voter_id = $current_user->ID;
$grabFromCID = get_comment($cID);

$author_id = $grabFromCID->user_id;
$comment_post_id = $grabFromCID->comment_post_ID;
$vote_replace = '';


$vote_direction = $_POST['direction'];
$voteValueArray = array( 'upvote' => 1,
'downvote' => -1,
);
if( array_key_exists( $vote_direction, $voteValueArray ) ){
$vote_value = $voteValueArray[ $vote_direction ];
} else { $vote_value = 0; }



$alreadyVotedUp = $wpdb->get_row( $wpdb->prepare ( "SELECT * FROM
".$wpdb->prefix."ams_comment_voting WHERE comment_id = %d AND voter_id =
%d", $cID, $voter_id));

if (isset($alreadyVotedUp)) {

$current_value = $alreadyVotedUp->vote_value;
$replaceVoteValue ='';
if ($current_value === 1 && $vote_value === 1) {
$replaceVoteValue = 0;
} elseif ($current_value === 1 && $vote_value === -1) {
$replaceVoteValue = -1;
} elseif ($current_value === -1 && $vote_value === 1) {
$replaceVoteValue = 1;
} elseif ($current_value === -1 && $vote_value === -1) {
$replaceVoteValue = 0;
} elseif ($current_value === 0 && $vote_value === 1) {
$replaceVoteValue = 1;
} elseif ($current_value === 0 && $vote_value === -1) {
$replaceVoteValue = -1;
}

} else {
$replaceVoteValue = NULL;
}



$tableName = $wpdb->prefix . 'ams_comment_voting';

$sql = $wpdb->prepare("INSERT INTO $tableName (`voter_id`, `comment_id`,
`comment_pid`, `author_id`, `vote_value`) VALUES (%d, %d, %d, %d, %d) ON
DUPLICATE KEY UPDATE vote_value = %d", $voter_id, $cID, $comment_post_id,
$author_id, $vote_value, $replaceVoteValue);



$wpdb->query($sql);


$response = array( 'success' => true );
wp_send_json_success($response);

die();

}


*THE JQUERY / AJAX SUBMISSION *

jQuery( document ).ready( function( $ ) {
$( 'button#upvote, button#downvote').click( function() {


$(this).css('color', 'red');
$upVoteButton = $( 'button#upvote' );

$clickedButton = $(event.target);
var commentid = $(event.target).attr('data-comment');
var direction = $(event.target).attr('id')

var data = {
'action': 'amc_comment_vote',
'commentid': commentid,
'direction': direction
}

$.ajax({
type: 'post',
url: anotherAjax.ajaxurl,
data: data,
success: function ( response ) {
if ( ! response.success ) {

alert( 'FAIL!' );
}
else {
alert( 'Success!' );
$clickedButton.parent().siblings('.votes').html(function(i, val) { return
+val+1 });
}
}
});
});
});



--
View this message in context: http://wordpress-hackers.1065353.n5.nabble.com/Ajax-Button-Submission-Failing-50-of-the-time-Comment-Voting-Plugin-Help-tp42870.html
Sent from the Wordpress Hackers mailing list archive at Nabble.com.
Andrew Bartel
2013-11-19 05:07:24 UTC
Permalink
Can you put it in a gist or something? It's hard to debug code from gmail.
And what specifically is it failing on? If you just go through clicking
up vote on comments where is it failing versus not failing? Is it on
comments that are being up voted that have already been up voted/removed?
How many levels of recursion deep have you tested it? I promise you're
not hitting some arbitrary 60% point of failure in http requests or packet
drops.

Have you console.log(ged) every step of the way to see where the point of
failure is? I've never met someone who writes code who doesn't have to go
line by line var dumping, echoing, alerting, console logging, debug
outputting, etc every so often, it's part of the process. Sometimes you
write hundreds of lines in a day (or more) and it just works, other times
you bang your head against the keyboard for hours on a few lines and feel
like you're getting no where, it's part of the process.

-Andrew


On Sun, Nov 17, 2013 at 10:21 PM, BenderisGreat
Post by BenderisGreat
I wrote this code today, and I cant figure why half the time the json
response is a failure. Its a comment voting plugin, and its my second
plugin I have ever coded. Could you guys please take a look and if
something stands out as an obvious issue share that with me?
The idea was to have a reddit.com style voting system. You can click upvote
or downvote - and if you have already upvoted and click upvote it removed
your vote alrogether. Same goes for downvote. The codes record in the
database about 40% of the time from my testing. The comments I am testing
on ARE threaded, and I thought maybe that played a role but looking at the
comment IDs they all match up so I am unsure what the cause could be.
*CREATE DB CODE: *
function ams_comment_voting_database()
{
global $wpdb;
global $ams_comment_voting;
$ams_comment_voting = $wpdb->prefix . 'ams_comment_voting';
if($wpdb->get_var("show tables like '$ams_comment_voting'") !=
$ams_comment_voting)
{
$sql = "CREATE TABLE ". $ams_comment_voting ." (
id mediumint(9) NOT NULL AUTO_INCREMENT,
voter_id int(6) NOT NULL,
comment_id int(6) NOT NULL,
comment_pid int(6) NOT NULL,
author_id int(6) NOT NULL,
vote_value tinyint(1) NOT NULL,
UNIQUE KEY id (id)
PRIMARY KEY (voter_id, comment_id)
);";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
$wpdb->query($sql);
}
}
register_activation_hook(__FILE__,'ams_comment_voting_database');
* VOTING FUNCTIONS & SCRIPTS *
<?php //comment voting system
add_action( 'wp_enqueue_scripts', 'amc_comment_vote_ajax' );
function amc_comment_vote_ajax() {
wp_register_script( "amc_comment_vote",
WP_PLUGIN_URL.'/vote_comm/js/amc_comment_vote.js', array('jquery') );
wp_localize_script( 'amc_comment_vote', 'anotherAjax', array( 'ajaxurl'
=> admin_url( 'admin-ajax.php' )));
wp_enqueue_script( 'jquery' );
wp_enqueue_script( 'amc_comment_vote' );
}
function ams_comment_vote_count($content) {
global $wpdb, $comment;
$comment_ID = get_comment_ID();
$comment = get_comment($comment_ID);
$cuid = $comment->comment_ID;
$vote_up = '<button id="upvote" type="button"
data-comment="'.$comment_ID.'"></button>';
$vote_down = '<button id="downvote" type="button"
data-comment="'.$comment_ID.'" ></button>';
$count_votes = $wpdb->get_col( $wpdb->prepare ( "SELECT SUM(vote_value)
FROM ".$wpdb->prefix."ams_comment_voting WHERE comment_id = %d",
$comment_ID));
foreach ($count_votes as $id => $cID) {
if (!$cID) {
return '<div id="vote_buttons"><div class="votes">0</div> Votes' . $vote_up
. $vote_down . '<br></div>' . $content;
}
return '<div id="vote_buttons"><div class="votes">' . $cID . '</div> Votes'
. $vote_up . $vote_down . '<br></div>' . $content;
}
}
add_action('comment_text', 'ams_comment_vote_count');
add_action('wp_ajax_amc_comment_vote', 'amc_comment_vote');
add_action('wp_ajax_nopriv_amc_comment_vote', 'amc_comment_vote');
function amc_comment_vote() {
global $wpdb, $comment, $post, $current_user;
get_currentuserinfo();
$cID = $_POST['commentid'];
$voter_id = $current_user->ID;
$grabFromCID = get_comment($cID);
$author_id = $grabFromCID->user_id;
$comment_post_id = $grabFromCID->comment_post_ID;
$vote_replace = '';
$vote_direction = $_POST['direction'];
$voteValueArray = array( 'upvote' => 1,
'downvote' => -1,
);
if( array_key_exists( $vote_direction, $voteValueArray ) ){
$vote_value = $voteValueArray[ $vote_direction ];
} else { $vote_value = 0; }
$alreadyVotedUp = $wpdb->get_row( $wpdb->prepare ( "SELECT * FROM
".$wpdb->prefix."ams_comment_voting WHERE comment_id = %d AND voter_id =
%d", $cID, $voter_id));
if (isset($alreadyVotedUp)) {
$current_value = $alreadyVotedUp->vote_value;
$replaceVoteValue ='';
if ($current_value === 1 && $vote_value === 1) {
$replaceVoteValue = 0;
} elseif ($current_value === 1 && $vote_value === -1) {
$replaceVoteValue = -1;
} elseif ($current_value === -1 && $vote_value === 1) {
$replaceVoteValue = 1;
} elseif ($current_value === -1 && $vote_value === -1) {
$replaceVoteValue = 0;
} elseif ($current_value === 0 && $vote_value === 1) {
$replaceVoteValue = 1;
} elseif ($current_value === 0 && $vote_value === -1) {
$replaceVoteValue = -1;
}
} else {
$replaceVoteValue = NULL;
}
$tableName = $wpdb->prefix . 'ams_comment_voting';
$sql = $wpdb->prepare("INSERT INTO $tableName (`voter_id`, `comment_id`,
`comment_pid`, `author_id`, `vote_value`) VALUES (%d, %d, %d, %d, %d) ON
DUPLICATE KEY UPDATE vote_value = %d", $voter_id, $cID, $comment_post_id,
$author_id, $vote_value, $replaceVoteValue);
$wpdb->query($sql);
$response = array( 'success' => true );
wp_send_json_success($response);
die();
}
*THE JQUERY / AJAX SUBMISSION *
jQuery( document ).ready( function( $ ) {
$( 'button#upvote, button#downvote').click( function() {
$(this).css('color', 'red');
$upVoteButton = $( 'button#upvote' );
$clickedButton = $(event.target);
var commentid = $(event.target).attr('data-comment');
var direction = $(event.target).attr('id')
var data = {
'action': 'amc_comment_vote',
'commentid': commentid,
'direction': direction
}
$.ajax({
type: 'post',
url: anotherAjax.ajaxurl,
data: data,
success: function ( response ) {
if ( ! response.success ) {
alert( 'FAIL!' );
}
else {
alert( 'Success!' );
$clickedButton.parent().siblings('.votes').html(function(i, val) { return
+val+1 });
}
}
});
});
});
--
http://wordpress-hackers.1065353.n5.nabble.com/Ajax-Button-Submission-Failing-50-of-the-time-Comment-Voting-Plugin-Help-tp42870.html
Sent from the Wordpress Hackers mailing list archive at Nabble.com.
_______________________________________________
wp-hackers mailing list
http://lists.automattic.com/mailman/listinfo/wp-hackers
Loading...