2017-03-07 6 views
0

WordpressでAJAXを使用して投稿とカスタム投稿タイプの両方を表示する検索機能を作成しようとしています。これまでのところ、私はそれが欲しいと思ったようにほとんど全てのものを動かすことができましたが、AJAXの結果にAdvanced Custom Fieldsで出力されているものは検索されません。高度なカスタムフィールドのデータを含むAjax検索機能

たとえば、私は自分の記事の1つに「Skittles」の言及があることを知っていますが、「Skittles」を検索すると、AJAXの結果には何も見つかりません。しかし、「Skittles」という単語を含む投稿は、私が入力して別の検索結果ページで終わると見つかりますが、それは私が望む動作ではありません。

以下のコードは、カスタムフィールドを検索可能にします。検索結果はWordpressの検索結果ページに表示されます。

/** 
* Finds custom fields meta data in search results 
* http://adambalee.com 
*/ 
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 $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'); 

しかし、私は人々がWordpressの独自の検索結果ページで終わることを望んでいません。ジャバスクリプトと一緒に

/** 
* Adding ajax search functionality to the theme 
* @return 
*/ 
function dhemy_ajax_search() { // creating a search query 
    $args = array( 
     'post_type'  => array('case', 'post'), 
     'post_status' => 'publish', 
     'order'   => 'DESC', 
     'orderby'  => 'date', 
     's'    => $_POST['term'], 
     'posts_per_page' => 9999 
    ); 

    $query = new WP_Query($args); 
    if($query->have_posts()) { // display results 
     while ($query->have_posts()) { $query->the_post(); ?> 

     <?php if(get_post_type() == 'case') { ?> 
     <?php // code output for the cpt called 'case' ?> 
     <?php } else { ?> 
     <?php // code output for regular posts ?> 
     <?php } ?> 

     <?php } 
    } else { ?> 
     <?php // code output for when there are no hits ?> 
    <?php } exit; 
} 

add_action('wp_ajax_nopriv_dhemy_ajax_search', 'dhemy_ajax_search'); 
add_action('wp_ajax_dhemy_ajax_search', 'dhemy_ajax_search'); 

ここで私はAJAXの検索に使用するコードです

$('#bigsearch').keyup(function(event) { 
    var searchTerm = $(this).val(); // get search term 

    if(!searchTerm.trim()) { 
     $('.search_overlay .flow .wrap .post_row').html(''); 
     return; 
    } 

    else if(searchTerm.length > 0) { // send request when the lenght is greater than 0 letters 
     $.ajax({ 
      url: BASE+'/wp-admin/admin-ajax.php', 
      type: "post", 
      data: { 
       'action':'dhemy_ajax_search', 
       'term':searchTerm 
      }, 
      success: function(result) { 
       $('.search_overlay .flow .wrap .post_row').fadeIn().html(result); 
      } 
     }); 
    } 
}); 

それはWP_query$argsでカスタムフィールドからのデータを含めることは可能ですか?または、最初の関数と実際の検索関数を組み合わせることは可能ですか?

答えて

0

問題はコードAdam Baléeです。彼のコードは仕事をしましたが、それはis_searchだっただけで、私の場合はそうではありませんでした。私がしたことは、関数からif (is_search()) {}ステートメントを削除することでした。だから、最終的なコードは次のとおりです。

/** 
* Finds custom fields meta data in search results 
* http://adambalee.com 
*/ 
function cf_search_join($join) { 
    global $wpdb; 
    $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 $wpdb; 
    $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; 
    return "DISTINCT"; 
    return $where; 
} 
add_filter('posts_distinct', 'cf_search_distinct'); 

私はこれを実現するための手助けMattias Haalに大きな感謝。

関連する問題