Additionally. Instead of changing the vote, I tried to remove it from database using the follow:
if ( function_exists( 'the_field' ) ) {
global $wpdb;
$results = $wpdb->get_results( "SELECT rating FROM $wpdb->acfsrf where user_id=".get_current_user_id()." AND meta_id=".get_the_ID() );
if ($results != NULL){
function removeVote() {
global $wpdb;
$results2 = $wpdb->delete( $wpdb->acfsrf , array( 'user_id' => get_current_user_id(), 'meta_id' => get_the_ID() ) );
if ($results2){
echo "deleted successfully";
}
}
if (isset($_GET['vote_remove'])) {
removeVote();
}
?>
<a href='index.php?vote_remove=true'>Remove your rate!</a>
<?php } else{
$star_rating = get_field( 'field_55b60d9089739', get_the_ID());
print_r($star_rating);
}
}
I managed to remove the row from database. And the user can vote again. However the data persist. May I know where else do I have to remove aside from wp_acfsrf?
Thank you.
Hi,
there is no such opportunity in this plugin.
Sorry, my English is bad, but:
You right: rating`s data stored in wp_acfsrf table.
But wp_acfsrf data not used in showing of rating results(only for check permission and rules setting).
Data used in showing – wp_postmeta table’s data. These data are serialized (example: a2: {s: 4: “avrg”; s: 1: “0”; s: 5: “votes”; s: 1: “0”}).
Before deleting data from wp_acfsrf, you must recalculate the data wp_postmeta (example):
$new_result = array (
‘avrg’ => $new_avrg,
‘votes’ => $votes – 1);
update_field ($field_key, $new_result, $ post_id);
But in this case, all user’s voting data will be erased.
Thanks for hint.
I am not sure if I did it correctly but I managed to get it working.
if ( function_exists( 'the_field' ) ) {
global $wpdb;
$result = $wpdb->get_results( "SELECT rating FROM $wpdb->acfsrf where user_id=".get_current_user_id()." AND meta_id=".get_the_ID() );
if ($result != NULL){
function removeVote() {
global $wpdb;
//GET current user rating
$result2 = $wpdb->get_results( "SELECT rating FROM $wpdb->acfsrf where user_id=".get_current_user_id()." AND meta_id=".get_the_ID() );
$current_rate = ($result2[0]->rating);
//GET the current result and segregate result
$result3 = $wpdb->get_results( "SELECT meta_value FROM $wpdb->postmeta where meta_key='rate' AND post_id=".get_the_ID() );
$ratearray = explode(";", $result3[0]->meta_value);
//Remove d: and i: from string
$total_rate = str_replace("d:", "", $ratearray[1]);
$total_user = str_replace("i:", "", $ratearray[3]);
//Update the respective value
$updated_user = $total_user-1;
$updated_rate = (($total_rate * $total_user)-$current_rate)/($updated_user);
//convert value to string
$new_value = "$ratearray[0];d:$updated_rate;$ratearray[2];i:$updated_user;$ratearray[4]";
//Update table with user
$result4 = $wpdb->update($wpdb->postmeta , array('meta_value' => $new_value), array('meta_key' => 'rate', 'post_id' => get_the_ID()));
//remove the current user rate
$result5 = $wpdb->delete( $wpdb->acfsrf , array( 'user_id' => get_current_user_id(), 'meta_id' => get_the_ID() ) );
if ($result5 && $result4){
wp_redirect( add_query_arg( array('vote_remove' => false), $_SERVER['REQUEST_URI']) );
exit;
}
}
if (isset($_GET['vote_remove'])) {
removeVote();
}
?>
<a href='index.php?vote_remove=true'>Remove your rate!</a>
<?php } else{
$star_rating = get_field( 'field_55b60d9089739', get_the_ID());
print_r($star_rating);
}
}
Warning: in the wp_postmeta strings (your $result3) may contain different quotes and types.
So, please using php serialize() function or using get_post_meta()/update_field() functions for automatically unserialize/serialize strings.
So you actually serialize the code before inserting to DB.
Thanks for the tips that actually helped me optimized my code.