我制作了一个生成投票系统和您的网站的代码。他的样子如下图:
我制作了以下代码JavaScipt:
jQuery(document).ready(function() {
jQuery("a#up").click(function() {
jQuery('.rating').html('');
jQuery('#loading').show();
post_id = jQuery(this).data("post_id");
jQuery.ajax({
type: "post",
url: ajax_var.url,
data: "action=post_id&nonce=" + ajax_var.nonce + "&post_rating=up&post_id=" + post_id,
success: function(data) {
jQuery('#loading').hide();
jQuery('.rating').html(data);
}
});
return false;
});
jQuery("a#down").click(function() {
post_id = jQuery(this).data("post_id");
jQuery.ajax({
type: "post",
url: ajax_var.url,
data: "action=post_id&nonce=" + ajax_var.nonce + "&post_rating=down&post_id=" + post_id,
success: function(data) {
jQuery('.rating').html(data);
}
});
return false;
});
});
以下PHP代码在我的functions.php中
<?php
function add_rating_script() {
wp_enqueue_script('rating', get_stylesheet_directory_uri() . '/js/rating.js', array('jquery'), '', true);
wp_localize_script('rating', 'ajax_var', array('url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('ajax-nonce')));
}
function update_rating() {
// Check for nonce security
$nonce = $_POST['nonce'];
if (!wp_verify_nonce($nonce, 'ajax-nonce'))
die('Busted!');
if (isset($_POST['post_rating'])) {
// Retrieve user IP address
$ip = $_SERVER['REMOTE_ADDR'];
$post_id = $_POST['post_id'];
// Get voters'IPs for the current post
$meta_IP = get_post_meta($post_id, "voted_IP");
$voted_IP = $meta_IP[0];
if (!is_array($voted_IP))
$voted_IP = array();
// Get votes count for the current post
$meta_count_up = get_post_meta($post_id, "votes_up", true);
$meta_count_down = get_post_meta($post_id, "votes_down", true);
// Use has already voted ?
if (!hasAlreadyVoted($post_id)) {
$voted_IP[$ip] = time();
if ($_POST['post_rating'] == 'up') {
// Save IP and increase votes count
update_post_meta($post_id, "voted_IP", $voted_IP);
update_post_meta($post_id, "votes_up", ++$meta_count_up);
echo '<p class=\'message\'>Esse artigo já ajudou <span class=\'count\'>' . $meta_count_up . '</span> pessoas </p>';
}elseif($_POST['post_rating'] == 'down'){
update_post_meta($post_id, "voted_IP", $voted_IP);
update_post_meta($post_id, "votes_down", ++$meta_count_down);
echo '<p class=\'message\'>Obrigado pelo seu voto.</p>';
}
}
else
echo '<p class=\'message\'>Você já enviou o seu voto.</p>';
}
exit;
}
function hasAlreadyVoted($post_id) {
$timebeforerevote = 120;
$meta_IP = get_post_meta($post_id, "voted_IP");
$voted_IP = $meta_IP[0];
if (!is_array($voted_IP))
$voted_IP = array();
$ip = $_SERVER['REMOTE_ADDR'];
if (in_array($ip, array_keys($voted_IP))) {
$time = $voted_IP[$ip];
$now = time();
if (round(($now - $time) / 60) > $timebeforerevote)
return false;
return true;
}
return false;
}
wp_localize_script('rating', 'ajax_var', array(
'url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('ajax-nonce')
));
add_action('wp_enqueue_scripts', 'add_rating_script');
add_action('wp_ajax_post_id', 'update_rating');
add_action('wp_ajax_nopriv_post_id', 'update_rating');
问题是为了防止用户在同一篇文章中多次投票,我把它保存了 IP 并做一个比较,但我相信随着时间的推移,WordPress 会收费并且超级慢。有谁知道我优化这段代码的事情?