Пользовательские данные типа сообщения в виджетах боковой панели?

10

(примечание: изначально этот вопрос был о пользовательских полях, но у @MikeSchinkel было лучшее решение с использованием пользовательских типов записей)

На моем сайте есть несколько страниц, на которых я хочу показать те же данные в боковой панели. Например, в такой структуре:

-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

Я хотел бы, чтобы все страницы Volvo 850 отображали одинаковые данные на боковой панели, а все страницы Porsche - разные наборы данных (например, Speed, Maker и т. Д.).

Страницы дороги будут иметь свой собственный набор данных для каждой дороги. Автомобили и дороги также будут иметь собственный шаблон страницы, и, как я полагаю, он получит правую боковую панель, что-то вроде этого в sidebar.php:

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

Вот примерная страница, страница изображений Volvo 850. Та же самая (левая) боковая панель должна появиться на других страницах Volvo 850, в то время как справа - просто содержимое страницы.

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

В этом примере два виджета боковой панели, спецификации и рейтинг должны получать информацию из пользовательского типа сообщения. Есть ли способ, который было бы легко отредактировать конечным пользователям, что означает, что ему придется вводить эти пользовательские данные только один раз? Возможно, нет необходимости разделять каждое из полей (т. Е. Все спецификации могут быть введены в поле редактора, а все рейтинги могут быть помещены в поле отрывка ... возможно)

cannyboy
источник
2
Хороший вопрос и очень ценю ваше редактирование заголовка и вопрос содержания для ясности; это поможет другим, у кого есть подобный вопрос в будущем.
MikeSchinkel

Ответы:

14

ОБНОВИТЬ:

Основываясь на обновлении вопроса, я думаю, что мне нужно явно указать, что то, что задано в вопросе, может быть сделано с ответом ниже, просто использовали настраиваемые поля в пользовательском типе записи «Автомобиль» для каждого из элементов, которые вы хотите отобразить на все страницы для данного автомобиля.

Если вы хотите сделать это, просто жестко закодируйте боковую панель в single-car.phpфайл шаблона, который я включил ниже, а затем используйте свое ifзаявление, чтобы определить, какой контент отображать для разных URL-адресов. Вы могли бы приложить усилия, чтобы виджетизировать вашу боковую панель и разработать собственный виджет, в котором виджет извлекал бы информацию для текущего идентификатора сообщения, но почему бы и то и другое, если вы не создаете это как тему для использования другими людьми?

На самом деле есть несколько хитроумных способов сделать это, но тот, который я предлагаю, должен удивительно удивиться вашим потребностям.


Привет @ cannyboy:

Я на самом деле не знаю, как лучше всего делиться пользовательскими полями между постами. Но это может быть просто красный флаг, который вам нужен. Если что-то кажется слишком сложным, может быть ...

Альтернативный подход?

... вы могли бы задуматься об этом по-другому ? Я думаю , вы будете гораздо лучше создать пользовательское сообщение Тип из «Автомобиля» , а затем вы можете хранить все для каждой «страницы» в посте одного типа автомобиля. Вот несколько примеров URL:

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

Изучение пользовательских типов сообщений

Вы можете узнать больше о пользовательских типах постов, ответив на следующие вопросы:

Пользовательский тип сообщения и правило переписывания

Для реализации пользовательских типов постов и нескольких страниц вы должны использовать код, подобный следующему, который регистрирует ваш пользовательский тип поста «Автомобиль», а затем устанавливает правило перезаписи для ваших автомобильных страниц . Поместите этот код в functions.phpфайл вашей темы или в плагин, в зависимости от того, что вы предпочитаете:

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

Автомобиль -специфической Тема Файл шаблона

Тогда вам понадобится файл шаблона, специфичный для автомобиля, в вашей теме ; имя по умолчанию для этого будет single-car.php. Я написал для вас стартовый шаблон, который отображает все три URL-адреса ( (обзор) , «технические характеристики» и «картинки» ) в одном шаблоне, используя оператор if, чтобы определить, какой контент отображать:

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

Обратите внимание, что в приведенном выше примере я очень упрощен с использованием get_post_meta(); реальный сайт должен был бы иметь намного больше сложности там.

Теги шаблона ака вспомогательные функции

Конечно, я использовал некоторые теги шаблона или вспомогательные функции, чтобы минимизировать сложность файла шаблона в условиях оператора if . Вот они, и вы можете поместить их в functions.phpфайл вашей темы :

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

Скриншоты заполнены Custom Post Type Love

Когда у вас есть весь этот код и вы добавили пост автомобиля, такой как Volvo 850, вы можете заставить его работать, как на следующих скриншотах:

Обзорная страница

http://example.com/cars/volvo850/
(источник: mikeschinkel.com )

Страница технических спецификаций

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

Страница изображений

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

