Kenar Çubuğu widget'larında Özel Yazı Türü Verileri?


10

(not: bu soru başlangıçta Özel Alanlar hakkındaydı, ancak @MikeSchinkel, Özel Yazı Türlerini içeren daha iyi bir çözüme sahipti)

Sitemde, kenar çubuğunda aynı verileri göstermek istediğim birkaç sayfa var. Örneğin, böyle bir yapıda:

-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üm Volvo 850 sayfalarının kenar çubuğunda aynı verileri, tüm Porsche sayfalarının farklı bir veri kümesi göstermesini istiyorum (örneğin Speed, Maker, vb.).

Yol sayfalarında her yol için kendi veri kümesi bulunur. Otomobiller ve Yollar da kendi sayfa şablonuna sahip olacak ve doğru kenar çubuğunu alacağımı anlamanın yolu, kenar çubuğu içinde böyle bir şeydir.

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

İşte bir örnek sayfa, Volvo 850 Resimler sayfası. Aynı (sol) kenar çubuğu diğer Volvo 850 sayfalarında görünürken, sağ taraftaki sayfalar sadece sayfa içeriğidir.

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

Bu örnekte, iki kenar çubuğu widget'ı, Özellikler ve Derecelendirme, bilgilerini bir Özel Gönderi Türü'nden alıyor olmalıdır. Son kullanıcının düzenlemesi kolay olacak bir yöntem var mı, yani bu özel verileri yalnızca bir kez girmek zorunda kalacaklar mı? Alanların her birinin ayrı olması gerekli olmayabilir (yani, Spec'in tamamı bir Editör alanına girilebilir ve tüm Reyting Alıntı alanına konabilir .. belki)


2
Güzel bir soru ve başlığı ve soru içeriğini düzenlemeniz için çok teşekkür ederiz; gelecekte benzer bir sorusu olan diğerlerine yardımcı olacaktır.
MikeSchinkel

Yanıtlar:


14

GÜNCELLEME:

Sorunun güncellenmesine dayanarak, soruda sorulan şeyin aşağıdaki cevapla yapılabileceğini açıkça belirtmem gerektiğini düşünüyorum, sadece görüntülenmesini istediğiniz öğelerin her biri için "Araba" özel yazı türünde özel alanlar kullanıldı belirli bir araba için tüm sayfalar.

Bunu yapmak istiyorsanız, sadece kenar çubuğunu single-car.phpaşağıda eklediğim şablon dosyasına sabitleyin ve ardından iffarklı URL'ler için hangi içeriğin görüntüleneceğini belirlemek için ifadenizi kullanın. Kenar çubuğunuzu widget'lamak ve widget'ın mevcut posta kimliği için bilgileri çekeceği özel bir widget geliştirmek için çaba gösterebilirsiniz, ancak bunu başkalarının kullanması için bir tema olarak oluşturmuyorsanız neden ikisi de?

Aslında bunu başarmak için bir sürü ince farklı yol var ama önerdiğim, ihtiyaçlarınız için harika bir şekilde merak etmeli.


Merhaba @cannyboy:

Aslında özel alanları yayınlar arasında paylaşmanın en iyi yolunun ne olacağını bilmiyorum. Ama bu sadece ihtiyacın olan kırmızı bayrak olabilir. Bir şey çok zor görünüyorsa ...

Alternatif Bir Yaklaşım?

... farklı şekillerde mimarlık yapabilir misiniz ? Sana oluşturarak çok daha iyi olacağını düşündüğümüzde Özel Mesaj Tipi ait "Car" ve ardından her biri için her şeyi depolayın "sayfa" one Araç Yayın türüne içine. Aşağıda bazı örnek URL'ler verilmiştir:

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

Özel Gönderi Türleri hakkında bilgi edinme

Özel Soru Türleri hakkında daha fazla bilgiyi şu soruların yanıtlarından edinebilirsiniz:

Özel Yazı Türü ve Yeniden Yazma Kuralı

Özel Yazı Türlerini ve birden çok sayfayı uygulamak için "Araba" Özel Yazı Türünüzü kaydeden ve ardından araba sayfalarınız için bir yeniden yazma kuralı belirleyen aşağıdaki gibi bir kod kullanırsınız . Bu kodu functions.php, hangisini tercih ederseniz edin temanızın dosyasına veya bir eklentiye yerleştirin:

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

Bir araba ya spesifik Tema Şablon Dosyası

Sonra edeceğiz bir ihtiyaç Araç Temanızın 'e özgü şablon dosyasını ; bunun için varsayılan ad olacaktır single-car.php. Hangi içeriğin oluşturulacağını belirlemek için bir if ifadesi kullanarak URL'lerin üçünü ( (genel bakış) , 'teknik özellikler' ve 'resimler' ) tek bir şablonda oluşturan bir başlangıç ​​şablonunu kodladım:

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

Yukarıdaki örnekte ben kullanımı ile çok basit olduğumu unutmayın get_post_meta(); gerçek sitenin orada çok daha karmaşık olması gerekir.

Şablon Etiketleri aka Yardımcı İşlevleri

Elbette, if deyimi koşullarında şablon dosyasındaki karmaşıklığı en aza indirmek için yardımcı işlevler olarak da adlandırılan bazı şablon etiketleri kullandım . İşte buradalar ve bunları temanızın functions.phpdosyasına da koyabilirsiniz :

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

Custom Post Type Love ile dolu ekran görüntüleri

Tüm bu kodları yerleştirdikten ve Volvo 850 gibi bir Araba direği ekledikten sonra, aşağıdaki ekran görüntüleri gibi çalışmasını sağlayabilirsiniz:

Genel Bakış Sayfası

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

Teknik Özellikler Sayfası

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

Resimler Sayfası

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


1
Çok hoş. Teknik özelliklerin vb. Bilgilerinin dinamik olması için nasıl kurarsınız (örneğinizde olduğu gibi sabit kodludan ziyade)?
Travis Northcutt

1
Bu zor bir soru, bu yüzden kullanım durumunuzu veya sadece soyut bir varsayımsal olup olmadığını anlamam gerekiyor mu? Bunu yapabilirim çünkü potansiyel maçların sonlu listesini biliyorum. "Herhangi bir şeyle eşleş" olsaydı, WordPress'in diğer eşleme kalıplarını geçersiz kılardı. Bana somut bir örnek verin ve bir çözüm vereceğim, aksi takdirde bir kutu solucan.
MikeSchinkel

Harika cevabınız için teşekkürler. Daha önce Özel Yazı Türlerine hiç girmemiştim ve ideal bir çözüm gibi görünüyorlar.
Sorumu

Sadece bir varsayım. Ayrıntılı olarak - (örneğin) teknik özellikler sayfasındaki bilgilerin bir yere yönetici kontrol paneline girilmesi için nasıl ayarlayabileceğinizi merak ediyorum (özel bir yazı türü, belki de arabayı ayarlamak için bir sınıflandırma kullanarak?), şablon dosya yerine.
Travis Northcutt

@tnorthcutt - "Teknik özellikler sayfasındaki bilgiler" dediğinizde "alt sayfaların listesini mi kastediyorsunuz?" Yoksa özel alanlar mı demek istediniz? İkincisi bilginin özel alanlarda saklanacağını varsayarsam. Örneğim bunu göstermedi; belki de olmalı?
MikeSchinkel

1

Sanırım birisi, yayınladığınız diğer soruda (üst sayfalar / ara sayfalar hakkında) zaten bu tür bir cevap vermiş olabilir, ancak açıkladığınız bilgilere dayanarak verilerinizi yapılandırmanın en iyi yolunun bu olduğunu düşünüyorum:

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

Bu şekilde meta alanları yalnızca bir kez girmeniz gerekir - üst sayfada - ve alt sayfalarda bu meta verileri üst öğeden alabilirsiniz:

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

Tabii ki, bunu düzenlemenin daha iyi bir yolu, tüm araç bilgilerini depolayan ve sayfaya geçen ve kullanılan bir GET isteğine dayalı olarak çeşitli alt sayfaları görüntüleyen her araba modeli için tek bir özel yazı tipine sahip olmak olacaktır. görüntülenecek şablonu belirlemek için sayfa şablonunu bir anahtar olarak kullanın. Bu şekilde, verilerin kopyalanmasını tamamen önleyebilir ve daha sonra şablona daha fazla bilgi eklemeyi kolaylaştırabilirsiniz ...

Daha fazla detay...

Birkaç farklı yoldan yaptım. Özel bir yazı türü olarak aracıları (şirket temsilcileri) olan bir sitede, bu kişiyle ilgili tüm verileri depolamak için yayınlarını kullandım, ancak aslında bu sayfayı hiç göstermedim. Bunun yerine, bir "Aracı Listeleme" sayfası, bir "Aracı Performans Kaydı" sayfası ve her zaman bir GET değişkeni ile çağrılan ve uygun gönderinin dışında bilgi görüntülenen bir "Bu Aracıya Başvurun" sayfası vardı. Böylece kalıcı bağlantı site.com/agent-listing/?agent=john-smith gibi görünecektir .

Başka bir sitede, bir sayfada tüm bilgileri ayarladım ve o sayfa için üç görünümün tümünü sayfa şablonuna oluşturdum. Sizin durumunuzda, site.com/cars/volvo-850/?pictures gibi bir şey olurdu .

Sayfa şablonuna, içeriğin üst kısmına yakın bir değişken için bir kontrol eklersiniz:

if ($_GET['pictures']) {

 // template for pictures page

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

 // template for tech specs page 

} else {

 // overview template

}

Çok teşekkürler! Son öneriniz için, tüm bu Özel Alanları içeren boş bir sayfa (belki de 'Volvo 850 Widget Data' olarak adlandırılır) oluşturduğumu mu söylüyorsunuz ve diğer Volvo 850 sayfaları bu verileri otomatik olarak alıyor (er, bir şekilde)? (bu,
görünüşte

Her iki şekilde de yaptım. Yukarıdaki cevabımı açıklamak için düzenledim. Sonuç olarak, yaptığınız gibi, menü oluşturma işleminizin ne kadar otomatik olmasını istediğinize bağlıdır.
goldenapples

Hata. Sadece biraz daha okudum ve Mike'ın söylediğimi tam olarak cevapladığını fark ettim.
goldenapples

0

Özel gönderi türleri oluşturmak istemiyorsanız ve her sayfa veya gönderi için özel bir kenar çubuğu eklemek istiyorsanız, Zarif Kenar Çubuğu Eklentisi'ni kullanabilirsiniz. Bu, zarif başlık ve zarif içerik adı verilen ek alanları kullanarak doğrudan gönderi veya sayfa düzenleme ekranından özel kenar çubuğu içeriği oluşturmanıza olanak tanır. Blogunuzda bu yayın veya sayfa görüntülendiğinde bunlar kenar çubuğu alanında widget olarak görüntülenir. Bu eklenti hakkında daha fazla bilgiyi http://www.mlynn.org/graceful-sidebar-plugin adresinde bulabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.