it-swarm-pt.tech

Dados de tipo de postagem personalizados nos widgets da barra lateral?

(nota: esta questão era originalmente sobre Campos Personalizados, mas a @MikeSchinkel tinha uma solução melhor envolvendo Tipos de Postagens Personalizadas)

No meu site eu tenho várias páginas que eu quero mostrar os mesmos dados na barra lateral. Por exemplo, em uma estrutura 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

Eu gostaria que todas as páginas do Volvo 850 mostrassem os mesmos dados na barra lateral, todas as páginas da Porsche mostrassem um conjunto diferente de dados (por exemplo Speed, Maker, etc).

As páginas do Road teriam seu próprio conjunto de dados para cada estrada. Carros e Estradas também teriam um modelo de página próprio, e a forma como eu descobriria que a barra lateral direita seria assim dentro do sidebar.php:

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

Aqui está uma página de exemplo, a página do Volvo 850 Pictures. A mesma barra lateral (esquerda) deve aparecer nas outras páginas do Volvo 850, enquanto o material à direita é apenas o conteúdo da 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   |                                     |
------------------                                     |

Neste exemplo, os dois widgets da barra lateral, Specs e Rating devem obter suas informações de um tipo de postagem personalizada. Existe um método, que seria fácil para o usuário final editar, o que significa que eles teriam que inserir esses dados personalizados apenas uma vez? Pode não ser necessário que cada um dos campos seja separado (isto é, toda a especificação pode ser inserida em um campo Editor e toda a classificação pode ser colocada no campo Excerto. Talvez)

10
cannyboy

ATUALIZAR:

Com base na atualização da pergunta, preciso declarar explicitamente que o que é perguntado na pergunta pode ser feito com a resposta abaixo, apenas usei campos personalizados no tipo de postagem personalizada "Carro" para cada um dos itens você deseja exibir em todas as páginas de um determinado carro.

Se você quiser fazer isso, basta simplesmente codificar a barra lateral no arquivo de modelo single-car.php que eu incluí abaixo e usar sua instrução if para determinar qual conteúdo exibir para as diferentes URLs. Você poderia se esforçar para organizar sua barra lateral e desenvolver um widget personalizado onde o widget extrairia as informações para o ID do post atual, mas por que ambos, a menos que você esteja construindo isso como um tema para outras pessoas usarem?

Há realmente um monte de maneiras sutilmente diferentes para conseguir isso, mas o que estou sugerindo deve maravilhar-se maravilhosamente para as suas necessidades.


Oi @cannyboy:

Na verdade, não sei qual seria a melhor maneira de compartilhar campos personalizados entre as postagens. Mas isso pode ser apenas a bandeira vermelha que você precisa. Se algo parece muito difícil, talvez ...

Uma abordagem alternativa?

... você poderia shonsider arquitetar de forma diferente? Eu acho que você será muito melhor criar um Custom Post Typede "Car" e então você pode armazenar tudo para cada "page" no tipo Car post. Veja alguns exemplos de URLs:

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

Aprendendo sobre os tipos de postagem personalizados

Você pode aprender mais sobre os tipos de postagem personalizados nas respostas a estas perguntas:

Um tipo de postagem personalizada e uma regra de reconfiguração

Para implementar os Custom Post Types e as várias páginas, você usaria um código como o seguinte, que registra seu "Car" Custom Post Typee então define uma regra de reconfiguração para as páginas do seu carro. este código no arquivo functions.php do seu tema ou em um plug-in, o que você preferir:

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

Um arquivo de modelo de tema específico de carro

Então você precisa de um arquivo de modelo específico para Car em seu tema; o nome padrão para isso seria single-car.php. Eu codifiquei um modelo inicial para você que renderiza todos os três URLs (visão geral), 'tech-specs' e 'pictures') em um modelo usando uma instrução if para determinar qual conteúdo renderizar:

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

Observe no exemplo acima que estou sendo muito simplista com o uso de get_post_meta(); O site real precisaria ter muito mais complexidade lá.

Tags de modelo a.k.a. Helper Functions

É claro que usei algumas tags auxiliares para ajudar a minimizar a complexidade no arquivo de modelo nas condições da instrução if. Aqui estão eles e você também pode colocar estes no arquivo functions.php do seu 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 tela preenchidas com o Custom Type Type Love

Uma vez que você tenha todo esse código no lugar e tenha adicionado uma postagem Car como Volvo 850, você pode fazê-lo funcionar como as seguintes capturas de tela:

Página de visão geral

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

Página de especificações técnicas

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

Página de Fotos

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

14
MikeSchinkel

Acho que alguém já pode ter respondido à pergunta que você postou (sobre páginas mães/intermediárias), mas aqui está o que eu acho que a melhor maneira de estruturar seus dados é, com base no que você descreveu:

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

Dessa forma, você só precisa digitar os meta-campos uma vez - na página pai - e nas páginas filhas você pode extrair os metadados do pai:

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

É claro que uma maneira ainda melhor de organizar isso seria ter um único tipo de postagem personalizado para cada modelo de carro que armazena todas as informações do carro e exibir as várias subpáginas com base em uma solicitação GET que é passada para a página e usada em o modelo de página como um interruptor para determinar qual modelo exibir. Dessa forma, você pode evitar completamente a duplicação de dados e facilitar a adição de mais informações ao modelo posteriormente ...

Mais detalhes ...

Eu fiz isso de maneiras diferentes. Em um site em que eu tinha agentes (representantes da empresa) como um tipo de postagem personalizado, usei as postagens deles para armazenar todos os dados relacionados a essa pessoa, mas nunca exibi essa página. Em vez disso, eu tinha uma página "Listagem de agentes", uma página "Registro de desempenho do agente" e uma página "Entre em contato com esse agente", que sempre eram chamadas com uma variável GET e exibiam informações fora da postagem apropriada. Assim, o permalink seria algo como site.com/agent-listing/?agent=john-smith .

Em outro site, configurei todas as informações em uma página e construí todas as três visualizações dessa página no modelo de página. No seu caso, seria algo como site.com/cars/volvo-850/?pictures .

E no modelo de página você incluiria uma verificação para essa variável perto do topo do conteúdo:

if ($_GET['pictures']) {

 // template for pictures page

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

 // template for tech specs page 

} else {

 // overview template

}
1
goldenapples

Se você não deseja criar tipos de postagem personalizados e simplesmente deseja incluir uma barra lateral personalizada para cada página ou postagem, use o plug-in Gracioso da Barra Lateral. Isso permite criar conteúdo da barra lateral personalizada a partir da tela de edição de postagem ou página, usando campos adicionais chamados título elegante e conteúdo elegante. Eles são exibidos na área da barra lateral como um widget quando esta postagem ou página está sendo exibida em seu blog. Mais informações sobre este plugin estão disponíveis em http://www.mlynn.org/graceful-sidebar-plugin

0
Michael Lynn