it-swarm.xyz

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

(примечание: изначально этот вопрос был о пользовательских полях, но у @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   |                                     |
------------------                                     |

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

10
cannyboy

Обновление:

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

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

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


Привет @cannyboy:

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

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

... вы могли бы подумать по-другому проектировать ? Я думаю, вам будет гораздо лучше создать Пользовательский тип записи of "Car", а затем вы можете сохранить все для каждого "page" в один Тип авто поста. Вот несколько примеров 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
}

A Car- файл шаблона темы

Тогда вам понадобится специальный шаблонный файл Car в вашей теме ; имя по умолчанию для этого будет 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(); реальный сайт должен был бы иметь намного больше сложности там.

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

Конечно, я использовал некоторые теги шаблона a.k.a. вспомогательные функции, чтобы минимизировать сложность в файле шаблона в условиях оператора 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/

14
MikeSchinkel

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

 - 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

}
1
goldenapples

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

0
Michael Lynn