Niestandardowe dane typu postu w widżetach paska bocznego?

10

(uwaga: pierwotnie to pytanie dotyczyło pól niestandardowych, ale @MikeSchinkel ma lepsze rozwiązanie z niestandardowymi typami postów)

Na mojej stronie mam kilka stron, które chcę wyświetlać te same dane na pasku bocznym. Na przykład w takiej strukturze:

-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

Chciałbym, aby wszystkie strony Volvo 850 pokazywały te same dane na pasku bocznym, wszystkie strony Porsche pokazywały inny zestaw danych (na przykład Speed, Maker itp.).

Strony Drogi miałyby własny zestaw danych dla każdej drogi. Samochody i drogi również miałyby tam własny szablon strony, a sposób, w jaki myślę, że uzyskałby prawy pasek boczny, jest mniej więcej taki w obrębie sidebar.php:

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

Oto przykładowa strona, strona Volvo 850 Pictures. Ten sam (lewy) pasek boczny powinien pojawić się na innych stronach Volvo 850, a elementy po prawej to tylko treść strony.

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

W tym przykładzie dwa widżety paska bocznego, specyfikacje i ocena powinny otrzymywać swoje informacje z niestandardowego typu postu. Czy istnieje metoda, którą użytkownik końcowy mógłby łatwo edytować, co oznacza, że ​​musiałby wprowadzić te dane niestandardowe tylko raz? Może nie być konieczne, aby każde z pól było oddzielne (tj. Cała specyfikacja może być wprowadzona w polu edytora, a cała ocena może być umieszczona w polu fragmentu ... może)

Cannyboy
źródło
2
Ładne pytanie i naprawdę doceniam twoją edycję tytułu i kwestionujesz jego treść dla jasności; pomoże innym, którzy mają podobne pytanie w przyszłości.
MikeSchinkel,

Odpowiedzi:

14

AKTUALIZACJA:

W oparciu o aktualizację pytania myślę, że muszę wyraźnie stwierdzić, że to, co jest zadane w pytaniu, można zrobić z odpowiedzią poniżej, po prostu użyłem niestandardowych pól w niestandardowym typie postu „Samochód” dla każdego elementu, który chcesz wyświetlić wszystkie strony dla danego samochodu.

Jeśli chcesz to zrobić, po prostu zakoduj pasek boczny w single-car.phppliku szablonu, który zamieściłem poniżej, a następnie użyj swojego ifoświadczenia, aby określić, która zawartość ma być wyświetlana dla różnych adresów URL. Możesz podjąć wysiłek, aby widgetizować pasek boczny i opracować niestandardowy widget, w którym widżet pobierałby informacje o bieżącym identyfikatorze postu, ale dlaczego oba, chyba że budujesz to jako motyw dla innych osób?

W rzeczywistości istnieje wiele subtelnie różnych sposobów na osiągnięcie tego, ale ten, który sugeruję, powinien cudownie zastanowić się nad twoimi potrzebami.


Cześć @cannyboy:

Właściwie nie wiem, jaki byłby najlepszy sposób udostępniania niestandardowych pól między postami. Ale może to być czerwona flaga, której potrzebujesz. Jeśli coś wydaje się zbyt trudne, może ...

Alternatywne podejście?

... mógłbyś przemyśleć to inaczej ? Myślę, że będziesz o wiele lepiej tworząc niestandardowy typu Post z „samochód”, a następnie można przechowywać wszystko dla każdej „strony” do jednego samochodu typu post. Oto kilka przykładowych adresów URL:

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

Informacje o niestandardowych typach postów

Więcej informacji na temat niestandardowych typów postów można znaleźć w odpowiedziach na następujące pytania:

Niestandardowy typ postu i reguła przepisywania

Aby zaimplementować niestandardowe typy postów i wiele stron, użyj kodu takiego jak poniżej, który rejestruje niestandardowy typ postu „Samochód”, a następnie ustawia regułę przepisywania dla twoich stron samochodowych . Umieść ten kod w functions.phppliku motywu lub we wtyczce, w zależności od tego, co wolisz:

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

Samochodów -specyficznych Theme Template File

Następnie potrzebujesz motywu specyficznego dla samochodu w szablonie ; domyślna nazwa to single-car.php. Zakodowałem dla ciebie szablon startowy, który renderuje wszystkie trzy adresy URL ( (przegląd) , „specyfikacje techniczne” i „zdjęcia” ) w jednym szablonie, używając instrukcji if do określenia, która treść ma być renderowana:

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

Zauważ, że w powyższym przykładzie jestem bardzo uproszczony przy użyciu get_post_meta(); prawdziwa strona musiałaby mieć tam znacznie większą złożoność.

Tagi szablonu aka Funkcje pomocnicze

Oczywiście użyłem niektórych tagów szablonów, czyli funkcji pomocniczych, aby zminimalizować złożoność pliku szablonu w warunkach instrukcji if . Oto one i możesz je również umieścić w functions.phppliku motywu :

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

Zrzuty ekranu wypełnione niestandardowym typem postu Love

Po wprowadzeniu całego kodu i dodaniu postu samochodowego, takiego jak Volvo 850 , możesz uruchomić go tak, jak na poniższych zrzutach ekranu:

Strona przeglądowa

http://example.com/cars/volvo850/
(źródło: mikeschinkel.com )

Dane techniczne

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

Strona ze zdjęciami

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

