我正在我的 WP 和搜索字段中进行自定义搜索,任何键入的单词都将在自定义字段、标题和发布内容中查找。
事实证明,我的数据库有超过 100 万行自定义字段,并且希望将搜索限制为仅针对某种类型的帖子。 我已经在循环中执行此操作来显示结果,但我希望此过滤器是在协商后进行的,因为该页面需要 20 秒以上才能显示结果。
有人可以帮助我吗?下面是我正在使用的代码。
// SEARCH FROM ALL CUSTOM FIELDS
$post_ids_meta = $wpdb->get_col( $wpdb->prepare( "
ALTER TABLE wp_posts ADD INDEX (postmeta)
SELECT DISTINCT post_id FROM {$wpdb->postmeta}
WHERE meta_value LIKE '%s'
", $keyword ) );
// SEARCH FOR TITLE AND CONTENT
$post_ids_post = $wpdb->get_col( $wpdb->prepare( "
ALTER TABLE wp_post s ADD INDEX (posts);
SELECT DISTINCT ID FROM {$wpdb->posts}
WHERE post_title LIKE '%s'
OR post_content LIKE '%s'
", $keyword, $keyword ) );
$post_ids = array_merge( $post_ids_meta, $post_ids_post );
最佳答案
更新:
试试这个。它尚未经过测试,但我确信如果您检查并修复它一点点它就会起作用:
// SEARCH IN title, content and meta_value
$post_ids = $wpdb->get_col( $wpdb->prepare( "
SELECT DISTINCT ID FROM {$wpdb->posts} AS p,
LEFT JOIN {$wpdb->postmeta} AS m,
ON m.post_id = p.ID
WHERE p.post_type = '%s'
AND (
post_title LIKE '%%s%'
OR m.meta_value LIKE '%%s%'
OR post_content LIKE '%%s%')
", $post_type, $keyword, $keyword, $keyword) );
注意:
- 假设您已输入
$post_type
和$keyword
。例如:$post_type = "fairs";
- 我在 %s 之前和之后添加了 %,以确保它是宽卡搜索。
- 在本例中,我使用 DISTINCT,因为联合表有重复的 ID。对于您之前在第一次查询时的错误假设,即不需要它,我深表歉意。
- 无法保证速度,因为您正在对未编入索引的 post_content 进行宽卡搜索。
- 您应该确保对meta_value 字段建立索引以获得更快的速度。如果您元数据中不要存储太多文本。
祝你好运!
原文:
首先,让我们澄清一下:
删除这两行,因为它没有帮助(由于重复调用,它会使情况变得更糟):
更改表 wp_posts 添加索引(postmeta)
还有
ALTER TABLE wp_posts ADD INDEX (posts);
- ID 已经明确。所以它不会帮助你这样做:
SELECT DISTINCT ID
最终查询应如下所示:
// SEARCH FROM ALL CUSTOM FIELDS
$post_ids_meta = $wpdb->get_col( $wpdb->prepare( "
SELECT post_id FROM {$wpdb->postmeta}
WHERE meta_value LIKE '%s'
", $keyword ) );
// SEARCH FOR TITLE AND CONTENT
$post_ids_post = $wpdb->get_col( $wpdb->prepare( "
SELECT ID FROM {$wpdb->posts}
WHERE post_title LIKE '%s'
OR post_content LIKE '%s' // Remove this will boost performance by 90% because post_content is not indexed
", $keyword, $keyword ) );
$post_ids = array_merge( $post_ids_meta, $post_ids_post );
关于php - 从所有自定义字段搜索非常慢。我需要过滤搜索自定义帖子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29464232/