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

10

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

Sur mon site, plusieurs pages sur lesquelles je souhaite 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 de la Volvo 850 affichent les mêmes données dans la barre latérale, que toutes les pages de Porsche affichent un ensemble de données différent (par exemple, Speed, Maker, etc.).

Les pages de route auront 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 ressemble à 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 de la Volvo 850, tandis que le contenu de droite ne concerne 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, Specs et Rating, devraient extraire leurs informations d'un type de publication personnalisé. Existe-t-il une méthode facile à modifier pour l'utilisateur final, qui obligerait l'utilisateur à saisir ces données personnalisées une seule fois? Il n’est peut-être pas nécessaire de séparer chacun des champs (c’est-à-dire que tous les types peuvent être entrés dans un champ Editeur et que tous les Notations peuvent être placés dans le champ Extrait ... peut-être)

    
posée cannyboy 24.08.2010 - 22:37

3 réponses

14

UPDATE:

Sur la base de la mise à jour de la question, je pense avoir besoin d'indiquer explicitement que ce qui est demandé dans la question peut être résolu à l'aide de la réponse ci-dessous. Il suffit d'utiliser des champs personnalisés dans le message personnalisé "Voiture" . tapez 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 la barre latérale dans le fichier de modèle single-car.php que j’ai inclus ci-dessous, puis d’utiliser votre déclaration if pour déterminer le contenu à afficher pour les différentes URL. Vous pouvez vous lancer dans une tentative de widget dans votre barre latérale et de développer un widget personnalisé dans lequel le widget extraira les informations de l'ID de publication en cours, mais pourquoi les deux, à moins que vous ne la construisiez comme un thème que d'autres personnes puissent utiliser?

Il existe en fait un tas de manières subtiles différentes d'y parvenir, mais celle que je suggère devrait à merveille répondre à vos besoins.

Bonjour @cannyboy:

En fait, je ne sais pas quel serait le meilleur moyen de partager des champs personnalisés entre les publications. Mais cela pourrait bien être le drapeau rouge dont vous avez besoin. Si quelque chose semble trop difficile peut-être ...

Une autre approche?

... vous pourriez envisager de le concevoir différemment ? Je pense que vous ferez bien mieux de créer un type de message personnalisé de "Voiture" et vous pourrez ensuite tout stocker pour chaque "page" . dans le type de poste une voiture. 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

Pour en savoir plus sur les types de publication personnalisés, consultez les réponses à ces questions:

Un type d'article personnalisé et une règle de réécriture

Pour implémenter des types de publication personnalisés et les pages multiples que vous utiliseriez, utilisez le code suivant: enregistre votre "Voiture" type de publication personnalisée , puis définit une règle de réécriture des pages de votre voiture . Placez ce code dans le fichier functions.php 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 pour une voiture

Ensuite, vous aurez besoin d'un fichier de modèle spécifique à la voiture dans votre thème ; le nom par défaut pour cela serait single-car.php . J'ai codé pour vous un modèle de départ qui rend les trois URL ( (aperçu) , "spécifications techniques" et "images" ) dans un modèle en utilisant une instruction if pour déterminer le contenu à restituer:

<?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() ; un vrai site aurait besoin d'avoir beaucoup plus de complexité là-bas.

Balises de modèle a.k.a Fonctions d'assistance

Bien entendu, j'ai utilisé des balises de modèle a.k.a. helper 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 fichier functions.php 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 de Custom Post Type Love

Une fois que tout ce code est en place et que vous avez ajouté une publication Voiture telle que Volvo 850 , vous pouvez le faire fonctionner comme dans les captures d'écran suivantes:

Page de présentation

PageSpécificationstechniques

Page d'images

    
réponse donnée MikeSchinkel 25.08.2010 - 02:48
1

Je pense que quelqu'un a peut-être déjà répondu à cette question dans l'autre question que vous avez posée (à propos des pages parent / intermédiaires), mais voici ce que je pense comme le meilleur moyen de structurer vos données, 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, il vous suffit de saisir les champs de méta 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, un moyen encore meilleur d’organiser cette opération 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 requête GET transmise à la page. et utilisé dans le modèle de page comme commutateur pour déterminer le modèle à afficher. De cette façon, vous éviterez totalement les doublons et faciliterz l'ajout ultérieur d'informations au modèle ...

Plus de détails ...

Je l'ai fait de différentes manières. Sur un site où j'avais des agents (représentants de la société) en tant que type de publication personnalisé, j'ai utilisé leurs publications pour stocker toutes les données relatives à cette personne, mais je n'ai jamais affiché cette page. J'avais plutôt une page "Liste des agents", une page "Enregistrement des performances de l'agent" et une page "Contacter cet agent", toujours appelées avec une variable GET et affichant des informations hors du message approprié. Le lien permanent ressemblerait donc à site.com/agent-listing/?agent=john-smith .

Sur un autre site, j'ai configuré 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 à site.com/cars/volvo-850/?pictures .

Et dans le modèle de page, vous devez inclure une vérification de cette variable en haut du contenu:

if ($_GET['pictures']) {

 // template for pictures page

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

 // template for tech specs page 

} else {

 // overview template

}
    
réponse donnée goldenapples 24.08.2010 - 23:59
0

Si vous ne souhaitez pas créer de type d'article personnalisé et que vous souhaitez simplement inclure une barre latérale personnalisée pour chaque page ou chaque article, vous pouvez utiliser le plug-in Graceful Sidebar. Cela permet de créer un contenu de barre latérale personnalisé 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 barre latérale sous forme de widget lorsque cet article ou cette page est affiché sur votre blog. Plus d'informations sur ce plugin sont disponibles à l'adresse enlace

.     
réponse donnée Mike Lynn 29.12.2010 - 16:08

Lire d'autres questions sur les étiquettes