Data Jenis Pos Ubahsuaian di widget Bilah Samping?

10

(catatan: pertanyaan ini awalnya tentang Bidang Kustom, tetapi @MikeSchinkel memiliki solusi yang lebih baik yang melibatkan Jenis Posting Kustom)

Di situs saya, saya memiliki beberapa halaman yang ingin saya tampilkan data yang sama di sidebar. Misalnya, dalam struktur seperti ini:

-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

Saya ingin semua halaman Volvo 850 untuk menampilkan data yang sama di sidebar, semua halaman Porsche untuk menunjukkan kumpulan data yang berbeda (misalnya Kecepatan, Pembuat, dll.).

Halaman Road akan memiliki set data sendiri untuk setiap jalan. Mobil dan Jalan juga akan memiliki templat laman di sana, dan cara saya mengira akan mendapatkan bilah sisi kanan adalah sesuatu seperti ini di dalam sidebar.php:

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

Berikut ini contoh halaman, halaman Volvo 850 Pictures. Bilah samping (kiri) yang sama akan muncul di halaman Volvo 850 lainnya, sementara yang di sebelah kanan hanyalah konten halaman.

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

Dalam contoh ini, dua widget bilah sisi, Spesifikasi dan Peringkat harus mendapatkan informasinya dari Jenis Posting Kustom. Apakah ada metode, yang akan mudah bagi pengguna akhir untuk mengedit, yang berarti bahwa mereka harus memasukkan data khusus ini hanya sekali? Mungkin tidak perlu untuk masing-masing bidang dipisahkan (yaitu semua Spec dapat dimasukkan dalam bidang Editor, dan semua Peringkat bisa dimasukkan ke dalam bidang Kutipan .. mungkin)

cannyboy
sumber
2
Pertanyaan yang bagus dan sangat menghargai pengeditan judul dan isi pertanyaan Anda untuk kejelasan; itu akan membantu orang lain yang memiliki pertanyaan serupa di masa depan.
MikeSchinkel

Jawaban:

14

MEMPERBARUI:

Berdasarkan pembaruan pertanyaan, saya pikir saya perlu secara eksplisit menyatakan bahwa apa yang ditanyakan dalam pertanyaan dapat dilakukan dengan jawaban di bawah ini, hanya menggunakan bidang khusus dalam jenis posting kustom "Mobil" untuk setiap item yang ingin Anda tampilkan di semua halaman untuk mobil tertentu.

Jika Anda ingin melakukannya, cukup single-car.phpmasukkan hardcode sidebar ke file templat yang saya sertakan di bawah ini dan kemudian gunakan ifpernyataan Anda untuk menentukan konten mana yang akan ditampilkan untuk URL yang berbeda. Anda dapat melakukan upaya untuk membuat widget bilah sisi dan mengembangkan widget khusus tempat widget akan menarik informasi untuk ID posting saat ini, tetapi mengapa keduanya kecuali Anda membuat ini sebagai tema untuk digunakan orang lain?

Sebenarnya ada banyak cara yang agak berbeda untuk mencapai hal ini, tetapi yang saya sarankan haruslah luar biasa untuk kebutuhan Anda.


Hai @cannyboy:

Saya sebenarnya tidak tahu apa cara terbaik untuk membagikan bidang khusus di seluruh posting. Tapi itu mungkin saja bendera merah yang Anda butuhkan. Jika sesuatu tampak terlalu sulit mungkin ...

Pendekatan Alternatif?

... Anda dapat mempertimbangkan untuk membuat arsitektur berbeda ? Saya pikir Anda akan jauh lebih baik menciptakan Kustom Pos Jenis dari "Car" dan kemudian Anda dapat menyimpan segala sesuatu untuk setiap "halaman" ke dalam salah satu mobil jenis posting. Berikut beberapa contoh URL:

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

Belajar tentang Jenis Pos Kustom

