Форум программистов, компьютерный форум, киберфорум
WordPress
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 20

Модификация рейтинга записей без плагина

07.10.2017, 22:00. Показов 3774. Ответов 8

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Буду благодарен за советы по модификации рейтинга записей.
А именно как сделать вывод ко-ва проголосовавших ($pr) вверху статьи, а также добавить возможность настройки времени куки.

Возникли следующие вопросы:
1. Вывод данных осуществляется в функции rating, но как создать вывод отдельной переменной $pr с данной функции в другом месте.
PHP
1
echo '<div class="vote-block'.$disable_class.'" data-id="'. get_the_ID() .'" data-total="'. $total_rec .'" data-rating="'. $rating .'" rel="v:rating">'.$richSnp.''.$ratingHTML.'</div>'
2. Я правильно понял, что для определения того проголосовал ли пользователь или нет в данном решении используются куки с помощью этого кода https://github.com/carhartl/jquery-cookie
Но как установить время куки в этом js скрипте?
// Получаем текущуее время
var now = new Date();
Устанавливаем время в секундах а далее куда данный код вставить?
document.cookie = 'key=value; max-age=(время в секундах)';
3. Если у меня уже другой плагин (просмотра статей) использует куки не будут ли они конфликтовать?


php код рейтинга (http://livinfo.ru/prodvizhenie... z-plagina/):

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
if(isset($_GET['do']) && $_GET['do']=='ajax') {
  if(isset($_POST['num'])) {
    if( (isset($_POST['id']) && is_numeric($_POST['id']))) {
      $id = $_POST['id'];
      $num = $_POST['num'];
 
      if(!$_COOKIE["vote-post-".$id]) {
        wp__set_data('vote-total',$id,(int)wp__get_data('vote-total',$id) + 1);
        wp__set_data('vote-rating',$id,(int)wp__get_data('vote-rating',$id) + $num);
 
        $total = wp__get_data('vote-total',$id);
        $rating = wp__get_data('vote-rating',$id);
 
        if($total==0) {$total = 1;}
 
        echo ($rating/($total*5))*100;
      } else {
        echo 'limit';
      }
 
      die();
    }
  }
  die();
}
 
function rating($voted=true) {
  if($voted) {
    $disable_class = !!$_COOKIE["vote-post-". get_the_ID()]?' disabled':'';
  } else {
    $disable_class = ' disabled';
  }
  $total = wp__get_data('vote-total',get_the_ID());
  $rating = wp__get_data('vote-rating',get_the_ID());
  
  $total_text = sklonen($total, 'голос', 'голоса', 'голосов', true);
  $total_rec = $total;
  if($total==0) {$total = 1;}
  
  $pr = ($rating/($total*5))*100;
  $abs = round($rating/$total, 1);
 
  $ratingHTML = '<ol class="rating show-current"><li>5</li><li>4</li><li>3</li><li>2</li><li>1</li><li class="current"><span style="width:'.$pr.'%"></span></li></ol> <span class="rating-text">('.$total_text.', в среднем: <strong>'.($abs).'</strong> из 5)</span> <div class="rating-info" id="rating-info"></div>';
 
  $richSnp = '<div typeof="v:Rating"><div style="display: none;" itemprop="aggregateRating" itemscope="" itemtype="http://schema.org/AggregateRating"><meta itemprop="bestRating" content="5"><meta property="v:rating" content="'.($abs).'" /><meta itemprop="ratingValue" content="'.($abs).'"><meta itemprop="ratingCount" property="v:votes" content="'.$total.'"></div></div>';
 
  echo '<div class="vote-block'.$disable_class.'" data-id="'. get_the_ID() .'" data-total="'. $total_rec .'" data-rating="'. $rating .'" rel="v:rating">'.$richSnp.''.$ratingHTML.'</div>';
}
 
function sklonen($n,$s1,$s2,$s3, $b = false){
  $m = $n % 10; $j = $n % 100;
  if($b) $n = '<b>'.$n.'</b>';
  if($m==0 || $m>=5 || ($j>=10 && $j<=20)) return $n.' '.$s3;
  if($m>=2 && $m<=4) return  $n.' '.$s2;
  return $n.' '.$s1;
}
 
 
function wp__set_data($name, $postID, $value) {
    $count_key = $name;
    $count = get_post_meta($postID, $count_key, true);
    if($count==''){
        $count = 0;
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
    }else{
        update_post_meta($postID, $count_key, $value);
    }
}
function wp__get_data($name, $postID){
    $count_key = $name;
    $count = get_post_meta($postID, $count_key, true);
    if($count==''){
        delete_post_meta($postID, $count_key);
        add_post_meta($postID, $count_key, '0');
        return "0";
    }
    return $count.'';
}
Скрипт рейтинга:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
(function($) {
 
    $(document).on('mouseover','.vote-block li',function() {
        var $el = $(this);
        var star = parseInt($el.text(),10);
 
        if($el.parent().parent().hasClass('disabled')) {
            return false;
        }
        
        $('#rating-info').show().html(star +' ' + decOfNum(star, ['голос', 'голоса', 'голосов']));
    }).on('mouseleave','.vote-block li',function() {
        $('#rating-info').hide();
    });
    $(document).on('click','.vote-block li',function() {
        var $el = $(this);
        var id = $el.parent().parent().data('id');
        var total = $el.parent().parent().data('total');
        var rating = $el.parent().parent().data('rating');
        var num = parseInt($el.text(),10);
 
        if($el.parent().parent().hasClass('disabled')) {
            return false;
        }
 
        $.ajax({
            type: 'POST',
            url: '?do=ajax',
            data: {id:id,num:num},
            success: function(pr) {
                if(pr === 'limit') {
                    return false;
                } else {
                    $el.parent().parent().addClass('disabled');
                    $.cookie('vote-post-'+id, true, {expires: 7, path: '/' });
                    $el.parent().find('.current span').css('width',pr+'%');
                    total++;
                    var abs = ((rating+num)/total);
                    abs = (abs^0)===abs?abs:abs.toFixed(1);
                    $el.parent().parent().find('span.rating-text').html('(<strong>'+total+'</strong> '+decOfNum(total, ['голос', 'голоса', 'голосов']) +', в среднем: <strong>'+abs+'</strong> из 5)');
                }
            }
        });
 
        return false;
    });
 
})(jQuery);
 
function decOfNum(number, titles) {  
    cases = [2, 0, 1, 1, 1, 2];  
    return titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ];  
}  
 
