如何通过标题中包含搜索词的任何文章过滤wordpress rest api?

时间:2019-01-11 17:32:50

标签: wordpress wordpress-rest-api

我们的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如何接受自定义参数吗?

1 个答案:

答案 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