每个IP有时间限制的浏览量

时间:2012-09-15 作者:rizqyhi

我一直在寻找有关post views count的函数。我使用update和get-post-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访问在同一天,它不会计算在内,只有一次。

有什么想法吗?谢谢

2 个回复
最合适的回答,由SO网友:Adam 整理而成

一个非常基本的解决方案是使用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之外使用的功能,

SO网友:Brian Layman

我在寻找其他东西时遇到了这个问题,但我确实有一些补充。

建议的解决方案很好,除了一个小缺陷。过期瞬态只有在访问时才从选项表中清除。因此,使用此解决方案,您的选项表将越来越长。最终,由于垃圾邮件发送者在浏览博客并创建记录时在选项表中存储了数百个MEG,您的网站将开始减速。

一种可能的解决方案是在单个瞬态中存储ip地址列表,将post ID作为密钥。然后,如果ip地址不在该列表中,则将其添加到元选项中。每个帖子的数量可能仍然相当大,但至少不会产生数百万条记录。如果将日期写为瞬时值的第一行,则可以检查该日期是否为今天的日期,如果不是,则使用当前IP地址启动一个新列表。

可能还有其他解决方案涉及将日期存储在键中或将数组存储在值为IP和日期的函数键中。有很多选择。但你不能让暂时的清单简单地增长而不产生后果。

结束

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在