(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)
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 ...
... 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/
Weitere Informationen zu benutzerdefinierten Beitragstypen finden Sie in den Antworten auf die folgenden Fragen:
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
}
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.
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);
}
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:
(Quelle: mikeschinkel.com )
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
}
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