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

register_deactivation_hook中delete_transient失效问题求助

问题分析与解决

你的代码核心问题是传给delete_transient()的参数不对:

  • 从wp_options表查到的option_name是带WordPress自动添加的前缀的,比如_transient_xxx或者_transient_timeout_xxx;
  • 但delete_transient()函数只需要传入纯transient名称(也就是xxx部分),函数内部会自动拼接前缀去处理对应的记录。直接传完整的option_name,函数会再叠加一次前缀,导致找不到要删除的记录。

修正方案

需要从查到的option_name中提取出真正的transient名称,再调用delete_transient()。可以按以下方式修改循环部分:

foreach ( $all_trans as $trans ) {
    $option_name = $trans['name'];
    // 匹配普通transient和超时记录的前缀
    if (str_starts_with($option_name, '_transient_')) {
        $transient_name = substr($option_name, strlen('_transient_'));
    } elseif (str_starts_with($option_name, '_transient_timeout_')) {
        $transient_name = substr($option_name, strlen('_transient_timeout_'));
    } else {
        continue;
    }

    // 检查是否包含目标关键词
    if (str_contains($transient_name, '_needle_')){
        delete_transient($transient_name);
    }
}

额外提示

  • 如果你的PHP版本低于8.0,str_starts_with()不能用,可以换成substr($option_name, 0, 11) === '_transient_'这样的判断;
  • 也可以直接用$wpdb->delete()来删除对应的option记录,比如:
if (str_contains($trans['name'], '_needle_')){
    $wpdb->delete($wpdb->options, ['option_name' => $trans['name']]);
}

这种方式不需要处理前缀,直接删除查到的记录,更直接。

内容的提问来源于stack exchange,提问作者timholz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 04:02:35