如何在WordPress中实现每日自动重置用户已访问链接状态?
嘿,这个需求完全可以实现!我给你拆解两个适配不同场景的靠谱方案,都是在WordPress生态里能直接落地的:
浏览器自带的:visited伪类是存在本地历史里的,没法主动重置,所以我们得自己用Cookie来标记访问状态,再让Cookie每天自动过期。
步骤&代码:
- 给需要追踪的链接加统一类名,比如
tracked-link - 用JS监听点击、记录Cookie,并模拟已访问样式
- 设置Cookie在当日午夜自动失效,第二天自动重置状态
前端JS代码(可以放到主题的functions.php里用wp_add_inline_script输出,或者单独存成JS文件):
document.addEventListener('DOMContentLoaded', function() { const trackedLinks = document.querySelectorAll('.tracked-link'); // 读取已访问链接的Cookie let visitedLinks = getCookie('visited_links') ? getCookie('visited_links').split(',') : []; // 给已访问链接加样式类 trackedLinks.forEach(link => { if (visitedLinks.includes(link.href)) { link.classList.add('visited'); } }); // 点击时记录到Cookie trackedLinks.forEach(link => { link.addEventListener('click', function(e) { if (!visitedLinks.includes(this.href)) { visitedLinks.push(this.href); setCookie('visited_links', visitedLinks.join(','), getMidnightTimestamp()); this.classList.add('visited'); } }); }); }); // Cookie操作辅助函数 function getCookie(name) { const value = `; ${document.cookie}`; const parts = value.split(`; ${name}=`); if (parts.length === 2) return parts.pop().split(';').shift(); } function setCookie(name, value, expires) { document.cookie = `${name}=${value}; expires=${new Date(expires).toUTCString()}; path=/`; } // 获取当日午夜的时间戳,让Cookie自动过期 function getMidnightTimestamp() { const now = new Date(); const midnight = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, 0, 0, 0); return midnight.getTime(); }
CSS样式(模拟已访问效果):
.tracked-link.visited { color: #666; /* 改成你想要的已访问颜色 */ text-decoration: line-through; /* 可选:给已访问链接加删除线 */ }
优点:无需后端改动,实现简单;缺点:Cookie存在浏览器本地,换设备/清Cookie会丢失状态。
方案2:后端用户元数据+定时任务(适合登录用户)
如果你的网站需要用户登录,那就可以把访问记录存在用户的元数据里,再用WordPress的定时任务每天自动清空。
步骤&代码:
- 注册AJAX接口,记录用户点击的链接到用户元数据
- 前端通过AJAX获取已访问记录,添加样式类
- 配置每日定时任务,午夜清空所有用户的访问记录
主题functions.php里的后端代码:
// 1. 注册AJAX:记录用户访问链接 add_action('wp_ajax_record_visited_link', 'record_visited_link'); add_action('wp_ajax_nopriv_record_visited_link', 'record_visited_link'); // 匿名用户也想用的话保留这行 function record_visited_link() { if (!is_user_logged_in()) { wp_send_json_error('请先登录'); } $user_id = get_current_user_id(); $link_url = isset($_POST['link_url']) ? esc_url_raw($_POST['link_url']) : ''; if (empty($link_url)) { wp_send_json_error('无效的链接地址'); } // 获取已有的访问记录 $visited_links = get_user_meta($user_id, 'user_visited_links', true); $visited_links = is_array($visited_links) ? $visited_links : []; if (!in_array($link_url, $visited_links)) { $visited_links[] = $link_url; update_user_meta($user_id, 'user_visited_links', $visited_links); } wp_send_json_success('记录成功'); } // 2. 注册AJAX:获取用户已访问链接 add_action('wp_ajax_get_user_visited_links', 'get_user_visited_links'); add_action('wp_ajax_nopriv_get_user_visited_links', 'get_user_visited_links'); function get_user_visited_links() { if (!is_user_logged_in()) { wp_send_json_error('请先登录'); } $user_id = get_current_user_id(); $visited_links = get_user_meta($user_id, 'user_visited_links', true); wp_send_json_success(is_array($visited_links) ? $visited_links : []); } // 3. 注册每日定时任务:清空所有用户的访问记录 add_action('wp', 'schedule_daily_link_reset'); function schedule_daily_link_reset() { if (!wp_next_scheduled('daily_link_reset_event')) { wp_schedule_event(strtotime('tomorrow 00:00:00'), 'daily', 'daily_link_reset_event'); } } // 定时任务执行逻辑 add_action('daily_link_reset_event', 'reset_all_user_visited_links'); function reset_all_user_visited_links() { $users = get_users(['fields' => 'ID']); foreach ($users as $user_id) { delete_user_meta($user_id, 'user_visited_links'); // 如果你想保留历史记录,只清空当日的,可以把元数据改成带日期的(比如user_visited_links_20240520),然后删除对应日期的字段 } } // 4. 加载前端脚本并本地化AJAX参数 add_action('wp_enqueue_scripts', 'enqueue_link_tracking_script'); function enqueue_link_tracking_script() { wp_enqueue_script('link-tracking', get_template_directory_uri() . '/js/link-tracking.js', ['jquery'], '1.0', true); wp_localize_script('link-tracking', 'LinkTracking', [ 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('link_tracking_nonce') ]); }
前端JS文件(js/link-tracking.js):
jQuery(document).ready(function($) { const trackedLinks = $('.tracked-link'); // 获取用户已访问链接并添加样式 $.post(LinkTracking.ajax_url, { action: 'get_user_visited_links', nonce: LinkTracking.nonce }, function(response) { if (response.success) { const visitedLinks = response.data; trackedLinks.each(function() { if (visitedLinks.includes($(this).attr('href'))) { $(this).addClass('visited'); } }); } }); // 点击链接时提交记录 trackedLinks.on('click', function(e) { const linkUrl = $(this).attr('href'); $.post(LinkTracking.ajax_url, { action: 'record_visited_link', link_url: linkUrl, nonce: LinkTracking.nonce }, function(response) { if (response.success) { $(this).addClass('visited'); } }.bind(this)); }); });
同样需要添加之前的CSS样式来模拟已访问效果。
注意:WordPress的WP Cron依赖网站访问量触发,如果你的网站访问量很低,建议用服务器的系统定时任务(比如Linux的Cron)来定时访问wp-cron.php,确保重置任务能准时执行。
你可以根据自己网站的用户场景(是否需要登录)来选择对应的方案,如果有细节需要调整(比如只重置特定分类的链接),直接修改代码逻辑就好~
内容的提问来源于stack exchange,提问作者Ammar Miraščija
相关产品推荐
相关产品推荐

