web-dev-qa-db-fra.com

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

(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, j'ai plusieurs pages sur lesquelles je veux montrer 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 souhaite 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 aussi 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 que chacun des champs soit séparé (c’est-à-dire que toutes les spécifications pourraient être entrées dans un champ d’éditeur et que toutes les évaluations pourraient être placées dans le champ Extrait.

10
cannyboy

METTRE À JOUR:

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 fait avec 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 un effort pour personnaliser votre barre latérale et développer un widget personnalisé dans lequel le widget extraira les informations relatives à 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 approche alternative?

... vous pourriez shonsider en le construisant différemment ? Je pense que vous ferez beaucoup mieux de créer un type de message personnalisé de "voiture" et vous pourrez alors tout stocker pour chacun "page" dans le type de post One 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 apprendre plus sur les types de messages personnalisés en répondant aux questions suivantes:

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

Pour implémenter des types de publication personnalisés et les pages multiples, vous utiliseriez un code comme celui-ci qui enregistre votre "voiture" type de publication personnalisée , puis définit une règle de réécriture pour les 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
}

A Car - Fichier de modèle de thème spécifique

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 affiche les trois URL (le (présentation) , '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 site réel 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é un car post comme Volvo 850 , vous pouvez le faire fonctionner comme les captures d'écran suivantes:

Vue d'ensemble

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

Fiche technique

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

Images page

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

14
MikeSchinkel

Je pense que quelqu'un a peut-être déjà répondu à cette question à propos de l'autre question que vous avez posée (à propos des pages parent/intermédiaires), mais voici ce qui, à mon avis, constitue 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, vous ne devez entrer les champs de méta 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, un moyen encore meilleur 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 requête GET transmise à la page et utilisée dans. le modèle de page en tant que commutateur pour déterminer quel modèle afficher. De cette façon, vous éviterez complètement 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. 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", toujours appelées avec une variable GET et affichant des informations extraites de la publication appropriée. Ainsi, le lien permanent ressemblerait à quelque chose comme site.com/agent-listing/?agent=john-smith.

Sur un autre site, j'ai configuré toutes les informations sur une page et créé 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 devez inclure une vérification de 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

}
1
goldenapples

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é 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 est disponible sur http://www.mlynn.org/graceful-sidebar-plugin

0
Michael Lynn