功能概述
本教程将介绍如何在不使用插件的情况下,为 WordPress 网站添加一个功能:当访客上次访问后,网站发布了新文章或已有文章被更新,系统会自动在文章标题旁添加一个“(新)”标记,以提醒访客关注新内容。
实现原理
该功能主要通过以下两个步骤实现:
- 记录访问时间:当用户访问网站时,通过 Cookie 记录下本次访问的时间戳。
- 比较并标记:在显示文章标题时,将文章的发布时间与 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 网站实现一个轻量级的“新文章”提醒功能。这种方法无需安装额外插件,减少了服务器负载,并提供了较高的自定义灵活性。请务必在修改主题文件前进行备份,或在子主题中进行操作。