it-swarm-es.com

¿Datos de tipo de entrada personalizados en los widgets de la barra lateral?

(nota: esta pregunta originalmente era sobre campos personalizados, pero @MikeSchinkel tenía una mejor solución que involucraba tipos de correos personalizados)

En mi sitio tengo varias páginas que quiero mostrar los mismos datos en la barra lateral. Por ejemplo, en una estructura como esta:

-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

Me gustaría que todas las páginas del Volvo 850 mostraran los mismos datos en la barra lateral, que todas las páginas de Porsche mostraran un conjunto diferente de datos (por ejemplo, Speed, Maker, etc.).

Las páginas de Carreteras tendrían su propio conjunto de datos para cada carretera. Cars and Roads también tendría su propia plantilla de página, y la forma en que creo que obtendría la barra lateral correcta es algo así dentro de sidebar.php:

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

Aquí hay una página de ejemplo, la página de imágenes de Volvo 850. La misma barra lateral (izquierda) debe aparecer en las otras páginas del Volvo 850, mientras que el contenido de la derecha es solo el contenido de la página.

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

En este ejemplo, los dos widgets de la barra lateral, Especificaciones y Clasificación deben obtener su información de un Tipo de publicación personalizada. ¿Hay algún método que sea fácil de editar para el usuario final, lo que significa que tendrían que ingresar estos datos personalizados solo una vez? Puede que no sea necesario que cada uno de los campos esté separado (es decir, que todas las Especificaciones se puedan ingresar dentro de un campo Editor y que todas las Clasificaciones se puedan colocar en el campo Extracto ... tal vez)

10
cannyboy

ACTUALIZAR:

Basado en la actualización de la pregunta, creo que necesito declarar explícitamente que lo que se hace en la pregunta se puede hacer con la respuesta a continuación, solo usé campos personalizados en el tipo de publicación personalizada "Car" para cada de los elementos que desea que se muestren en todas las páginas para un automóvil determinado.

Si desea hacerlo, simplemente codifique la barra lateral en el archivo de plantilla single-car.php que incluí a continuación y luego use su declaración if para determinar qué contenido mostrar para las diferentes URL. Podrías hacer el esfuerzo de crear widgets en tu barra lateral y desarrollar un widget personalizado donde el widget extraería la información para la ID de publicación actual, pero ¿por qué ambos a menos que estés construyendo esto como un tema para que otras personas lo usen?

En realidad, hay un montón de formas sutilmente diferentes para lograr esto, pero la que sugiero debería preguntarse maravillosamente tus necesidades.


Hola @ cannyboy:

En realidad, no sé cuál sería la mejor manera de compartir campos personalizados entre publicaciones. Pero esa podría ser la bandera roja que necesitas. Si algo parece demasiado difícil, tal vez ...

¿Un enfoque alternativo?

... podría brillar arquitectándolo de manera diferente ? Creo que será mucho mejor crear un Tipo de publicación personalizado de "Car" y luego puede almacenar todo para cada "página" en el tipo de publicación de Auto. Aquí hay algunas URL de muestra:

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

Aprender sobre los tipos de publicaciones personalizadas

Puede obtener más información sobre los tipos de publicaciones personalizadas en las respuestas a estas preguntas:

Un tipo de mensaje personalizado y una regla de reescritura

Para implementar Tipos de publicaciones personalizadas y las páginas múltiples, usaría un código como el siguiente que registra su "Auto" Tipo de publicación personalizada y luego establece una regla de reescritura para las páginas de su automóvil . Pon este código en el archivo functions.php de tu tema o en un complemento, lo que prefieras:

<?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 - Archivo de plantilla de tema específico

Entonces necesitará un Car - archivo de plantilla específico en su tema ; el nombre predeterminado para esto sería single-car.php. Le he codificado una plantilla de inicio que representa las tres URL ((descripción general), 'especificaciones técnicas' y 'imágenes') en una plantilla usando una declaración if para determinar qué contenido representar:

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

Tenga en cuenta que en el ejemplo anterior estoy siendo muy simplista con el uso de get_post_meta(); el sitio real necesitaría tener mucha más complejidad allí.

Etiquetas de plantilla a.k.a. Funciones de ayuda

Por supuesto, utilicé algunas etiquetas de plantilla a.k.a. funciones auxiliares para minimizar la complejidad en el archivo de plantilla en las condiciones de declaración if. Aquí están y puede ponerlos en el archivo functions.php de su tema también:

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

Capturas de pantalla llenas de mensajes personalizados tipo amor

Una vez que tenga todo ese código en su lugar y haya agregado una publicación Auto como Volvo 85 puede hacer que funcione como en las siguientes capturas de pantalla:

Página de resumen

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

Página de especificaciones técnicas

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

Página de fotos

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

14
MikeSchinkel

Creo que alguien podría haber respondido esto en la otra pregunta que publicaste (sobre páginas principales/páginas intermedias), pero esto es lo que creo que es la mejor manera de estructurar tus datos, según lo que has descrito:

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

De esa manera, solo tiene que ingresar los metacampos una vez, en la página principal, y en las páginas secundarias puede extraer los metadatos del padre:

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

Por supuesto, una forma aún mejor de organizar esto sería tener un único tipo de publicación personalizada para cada modelo de automóvil que almacene toda la información del automóvil, y mostrar las distintas subpáginas basadas en una solicitud GET que se pasa a la página y se usa en La plantilla de la página como un interruptor para determinar qué plantilla mostrar. De esa manera, puede evitar por completo la duplicación de datos y facilitar la adición de más información a la plantilla más adelante ...

Más detalles ...

Lo he hecho de un par de maneras diferentes. En un sitio donde tenía agentes (representantes de la compañía) como tipo de publicación personalizada, usé sus publicaciones para almacenar todos los datos relacionados con esa persona, pero en realidad nunca mostré esa página. En cambio, tenía una página de "Listado de agentes", una página de "Registro de rendimiento del agente" y una página de "Contacto con este agente", a las que siempre se llamaba con una variable GET y mostraba información de la publicación correspondiente. Entonces, el enlace permanente se vería como site.com/agent-listing/?agent=john-smith .

En otro sitio, configuré toda la información en una página y construí las tres vistas para esa página en la plantilla de la página. En su caso, eso se vería como site.com/cars/volvo-850/?pictures .

Y en la plantilla de la página incluirías una comprobación de esa variable cerca de la parte superior del contenido:

if ($_GET['pictures']) {

 // template for pictures page

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

 // template for tech specs page 

} else {

 // overview template

}
1
goldenapples

Si no desea crear tipos de publicación personalizados, y simplemente desea incluir una barra lateral personalizada para cada página o publicación, puede usar el complemento de la barra lateral de Graceful. Esto permite crear contenido de barra lateral personalizado desde la pantalla de edición de publicación o página usando campos adicionales llamados título elegante y contenido elegante. Estos se muestran en el área de la barra lateral como un widget cuando esta publicación o página se muestra en su blog. Más información sobre este complemento está disponible en http://www.mlynn.org/graceful-sidebar-plugin

0
Michael Lynn