Я искал повсюду ответ на этот вопрос и продолжаю находить разные предложения, но ни одно из них не соответствует моим конкретным потребностям. В настоящее время у меня есть сайт, использующий пользовательский поиск (без плагина). Веб-сайт: GayBarsIn.com
Функции поиска я нашел работу для поиска пользовательских сообщений названия, опубликовать метаданные (Расширенные пользовательские поля) и сочетание метаданных заголовка и публикации, но работает только одно ключевое слово мета-сообщения. Я пытаюсь найти способ поиск множественный разместить мета ключевые слова.
Например: На сайте представлены списки баров.
Для этого мне нужно показать результаты, используя несколько поисковых терминов для ВСЕМ пост-мета (настраиваемые поля). Пример: «Кливленд» а также Огайо «или» Ночной клуб а также гостиная а также Хьюстон»
Вот код, который я нашел, который хорошо работает для поиска по одному ключевому слову:
/* ========================================
* 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) через ваш пост-массив и вывести результаты.
Других решений пока нет …