一个非常基本的解决方案是使用Transients API, 示例。。。
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);
}
}
}
The example above works, although it can be expanded to exclude administrators, editors or any other logged in user class/role you would like. This is just to get you going!
<对于那些想知道发生了什么、发生在哪里的人来说,一步一步地使用
Transients API 我们可以存储预定义时间段的值,在本例中,我们将结果存储12小时,您可以存储24小时,
set_transient( $key, $value, 60*60*24 );
当访问者登上帖子时,我们将他们的IP地址存储在变量中
$user_ip
.
然后,我们为瞬态创建一个唯一的键值,该键值将post ID和用户IP(即。$user_ip . $postID
) 加在一起,一个示例如下所示,
192.160.0.5x333
在哪里
192.160.0.5
是IP和
333
是帖子ID(
x
只是一个示例分隔符,如果您需要将这些值用于任何其他目的(如调试等),可以帮助区分这两个段)
然后我们创建$value
变量,它是要为瞬态存储的任何值的数组。在这种情况下,我们将IP和Post ID存储为单独的值。您不需要将它们存储为数组,如果愿意,您可以将它们连接到一个字符串中,但通过将它们存储在数组中,您可以更轻松地迭代瞬态的结果,并为您想要的任何目的返回单独的值,例如记录结果。(根据需要修改)
现在我们使用get_transient($key)
并将其存储在名为$visited
. 如果瞬态不存在或过期,它将返回FALSE
.
来自法典;
如果瞬态不存在或已过期,则get\\u transient将返回false。这应该使用标识运算符而不是普通的相等运算符进行检查,因为零的整数值(或其他“空”数据)可能是您要存储的数据。由于该“假”值,瞬态不应用于保持普通布尔值。将它们放入数组或将其转换为整数。
。。。这就是为什么我们用identify操作符来检查瞬时值的存在===
就像这样,
if ( false === ( $visited ) ) ...
现在,如果$visited(我们的瞬态)不存在(计算结果为FALSE),我们将运行条件语句及其内容。
首先,我们使用在条件语句外部设置的变量数据设置瞬态值,
set_transient( $key, $value, 60*60*12 );
。。。将唯一键和值添加到数据库中12小时。
接下来,我们实际运行该函数,该函数将为正在服务的给定帖子存储一个唯一的帖子视图。
最后,如果用户在给定的12小时内返回此帖子setPostViews
函数将启动,但这次,由于$visited
现在持有$key
值,不再是FALSE
, 条件语句不会运行并存储其他post视图。
更新如果要从某个用户角色(如管理员)中排除视图,请将函数包装在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之外使用的功能,