Додавання атрибутів сторінки Metabox та шаблонів сторінок до сторінки редагування публікацій?


14

( Примітка модераторів. Спочатку заголовок "Як я можу додати в редактор POSTS селектор" Атрибути сторінки "та / або" Атрибути сторінки> Шаблон ")

Наразі WP дозволяє лише призначити "шаблон" Сторінкам (тобто post_type=='page'). Я хотів би розширити цю функціональність і на "Повідомлення" (тобто post_type=='post')

Як я можу додати метаполе "Атрибути сторінки" та, зокрема, перемикач шаблонів до редактора публікацій?

Я припускаю, що це код, який я розміщу в functions.phpсвоїй темі.

ОНОВЛЕННЯ: Мені вдалося додати спадне меню з шаблонами шаблонів у свій редактор публікацій, просто додавши html-поле для вибору до мого існуючого спеціального вікна мета-параметрів. Ось код, який я використовую для цього ...

add_meta_box('categorydiv2', __('Post Options'), 'post_categories_meta_box_modified', 'post', 'side', 'high');

А ось функція, яка записує параметри та поле вибору шаблону ...

//adds the custom categories box
function post_categories_meta_box_modified() {
    global $post;
    if( get_post_meta($post->ID, '_noindex', true) ) $noindexChecked = " checked='checked'";
    if( get_post_meta($post->ID, '_nofollow', true) ) $nofollowChecked = " checked='checked'";
?>
<div id="categories-all" class="ui-tabs-panel">
    <ul id="categorychecklist" class="list:category categorychecklist form-no-clear">
        <li id='noIndex' class="popular-category"><label class="selectit"><input value="noIndex" type="checkbox" name="chk_noIndex" id="chk_noIndex"<?php echo $noindexChecked ?> /> noindex</label></li> 
        <li id='noFollow' class="popular-category"><label class="selectit"><input value="noFollow" type="checkbox" name="chk_noFollow" id="chk_noFollow"<?php echo $nofollowChecked ?> /> nofollow</label></li>
    </ul>

    <p><strong>Template</strong></p> 
    <label class="screen-reader-text" for="page_template">Post Template</label><select name="page_template" id="page_template"> 
    <option value='default'>Default Template</option> 
    <option value='template-wide.php' >No Sidebar</option>
    <option value='template-salespage.php' >Salespage</option>
    </select>
</div>
<?php
}

І, нарешті, код для захоплення обраних значень при збереженні ...

function save_post_categories_meta($post_id) {
    if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id;
    $noIndex = $_POST['chk_noIndex'];
    $noFollow = $_POST['chk_noFollow'];
    update_post_meta( $post_id, '_noindex', $noIndex );
    update_post_meta( $post_id, '_nofollow', $noFollow );
    return $post_id;
}

Тепер я вважаю, що все, що залишилося, - це (1) захоплення обраного шаблону та додавання його до мета публікації для цієї публікації та (2) зміна index.php та single.php, щоб він використовував обраний шаблон.


@Scott B : Ну я написав всю свою відповідь ще до того, як побачив, що ти над цим теж працюєш, і, здається, ти сприйняв це в дещо іншому напрямку, що твоє первісне запитання без твоїх дописів і жодних варіантів індексу. Сподіваюся, те, що я зробив, все ще має для вас цінність. Якщо ні, можливо, це допоможе іншим.
MikeSchinkel

Так, ви відповіли на питання. Коли я зрозумів, що мені не потрібно розбирати каталог, я взяв дещо інший крок, і я міг жорстко кодувати значення для моїх конкретних шаблонів. Мені все ж доведеться позичити частину вашого коду для фактичного отримання WP, щоб використовувати правильний призначений шаблон для посади.
Скотт Б

Відповіді:


12

Ненавиджу бути носієм поганих новин, але WordPress жорстко кодує функцію "Шаблон сторінки" до типу публікації на "сторінці" , принаймні в версії 3.0 (що може змінитися в наступних версіях, але немає конкретної ініціативи, яку я знаю, щоб змінити її Але це один з небагатьох разів, коли я намагаюся зрозуміти, як обійти щось, не зламаючи серцевину.)

Я придумав таке рішення - в основному скопіювати відповідний код з ядра WordPress та змінити його на наші потреби. Ось такі кроки (номери рядків від v3.0.1):

  1. Скопіюйте page_attributes_meta_box()функцію з рядка 535 /wp-admin/includes/meta-boxes.phpта модифікуйте відповідно до цього.

  2. Закодувати add_meta_boxesгак , щоб додати METABOX створений в # 1.

  3. Скопіюйте get_page_templates()функцію з рядка 166 /wp-admin/includes/theme.php та модифікуйте відповідно до цього.

  4. Скопіюйте page_template_dropdown()функцію з рядка 2550 /wp-admin/includes/template.phpта модифікуйте відповідно до цього.

  5. Додайте шаблон теми до своєї теми.

  6. Кодуйте save_postгачок, щоб увімкнути збереження імені файлу шаблону публікації при збереженні.

  7. Кодуйте single_templateгачок, щоб увімкнути завантаження шаблону публікації для пов’язаних публікацій.

Тепер з цим!


1. Скопіюйте page_attributes_meta_box()функцію

Як наш перший крок, вам потрібно скопіювати page_attributes_meta_box()функцію з рядка 535 /wp-admin/includes/meta-boxes.phpі я вирішив її перейменувати post_template_meta_box(). Оскільки ви просили лише шаблони сторінок, я пропустив код для вказівки батьківського допису та для визначення порядку, який робить код набагато простішим. Я також вирішив використовувати для цього postmeta, а не намагатися повторно використовувати page_templateвластивість об'єкта, щоб уникнути та можливих несумісностей, спричинених ненавмисним зв’язком. Отже ось код:

function post_template_meta_box($post) {
  if ( 'post' == $post->post_type && 0 != count( get_post_templates() ) ) {
    $template = get_post_meta($post->ID,'_post_template',true);
    ?>
<label class="screen-reader-text" for="post_template"><?php _e('Post Template') ?></label><select name="post_template" id="post_template">
<option value='default'><?php _e('Default Template'); ?></option>
<?php post_template_dropdown($template); ?>
</select>
<?php
  } ?>
<?php
}

2. Зашифруйте add_meta_boxesгачок

Наступним кроком є ​​додавання метабокса за допомогою add_meta_boxesгачка:

add_action('add_meta_boxes','add_post_template_metabox');
function add_post_template_metabox() {
    add_meta_box('postparentdiv', __('Post Template'), 'post_template_meta_box', 'post', 'side', 'core');
}

3. Скопіюйте get_page_templates()функцію

Я припускав, що має сенс розмежувати лише шаблони сторінок і шаблон публікації, таким чином, необхідність get_post_templates()функції, заснованої на get_page_templates()рядку 166 /wp-admin/includes/theme.php. Але замість того, щоб використовувати Template Name:маркер, на якому шаблоні сторінок використовуються ці функції, використовується Post Template:маркер, який ви можете бачити нижче.

Я також відфільтровує огляд functions.php (не знаю , як get_page_templates()ніколи правильно працювали без цього, але що завгодно!) І єдине , що залишилося зробити посилання зміни на слово pageдо postдля обслуговування читання вниз по дорозі:

function get_post_templates() {
  $themes = get_themes();
  $theme = get_current_theme();
  $templates = $themes[$theme]['Template Files'];
  $post_templates = array();

  if ( is_array( $templates ) ) {
    $base = array( trailingslashit(get_template_directory()), trailingslashit(get_stylesheet_directory()) );

    foreach ( $templates as $template ) {
      $basename = str_replace($base, '', $template);
      if ($basename != 'functions.php') {
        // don't allow template files in subdirectories
        if ( false !== strpos($basename, '/') )
          continue;

        $template_data = implode( '', file( $template ));

        $name = '';
        if ( preg_match( '|Post Template:(.*)$|mi', $template_data, $name ) )
          $name = _cleanup_header_comment($name[1]);

        if ( !empty( $name ) ) {
          $post_templates[trim( $name )] = $basename;
        }
      }
    }
  }

  return $post_templates;
}

4. Скопіюйте page_template_dropdown()функцію

Аналогічно скопіюйте page_template_dropdown()з рядка 2550, /wp-admin/includes/template.phpщоб створити, post_template_dropdown()і просто змініть його на виклик get_post_templates():

function post_template_dropdown( $default = '' ) {
  $templates = get_post_templates();
  ksort( $templates );
  foreach (array_keys( $templates ) as $template )
    : if ( $default == $templates[$template] )
      $selected = " selected='selected'";
    else
      $selected = '';
  echo "\n\t<option value='".$templates[$template]."' $selected>$template</option>";
  endforeach;
}

5. Додайте шаблон публікації

Наступний крок - додати шаблон публікації для тестування. Використовуючи Post Template:маркер, згаданий на кроці 3, скопіюйте single.phpз теми single-test.phpі додайте наступний заголовок коментаря ( не забудьте щось змінити, single-test.phpщоб ви могли сказати, що він завантажується замість single.php) :

/**
 * Post Template: My Test Template
 */

Після виконання кроків №1 до №5 ви побачите метабокс "Шаблони публікації" на сторінці редактора публікацій:

Як виглядав Metabox шаблонів публікацій при додаванні до WordPress 3.0
(джерело: mikeschinkel.com )

6. Зашифруйте save_postгачок

Тепер, коли у вас редактор відведений квадрат, вам потрібно фактично зберегти ім'я файлу шаблону сторінки в postmeta, коли користувач натисне "Опублікувати". Ось код для цього:

add_action('save_post','save_post_template',10,2);
function save_post_template($post_id,$post) {
  if ($post->post_type=='post' && !empty($_POST['post_template']))
    update_post_meta($post->ID,'_post_template',$_POST['post_template']);
}

7. Зашифруйте single_templateгачок

І нарешті, вам потрібно фактично отримати WordPress для використання ваших нових шаблонів публікацій. Ви робите це, підключивши single_templateта повернувши потрібну назву шаблону для тих постів, яким було призначено одне:

add_filter('single_template','get_post_template_for_template_loader');
function get_post_template_for_template_loader($template) {
  global $wp_query;
  $post = $wp_query->get_queried_object();
  if ($post) {
    $post_template = get_post_meta($post->ID,'_post_template',true);
    if (!empty($post_template) && $post_template!='default')
      $template = get_stylesheet_directory() . "/{$post_template}";
  }
  return $template;
}

І ось про це!

Зверніть увагу, що я не враховував лише типи спеціальних повідомленьpost_type=='post' . На мою думку, вирішення спеціальних типів публікацій вимагало б розмежування різних типів публікацій, і, хоча це не надто складно, я цього не робив.


Чудово! Я заснув з майже повним кодом у своєму редакторі з тим же підходом до копіювання функцій WordPress за замовчуванням (він був завершеним, але я не публікував би його, оскільки не перевіряв). :)
sorich87

