You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WordPress中实现每日自动重置用户已访问链接状态?

嘿,这个需求完全可以实现!我给你拆解两个适配不同场景的靠谱方案,都是在WordPress生态里能直接落地的:

方案1:纯前端Cookie追踪(适合匿名/无需登录的用户)

浏览器自带的:visited伪类是存在本地历史里的,没法主动重置,所以我们得自己用Cookie来标记访问状态,再让Cookie每天自动过期。

步骤&代码:

  1. 给需要追踪的链接加统一类名,比如tracked-link
  2. 用JS监听点击、记录Cookie,并模拟已访问样式
  3. 设置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的定时任务每天自动清空。

步骤&代码:

  1. 注册AJAX接口,记录用户点击的链接到用户元数据
  2. 前端通过AJAX获取已访问记录,添加样式类
  3. 配置每日定时任务,午夜清空所有用户的访问记录

主题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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:04:58