0

投票システムとサイトを生成するコードを作成しました。彼の外見は以下の通りです。

例

次のコード 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 が充電され、非常に遅くなると思います。このコードを最適化することについて知っている人はいますか?

4

1 に答える 1

0

最適化の 1 つの方法は、投票後に Cookie を設定し、それを防御の最前線として探すことです。これにより、多数のユースケースでデータベースへのかなりの数のコールバックが停止します。Cookie が設定されていない場合は、テーブルで IP アドレスをチェックして、既に投票しているかどうかを判断してください。

ユーザーはブラウザーを切り替えたり、Cookie を消去したりできるため、Cookie のみのアプローチは明らかに機能しません。これらのユーザーについては、現在と同じように IP を検索します (ただし、これを回避する方法はまだありますが、正当なユーザーがインターネット接続/IP アドレスを共有している場合 (つまり、同じ Starbucks Wifi 接続から投票している場合)、正当なユーザーが投票するのを妨げている可能性があります。

少なくとも、最初に Cookie を確認することで、不必要な可能性のある多数のデータベース トランザクションを事前に防ぐことができます。

于 2013-03-18T18:28:01.560 に答える