Benutzerdefinierte Post Type-Daten in Seitenleisten-Widgets?

10

(Hinweis: Bei dieser Frage ging es ursprünglich um benutzerdefinierte Felder, aber @MikeSchinkel hatte eine bessere Lösung für benutzerdefinierte Beitragstypen.)

Auf meiner Site habe ich mehrere Seiten, auf denen ich die gleichen Daten in der Seitenleiste anzeigen möchte. Zum Beispiel in einer Struktur wie dieser:

-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

Ich möchte, dass alle Volvo 850-Seiten dieselben Daten in der Seitenleiste anzeigen, alle Porsche-Seiten einen anderen Datensatz (z. B. Speed, Maker usw.).

Die Straßenseiten hätten ihre eigenen Daten für jede Straße. Autos und Straßen hätten auch eine eigene Seitenvorlage, und die Art und Weise, wie ich denke, dass die richtige Seitenleiste angezeigt wird, ist in sidebar.php ungefähr so:

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

Hier ist eine Beispielseite, die Volvo 850 Pictures-Seite. Die gleiche (linke) Seitenleiste sollte auf den anderen Volvo 850-Seiten angezeigt werden, während das Material auf der rechten Seite nur Seiteninhalt ist.

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

In diesem Beispiel sollten die beiden Seitenleisten-Widgets "Spezifikationen" und "Bewertung" ihre Informationen von einem benutzerdefinierten Beitragstyp erhalten. Gibt es eine Methode, die für den Endbenutzer leicht zu bearbeiten wäre, was bedeutet, dass er diese benutzerdefinierten Daten nur einmal eingeben müsste? Es ist möglicherweise nicht erforderlich, dass jedes der Felder separat ist (dh alle Spezifikationen können in ein Editorfeld eingegeben werden, und alle Bewertungen können in das Auszugsfeld eingegeben werden. Vielleicht)

Cannyboy
quelle
2
Schöne Frage und sehr geschätzt, dass Sie den Titel und den Inhalt der Frage aus Gründen der Klarheit bearbeitet haben. Es wird anderen helfen, die in Zukunft eine ähnliche Frage haben.
MikeSchinkel

Antworten:

14

AKTUALISIEREN:

Basierend auf der Aktualisierung der Frage muss ich meiner Meinung nach explizit angeben, dass das, was in der Frage gestellt wird, mit der folgenden Antwort getan werden kann. Es wurden nur benutzerdefinierte Felder im benutzerdefinierten Beitragstyp "Auto" für jedes der Elemente verwendet, auf denen Sie angezeigt werden möchten alle Seiten für ein bestimmtes Auto.

Wenn Sie dies tun möchten, codieren Sie einfach die Seitenleiste in die single-car.phpunten angegebene Vorlagendatei und ifbestimmen Sie anhand Ihrer Anweisung, welcher Inhalt für die verschiedenen URLs angezeigt werden soll. Sie könnten sich die Mühe machen, Ihre Seitenleiste zu widgetisieren und ein benutzerdefiniertes Widget zu entwickeln, in dem das Widget die Informationen für die aktuelle Post-ID abruft. Aber warum beides, es sei denn, Sie erstellen dies als Thema, das andere Personen verwenden können?

Es gibt tatsächlich eine Reihe von subtil unterschiedlichen Möglichkeiten, um dies zu erreichen, aber die, die ich vorschlage, sollte sich wunderbar für Ihre Bedürfnisse wundern.


Hallo @cannyboy:

Ich weiß eigentlich nicht, wie ich benutzerdefinierte Felder am besten über Posts hinweg teilen kann. Aber das könnte nur die rote Fahne sein, die Sie brauchen. Wenn etwas vielleicht zu schwer erscheint ...

Ein alternativer Ansatz?

... könnten Sie es sich anders überlegen, es zu entwerfen ? Ich denke, Sie sind viel besser dran, einen benutzerdefinierten Post-Typ von "Auto" zu erstellen, und dann können Sie alles für jede "Seite" in einem Post-Typ für ein Auto speichern . Hier sind einige Beispiel-URLs:

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

Informationen zu benutzerdefinierten Beitragstypen

