Dữ liệu loại bài đăng tùy chỉnh trong các tiện ích thanh bên?


10

(lưu ý: câu hỏi này ban đầu là về Trường tùy chỉnh, nhưng @MikeSchinkel có giải pháp tốt hơn liên quan đến Loại bài đăng tùy chỉnh)

Trên trang web của tôi, tôi có một vài trang mà tôi muốn hiển thị cùng một dữ liệu trong thanh bên. Chẳng hạn, trong một cấu trúc như thế này:

-Home
-Cars 
 -Volvo 850 overview 
 -Volvo 850 tech spec 
 -Volvo 850 pictures
 -Porsche 911 overview
 -Porsche 911 tech spec
 -Porsche 911 pictures
-Roads 
 -Route 66 overview 
 -Route 66 history 
 -Route 66 pictures
 -Pan-American Highway overview
 -Pan-American Highway history
 -Pan-American Highway pictures

Tôi muốn tất cả các trang Volvo 850 hiển thị cùng một dữ liệu trong thanh bên, tất cả các trang của Porsche để hiển thị một bộ dữ liệu khác nhau (ví dụ: Tốc độ, Trình tạo, v.v.).

Các trang Đường sẽ có bộ dữ liệu riêng cho từng đường. Ô tô và Đường cũng sẽ có mẫu trang riêng và cách tôi hình dung nó sẽ có thanh bên phải giống như thế này trong sidebar.php:

if ( is_page_template('car-profile-template.php') ) :
// show car widgets

Đây là một trang ví dụ, trang Volvo 850 Pictures. Thanh bên tương tự (bên trái) sẽ xuất hiện trên các trang Volvo 850 khác, trong khi nội dung bên phải chỉ là nội dung trang.

|  Home   Cars   Roads                                |
--------------------------------------------------------
|   Overview     |     Volvo 840 Pictures              |
|   Tech Spec    |    (some pics)                      |
|  Pictures     |                                     |
------------------                                     |
| -Specs-        |                                     |
| Volvo 850      |                                     |
| Speed:150mph   |                                     |
| Maker:Volvo    |                                     |  
| Download PDF   |                                     |
------------------                                     |
| -Rating-       |                                     |
| Style:3        |                                     |
| Safety:5       |                                     |
| Reliablity:4   |                                     |
------------------                                     |

Trong ví dụ này, hai tiện ích thanh bên, Thông số kỹ thuật và Xếp hạng sẽ nhận được thông tin của họ từ Loại bài đăng tùy chỉnh. Có một phương pháp, người dùng cuối có thể dễ dàng chỉnh sửa, điều đó có nghĩa là họ sẽ chỉ phải nhập dữ liệu tùy chỉnh này một lần? Có thể không cần thiết cho mỗi trường riêng biệt (nghĩa là tất cả Spec có thể được nhập trong trường Trình chỉnh sửa và tất cả Xếp hạng có thể được đặt trong trường Trích dẫn .. có thể)


2
Câu hỏi hay và thực sự đánh giá cao việc bạn chỉnh sửa tiêu đề và nội dung câu hỏi cho rõ ràng; nó sẽ giúp những người khác có câu hỏi tương tự trong tương lai.
MikeSchinkel

Câu trả lời:


14

CẬP NHẬT:

Dựa trên bản cập nhật của câu hỏi, tôi nghĩ rằng tôi cần phải nói rõ rằng những gì được hỏi trong câu hỏi có thể được thực hiện với câu trả lời bên dưới, chỉ sử dụng các trường tùy chỉnh trong loại bài đăng tùy chỉnh "Xe hơi" cho mỗi mục bạn muốn hiển thị trên tất cả các trang cho một chiếc xe nhất định.

Nếu bạn muốn làm điều đó chỉ cần mã hóa cứng thanh bên vào single-car.phptệp mẫu tôi đưa vào bên dưới và sau đó sử dụng ifcâu lệnh của bạn để xác định nội dung nào sẽ hiển thị cho các URL khác nhau. Bạn có thể nỗ lực để tiện ích hóa thanh bên của mình và phát triển một tiện ích tùy chỉnh trong đó tiện ích sẽ lấy thông tin cho ID bài đăng hiện tại, nhưng tại sao cả hai trừ khi bạn xây dựng nó làm chủ đề cho người khác sử dụng?