Anda dapat mempelajari lebih lanjut tentang Jenis Posting Kustom di jawaban atas pertanyaan-pertanyaan ini:

Jenis Posting Kustom dan Aturan Menulis Ulang

Untuk menerapkan Jenis Posting Kustom dan beberapa halaman Anda akan menggunakan kode seperti berikut yang mendaftarkan Tipe Posting Kustom "Mobil" Anda dan kemudian menetapkan aturan penulisan ulang untuk halaman mobil Anda . Masukkan kode ini di functions.phpfile tema Anda atau di plugin, mana yang Anda inginkan:

<?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
}

Sebuah Mobil -specific Tema Template Berkas

Maka Anda akan membutuhkan file templat khusus- Mobil dalam tema Anda ; nama default untuk ini adalah single-car.php. Saya telah memberi kode templat pemula untuk Anda yang merender ketiga URL ( (tinjauan umum) , 'spesifikasi teknologi' dan 'gambar' ) dalam satu templat dengan menggunakan pernyataan if untuk menentukan konten mana yang akan di-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(); ?>

Catatan dalam contoh di atas saya menjadi sangat sederhana dengan penggunaan get_post_meta(); situs nyata perlu memiliki lebih banyak kerumitan di sana.

Tag Templat alias Fungsi Pembantu

Tentu saja saya menggunakan beberapa tag templat alias fungsi pembantu untuk meminimalkan kerumitan pada file templat di pernyataan kondisi if . Ini mereka dan Anda dapat meletakkan ini di functions.phpfile tema Anda juga:

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

Cuplikan layar diisi dengan Love Post Type Love

Setelah Anda memiliki semua kode itu dan Anda telah menambahkan sebuah pos Mobil seperti Volvo 850 Anda dapat membuatnya berfungsi seperti tangkapan layar berikut:

Halaman Tinjauan

http://example.com/cars/volvo850/
(sumber: mikeschinkel.com )

Halaman Spesifikasi Teknis

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

Halaman Gambar

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

MikeSchinkel
sumber
1
Sangat bagus. Bagaimana Anda mengaturnya sehingga spesifikasi teknologi, dll. Informasi bersifat dinamis (bukan kode keras, seperti dalam contoh Anda)?
Travis Northcutt
1
Itu pertanyaan yang sulit jadi saya perlu memahami kasus penggunaan Anda atau jika itu hanya hipotesis abstrak? Saya dapat melakukan ini karena saya tahu daftar terbatas dari pasangan potensial. Jika "cocok dengan apa saja", itu akan menimpa pola kecocokan lainnya dari WordPress. Berikan saya contoh nyata dan saya akan memberikan solusi kalau tidak itu adalah kaleng cacing.
MikeSchinkel
Terima kasih atas jawaban Anda yang luar biasa. Saya belum pernah menggali Jenis Pos Kustom sebelumnya, dan mereka tampak seperti solusi yang ideal. Saya telah memperbarui pertanyaan saya dengan beberapa lebih spesifik, terutama yang berkaitan dengan sidebars / widget
cannyboy
@ Mike Hanya hipotesis. Untuk menguraikan - Saya ingin tahu bagaimana Anda dapat mengaturnya sehingga informasi pada halaman (misalnya) spesifikasi teknologi dimasukkan di dasbor admin di suatu tempat (jenis pos kustom, mungkin, menggunakan taksonomi untuk mengatur mobil?), sebagai lawan dalam file templat.
Travis Northcutt
@tnorthcutt - Saya berasumsi ketika Anda mengatakan "informasi pada halaman spesifikasi teknologi" yang Anda maksudkan "daftar sub-halaman?" Atau maksud Anda bidang khusus? Jika yang terakhir saya berasumsi bahwa informasi tersebut akan disimpan di bidang khusus. Contoh saya tidak menunjukkan itu; mungkin seharusnya?
MikeSchinkel
1

