Php 在wordpress搜索中添加自定义元

Php 在wordpress搜索中添加自定义元,php,wordpress,Php,Wordpress,我目前正在尝试将我的主题帖子自定义的元值添加到搜索查询中,但它对我不起作用。例如,\u My\u meta\u value\u key3是产品代码,但如果我尝试搜索它,则无法找到匹配项。我真的很想在没有任何插件的情况下做这件事,所以欢迎任何建议。此外,此代码当前位于主题函数中 function My_custom_search_query( $query ) { if ($query->is_search()) { $query->set('meta_query', arra

我目前正在尝试将我的主题帖子自定义的元值添加到搜索查询中,但它对我不起作用。例如,\u My\u meta\u value\u key3是产品代码,但如果我尝试搜索它,则无法找到匹配项。我真的很想在没有任何插件的情况下做这件事,所以欢迎任何建议。此外,此代码当前位于主题函数中

function My_custom_search_query( $query ) {
if ($query->is_search()) {
    $query->set('meta_query', array(
        array(
        'key' => '_My_meta_value_key',
        'value' => $query->query_vars['s'],
        'compare' => 'LIKE'
        ),
        array(
        'key' => '_My_meta_value_key2',
        'value' => $query->query_vars['s'],
        'compare' => 'LIKE'
        ),
        array(
        'key' => '_My_meta_value_key3',
        'value' => $query->query_vars['s'],
        'compare' => 'LIKE'
        )
    ));
    return $query;
};}

add_filter( 'pre_get_posts', 'My_custom_search_query');
我们发现:


我花了一个小时寻找一个解决方案,但没有任何有效的方法,所以我不得不自己编写解决方案。它经过测试并使用Wordpress 5.3.1,是我在互联网上找到的唯一解决这个问题的方法

将以下代码放在functions.php文件中,以便挂接到
posts\u子句
filter中

/**
 * 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 );
您的查询应该如下所示请注意,
抑制\u过滤器=>false
是必需的
!没有它,它就无法工作

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

$search_results = get_posts( $search_posts_array );

如果我为你节省了大量的时间,请不要犹豫

为某些搜索值获取了同一对象的多个结果。。但是,除非它工作得很好!
$search_posts_array = array(
    'suppress_filters' => false,
    's'                => $keyword,
);

$search_results = get_posts( $search_posts_array );