web-dev-qa-db-fra.com

Obtention de données de champ personnalisées à partir d'une hiérarchie de pages

Imaginez que j'ai un site mis en place avec des pages dans ce genre de hiérarchie ..

-Home
-Cars 
 -Volvo 850 
  -Volvo 850 tech spec 
  -Volvo 850 pictures
 -Porsche 911 
  -Porsche 911 tech spec
  -Porsche 911 pictures
 -other cars etc

Maintenant, vous pouvez voir que j'ai plusieurs voitures. Sur chacune des pages de la voiture (Volvo 850, Porsche 911), j'ai des champs personnalisés dans lesquels j'ai entré diverses données sur la voiture (en passant, j'utilise le plugin Custom Field Template pour faciliter la saisie de ces données dans wp-admin). Ces champs sont affichés sur la page. (les champs ne sont pas entrés sur les pages de spécifications techniques et d'images)

Ce que je voudrais faire est d’afficher une liste des voitures sur la page d’accueil (ci-dessous), qui récupère les données des champs personnalisés. Quel serait le meilleur moyen (a) d'accéder à ces données de champ personnalisées (qui peuvent changer lorsque de nouvelles voitures sont ajoutées ou modifiées), et (b) d'afficher les données dans un certain ordre (par exemple, par vitesse maximale) ..?

---------------------------------------
|   Car              |   Top Speed    |
---------------------------------------
| Porsche 911        |   200          |
| Audi 444           |   180          |
| Volvo 840          |   160          |
---------------------------------------

Je suppose que le pseudo-code est

* find all pages which are an immediate descendant of the Cars page (not the tech spec and pictures)
* get the custom data from these pages
* display data in Top Speed order
1
cannyboy

Celui-ci pourrait vous aider à démarrer (celui-ci est de la taille que vous pouvez voir puisque je fais la valeur 1 fois la valeur 2) (juste pour donner un exemple de requêtes plus avancées)

 global $edl_global_join;
 global $edl_global_orderby;
 global $wp_query;

 function edl_posts_join ($join) {
   global $edl_global_join;
   if ($edl_global_join) $join .= " $edl_global_join";
   return $join;
 }

 function edl_posts_orderby ($orderby) {
  global $edl_global_orderby;
  if ($edl_global_orderby) $orderby = $edl_global_orderby;
  return $orderby;
 }

 add_filter('posts_join','edl_posts_join');
 add_filter('posts_orderby','edl_posts_orderby');

 $edl_global_join = 
 "JOIN $wpdb->postmeta meta1 ON (meta1.post_id = $wpdb->posts.ID AND meta1.meta_key = 'TOPSPEED')" .
 "JOIN $wpdb->postmeta meta2 ON (meta2.post_id = $wpdb->posts.ID AND meta2.meta_key = 'ANOTHER_THING')";
 $edl_global_orderby = " meta1.meta_value * meta2.meta_value DESC";

 $wp_query = new WP_Query($args);

et puis il suffit de lancer la boucle, j’ai écrit une "classe CAR" qui, entre autres, affiche des méta-champs tels que:

 $car->display_meta_size();

qui est en fait la méthode suivante dans cette classe:

    //
// specific display for size overviews
//
function display_meta_size()
{
    $this->mMetaData->GetValuesFromWP();
    ?>
    <table width="100%">
    <?php   
    $this->mMetaData->ShowIcon();
    $this->mMetaData->ShowSize();
    ?>
    </table>
    <?php
} 

où la méthode GetValuesFromWP () provient de la classe de métadonnées wp:

// get the values stored in WordPress
function GetValuesFromWP() {
    global $post;
    $custom = get_post_custom($post->ID);

    foreach ($this->mArrMetaDataFields as $str_meta_data_field)
    {
        $this->MetaDataWpValues[$str_meta_data_field] = 
                    $custom[$str_meta_data_field][0];
    }
    $this->MetaDataWpValues['SPECIAL'] = $custom['SPECIAL'][0];
}

(donc dans la fonction de jointure totalement au-dessus, ajoutez la ou les sélections de page)

1
edelwater