我昨天有一个 similar question 用于搜索特定 postmeta 字段以查找关键字的系统。
如果任何字段包含搜索词,上面链接上的答案将返回帖子。
但是,下面的改进版本会返回 多少 个关键字被找到(介于 0 和 # 个关键字之间,而不是在每个字段中找到的关键字的实际计数)。
仅供参考,发布元表和用户元表基本上是相同的,这应该适合你。您也许可以使用 wordpress 查询对象进行设置,但是我的代码是自定义 SQL,因为它是一个独立的脚本 - 在 WordPress 之外。
SELECT *
FROM (
SELECT
post.ID as post_id,
( IF ( (
post.post_title LIKE '%c++%'
OR post.post_content LIKE '%c++%'
OR meta_field_a.meta_value LIKE '%c++%'
OR meta_field_b.meta_value LIKE '%c++%'
), 1, 0 )
+ IF ( (
post.post_title LIKE '%java%'
OR post.post_content LIKE '%java%'
OR meta_field_a.meta_value LIKE '%java%'
OR meta_field_b.meta_value LIKE '%java%'
), 1, 0 ) ) AS occurrences
FROM wp_posts post
JOIN wp_postmeta meta_field_a ON ( meta_field_a.post_id = post.ID AND meta_field_a.meta_key = 'field_a' )
JOIN wp_postmeta meta_field_b ON ( meta_field_b.post_id = post.ID AND meta_field_b.meta_key = 'field_b' )
WHERE post.ID IN (212, 213, 214)
GROUP BY post.ID
) AS results
WHERE results.occurrences > 0
“IF”语句块正在检查关键字,如果找到或未找到(在任何字段中),则返回 1 或 0。这被加在一起产生“发生”,每行返回。
“JOIN”语句块按键名拉入单个元数据。每个元键都需要它自己的连接,但显然这不是一个昂贵的操作。
“WHERE”语句将过滤器限制为指定的帖子 ID。这些来自外部函数,但您可以将其替换为您自己的 where 语句以手动检查帖子类型/状态。但是,由于您正在与用户打交道,因此您可能根本不希望 WHERE 出现在其中(或者您可能想检查其他用户元数据,例如角色)。