如何让搜索包含wp_postmeta中的数据?

时间:2011-12-08 作者:Jodi Warren

我有一个网站使用Advanced Custom Fields 创建和存储各种相关信息。这些内容需要包含在主常规搜索中,默认情况下,主常规搜索仅搜索标题和主要内容。

我已经找到了很多关于根据Posteta的特定信息获取搜索结果的信息,但我对此有一个问题。Posteta中有可能无限量的潜在字段可供搜索。

该解决方案可以搜索Posteta中的任何内容,也可以搜索具有匹配此正则表达式的meta\\u键的任何内容:content_section_[0-9]{1,4}_content_.{2,8}

要匹配的meta\\u键示例如下:

content_section_0_content_title
content_section_0_content_title
content_section_4_content_subtitle
content_section_8_content_text
如果我能以任何方式更改搜索的字段以包含Posteta,我将不胜感激。

5 个回复
最合适的回答,由SO网友:Dave Romsey 整理而成

如果你想使用插件,Relevanssi - A Better Search 也许值得一试。

标准(免费)版本支持搜索post meta。

SO网友:Ahmed

将其添加到插件或函数中。你的主题的php文件。下面的示例将在搜索中包含“your\\u key”。可以通过重复数组来包含所有键。

function me_search_query( $query ) {
  if ( $query->is_search ) {
    $meta_query_args = array(
      array(
        \'key\' => \'your_key\',
        \'value\' => $query->query_vars[\'s\'] = \'\',
        \'compare\' => \'LIKE\',
      ),
    );
    $query->set(\'meta_query\', $meta_query_args);
  };
}
add_filter( \'pre_get_posts\', \'me_search_query\');

SO网友:Sergey Zaharchenko

这是艾哈迈德的一个改进答案:

function me_search_query( $query ) {
  if ( $query->is_search ) {
    $meta_query_args = array(
      array(
        \'key\' => \'your_key\',
        \'value\' => $query->query_vars[\'s\'],
        \'compare\' => \'LIKE\',
      ),
    );
    $query->set(\'meta_query\', $meta_query_args);
    add_filter( \'get_meta_sql\', \'me_replace_and_with_or\' );
  };
}

function me_replace_and_with_or( $sql ) {
    if ( 1 === strpos( $sql[\'where\'], \'AND\' ) ) {
        $sql[\'where\'] = substr( $sql[\'where\'], 4 );
        $sql[\'where\'] = \' OR \' . $sql[\'where\'];
    }

    //make sure that this filter will fire only once for the meta query
    remove_filter( \'get_meta_sql\', \'me_replace_and_with_or\' );
    return $sql;
}

add_filter( \'pre_get_posts\', \'me_search_query\');
问题是WordPress使用“AND”操作符生成元查询,并且只显示在两个位置都有搜索字符串的帖子-标题和元,或者内容和元。因此,我们需要创建一个额外的过滤器来更改“AND”to“OR”(然后删除该过滤器以不破坏任何其他内容)。

SO网友:Mindaugas Jakubauskas

这是目前最简单、最有效的解决方案。以上这些都不适合我。是的tested and working with Wordpress 5.3.1 .

在函数中放置以下代码。要挂接到的php文件posts_clauses 滤器

/**
 * Include meta fields in search
 * 
 * @author Mindaugas // meevly.com
 * @link https://meevly.com/services/custom-wordpress-themes-and-plugins/
 * 
 * @param array $pieces query pieces.
 * @param WP_Query $args query object.
 * @return array
 */
function mv_meta_in_search_query( $pieces, $args ) {
    global $wpdb;

    if ( ! empty( $args->query[\'s\'] ) ) { // only run on search query.
        $keywords        = explode(\' \', get_query_var(\'s\'));
        $escaped_percent = $wpdb->placeholder_escape(); // WordPress escapes "%" since 4.8.3 so we can\'t use percent character directly.
        $query           = "";

        foreach ($keywords as $word) {
            $query .= " (unique_postmeta_selector.meta_value LIKE \'{$escaped_percent}{$word}{$escaped_percent}\') OR ";
        }

        if ( ! empty( $query ) ) { // append necessary WHERE and JOIN options.
            $pieces[\'where\'] = str_replace( "((({$wpdb->posts}.post_title LIKE \'{$escaped_percent}", "( {$query} (({$wpdb->posts}.post_title LIKE \'{$escaped_percent}", $pieces[\'where\'] );
            $pieces[\'join\'] = $pieces[\'join\'] . " INNER JOIN {$wpdb->postmeta} AS unique_postmeta_selector ON ({$wpdb->posts}.ID = unique_postmeta_selector.post_id) ";
        }
    }

    return $pieces;
}
add_filter( \'posts_clauses\', \'mv_meta_in_search_query\', 20, 2 );
您的查询应该如下所示。Please note that suppress_filters => false is mandatory! 没有它,它就无法工作。

$search_posts_array = array(
    \'suppress_filters\' => false,
    \'s\'                => $keyword,
);

$search_results = get_posts( $search_posts_array );

SO网友:Wyck

我不确定,但要获取默认搜索的所有自定义字段键/值,需要使用wpdb.

除了提到的goto10之外,另一个插件是一个更简单的解决方案。Search Everything, WP Custom Fields Search

结束

相关推荐

search only pages if on page

我有一个由网页和帖子组成的网站。只有几页和大量的帖子。如何将侧边栏中的搜索框设置为仅在页面上搜索页面,或仅在博客页面上搜索帖子?现在它将我搜索页面上的所有内容混合在一起。如果能在搜索框下添加复选框来选择帖子或页面,那就更酷了。谢谢