在POST的META或分页链接问题中按关键字搜索

时间:2018-04-30 作者:alicegaeshi

我想创建一个自定义搜索,不仅在标题和/或内容中,而且在帖子元中,通过关键字搜索帖子。

例如,在用户单击搜索后,我从$wp\\u query->query\\u vars[\'s\')中得到了一个单词“plastic”。

那么我有两条路可以使用它:添加pre_get_posts 操作以筛选metas中包含该关键字的所有帖子,或创建新查询,然后在模板中筛选帖子。

我知道第一种情况-是正确的情况,我应该使用它,但我真的不明白如何通过metas中的关键字查找过滤器帖子。

示例代码:

function d_search( $query ) {
    if ($query->is_search()) {
        $query->set( \'posts_per_page\', 12 );
        $query->set(\'meta_query\', array(
            array(
                \'key\'    => \'something\',
                \'value\'  => $wp_query->query_vars[\'s\'], //plastic
                \'compare\' => \'LIKE\'
            )
        ));
    }
}
add_action( \'pre_get_posts\', \'d_search\' );
我的带有“某物”键的元帖子具有“塑料之爱”的价值,正如你所看到的,我的query\\u vars[\'s]或“塑料”位于“塑料之爱”行中。

为什么它不起作用?只是不过滤任何东西。

以秒为单位:

当我使用我的另一个案例时,我有一个搜索页面http://localhost/search.我在全局查询中筛选了帖子,我有一个分页。

分页中每个按钮的链接如下所示http://localhost/search/plastic/page/2/但它不起作用。如果我打开它,我只会看到我的404模板。

如果我使用http://localhost/search/plastic?paged=2 这也行不通。

如何使用第一个案例或如何修复第二个问题?(请不要使用插件)

1 个回复
最合适的回答,由SO网友:alicegaeshi 整理而成

可以我自己解决的。我不知道出了什么问题,但看起来使用第一种情况是行不通的。使用第二种情况是个坏主意。

因此,我开始使用sql和posts\\u where命令。

first: 而不是$wp_query->query_vars[\'s\'] 我开始使用get_search_query()

second: 看起来,当sql尝试将meta\\u值与value进行比较时,它会要求%. 是的,所以在sql代码中,您应该编写如下内容:

wp_postmeta.meta_key LIKE \\\'_entitle\\\' AND wp_postmeta.meta_value LIKE \\\'%\' . get_search_query() . \'%\\\'

third: 由于您使用的是wp\\U Posteta,因此必须将其帖子ID与wp\\U帖子的ID连接起来:

function dasdasd( $join, $query ) {
    global $wpdb;

    if ( is_search() ) {    
        $join = \'INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )\';
    }

    return $join;
}
add_filter(\'posts_join\', \'dasdasd\', 10, 2 );
以及fourth: 我不知道为什么,但您必须添加groupby代码:

add_filter( \'posts_groupby\', \'adadad\', 10, 2 );

function adadad( $groupby, $query ){
    $groupby = \'wp_posts.ID\';

    return $groupby;
}
我想知道第四步有什么问题,为什么groupby的存在对搜索查询如此重要。非常感谢。

结束

相关推荐

Change searched term

因此,我正在尝试设置一个搜索表单,其中实际搜索的词与用户输入的词不同。具体来说,我需要删除搜索词中的任何破折号。例如,假设用户输入“7-18”。搜索实际需要查询的是“718”。我在想pre_get_posts 也许是一种方式,但我不知道如何去写它。类似于function alter_query($query) { $unedit = the_search_query(); $edited = str_replace(\"-\",\"\",$unedit); the_sea