Я пытаюсь создать и улучшить поиск по умолчанию в WordPress, чтобы вы могли искать страницы и метаданные пользовательских типов записей. Он прекрасно работает, за исключением того, что заголовки пользовательских полей не выводятся. я делаю print_r($custom_fields);
и это показывает, что значения хранятся. Я просто потерялся в том, что мне не хватает, но я думаю, что это связано с двумя циклами foreach, пропускающими первые значения?
Вот изображения, показывающие, что происходит, и код:
Результат при поиске: Посмотрите, как Parkmerced (первый абзац):
Результат при поиске: мы собрали (второй абзац):
functions.php (функции, связанные с поиском)
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' );
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' );
function cf_search_distinct( $where ) {
global $wpdb;
if ( is_search() ) {
return "DISTINCT";
}
return $where;
}
add_filter( 'posts_distinct', 'cf_search_distinct' );
search.php
<?php if ( have_posts() ) : ?>
<section class="search-results">
<p class='show-results'><?php printf( __( 'Showing search results for: <span>%s', 'parkmerced-vision' ), get_search_query() ); ?></span></p>
<?php while ( have_posts() ) : the_post(); ?>
<!-- something found --><div class="result animated fade-in-up delay-<?php echo $i; ?>">
<a href="<?php the_permalink(); ?>"><h4><?php the_title(); ?></h4></a>
<?php
the_excerpt();
$searched = get_search_query();
$custom_fields = get_post_custom();
foreach($custom_fields as $field_key => $field_values) {
foreach($field_values as $key => $value) {
if(stripos($value, $searched)) {
$in = $value;
$search = $searched;
$replace = '<strong>' . $searched . '</strong>';
$out = str_ireplace($search, $replace, $in);
echo '<p>' . $out . '</p>';
}
}
}
?>
</div>
<?php endwhile; else : ?>
<!-- nothing found -->
<h2>Nothing Found</h2>
<div class="alert alert-info">
<p>Sorry, but nothing matched your search criteria. Please try again with some different keywords.</p>
</div>
<a class="search-back btn" href="<?php echo home_url('/'); ?>/faq">return to faq</a>
<?php endif; ?>
</section><?php get_footer(); ?>
Проблема была не в данных поста, а в выводе самих значений. Массивы были соединены вместе, в результате чего первые слова всех строк были присоединены к предыдущим значениям массива:
$searched = get_search_query();
$custom_fields = get_post_custom();
foreach($custom_fields as $field_key => $field_values) {
foreach($field_values as $key => $value) {
if (stripos($value, $searched) !== false) {
$in = $value;
$search = $searched;
$replace = '<strong>' . $searched . '</strong>';
$out = str_ireplace($search, $replace, $in);
echo '<p>' . $out . '</p>';
}
}
}
Других решений пока нет …