Imagine que eu tenha um site configurado com páginas nesse tipo de hierarquia.
-Home
-Cars
-Volvo 850
-Volvo 850 tech spec
-Volvo 850 pictures
-Porsche 911
-Porsche 911 tech spec
-Porsche 911 pictures
-other cars etc
Agora você pode ver que eu tenho um monte de carros. Em cada uma das páginas do carro (Volvo 850, Porsche 911) eu tenho alguns campos personalizados onde eu inseri vários dados sobre o carro (a propósito, estou usando o plugin de modelo de campo personalizado para facilitar a entrada desses dados no wp-admin). Esses campos são exibidos na página. (os campos não são inseridos nas páginas de especificações técnicas e imagens)
O que eu gostaria de fazer é exibir uma lista dos carros na página inicial (abaixo), que obtém os dados dos campos personalizados. Qual seria a melhor maneira de (a) acessar esses dados de campo personalizados (que podem mudar quando carros novos são adicionados ou editados) e (b) exibir os dados em uma determinada ordem (por exemplo, velocidade máxima) ..?
---------------------------------------
| Car | Top Speed |
---------------------------------------
| Porsche 911 | 200 |
| Audi 444 | 180 |
| Volvo 840 | 160 |
---------------------------------------
Eu acho que o pseudo-código é
* 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
Este pode começar (este é para o tamanho, como você pode ver, desde que eu valorize 1 vezes o valor 2) (apenas para dar um exemplo de consultas mais avançadas)
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);
e, em seguida, apenas executar o loop eu escrevi uma "classe CAR", que entre outros exibe meta campos, tais como:
$car->display_meta_size();
que é realmente o seguinte método nessa 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
}
onde o método GetValuesFromWP () é da classe de metadados 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];
}
(então, na função de junção totalmente acima, adicione a (s) seleção (ões) da página)