如何通过标题中包含搜索词的任何文章过滤 wordpress rest api?
How do I filter wordpress rest api by any articles that contain the search term in the title?
我们的 wordpress 安装使用后端的 REST API 来查找文章。目前,查询似乎正在返回任何字段中包含任何单词的任何文章。我们正在尝试更改此设置,以便仅显示 returns 篇标题中包含搜索词的文章。例如,如果搜索词是 "this is the title",则只会返回标题中包含该短语的文章。
我认为这样做需要为 WP_Query 创建自定义过滤器,安装 WP Rest Filter 插件以允许通过 REST 进行过滤,并将自定义过滤器添加到查询中。但我不确定如何实现它。
我在这个 post 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 过滤器。我没有从解决方案 post 中得到什么(在以 "Well in the meantime, I found the solution" 开头的部分中,提供 '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 如何接受自定义参数吗?
我明白了。为了让它工作,我需要将参数添加到 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]=一些文本
我们的 wordpress 安装使用后端的 REST API 来查找文章。目前,查询似乎正在返回任何字段中包含任何单词的任何文章。我们正在尝试更改此设置,以便仅显示 returns 篇标题中包含搜索词的文章。例如,如果搜索词是 "this is the title",则只会返回标题中包含该短语的文章。
我认为这样做需要为 WP_Query 创建自定义过滤器,安装 WP Rest Filter 插件以允许通过 REST 进行过滤,并将自定义过滤器添加到查询中。但我不确定如何实现它。
我在这个 post 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 过滤器。我没有从解决方案 post 中得到什么(在以 "Well in the meantime, I found the solution" 开头的部分中,提供 '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 如何接受自定义参数吗?
我明白了。为了让它工作,我需要将参数添加到 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]=一些文本