Wordpress搜索多个后元值关键字(无插件)


Wordpress Search with Multiple Post Meta Value Keywords (No Plugin)

我到处寻找答案,并不断找到不同的建议,但似乎都不符合我的特定需求。我目前有一个使用自定义搜索的网站(没有插件)。网址:GayBarsIn.com

我发现搜索功能可以搜索自定义文章标题文章元数据(高级自定义字段)以及标题和文章元数据的组合,但只有一个文章元数据关键字有效。我正试图找到一种搜索多个发布元关键字的方法


例如:该网站显示酒吧列表。

  • 如果我搜索一个关键字。。。比如"Cleveland",它将返回所有带有该关键字的列表(无论是在标题中还是在后元中)
  • 如果我搜索"Cleveland Ohio",它将只返回标题中第一个然后在post meta中找到的值,但只返回post meta的一个实例。因此,如果标题中有克利夫兰,后元数据中有俄亥俄州,它将返回这些结果,但不会显示包含两个关键字为"Cleveland Ohio"的后元数据实例的结果

我需要它做的是使用多个搜索词显示所有帖子元(自定义字段)的结果。示例:"ClevelandandOhio"或"NightclubandLoungeHouston"


以下是我发现的适用于单个关键字搜索的代码:

/* ========================================
 * SEARCH CUSTOM POST TYPES
 * ======================================== */
function searchfilter($query) {
    if ($query->is_search && !is_admin() ) {
        $query->set('post_type', array('listing'));
    }
return $query;
}
add_filter('pre_get_posts','searchfilter');
function cf_search_join( $join ) {
    global $wpdb;
    if ( is_search() ) {    
        $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
    }
    return $join;
}
add_filter('posts_join', 'cf_search_join' );
/**
 * Modify the search query with posts_where
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where
 */
function cf_search_where( $where ) {
    global $pagenow, $wpdb;
    if ( is_search() ) {
        $where = preg_replace(
            "/'('s*".$wpdb->posts.".post_title's+LIKE's*(''[^'']+'')'s*')/",
            "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
    }
    return $where;
}
add_filter( 'posts_where', 'cf_search_where' );
/**
 * Prevent duplicates
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_distinct
 */
function cf_search_distinct( $where ) {
    global $wpdb;
    if ( is_search() ) {
        return "DISTINCT";
    }
    return $where;
}
add_filter( 'posts_distinct', 'cf_search_distinct' );


大约在代码的一半,这一部分似乎是应该编辑的,但我不知道如何编辑。我试过将"OR"切换为"AND",但没有返回任何结果

    if ( is_search() ) {
        $where = preg_replace(
            "/'('s*".$wpdb->posts.".post_title's+LIKE's*(''[^'']+'')'s*')/",
            "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
    }


如果以前有人问过这个问题,我深表歉意。我找了几天,发现其他人围着我想做的事情转,但还不足以让它对我起作用。任何帮助或指导都将不胜感激!

您应该创建自己的表单,其中包含用于搜索的输入字段,并在发布后捕获数据。例如,您可以用explode()拆分单词,并将它们放入一个数组中。您需要检查单词是否作为标记存在,因此需要循环遍历数组并检查它是否存在于get_tags($args)中。之后,您应该有一个只有有用标记的数组。现在您可以使用get_posts()

$postargs = array(
        'posts_per_page'   => '-1',
        'tag__and'         => YOUR_ARRAY,
        'orderby'          => 'date',
        'order'            => 'DESC',
        'post_type'        => YOUR_CUSTOM_POST_TYPE,
        'post_status'      => 'publish',
        'suppress_filters' => true 

);

$posts_array = get_posts( $postargs );

您只需要在post数组中循环(foreach)并输出结果。