Я заметил много дискуссий о поисковом расширении WordPress, но мне никто не подходит. На моем веб-сайте есть поле ввода для поиска classi c с именем = "s" (заголовок. php):
<form class="form-inline my-2 my-lg-0" action="<?php echo esc_url_raw(home_url())?>" method="get">
<input class="form-control mr-sm-2" type="search" placeholder="cerca" aria-label="Search" name="s">
<button class="icon-search" type="submit"><i class="fa fa-search" aria-hidden="true"></i></button>
</form>
...........etc ......
Это работает правильно. Некоторое время go я расширил поле поиска, чтобы также показать результаты в таблице postmeta, благодаря найденному здесь руководству, которое мне очень помогло (функции. php):
/* ADD META FIELD TO SEARCH QUERY */
add_meta_field_to_search_query('tipo_edificio');
add_meta_field_to_search_query('archivio_cartaceo');
add_meta_field_to_search_query('pratica_cpi_n');
add_meta_field_to_search_query('incarico_n');
function add_meta_field_to_search_query($field)
{
if (isset($GLOBALS['added_meta_field_to_search_query'])) {
$GLOBALS['added_meta_field_to_search_query'][] = '\'' . $field . '\'';
return;
}
$GLOBALS['added_meta_field_to_search_query'] = array();
$GLOBALS['added_meta_field_to_search_query'][] = '\'' . $field . '\'';
add_filter('posts_join', function ($join) {
global $wpdb;
if (is_search()) {
$join .= " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";
}
return $join;
});
add_filter('posts_groupby', function ($groupby) {
global $wpdb;
if (is_search()) {
$groupby = "$wpdb->posts.ID";
}
return $groupby;
});
add_filter('posts_search', function ($search_sql) {
global $wpdb;
$search_terms = get_query_var('search_terms');
if (!empty($search_terms)) {
foreach ($search_terms as $search_term) {
$old_or = "OR ({$wpdb->posts}.post_content LIKE '{$wpdb->placeholder_escape()}{$search_term}{$wpdb->placeholder_escape()}')";
$new_or = $old_or . " OR ({$wpdb->postmeta}.meta_value LIKE '{$wpdb->placeholder_escape()}{$search_term}{$wpdb->placeholder_escape()}' AND {$wpdb->postmeta}.meta_key IN (" . implode(', ', $GLOBALS['added_meta_field_to_search_query']) . "))";
$search_sql = str_replace($old_or, $new_or, $search_sql);
}
}
$search_sql = str_replace(" ORDER BY ", " GROUP BY $wpdb->posts.ID ORDER BY ", $search_sql);
return $search_sql;
});
}
Работает нормально. Когда я делаю поиск, он также возвращает результаты, присутствующие в постмете. Теперь я добавил более сложный фильтр на свой сайт для более точного поиска. Одно из этих полей выбирает ключевое слово в поле ввода с именем = "search_text", как показано в следующем коде:
content-filter. php:
<form action="<?php echo home_url('/filter'); ?>" method="get">
<div class="container mt-3">
<div class="form-row">
<div class="col-md-12 mt-3">
<label for="inputState">Parola chiave</label>
<input type="text" class="form-control" placeholder="search ..." name="search_text">
</div>
<div class="col">
<label for="sup_min">Sup. min.</label>
<select id="sup_min" class="form-control" name="min_area" >
<option selected value="">0</option>
<option value="100">100</option>
<option value="200">200</option>
...... etc
</select>
</div>
<div class="col">
<label for="sup_max">Sup. max.</label>
<select id="sup_max" class="form-control" name="max_area" >
<option selected value="">3000</option>
<option value="100">100</option>
<option value="200">200</option>
.... etc
</select>
</div>
<div class="col">
<label for="da_anno">From year</label>
<select id="da_anno" class="form-control" placeholder="2010" name="min_anno" >
<option selected value="">Any</option>
<option value="2013">2013</option>
<option value="2014">2014</option>
... etc
</select>
</div>
<div class="col">
<label for="a_anno">To year</label>
<select id="a_anno" class="form-control" placeholder="2010" name="max_anno" >
<option selected value="">Any</option>
<option value="2013">2013</option>
<option value="2014">2013</option>
etc ....
</select>
</div>
</div>
</div>
<div class="container mt-3">
<div class="form-row">
<div class="col">
<label for="filter_struttura">Struttura</label>
<select id="filter_struttura" class="form-control" name="struttura" >
<option selected value="">Any</option>
<option value="abitazione">Abitazione</option>
etc..
</select>
</div>
</div>
<div class="col-md-12 mt-3">
<button class="btn btn-default btn-block mb-2" type="submit"><i class="fa fa-search"></i></button>
</div>
</div>
</form>
и вот поисковый запрос
filter. php
<?php
/* Template name: Custom Filter */
get_header();
?>
<?php
if ($_GET['min_area'] && !empty($_GET['min_area'])) {
$min_area = $_GET['min_area'];
} else {
$min_area = 0;
}
if ($_GET['max_area'] && !empty($_GET['max_area'])) {
$max_area = $_GET['max_area'];
} else {
$max_area = 9999999;
}
if ($_GET['min_anno'] && !empty($_GET['min_anno'])) {
$min_anno = $_GET['min_anno'];
} else {
$min_anno = 0;
}
if ($_GET['max_anno'] && !empty($_GET['max_anno'])) {
$max_anno = $_GET['max_anno'];
} else {
$max_anno = 2050;
}
if ($_GET['struttura'] && !empty($_GET['struttura'])) {
$struttura = $_GET['struttura'];
}
if ($_GET['search_text'] && !empty($_GET['search_text'])) {
$text = $_GET['search_text'];
}
?>
<section class="margin-filtro-search">
<div class="container">
<div class="row">
<div class="col-sm-10">
<div>
<div id="myOverlay" class="overlay">
<span class="closebtn text-center" onclick="closeSearch()" title="">Close</span>
<div class="overlay-content">
<?php get_template_part('template-parts/content', 'filter'); ?>
</div>
</div>
</div>
........
</section>
<div class="container">
<div class="card-deck mt-5">
<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$custom_filter = array(
'post_type' => 'post',
'orderby' => 'title',
'order' => 'ASC',
'posts_per_page' => '28',
'paged' => $paged,
's' => $text,
'meta_query' => array(
array(
'key' => 'superficie',
'type' => 'NUMERIC',
'value' => array($min_area, $max_area),
'compare' => 'BETWEEN'
),
array(
'key' => 'anno',
'type' => 'NUMERIC',
'value' => array($min_anno, $max_anno),
'compare' => 'BETWEEN'
),
array(
'key' => 'struttura',
'value' => $struttura,
'compare' => 'LIKE'
)
)
);
$filtro_avanzato = new WP_Query($custom_filter);
if ($filtro_avanzato->have_posts()) :
while ($filtro_avanzato->have_posts()) : $filtro_avanzato->the_post();
?>
................ etc ..........
<?php get_footer(); ?>
's' => $ text, заботится о захвате ключевого слова
Проблема: когда Я ищу через этот фильтр, поиск происходит только в сообщениях (поиск classi c), игнорируя мета-ключи, которые я добавил в функции. php. Как получилось смотреть в поле ввода в шапке. php возвращает их, а через этот фильтр нет? Спасибо тем, кто мне поможет