Как организовать голосование в посте на WP?

Maxim-KL
На сайте с 26.01.2011
Offline
350
517

Всем доброго времени суток и заранее спасибо за полезные советы. Ситуация такая:

Необходимо организовать конкурс фоторабот на WP в одном посте. Что бы было полноценное голосование и один человек мог проголосовать только один раз. Если честно я совсем слабо себе представляю как такое сделать так как раньше не приходилось с подобным сталкиваться. Даже не знаю использовать какой то плагин или что...?

Буду очень благодарен если укажите в какую сторону стоит двигаться.:popcorn:

Мои услуги по прогонам: ✅Качественный ручной статейный прогон по базе сайтов с ИКС10+ (maximgroups.net/progon-statejnyj) ✅Прогон Максимум - Все включено, 300+ качественных ссылок (maximgroups.net/progon-maksimum)
TA
На сайте с 12.06.2009
Offline
116
TiA
#1
Maxim-KL:
Всем доброго времени суток и заранее спасибо за полезные советы. Ситуация такая:

Необходимо организовать конкурс фоторабот на WP в одном посте. Что бы было полноценное голосование и один человек мог проголосовать только один раз. Если честно я совсем слабо себе представляю как такое сделать так как раньше не приходилось с подобным сталкиваться. Даже не знаю использовать какой то плагин или что...?

Буду очень благодарен если укажите в какую сторону стоит двигаться.🍿

Я в основном для решения подобного рода задач использую дополнительные мета-поля записи и AJAX-запросы:


<?php
add_action('wp_ajax_nopriv_post_rating', 'tw_post_rating');
add_action('wp_ajax_post_rating', 'tw_post_rating');

function tw_post_rating(){

if (isset($_POST['rating_vote']) and isset($_POST['nonce']) and wp_verify_nonce($_POST['nonce'], 'ajax-nonce')) {

$timebeforerevote = 120;

$ip = $_SERVER['REMOTE_ADDR'];
$post_id = intval($_POST['post_id']);
$meta_IP = get_post_meta($post_id, "rating_IP");

if (is_array($meta_IP) and isset($meta_IP[0])) $rating_IP = $meta_IP[0]; else $rating_IP = array();

if (in_array($ip, array_keys($rating_IP))) {
$time = $rating_IP[$ip];
$now = time();
if (round(($now - $time) / 60) < $timebeforerevote) {
echo json_encode(array('error' => 'Вы уже голосовали'));
exit();
}
}

$rating_vote = intval($_POST['rating_vote']);
if ($rating_vote > 5 or $rating_vote < 0) exit();

$rating_value = get_post_meta($post_id, "rating_value", true);
if (empty($rating_value)) {
delete_post_meta($post_id, "rating_value");
add_post_meta($post_id, "rating_value", '0');
$rating_value = 0;
}

$rating_votes = get_post_meta($post_id, "rating_votes", true);
if (empty($rating_votes)) {
delete_post_meta($post_id, "rating_votes");
add_post_meta($post_id, "rating_votes", '0');
$rating_votes = 0;
}

$rating_sum = get_post_meta($post_id, "rating_sum", true);
if (empty($rating_sum)) {
delete_post_meta($post_id, "rating_sum");
add_post_meta($post_id, "rating_sum", '0');
$rating_sum = 0;
}

$rating_IP[$ip] = time();

$rating_sum = $rating_sum + $rating_vote;

$rating_votes++;

$rating_value = round($rating_sum/$rating_votes);

update_post_meta($post_id, "rating_IP", $rating_IP);
update_post_meta($post_id, "rating_votes", $rating_votes);
update_post_meta($post_id, "rating_value", $rating_value);
update_post_meta($post_id, "rating_sum", $rating_sum);

$result = array(
'rating' => intval($rating_value),
'votes' => intval($rating_votes)
);

echo json_encode($result);

}

exit();

}
?>

Поместить его можно в functions.php

В шаблоне это можно использовать примерно так:


<?php

$rating = get_post_meta(get_the_ID(), 'rating_value', true);

if (empty($rating)) {
delete_post_meta(get_the_ID(), 'rating_value');
add_post_meta(get_the_ID(), 'rating_value', '0');
$rating = 0;
}
?>

<div class="rating">

<?php for ($i = 0; $i < 4; $i++) { ?>

<span<?php if ($rating > $i) echo ' class="active"'; ?>></span>

<?php } ?>

</div>

<script type="text/javascript">

jQuery(function($){

var rating = parseInt('<?php echo $rating; ?>');

$('.rating > span').each(function(i){

var num = i+1;

$(this).click(function(){

$.ajax({
type: "POST",
data: {
action: 'post_rating',
rating_vote: num,
nonce: '<?php echo wp_create_nonce('ajax-nonce'); ?>',
post_id: '<?php the_ID(); ?>'
},
url: '<?php echo admin_url('admin-ajax.php'); ?>',
dataType: 'json',
success: function(data){

if (data.error) alert(data.error);

if (data.rating) {

rating = data.rating;

$('.rating > span').removeClass('active');
$('.rating > span:lt(' + parseInt(data.rating) + ')').addClass('active');
}

}
});

});

$(this).hover(
function(){
$('.rating > span').removeClass('active');
$('.rating > span:lt(' + num + ')').addClass('active');
},
function(){

}
);

});

$('.rating').hover(
function(){
},
function(){
$('.rating > span').removeClass('active');
$('.rating > span:lt(' + rating + ')').addClass('active');
}
);

});

</script>
Профессиональная верстка и разработка сайтов на WordPress (http://www.maultalk.com/topic139110s0.html)
Maxim-KL
На сайте с 26.01.2011
Offline
350
#2

TiA, Спасибо, обязательно попробую и ваш вариант. А сейчас нашел плагин WP-Poll, куча возможностей и все очень просто. Юзаю все супер.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий