我到处寻找答案,并不断找到不同的建议,但似乎都不符合我的特定需求。我目前有一个使用自定义搜索的网站(没有插件)。网址:GayBarsIn.com
我发现搜索功能可以搜索自定义文章标题、文章元数据(高级自定义字段)以及标题和文章元数据的组合,但只有一个文章元数据关键字有效。我正试图找到一种搜索多个发布元关键字的方法
例如:该网站显示酒吧列表。
- 如果我搜索一个关键字。。。比如"Cleveland",它将返回所有带有该关键字的列表(无论是在标题中还是在后元中)
- 如果我搜索"Cleveland Ohio",它将只返回标题中第一个、然后在post meta中找到的值,但只返回post meta的一个实例。因此,如果标题中有克利夫兰,后元数据中有俄亥俄州,它将返回这些结果,但不会显示包含两个关键字为"Cleveland Ohio"的后元数据实例的结果
我需要它做的是使用多个搜索词显示所有帖子元(自定义字段)的结果。示例:"ClevelandandOhio"或"NightclubandLounge和Houston"
以下是我发现的适用于单个关键字搜索的代码:
/* ========================================
* 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)并输出结果。