你需要做的第一件事就是使用计数器。你说的是“作者简介”,所以我假设你说的是WP的作者页面,这是由is_author(). 我假设你正在计算作者页面的访问量,而不是该作者对页面/帖子的访问量(这将使下面讨论的计数器成为一个完全不同的过程)。
你的问题中有一些未知数,比如这只会是一个7天计数器吗?它会只计算唯一的IP地址吗?等等,所以我在这里做了一个相当通用的示例,并且有一定的灵活性。
The Counter
我选择将数据存储在
wp_options
. 根据实际的生产使用情况,一个专用的表可能是合适的,您当然可以使用它做更多的事情。但在这个答案中包含这一点将相当复杂。因此,我通过使用选项表简化了操作。请记住(您和以后查看/使用此文档的任何人)这可能并不适用于所有用例。
我选择为每个作者存储一个唯一的选项,将选项名命名为“my\\u author\\u counter{ID}”,其中ID是作者ID。这样,每个作者都有一个唯一的计数器,可以防止它对于选项值变得太混乱和太大。如果自定义表正在处理此问题,则可能不需要这样做,因为您可以根据作者ID进行查询。
因此,每个author计数器是一个由UNIX时间戳值键入的数组,其中数组值是访问者的IP地址。这为我们提供了一些原始数据,这些数据根据您想要的显示方式略有灵活性。
我对计数器代码中发生的每一步都进行了注释,如下所示:
/**
* This is your data counter retrieval/update.
* The actual count evaluation will occur where
* you actually display the value.
*/
add_action( \'template_redirect\', \'my_author_counter\' );
function my_author_counter() {
// Is this an author page?
if ( is_author() ) {
global $post, $author_id, $author_counts;
// Which author is being viewed?
$author_id = $post->post_author;
// Counter setting based on author ID.
$option_name = \'my_author_counter\' . $author_id;
// Get the counter data.
$author_counts = get_option( $option_name );
// Check for empty counter, set as array no value exists.
$author_counts = ( $author_counts ) ? $author_counts : array();
// Add current visit to raw data (IP keyed by timestamp).
$author_counts[ time() ] = $_SERVER[\'REMOTE_ADDR\'];
/*
* Didn\'t know if this would ONLY ever display count over
* the last 7 days, so it does not include any data removal.
* With that in mind, this could grow over time to be too
* big. So depending on actual production use a expired/old
* data removal step should be included before the value is
* updated in the database.
*/
// Save updated count data.
update_option( $option_name, $author_counts );
}
}
计数器只需获取作者ID(如果我们在作者页面上),获取该作者的计数器,添加必要的新条目,然后保存它。如前所述,如果“7天”窗口是通用的(即,您也可以使用30天或其他时间),我没有包括用于删除过时数据的“维护”步骤。因为我们在
wp_options
而且不是一个专用表,您可能希望包括一个在某个点删除旧数据的过程,而无需将计数器重置为零。
The Display
一旦建立了计数器,就可以在任何地方以任何方式显示。有很多方法可以做到这一点。我刚刚把我的十几个不同想法中的一个可能性放在一起。
我用了get_the_archive_description
筛选挂钩,将我的计数器显示添加到存档描述中。当然,假设您的模板使用函数the_archive_description()
在存档模板的标题下显示说明。
再次注意,我们使用条件is_author()
确定它是否是作者页。否则,我们不希望我们的过滤器启动。
以下是我的显示过滤器和解释性注释:
add_filter( \'get_the_archive_description\', \'display_my_author_counter\' );
function display_my_author_counter( $content ) {
// Is this an author page?
if ( is_author() ) {
// Global values picked up from my_author_counter().
global $post, $author_id, $author_counts;
/** This is where you\'d manage the raw data ($author_counts) for display ($display_value). **/
// Handle raw $author_counts values for desired display.
// Start with an zero for our display value.
$display_value = 0;
// Our counter collects all visits by IP. Get only unique IP addresses.
$unique_counts = array_unique( $author_counts );
// Loop through the unique IP values and check the timestamp. Only get the last 7 days.
foreach ( $unique_counts as $timestamp => $ip ) {
if ( $timestamp > strtotime( \'-7 day\' ) ) {
// Increment the display count by 1.
$display_value++;
}
}
/** END manage the raw data ($author_counts) for display ($display_value ). **/
// Add the display count to the archive description.
$content = $content . "This author page has been viewed " . $display_value . " times";
}
return $content;
}
就像柜台本身一样,有很大的空间可以采用不同的方法。我在处理显示时的实际计数,这就给您留下了根据使用位置/方式使用不同的显示和值(如果需要)的空间。我将显示计数设置为0,然后仅从
原始统计数据数组。然后通过时间戳循环,如果stat是过去7天的,我们将显示计数增加1。
这将显示过去7天内查看作者页面的唯一IP数。
UPDATE - Calculate Unique IP by Day
下面是一个关于每日唯一IP的评论问题示例。这只是上面代码段中注释之间的部分,而不是重新发布整个代码段,您可以在其中管理要显示的原始数据。希望这显示了如何使用它来更改数据的显示方式。
// Start with an zero for our display value.
$display_value = 0;
// Handle a loop for each day, 0 - 7.
for ( $day = 0; $day <= 7; $day++ ) {
// Set up an empty container for IPs
$unique_ips = array();
// Loop through the unique IP values and check the timestamp. Only get the last 7 days.
foreach ( $author_counts as $timestamp => $ip ) {
// Check the day.
if ( $timestamp > strtotime( \'-\' . $day . \' day\' ) && $timestamp < strtotime( \'-\' . $day + 1 . \' day\' ) ) {
if ( ! in_array( $ip, $unique_ips ) ) {
// Add the IP to our unique IP array.
$unique_ips[] = $ip;
// Increment our count.
$display_value++;
}
}
}
}
这种不同显示的想法是循环通过一个“日计数器”,我们可以用它来计算一天(即在第1天和第2天之间,然后是第2天和第3天之间,等等)。然后,我们可以评估每个IP的唯一性。如果我编码正确,这应该符合您在评论中提出的要求。
UPDATE 2 - Delete Unnecessary Stats
正如计数器代码段(上面的第一个代码段)所示,我没有插入清除不必要/不需要的数据的进程。为了保持
wp_options
设置为可管理的大小。
我在代码片段中留下了一个可以用于此目的的部分,具体取决于所需的流程。这可能是将数据保存一周、一个月、一年或其他时间。
下面是一个简单的示例,说明您可以在更新选项之前插入哪些内容来管理删除旧数据。这将从数组中删除超过8天的所有统计信息(为我们在示例中重点关注的7天显示留下缓冲):
foreach ( $author_counts as $timestamp => $ip ) {
if ( $timestamp < strtotime(\'-8 days\') ) {
unset( $author_counts[ $timestamp ] );
}
}