web-dev-qa-db-ja.com

CPTのカスタム分類にオートコンプリートを追加する方法

私はこのチュートリアルに従っていました、

http://gabrieleromanato.name/adding-jquery-ui-autocomplete-to-the-wordpress-search-form/

そしてそれをそのようにうまく動かしてもらいます。ただし、CPT用に作成したカスタム分類法のリストに基づいて、この作業をオートコンプリートにしようとしています。私の検索機能はこんな感じです

function hbgr_search() {
        $term = strtolower( $_GET['term'] );
        $suggestions = array();

        $input_args = array(
            'post_type' => 'dealer-locator',
            'tax_query' => array(
                'relation' => 'AND',
                array(
                    'taxonomy' => 'Zip_code',
                    'field'    => 'slug',
                    'terms'    => array( $term ),
                ),
                array(
                    'taxonomy' => 'city_served',
                    'field'    => 'slug',
                    'terms'    => array( $term ),
                ),
            ),
        );

        $loop = new WP_Query( $input_args );

        while( $loop->have_posts() ) {
            $loop->the_post();
            $suggestion = array();
            $suggestion['label'] = get_the_title();
            $suggestion['link'] = get_permalink();

            $suggestions[] = $suggestion;
        }

        wp_reset_query();

            $response = wp_json_encode( $suggestions );
            echo $response;
            exit();

}

JSコード:

(function( $ ) {
    $(function() {
        var url = MyAutocomplete.url + "?action=hbgr_search";
        $( "#search-dealer" ).autocomplete({
            source: url,
            delay: 300,
            minLength: 3
        });
    });

})( jQuery );

$ loop = ....のPHP行をコメントアウトして、これに置き換えてください。

$loop = new WP_Query( 's=' . $term );

それからajaxのオートコンプリートはうまく機能します(私が投稿やページを検索した場合)ので、それが正しくロードされていることを知っています。

WP_Queryセクションを取り、それが機能することを確認するために独自のファイルでテストしました。

編集:私がこれに私の機能を変更した場合、それは私が検索ボックスに入力したものでリストを返すことによって、同様に動作します...

$suggestions = array();
$suggestion['label'] = $_GET['term'];
$suggestion['link'] = 'http://google.com';
$suggestions[] = $suggestion;

$response = wp_json_encode( $suggestions );
echo $response;
exit();

ありがとうございました。

1
thatryan

税クエリのロジックがtrueを検証することはほとんどありません。

それを見ろ:

'tax_query' => array(
    'relation' => 'AND',
                  array(
                     'taxonomy' => 'Zip_code',
                     'field'    => 'slug',
                     'terms'    => array( $term ),
                  ),
                  array(
                     'taxonomy' => 'city_served',
                     'field'    => 'slug',
                     'terms'    => array( $term ),
                  ),
),

Taxクエリを読むと、「$termZip_code分類法で同じ値(city_served)が割り当てられている投稿を取得する」と表示されます。

両方の分類法間にAND関係を設定し、両方に同じ$term変数を使用していることに注意してください。郵便番号と都市名が同じ値を持つことはほとんどありません。

たぶん、あなたはこの他の論理が欲しい:

'tax_query' => array(
    'relation' => 'OR',
                  array(
                     'taxonomy' => 'Zip_code',
                     'field'    => 'slug',
                     'terms'    => array( $term ),
                  ),
                  array(
                     'taxonomy' => 'city_served',
                     'field'    => 'slug',
                     'terms'    => array( $term ),
                  ),
),

それ以外に、私はあなたのコードに何も間違っているとは思わない、あなたは完全なコードを見せていないので、私は確信が持てない。

デフォルトの投稿タイプ、カテゴリ、タグ分類法を使って簡単なテストを作成しました。

PHP:

add_action( 'wp_ajax_hbgr_search', 'hbgr_search' );
add_action( 'wp_ajax_nopriv_hbgr_search', 'hbgr_search' );
function hbgr_search() {
        $term = strtolower( $_GET['term'] );
        $suggestions = array();

        $input_args = array(
            'post_type' => 'post',
            'tax_query' => array(
                'relation' => 'OR',
                array(
                    'taxonomy' => 'category',
                    'field'    => 'slug',
                    'terms'    => array( $term )
                ),
                array(
                    'taxonomy' => 'post_tag',
                    'field'    => 'slug',
                    'terms'    => array( $term )
                ),
            ),
        );

        $loop = new WP_Query( $input_args);

        while( $loop->have_posts() ) {
            $loop->the_post();
            $suggestion = array();
            $suggestion['label'] = get_the_title();
            $suggestion['link'] = get_permalink();

            $suggestions[] = $suggestion;
        }

        wp_reset_postdata();

        $response = wp_send_json( $suggestions );

}

add_action( 'wp_enqueue_scripts', 'add_scripts' );
function add_scripts() {
    wp_enqueue_script( 'jquery' );
    wp_enqueue_script( 'jquery-ui-autocomplete' );
    wp_register_style( 'jquery-ui-styles','http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css' );
    wp_enqueue_style( 'jquery-ui-styles' );
    wp_register_script( 'my-autocomplete', plugin_dir_url( __FILE__ ) . 'my-autocomplete.js', array( 'jquery', 'jquery-ui-autocomplete' ), '1.0', false );
    wp_localize_script( 'my-autocomplete', 'MyAutocomplete', array( 'url' => admin_url( 'admin-ajax.php' ) ) );
    wp_enqueue_script( 'my-autocomplete' );
}

JavaScript(my-autocomplete.js):

(function( $ ) {
    $(function() {
        var url = MyAutocomplete.url + "?action=hbgr_search";
        $( "#search-dealer" ).autocomplete({
            source: url,
            delay: 300,
            minLength: 3
        });
    });

})( jQuery );

検索フォーム

<form method="get" action="<?php echo esc_url( home_url( '/' ) ); ?>" role="search">
    <input id="search-dealer" type="search" placeholder="Search" name="s">
    <button type="submit">Submit</button>
</form>
2
cybmeta