Weitere Informationen zu benutzerdefinierten Beitragstypen finden Sie unter Antworten auf die folgenden Fragen:

Ein benutzerdefinierter Beitragstyp und eine Umschreiberegel

Um benutzerdefinierte Beitragstypen und die mehreren Seiten zu implementieren, verwenden Sie den folgenden Code, der Ihren benutzerdefinierten Beitragstyp "Auto" registriert und dann eine Umschreiberegel für Ihre Fahrzeugseiten festlegt . Fügen Sie diesen Code in die functions.phpDatei Ihres Themas oder in ein Plugin ein, je nachdem, was Sie bevorzugen:

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

Ein Auto -spezifische Thema Vorlagendatei

Dann werden Sie benötigen ein Auto -spezifische Vorlagendatei in Ihrem Thema ; Der Standardname hierfür wäre single-car.php. Ich habe eine Starter-Vorlage für Sie codiert, die alle drei URLs (die (Übersicht) , 'Tech-Spezifikationen' und 'Bilder' ) in einer Vorlage rendert, indem ich eine if- Anweisung verwende, um zu bestimmen, welcher Inhalt gerendert werden soll:

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

Beachten Sie im obigen Beispiel, dass ich mit der Verwendung von sehr simpel bin get_post_meta(). Eine reale Site müsste dort viel komplexer sein.

Vorlagen-Tags, auch bekannt als Hilfsfunktionen

Natürlich habe ich einige Vorlagen-Tags, auch Hilfsfunktionen genannt, verwendet, um die Komplexität der Vorlagendatei unter den Bedingungen der if- Anweisung zu minimieren . Hier sind sie und Sie können diese auch in die functions.phpDatei Ihres Themas einfügen:

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

Screenshots gefüllt mit Custom Post Type Love

Sobald Sie den gesamten Code installiert und einen Autopost wie Volvo 850 hinzugefügt haben , können Sie ihn wie in den folgenden Screenshots verwenden:

Übersichtsseite

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

Seite mit technischen Daten

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

Bilder Seite

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

MikeSchinkel
quelle
1
Sehr schön. Wie würden Sie es so einrichten, dass die technischen Daten usw. dynamisch sind (und nicht wie in Ihrem Beispiel fest codiert)?
Travis Northcutt
1
Das ist eine knifflige Frage, also muss ich Ihren Anwendungsfall verstehen oder ob es nur eine abstrakte Hypothese ist? Ich kann das tun, weil ich die endliche Liste möglicher Übereinstimmungen kenne. Wenn es "mit irgendetwas übereinstimmen" würde, würde es die anderen Übereinstimmungsmuster von WordPress überschreiben. Geben Sie mir ein konkretes Beispiel und ich werde eine Lösung geben, sonst ist es eine Dose Würmer.
MikeSchinkel
Vielen Dank für Ihre wundervolle Antwort. Ich hatte mich noch nie zuvor mit benutzerdefinierten Post-Typen befasst, und sie scheinen eine ideale Lösung zu sein. Ich habe meine Frage mit ein paar weiteren
Details
@mike Nur eine Hypothese. Um es näher zu erläutern: Ich frage mich, wie Sie es so einrichten können, dass die Informationen auf der Seite mit den technischen Daten (zum Beispiel) irgendwo im Admin-Dashboard eingegeben werden (ein benutzerdefinierter Beitragstyp, der möglicherweise eine Taxonomie zum Einstellen des Autos verwendet?). im Gegensatz zu in der Vorlagendatei.
Travis Northcutt
@tnorthcutt - Ich nehme an, wenn Sie "Informationen auf der Seite mit den technischen Daten" sagen, meinen Sie "die Liste der Unterseiten?" Oder meinst du benutzerdefinierte Felder? In letzterem Fall würde ich davon ausgehen, dass die Informationen in benutzerdefinierten Feldern gespeichert werden. Mein Beispiel hat das nicht gezeigt; vielleicht sollte es haben?
MikeSchinkel
1

