将结果添加到 WordPress 搜索结果中

Posted

技术标签:

【中文标题】将结果添加到 WordPress 搜索结果中【英文标题】:Add results into WordPress search results 【发布时间】:2014-08-03 10:51:20 【问题描述】:

我想在 WordPress 搜索结果中添加/注入/追加额外的结果。

目前 WordPress 仅允许您“调整”正在其自己的数据库上执行的查询,但不允许您修改(或用 WordPress 术语过滤)结果数组。

即:如果在 WordPress 中搜索术语“土豆”,则与该术语相关的所有帖子都会返回。我想将通过不同服务获得的结果包含到 WordPress 结果集中。

澄清一下,我从第 3 方 API 调用中获取结果。不是来自 WordPress 数据库。

有人知道我该怎么做吗?

编辑:最好这需要在我的 WordPress 插件中进行,而无需更改搜索模板。

【问题讨论】:

如果你只想追加新结果,为什么不调用一个添加新结果的函数呢? 编辑您的 search.php 页面模板并迭代您在主 Wordpress 循环之前拥有的其他结果数据。或者,使用 Wordpress 循环创建类似的数据数组并将它们组合起来。 如果您提供更多信息,我可以为您解决这个问题。 WP_QUERY 和循环显然仅限于 wp 但您当然可以在 WP_QUERY 之后手动添加到查询对象,正如@ricardo Nunez 建议的那样,您想添加什么信息/过滤器? 感谢大家的回复。我正在寻找的过滤器(或操作)类型只是允许我将结果附加到 WordPress 返回的帖子列表中。我要添加的结果来自查询不同服务的 API 调用,而不是 WordPress 安装。我希望这足够清楚。简而言之:我想在 WordPress 搜索结果中添加非 WordPress 搜索结果。 【参考方案1】:

您可以使用pre_get_posts 添加/编辑您的搜索结果,而无需更改搜索模板。

排除页面

在搜索结果中排除页面。可以创建一个操作挂钩,通过仅显示帖子的结果来限制搜索结果。

以下示例演示了如何做到这一点:

function search_filter($query) 
  if ( !is_admin() && $query->is_main_query() ) 
    if ($query->is_search) 
      $query->set('post_type', 'post');
    
  


add_action('pre_get_posts','search_filter');

在搜索结果中包含自定义帖子类型

function search_filter($query) 
  if ( !is_admin() && $query->is_main_query() ) 
    if ($query->is_search) 
      $query->set('post_type', array( 'post', 'movie' ) );
    
  


add_action('pre_get_posts','search_filter');

包括自定义/API 结果

function search_filter() 
    if ( is_search() ) 
        // Do your API call here
        // Save retrieved data in your wordpress
        // This will also help to you avoid api call for repeated queries.
        $post_id = wp_insert_post( $post, $wp_error ); // wp_insert_post() // Programatically insert queries result into your wordpress database
        array_push( $query->api, $post_id );
    

add_action('pre_get_posts','search_filter');    
function have_posts_override()
    if ( is_search() ) 
        global $wp_query;
        $api_post = $wp_query->api;
        foreach ($api_post as $key) 
        // This will enable you to add results you received using API call
        // into default search results.
            array_push($wp_query->posts, $key); 
        
    

add_action( 'found_posts', 'have_posts_override' );

参考:

Exclude_Pages_from_Search_Results

Include_Custom_Post_Types_in_Search_Results

【讨论】:

谢谢@Abhineet,我确实看过pre_get_posts,但不幸的是,这个函数只在尝试从WordPress后端检索结果时才有效。我正在从第 3 方 API 调用中获取我的搜索结果,并希望将这些结果添加到现有的结果数组中。 @Ruben 如果您在使用 API 调用获取数据后将数据保存在 wordpress 中,那么搜索结果将变得简单、高效且更好。但是如果你想对每个请求进行 api 调用,即使是重复请求,那么实现它会有点棘手。但逻辑与我刚刚更新的类似。 非常感谢您的回复。该代码可能会起作用,但这不是我正在寻找的解决方案。我只是想查看数组并在打印出元素之前添加或删除元素。 wp_insert_post 是解决我的问题的一个很好的解决方法,但我认为它不是一个好的长期解决方案。特别是因为我正在处理非常动态的搜索结果,我担心我会显着减慢速度。不过感谢您的回复。我会将其标记为正确答案,因为它可能会帮助其他可以使用它的人。【参考方案2】:

这个问题可能很老,但我有一个类似的问题,将来可能会有人,所以我会发布我的(更好的)解决方案。

如上所述,将 api 查询结果保存在 wp_posts-table 中(可能作为自定义帖子类型)并对其执行正常的 WP-Search 将是最干净的解决方案。

但就我而言,我必须处理另一个缓存了一些外部数据并将其链接到现有帖子的 ID 的表,我无法更改此结构。

因此,Abhineet Verma 的解决方案(search_filter + pre_get_posts)一开始似乎很有用,但最终它并不适合我。我能够在查询结果中添加额外的帖子,但它们不适合结果的正常分页。例如,如果您想每页显示 10 个结果并使用上面的解决方案并从 api 获得 20 个结果,那么您将有 30 个结果每页:十个正常结果,属于页面加上每页上的全部 20 个结果。它还破坏了一些分页插件。

所以我最终解决了如下问题。我使用过滤器posts_search 来扩展sql-query:

add_filter('posts_search', function($sql) 

    if (!$sql) 
        return $sql;
    

    global $wpdb;
    $sqst = "select id from $wpdb->prefixmytable ... bla bla ->  query to my custom table, wich return a bunch of IDs";
    $sqlr = "AND (($wpdb->prefixposts.ID in ($sqst)) or (1 = 1 $sql))";

    return $sqlr;

);

它看起来有点奇怪,但效果很好。也许它有时会对某人有所帮助!

【讨论】:

以上是关于将结果添加到 WordPress 搜索结果中的主要内容,如果未能解决你的问题,请参考以下文章

php 将页面添加到Wordpress搜索结果

WordPress 实时搜索结果重定向到主页

如何在WordPress菜单中添加搜索框?

PHP 如何自动将搜索字段添加到导航菜单中| WordPress的

添加搜索结果wordpress

在 Wordpress 主题中(使用 get_search_form()),如何将占位符文本添加到搜索框?