/** * Rebuild scores for all votes */ function bbpvotes_rebuild_scores() { $post_ids = array(); $default_query_args = array('post_type' => bbpvotes()->supported_post_types, 'post_status' => 'any', 'posts_per_page' => -1, 'fields' => 'ids'); $votes_up_query_args = wp_parse_args(array('meta_key' => bbpvotes()->metaname_post_vote_up), $default_query_args); $votes_down_query_args = wp_parse_args(array('meta_key' => bbpvotes()->metaname_post_vote_down), $default_query_args); $votes_up_query = new WP_Query($votes_up_query_args); $votes_down_query = new WP_Query($votes_down_query_args); foreach ($votes_up_query->posts as $id) { $post_ids[] = $id; } foreach ($votes_down_query->posts as $id) { $post_ids[] = $id; } $post_ids = array_unique($post_ids); foreach ($post_ids as $id) { $post_score = 0; $vote_count = 0; $votes = bbpvotes_get_votes_for_post($id); foreach ($votes as $user_id => $vote) { $post_score += $vote; $vote_count++; } update_post_meta($id, bbpvotes()->metaname_post_vote_score, $post_score); update_post_meta($id, bbpvotes()->metaname_post_vote_count, $vote_count); } }
function bbpvotes_post_vote_ajax() { $result = array('success' => false); if (!isset($_POST['post_id'])) { return false; } $action = $_POST['action']; $post_id = $_POST['post_id']; if ($action == 'bbpvotes_post_vote_up') { $nonce = 'vote-up-post_' . $post_id; } else { if ($action == 'bbpvotes_post_vote_down') { $nonce = 'vote-down-post_' . $post_id; } } if (!wp_verify_nonce($_POST['_wpnonce'], $nonce)) { return false; } if ($action == 'bbpvotes_post_vote_up') { $vote = bbpvotes()->do_post_vote($post_id, true); } else { if ($action == 'bbpvotes_post_vote_down') { $vote = bbpvotes()->do_post_vote($post_id, false); } } if (!is_wp_error($vote)) { $result['success'] = true; $score = bbpvotes_get_votes_score_for_post($post_id); $score_display = bbpvotes_number_format($score); $votes_count = bbpvotes_get_votes_count_for_post($post_id); $vote_count_display = bbpvotes_number_format($votes_count); $result['score_text'] = sprintf(__('Score: %1$s', 'bbpvotes'), $score_display); $result['score_title'] = sprintf(__('Votes count: %1$s', 'bbpvotes'), $vote_count_display); } else { $result['message'] = $vote->get_error_message(); } header('Content-type: application/json'); echo json_encode($result); die; }
function bbpvotes_get_author_score($author_id = 0, $post_args = null) { global $wpdb; if (!$author_id) { $author_id = get_current_user_id(); } //Get posts by this author $defaults = array('author' => $author_id, 'post_type' => bbpvotes()->supported_post_types, 'post_status' => 'any', 'fields' => 'ids', 'posts_per_page' => -1); // Parse arguments against default values $post_args = bbp_parse_args($post_args, $defaults, 'bbpvotes_get_votes_down_for_author_count_post_args'); $query = new WP_Query($post_args); if ($query->found_posts) { $post_ids = $query->posts; $post_ids_str = implode(',', $post_ids); //Get sum of scores for those posts $votes_scores = $wpdb->get_col($wpdb->prepare("\n SELECT meta_value\n FROM {$wpdb->postmeta}\n WHERE meta_key = %s \n AND post_id IN ({$post_ids_str})\n ", bbpvotes()->metaname_post_vote_score)); return array_sum($votes_scores); } else { return 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; }
function post_column_content($column_name, $post_id) { $post_type = get_post_type(); if (!in_array($post_type, bbpvotes()->supported_post_types)) { return; } $output = ''; switch ($column_name) { //score case $this->column_name_score: if ($score = bbpvotes_get_votes_score_for_post($post_id)) { $output = $score; } break; } echo $output; }