Вопрос или проблема
Мне нужно сделать данные моего списка доступными для поиска:
Конкретно для поставщика курса и инструктора. Я не использовал мета-запросы ранее, знает ли кто, с чего я могу начать?
Это моя текущая форма поиска:
Форма:
<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, необходимо расширить стандартную функциональность. Следуя приведенной ниже инструкции, вы сможете это сделать без использования дополнительных плагинов.
Шаги по добавлению пользовательских полей в поисковый индекс:
-
Объединение таблиц
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');
-
Модификация условий поиска:
Обновите условия 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');
-
Предупреждение появления дубликатов:
Чтобы избежать появления дублированных результатов из-за объединения таблиц, используйте фильтр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 и добавить их в поисковый индекс. Оно не только расширит функциональность вашего сайта, но и улучшит пользовательский опыт за счет предоставления более точных и релевантных результатов поиска.
Изучив данную информацию и внедрив предложенные изменения, вы сможете достичь значительного повышения функциональности поиска на вашем сайте, что положительно скажется на его посещаемости и удовлетворенности посетителей.