Données de type de publication personnalisées dans les widgets de la barre latérale?


10

(Remarque: cette question concernait à l'origine les champs personnalisés, mais @MikeSchinkel avait une meilleure solution impliquant des types de publication personnalisés)

Sur mon site, j'ai plusieurs pages dont je veux afficher les mêmes données dans la barre latérale. Par exemple, dans une structure comme celle-ci:

-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

Je voudrais que toutes les pages du Volvo 850 affichent les mêmes données dans la barre latérale, toutes les pages Porsche pour afficher un ensemble de données différent (par exemple Speed, Maker, etc.).

Les pages Road auraient leur propre ensemble de données pour chaque route. Cars and Roads aurait également son propre modèle de page, et la façon dont je pense qu'il obtiendrait la barre latérale droite est quelque chose comme ceci dans sidebar.php:

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

Voici un exemple de page, la page Volvo 850 Pictures. La même barre latérale (à gauche) devrait apparaître sur les autres pages du Volvo 850, tandis que le contenu à droite n'est que le contenu de la page.

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

Dans cet exemple, les deux widgets de la barre latérale, Spécifications et Évaluation devraient obtenir leurs informations à partir d'un type de publication personnalisé. Existe-t-il une méthode qui serait facile à modifier pour l'utilisateur final, ce qui signifie qu'il n'aurait à saisir ces données personnalisées qu'une seule fois? Il peut ne pas être nécessaire que chacun des champs soit séparé (c.-à-d. Que toutes les spécifications peuvent être entrées dans un champ Editeur, et toutes les évaluations peuvent être placées dans le champ Extrait .. peut-être)


2
Belle question et vraiment apprécié votre édition du titre et du contenu de la question pour plus de clarté; cela aidera d'autres personnes qui auront une question similaire à l'avenir.
MikeSchinkel

Réponses:


14

METTRE À JOUR:

Sur la base de la mise à jour de la question, je pense que je dois déclarer explicitement que ce qui est demandé dans la question peut être fait avec la réponse ci-dessous, il suffit d'utiliser des champs personnalisés dans le type de message personnalisé "Voiture" pour chacun des éléments que vous souhaitez afficher sur toutes les pages pour une voiture donnée.

Si vous voulez le faire, il vous suffit de coder en dur la barre latérale dans le single-car.phpfichier de modèle que j'ai inclus ci-dessous, puis d'utiliser votre ifdéclaration pour déterminer le contenu à afficher pour les différentes URL. Vous pouvez faire l'effort de widgetiser votre barre latérale et de développer un widget personnalisé où le widget extraira les informations pour l'ID de publication actuel, mais pourquoi les deux à moins que vous ne construisiez cela comme un thème à utiliser par d'autres personnes?

Il existe en fait un tas de façons subtilement différentes d'accomplir cela, mais celle que je suggère devrait se demander à merveille pour vos besoins.


Salut @cannyboy:

En fait, je ne sais pas quelle serait la meilleure façon de partager des champs personnalisés entre les messages. Mais c'est peut-être le drapeau rouge dont vous avez besoin. Si quelque chose semble trop dur peut-être ...

Une approche alternative?

... vous pourriez envisager de le concevoir différemment ? Je pense que vous ferez beaucoup mieux de créer un type de publication personnalisé de "Car" et vous pourrez alors tout stocker pour chaque "page" dans le type de publication Car. Voici quelques exemples d'URL:

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

En savoir plus sur les types de publication personnalisés

Vous pouvez en savoir plus sur les types de publication personnalisés aux réponses à ces questions:

Un type de publication personnalisé et une règle de réécriture

Pour implémenter les types de publication personnalisés et les pages multiples, vous utiliseriez du code comme celui-ci qui enregistre votre type de publication personnalisé «Voiture» , puis définit une règle de réécriture pour vos pages de voiture . Mettez ce code dans le functions.phpfichier de votre thème ou dans un plugin, selon votre préférence:

<?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 fichier de modèle de thème spécifique à la voiture

Ensuite, vous aurez besoin d'un fichier de modèle spécifique à Car dans votre thème ; le nom par défaut serait single-car.php. J'ai codé pour vous un modèle de démarrage qui affiche les trois URL (la (présentation) , les «spécifications techniques» et les «images» ) dans un modèle en utilisant une instruction if pour déterminer le contenu à rendre:

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

Notez dans l'exemple ci-dessus que je suis très simpliste avec l'utilisation de get_post_meta(); le vrai site devrait y avoir beaucoup plus de complexité.

Balises de modèle aka Fonctions d'aide

Bien sûr, j'ai utilisé certaines balises de modèle aka fonctions d'assistance pour minimiser la complexité du fichier de modèle dans les conditions de l' instruction if . Les voici et vous pouvez aussi les mettre dans le functions.phpfichier de votre thème :

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

Captures d'écran remplies d'amour de type de message personnalisé

Une fois que vous avez tout ce code en place et que vous avez ajouté un message de voiture comme Volvo 850, vous pouvez le faire fonctionner comme les captures d'écran suivantes:

Page de présentation

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

Page Spécifications techniques

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

Page d'images

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


1
Très agréable. Comment la configureriez-vous pour que les informations techniques, etc. soient dynamiques (plutôt que codées en dur, comme dans votre exemple)?
Travis Northcutt

1
C'est une question délicate donc j'ai besoin de comprendre votre cas d'utilisation ou si c'est juste une hypothèse abstraite? Je peux le faire parce que je connais la liste finie des correspondances potentielles. S'il "correspondait à quelque chose", il remplacerait les autres modèles de correspondance de WordPress. Donnez-moi un exemple concret et je donnerai une solution sinon c'est une boîte de vers.
MikeSchinkel

Merci pour votre merveilleuse réponse. Je n'avais jamais creusé dans les types de messages personnalisés auparavant, et ils semblent être une solution idéale. J'ai mis à jour ma question avec quelques détails supplémentaires, principalement en ce qui concerne les barres latérales / widgets
cannyboy

@mike Juste une hypothèse. Pour élaborer - je me demande comment vous pouvez le configurer pour que les informations sur la page de spécifications techniques (par exemple) soient saisies quelque part dans le tableau de bord d'administration (un type de message personnalisé, peut-être, en utilisant une taxonomie pour configurer la voiture?), par opposition à dans le fichier modèle.
Travis Northcutt

@tnorthcutt - Je suppose que lorsque vous dites "informations sur la page des spécifications techniques", vous voulez dire "la liste des sous-pages?" Ou voulez-vous dire des champs personnalisés? Si ce dernier, je supposais que les informations seraient stockées dans des champs personnalisés. Mon exemple ne l'a pas montré; peut-être que ça aurait dû?
MikeSchinkel

1

Je pense que quelqu'un a peut-être déjà répondu à cette question sur l'autre question que vous avez publiée (à propos des pages parent / pages intermédiaires), mais voici ce que je pense que la meilleure façon de structurer vos données est, en fonction de ce que vous avez décrit:

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

De cette façon, vous ne devez entrer les champs de métadonnées qu'une seule fois - sur la page parent - et sur les pages enfants, vous pouvez extraire ces métadonnées du parent:

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

Bien sûr, une meilleure façon d'organiser cela serait d'avoir un seul type de publication personnalisé pour chaque modèle de voiture qui stocke toutes les informations de la voiture et d'afficher les différentes sous-pages en fonction d'une demande GET transmise à la page et utilisée dans le modèle de page comme commutateur pour déterminer le modèle à afficher. De cette façon, vous pouvez éviter complètement la duplication des données et faciliter plus tard l'ajout d'informations au modèle ...

Plus de détails...

Je l'ai fait de deux manières différentes. Dans un site où j'avais des agents (représentants de l'entreprise) comme type de publication personnalisé, j'ai utilisé leurs publications pour stocker toutes les données relatives à cette personne, mais je n'ai jamais réellement affiché cette page. Au lieu de cela, j'avais une page "Liste des agents", une page "Enregistrement des performances de l'agent" et une page "Contacter cet agent", qui étaient toujours appelées avec une variable GET et affichaient des informations à partir du message approprié. Ainsi, le permalien ressemblerait à quelque chose comme site.com/agent-listing/?agent=john-smith .

Dans un autre site, j'ai mis en place toutes les informations sur une page et intégré les trois vues de cette page dans le modèle de page. Dans votre cas, cela ressemblerait à quelque chose comme site.com/cars/volvo-850/?pictures .

Et dans le modèle de page, vous incluriez une vérification pour cette variable près du haut du contenu:

if ($_GET['pictures']) {

 // template for pictures page

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

 // template for tech specs page 

} else {

 // overview template

}

Merci beaucoup! Pour votre dernière suggestion, voulez-vous dire que je crée une page vierge (appelée peut-être 'Volvo 850 Widget Data') qui contient tous ces champs personnalisés, et les autres pages Volvo 850 récupèrent automatiquement ces données (euh, en quelque sorte)? (cela signifie que je dois construire des menus manuellement dans Apparence> Menus, ce que je fais quand même) ... Ou peut-être que les données peuvent être récupérées à partir des champs personnalisés de la page Présentation ...
cannyboy

Je l'ai fait dans les deux sens. J'ai modifié ma réponse ci-dessus pour l'expliquer. Ce que vous finissez par faire dépend beaucoup de l'automatisation de la création de votre menu, comme vous l'avez dit.
goldenapples

Oups. Je viens de lire plus loin et j'ai réalisé que Mike avait déjà répondu exactement à ce que je disais.
goldenapples

0

Si vous ne souhaitez pas créer de types de publication personnalisés et que vous souhaitez simplement inclure une barre latérale personnalisée pour chaque page ou publication, vous pouvez utiliser le plug-in Graceful Sidebar. Cela permet de créer un contenu de barre latérale personnalisée directement à partir de l'écran de publication ou de modification de page à l'aide de champs supplémentaires appelés titre gracieux et contenu gracieux. Ceux-ci sont ensuite affichés dans la zone de la barre latérale en tant que widget lorsque ce message ou cette page est affiché sur votre blog. Plus d'informations sur ce plugin sont disponibles sur http://www.mlynn.org/graceful-sidebar-plugin

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.