/*!
 * jQuery Cookie Plugin v1.4.1
 * https://github.com/carhartl/jquery-cookie
 *
 * Copyright 2006, 2014 Klaus Hartl
 * Released under the MIT license
 */
!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e("object"==typeof exports?require("jquery"):jQuery)}(function(e){function n(e){return u.raw?e:encodeURIComponent(e)}function o(e){return u.raw?e:decodeURIComponent(e)}function i(e){return n(u.json?JSON.stringify(e):e+"")}function r(e){0===e.indexOf('"')&&(e=e.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"))
try{return e=decodeURIComponent(e.replace(c," ")),u.json?JSON.parse(e):e}catch(n){}}function t(n,o){var i=u.raw?n:r(n)
return e.isFunction(o)?o(i):i}var c=/\+/g,u=e.cookie=function(r,c,a){if(arguments.length>1&&!e.isFunction(c)){if(a=e.extend({},u.defaults,a),"number"==typeof a.expires){var f=a.expires,s=a.expires=new Date
s.setTime(+s+864e5*f)}return document.cookie=n(r)+"="+i(c)+(a.expires?"; expires="+a.expires.toUTCString():"")+(a.path?"; path="+a.path:"")+(a.domain?"; domain="+a.domain:"")+(a.secure?"; secure":"")}for(var d=r?void 0:{},p=document.cookie?document.cookie.split("; "):[],m=0,x=p.length;x>m;m++){var l=p[m].split("="),k=o(l.shift()),v=l.join("=")
if(r&&r===k){d=t(v,c)
break}r||void 0===(v=t(v))||(d[k]=v)}return d}
u.defaults={},e.removeCookie=function(n,o){return void 0===e.cookie(n)?!1:(e.cookie(n,"",e.extend({},o,{expires:-1})),!e.cookie(n))}})
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.10.2017, 22:00
Ответы с готовыми решениями:

код рейтинга записей
помогите пожал.мне нужен код для вставки в шаблон блога.я хочу поместить рейтинг записи(оценка) +1..+5 как у многих есть в конце записи...

Модификация записей в БД
Доброго времени суток!!! Ребята подскажите как &lt;SPAN style=&quot;FONT-SIZE: 10pt; COLOR: #1f5080; FONT-FAMILY: Verdana;...

Модификация программы для записей семейного бюджета
Всем доброго времени суток) Создаю программу для записей семейного бюджета на с# с помощью Windows Forms, необходима помощь... В код нужно...

8
 Аватар для shevan
163 / 164 / 78
Регистрация: 06.09.2015
Сообщений: 632
08.10.2017, 11:43

Не по теме:

Меня поражает умозаключение делающих обзор пользователей, что это не плагин. Так или иначе код выполняется на вашем сервере,
его можно запихнуть в папку с плагинами и он будет работать как самый настоящий плагин. Не факт, что лучше или быстрее, чем другие.



ddem,

2. cockie устанавливается в скрипте в 35 строке.

3. нет
1
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 20
09.10.2017, 11:15  [ТС]
shevan, как всегда огромное спасибо!!!

На счет
Цитата Сообщение от shevan Посмотреть сообщение
что это не плагин. Так или иначе код выполняется на вашем сервере,
его можно запихнуть в папку с плагинами и он будет работать как самый настоящий плагин. Не факт, что лучше или быстрее, чем другие.
- согдасен на все 100%, но во-первых так я сам разбираю код и вижу как он устроен, а во-вторых в большинстве аналогичных плагинов присутствует много лишнего кода, который явно не ускоряет загрузку стрн.

shevan, подскажите еще пожалуйста, как мне создать вывод отдельной переменной $pr (кол-во проголосовавших) с данной функции в другом месте шаблона?


