获得多个帖子ID wordpress

Posted

技术标签:

【中文标题】获得多个帖子ID wordpress【英文标题】:getting multiple post id wordpress 【发布时间】:2012-12-09 15:53:57 【问题描述】:

我正在为我的主题制作投票系统

在 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'); ?>

【问题讨论】:

主要是jQuery代码postid。 您能否删除代码的最后一部分,改为发布您的 get_post_meta 函数以及通过此 ajax 调用发送的内容:$.post('&lt;?php echo admin_url('admin-ajax.php'); ?&gt;', data, (...) 【参考方案1】:

作为开始,你不应该一遍又一遍地为你的按钮设置相同的 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-post id”的形式出现。由于我猜您仍然想以某种方式处理所有按钮,您现在可以使用.vote-btn 选择器。

您的 JavaScript 的问题在于您将帖子的 ID 直接传递给脚本。这很好,当您在页面上只有一篇文章时,但是当您有多个文章时,您必须多次打印您的代码,或者动态获取文章 ID。

我更喜欢第二个选项,以下是您的 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;

这会将每个 nonce 绑定到帖子的 ID,即 nonce 的用途。

我认为这几乎是你的问题。请尝试我的代码并告诉我它是否有问题(如果是 JS 错误,请在 FireBug 的错误控制台或 WebKit 的检查器中添加消息)。


PP:刚刚看到这个:

从可靠和/或官方来源寻找答案。

我的回答得到了我在 WordPress 和 jQuery 方面的经验的支持——我主要通过使用 WordPress 来谋生(较少使用 jQuery,但我也相对经常使用它)。希望这就够了:)

【讨论】:

嘿,它就像一个魅力,但点击投票后没有增加 不是通过ajax增加的,而是在页面刷新后增加的 那么,问题出在函数的响应上。你能在处理你的 AJAX 回调的函数顶部做一个console.log( response ); 吗? 糟糕,作为一个新手,我不知道该怎么做 $("#votecounter").html(response); 更改为 $("#votecounter", el).html(response); - 请注意这仍然不是一个好的解决方法,因为您的 id "votecounter" 重复了多次。相反,我建议您将 id 更改为 votecounter div 上的 class。您还需要更新您的 CSS 和 JS 以反映这一点。

以上是关于获得多个帖子ID wordpress的主要内容,如果未能解决你的问题,请参考以下文章

如何获取具有多个表关系的帖子?

php 根据帖子ID合并多个WP_Query

如何获得帖子的平均点赞数?

如何获得每个帖子的 php 总评论数?

TypeError:获得多个参数值

如何在循环中发送多个 SOAP 请求:PHP?