2016-05-10 6 views
2

私は、ページやカスタムポストタイプのメタデータも検索できるように、デフォルトのワードプレス検索を構築して強化しようとしています。カスタムフィールドのタイトルが出力されていないことを除いて、素晴らしい動作します。私はprint_r($custom_fields);を実行し、値が格納されていることを示します。私は欠けているものだけを失っていますが、最初の値をスキップする2つのforeachループと関係していると思いますか?ここでポストメタタイトルが見つかりません

は何が起こっているかを示す画像とコードです:どのようにParkmerced(最初の段落)を参照してください: enter image description here

テキストは Text being searched

結果検索の場合に検索されています結果が検索の場合:まとめました(第2段落): enter image description here

の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(); ?> 
+0

'$ field_values'は繰り返しごとに配列ですか? – kindisch

+0

@kindischはいそうです。 – alexmattorr

+0

@kindischこれは、特定の配列から出力される値です。[title] => Array([0] => Parkmercedの仕組みを参照) – alexmattorr

答えて

0

問題は、POSTデータではありませんでしたが、と値そのものの出力。すべての文字列の最初の単語が前の配列の値に結びつくように配列が接続されました:

$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>'; 
     } 
    } 
    } 
関連する問題