昨天我有一个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(或者你想检查其他用户元,比如角色)。
谢谢,我结束使用JOINS也... – user1049961