MikeSchinkel
источник
1
Очень хорошо. Как бы вы настроили его так, чтобы информация о технических характеристиках и т. Д. Была динамичной (а не жестко закодированной, как в вашем примере)?
Трэвис Норткатт
1
Это сложный вопрос, поэтому мне нужно понять ваш вариант использования или это просто абстрактная гипотеза? Я могу сделать это, потому что я знаю конечный список возможных совпадений. Если бы это было «соответствовать чему-либо», это переопределило бы другие шаблоны соответствия WordPress. Приведите мне конкретный пример, и я дам решение, иначе это банка червей.
MikeSchinkel
Спасибо за ваш чудесный ответ. Я никогда не копался в пользовательских типах постов раньше, и они кажутся идеальным решением. Я обновил свой вопрос,
добавив
@mike Просто гипотетически. Чтобы уточнить - мне интересно, как вы могли бы настроить его так, чтобы информация на (например) странице технических характеристик была где-то введена в панель администратора (пользовательский тип сообщения, может быть, с использованием таксономии для установки автомобиля?), в отличие от файла шаблона.
Трэвис Норткатт
@ tnorthcutt - я полагаю, когда вы говорите "информация на странице технических характеристик", вы имеете в виду "список подстраниц?" Или вы имеете в виду настраиваемые поля? Если последнее я предполагал, что информация будет храниться в пользовательских полях. Мой пример не показал этого; может быть, так и должно быть?
MikeSchinkel
1

Я думаю, что кто-то уже мог ответить на этот вопрос по другому вопросу, который вы разместили (о родительских страницах / промежуточных страницах), но вот то, что я думаю, лучший способ структурировать ваши данные на основе того, что вы описали:

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

Таким образом, вам нужно всего лишь один раз ввести мета-поля - на родительской странице - и на дочерних страницах вы можете извлечь эти метаданные из родительской страницы:

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

Конечно, еще лучший способ организовать это - иметь один отдельный тип поста для каждой модели автомобиля, в котором хранится вся информация об автомобиле, и отображать различные подстраницы на основе запроса GET, который передается на страницу и используется в шаблон страницы как переключатель, чтобы определить, какой шаблон отображать. Таким образом, вы можете полностью избежать дублирования данных и упростить добавление дополнительной информации в шаблон позже ...

Подробнее ...

Я сделал это несколькими разными способами. На одном сайте, где у меня были агенты (представители компаний) в качестве пользовательских типов сообщений, я использовал их сообщения для хранения всех данных, относящихся к этому человеку, но на самом деле никогда не отображал эту страницу. Вместо этого у меня была страница «Список операторов», страница «Отчет о производительности агента» и страница «Связаться с этим агентом», которые всегда вызывались с помощью переменной GET и отображали информацию из соответствующего поста. Таким образом, постоянная ссылка будет выглядеть примерно так: site.com/agent-listing/?agent=john-smith .

На другом сайте я установил всю информацию на одной странице и встроил все три представления для этой страницы в шаблон страницы. В вашем случае это будет выглядеть примерно так: site.com/cars/volvo-850/?pictures .

И в шаблон страницы вы должны включить проверку этой переменной в верхней части содержимого:

if ($_GET['pictures']) {

 // template for pictures page

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

 // template for tech specs page 

} else {

 // overview template

}
goldenapples
источник
Большое спасибо! Что касается вашего последнего предложения, вы имеете в виду, что я создаю пустую страницу (возможно, называемую «данными виджетов Volvo 850»), в которой есть все эти пользовательские поля, а другие страницы Volvo 850 автоматически собирают эти данные (э-э, как-то)? (это означает, что я должен создать меню вручную в «Внешний вид»> «Меню», что я и делаю в любом случае) ... Или, возможно, данные можно получить из пользовательских полей на странице «Обзор» ...
cannyboy
Я сделал это в обе стороны. Я отредактировал свой ответ выше, чтобы объяснить. То, что вы в конечном итоге делаете, во многом зависит от того, насколько автоматизированным должно быть создание вашего меню, как вы сказали.
золотые яблоки
К сожалению. Я просто прочитал дальше и понял, что Майк уже ответил именно на то, что я говорил.
золотые яблоки
0

Если вы не хотите создавать пользовательские типы сообщений и просто хотите добавить пользовательскую боковую панель для каждой страницы или сообщения, вы можете использовать плагин Graceful Sidebar. Это позволяет создавать пользовательский контент боковой панели прямо из экрана редактирования сообщения или страницы, используя дополнительные поля, называемые изящным заголовком и изящным содержимым. Затем они отображаются в области боковой панели как виджет, когда эта запись или страница отображается в вашем блоге. Более подробная информация об этом плагине доступна на http://www.mlynn.org/graceful-sidebar-plugin

Майкл Линн
источник