Как добавить данные пользовательских полей в поисковый индекс?

Вопрос или проблема

Мне нужно сделать данные моего списка доступными для поиска:

Сложный двухколоночный пример формы с множеством данных

Конкретно для поставщика курса и инструктора. Я не использовал мета-запросы ранее, знает ли кто, с чего я могу начать?

Это моя текущая форма поиска:

Форма:

<form role="search" method="get" class="search-form" action="<?php echo esc_url( home_url( "https://wordpress.stackexchange.com/" ) ); ?>">
    <label>
        <span class="screen-reader-text"><?php esc_html_e( 'Искать:', 'listify' ); ?></span>
        <input type="search" class="search-field" placeholder="<?php esc_attr_e( 'Искать', 'listify' ); ?>" value=""
        name="s" title="<?php echo esc_attr_e( 'Искать:', 'listify' ); ?>" />
    </label>
    <button type="submit" class="search-submit"></button>
</form>

Результаты поиска:

if ( isset( $_GET['listings'] ) ) {
    return locate_template( array( 'archive-job_listing.php' ), true );
}

global $style;

$blog_style = get_theme_mod( 'content-blog-style', 'default' );
$style="grid-standard" == $blog_style ? 'standard' : 'cover';
$sidebar="none" != esc_attr( listify_theme_mod( 'content-sidebar-position', 'right' ) ) && is_active_sidebar( 'widget-area-sidebar-1' );

get_header(); ?>

<div <?php echo apply_filters( 'listify_cover', 'page-cover' ); ?>>
    <h1 class="page-title cover-wrapper"><?php printf( __( 'Искать: %s', 'listify' ), get_search_query() ); ?></h1>
</div>

<div id="primary" class="container">
    <div class="row content-area">

        <?php if ( 'left' == esc_attr( listify_theme_mod( 'content-sidebar-position', 'right' ) ) ) : ?>
            <?php get_sidebar(); ?>
        <?php endif; ?>

        <main id="main" class="site-main col-12 
        <?php
        if ( $sidebar ) :
            ?>
             col-sm-7 col-md-8<?php endif; ?>" role="main">

            <?php if ( 'default' != $blog_style ) : ?>
            <div class="blog-archive blog-archive--grid 
                <?php
                if ( $sidebar ) :
                    ?>
                 blog-archive--has-sidebar<?php endif; ?>" data-columns>
                <?php add_filter( 'excerpt_length', 'listify_short_excerpt_length' ); ?>
            <?php endif; ?>

            <?php
            while ( have_posts() ) :
                the_post();

                if ( 'default' == $blog_style ) :
                    get_template_part( 'content' );
                else :
                    get_template_part( 'content', 'recent-posts' );
                endif;
            endwhile;
            ?>

            <?php if ( 'default' != $blog_style ) : ?>
                <?php remove_filter( 'excerpt_length', 'listify_short_excerpt_length' ); ?>
                </div>
            <?php endif; ?>

            <?php get_template_part( 'content', 'pagination' ); ?>

        </main>

        <?php if ( 'right' == esc_attr( get_theme_mod( 'content-sidebar-position', 'right' ) ) ) : ?>
            <?php get_sidebar(); ?>
        <?php endif; ?>

    </div>
</div>

Функция:

global $listify_facetwp, $listify_widget_search_listings_instance;

// Убедитесь, что загружаются ресурсы FacetWP.
add_filter( 'facetwp_load_assets', '__return_true' );

// Получить экземпляр виджета.
$instance = $listify_widget_search_listings_instance;

// Активные фасеты для этого виджета.
$facets_list = isset( $instance['facets'] ) ? array_map( 'trim', explode( ',', $instance['facets'] ) ) : listify_theme_mod( 'listing-archive-facetwp-home', array( 'keyword', 'location', 'category' ) );

// Загрузить данные активных фасетов.
$facets  = array();
$_facets = $listify_facetwp->get_homepage_facets( $facets );
if ( is_array( $_facets ) && $_facets ) {
    foreach ( $_facets as $_facet ) {
        if ( in_array( $_facet['name'], $facets_list ) ) {
            $facets[] = $_facet;
        }
    }
}
?>