Thực tế có một loạt các cách khác nhau tinh tế để thực hiện điều này nhưng cách tôi đang đề xuất nên tuyệt vời cho nhu cầu của bạn.


Xin chào @cannyboy:

Tôi thực sự không biết cách tốt nhất để chia sẻ các trường tùy chỉnh trên các bài đăng. Nhưng đó có thể chỉ là lá cờ đỏ bạn cần. Nếu có gì đó quá khó có lẽ ...

Một cách tiếp cận thay thế?

... bạn có thể shonsider kiến trúc nó khác nhau ? Tôi nghĩ rằng bạn sẽ có nhiều tốt hơn hết tạo ra một Tuỳ chỉnh Type Bài của "Car" và sau đó bạn có thể lưu trữ tất cả mọi thứ cho mỗi "trang" vào bài một xe loại. Dưới đây là một số URL mẫu:

http://example.com/cars/volvo850/  <-- overview
http://example.com/cars/volvo850/tech-specs/
http://example.com/cars/volvo850/pictures/

Tìm hiểu về các loại bài tùy chỉnh

Bạn có thể tìm hiểu thêm về Loại bài đăng tùy chỉnh tại các câu trả lời cho những câu hỏi sau:

Một loại bài đăng tùy chỉnh và một quy tắc viết lại

Để triển khai Loại bài đăng tùy chỉnh và nhiều trang bạn sử dụng mã như sau đây đăng ký Loại bài đăng tùy chỉnh "Xe hơi" của bạn và sau đó đặt quy tắc viết lại cho các trang xe của bạn . Đặt mã này vào functions.phptệp chủ đề của bạn hoặc trong một plugin, tùy theo bạn thích:

<?php
add_action('init','car_init');
function car_init() {
  register_post_type('car',
    array(
      'label'           => 'Cars',
      'public'          => true,
      'show_ui'         => true,
      'query_var'       => 'car',
      'rewrite'         => array('slug' => 'cars'),
      'hierarchical'    => true,
      //'supports'        => array('title','editor','custom-fields'),
    )
  );
  global $wp,$wp_rewrite;
  $wp->add_query_var('car-page');
  $wp_rewrite->add_rule('cars/([^/]+)/(tech-specs|pictures)','index.php?car=$matches[1]&car-page=$matches[2]', 'top');
  $wp_rewrite->flush_rules(false);  // This should really be done in a plugin activation
}

Một xe cụ thể Theme Template file

Sau đó, bạn sẽ cần một tệp mẫu Xe hơi cụ thể trong chủ đề của bạn ; tên mặc định cho việc này sẽ là single-car.php. Tôi đã được mã hóa một mẫu bắt đầu cho bạn mà ám cả ba trong số các URL (các (tổng quan) , 'công nghệ-kỹ thuật''hình ảnh' ) trong một mẫu bằng cách sử dụng một nếu tuyên bố để xác định nội dung để render:

<?php get_header(); ?>
<div id="container">
  <div id="content">
  <?php if ( have_posts() ): the_post(); ?>
    <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
    <h1 class="entry-title"><?php the_title(); ?></h1>
    <div class="entry-content">
<?php if(is_car_techspecs()): ?>
  <a href="..">Back</a>
  <h1>Tech Specs</h1>
  The tech specs go here!
  <?php get_post_meta($post->ID,'_car_tech_specs'); ?>
<?php elseif (is_car_pictures()): ?>
  <a href="..">Back</a>
  <h1>Pictures</h1>
  Car Pictures go here!
  <?php get_post_meta($post->ID,'_car_pictures'); ?>
<?php else: ?>
  <ul>
    <h1>Overview</h1>
    <li><a href="tech-specs/">Tech Specs</a></li>
    <li><a href="pictures/">Pictures</a></li>
  </ul>
  <?php the_content(); ?>
<?php endif; ?>
      <?php the_content(); ?>
    </div>
  <?php endif; ?>
  </div>
