web-dev-qa-db-de.com

Benutzerdefinierte Post-Typ-Daten in Sidebar-Widgets?

(Hinweis: Diese Frage betraf ursprünglich benutzerdefinierte Felder, aber @MikeSchinkel hatte eine bessere Lösung mit benutzerdefinierten 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 auf allen Volvo 850-Seiten die gleichen Daten in der Seitenleiste und auf allen Porsche-Seiten ein anderer Datensatz angezeigt wird (z. B. Geschwindigkeit, Hersteller usw.).

Die Straßenseiten hätten für jede Straße einen eigenen Datensatz. Cars and Roads hätte auch eine eigene Seitenvorlage, und die Art und Weise, wie die rechte Seitenleiste angezeigt wird, sieht in sidebar.php ungefähr so ​​aus:

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 Zeug 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 Specs und Rating ihre Informationen von einem benutzerdefinierten Beitragstyp erhalten. Gibt es eine Methode, die für den Endbenutzer leicht zu bearbeiten ist, dh er müsste diese benutzerdefinierten Daten nur einmal eingeben? Es ist möglicherweise nicht erforderlich, dass jedes der Felder separat ist (dh alle Spezifikationen können in ein Editor-Feld eingegeben werden, und alle Bewertungen können in das Feld "Auszug" eingegeben werden. Vielleicht)

10
cannyboy

AKTUALISIEREN:

Basierend auf der Aktualisierung der Frage muss ich explizit angeben, dass das, was in der Frage gestellt wird, mit der folgenden Antwort erfolgen kann. Verwenden Sie einfach benutzerdefinierte Felder im benutzerdefinierten Post-Typ "Auto" für jeden von Die gewünschten Elemente werden für ein bestimmtes Auto auf allen Seiten angezeigt.

Wenn Sie dies tun möchten, codieren Sie einfach die Seitenleiste in die single-car.php-Vorlagendatei, die ich unten angegeben habe, und bestimmen Sie dann mit Ihrer if-Anweisung, welcher Inhalt für die verschiedenen URLs angezeigt werden soll. Sie könnten sich anstrengen, Ihre Seitenleiste zu Widget zu machen und ein benutzerdefiniertes Widget zu entwickeln, in dem das Widget die Informationen für die aktuelle Beitrags-ID abruft. Aber warum beides, es sei denn, Sie erstellen dies als Thema für andere Benutzer?

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.


Hi @cannyboy:

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

Ein alternativer Ansatz?

... könntest du es anders gestalten überlegen? Ich denke, Sie sind viel besser dran, einen benutzerdefinierten Beitragstyp von "Auto" zu erstellen, und dann können Sie alles für jeden "Seite" in diesem speichern Art des Autopostens. 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 in den Antworten auf die folgenden Fragen:

Ein benutzerdefinierter Beitragstyp und eine Umschreiberegel

Um benutzerdefinierte Beitragstypen und die mehreren Seiten zu implementieren, verwenden Sie folgenden Code: registriert Ihr "Auto" Benutzerdefinierter Beitragstyp und dann legt eine Umschreiberegel für Ihr Auto fest Seiten . Fügen Sie diesen Code in die functions.php-Datei 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
}

Eine Auto - spezifische Designvorlagendatei

Dann brauchen Sie eine Auto - spezifische Vorlagendatei in Ihrem Design ; Der Standardname hierfür wäre single-car.php. Ich habe eine Starter-Vorlage für Sie codiert, die alle drei URLs (die (Übersicht), 'technischen Daten' und 'Bilder') darstellt. In einer Vorlage mithilfe einer if -Anweisung 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, dass ich im obigen Beispiel mit der Verwendung von get_post_meta() sehr simpel bin. Die reale Website müsste dort viel komplexer sein.

Template-Tags und Hilfsfunktionen

Natürlich habe ich einige Hilfsfunktionen für Vorlagen-Tags verwendet, um die Komplexität der Vorlagendatei in den if -Anweisungsbedingungen zu minimieren. Hier sind sie und Sie können diese auch in die functions.php Datei 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 haben und einen Auto Post wie Volvo 850 hinzugefügt haben, können Sie ihn wie die folgenden Screenshots zum Laufen bringen:

Übersichtsseite

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

Technische Daten

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

Bilder Seite

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

14
MikeSchinkel

Ich denke, jemand hat diese Frage möglicherweise bereits bei der anderen Frage beantwortet (übergeordnete Seiten/Zwischenseiten), aber meiner Meinung nach ist die folgende Methode die beste, um Ihre Daten zu strukturieren:

 - 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, besteht darin, für jedes Automodell einen eigenen benutzerdefinierten Beitragstyp zu verwenden, in dem alle Fahrzeuginformationen gespeichert sind, und die verschiedenen Unterseiten auf der Grundlage 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 spätere Hinzufügen weiterer Informationen zur Vorlage vereinfachen ...

Weitere Details ...

Ich habe es auf verschiedene Arten gemacht. Auf einer Website, auf der ich Vertreter (Unternehmensvertreter) als benutzerdefinierten Beitragstyp hatte, habe ich deren Beiträge zum Speichern aller Daten verwendet, die sich auf diese Person beziehen, 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 und Informationen aus dem entsprechenden Beitrag angezeigt wurden. Der Permalink würde also ungefähr so ​​aussehen: 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: site.com/cars/volvo-850/?pictures .

Und in die Seitenvorlage würden Sie eine Prüfung für diese Variable am oberen Rand des Inhalts einfügen:

if ($_GET['pictures']) {

 // template for pictures page

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

 // template for tech specs page 

} else {

 // overview template

}
1
goldenapples

Wenn Sie keine benutzerdefinierten Beitragstypen erstellen 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 benutzerdefinierten Seitenleisteninhalt direkt aus dem Post- oder Seitenbearbeitungsbildschirm mit zusätzlichen Feldern erstellen, die als anmutiger Titel und anmutiger 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

0
Michael Lynn