<div class="job_search_form job_search_form--count-<?php echo absint( count( $facets ) ); ?>">
    <?php echo $listify_facetwp->template->output_facet_html( $facets ); // WPCS: XSS ok. ?>

    <div class="facetwp-submit">
        <input type="submit" value="<?php esc_attr_e( 'Искать', 'listify' ); ?>" onclick="facetWpRedirect()" />
    </div>

    <div style="display: none;">
        <?php echo do_shortcode( '[facetwp template="listings"]' ); ?>
    </div>

</div>

<script>
function facetWpRedirect() {
    FWP.parse_facets();
    FWP.set_hash();
    window.location.href = "https://wordpress.stackexchange.com/questions/333308/<?php echo listify_get_listings_page_url(); ?>?" + FWP.build_query_string();
}

(function( window, undefined ){
    var $ = window.jQuery;
    var document = window.document;

    $(document).on( 'keyup', '.facetwp-facet .facetwp-search', function(e) {
        if ( e.keyCode == '13' ) {
            facetWpRedirect();
        }
    } );
})( window );

Не уверен, действительно ли это нужная вам информация. Любая помощь будет очень признательна!

Попробуйте добавить следующий фрагмент кода в файл functions.php:

/**
 * Расширьте поиск WordPress, чтобы включить пользовательские поля
 *
 * https://adambalee.com
 */

/**
 * Соединение таблиц posts и postmeta
 *
 * http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_join
 */
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' );

/**
 * Изменение запроса поиска с помощью 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' );

/**
 * Предотвращение дубликатов
 *
 * 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' );

Я узнал, как это использовать, из руководства на https://adambalee.com/search-wordpress-by-custom-fields-without-a-plugin/, и это идеально сработало для меня без каких-либо изменений на установке WordPress 5.1.1.

Однако стоит отметить, что мой сайт использовал стандартные записи WordPress (с пользовательскими полями). Так что я не тестировал это с пользовательскими типами записей. Но введение в этом руководстве, кажется, подразумевает, что оно также будет работать для пользовательских типов записей. Возможно, вы могли бы попробовать это и сообщить нам, если это сработает – в случае, если кто-то еще ищет способ расширить стандартный поиск WordPress, чтобы включить пользовательские поля пользовательских типов записей.

.

Ответ или решение

Для того чтобы добавить данные из пользовательских полей в поисковый индекс на вашей платформе WordPress, необходимо расширить стандартную функциональность. Следуя приведенной ниже инструкции, вы сможете это сделать без использования дополнительных плагинов.

Шаги по добавлению пользовательских полей в поисковый индекс:

  1. Объединение таблиц posts и postmeta:
    Для начала, вам нужно объединить таблицы posts и postmeta, чтобы искать не только в стандартных полях постов, но и в пользовательских полях. Это делается посредством фильтрации SQL-запросов с использованием функции posts_join.

    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');
  2. Модификация условий поиска:
    Обновите условия SQL-запроса для включения полей из таблицы postmeta. Это расширит область поиска, чтобы включать значения пользовательских полей.

    function cf_search_where( $where ) {
       global $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');
  3. Предупреждение появления дубликатов:
    Чтобы избежать появления дублированных результатов из-за объединения таблиц, используйте фильтр posts_distinct.

    function cf_search_distinct( $where ) {
       if ( is_search() ) {
           return "DISTINCT";
       }
       return $where;
    }
    add_filter('posts_distinct', 'cf_search_distinct');

Примечания:

  • Проверка совместимости:
    Этот метод был протестирован и работает на базовой установке WordPress. Тем не менее, если вы используете пользовательские типы записей, убедитесь, что они зарегистрированы правильно, чтобы они учитывались в поиске.

  • Поддержка дополнительных метаполей:
    Измененные SQL-запросы будут искать по всем значениям в метаполях, так что убедитесь, что только нужные поля сохраняются в postmeta.

Заключение:

Это решение позволит вам выгрузить данные из пользовательских полей на платформе WordPress и добавить их в поисковый индекс. Оно не только расширит функциональность вашего сайта, но и улучшит пользовательский опыт за счет предоставления более точных и релевантных результатов поиска.

Изучив данную информацию и внедрив предложенные изменения, вы сможете достичь значительного повышения функциональности поиска на вашем сайте, что положительно скажется на его посещаемости и удовлетворенности посетителей.

Оцените материал
Добавить комментарий

Капча загружается...