web-dev-qa-db-fra.com

Comment ajouter la saisie semi-automatique à la taxonomie personnalisée pour CPT

Je suivais ce tutoriel,

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

et le faire fonctionner comme ça très bien. Cependant, j'essaye de rendre ce travail autocomplet basé sur la liste des taxonomies personnalisées que j'ai créées pour un CPT. Ma fonction de recherche ressemble à ceci,

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();

}

Code JS:

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

})( jQuery );

Si je commente ma PHP ligne de $ loop = .... et remplace par ceci

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

Ensuite, la saisie semi-automatique ajax fonctionne correctement (si je recherche un article ou une page), donc je sais que le chargement est correct, juste quelque chose de génial avec mes requêtes fiscales?

J'ai pris la section WP_Query et l'ai testée dans son propre fichier pour m'assurer qu'elle fonctionnait correctement.

EDIT: Si je change ma fonction à ceci, cela fonctionne aussi, en retournant une liste avec tout ce que je tape dans le champ de recherche ...

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

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

Je vous remercie.

1
thatryan

Il est très peu probable que la logique de la requête de taxe vérifie true.

Regarde ça:

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

Si vous lisez la requête relative aux taxes, elle indique: récupérez les publications qui ont attribué la même valeur ($term) dans les taxonomies Zip_code et city_served.

Notez que vous avez défini la relation AND entre les deux taxonomies et utilisez la même variable $term pour les deux. Il est très peu probable qu'un code postal et un nom de ville aient la même valeur.

Peut-être que vous voulez cette autre logique:

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

En dehors de cela, je ne vois rien de mal dans votre code, même si vous ne montrez pas le code complet, donc je ne peux pas en être sûr.

J'ai construit un test simple en utilisant les taxonomies par type de message, catégorie et tag par défaut et qui fonctionne:

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 );

Formulaire de recherche:

<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