¿Datos de tipo de publicación personalizados en los widgets de la barra lateral?

10

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

    
pregunta cannyboy 24.08.2010 - 22:37

3 respuestas

14

ACTUALIZACIÓN:

Sobre la base de la actualización de la pregunta, creo que debo declarar explícitamente que lo que se pregunta en la pregunta se puede hacer con la respuesta a continuación, solo usé campos personalizados en la publicación personalizada "Car" escriba para cada uno de los elementos que desea que se muestren en todas las páginas de 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ía hacer un esfuerzo para crear un widget de su barra lateral y desarrollar un widget personalizado donde el widget obtendría la información de la ID de la publicación actual, pero ¿por qué a menos que esté creando esto como un tema para que otras personas lo utilicen?

En realidad, hay un montón de formas sutilmente diferentes para lograr esto, pero la que estoy sugiriendo debería maravillarse con sus necesidades.

Hola @cannyboy:

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

¿Un enfoque alternativo?

... ¿podría considerar la arquitectura diferente ? Creo que estarás mucho mejor creando un Tipo de publicación personalizado de "Coche" y luego podrás almacenar todo para cada "página" en el tipo de puesto de un coche. Aquí hay algunos ejemplos de URL:

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

Aprender sobre tipos de mensajes personalizados

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

Un tipo de publicación personalizada y una regla de reescritura

Para implementar Tipos de Publicaciones Personalizadas y las múltiples páginas, usaría un código como el siguiente que registra su "Coche" Tipo de Publicación Personalizada y luego establece una reescribe la regla para las páginas de tu auto . Coloque este código en el archivo functions.php de su tema o en un complemento, según lo que prefiera:

<?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 Coche , archivo de plantilla de tema específico

Luego, necesitarás un archivo de plantilla específico para tu Coche en tu tema ; el nombre predeterminado para esto sería single-car.php . He codificado una plantilla de inicio para usted que representa las tres URL (las (descripción general) , 'tech-specs' y 'pictures' ) en una plantilla usando una declaración if para determinar qué contenido se debe mostrar:

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

Note en el ejemplo anterior que estoy siendo muy simplista con el uso de get_post_meta() ; El sitio real tendría que 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 de ayuda para minimizar la complejidad en el archivo de plantilla en las condiciones de la declaración if . Aquí están y puedes ponerlos en el archivo functions.php de tu 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 amor personalizado tipo de publicación

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 las siguientes capturas de pantalla:

Página de información general

Páginadeespecificacionestécnicas

Página de imágenes

    
respondido por el MikeSchinkel 25.08.2010 - 02:48
1

Creo que alguien podría haber respondido esto en la otra pregunta que publicaste (sobre páginas principales / páginas intermedias), pero creo que esta es la mejor forma 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 esos 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 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 su lugar, 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. Así que 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

}
    
respondido por el goldenapples 24.08.2010 - 23:59
0

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 enlace

    
respondido por el Mike Lynn 29.12.2010 - 16:08

Lea otras preguntas en las etiquetas