scottb
  • 0
Гуру

Добавление метабокса атрибутов страницы и шаблонов страниц на страницу редактирования сообщений?

  • 0

( Примечание модератора: заголовок изначально был «Как добавить селектор «Атрибуты страницы» и/или «Атрибуты страницы > Шаблон» в редактор 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, чтобы он использовал выбранный шаблон.

Share
  1. @Scott B : Ну, я написал весь свой ответ до того, как увидел, что вы тоже работаете над ним, и, похоже, вы взяли его в несколько ином направлении, чем ваш первоначальный вопрос с параметрами «нет подписки» и «без индекса». Надеюсь, то, что я сделал, все еще имеет ценность для вас. Если нет, возможно, это поможет другим.

    • 0
  2. Ненавижу быть носителем плохих новостей, но WordPress жестко кодирует функциональность шаблона страницы для типа записи «страница», по крайней мере, в версии 3.0 (это может измениться в будущих версиях, но я не знаю конкретной инициативы, чтобы изменить это Так что это один из немногих случаев, когда я изо всех сил пытаюсь понять, как обойти что-то, не взламывая ядро.)

    Решение, которое я придумал, состоит в том, чтобы скопировать соответствующий код из ядра WordPress и изменить его в соответствии с нашими потребностями. Вот шаги (номера строк из версии 3.0.1):

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

    2. add_meta_boxes Напишите хук, чтобы добавить метабокс, созданный в #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, вы увидите метабокс «Шаблоны сообщений» на странице редактора сообщений:

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

    • 0
  3. 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/

    • 0

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

You must login to add an answer.