Dati tipo post personalizzati nei widget della barra laterale?


10

(nota: questa domanda originariamente riguardava i campi personalizzati, ma @MikeSchinkel aveva una soluzione migliore con tipi di posta personalizzati)

Sul mio sito ho diverse pagine che voglio mostrare gli stessi dati nella barra laterale. Ad esempio, in una struttura come questa:

-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

Vorrei che tutte le pagine della Volvo 850 mostrassero gli stessi dati nella barra laterale, tutte le pagine della Porsche mostrassero un diverso set di dati (ad esempio Speed, Maker, ecc.).

Le pagine Road avrebbero il proprio set di dati per ogni strada. Cars and Roads avrebbe anche un proprio modello di pagina, e il modo in cui immagino che ottenga la barra laterale destra è qualcosa di simile all'interno di sidebar.php:

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

Ecco una pagina di esempio, la pagina Immagini di Volvo 850. La stessa barra laterale (a sinistra) dovrebbe apparire sulle altre pagine della Volvo 850, mentre quella a destra è solo il contenuto della pagina.

|  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 questo esempio, i due widget della barra laterale, Specifiche e Valutazione dovrebbero ottenere le loro informazioni da un Tipo di post personalizzato. Esiste un metodo, che sarebbe facile da modificare per l'utente finale, il che significa che dovrebbero inserire questi dati personalizzati una sola volta? Potrebbe non essere necessario che ciascuno dei campi sia separato (vale a dire che tutte le Specifiche potrebbero essere inserite in un campo Editor e tutte le Classificazioni potrebbero essere inserite nel campo Estratto .. forse)


2
Bella domanda e ho davvero apprezzato la tua modifica del titolo e la domanda per chiarezza; aiuterà gli altri che hanno una domanda simile in futuro.
MikeSchinkel,

Risposte:


14

AGGIORNARE:

Sulla base dell'aggiornamento della domanda, penso di dover dichiarare esplicitamente che ciò che è stato posto nella domanda può essere fatto con la risposta di seguito, ho semplicemente usato i campi personalizzati nel tipo di post personalizzato "Auto" per ciascuno degli elementi su cui vuoi essere visualizzato tutte le pagine per una determinata auto.

Se vuoi farlo, basta semplicemente codificare la barra laterale nel single-car.phpfile modello che ho incluso di seguito e quindi utilizzare la tua ifdichiarazione per determinare quale contenuto visualizzare per i diversi URL. Potresti andare allo sforzo di widgetizzare la barra laterale e sviluppare un widget personalizzato in cui il widget trarrebbe le informazioni per l'ID del post corrente, ma perché entrambi a meno che tu non stia costruendo questo come tema da usare per altre persone?

In realtà ci sono un sacco di modi leggermente diversi per raggiungere questo obiettivo, ma quello che sto suggerendo dovrebbe meravigliarsi meravigliosamente per le tue esigenze.


Ciao @cannyboy:

In realtà non so quale sia il modo migliore per condividere campi personalizzati tra post. Ma quella potrebbe essere solo la bandiera rossa di cui hai bisogno. Se qualcosa sembra troppo difficile forse ...

Un approccio alternativo?

... potresti sconsiderarlo progettandolo diversamente ? Penso che farai molto meglio a creare un Tipo di post personalizzato di "Auto" e quindi potrai archiviare tutto per ogni "pagina" in un tipo di post di Auto. Ecco alcuni URL di esempio:

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

Informazioni sui tipi di post personalizzati

Puoi trovare ulteriori informazioni sui tipi di posta personalizzati nelle risposte a queste domande:

Un tipo di post personalizzato e una regola di riscrittura

Per implementare i tipi di post personalizzati e le pagine multiple dovresti usare un codice come il seguente che registra il tuo tipo di post personalizzato "Auto" e quindi imposta una regola di riscrittura per le pagine della tua auto . Inserisci questo codice nel functions.phpfile del tuo tema o in un plug-in, a seconda di quale preferisci:

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

Un file modello di tema specifico per auto

Quindi avrai bisogno di un file modello specifico per Auto nel tuo tema ; il nome predefinito per questo sarebbe single-car.php. Ho codificato un modello iniziale per te che esegue il rendering di tutti e tre gli URL (la (panoramica) , le "specifiche tecniche" e le "immagini" ) in un modello usando un'istruzione if per determinare quale contenuto visualizzare:

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

Nota nell'esempio sopra sto diventando molto semplicistico con l'uso di get_post_meta(); il sito reale dovrebbe avere molta più complessità lì.

Tag modello aka Funzioni di supporto

Ovviamente ho usato alcuni tag template noti anche come funzioni helper per minimizzare la complessità del file template nelle condizioni dell'istruzione if . Eccoli e puoi metterli anche nel functions.phpfile del tuo tema :

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

Schermate piene di tipo di messaggio personalizzato Amore

Una volta che hai inserito tutto quel codice e hai aggiunto un posto Auto come Volvo 850 , puoi farlo funzionare come i seguenti screenshot:

Pagina panoramica

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

Pagina delle specifiche tecniche

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

Pagina delle immagini

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