@ sorich87 - Ви знаєте стару приказку: "Ви сопіть, ви розпущені!" Серйозно, хоча ТІЛЬКИ жартую. Насправді існує лише один розумний спосіб змусити його працювати, тому не дивно, що ваш код буде однаковим!
MikeSchinkel

Майку, ти продовжуєш дивуватися. Дуже дякую, що знайшли час, щоб вибити це.
Скотт Б

@ sorich87 - Дякую за роботу над цим. Я дуже ціную зусилля.
Скотт Б

1
@Scott B : Немає проблем, радий, що можу допомогти. Я шукаю досить загальні питання, які потенційно можуть допомогти багатьом людям, і намагаюся відповісти на них не тільки для людини, яка задає це питання, але і для тих, хто може прийти після.
MikeSchinkel

0

Wordpress дозволяє додавати мета до категорій за допомогою плагіна:

Для цього вам потрібно додати одне з різних розширень, що додає мета до категорій (імітуючи, які сторінки виходять із поля), Simple Term Meta прекрасно виконує цю роботу.

NB WordPress 3.x потрібен для розширення категорій.

Після цього ви можете використовувати:

  • add_term_meta
  • update_term_meta
  • get_term_meta

Використовуйте Functions.php, щоб додати методи, щоб робити те, що ви хочете, наприклад

add_action('category_add_form_fields', 'category_metabox_add', 10, 1);

function category_metabox_add($tag) { ?>
    <div class="form-field">
        <label for="image-url"><?php _e('Image URL') ?></label>
        <input name="image-url" id="image-url" type="text" value="" size="40" aria-required="true" />
        <p class="description"><?php _e('This image will be the thumbnail shown on the category page.'); ?></p>
    </div>
<?php } 

add_action('created_category', 'save_category_metadata', 10, 1);

function save_category_metadata($term_id)
{
    if (isset($_POST['image-url'])) 
        update_term_meta( $term_id, 'image-url', $_POST['image-url']);                  
}

Викликати нові поля в темах легко:

<?php echo get_term_meta(get_query_var('cat'), 'image-url', true); ?>

Детальніше та приклади: http://www.wphub.com/adding-metadata-taxonomy-terms/

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