付费文章前台只显示开头一段,右键查看源文件却是完整正文,复制下来一字不少,会员权益等于空设。乍看像缓存或者权限的锅,追下去往往不是。

add_filter('the_content', function ($c) {
  if (current_user_can('read_paid')) return $c;
  $plain = wp_strip_all_tags($c);
  return mb_substr($plain, 0, 300) . '...';
}, 9);

追下去是这么回事:试读是在模板里用样式遮住或者前端截断,正文其实整段输出到了页面源码里,抓一下就拿全了,服务端根本没参与判断。

碰到「WordPress 付费内容试读截断」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

具体做法是,在服务端按当前用户权限裁剪正文后再输出内容;用内容过滤器在渲染之前就截断,而不是靠样式;未付费的请求不返回后半段内容,连摘要也不给。

验收就看一点,未付费用户查看源码只有试读部分,付费后刷新页面才拿到全文。

作者 9823189