web-dev-qa-db-fra.com

Requête Messages par taxonomie/Taxonomie Enfant Custom order

Il s'agit d'une demande en cours, qui tente de maximiser un code pour afficher une liste des hébergements par pays, d'un type donné et d'une région spécifique.

Ainsi, par exemple, une liste de TOUS les hébergements en FRANCE, par classement d’hôtel (1,2,3,4,5), puis par région (Paris, Marseille, etc.).

-Hôtel 1Star
- Marseille
--- Hôtel 1
--- Hotel 2
--Paris
--- Hôtel 1
--- Hotel 2

-Hôtel 2 étoiles
etc...

Chaque entrée d'hôtel est un poste personnalisé appelé Hébergement. J'ai 3 taxonomies, pays (France), type d'hébergement (hôtel 1 étoile), région (Paris).

La liste des logements "vit" sur une page de pays, donc la valeur du pays est déjà connue. (ie $ termcountry-> name)

Mon code est un ci-dessous:

            $taxonomy2 = 'accomodation-type';
        $termsacc = get_terms("accomodation-type",array('orderby' => 'slug', 'order' => 'ASC'));

        foreach ($termsacc as $termaccomodation) {
            $taxonomyregion = 'region';
            $termsreg = get_terms("region",array('orderby' => 'slug', 'order' => 'ASC'));
             foreach ($termsreg as $termregion) {

             $query = array(
              'post_type' => 'accomodation',
              'accomodation-type' =>$termaccomodation->name,
              'country' =>$termcountry->name, 
              'orderby' => 'title', 
              'order' => 'ASC',
              'posts_per_page' => 48,                 
              'tax_query' => array(
              array(
                    'taxonomy' => $taxonomyregion,
                    'field' => 'slug',
                    'terms' => $termregion->name,
                    'orderby' => 'title', 
                    'order' => 'ASC',
                    )
                  )

              );

            query_posts($query);

             $count = 1; //First we set the count to be zeo    
             if(have_posts() ) {  
             $termaccomodation->slug = str_replace("%e2%80%98", "", $termaccomodation->slug);
             $termaccomodation->slug = str_replace("%e2%80%99", "", $termaccomodation->slug);

             if($termregion->name=="General"){
              $regionname = "";
             }else{
              $regionname = " - ".$termregion->name;
             }
             $id = '';
             $new_id = ++ $id;
             ?> 
             <a name="<?php echo   $new_id."-".$termaccomodation->slug."-".$termregion->slug;?>"></a>
             <div id="accitem">
                <?php echo "<h3>".$termaccomodation->name."".$regionname."</h3>";?>

             <?
             while (have_posts()) : the_post();
             $linkacc = get_custom_field("AccomodationLink");
             ?>
             I do my loop stuff and display the accom list.
             then close my loop
             <?php endwhile; wp_reset_query();?>

Cela fonctionne, mais VRAIMENT LENTEMENT ... et je suis à peu près sûr que ce n'est pas la meilleure façon de le faire. Puis-je choisir votre cerveau à ce sujet? Aidez-moi!

acclamations s

2
salocin

Il suffit de répondre petit à petit et d'ajouter les optimisations que je vois au fur et à mesure:

1) $termsreg = get_terms("region",array('orderby' => 'slug', 'order' => 'ASC')); peut être exécuté au-dessus de la boucle foreach. Il n'est pas nécessaire de l'exécuter plusieurs fois.

2) Est-ce que "tous" vos hôtels que vous avez dans votre type de message personnalisé sont listés quelque part dans cette page? Si au cours de cette double boucle tous les hôtels sont au moins affichés une fois, il serait préférable de charger tous les hôtels dans un tableau avec les taxes auxquelles ils appartiennent. puis, dans le formulaire de vérification, comparez les données que vous avez déjà reçues et affichez ensuite l'hôtel plutôt que de le récupérer dans la base de données à chaque fois. Ce que je ferais pour obtenir les données d'hôtel en premier lieu consisterait en une requête SQL personnalisée afin de m'assurer que je n'ai extrait que les données dont j'avais besoin et d'extraire les deux taxes associées.

Cest tout ce que je viens avec pour le moment.

1
Brady