cannyboy
  • 0
Новичок

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

  • 0

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

Страницы дорог будут иметь собственный набор данных для каждой дороги. Автомобили и дороги также будут иметь собственный шаблон страницы, и я думаю, что правильная боковая панель будет выглядеть примерно так в 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   |                                     |
------------------                                     |

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

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

    • 0
    • Очень хорошо. Как бы вы настроили его, чтобы информация о технических характеристиках и т. д. была динамической (а не жестко закодированной, как в вашем примере)?

      • 0
    • Это сложный вопрос, поэтому мне нужно понять ваш вариант использования или это просто абстрактная гипотеза? Я могу это сделать, потому что знаю конечный список потенциальных совпадений. Если бы это было «совпадение с чем-либо», оно переопределяло бы другие шаблоны соответствия WordPress. Приведите мне конкретный пример, и я дам решение, иначе это будет червяк.

      • 0
    • Спасибо за ваш замечательный ответ. Раньше я никогда не копался в пользовательских типах сообщений, и они кажутся идеальным решением. Я обновил свой вопрос, добавив еще несколько деталей, в основном связанных с боковыми панелями/виджетами.

      • 0
    • @mike Просто гипотетически. Чтобы уточнить — мне интересно, как вы могли бы настроить его так, чтобы информация на (например) странице технических характеристик вводилась где-то на панели администратора (возможно, пользовательский тип сообщения, используя таксономию для установки автомобиля?), в отличие от файла шаблона.

      • 0
    • @tnorthcutt — я полагаю, когда вы говорите «информация на странице технических характеристик», вы имеете в виду «список подстраниц?» Или вы имеете в виду настраиваемые поля? Если последнее, я предполагал, что информация будет храниться в настраиваемых полях. Мой пример этого не показал; может так и должно было быть?

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

      • 0
    • Я сделал это в обоих направлениях. Я отредактировал свой ответ выше, чтобы объяснить. То, что вы в конечном итоге сделаете, во многом зависит от того, насколько автоматизированным вы хотите создать свое меню, как вы сказали.

      • 0
    • Упс. Я только что прочитал дальше и понял, что Майк уже ответил именно на то, что я говорил.

      • 0
  2. ОБНОВИТЬ:

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

    Если вы хотите сделать это, просто жестко закодируйте боковую панель в 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/

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

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

    • 0

Оставить ответ

You must login to add an answer.