投票システムとサイトを生成するコードを作成しました。彼の外見は以下の通りです。
次のコード 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 が充電され、非常に遅くなると思います。このコードを最適化することについて知っている人はいますか?