我们的wordpress安装使用后端的REST API查找文章。当前,该查询似乎正在返回任何在任何字段中包含任何单词的文章。我们正在尝试更改此设置,以使其仅返回标题中包含搜索词的文章。例如,如果搜索词为“ this is the title”,则仅返回标题中包含该确切短语的文章。
我相信要做的是为WP_Query创建自定义过滤器,安装WP Rest Filter插件以允许通过REST进行过滤,然后将自定义过滤器添加到查询中。但是我不确定如何实现。
我在本文https://wordpress.stackexchange.com/questions/286081/how-to-filter-my-search-in-post-if-contains-a-word-in-title-content-or-excerpt/286083#286083中看到了如何添加WP_Query过滤器。我从那里发布的解决方案中得不到的信息(在“同时,我找到了解决方案”开头的部分中,提供了“ search_prod_title”。在下面的这一行中进行了检查,但我没有这样做)看不到设置在哪里。
if ( $search_term = $wp_query->get( 'search_prod_title' ) ) {
我没有得到的另一部分是如何在调用REST API中选择自定义过滤器。我们目前在这里调用REST API:
$( '#article-assign' ).select2( {
minimumInputLength: 3,
ajax: {
delay: 300,
url: window.CFEwpApiSettings.root + 'wp/v2/posts',
data: function( params ) {
let query = {
_embed: true,
search: params.term
};
if ( articleIds.join( ',' ) !== '' ) {
query.exclude = articleIds.join( ',' );
}
return query;
},
有人知道我应该如何修改REST调用的URL(或查询,如果它属于此查询)以使用自定义过滤器?
感谢您提供的任何帮助。
更新: 我已经能够通过以下方式使wp_query正常工作:
add_filter( 'posts_where', function ( $where, \WP_Query $q )
{
global $wpdb;
$query_by_title = $q->get( 'queryByTitle' );
if ( $query_by_title = $q->get( 'queryByTitle' ) ) {
$where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'' . esc_sql( $wpdb->esc_like( $query_by_title ) ) . '%\'';
}
return $where;
}, 10, 2 ); // Note the priority 10 and number of input arguments is 2
当我像这样从PHP调用它时,它可以很好地工作:
$query = new WP_Query( array( 'queryByTitle' => 'hmi' ) );
现在,我试图弄清楚如何从JavaScript将参数传递给PHP。我正在使用WP Rest Filter插件来允许过滤,但是我不确定如何指定'queryByTitle'的新参数。我正在尝试类似的事情:
/ wp-json / wp / v2 / posts /?filter [meta_key] = queryByTitle&filter [meta_value] = words_to_find
但这不起作用。知道REST API如何接受自定义参数吗?
答案 0 :(得分:0)
我知道了。为了使它正常工作,我需要使用以下命令将参数添加到rest_query_vars中:
function wpse_20160526_rest_query_vars( $valid_vars ) {
$valid_vars = array_merge( $valid_vars, array( 'queryByTitle' ) );
return $valid_vars;
}
add_filter( 'rest_query_vars', 'wpse_20160526_rest_query_vars', PHP_INT_MAX, 1 );
此后,此URL起作用了: / wp-json / wp / v2 / posts?filter [queryByTitle] = some-text