1
Molto bella. Come lo configureresti in modo tale che le specifiche tecniche, ecc. Siano dinamiche (piuttosto che hard coded, come nel tuo esempio)?
Travis Northcutt,

1
Questa è una domanda delicata, quindi ho bisogno di capire il tuo caso d'uso o se è solo un ipotetico astratto? Posso farlo perché conosco l'elenco finito di potenziali corrispondenze. Se fosse "confronta qualsiasi cosa", avrebbe la precedenza su altri schemi di corrispondenza di WordPress. Fammi un esempio concreto e darò una soluzione, altrimenti è una lattina di vermi.
MikeSchinkel,

Grazie per la tua meravigliosa risposta. Non avevo mai scavato nei tipi di posta personalizzati prima e sembrano una soluzione ideale. Ho aggiornato la mia domanda con alcuni dettagli in più, principalmente per quanto riguarda le barre laterali / i widget
cannyboy

@mike Solo un ipotetico. Per elaborare: mi chiedo come è possibile configurarlo in modo che le informazioni nella pagina (ad esempio) delle specifiche tecniche siano inserite nel pannello di amministrazione da qualche parte (un tipo di post personalizzato, forse, usando una tassonomia per impostare l'auto?), al contrario di nel file modello.
Travis Northcutt,

@tnorthcutt - Suppongo che quando dici "informazioni sulla pagina delle specifiche tecniche" intendi "l'elenco delle sottopagine?" O vuoi dire campi personalizzati? Se quest'ultimo ipotizzassi che le informazioni sarebbero state memorizzate in campi personalizzati. Il mio esempio non lo ha mostrato; forse avrebbe dovuto?
MikeSchinkel,

1

Penso che qualcuno potrebbe aver già risposto a questa domanda sull'altra domanda che hai pubblicato (sulle pagine padre / pagine intermedie), ma ecco quello che penso sia il modo migliore per strutturare i tuoi dati, in base a ciò che hai descritto:

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

In questo modo devi solo inserire i metacampi una volta - nella pagina principale - e nelle pagine secondarie puoi estrarre quei metadati dal padre:

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

Naturalmente, un modo ancora migliore per organizzare questo sarebbe quello di avere un singolo tipo di post personalizzato per ogni modello di auto che memorizza tutte le informazioni dell'auto e visualizzare le varie sottopagine in base a una richiesta GET passata alla pagina e utilizzata in il modello di pagina come interruttore per determinare quale modello visualizzare. In questo modo puoi evitare completamente la duplicazione dei dati e semplificare l'aggiunta di ulteriori informazioni al modello in seguito ...

Più dettagli...

L'ho fatto in un paio di modi diversi. In un sito in cui avevo agenti (rappresentanti dell'azienda) come tipo di post personalizzato, ho usato i loro post per archiviare tutti i dati relativi a quella persona, ma non ho mai effettivamente visualizzato quella pagina. Invece, avevo una pagina "Elenco agenti", una pagina "Record prestazioni agente" e una pagina "Contatta questo agente", che venivano sempre chiamate con una variabile GET e visualizzavano le informazioni dal post appropriato. Quindi il permalink sarebbe simile a site.com/agent-listing/?agent=john-smith .

In un altro sito, ho impostato tutte le informazioni su una pagina e ho creato tutte e tre le viste per quella pagina nel modello di pagina. Nel tuo caso, sarebbe simile a site.com/cars/volvo-850/?pictures .

E nel modello di pagina includeresti un controllo per quella variabile vicino alla parte superiore del contenuto:

if ($_GET['pictures']) {

 // template for pictures page

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

 // template for tech specs page 

} else {

 // overview template

}

Molte grazie! Per il tuo ultimo suggerimento, vuoi dire che creo una pagina vuota (chiamata forse "Dati del widget Volvo 850") che contiene tutti questi campi personalizzati e le altre pagine Volvo 850 acquisiscono automaticamente questi dati (ehm, in qualche modo)? (questo significa che devo costruire manualmente i menu in Aspetto> Menu, cosa che sto facendo comunque) ... O forse i dati possono essere
acquisiti dai

L'ho fatto in entrambi i modi. Ho modificato la mia risposta sopra per spiegare. Quello che finisci per fare dipende molto da quanto automatizzato vuoi che sia la creazione del tuo menu, come hai detto.
goldenapples

Ops. Ho appena letto più avanti e ho capito che Mike aveva già risposto esattamente a quello che stavo dicendo.
goldenapples

0

Se non desideri creare tipi di post personalizzati e desideri semplicemente includere una barra laterale personalizzata per ogni pagina o post, puoi utilizzare il Graceful Sidebar Plugin. Ciò consente di creare contenuti della barra laterale personalizzati direttamente dalla schermata di modifica del post o della pagina utilizzando campi aggiuntivi chiamati titolo aggraziato e contenuto aggraziato. Questi vengono quindi visualizzati nell'area della barra laterale come widget quando questo post o pagina viene visualizzato sul tuo blog. Ulteriori informazioni su questo plugin sono disponibili su http://www.mlynn.org/graceful-sidebar-plugin

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.