Laravel Corcel连接WordPress数据库无法获取最新帖子问题
嘿,遇到这种问题确实头疼,我之前帮朋友排查过类似的情况,给你几个排查方向和解决方案:
1. 先确认数据库中最新帖子的状态和类型是否匹配查询条件
首先别着急看代码,直接去数据库里验证下2018年1月5日后的帖子属性:
SELECT ID, post_status, post_type, post_date FROM wp_posts WHERE post_date > '2018-01-05' LIMIT 10;
重点看post_status是不是publish,post_type是不是post——改版后可能不小心把新帖子的类型设成了自定义文章类型,或者状态被改成了draft/pending之类的,导致你的查询条件匹配不上。
2. 排查全局作用域或模型自定义约束
如果你自己创建了App\Post类继承自Corcel\Post,改版后有没有添加全局作用域?比如不小心加了过滤旧日期的约束?试试关闭所有全局作用域再查询:
$posts = Post::withoutGlobalScopes() ->status('publish') ->type('post') ->with('taxonomies') ->with('thumbnail') ->orderBy('ID', 'desc') // 先用ID倒序替代newest(),排除日期问题 ->paginate(20);
如果这样能拿到最新帖子,那就是全局作用域在搞鬼,去你的Post模型里找找boot()方法里的全局约束。
3. 验证日期排序的时区问题
Corcel的newest()方法默认是按post_date倒序,但WordPress的post_date存储的是UTC时间,而你的Laravel项目时区可能设置的是本地时区,导致日期对比出现偏差。试试直接用ID排序(ID是自增的,最新帖子ID最大):
// 替换newest()为ID倒序 $posts = Post::status('publish') ->type('post') ->with('taxonomies') ->with('thumbnail') ->orderBy('ID', 'desc') ->paginate(20);
如果这个能拿到最新帖子,那就是时区问题,你可以手动指定按post_date_gmt(WordPress存储的UTC日期)排序:
$posts = Post::status('publish') ->type('post') ->with('taxonomies') ->with('thumbnail') ->orderBy('post_date_gmt', 'desc') ->paginate(20);
4. 检查Corcel版本兼容性
改版的时候有没有升级Corcel?新版本可能对帖子的过滤规则做了调整,比如默认排除了某些post_type或者添加了新的默认约束。可以尝试回退到改版前的Corcel版本,或者查看Corcel的更新日志,有没有相关的变更影响了帖子查询。
5. 排查单条帖子查询返回null的问题
对于Post::find($id)返回null的情况,除了上面的状态/类型问题,还要检查:
- 帖子的
post_status是不是trash(被回收站了),Corcel默认会排除回收站的帖子; - 有没有自定义的模型绑定或者路由模型绑定干扰了查询;
- 试试用
Post::where('ID', $id)->first()代替find(),看看能不能拿到数据,这能帮你排查是不是find()方法被重写或者有特殊处理。
先从第一个方向开始排查,大概率是数据库里帖子的属性和你查询条件不匹配导致的!
内容的提问来源于stack exchange,提问作者MadMatt

