3

私は自分のテーマの投票システムを作っています

single.phpで正常に動作しています

しかし、私がそれをindex.phpに保持すると、最初の投稿のIDのみが考慮され、残りは機能しません

複数の投稿IDを扱っていないと思います

これが完全なコードです

Cookieを設定し、jQueryを使用してAjaxアクションを呼び出す

  <script type="text/javascript">
/* <![CDATA[ */ 
(function($) {
function setCookie(name,value,days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}

function getCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

$("#vote").not(".disabled").click(function() {
    var el = $(this);
    el.html('<span id="loader"></span>');
    var nonce = $("input#voting_nonce").val();
    var data = {
        action: 'add_votes_options',
        nonce: nonce,
        postid: '<?php echo $post->ID; ?>',
        ip: '<?php echo $_SERVER['REMOTE_ADDR']; ?>'            
    };
    $.post('<?php echo admin_url('admin-ajax.php'); ?>', data,
    function(response){
        if(response!="-1") {
            el.html("VOTED").unbind("click");
            if(response=="null") {
                alert("A vote has already been registered to this IP address.");
            } else {
                $("#votecounter").html(response);
                alert("Thanks for your vote.");
            }
            var cookie = getCookie("better_votes");
            if(!cookie) {
                var newcookie = "<?php echo $post->ID; ?>";
            } else {
                var newcookie = cookie + ",<?php echo $post->ID; ?>";
            }
            setCookie("better_votes", newcookie, 365);
        } else {
            alert("There was a problem registering your vote. Please try again later.");
        }
    });
    return false;
}); 
})(jQuery);
/* ]]> */
</script>

これは、アクションを登録するためにfunctions.phpに入れたものです

 add_action("wp_ajax_add_votes_options", "add_votes_options");
 add_action("wp_ajax_nopriv_add_votes_options", "add_votes_options");
 function add_votes_options() {
if (!wp_verify_nonce($_POST['nonce'], 'voting_nonce'))
    return;

$postid = $_POST['postid'];
$ip = $_POST['ip'];

$voter_ips = get_post_meta($postid, "voter_ips", true);
if(!empty($voter_ips) && in_array($ip, $voter_ips)) {
    echo "null";
    die(0);
} else {
    $voter_ips[] = $ip;
    update_post_meta($postid, "voter_ips", $voter_ips);
}   

$current_votes = get_post_meta($postid, "votes", true);
$new_votes = intval($current_votes) + 1;
update_post_meta($postid, "votes", $new_votes);
$return = $new_votes>1 ? $new_votes." votes" : $new_votes." vote";
echo $return;
die(0);
 }           

これが私の投票ボタンとカウントボタンの呼び方です

  <?php
 // This will display "0 votes" and increase as votes are added
$votes = get_post_meta($post->ID, "votes", true);
$votes = !empty($votes) ? $votes : "0";
if($votes == 1) $plural = ""; else $plural = "s";
 echo '<div id="votecounter">'.$votes.' vote'.$plural.'</div>';
 ?>

 <?php
  // This will display the vote button and disable it if a cookie has already
 // been set. We also add the security nonce here. 
 $hasvoted = $_COOKIE['better_votes'];
 $hasvoted = explode(",", $hasvoted);
 if(in_array($post->ID, $hasvoted)) {
$vtext = "VOTED";
$class = ' class="disabled"';
 } else {
$vtext = "VOTE";
$class = "";
}
?>
 <a href="javascript:void(0)" id="vote"<?php echo $class; ?>><?php echo $vtext; ?></a>
 <?php if(function_exists('wp_nonce_field')) wp_nonce_field('voting_nonce', 'voting_nonce'); ?>
4

1 に答える 1

2

最初は、ボタンに同じIDを何度も付けないようにする必要があるため、次のように変更します。

<a href="javascript:void(0)" id="vote"<?php echo $class; ?>><?php echo $vtext; ?></a>

これに:

<?php 
if(in_array($post->ID, $hasvoted)) {
    $vtext = "VOTED";
    $class = ' disabled';
} else {
    $vtext = "VOTE";
    $class = "";
}
<a href="javascript:void(0)" id="vote-<?php echo $post->ID; ?>" class="vote-btn<?php echo $class; ?>"><?php echo $vtext; ?></a>

これにより、各投票ボタンのid属性が「vote-{postid}」の形式になります。そして、あなたはまだ何らかの方法ですべてのボタンに対処したいと思うので、.vote-btnセレクターを使用できるようになりました。

JavaScriptの問題は、投稿のIDをスクリプトに直接渡すことです。これは、ページに投稿が1つしかない場合は問題ありませんが、複数の投稿がある場合は、コードを複数回印刷するか、投稿IDを動的に取得する必要があります。

私は2番目のオプションを好みます。これを機能させるためにJSコードを変更する方法は次のとおりです。

<script type="text/javascript">
/* <![CDATA[ */ 
(function($) {
function setCookie(name,value,days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}

function getCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

$(".vote-btn").not(".disabled").click(function() {
    var el = $(this),
        nonce = $("input#voting_nonce", el.parent()).val(),
        id = el.attr('id').replace(/vote-/, ''); // get the Post ID

    el.html('<span id="loader"></span>');
    var data = {
        action: 'add_votes_options',
        nonce: nonce,
        postid: id,
        ip: '<?php echo $_SERVER['REMOTE_ADDR']; ?>'            
    };
    $.post('<?php echo admin_url('admin-ajax.php'); ?>', data,
    function(response){
        if(response!="-1") {
            el.html("VOTED").unbind("click");
            if(response=="null") {
                alert("A vote has already been registered to this IP address.");
            } else {
                $("#votecounter").html(response);
                alert("Thanks for your vote.");
            }
            var cookie = getCookie("better_votes");
            if(!cookie) {
                var newcookie = id;
            } else {
                var newcookie = cookie + "," + id;
            }
            setCookie("better_votes", newcookie, 365);
        } else {
            alert("There was a problem registering your vote. Please try again later.");
        }
    });
    return false;
}); 
})(jQuery);
/* ]]> */
</script>

したがって、上記のコードでは、「vote-」を空の文字列に置き換えることで、ユーザーが投票している投稿のIDを取得します(IDのみが残ります)。次の行にも注意してください。

nonce = $("input#voting_nonce", el.parent()).val(),

この行では、nonce入力とボタンの親が同じであると想定しています(ただし、すべての投稿に同じnonceを使用できるはずです)。ナンスを生成するコードを次のように変更することで、ナンスをさらに一歩進めることもできます。

<?php if(function_exists('wp_nonce_field')) wp_nonce_field('voting_nonce-' . $post->ID, 'voting_nonce'); ?>

そして、add_votes_options関数を次のように変更します。

$postid = $_POST['postid'];
if ( ! wp_verify_nonce( $_POST['nonce'], 'voting_nonce-' . $postid ) )
    return;

これにより、各ナンスが、ナンスの対象となる投稿のIDにバインドされます。

それはほとんどあなたの問題だと思います。私のコードを試して、問題があるかどうか教えてください(JSエラーの場合は、FireBugのエラーコンソールまたはWebKitのインスペクターからメッセージを追加してください)。


PP:これを見ただけです:

信頼できるおよび/または公式の情報源からの回答を探しています。

私の答えは、WordPressとjQueryの経験に裏付けられており、主にWordPressを使用して生計を立てています(jQueryは少ないですが、比較的頻繁に使用しています)。これで十分だといいのですが:)

于 2012-12-24T08:18:21.280 に答える