Дані про тип користувальницької пошти у віджетах бічної панелі?


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

Я хотів би, щоб усі сторінки 850 850 відображали однакові дані на бічній панелі, а всі сторінки Porsche мали різний набір даних (наприклад, Speed, Maker тощо).

Сторінки «Дорога» матимуть власний набір даних для кожної дороги. Автомобілі та дороги також матимуть власний шаблон сторінки, і, як я вважаю, це отримає праву бічну панель, це щось подібне в бічній панелі.php:

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

Ось приклад сторінки, сторінки Volvo 850 Pictures. Така ж (ліва) бічна панель повинна з’являтися на інших сторінках 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   |                                     |
------------------                                     |

У цьому прикладі два віджети бічної панелі, характеристики та рейтинг повинні отримувати свою інформацію від користувацького типу публікації. Чи існує метод, який буде легким для редагування кінцевим користувачем, це означає, що їм доведеться вводити ці спеціальні дані лише один раз? Можливо, не потрібно, щоб кожне з полів було окремим (тобто всі Spec можна було ввести в поле редактора, і все Рейтинг можна поставити в поле Excerpt .. можливо)


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

Скріншоти, заповнені Love Custom Type Love

Після того, як ви встановите весь цей код і додасте допис для автомобіля, як Volvo 850, ви зможете його працювати як наступні знімки екрана:

Сторінка огляду

http://example.com/cars/volvo850/
(джерело: mikeschinkel.com )

Сторінка технічних характеристик

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

Сторінка зображень

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


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

}

Дуже дякую! Чи ви маєте на увазі вашу останню пропозицію, що я створюю порожню сторінку (яка, можливо, називається «Дані віджетів Volvo 850»), на якій є всі ці спеціальні поля, а інші сторінки Volvo 850 автоматично захоплюють ці дані (так, якось)? (це означає, що мені доведеться створювати меню вручну в зовнішньому вигляді> меню, що я все одно роблю) ... Або, можливо, дані можна
захопити

Я зробив це обома способами. Я відредагував свою відповідь вище, щоб пояснити. Що ви в кінцевому підсумку робите, залежить багато від того, наскільки автоматичним ви хочете створити меню, як ви сказали.
goldenapples

На жаль Я просто зачитав далі і зрозумів, що Майк вже відповів точно, що я говорив.
goldenapples

0

Якщо ви не хочете створювати власні типи публікацій, а ви просто хочете включити спеціальну бічну панель для кожної сторінки чи публікації, ви можете використовувати модуль «Витончена бічна панель». Це дозволяє створювати власний вміст бічної панелі прямо на екрані публікації чи редагування сторінки, використовуючи додаткові поля, які називаються витонченою назвою та витонченим вмістом. Потім вони відображаються в області бічної панелі як віджет, коли ця публікація або сторінка відображається у вашому блозі. Більш детальна інформація про цей плагін доступна на веб- сайті http://www.mlynn.org/graceful-sidebar-plugin

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.