Yazı Düzenleme Sayfasına Sayfa Nitelikleri Metabox ve Sayfa Şablonları Eklensin mi?


14

( Moderatörler not: Başlık orijinal olarak "" Sayfa Özellikleri "ve / veya" Sayfa Özellikleri> Şablon "seçicisini POSTS düzenleyicisine nasıl ekleyebilirim")

WP şu anda sadece Sayfalar için bir "şablon" atanmasına izin veriyor (yani post_type=='page'.) Ben de bu işlevselliği Yayınlar için genişletmek istiyorum (yani post_type=='post'.)

"Sayfa Özellikleri" meta kutusunu ve daha spesifik olarak şablon değiştiriciyi yayın düzenleyicisine nasıl ekleyebilirim ?

Bu functions.phpbenim tema için yerleştireceğim kod olduğunu varsayalım.

GÜNCELLEME: Mevcut özel meta seçeneklerim kutusuna seçim kutusunu html ekleyerek sabit kodlu şablonlar açılır menüsünü yazı düzenleyicime eklemeyi başardım. İşte bunun için kullanıyorum kodu ...

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

İşte seçenekleri ve şablon seçme kutusunu yazan işlev ...

//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
}

Ve son olarak, kaydetme seçilen değerleri yakalamak için kod ...

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

Şimdi, geriye kalan tek şeyin (1) seçilen şablonu yakalamak ve bu yazı için meta metaya eklemek ve (2) index.php ve single.php'yi seçilen şablonu kullanacak şekilde değiştirmek olduğuna inanıyorum.


@Scott B : Ben de üzerinde çalıştığınızı görmeden önce tüm cevabımı yazdım ve orijinal sorunuzun takip ve indeks seçeneklerinizden biraz farklı bir yöne götürdüğünüz anlaşılıyor. Umarım yaptığımın senin için hala değeri vardır. Değilse, belki başkalarına yardımcı olacaktır.
MikeSchinkel

Evet, soruyu cevapladın. Dizini ayrıştırmaya gerek duymadığımı ve belirli şablonlar için değerleri kodlayabildiğimi fark ettikten sonra biraz farklı bir çakışma yaptım. Hala muhtemelen yazı için doğru atanmış şablonu kullanmak için WP almak için bazı kod ödünç almak gerekir.
Scott B

Yanıtlar:


12

Kötü haberlerin taşıyıcısı olmaktan nefret ediyorum, ancak WordPress, Sayfa Şablonu işlevini en azından v3.0'da (gelecekteki sürümlerde değişebilecek ancak değiştirmeyi bildiğim belirli bir girişim yok) "sayfa" yayın türüne zorlar Yine de bu, çekirdeği hacklemeden bir şeyin etrafından nasıl dolaşacağımı anlamaya çalıştığım birkaç zamandan biri.)

