it-swarm-vi.tech

Lấy dữ liệu Trường tùy chỉnh từ phân cấp trang

Hãy tưởng tượng tôi có một trang web được thiết lập với các trang theo kiểu phân cấp này ..

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

Bây giờ bạn có thể thấy rằng tôi có một loạt Ô tô. Trên mỗi trang xe hơi (Volvo 850, Porsche 911) Tôi có một số Trường tùy chỉnh nơi tôi đã nhập nhiều dữ liệu khác nhau về Xe hơi (nhân tiện, tôi đang sử dụng plugin để giúp nhập dữ liệu này dễ dàng trong wp-admin). Các trường này được hiển thị trên trang. (các trường không được nhập trên trang hình ảnh và thông số kỹ thuật)

Những gì tôi muốn làm là hiển thị một danh sách trên những chiếc xe trên Trang chủ (bên dưới), lấy dữ liệu từ Trường tùy chỉnh. Điều gì sẽ là cách tốt nhất để (a) truy cập dữ liệu trường tùy chỉnh này (có thể thay đổi khi xe mới được thêm hoặc chỉnh sửa) và (b) hiển thị dữ liệu theo thứ tự nhất định (ví dụ theo tốc độ tối đa) ..?

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

Tôi đoán mã giả là

* 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

Cái này có thể giúp bạn bắt đầu (cái này dành cho kích thước như bạn có thể thấy vì tôi làm giá trị 1 lần giá trị 2) (chỉ để đưa ra một ví dụ về các truy vấn nâng cao hơn)

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

và sau đó chỉ cần chạy vòng lặp tôi đã viết một "lớp CAR", trong số những người khác hiển thị các trường meta như:

 $car->display_meta_size();

đó thực sự là phương thức sau trong lớp đó:

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

trong đó phương thức GetValuesFromWP () là từ lớp siêu dữ liệu 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];
}

(vì vậy, trong hàm tham gia hoàn toàn ở trên, thêm (các) lựa chọn trang)

1
edelwater