博客 / WordPress/ 无需插件:在 WordPress 中为上次访问后更新的文章添加“新”标记

无需插件:在 WordPress 中为上次访问后更新的文章添加“新”标记

无需插件:在 WordPress 中为上次访问后更新的文章添加“新”标记

功能概述

本教程将介绍如何在不使用插件的情况下,为 WordPress 网站添加一个功能:当访客上次访问后,网站发布了新文章或已有文章被更新,系统会自动在文章标题旁添加一个“(新)”标记,以提醒访客关注新内容。

实现原理

该功能主要通过以下两个步骤实现:

  1. 记录访问时间:当用户访问网站时,通过 Cookie 记录下本次访问的时间戳。
  2. 比较并标记:在显示文章标题时,将文章的发布时间与 Cookie 中记录的上次访问时间进行比较。如果文章发布时间晚于上次访问时间,则在标题后添加“(新)”标记。

完整代码

将以下代码添加到您当前主题的 functions.php 文件末尾。

/**
 * WordPress 提醒访客上次来访后更新的文章
 * 功能:在文章标题后添加“(新)”标记
 */
function Bing_lastvisit_the_title( $title, $id ) {
    // 仅在主循环、非单篇文章/页面、且非“页面”文章类型时生效
    if ( ! in_the_loop() || is_singular() || get_post_type( $id ) == 'page' ) {
        return $title;
    }

    $cookiename = COOKIEHASH . '_lastvisit';

    // 检查是否存在记录上次访问时间的 Cookie
    if ( ! isset( $_COOKIE[$cookiename] ) || empty( $_COOKIE[$cookiename] ) ) {
        return $title;
    }

    $lastvisit = (int) $_COOKIE[$cookiename]; // 上次访问时间戳
    $publish_date = (int) get_post_time( 'U', true, $id ); // 文章发布时间戳(GMT)

    // 如果文章发布时间晚于上次访问时间,则添加标记
    if ( $publish_date > $lastvisit ) {
        $title .= '(新)';
    }

    return $title;
}
add_filter( 'the_title', 'Bing_lastvisit_the_title', 12, 2 );

/**
 * 设置记录访问时间的 Cookie
 */
function Bing_lastvisit_set_cookie() {
    // 不在后台设置 Cookie
    if ( is_admin() ) {
        return;
    }

    $current = current_time( 'timestamp', 1 ); // 获取当前 GMT 时间戳
    $cookiename = COOKIEHASH . '_lastvisit';
    $expire = time() + ( 60 * 60 * 24 * 7 ); // Cookie 有效期:7天

    // 设置 Cookie
    setcookie( $cookiename, $current, $expire, COOKIEPATH, COOKIE_DOMAIN );
}
add_action( 'init', 'Bing_lastvisit_set_cookie' );

代码详解

1. 标记文章标题的函数:Bing_lastvisit_the_title

  • 参数检查:函数首先检查是否处于主循环、当前页面是否为单篇文章或页面、以及文章类型是否为“页面”。如果是,则直接返回原标题,避免在这些地方添加标记。
  • Cookie 检查:检查是否存在名为 [COOKIEHASH]_lastvisit 的 Cookie。如果不存在或为空,则直接返回原标题。
  • 时间比较:获取文章的发布时间戳(GMT)和 Cookie 中记录的上次访问时间戳。使用 (int) 进行强制类型转换以确保比较准确。
  • 添加标记:如果文章发布时间晚于上次访问时间,则在标题后追加字符串“(新)”。

2. 设置 Cookie 的函数:Bing_lastvisit_set_cookie

  • 后台排除:在 WordPress 管理后台不设置此 Cookie。
  • 获取时间:使用 current_time('timestamp', 1) 获取当前的 GMT 时间戳。参数 1 表示返回 GMT 时间,这对于多时区网站非常重要。
  • 设置 Cookie:使用 setcookie() 函数设置一个有效期为 7 天的 Cookie,记录本次访问的时间。

注意事项与自定义

  • 缓存兼容性:如果您的网站使用了页面缓存(如 WP Rocket、W3 Total Cache 等),此功能可能无法正常工作,因为缓存的页面不会为每个用户动态执行 PHP 代码。您可能需要配合缓存插件的“排除”或“动态内容”功能使用。
  • 标记样式:默认添加的是文本“(新)”。您可以通过 CSS 为其添加样式,例如:
    .entry-title:after {
        content: "(新)";
        color: #ff0000;
        font-size: 0.8em;
        font-weight: normal;
    }

    或者,您也可以修改代码中的 $title .= '(新)'; 行,将其替换为包含 CSS 类的 HTML 标签,例如:$title .= '<span class="new-badge">新</span>';

  • 有效期调整:代码中 Cookie 的有效期设置为 7 天(60 * 60 * 24 * 7 秒)。您可以根据需要修改这个值。
  • 文章类型:默认代码排除了“页面”文章类型。如果您也想为其他自定义文章类型添加此功能,可以修改 get_post_type( $id ) == 'page' 这一行条件。

总结

通过添加上述两段简单的代码,您就可以为 WordPress 网站实现一个轻量级的“新文章”提醒功能。这种方法无需安装额外插件,减少了服务器负载,并提供了较高的自定义灵活性。请务必在修改主题文件前进行备份,或在子主题中进行操作。

发表评论

您的邮箱不会公开。必填项已用 * 标注。