</div>
<?php get_sidebar(); ?>
<?php get_footer(); ?>

Lưu ý trong ví dụ trên tôi rất đơn giản với việc sử dụng get_post_meta(); trang web thực sự sẽ cần phải có nhiều phức tạp hơn ở đó.

Thẻ mẫu aka Hàm trợ giúp

Dĩ nhiên tôi đã sử dụng một số mẫu thẻ aka hàm trợ giúp để giảm thiểu sự phức tạp trong mẫu tập tin trong nếu điều kiện tuyên bố. Chúng ở đây và bạn cũng có thể đặt chúng trong functions.phptệp chủ đề của mình :

function is_car_techspecs() {
  global $wp_query;
  return is_car_page('tech-specs');
}
function is_car_pictures() {
  global $wp_query;
  return is_car_page('pictures');
}

function is_car_page($page) {
  global $wp_query;
  return (isset($wp_query->query['car-page']) && $wp_query->query['car-page']==$page);
}

Ảnh chụp màn hình với Loại bài tùy chỉnh Tình yêu

Khi bạn đã có tất cả mã đó và bạn đã thêm một bài đăng trên Xe hơi như Volvo 850, bạn có thể làm cho nó hoạt động như các ảnh chụp màn hình sau:

Trang tổng quan

http://example.com/cars/volvo850/
(nguồn: mikechinkel.com )

Trang thông số kỹ thuật

http://example.com/cars/volvo850/tech-specs/

Trang hình ảnh

http://example.com/cars/volvo850/pictures/


1
Rất đẹp. Làm thế nào bạn sẽ thiết lập nó để thông số kỹ thuật, vv thông tin là động (chứ không phải mã hóa cứng, như trong ví dụ của bạn)?
Travis Northcutt

1
Đó là một câu hỏi khó vì vậy tôi cần hiểu trường hợp sử dụng của bạn hoặc nếu đó chỉ là một giả thuyết trừu tượng? Tôi có thể làm điều này bởi vì tôi biết danh sách hữu hạn của các trận đấu tiềm năng. Nếu nó là "khớp bất cứ thứ gì" thì nó sẽ ghi đè lên các mẫu so khớp khác của WordPress. Hãy cho tôi một ví dụ cụ thể và tôi sẽ đưa ra giải pháp nếu không đó là một con giun.
MikeSchinkel

Cảm ơn câu trả lời tuyệt vời của bạn. Tôi chưa bao giờ đi sâu vào các loại bài đăng tùy chỉnh trước đây và chúng có vẻ như là một giải pháp lý tưởng. Tôi đã cập nhật câu hỏi của mình với một vài chi tiết cụ thể, chủ yếu là để thực hiện với sidebars / widget
cannyboy

@mike Chỉ là giả thuyết. Để giải thích - Tôi tự hỏi làm thế nào bạn có thể thiết lập nó để thông tin trên trang thông số kỹ thuật (ví dụ) được nhập vào bảng điều khiển quản trị ở đâu đó (loại bài đăng tùy chỉnh, có thể, sử dụng phân loại để đặt xe?), trái ngược với trong tệp mẫu.
Travis Northcutt

@tnorthcutt - Tôi giả sử khi bạn nói "thông tin trên trang thông số kỹ thuật" bạn có nghĩa là "danh sách các trang phụ?" Hay bạn có nghĩa là các lĩnh vực tùy chỉnh? Nếu sau này tôi giả sử rằng thông tin sẽ được lưu trữ trong các trường tùy chỉnh. Ví dụ của tôi đã không cho thấy điều đó; có lẽ nó nên có?
MikeSchinkel

1

Tôi nghĩ ai đó có thể đã trả lời câu hỏi này cho câu hỏi khác mà bạn đã đăng (về trang mẹ / trang trung gian), nhưng đây là cách tôi nghĩ cách tốt nhất để cấu trúc dữ liệu của bạn, dựa trên những gì bạn đã mô tả:

 - Home
 - Volvo 850 (overview)
   - Volvo 850 tech spec
   - Volvo 850 pictures
 - Porsche 911 (overview)
   - Porsche 911 tech spec
   - Porsche 911 pictures

