我需要获得一堆带有元数据的帖子。 当然你不能用标准的帖子查询来获取元数据,所以你通常必须做一个 get_post_custom()
对于每个帖子。
我正在尝试使用一个自定义查询,如下所示:
$results = $wpdb->get_results("
SELECT p.ID,
p.post_title,
pm1.meta_value AS first_field,
pm2.meta_value AS second_field,
pm3.meta_value AS third_field
FROM $wpdb->posts p LEFT JOIN $wpdb->postmeta pm1 ON (
pm1.post_id = p.ID AND
pm1.meta_key = 'first_field_key'
) LEFT JOIN $wpdb->postmeta pm2 ON (
pm2.post_id = p.ID AND
pm2.meta_key = 'second_field_key'
) LEFT JOIN $wpdb->postmeta pm3 ON (
pm3.post_id = p.ID AND
pm3.meta_key = 'third_field_key'
)
WHERE post_status="publish"
");
似乎工作。 如果您以允许在同一篇文章中使用多个元值的方式使用这些元字段中的任何一个,它就会出错。 我想不出这样做的方法。
那么,问题 1:是否有连接、子查询或其他任何东西来引入多值元字段?
但问题 2:值得吗? 多少 postmeta
在 2 查询方法变得更可取之前,我应该添加表连接吗? 我可以在一个查询中获取所有发布数据,然后在另一个查询中获取所有相关的 postmeta,然后在 PHP 中将元数据与发布数据组合到一个结果集中。 如果可能的话,这最终会比单个越来越复杂的 SQL 查询更快吗?
我总是认为,“把尽可能多的工作交给数据库”。 不确定这个!
发布元信息自动缓存在内存中以实现标准 WP_Query
(和主查询),除非您使用 update_post_meta_cache
范围。
因此,您不应该为此编写自己的查询。
元缓存如何用于普通查询:
如果 update_post_meta_cache
参数到 WP_Query
未设置为 false,则在从数据库中检索到帖子后, update_post_caches()
函数将被调用,它又调用 update_postmeta_cache()
.
这 update_postmeta_cache()
函数是一个包装器 update_meta_cache()
,它本质上称为一个简单的 SELECT
检索到所有帖子的 ID。 这将使它获得所有postmeta,查询中的所有帖子,并将该数据保存在对象缓存中(使用 wp_cache_add()
).
当你做类似的事情时 get_post_custom()
,它首先检查该对象缓存。 因此,此时它不会进行额外的查询来获取帖子元数据。 如果你在 WP_Query
,然后元已经在内存中,它直接从那里获取它。

这里的优势比进行复杂查询大很多倍,但最大的优势来自于使用对象缓存。 如果您使用持久内存缓存解决方案,如 XCache 或 memcached 或 APC 或类似的东西,并且有一个插件可以将您的对象缓存绑定到它(例如 W3 Total Cache),那么您的整个对象缓存都存储在快速内存中已经。 在这种情况下,有 零 检索您的数据所需的查询; 它已经在记忆中了。 持久对象缓存在很多方面都很棒。
换句话说,您的查询可能比使用正确的查询和简单的持久内存解决方案加载和加载更慢。 使用正常 WP_Query
. 省点力气。
额外的: update_meta_cache()
很聪明,顺便说一句。 它不会检索已经缓存了元信息的帖子的元信息。 基本上,它不会两次获得相同的元数据。 超级高效。
附加附加: “把尽可能多的工作交给数据库。”……不,这是网络。 适用不同的规则。 一般来说,你总是想给 小的 如果可行,尽可能对数据库进行操作。 数据库速度慢或配置不当(如果您没有专门配置它,您可以打赌这是真的)。 它们通常在许多站点之间共享,并且在某种程度上超载。 通常,您拥有的 Web 服务器多于数据库。 通常,您只想尽可能快和简单地从数据库中获取所需的数据,然后使用 Web 服务器端代码对其进行排序。 当然,作为一般原则,不同的情况都是不同的。
我会推荐一个数据透视查询。 使用你的例子:
SELECT p.ID,
p.post_title,
MAX(CASE WHEN pm1.meta_key = 'first_field' then pm1.meta_value ELSE NULL END) as first_field,
MAX(CASE WHEN pm1.meta_key = 'second_field' then pm1.meta_value ELSE NULL END) as second_field,
MAX(CASE WHEN pm1.meta_key = 'third_field' then pm1.meta_value ELSE NULL END) as third_field,
FROM wp_posts p LEFT JOIN wp_postmeta pm1 ON ( pm1.post_id = p.ID)
GROUP BY
p.ID,p.post_title

跨境电商独立站代运营服务综合套餐 | 项目合作请联系客服微信 13564054264 | |||
---|---|---|---|---|
服务项目 | 服务模块 | 服务效果 | 服务周期 | 服务费用 RMB |
海外市场调研 与品牌诊断 | 目标市场调研 | 1份调研报告 | 按次(5-7个工作日) | 5000 |
消费受众分析 | ||||
市场准入条件 | ||||
竞品发展轨迹 | ||||
市场销售策略 | ||||
品牌商业化诊断 | ||||
TikTok 账号代运营 | TikTok账号定位 | 3个账号运营 500条视频内容发布 | 按季度(50-65个工作日) | 30000 |
TikTok内容策划 | ||||
TikTok视频制作 | ||||
TikTok账号涨粉 | ||||
TikTok数据分析 | ||||
TikTok 直播代运营 | TikTok直播策划 | 20-24场直播 | 按月度(20-24个工作日) | 15000 |
TikTok网络搭建 | ||||
TikTok选品分析 | ||||
TikTok话术提炼 | ||||
TikTok直播开展 | ||||
TikTok直播数据分析 | ||||
TikTok KOL/KOC营销 | TikTok行业达人匹配 | 500-1000个达人邀约/天 | 按月度(20-24个工作日) | 10000 |
TikTok行业达人邀约 | ||||
TikTok行业达人签约 | ||||
TikTok达人合作跟进 | ||||
TikTok达人合作完成 | ||||
海外社媒 代运营 | 海外社媒运营需求确认 | insgarm Linkedln 海外社媒运营(4选2) | 按季度(50-65个工作日) | 30000 |
海外社媒运营方案制订 | ||||
海外社媒代运营开展 | ||||
海外社媒活动策划&开展 | ||||
海外社媒账户涨粉&数据分析 | ||||
海外线下 代理商拓展 | 渠道代理目标市场确认 | 主要服务地区为欧美/东南亚 限定1-3个国家 | 按季度(50-65个工作日) | 35000 |
渠道代理商信息抓取 | ||||
渠道代理商邮件邀约 | ||||
渠道代理商洽谈准备 | ||||
渠道代理商签约合作 | ||||
渠道代理商完成合作 | ||||
海外广告代投放 | 海外广告账户开户 | TikTok 海外广告代投 (电商/游戏) | 按季度(50-65个工作日) | 开户首充1000美金 10%广告投放佣金 |
海外广告产品分析 | ||||
海外广告代投计划制订 | ||||
海外广告代投内容制作 | ||||
海外广告代投放开展 | ||||
海外广告代投效果优化 | 项目合作请联系客服微信 13564054264 |

【WordPress花园提醒您】如果想购买国外正版WordPress主题和插件,您需要一张VISA信用卡才能支付,这里我们推荐光大银行信用卡!赶快免费申请,别耽误了买插件哦!
