我有一个菜谱网站,每个菜谱都位于一个名为“菜谱”的自定义元字段中。我只想在用户搜索网站时搜索元字段的内容。
我下面代码的问题是:当搜索结果的数量超过每页的帖子数量(10-来自主WP设置)时,它会返回3次结果。换句话说,如果搜索有11个结果,那么序列将重复3次。没有活动插件。
function my_search_filter( $query ) {
global $searchtest;
global $searchcount;
if ($query->is_search) {
$args = array(
\'post_type\' => \'post\',
\'post_status\' => \'publish\',
\'posts_per_page\' => -1,
\'ignore_sticky_posts\' => TRUE,
\'meta_key\' => \'recipe\',
\'meta_value\' => sanitize_text_field($query->query_vars[\'search\']),
\'meta_compare\' => \'LIKE\'
);
$searchtest = new WP_Query ($args);
if ($searchtest->have_posts()) { while ($searchtest->have_posts()) { $searchtest->the_post();
$searchtestresults[] = get_the_ID();
}} wp_reset_postdata();
$searchcount = count($searchtestresults);
}
}
add_filter( \'pre_get_posts\', \'my_search_filter\' );
并在搜索中。php
if ($searchtest->have_posts()) { while ($searchtest->have_posts()) {$searchtest->the_post();
...
post content
...
<div class="post-nav">
<div id="post-nav-next"><?php next_posts_link(\'Older posts\') ?></div>
<div id="post-nav-prev"><?php previous_posts_link(\'Newer posts\') ?></div>
</div><!-- /post-nav -->
这仍在开发我的本地WAMP,因此我没有提供链接。我查看了这里和其他地方关于搜索自定义元字段的相关帖子,上面的代码是我最接近获得所需结果的代码。我感谢任何帮助或替代解决方案。
SO网友:s_ha_dum
你在虐待pre_get_posts
代码很糟糕。具有pre_get_posts
关键是修改主查询。通过这样做,您可以减少必要的查询数量,节省一些处理时间,并保留WordPressglobals
-- $wp_query
, 例如,对于可能需要它们的任何其他代码来说都是整洁的。你所做的是创造新的global
并用新查询填充它们。您只是将这些新查询隐藏在pre_get_posts
.
如果我了解您想要实现的目标,我相信您需要:
function search_meta_only_wpse_198762($qry) {
if ($qry->is_main_query() && $qry->is_search()) {
$qry->set(
\'meta_query\',
array(
array(
\'key\' => \'recipe\',
\'value\' => sanitize_text_field($query->query_vars[\'search\']),
\'compare\' => \'LIKE\'
)
)
);
$qry->set(\'s\',null);
}
}
add_filter(\'pre_get_posts\',\'search_meta_only_wpse_198762\');