2013-11-01 4 views
0

Ниже приведен код ниже для простой системы оценки почтовых сообщений (учебник с этого сайта TUTORIAL) - он отлично работает, но мне нужно немного его изменить. Теперь, когда пользователь голосует, он не может снова голосовать за тот же пост за $ timebeforevote (1440 минут). Я хочу заблокировать голосование пользователя за все сообщения не только для этого.post rating system function

Я думаю, что проблема функция ищет пользователь IP в текущем посте меты поля с этим кодом:

$meta_IP = get_post_meta($post_id, "voted_IP"); 
$voted_IP = $meta_IP[0]; 

Возвращает $voted_IP и сравнивает его с $ip = $_SERVER['REMOTE_ADDR']; я попытался изменить его с запросом (если запрос ищет ip в мета-поле для всех сообщений), поэтому он будет искать ip во всех сообщениях, но он не работает. Я пытаюсь заставить его работать в течение 2 дней, и ничего не работает.

ПОЧТОВЫЙ ИНДЕКС Рейтинг:

$timebeforerevote = 1440; 

add_action('wp_ajax_nopriv_post-like', 'post_like'); 
add_action('wp_ajax_post-like', 'post_like'); 

wp_enqueue_script('like_post', get_template_directory_uri().'/js/post-like.js', array('jquery'), '1.0', 1); 
wp_localize_script('like_post', 'ajax_var', array(
    'url' => admin_url('admin-ajax.php'), 
    'nonce' => wp_create_nonce('ajax-nonce') 
)); 

function post_like() 
{ 
    $nonce = $_POST['nonce']; 

    if (! wp_verify_nonce($nonce, 'ajax-nonce')) 
     die ('Busted!'); 

    if(isset($_POST['post_like'])) 
    { 
     $ip = $_SERVER['REMOTE_ADDR']; 
     $post_id = $_POST['post_id']; 

     $meta_IP = get_post_meta($post_id, "voted_IP"); 

     $voted_IP = $meta_IP[0]; 
     if(!is_array($voted_IP)) 
      $voted_IP = array(); 

     $meta_count = get_post_meta($post_id, "votes_count", true); 

     if(!hasAlreadyVoted($post_id)) 
     { 
      $voted_IP[$ip] = time(); 

      update_post_meta($post_id, "voted_IP", $voted_IP); 
      update_post_meta($post_id, "votes_count", ++$meta_count); 

      echo $meta_count; 
     } 
     else 
      echo "already"; 
    } 
    exit; 
} 

function hasAlreadyVoted($post_id) 
{ 
    global $timebeforerevote; 

    $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; 
} 

function getPostLikeLink($post_id) 
{ 
    $themename = "twentyeleven"; 

    $vote_count = get_post_meta($post_id, "votes_count", true); 

    $output = '<p class="post-like">'; 

    if ($vote_count == 0) 
     $output .= '<span class="count">0<span class="glosow"><br>głosów w rankingu</span></span>'; 
    else 
     $output .= '<span class="count">'.$vote_count.'<span class="glosow"><br>głosów w rankingu</span></span>'; 

    if(hasAlreadyVoted($post_id)) 
     $output .= '<span title="Już głosowałeś" class="qtip alreadyvoted"></span>'; 
    else 
     $output .= '<a href="#" data-post_id="'.$post_id.'"> 
        <span title="'.__('Głosuj', $themename).'"class="qtip like"></span></a>'; 
    $output .= '</p>'; 

    return $output; 
} 

Heres код запроса, который находит, если пользователь уже проголосовал, но проблема заключается в том, что после того, как $ timebeforerevote значение IP остается в мета-поле, так что я не могу использовать его. У меня нет больше идей сейчас ...

$ip = $_SERVER['REMOTE_ADDR']; 
$query = new WP_Query(array( 
    'ignore_sticky_posts' => true, 
    'meta_key' => 'voted_IP', 
    'meta_value' => $ip 
)); 
if (0 !== $query->found_posts) { 
    //do something 
} 
+0

_ «Я пытался изменить его с запросом (если запрос ищет IP в мета-поле для всех сообщений)» _ Это будет быть в правильном направлении. Где код для этого? – geomagas

+0

Добавлено в главный вопрос в 'do something part' Мне нужна секция голосования, если только запрос не находит адрес пользователя ip в метаполе 'voted_IP', но я понял, что мета-поле не очищается после $ timebeforerevote, поэтому я не мог использовать Это. – th3rion

+0

$ voted_IP [$ ip] = time(); update_post_meta ($ post_id, "voted_IP", $ voted_IP); Я думаю в этой строке. Но я не могу понять, как ip хранится как время. – th3rion

ответ

0

Этот код:

 $voted_IP[$ip] = time(); 

     update_post_meta($post_id, "voted_IP", $voted_IP); 
     update_post_meta($post_id, "votes_count", ++$meta_count); 

... указывает на то, что попытки голосования хранятся в voted_IP мета Почты, в виде массива ip=>timestamp , Это делает 'meta_value' => $ip в вашем запросе недействительным, потому что вы пытаетесь сопоставить строку с массивом. Вместо этого, просто запросить все посты, которые имеют этот мета ключ, а затем сделать несколько итераций:

global $post; 
$tmp=$post; 
$recently_voted=false; 
$ip = $_SERVER['REMOTE_ADDR']; 
$query = new WP_Query(array( 
    'ignore_sticky_posts' => true, 
    'meta_key' => 'voted_IP', 
// 'meta_value' => $ip // invalid... 
)); 
if (0 !== $query->found_posts) { 
    $now=time(); 
    while($query->have_posts()) 
    { 
    $id=$post->id; 
    $meta_IP=get_post_meta($id,"voted_IP"); // this is an array 
    if(isset($meta_IP[$ip])&&($now-$meta_IP[$ip]<1440*60)) 
     { 
     $recently_voted=true; // found at least one recent vote 
     break; 
     } 
    } 
} 
$post=$tmp; 
Смежные вопросы