Опубликовать мета-заголовки не найдены

Я пытаюсь создать и улучшить поиск по умолчанию в 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(); ?>

1 ответ

Проблема была не в данных поста, а в выводе самих значений. Массивы были соединены вместе, в результате чего первые слова всех строк были присоединены к предыдущим значениям массива:

  $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>';
      }
    }
  }
Другие вопросы по тегам