作者简介最近7天没有插件的前端访问者

时间:2019-04-06 作者:Adham Mohamed

我每天、每小时、每分钟都在搜索一种方法,以跟踪每个作者个人资料的一个非常简单的统计信息,以显示IP的个人资料访问量,并将其显示为与Instagram相同的计数器(例如,过去7天内有254次个人资料访问)。

我找不到任何代码或函数来实现这一点,我也没有任何代码要在这里显示。

那么,有没有人能帮我找到做类似事情的正确方法。

非常感谢你的帮助。

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

你需要做的第一件事就是使用计数器。你说的是“作者简介”,所以我假设你说的是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 ] );
        }           
    }

相关推荐

Get_Author_Posts_url()不起作用

全部在单个中。php文件位于Genesis子主题中。我有一个echo 属于divs 在这两者之间,我在anchors 我正在尝试通过variable, 像这样:function my_function() { $author = get_the_author_meta( $post->post_author ); $author_link = get_author_posts_url($author); $author_avatar = ge