it-swarm-es.com

Obtención de datos de campos personalizados de una jerarquía de páginas

Imagina que tengo un sitio configurado con páginas en este tipo de jerarquía ...

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

Ahora puedes ver que tengo un montón de coches. En cada una de las páginas del auto (Volvo 850, Porsche 911) tengo algunos campos personalizados donde ingresé varios datos sobre el automóvil (por cierto, estoy usando el complemento de la plantilla del campo personalizado para facilitar la entrada de estos datos en wp-admin). Estos campos se muestran en la página. (los campos no se ingresan en las especificaciones técnicas ni en las páginas de imágenes)

Lo que me gustaría hacer es mostrar una lista en los autos en la página de inicio (a continuación), que obtiene los datos de los campos personalizados. ¿Cuál sería la mejor manera de (a) acceder a estos datos de campo personalizados (que pueden cambiar cuando se agregan o editan autos nuevos), y (b) muestra los datos en un cierto orden (por ejemplo, a velocidad máxima)?

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

Supongo que el pseudo-código es

* 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

Este podría comenzar (este es para el tamaño que puede ver, ya que hago valor 1 por valor 2) (solo para dar un ejemplo de consultas más avanzadas)

 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);

y luego simplemente ejecute el bucle. Escribí una "clase CAR" que, entre otras cosas, muestra campos de metadatos como:

 $car->display_meta_size();

que es en realidad el siguiente método en esa clase:

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

donde el método GetValuesFromWP () es de la clase de metadatos 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];
}

(por lo tanto, en la función de unión totalmente arriba, agregue la (s) selección (es) de página)

1
edelwater