Saya pikir seseorang mungkin sudah menjawab pertanyaan ini pada pertanyaan lain yang Anda posting (tentang halaman induk / halaman perantara), tetapi inilah yang saya pikir cara terbaik untuk menyusun data Anda, berdasarkan apa yang telah Anda jelaskan:

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

Dengan begitu Anda hanya perlu memasukkan bidang meta satu kali - pada halaman induk - dan pada halaman anak-anak Anda dapat menarik data meta itu dari induk:

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

Tentu saja, cara yang lebih baik untuk mengatur ini adalah dengan memiliki satu jenis pos khusus untuk setiap model mobil yang menyimpan semua informasi mobil, dan menampilkan berbagai subhalaman berdasarkan permintaan GET yang diteruskan ke halaman dan digunakan dalam templat halaman sebagai sakelar untuk menentukan templat mana yang akan ditampilkan. Dengan begitu Anda benar-benar dapat menghindari duplikasi data, dan membuatnya lebih mudah untuk menambahkan lebih banyak informasi ke templat nanti ...

Keterangan lebih lanjut...

Saya telah melakukannya dengan beberapa cara berbeda. Di satu situs di mana saya memiliki agen (perwakilan perusahaan) sebagai jenis posting khusus, saya menggunakan posting mereka untuk menyimpan semua data yang terkait dengan orang itu, tetapi tidak pernah benar-benar menampilkan halaman itu. Sebaliknya, saya memiliki halaman "Daftar Agen", halaman "Catatan Kinerja Agen", dan halaman "Hubungi Agen ini", yang selalu dipanggil dengan variabel GET dan menampilkan informasi dari pos yang sesuai. Jadi permalink akan terlihat seperti site.com/agent-listing/?agent=john-smith .

Di situs lain, saya mengatur semua informasi pada satu halaman dan membangun ketiga tampilan untuk halaman tersebut ke dalam templat halaman. Dalam kasus Anda, itu akan terlihat seperti gambar site.com/cars/volvo-850/ ?

Dan dalam templat halaman Anda akan menyertakan cek untuk variabel itu di dekat bagian atas konten:

if ($_GET['pictures']) {

 // template for pictures page

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

 // template for tech specs page 

} else {

 // overview template

}
lempengan emas
sumber
Terima kasih banyak! Untuk saran terakhir Anda, maksud Anda saya membuat halaman kosong (mungkin disebut 'Data Widget Volvo 850') yang memiliki semua Bidang Kustom ini, dan halaman Volvo 850 lainnya secara otomatis mengambil data ini (eh, entah bagaimana)? (ini berarti saya harus membuat menu secara manual di Appearance> Menu, yang saya lakukan tetap) ... Atau mungkin data dapat diambil dari Custom Fields halaman Ikhtisar ...
cannyboy
Saya sudah melakukan keduanya. Saya mengedit jawaban saya di atas untuk menjelaskan. Apa yang akhirnya Anda lakukan sangat tergantung pada seberapa otomatis Anda ingin membuat menu Anda, seperti yang Anda katakan.
goldapples
Ups. Saya hanya membaca lebih lanjut dan menyadari Mike sudah menjawab dengan tepat apa yang saya katakan.
goldapples
0

Jika Anda tidak ingin membuat jenis posting khusus, dan Anda hanya ingin menyertakan sidebar khusus untuk setiap halaman atau posting, Anda bisa menggunakan Plugin Sidebar Anggun. Ini memungkinkan membuat konten sidebar khusus langsung dari dalam layar edit halaman atau halaman menggunakan bidang tambahan yang disebut judul anggun dan konten anggun. Ini kemudian ditampilkan di area sidebar sebagai widget ketika posting atau halaman ini ditampilkan di blog Anda. Informasi lebih lanjut tentang plugin ini tersedia di http://www.mlynn.org/graceful-sidebar-plugin

Michael Lynn
sumber