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

10

(nota: esta pergunta era originalmente sobre campos personalizados, mas o @MikeSchinkel tinha uma solução melhor que envolvia tipos de postagem personalizados)

No meu site, tenho várias páginas nas quais 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

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 de estrada 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 maneira como eu acho que obteria a barra lateral certa é algo como isto no sidebar.php:

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

Aqui está um exemplo de página, a página 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, Especificações e Classificação, devem receber suas informações de um Tipo de postagem personalizado. Existe um método que seria fácil para o usuário final editar, o que significa que eles precisariam inserir esses dados personalizados apenas uma vez? Pode não ser necessário que cada um dos campos seja separado (ou seja, todas as Especificações podem ser inseridas em um campo Editor e toda a Classificação pode ser colocada no campo Trecho .. talvez)

cannyboy
fonte
2
Boa pergunta e realmente apreciei a edição do título e o conteúdo da pergunta para maior clareza; ajudará outras pessoas que tenham uma pergunta semelhante no futuro.
MikeSchinkel

Respostas:

14

ATUALIZAR:

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

Se você quiser fazer isso, basta codificar a barra lateral no single-car.phparquivo de modelo que incluí abaixo e usar sua ifdeclaração para determinar qual conteúdo será exibido para os diferentes URLs. Você poderia se esforçar para fazer o widget da barra lateral e desenvolver um widget personalizado, onde o widget extrairia as informações para o ID da postagem atual, mas por que ambos, a menos que você esteja criando isso como um tema para outras pessoas usarem?

Na verdade, existem várias maneiras sutilmente diferentes de fazer isso, mas a que estou sugerindo deve ser maravilhosa para suas necessidades.


Oi @cannyboy:

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

Uma abordagem alternativa?

... você poderia considerar a arquitetura diferente ? Eu acho que você ficará muito melhor criando um Tipo de postagem personalizado de "Carro" e poderá armazenar tudo para cada "página" no tipo de postagem de um carro. Aqui estão 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 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 tipos de postagem personalizados e as várias páginas, use um código como o seguinte, que registra o tipo de postagem personalizada "Carro" e define uma regra de reescrita para as páginas de seu carro . Coloque esse código no functions.phparquivo 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 para carros

Então você precisará de um arquivo de modelo específico do carro no 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 (a (visão geral) , 'especificações técnicas' e 'imagens' ) 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, também conhecidas como Funções auxiliares

É claro que usei algumas tags de modelo, também conhecidas como funções auxiliares, para minimizar a complexidade no arquivo de modelo nas condições da instrução if . Aqui estão elas e você também pode colocá-las no functions.phparquivo 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 Custom Post Type Love

Depois de ter todo esse código em vigor e adicionar um post de carro como o Volvo 850, você poderá 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 Imagens

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

MikeSchinkel
fonte
11
Muito agradável. Como você o configuraria para que as informações técnicas, etc., sejam dinâmicas (em vez de codificadas, como no seu exemplo)?
Travis Northcutt
11
Essa é uma pergunta complicada, por isso preciso entender seu caso de uso ou se é apenas um resumo hipotético? Eu posso fazer isso porque conheço a lista finita de possíveis correspondências. Se "correspondesse a qualquer coisa", substituiria outros padrões de correspondência do WordPress. Dê-me um exemplo concreto e eu darei uma solução, caso contrário, é uma lata de vermes.
MikeSchinkel
Obrigado pela sua resposta maravilhosa. Eu nunca havia pesquisado tipos de postagem personalizados antes, e eles parecem uma solução ideal. Eu atualizei a minha pergunta com mais alguns detalhes, principalmente a ver com barras laterais / widgets
cannyboy
@ Mike Apenas um hipotético. Para elaborar - estou me perguntando como você pode configurá-lo para que as informações na página de especificações técnicas (por exemplo) sejam inseridas no painel do administrador em algum lugar (um tipo de postagem personalizado, talvez usando uma taxonomia para definir o carro), ao contrário do arquivo de modelo.
Travis Northcutt
@tnorthcutt - Suponho que quando você diz "informações na página de especificações técnicas", você quer dizer "a lista de subpáginas?" Ou você quer dizer campos personalizados? Se este último assumi que as informações seriam armazenadas em campos personalizados. Meu exemplo não mostrou isso; talvez devesse ter?
MikeSchinkel
1

Acho que alguém já deve ter respondido isso na outra pergunta que você postou (sobre páginas pai / páginas intermediárias), mas aqui está 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 inserir os meta campos uma vez - na página pai - e nas páginas filhas, é possível extrair esses metadados do pai:

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

Obviamente, uma maneira ainda melhor de organizar isso seria ter um único tipo de postagem personalizado para cada modelo de carro que armazene 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 uma opção para determinar qual modelo será exibido. Dessa forma, você pode evitar completamente a duplicação de dados e facilitar a adição de mais informações ao modelo mais tarde ...

Mais detalhes...

Eu fiz isso de duas maneiras diferentes. Em um site em que eu tinha agentes (representantes da empresa) como um tipo de postagem personalizada, usei suas postagens para armazenar todos os dados relacionados a essa pessoa, mas nunca exibi essa página. Em vez disso, eu tinha uma página "Lista de agentes", uma página "Registro de desempenho do agente" e uma página "Entre em contato com este agente", sempre chamadas com uma variável GET e exibindo informações da postagem apropriada. Portanto, o link permanente se pareceria com 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, isso seria algo como site.com/cars/volvo-850/?pictures .

E no modelo da página, você incluiria uma verificação para essa variável na parte superior do conteúdo:

if ($_GET['pictures']) {

 // template for pictures page

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

 // template for tech specs page 

} else {

 // overview template

}
maçãs douradas
fonte
Muito obrigado! Para sua última sugestão, você quer dizer que eu criei uma página em branco (chamada talvez 'Volvo 850 Widget Data') que possui todos esses campos personalizados, e as outras páginas da Volvo 850 automaticamente capturam esses dados (er, de alguma forma)? (Isto significa que tenho de menus construir manualmente em Aparência> Menus, o que eu estou fazendo de qualquer maneira) ... Ou talvez os dados podem ser agarrados a partir da página Overview campos personalizados ...
cannyboy
Eu fiz as duas coisas. Eu editei minha resposta acima para explicar. O que você acaba fazendo depende muito de como você deseja que a criação do menu seja automatizada, como você disse.
goldenapples
Opa Acabei de ler mais e percebi que Mike já respondeu exatamente o que eu estava dizendo.
goldenapples
0

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

Michael Lynn
fonte