web-dev-qa-db-fra.com

Afficher les éléments de taxonomie personnalisée WordPress en fonction d'un élément sélectionné dans une autre taxonomie personnalisée

Laissez-moi vous expliquer le problème auquel je suis confronté:

J'ai 2 taxonomies personnalisées. L'un est nommé "État" et l'autre "Thetown".

Dans " thestate ", j'ai énuméré tous les états des États-Unis.
Dans " thetown ", j'ai énuméré les principales villes des États-Unis.

Pour chaque taxonomie, leurs éléments sont affichés dans une liste déroulante

Comprends-tu où je vais avec ça? : D Je dois pouvoir afficher les éléments dans "thetown" en fonction de l'état sélectionné dans la taxonomie "thestate"

Par exemple , si l'utilisateur sélectionne "Michigan" (dans la taxonomie appelée "thestate"), la page est automatiquement actualisée et, dans le menu déroulant suivant, dans la taxonomie appelée "thetown", je n'ai que les villes " Detroit "," Grand Rapids "," Warren ".

Si l'utilisateur change ensuite d'avis et sélectionne "Texas", la page est automatiquement actualisée. Dans la liste déroulante suivante, dans la taxonomie appelée "Thetown", je n'ai que les villes "Houston", "San Antonio", "Dallas".

J'espère que mon explication a un sens! Pouvez-vous penser à une logique par laquelle je peux accomplir cela?

Cordialement Gabriela

5
Gabriela

Pourquoi ne pas faire les villes termes de chaque État? La taxonomie pourrait être l'emplacement:

Voir MikeSchinkel pour plus de détails sur les taxonomies hiérarchiques .

enter image description here

Une solution plus élégante que d'actualiser la page à l'état sélectionné serait de charger les termes enfants "theetown" à l'aide de ajax et de la fonction get_term_children ou de la requête personnalisée $ wpdb décrite ci-dessous.

Transmettez l’état sélectionné à l’aide de jQuery à votre fonction dorsale PHP qui parcourt un tableau de termes enfants pour créer votre deuxième menu déroulant.

Voici un exemple rapide utilisant une requête $ wpdb personnalisée:

Fonction backend PHP:

add_action( 'wp_ajax_nopriv_get_child', 'ajax_get_children' );

function ajax_get_children() {
        global $wpdb;
        $parent = $_POST['parent'];
        $child_string = "";
        $results = $wpdb->get_results ( "SELECT t.term_id, t.name FROM $wpdb->term_taxonomy tt, $wpdb->terms t, $wpdb->term_taxonomy tt2 WHERE tt.parent = $parent AND tt.taxonomy = 'category' AND t.term_id = tt.term_id AND tt2.parent = tt.term_id GROUP BY t.term_id, t.name HAVING COUNT(*) > 0 ORDER BY t.term_order ASC" );
        foreach ( $results as $row ) {
            $child_string = $child_string . "<option value='$row->term_id'>$row->name</option>";
        }
        echo $child_string;

        die(1);

    }

jQuery:

jQuery(document).ready(function() {

    jQuery("#div-id-of-dropdown").select(function(){

        jQuery( "#loading-animation").show();
        var termID = jQuery("#parent-term :selected").val();


        jQuery.ajax({
            type: 'POST',
            url: ajaxurl,
            data: {"action": "get_child", parent: termID },
            success: function(response) {
                jQuery("#empty-div-to-load-child-terms").html(response);
                jQuery("#loading-animation").hide();
                return false;

            }
        });
    });
});

Vous devrez modifier votre code HTML pour correspondre au code ci-dessus. Lorsque l'état est sélectionné, WordPress chargera l'enfant "villes"

Modifier

J'ai oublié de mentionner que la variable ajaxurl dans jQuery ne sera pas définie. Lisez-le sur en utilisant AJAX dans les plugins pour obtenir la méthode ainsi que d'autres informations utiles.

4
Chris_O