php - 具有多个后元值关键字的 Wordpress 搜索(无插件)

标签 php wordpress search metadata postdata

我到处搜索这个问题的答案,并一直在寻找不同的建议,但似乎没有一个能满足我的特殊需求。我目前有一个使用自定义搜索(无插件)的网站。网址:GayBarsIn.com

我发现搜索功能可用于搜索自定义帖子标题帖子元数据(高级自定义字段)以及标题和帖子元数据的组合,但仅一个帖子元关键字有效。我正在尝试找到一种方法来搜索多个 发布元关键字。


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

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

我需要它做的是使用多个搜索词显示所有帖子元(自定义字段)的结果。示例:“克利夫兰俄亥俄州”或“夜总会酒廊休斯顿”


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

/* ========================================
 * 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' );


代码写到一半,这部分好像是应该编辑的,但我不知道怎么编辑。我试过将“或”切换为“和”,但没有返回任何结果。

    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 );

您只需要循环 (foreach) 遍历后数组并输出结果。

关于php - 具有多个后元值关键字的 Wordpress 搜索(无插件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34456947/

相关文章:

php - 使用 Zend_Http_Client 发送 json POST

php - WooCommerce 可变产品变体中的附加价格字段

html - 使 Wordpress 内容跨越 2 列

mysql - 将所有自定义字段数据从自定义帖子类型传输到用户帐户 - Wordpress

javascript - 在网站 HTML 页面上搜索文本

sql - 针对 SQL 数据库自动完成名称

php - 为 SELECT...BETWEEN 查询创建正确的日期格式

php - 它没有在数据库中插入正确的值?

php - 使用 PHP 打印漂亮的 JSON

ruby-on-rails - Rails Ransack - 如何在 ransacker 中包含多个条件