Intereting Posts
wp_enqueue_script & константы? Как проверить, является ли пользовательский ввод в поле в настройке номером? Как правильно вставлять данные в пользовательскую таблицу через плагин Как предотвратить публикацию публикации на условиях и вернуться на страницу публикации? Плагин формы заявки с платежным шлюзом Как добавить навигацию в нижнем колонтитуле, таком как StackExchange? get_header и hook, чтобы избежать обычного вызова Отображение значений из связанного поля – если пустым отображается ссылка и заголовок текущего типа сообщения Как заменить значения в WordPress DB с помощью phpMyAdmin Вставить PDF в wordpress Кто отвечает за санацию данных в разработке WordPress? Обновление сообщений, не работающих Как избежать символа одиночной кавычки в строках перевода i18n? Новое меню Customizer (WP 4.3) – как называется? Использовать блог в качестве базы для тегов и категорий

Количество просмотров с ограничением по времени на каждый IP-адрес

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

function setPostViews($postID) { $count_key = 'views'; $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{ $count++; update_post_meta($postID, $count_key, $count); } } 

Я хочу, чтобы добавить функции, чтобы ограничить количество, добавленное на каждый IP, в указанное время – например, день. Поэтому, когда IP-визит в тот же день, он не учитывался, только один раз.

Есть идеи? Благодарю.

Очень простым решением было бы использовать API Transients , пример …

 function setPostViews($postID) { $user_ip = $_SERVER['REMOTE_ADDR']; //retrieve the current IP address of the visitor $key = $user_ip . 'x' . $postID; //combine post ID & IP to form unique key $value = array($user_ip, $postID); // store post ID & IP as separate values (see note) $visited = get_transient($key); //get transient and store in variable //check to see if the Post ID/IP ($key) address is currently stored as a transient if ( false === ( $visited ) ) { //store the unique key, Post ID & IP address for 12 hours if it does not exist set_transient( $key, $value, 60*60*12 ); // now run post views function $count_key = 'views'; $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{ $count++; update_post_meta($postID, $count_key, $count); } } } 

Приведенный выше пример работает, хотя его можно расширить, чтобы исключить администраторов, редакторов или любой другой зарегистрированный пользовательский класс / роль, которую вы хотели бы. Это просто для вас!


Шаг за шагом для тех, кто хочет знать, что происходит, где.

Используя API Transients, мы можем хранить значения в течение предопределенного периода времени, в этом примере мы сохраняем результат в течение 12 часов в течение 24 часов,

 set_transient( $key, $value, 60*60*24 ); 

Что происходит, когда посетитель приземляется на почту, так это то, что мы храним их IP-адрес в переменной $user_ip .

Затем мы создаем уникальное ключевое значение для нашего переходного процесса, которое объединяет идентификатор сообщения и пользовательский IP (то есть $user_ip . $postID ) вместе, пример будет выглядеть,

 192.160.0.5x333 

Если 192.160.0.5 является IP, а 333 – это идентификатор сообщения ( x – это просто разделитель примеров, чтобы помочь отличить два сегмента, если вам нужно использовать эти значения для любых других целей, таких как отладка и т. Д.),

Затем мы создаем переменную $value которая представляет собой массив любых значений, которые вы хотите сохранить для переходного процесса. В этом случае мы сохраняем IP и Post ID как отдельные значения. Вам не нужно хранить их в виде массива, вы можете объединить их вместе в одну строку, если хотите, но, сохранив их в массиве, вы можете более легко выполнять итерацию по результатам переходного процесса и возвращать значения для любая цель, которую вы хотели бы, например, протоколирование результатов. (модифицировать)

Теперь мы получаем переходный процесс, используя get_transient($key) и сохраняем его в переменной с именем $visited . Если переходный период не существует или истек, он вернет FALSE .

Из Кодекса;

Если переходный процесс не существует или истек, то get_transient вернет false. Это нужно проверить с помощью оператора идентификации вместо нормального оператора равенства, поскольку целочисленные значения нуля (или других «пустых» данных) могут быть данными, которые вы хотите хранить. Из-за этого «ложного» значения переходные процессы не должны использоваться для хранения простых булевых значений. Поместите их в массив или преобразуйте их в целые числа.

… и поэтому мы проверяем существование нашего переходного значения с помощью оператора идентификации === так,

if ( false === ( $visited ) ) ...

Теперь на данный момент, если $ visit (наш переходный процесс) не существует (имеет значение FALSE), мы запускаем наш условный оператор и его содержимое.

Сначала мы устанавливаем переходное значение, используя переменные данные, которые мы установили вне нашего условного оператора,

 set_transient( $key, $value, 60*60*12 ); 

… который добавляет уникальный ключ и значения в базу данных в течение 12 часов.

Затем мы фактически запускаем функцию, которая будет хранить уникальный почтовый вид для данного сообщения, которое подается.

Наконец, если и когда пользователь вернется к этому сообщению в течение заданного 12-часового периода, наша функция setPostViews , но на этот раз, так как $visited теперь имеет значение $key и больше не является FALSE , условный оператор не запускается и не сохраняет дополнительные сообщения.

ОБНОВИТЬ

Если вы хотите исключить представления из определенной роли пользователя, например admin, оберните функцию в условный оператор current_user_can например;

 function setPostViews($postID) { //check if user not administrator, if so execute code block within if( !current_user_can('administrator') ) { //all code goes here... } } 

Функции, используемые в дополнение к OP,

  • Transients API -> read more
    • set_transient -> read more
    • get_transient -> read more
  • Roles and Capabilities -> read more
    • current_user_can -> read more

Я столкнулся с этим вопросом, ища что-то еще, но мне есть что добавить.

Предлагаемое решение велико, за исключением одного незначительного недостатка. Истекшие переходные процессы удаляются только из таблицы опций, когда они доступны. Таким образом, с этим решением ваша таблица параметров будет становиться все длиннее и длиннее. В конечном счете с сотнями мегабайт, хранящимися в таблице опций от спамеров, исследующих блог, создающий записи, ваш сайт начнет замедляться.

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

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