实现基于Cookie对独立访问者的页面访问进行计数

时间:2017-11-16 作者:Ralph

这听起来很简单,但我似乎找不到简单的方法来计算单个页面的唯一访问者的数量(例如,在该页面上使用一个简短的代码作为计数器或完整的PHP实现)。

我认为这可能通过插件实现。举个例子,我试着SRS Simple hits Counter 以及Who Hit The Page - Hit Counter, 但他们都不使用cookie,因为新的浏览器会话显示为另一个用户。

因此,我必须自己实施它,但从哪里开始呢?这只能用PHP来完成吗?这方面的最低工作示例是什么?

我想要这个用于活动的RSVP目的。我想通过电子邮件发送邀请,我想让人们通过single click 通过将他们引用电子邮件邀请中的页面。

我只需要粗略估计一下与会者的人数。另一个好处是,如果我还为每个访问者记录了referer URL,这样我就可以在邀请邮件中创建一个特定于参与者的RSVP URL。另一个好处是,如果用户可以通过在同一页面上切换切换来改变主意,并将其从日志中删除,或者与会者人数减少一人。

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

下面是一个最简单的工作示例。。。(注意:这是未测试的代码。)

add_action(\'init\', \'custom_rsvp_handler\');
function custom_rsvp_handler() {
    // for singular posts only
    // (could also check for event post type here)
    if (!is_singular()) {return;}

    // set cookie expiry length (eg. 28 days)
    $cookielength = time()+(60*60*24*28);

    // set a cookie key based on post ID
    global $post; $cookiekey = \'rsvp-\'.$post->ID;

    // set global to access RSVP state in shortcode
    global $rsvp;

    // check if already visited (RSVP cookie set)
    if (isset($_COOKIE[$cookiekey])) {$rsvp = $_COOKIE[$cookiekey];}

    // check for RSVP querystring (clicked email link with ?rsvp=1)
    // (or clicked attending after clicking not attending)
    if (isset($_GET[\'rsvp\'])) {
        $ip = $_SERVER[\'REMOTE_ADDR\'];
        // check for email click
        if ($_GET[\'rsvp\'] == \'1\') {
            $rsvp = \'1\'; 
            if (!isset($_COOKIE[$cookiekey])) {
                // assume this is a new click and set cookie
                setcookie($cookiekey, \'1\', $cookielength);
                // record the IP to the post meta
                $ips = get_post_meta($post->ID, \'rsvps\');
                if ( (!is_array($ips)) || (!in_array($ip, $ips)) ) { 
                    $ips[] = $ip; update_post_meta($post->ID, \'rsvps\', $ips);
                    update_post_meta($post->ID, \'rsvp-count\', count($ips));
                }
            }
        } elseif ($_GET[\'rsvp\'] == \'0\') {
            // user clicked not attending button
            $rsvp = \'0\'; setcookie($cookiekey, \'0\', $cookielength);
            // remove IP from attending list
            $ips = get_post_meta($post->ID, \'rsvps\');
            if ( (is_array($ips)) || (in_array($ip, $ips)) ) { 
                    $index = array_search($ip, $ips); unset($ips[$index]);
                    update_post_meta($post->ID, \'rsvps\', $ips);
                    update_post_meta($post->ID, \'rsvp-count\', count($ips));
                }
            }
        }
    }
}

// shortcode for a non-attending button
add_shortcode(\'rsvp-button\', \'custom_rsvp_button\');
function custom_rsvp_button() {
    global $rsvp;
    if (!isset($rsvp)) {return \'\';}
    if ($rsvp == \'1\') {$action = \'I Cannot Attend\'; $switch = \'0\';}
    if ($rsvp == \'0\') {$action = \'I Can Attend\'; $switch = \'1\';}
    $button = \'<form method="get" action="\'.$_SERVER[\'PHP_SELF\'].\'">\';
    $button .= \'<input type="hidden" name="rsvp" value="\'.$switch.\'">\';
    $button .= \'<input type="submit" value="\'.$action.\'">\';
    $button .= \'</form>\';
    return $button;
}

add_shortcode(\'rsvp-count\', \'custom_rsvp_count\');
function custom_rsvp_count() {
    global $rsvp, $post;
    if (!isset($rsvp)) {return;}
    $attendees = get_post_meta($post->ID, \'rsvp-count\');
    if ($attendees) {return $attendees." Attending";}
    return \'\';
}
因此,电子邮件链接RSVP URL如下所示:http://example.com/event-post/?rvsp=1

这将把IP列表保存到事件帖子的meta中,并为访问者设置一个cookie作为参与者,这将(大致)防止重复记录。

然后,您可以将快捷码[rvsp按钮]添加到活动帖子内容中,以便页面访问者可以在访问页面后单击“我无法参加”。或“我可以参加”,如果他们已经点击他们不能参加。(未通过电子邮件链接到达的访问者将看不到该按钮。)

更新:为输出rsvp参与计数添加了post meta和shortcode[rsvp计数]。

结束

相关推荐

Testing Plugins for Multisite

我最近发布了一个WordPress插件,它在单个站点上非常有效。我被告知该插件在多站点安装上不能正常工作,我理解其中的一些原因。我已经更新了代码,现在需要一种方法来测试更新后的代码,然后才能转到实时客户的多站点安装。我有一个用于测试的WordPress安装程序的单站点安装,但需要在多站点安装上进行测试。根据我所能找到的唯一方法是在网络上至少有两个站点来安装整个多站点安装,以测试我的插件。设置WordPress的整个多站点安装是插件开发人员的唯一/首选方式,还是有更快的测试环境可用。