function bbpvotes_get_unvote_link($args = '')
{
    // Parse arguments against default values
    $r = bbp_parse_args($args, array('id' => 0, 'link_before' => '', 'link_after' => '', 'sep' => ' | ', 'text' => esc_html__('Unvote', 'bbpvotes')), 'get_post_unvote_link');
    if (!($post = get_post((int) $r['id']))) {
        return false;
    }
    //capability check
    if (!bbpvotes_can_user_unvote_for_post($post->ID)) {
        return false;
    }
    if ($post->post_author == get_current_user_id()) {
        return false;
    }
    //user cannot vote for himself
    $post_type = $post->post_type;
    $link_classes = array('bbpvotes-post-vote-link', 'bbpvotes-post-unvote-link');
    $r['title'] = __('Remove my vote', 'bbpvotes');
    //check if user has already voted
    if ($voted_down = bbpvotes_has_user_voted_down_for_post($post->ID)) {
        $r['text'] = esc_html__('Vote removed', 'bbpvotes');
        $r['title'] = esc_html__('Your vote for this post has been removed', 'bbpvotes');
        $link_classes[] = 'bbpvotes-post-unvoted';
    }
    $uri = add_query_arg(array('action' => 'bbpvotes_post_unvote', 'post_id' => $post->ID));
    $uri = wp_nonce_url($uri, 'unvote-post_' . $post->ID);
    $retval = $r['link_before'] . '<a href="' . esc_url($uri) . '"  title="' . $r['title'] . '"' . bbpvotes_classes_attr($link_classes) . '>' . bbpvotes_get_link_icons() . $r['text'] . '</a>' . $r['link_after'];
    return apply_filters('bbpvotes_get_unvote_link', $retval, $r);
}
Example #2
0
 /**
  * 
  * @param type $post_id
  * @param type $vote MUST BE defined, MUST BE a boolean
  * @return boolean|\WP_Error
  */
 function do_post_vote($post_id, $vote = null)
 {
     //check vote value
     if (is_bool($vote) === false) {
         return new WP_Error('vote_is_not_bool', __('Vote is not a boolean', 'bbpvotes'));
     }
     $voteplus = $vote === true;
     $voteminus = $vote === false;
     if (!($post = get_post($post_id))) {
         return false;
     }
     if ($voteplus && !bbpvotes_can_user_vote_up_for_post($post->ID) || $voteminus && !bbpvotes_can_user_vote_down_for_post($post->ID)) {
         return new WP_Error('missing_capability', __("You don't have the required capability to vote", 'bbpvotes'));
     }
     $user_id = get_current_user_id();
     //check user is not post author
     if ($post->post_author == $user_id) {
         return new WP_Error('user_is_author', __('You cannot vote for your own post', 'bbpvotes'));
     }
     //get current votes
     $post_score = bbpvotes_get_votes_score_for_post($post->ID);
     $votes_count = bbpvotes_get_votes_count_for_post($post->ID);
     $user_voted_up = bbpvotes_has_user_voted_up_for_post($post->ID, $user_id);
     $user_voted_down = bbpvotes_has_user_voted_down_for_post($post->ID, $user_id);
     $toggle_vote = $voteplus && $user_voted_down || $voteminus && $user_voted_up;
     $unvote = bbpvotes()->options['unvote_enabled'] && ($voteplus && $user_voted_up || $voteminus && $user_voted_down);
     //remove old vote first if any
     if ($toggle_vote || $unvote) {
         //get previous vote meta key
         if ($user_voted_down) {
             $meta_previous_vote = $this->metaname_post_vote_down;
         } else {
             $meta_previous_vote = $this->metaname_post_vote_up;
         }
         if ($removed_previous_vote = delete_post_meta($post->ID, $meta_previous_vote, $user_id)) {
             //successfully deleted
             $votes_count--;
             //restore score
             if ($user_voted_down) {
                 $post_score++;
             } else {
                 $post_score--;
             }
         }
     }
     if ($voteplus && $user_voted_up || $voteminus && $user_voted_down) {
         //vote duplicate : remove or block it
         if (bbpvotes()->options['unvote_enabled']) {
             //remove vote
             if (!bbpvotes_can_user_unvote_for_post($post->ID)) {
                 return new WP_Error('missing_capability', __("You don't have the required capability to unvote", 'bbpvotes'));
             } else {
                 if ($removed_previous_vote) {
                     update_post_meta($post->ID, $this->metaname_post_vote_score, $post_score);
                     update_post_meta($post->ID, $this->metaname_post_vote_count, $votes_count);
                     do_action('bbpvotes_do_post_unvote', $post->ID, $user_id);
                 } else {
                     return new WP_Error('unvoting_error', __('Error while unvoting for this post', 'bbpvotes'));
                 }
             }
         } else {
             //block vote
             return new WP_Error('already_voted', __('You have already voted for this post', 'bbpvotes'));
         }
     } else {
         //process vote
         //get new vote meta key
         if ($voteplus) {
             $meta_vote = $this->metaname_post_vote_up;
         } else {
             $meta_vote = $this->metaname_post_vote_down;
         }
         if ($result = add_post_meta($post->ID, $meta_vote, $user_id)) {
             $votes_count++;
             //update score
             if ($voteplus) {
                 $post_score++;
             } else {
                 $post_score--;
             }
             update_post_meta($post->ID, $this->metaname_post_vote_score, $post_score);
             update_post_meta($post->ID, $this->metaname_post_vote_count, $votes_count);
         } else {
             return new WP_Error('voting_error', __('Error while voting for this post', 'bbpvotes'));
         }
         do_action('bbpvotes_do_post_vote', $post->ID, $user_id, $vote);
     }
     return true;
 }