MikeSchinkel
źródło
1
Bardzo dobrze. Jak byś to skonfigurował, aby specyfikacje techniczne itp. Były dynamiczne (a nie kodowane na stałe, jak w twoim przykładzie)?
Travis Northcutt,
1
To trudne pytanie, więc muszę zrozumieć twój przypadek użycia, czy to tylko abstrakcyjna hipotetyczna? Mogę to zrobić, ponieważ znam skończoną listę potencjalnych dopasowań. Gdyby było to „dopasuj cokolwiek”, zastąpiłoby to inne wzorce dopasowania WordPress. Daj mi konkretny przykład, a dam rozwiązanie, w przeciwnym razie jest to puszka robaków.
MikeSchinkel,
Dzięki za wspaniałą odpowiedź. Nigdy wcześniej nie przekopywałem się na niestandardowe typy postów, które wydają się idealnym rozwiązaniem. Zaktualizowałem swoje pytanie o kilka dodatkowych szczegółów, głównie dotyczących
pasków
@ mike Tylko hipotetyczny. Aby rozwinąć - zastanawiam się, jak można to skonfigurować, aby informacje na stronie specyfikacji technicznych (na przykład) zostały wpisane gdzieś w panelu administracyjnym (może niestandardowy typ postu, używając taksonomii do ustawienia samochodu?), w przeciwieństwie do pliku szablonu.
Travis Northcutt,
@tnorthcutt - Zakładam, że mówiąc „informacje na stronie specyfikacji technicznych” masz na myśli „listę podstron”? Czy masz na myśli pola niestandardowe? Gdyby ten drugi zakładał, że informacje będą przechowywane w niestandardowych polach. Mój przykład tego nie pokazał; może powinno być?
MikeSchinkel,
1

Myślę, że ktoś mógł już odpowiedzieć na to pytanie na inne przesłane przez ciebie pytanie (o stronach nadrzędnych / stronach pośrednich), ale oto, moim zdaniem, najlepszym sposobem na uporządkowanie danych w oparciu o to, co opisałeś:

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

W ten sposób wystarczy wpisać pola meta tylko raz - na stronie nadrzędnej - a na stronach podrzędnych możesz pobrać te metadane z obiektu nadrzędnego:

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

Oczywiście, jeszcze lepszym sposobem na zorganizowanie tego byłoby posiadanie jednego niestandardowego typu posta dla każdego modelu samochodu, który przechowuje wszystkie informacje o samochodzie i wyświetla różne podstrony na podstawie żądania GET, które jest przekazywane do strony i używane w szablon strony jako przełącznik określający, który szablon ma zostać wyświetlony. W ten sposób możesz całkowicie uniknąć powielania danych i ułatwić późniejsze dodawanie dodatkowych informacji do szablonu ...

Więcej szczegółów...

Zrobiłem to na kilka różnych sposobów. W jednej witrynie, w której miałem agentów (przedstawicieli firmy) jako niestandardowy typ postów, użyłem ich postów do przechowywania wszystkich danych związanych z tą osobą, ale nigdy nie wyświetlałem tej strony. Zamiast tego miałem stronę „Lista agentów”, „Rekord wydajności agenta” i stronę „Skontaktuj się z tym agentem”, które zawsze były wywoływane zmienną GET i wyświetlały informacje z odpowiedniego wpisu. Permalink wyglądałby więc jak site.com/agent-listing/?agent=john-smith .

W innej witrynie skonfigurowałem wszystkie informacje na jednej stronie i wbudowałem wszystkie trzy widoki tej strony w szablon strony. W twoim przypadku wyglądałoby to jak site.com/cars/volvo-850/?pictures .

A w szablonie strony umieścisz sprawdzenie tej zmiennej u góry treści:

if ($_GET['pictures']) {

 // template for pictures page

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

 // template for tech specs page 

} else {

 // overview template

}
Złote Jabłka
źródło
Wielkie dzięki! Czy dla twojej ostatniej sugestii masz na myśli to, że utworzyłem pustą stronę (zwaną być może „danymi widżetu Volvo 850”), która zawiera wszystkie te pola niestandardowe, a inne strony Volvo 850 automatycznie pobierają te dane (eee, jakoś)? (oznacza to, że muszę ręcznie konstruować menu w Wyglądzie> Menu, które i tak robię) ... A może dane można pobrać z pól niestandardowych strony Przegląd ...
cannyboy 24.08.10
Zrobiłem to na dwa sposoby. Zredagowałem moją odpowiedź powyżej, aby wyjaśnić. To, co ostatecznie zrobisz, zależy od tego, jak zautomatyzowane ma być tworzenie menu, tak jak powiedziałeś.
goldenapples,
Ups Właśnie czytałem dalej i zdałem sobie sprawę, że Mike już odpowiedział dokładnie na to, co mówiłem.
goldenapples
0

Jeśli nie chcesz tworzyć niestandardowych typów postów, a po prostu chcesz dołączyć niestandardowy pasek boczny dla każdej strony lub postu, możesz użyć wtyczki Graceful Sidebar. Umożliwia to tworzenie niestandardowych treści paska bocznego bezpośrednio z poziomu ekranu edycji posta lub strony przy użyciu dodatkowych pól zwanych wdziękiem tytułem i wdziękiem treści. Są one następnie wyświetlane w obszarze paska bocznego jako widżet, gdy ten post lub strona jest wyświetlana na blogu. Więcej informacji na temat tej wtyczki można znaleźć na stronie http://www.mlynn.org/graceful-sidebar-plugin

Michael Lynn
źródło