Geldiğim çözüm temel olarak ilgili kodu WordPress çekirdeğinden kopyalayıp ihtiyaçlarımıza göre değiştirmektir. Adımlar (satır numaraları v3.0.1'den alınmıştır):

  1. page_attributes_meta_box()İşlevi 535 satırından kopyalayın/wp-admin/includes/meta-boxes.php ve uygun şekilde değiştirin.

  2. add_meta_boxes# 1'de oluşturulan meta kutuyu eklemek için bir kanca kodlayın.

  3. get_page_templates()İşlevi 166. satırdan kopyalayın/wp-admin/includes/theme.php ve uygun şekilde değiştirin.

  4. page_template_dropdown()İşlevi 2550 satırından kopyalayın/wp-admin/includes/template.php ve uygun şekilde değiştirin.

  5. Temanıza bir Yazı Şablonu ekleyin.

  6. save_postKaydettikten sonra yazı şablonu dosya adının saklanmasını sağlamak için bir kanca kodlayın .

  7. single_templateİlişkili gönderiler için gönderi şablonunun yüklenmesini etkinleştirmek üzere bir kanca kodlayın .

Şimdi onunla!


1. page_attributes_meta_box()İşlevi kopyalayın

İlk adım olarak, page_attributes_meta_box()işlevi 535 satırından kopyalamanız gerekiyor /wp-admin/includes/meta-boxes.phpve yeniden adlandırmayı seçtim post_template_meta_box(). Siz sadece sayfa şablonlarını sorduğunuzdan, bir üst postayı belirtmek ve kodu daha basit hale getiren siparişi belirtmek için kodu atladım. Ayrıca page_templateistemeden kuplajın neden olduğu olası uyumsuzluklardan kaçınmak için nesne özelliğini yeniden kullanmaya çalışmak yerine postmeta kullanmayı seçtim . İşte kod:

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_boxesKancayı kodlayın

Sonraki adım, add_meta_boxesçengel kullanarak meta kutuyu eklemektir :

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()İşlevi kopyalayın

Ben sadece sayfa şablonları ve yazı şablonu arasında ayrım yapmak mantıklı olacağını düşündüm, böylece satır 166 get_post_templates()dayalı bir fonksiyon ihtiyacı . Ancak hangi sayfa şablonlarının kullandığı işaretçiyi kullanmak yerine, bu işlevi aşağıda görebileceğiniz bir işaretçi kullanır .get_page_templates()/wp-admin/includes/theme.phpTemplate Name:Post Template:

Ben de denetlenmesine filtrelenen functions.php (değil emin nasıl get_page_templates()! O olmadan düzgün çalıştığı bir zamanda, ama neyse) Ve tek şey sol kelime değişikliği başvuruları etmektir pageiçin postyolda bakım okunabilmesi için:

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()İşlevi kopyalayın

Benzer şekilde oluşturmak için page_template_dropdown()2550 satırından kopyalayın ve bunun yerine çağrı yapmak üzere değiştirin :/wp-admin/includes/template.phppost_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. Yazı Şablonu Ekle

Sonraki adım, test için bir yazı şablonu eklemektir. Kullanılması Post Template:adım 3. kopya belirtilen işaretleyici single.phpiçin temasından single-test.phpve aşağıdaki açıklama başlığını ekleyin ( bir şey değiştirmeye özen single-test.phpbunu söyleyebilir böylece yerine yükleniyor single.php) :

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

1 ile 5 arasındaki adımları tamamladıktan sonra "Yazı Şablonları" meta kutunuzun yazı düzenleyici sayfanızda göründüğünü görebilirsiniz :

WordPress 3.0'a eklendiğinde Yayın Şablonları Meta Kutusu neye benziyor?
(kaynak: mikeschinkel.com )

6. save_postKancayı kodlayın

Artık düzenleyicinin karesini aldığınızdan, kullanıcı "Yayınla" yı tıkladığında postmeta yapmak için sayfa şablonu dosya adınızı kaydetmeniz gerekir. İşte bunun kodu:

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_templateKancayı kodlayın

Son olarak, yeni yazı şablonlarınızı kullanmak için WordPress almanız gerekir. Bunu, single_templateatanmış bir gönderi için istediğiniz şablon adını bağlayarak ve döndürerek yapabilirsiniz :

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

Ve hepsi bu kadar!

NOT Bunu vermedi dikkate alınması Özel Mesaj Türleri sadece post_type=='post'. Benim düşünceme göre özel yazı türlerini ele almak, farklı yazı türleri arasında ayrım yapılmasını gerektirecek ve aşırı zor olmasa da, burada denemedim.


Harika! Varsayılan WordPress işlevlerini kopyalamakla aynı yaklaşımla editörümde neredeyse tam bir kodla uyumaya gittim (tamamlandı, ancak test etmediğimden beri yayınlamam). :)
sorich87

@ sorich87 - Eski deyişi biliyorsun, "Sen erteliyorsun , kaybedersin!" Ciddi olsa da, sadece şaka yapıyorum. Çalıştırmak için gerçekten tek bir makul yol var, bu yüzden kodunuzun aynı olacağını merak etmeyin!
MikeSchinkel

Mike, hayret etmeye devam ediyorsun. Bunu ortaya çıkarmak için zaman ayırdığınız için çok teşekkürler.
Scott B

@ sorich87 - Üzerinde çalıştığınız için teşekkürler. Bu çabayı gerçekten takdir ediyorum.
Scott B

1
@Scott B : Sorun değil, yardım edebileceğim için mutluyum. Potansiyel olarak pek çok insana yardımcı olabilecek makul soruları arıyorum ve sadece soruyu soran kişi için değil, sonra gelebilecek olanlar için de cevap vermeye çalışıyorum.
MikeSchinkel

0

Wordpress, bir eklenti kullanarak Kategoriler'e Meta eklemenize izin verir:

Bunu yapmak için kategorilere meta ekleyen çeşitli uzantılardan birini eklemeniz gerekir (hangi sayfaların kutudan çıktığını taklit eder), Basit Terim Meta işi güzel yapar.

Kategorileri genişletmek için NB WordPress 3.x gereklidir.

Bundan sonra şunları kullanabilirsiniz:

  • add_term_meta
  • update_term_meta
  • get_term_meta

İstediğinizi yapmak için yöntemler eklemek üzere Functions.php komutunu kullanın, örn.

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

Temalarda yeni alanlar aramak kolaydır:

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

Daha fazla ayrıntı ve örnek: http://www.wphub.com/adding-metadata-taxonomy-terms/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.