Datos de tipo de publicación personalizada en widgets de barra lateral?


10

(nota: esta pregunta fue originalmente sobre campos personalizados, pero @MikeSchinkel tenía una mejor solución que involucra tipos de publicaciones personalizadas)

En mi sitio tengo varias páginas en las 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 de Volvo 850 muestren los mismos datos en la barra lateral, todas las páginas de Porsche muestren 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 derecha 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 fotos del Volvo 850. La misma barra lateral (izquierda) debería 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 Calificación deberían obtener su información de un Tipo de publicación personalizado. ¿Existe un método que sería fácil de editar para el usuario final, lo que significa que tendrían que ingresar estos datos personalizados solo una vez? Es posible que no sea necesario que cada uno de los campos esté separado (es decir, todas las especificaciones podrían ingresarse dentro de un campo Editor y todas las calificaciones podrían colocarse en el campo Extracto ... tal vez)


2
Buena pregunta y realmente aprecié su edición del título y el contenido de la pregunta para mayor claridad; ayudará a otros que tengan una pregunta similar en el futuro.
MikeSchinkel

Respuestas:


14

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 "Auto" para cada uno de los elementos que desea mostrar en todas las páginas para un auto dado.

Si desea hacerlo, simplemente codifique la barra lateral en el single-car.phparchivo de plantilla que incluí a continuación y luego use su ifdeclaración 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ías brillar la arquitectura de manera diferente ? Creo que será mucho mejor crear un tipo de publicación personalizada de "Auto" 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 Tipo de publicación personalizada "Auto" y luego establece una regla de reescritura para las páginas de su auto . Pon este código en el functions.phparchivo 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
}

Un archivo de plantilla de tema específico del automóvil

Entonces necesitará un archivo de plantilla específico para el automóvil en su tema ; El nombre predeterminado para esto sería single-car.php. Codifiqué una plantilla de inicio para usted que representa las tres URL (la (descripción general) , las 'especificaciones técnicas' y las '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 aka Funciones de ayuda

Por supuesto, utilicé algunas etiquetas de plantilla, también conocidas como funciones de ayuda, para minimizar la complejidad en el archivo de plantilla en las condiciones de la declaración if . Aquí están y también puedes ponerlos en el functions.phparchivo de tu 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);
}

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 de Car como Volvo 850 , 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/


1
Muy agradable. ¿Cómo lo configuraría para que la información sobre especificaciones técnicas, etc. sea dinámica (en lugar de codificada, como en su ejemplo)?
Travis Northcutt

1
Esa es una pregunta difícil, así que necesito entender su caso de uso o si es solo un resumen hipotético. Puedo hacer esto porque conozco la lista finita de coincidencias potenciales. Si fuera "coincidir con algo", anularía los otros patrones de coincidencia de WordPress. Dame un ejemplo concreto y te daré una solución, de lo contrario es una lata de gusanos.
MikeSchinkel

Gracias por tu maravillosa respuesta. Nunca antes había profundizado en los Tipos de publicaciones personalizadas, y parecen una solución ideal. He actualizado mi pregunta con algunos detalles más, principalmente relacionados con barras laterales / widgets
cannyboy

@mike Solo un hipotético. Para elaborar: me pregunto cómo podría configurarlo para que la información en la página de especificaciones técnicas (por ejemplo) se ingrese en el panel de administración en algún lugar (¿un tipo de publicación personalizada, tal vez, usando una taxonomía para configurar el automóvil?), a diferencia de en el archivo de plantilla.
Travis Northcutt

@tnorthcutt - Supongo que cuando dices "información en la página de especificaciones técnicas" te refieres a "la lista de subpáginas". ¿O te refieres a campos personalizados? Si esto último supuse que la información se almacenaría en campos personalizados. Mi ejemplo no mostró eso; tal vez debería haberlo hecho?
MikeSchinkel

1

Creo que alguien podría haber respondido esto en la otra pregunta que publicó (sobre páginas principales / páginas intermedias), pero esto es lo que creo que es la mejor manera de estructurar sus datos, según lo que ha 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 esos metadatos del principal:

<?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 en función de una solicitud GET que se pasa a la página y se utiliza en la plantilla de 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 dos maneras diferentes. En un sitio donde tenía agentes (representantes de la compañía) como tipo de publicación personalizada, utilicé sus publicaciones para almacenar todos los datos relacionados con esa persona, pero en realidad nunca visualicé 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 "Contactar con este agente", que siempre se llamaban con una variable GET y mostraban 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 página. En su caso, sería algo así como site.com/cars/volvo-850/?pictures .

Y en la plantilla de página incluirías una marca para 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

}

¡Muchas gracias! Para su última sugerencia, ¿quiere decir que creo una página en blanco (llamada quizás 'Datos de widget de Volvo 850') que tiene todos estos campos personalizados, y las otras páginas de Volvo 850 capturan automáticamente estos datos (er, de alguna manera)? (esto significa que tengo que construir menús manualmente en Apariencia> Menús, lo que estoy haciendo de todos modos) ... O tal vez los datos se pueden obtener de los Campos personalizados de la página Descripción ...
cannyboy

Lo he hecho en ambos sentidos. Edité mi respuesta anterior para explicar. Lo que terminas haciendo depende en gran medida de lo automatizado que quieras que sea la creación de tu menú, como dijiste.
goldenapples

Ups Acabo de leer más y me di cuenta de que Mike ya respondió exactamente lo que estaba diciendo.
goldenapples

0

Si no desea crear tipos de publicaciones personalizadas, y simplemente desea incluir una barra lateral personalizada para cada página o publicación, puede usar el complemento Graceful Sidebar. Esto permite crear contenido de barra lateral personalizado directamente desde la pantalla de publicación o edición de página utilizando 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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.