Расширьте поиск по wordpress в meta_keys - PullRequest
0 голосов
/ 21 января 2020

Я заметил много дискуссий о поисковом расширении 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 возвращает их, а через этот фильтр нет? Спасибо тем, кто мне поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...