Ich denke, jemand hat dies möglicherweise bereits auf die andere Frage beantwortet, die Sie gestellt haben (über übergeordnete Seiten / Zwischenseiten), aber ich denke, der beste Weg, Ihre Daten zu strukturieren, ist, basierend auf dem, was Sie beschrieben haben:

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

Auf diese Weise müssen Sie die Metafelder nur einmal eingeben - auf der übergeordneten Seite - und auf den untergeordneten Seiten können Sie diese Metadaten von der übergeordneten Seite abrufen:

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

Eine noch bessere Möglichkeit, dies zu organisieren, wäre natürlich, für jedes Automodell einen einzigen benutzerdefinierten Beitragstyp zu verwenden, in dem alle Fahrzeuginformationen gespeichert sind, und die verschiedenen Unterseiten basierend auf einer GET-Anforderung anzuzeigen, die an die Seite übergeben und in verwendet wird Die Seitenvorlage als Schalter, um zu bestimmen, welche Vorlage angezeigt werden soll. Auf diese Weise können Sie das Duplizieren von Daten vollständig vermeiden und das Hinzufügen weiterer Informationen zur Vorlage später vereinfachen ...

Mehr Details...

Ich habe es auf verschiedene Arten gemacht. Auf einer Site, auf der ich Agenten (Unternehmensvertreter) als benutzerdefinierten Beitragstyp hatte, habe ich deren Beiträge verwendet, um alle Daten zu dieser Person zu speichern, diese Seite jedoch nie angezeigt. Stattdessen hatte ich eine Seite "Agent Listing", eine Seite "Agent Performance Record" und eine Seite "Contact This Agent", die immer mit einer GET-Variablen aufgerufen wurden und Informationen aus dem entsprechenden Beitrag anzeigten. Der Permalink würde also ungefähr so aussehen wie site.com/agent-listing/?agent=john-smith .

Auf einer anderen Site habe ich alle Informationen auf einer Seite eingerichtet und alle drei Ansichten für diese Seite in die Seitenvorlage integriert. In Ihrem Fall würde das ungefähr so aussehen wie site.com/cars/volvo-850/?pictures .

Und in die Seitenvorlage würden Sie oben im Inhalt eine Prüfung für diese Variable einfügen:

if ($_GET['pictures']) {

 // template for pictures page

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

 // template for tech specs page 

} else {

 // overview template

}
goldene Äpfel
quelle
Danke vielmals! Meinen Sie für Ihren letzten Vorschlag, dass ich eine leere Seite (möglicherweise "Volvo 850 Widget Data" genannt) mit all diesen benutzerdefinierten Feldern erstelle und die anderen Volvo 850-Seiten diese Daten automatisch abrufen (ähm, irgendwie)? (Dies bedeutet, dass ich Menüs manuell unter Darstellung> Menüs erstellen muss, was ich sowieso mache.) ... Oder vielleicht können die Daten aus den benutzerdefinierten Feldern der Übersichtsseite
abgerufen werden
Ich habe es in beide Richtungen gemacht. Ich habe meine Antwort oben bearbeitet, um sie zu erklären. Was Sie am Ende tun, hängt stark davon ab, wie automatisiert Ihre Menüerstellung sein soll, wie Sie sagten.
Goldenapples
Hoppla. Ich las nur weiter und stellte fest, dass Mike bereits genau antwortete, was ich sagte.
Goldenapples
0

Wenn Sie keine benutzerdefinierten Beitragstypen erstellen möchten und einfach eine benutzerdefinierte Seitenleiste für jede Seite oder jeden Beitrag einfügen möchten, können Sie das Graceful Sidebar Plugin verwenden. Auf diese Weise können Sie benutzerdefinierte Seitenleisteninhalte direkt im Beitrags- oder Seitenbearbeitungsbildschirm mithilfe zusätzlicher Felder erstellen, die als ordnungsgemäßer Titel und ordnungsgemäßer Inhalt bezeichnet werden. Diese werden dann im Seitenleistenbereich als Widget angezeigt, wenn dieser Beitrag oder diese Seite in Ihrem Blog angezeigt wird. Weitere Informationen zu diesem Plugin finden Sie unter http://www.mlynn.org/graceful-sidebar-plugin

Michael Lynn
quelle