将结果添加到 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 搜索结果中的主要内容,如果未能解决你的问题,请参考以下文章