Bằng cách đó, bạn chỉ phải nhập các trường meta một lần - trên trang mẹ - và trên các trang con bạn có thể lấy dữ liệu meta đó từ cha mẹ:

<?php echo 'Top speed: '.get_post_meta($post->post_parent,'Top Speed',true); ?>

Tất nhiên, cách tốt hơn để tổ chức việc này là có một loại bài đăng tùy chỉnh duy nhất cho mỗi kiểu xe lưu trữ tất cả thông tin của xe và hiển thị các trang con khác nhau dựa trên yêu cầu GET được chuyển đến trang và được sử dụng trong mẫu trang như một công tắc để xác định mẫu nào sẽ hiển thị. Bằng cách đó, bạn hoàn toàn có thể tránh trùng lặp dữ liệu và giúp dễ dàng thêm thông tin vào mẫu sau này trên ...

Thêm chi tiết ...

Tôi đã thực hiện nó một vài cách khác nhau. Trong một trang web nơi tôi có đại lý (đại diện công ty) làm loại bài đăng tùy chỉnh, tôi đã sử dụng bài đăng của họ để lưu trữ tất cả dữ liệu liên quan đến người đó, nhưng thực sự chưa bao giờ hiển thị trang đó. Thay vào đó, tôi đã có trang "Danh sách đại lý", trang "Bản ghi hiệu suất đại lý" và trang "Liên hệ với đại lý này", luôn được gọi với biến GET và hiển thị thông tin từ bài đăng thích hợp. Vì vậy, permalink sẽ trông giống như site.com/agent-listing/?agent=john-smith .

Trong một trang web khác, tôi thiết lập tất cả thông tin trên một trang và xây dựng cả ba chế độ xem cho trang đó vào mẫu trang. Trong trường hợp của bạn, nó sẽ trông giống như site.com/cars/volvo-850/?pictures .

Và trong mẫu trang, bạn sẽ bao gồm một kiểm tra cho biến đó ở gần đầu nội dung:

if ($_GET['pictures']) {

 // template for pictures page

} else if ($_GET['tech-spec']) {

 // template for tech specs page 

} else {

 // overview template

}

Cảm ơn rất nhiều! Đối với đề xuất cuối cùng của bạn, bạn có nghĩa là tôi tạo một trang trống (có lẽ là 'Dữ liệu tiện ích Volvo 850') có tất cả các Trường tùy chỉnh này và các trang Volvo 850 khác sẽ tự động lấy dữ liệu này (er, bằng cách nào đó)? (điều này có nghĩa là tôi phải xây dựng các menu theo cách thủ công trong Giao diện> Menu, dù sao tôi cũng đang làm) ... Hoặc có lẽ dữ liệu có thể được lấy từ Trường tùy chỉnh của trang Tổng quan ...
cannyboy

Tôi đã làm cả hai cách. Tôi chỉnh sửa câu trả lời của tôi ở trên để giải thích. Những gì bạn kết thúc làm phụ thuộc rất nhiều vào cách bạn muốn tự động tạo menu, như bạn đã nói.
Goldenapples

Giáo sư. Tôi chỉ đọc thêm và nhận ra Mike đã trả lời chính xác những gì tôi đang nói.
Goldenapples

0

Nếu bạn không muốn tạo các loại bài đăng tùy chỉnh và bạn chỉ muốn bao gồm một thanh bên tùy chỉnh cho mỗi trang hoặc bài đăng, bạn có thể sử dụng Trình cắm thanh bên duyên dáng. Điều này cho phép tạo nội dung thanh bên tùy chỉnh ngay trong màn hình chỉnh sửa bài hoặc trang bằng cách sử dụng các trường bổ sung được gọi là tiêu đề duyên dáng và nội dung duyên dáng. Chúng sau đó được hiển thị trong khu vực thanh bên dưới dạng tiện ích khi bài đăng hoặc trang này đang được hiển thị trên blog của bạn. Thông tin thêm về plugin này có sẵn tại http://www.mlynn.org/graceful-sidebar-plugin

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.