web-dev-qa-db-fra.com

Liste déroulante: Afficher les termes de B uniquement s'il existe une relation avec un terme A sélectionné

Je cherche une solution à ce problème dans Google et je n'ai rien trouvé: j'ai des messages d'un type de message personnalisé (Restaurants) et de ses taxonomies ("ville" et "cuisine"). Chaque fois que je crée un article de restaurant, je peux définir autant de termes de "cuisine" que je le souhaite, mais "ville" est sélectionné individuellement. J'ai également effectué une recherche personnalisée à l'aide d'une liste déroulante html dans laquelle je peux effectuer une recherche à partir des publications 'restaurants' en filtrant à partir de ses termes de taxonomie.

La recherche fonctionne bien, mais ce que je veux vraiment, c'est peupler la deuxième taxonomie (cuisine) uniquement avec des termes qui ont une relation en fonction de la première taxonomie choisie (ville). Dans le premier menu déroulant, si quelqu'un choisit la ville "New York", le second menu déroulant ne doit afficher que les termes de cuisine ayant un rapport avec le terme de ville "New York" aux adresses de restaurant. S'il n'y a pas de poste avec une cuisine "brésilienne" et une ville "New York" enregistrée, le terme "brésilien" ne doit pas apparaître à la deuxième liste déroulante. Bien entendu, le menu déroulant Cuisine n'a pas à afficher les termes dupliqués.

Est-ce possible? Merci d'avance!

3
Daniel Semblano

Voici une partie de la réponse ... comment interroger les termes que vous recherchez. Mais il semble que vous aurez besoin de quelques ajax pour interroger à nouveau chaque sélection.

La ville et la cuisine seraient dynamiques, mais essentiellement lorsque l'utilisateur sélectionne la ville, peuplera ces données dans la variable $city, et ainsi de suite.

Quelqu'un d'autre aura besoin de se mêler de la partie ajax.

<?php

    $city = array( 'dallas' );
    $cuisine = array( 'italian', 'mexican', 'french );

    $args = array(

        'post_type' => 'restaurant',
        'posts_per_page' => -1,
        'tax_query' => array(
        'relation' => 'AND',
             array(
                'taxonomy' => 'city',
                'field' => 'slug',
                'terms' => $city
            ),
            array(
                'taxonomy' => 'cuisine',
                'field' => 'slug',
                'terms' => $cuisine
            )
        )
    );

?>
2
developdaly

Désolé pour le long délai de réponse, mais merci pour votre aide les gars, c'est une bonne référence!

vtxyzzy de wordpress.org forum aidez-moi avec la partie requête, ajax et php me l'ont fait, je ne sais pas si c'est chouette. Voici comment le code final est devenu dans functions.php:

function restaurant_search( $taxonomy ) {
    ?>
    <script type="text/javascript">
        jQuery(document).ready(function() {
            $('#cidade').change(function(){
            var cidade=jQuery('#cidade').val();
                $.ajax({
                    url:"<?php bloginfo('wpurl'); ?>/wp-admin/admin-ajax.php",
                    type:'POST',
                    data:'action=category_select_action&name=' + cidade,
                    success:function(results)
                    {
                    $("#cozinha").html(results);
                    }
                 });
            });
        });
    </script>

<form action="<?php echo home_url('/'); ?>" role="search" method="get">
    <?php // First dropdown
        $term_selected_cidade = get_terms('cidade');
        echo '<select id="cidade" name="cidade">';
        echo '<option disabled="disabled" selected="selected">Cidade</option>';
        foreach ($term_selected_cidade as $term) {
            echo '<option id=' . $term->term_id . ' value=' . $term->slug . '>' . $term->name . '</option>';
        }
        echo '</select>';

    ?>

    <!-- Second Dropdown -->
    <select name="cozinha" id="cozinha" >
        <option>Escolha uma cidade</option>
    </select>
    <input type="submit" value="buscar" />
</form>

<?php }

function implement_ajax() {
    // Populates the second dropdown with cuisine terms
    global $wpdb;
    $cozinha_term = $_POST['name'];
    $query = "
        SELECT DISTINCT $wpdb->terms.name, $wpdb->terms.slug
        FROM $wpdb->terms
        INNER JOIN $wpdb->term_taxonomy ON $wpdb->terms.term_id=$wpdb->term_taxonomy.term_id
        INNER JOIN $wpdb->term_relationships ON $wpdb->term_relationships.term_taxonomy_id=$wpdb->term_taxonomy.term_taxonomy_id
        LEFT JOIN $wpdb->posts ON $wpdb->posts.ID=$wpdb->term_relationships.object_id
        WHERE $wpdb->term_taxonomy.taxonomy='cozinha' AND $wpdb->posts.ID IN (
        SELECT $wpdb->posts.ID
        FROM $wpdb->terms
        INNER JOIN $wpdb->term_taxonomy ON $wpdb->terms.term_id=$wpdb->term_taxonomy.term_id
        INNER JOIN $wpdb->term_relationships ON $wpdb->term_relationships.term_taxonomy_id=$wpdb->term_taxonomy.term_taxonomy_id
        LEFT JOIN $wpdb->posts ON $wpdb->posts.ID=$wpdb->term_relationships.object_id
        WHERE $wpdb->term_taxonomy.taxonomy='cidade' AND $wpdb->terms.slug='$cozinha_term')";

    $object = $wpdb->get_results($query);
    $cuisine_terms = array();
    for ($i = 0; $i < count($object); $i++) {
        $cuisine_terms[] = get_object_vars($object[$i]);
    }

    echo '<select id="cozinha">' . '<option disabled="disabled" selected="selected">Cozinha</option>';
    foreach ($cuisine_terms as $term) {
        echo '<option value=' . $term['slug'] . '>' . $term['name'] . '</option>';
    }
    echo '</select>';
}

add_action('wp_ajax_category_select_action', 'implement_ajax');
add_action('wp_ajax_nopriv_category_select_action', 'implement_ajax');
0
Daniel Semblano