wp_query预期的搜索结果

时间:2019-02-06 09:18:35

标签: php wordpress search

我是高级IT人员,而不是编码人员。我正在将WordPress search.php页面创建到我的子主题中。此特定页面必须返回3 cpt的结果

  • 'struttura'
  • “游览”
  • 'offerta'

下面的代码返回一个ID数组,以使用搜索结果填充一个漂亮的网格插件引擎,称为“基本网格”,该代码正在运行,但是我遇到了以下问题。

  • 如果我搜索“ philippos”(即struttura cpt)返回正确
  • 如果我搜索“ senior”(即要约cpt)返回正确
  • 如果我搜索“ alessandro”(这是一个旅游cpt)返回正确的结果
  • 如果我搜索任何cpt中都不存在的“不存在”,则会返回正确的回显字符串,表明要进行另一次搜索
  • 如果我搜索“ post_type->”页面中存在的“货物”,则期望与上述相同的回显字符串,而是返回一些随机(???)cpt帖子。

就像以错误的方式搜索页面post_type一样。有什么建议吗?

这是搜索页面http://neos.anekitalia.com/?s

<?php
/*
Template Name: Search Page
*/
?>
<?php
get_header();
?>
<?php echo do_shortcode('[et_pb_section global_module="216661"][/et_pb_section]'); //show section Vuoi fare un'altra ricerca? ?>
<div class="et_pb_section et_section_regular" style="padding: 0;min-height:250px;">
                        <div class="et_pb_row">
                            <div class="et_pb_column et_pb_column_4_4 et_pb_column_14     et_pb_css_mix_blend_mode_passthrough et-last-child" >
                                <div class="et_pb_module et_pb_code">
                                    <div class="et_pb_code_inner">
<?php // Build Search Query
$args = array(
    's'         => $_REQUEST['s'],
    'showposts' => -1,
    'post_type' => array ( 'tour', 'struttura', 'offerta' ) // define searchable Post Types
);
$tp_allsearch = new WP_Query($args);


$posts = array();
// If there are Search posts
if($tp_allsearch->have_posts()) :

// Go through result
while($tp_allsearch->have_posts()) : $tp_allsearch->the_post();

// Save Post ID in array    
$posts[] = $post->ID;

endwhile;
// Build shortcode with the $post array build before to populate essential grid engine
$the_content = do_shortcode('[ess_grid alias="searchdefault" posts="'.implode(',', $posts).'"]');
// Echo Out the result in your page
echo $the_content;

else:
//show section no results found
   echo do_shortcode('<div style="max-width: 800px; margin: 0 auto"> [et_pb_section global_module="216673"][/et_pb_section]</div>');
endif;
?>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
<!--footer and stuffs-->                    
                    <?php echo do_shortcode('[et_pb_section global_module="208275"][/et_pb_section]');?>
                        <?php echo do_shortcode('[et_pb_section global_module="210037"][/et_pb_section]');?>
                    <?php echo do_shortcode('[et_pb_section global_module="210036"][/et_pb_section]');?>
<?php

get_footer();

编辑:

我发现了为什么会发生这种情况,只是我搜索的所有文本都显示在底部的div部分中,所以我必须找到一种方法将出现在内容中的文本排除在外,有没有一种方法可以使仅查询标题而不包括内容?

1 个答案:

答案 0 :(得分:0)

我在class-wp-query

中找到了这个
$search = apply_filters_ref_array( 'posts_search', array( $search, &$this ) );

默认情况下,$search类似于:

    (wp_posts.post_title LIKE %s) 
    OR (wp_posts.post_excerpt LIKE %s) 
    OR (wp_posts.post_content LIKE %s)
    AND (wp_posts.post_password = '')  

因此,您似乎可以将过滤器添加到主题的functions.php中。用preg replace或其他方法删除查询的帖子内容和帖子摘录部分是非常棘手的,但是您可以对它进行字符串操作,使其更像:

    (wp_posts.post_title LIKE %s) 
    OR (wp_posts.post_title LIKE %s) 
    OR (wp_posts.post_title LIKE %s)
    AND (wp_posts.post_password = '') 

通过类似这样的操作

add_filter('posts_search', 'so_54550119_search_filter');
function so_54550119_search_filter($search){
   return str_replace(array('excerpt','content'), array('title','title'), $search);
}