web-dev-qa-db-fra.com

Les requêtes sur plusieurs taxonomies tirées du tableau $ _GET ne fonctionnent pas?

Je vais garder cela très concis, la recherche normale fonctionne parfaitement, mais lorsque j'ai ajouté des cases à cocher pour des fonctionnalités supplémentaires, etc., tax_query ne fonctionne pas, mais je sais que $ _GET fonctionne, car j'ai affiché les résultats au en haut à gauche de la page pour les tests.

Site actif: http://costaricalifestyleproperties.com.s221952.gridserver.com/

if(!empty($_GET['ct_lifestyle'])) {
//if(is_array($_GET['feature'])) {
    $ct_lifestyle = $_GET['ct_lifestyle'];

    foreach ($ct_lifestyle as $lifestyle):
        $search_values['tax_query'] = array (
            'taxonomy' => 'lifestyle',
            'field' => 'slug',
            'terms' => $lifestyle,
            'operator'  => 'IN'
        );
        echo $lifestyle;
    endforeach;
//}

}

J'ai commenté is_array () à des fins de test et une case à cocher pourrait être choisie à la place de multiples. La taxonomie personnalisée fonctionne également et j'ai double et triple vérification du nom. Voici la fonction de registre ci-dessous.

Toute aide est grandement appréciée. Je me suis cogné la tête en essayant de faire fonctionner cela pendant des heures. Je sais que ce doit être quelque chose de simple qui me manque.

if (! function_exists ('ct_lifestyle_taxonomies'))) {

add_action( 'init', 'ct_lifestyle_taxonomies', 0 );

function ct_lifestyle_taxonomies() {

    // Lifestyle
    $lifestylelabels = array(
        'name' => __( 'Lifestyle', 'contempo' ),
        'singular_name' => __( 'Lifestyle', 'contempo' ),
        'search_items' =>  __( 'Search Lifestyles', 'contempo' ),
        'popular_items' => __( 'Popular Lifestyles', 'contempo' ),
        'all_items' => __( 'All Lifestyles', 'contempo' ),
        'parent_item' => null,
        'parent_item_colon' => null,
        'edit_item' => __( 'Edit Lifestyle', 'contempo' ),
        'update_item' => __( 'Update Lifestyle', 'contempo' ),
        'add_new_item' => __( 'Add New Lifestyle', 'contempo' ),
        'new_item_name' => __( 'New Lifestyle Name', 'contempo' ),
        'separate_items_with_commas' => __( 'Separate Lifestyles with commas', 'contempo' ),
        'add_or_remove_items' => __( 'Add or remove Lifestyles', 'contempo' ),
        'choose_from_most_used' => __( 'Choose from the most used Lifestyles', 'contempo' )
    );
    register_taxonomy( 'lifestyle', 'listings', array(
        'hierarchical' => false,
        'labels' => $lifestylelabels,
        'show_ui' => true,
        'query_var' => true,
        'rewrite' => array( 'slug' => 'lifestyle' ),
    ));

    if(!function_exists('lifestyle')) {
        function lifestyle() {
            global $post;
            global $wp_query;
            $terms_as_text = strip_tags( get_the_term_list( $wp_query->post->ID, 'lifestyle', '', ', ', '' ) );
            echo esc_html($terms_as_text);
        }
    }

}

}

1
contempoinc

Ici:

$search_values['tax_query'] = array (

Vous réinitialisez la valeur de tax_query pour chaque élément de la boucle foreach.

Il est également défini sur une valeur non valide :

Remarque importante: tax_query prend un tableau d'arguments de requête fiscale et des tableaux (il prend un tableau de tableaux). Cette construction vous permet d'interroger plusieurs taxonomies en utilisant le paramètre relation dans le premier tableau (extérieur) pour décrire la relation booléenne entre les tableaux de taxonomie.

Donc, pour construire un tax_query de plusieurs tableaux, vous devez définir $search_values['tax_query'] sur un tableau vide, puis ajouter chaque tableau:

if( ! empty( $_GET['ct_lifestyle'] ) ) {
    $ct_lifestyle = (array) $_GET['ct_lifestyle'];

    $search_values['tax_query'] = array();

    foreach ($ct_lifestyle as $lifestyle):
        $search_values['tax_query'][] = array (
            'taxonomy' => 'lifestyle',
            'field'    => 'slug',
            'terms'    => $lifestyle,
        );
    endforeach;
}

Notez aussi ce bit:

$ct_lifestyle = (array) $_GET['ct_lifestyle'];

Le transformer en tableau signifie que si un seul paramètre ct_lifestyle est présent, il sera placé dans un tableau avec un seul élément. Ainsi, votre foreach fonctionnera toujours sans que vous ayez à manipuler un seul élément différemment.

Ce code suppose que vous voulez que la requête corresponde aux publications qui ont all le 'style de vie' donné. C'est pourquoi j'ai supprimé la INoperator de votre code. Si vous souhaitez apparier des publications qui ont un des styles de vie donnés, vous pouvez ignorer la variable foreach et simplement passer le tableau dans le code tax_query:

if( ! empty( $_GET['ct_lifestyle'] ) ) {
    $ct_lifestyle = (array) $_GET['ct_lifestyle'];

    $search_values['tax_query'] = array(
        array(
            'taxonomy' => 'lifestyle',
            'field'    => 'slug',
            'terms'    => $ct_lifestyle,
            'operator' => 'IN',
        )
    );
}
1
Jacob Peattie