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

Wordpress使用get_posts查询post_type=attachment无法返回全部结果

问题原因与解决方法

核心原因1:查询的状态范围不匹配

你直接执行SQL时会返回所有状态的附件,包括回收站(trash)、私有(private)等非公开状态的条目;而get_posts查询附件类型内容时,默认仅返回post_status为inherit的正常状态附件,不会包含回收站等其他状态的内容,这是90%以上此类问题的诱因。
你可以先执行这条SQL验证数量是否匹配:

SELECT * FROM `wp_posts` WHERE `post_type` = 'attachment' AND `post_status` = 'inherit'

如果执行后结果和get_posts返回的1000条一致,就可以确认是状态筛选的问题。另外你SQL里的LIKE 'attachment'没有加通配符,等价于= 'attachment',这部分没有问题,不会导致数量偏差。

核心原因2:被主题/插件的查询钩子干扰

部分主题或自定义插件会通过pre_get_posts等钩子修改附件查询的逻辑,即使get_posts默认开启过滤器屏蔽,仍可能有特殊实现的代码强制限制了返回结果的数量、筛选条件。

核心原因3:多站点环境的表前缀不匹配

如果你使用的是WordPress多站点模式,get_posts默认仅查询当前站点的附件,而你直接查询SQL时如果没有对应站点的表前缀筛选(多站点的文章表会是wp_2_posts、wp_3_posts这类格式),会返回所有站点的附件,导致数量不一致。


修复后的查询代码

$attachments = get_posts(array(
    'post_type' => 'attachment',
    'posts_per_page' => -1,
    'post_status' => 'any', // 强制获取所有状态的附件,如果你不需要回收站内容可以改为'inherit'
    'suppress_filters' => true, // 完全屏蔽所有自定义查询过滤器
    'no_found_rows' => true, // 跳过总数统计,大幅提升大数量级下的查询速度
));

return count($attachments);

如果是多站点场景,你需要先通过switch_to_blog()切换到目标站点再执行查询,或者调整SQL的查询表为对应站点的文章表。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:15:04