Также хотел учточнить на счет 35 строки времени действия куки
JavaScript
1
$.cookie('vote-post-'+id, true, {expires: 7, path: '/' });
- тут кука действует 7 дней, правильно я понял?

т.е. если я хочу добавить время жизни куки, например пол часа, так будет правильно?

JavaScript
1
2
3
4
 var date = new Date();
 var minutes = 30;
 date.setTime(date.getTime() + (minutes * 60 * 1000));
 $.cookie("'vote-post-'+id, true, { expires: date });
0
 Аватар для shevan
163 / 164 / 78
Регистрация: 06.09.2015
Сообщений: 632
09.10.2017, 12:11
Цитата Сообщение от ddem Посмотреть сообщение
вывод отдельной переменной $pr (кол-во проголосовавших)
Там не количество проголосовавших, а ширина span элемента.

Цитата Сообщение от ddem Посмотреть сообщение
- тут кука действует 7 дней, правильно я понял?
т.е. если я хочу добавить время жизни куки, например пол часа, так будет правильно?
так пробуйте и экспериментируйте, смотрите документацию используемой функции/библиотеки.

Вряд ли кто-то будет давать здесь на всё готовый код.

Тем более -

Цитата Сообщение от ddem Посмотреть сообщение
во-первых так я сам разбираю код и вижу как он устроен
0
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 20
09.10.2017, 13:01  [ТС]
shevan, может я неправильно понял
Цитата Сообщение от shevan Посмотреть сообщение
Там не количество проголосовавших, а ширина span элемента.
, тогда извиняюсь за глупый вопрос, эту переменную с 40 строки я же могу вытащить с БД?
PHP
1
$pr = ($rating/($total*5))*100;
она далее выводится в 47 строке в составе уже $ratingHTML. Но я хотел сделать отдельный ее вывод в обзоре статьи.
0
 Аватар для shevan
163 / 164 / 78
Регистрация: 06.09.2015
Сообщений: 632
09.10.2017, 13:17
Цитата Сообщение от ddem Посмотреть сообщение
эту переменную с 40 строки я же могу вытащить с БД?
Она не записывается в БД. Эта переменная действует в области этой функции.

Рекомендую почитать хоть какую-нибудь книжку по PHP, тогда многие вопросы сами отпадут.
0
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 20
09.10.2017, 13:35  [ТС]
Цитата Сообщение от shevan Посмотреть сообщение
Рекомендую почитать хоть какую-нибудь книжку по PHP
я читал, но значит недостаточно. Тогда я не понял как вообще тут хранятся данные о ко-ве проголосовавших?

Буду дальше разбираться, спасибо!
0
 Аватар для shevan
163 / 164 / 78
Регистрация: 06.09.2015
Сообщений: 632
09.10.2017, 14:02
Цитата Сообщение от ddem Посмотреть сообщение
Тогда я не понял как вообще тут хранятся данные о том ко-ве проголосовавших?
В базу записываются два поля с ключами vote-total и vote-rating.
Используются функции wp__get_data() и wp__set_data() для получения и установки значений.
1
0 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 20
09.10.2017, 22:45  [ТС]
shevan, прошу прошения, что иногда мои вопросы некорректны или даже глупы (еще не хватает знаний, но я стараюсь разобраться).
И вопрос, на счет переменной $pr изначально глупый задал (поспешил, строку просмотрел, увидел что перед словом ''голосов" стоит данная переменная и подумал, что она выводит значение проголосовавших.

Спасибо за терпение отвечать на такие "вопросы")).

Переменная $total выводит общее ко-во. Поскольку она локальная, то для ее вывода надо создать другую функцию, так корректно?Или есть более простой способ?

Написал такой код
PHP
1
2
3
4
5
function num_votes_out() {
$votes = wp__get_data('vote-total',get_the_ID());
if(!$votes) $votes=0;
    echo '<span id="nv_'.$post->ID.'" class="num-votes">'.$votes.'</span>';
}
и тогда вывод в любом месте шаблона могу сделать вывод данной функции

PHP
1
<?php if(function_exists('number_votes_out')) number_votes_out();?>
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.10.2017, 22:45
Помогаю со студенческими работами здесь

Торрент-трекер без рейтинга и регистрации
Добрый день! Не могу найти нормальный торрент-трекер без рейтинга и регистрации. Какой трекер можете подсказать?

Выводить код из плагина только на странице записей, а не на всех, как сейчас
Доброго времени суток. Прошу сильно не пинать :-) Код из файла wp-postratings.php, который находится в плагине WP-PostRatings Данный...

Возможна ли в Nhibernate модификация объектов в БД без загрузки?
Изучаю данную ОРМ, и вот вопрос подскажите кто знает как возможна Модификация объектов в БД без загрузки.

контактная форма без плагина
добрый час ! подскажите пожалуйста как правильно подключить пхп скрипт для обработки формы в ВП ? вот хтмл код где в action надо указать...

Не получается установить спойлер без плагина
Здравствуйте! Испробовал несколько вариантов. Прописываю код в function.php, header.php, footer.php. Styles.css Даже вроде спойлер...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru