Menambahkan Metabox Atribut Halaman dan Template Halaman ke Halaman Edit Posting?

14

( Catatan Moderator: Judul awalnya "Bagaimana saya bisa menambahkan pemilih" Halaman Atribut "dan / atau" Atribut Halaman> Templat "ke editor POSTS")

WP saat ini hanya mengizinkan penugasan "templat" ke Halaman (mis post_type=='page'.) Saya juga ingin memperluas fungsi ini ke Posting (mis post_type=='post'.)

Bagaimana saya bisa menambahkan kotak meta "Atribut Halaman" dan lebih khusus lagi, pengalih template ke editor posting?

Saya berasumsi ini adalah kode yang akan saya tempatkan pada functions.phptema saya.

UPDATE: Saya telah berhasil menambahkan menu pulldown template yang telah di-hardcoded ke editor posting saya, dengan hanya menambahkan html kotak pilih ke kotak opsi meta kustom saya yang ada. Inilah kode yang saya gunakan untuk itu ...

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

Dan inilah fungsi yang menuliskan opsi dan kotak pilih templat ...

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

Dan akhirnya, kode untuk menangkap nilai yang dipilih di save ...

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

Sekarang, saya percaya semua yang tersisa adalah (1) menangkap template yang dipilih dan menambahkannya ke meta posting untuk posting ini dan (2) memodifikasi index.php dan single.php sehingga menggunakan template yang dipilih.

Scott B
sumber
@Scott B : Baiklah saya menulis seluruh jawaban saya sebelum saya melihat bahwa Anda juga sedang mengerjakannya, dan sepertinya Anda mengambilnya dengan arah yang agak berbeda dengan pertanyaan awal Anda dengan opsi no follow dan no index. Semoga apa yang saya lakukan masih memiliki nilai untuk Anda. Jika tidak, mungkin itu akan membantu orang lain.
MikeSchinkel
Yap, Anda sudah menjawab pertanyaan itu. Saya memang mengambil taktik yang sedikit berbeda ketika saya menyadari bahwa saya tidak perlu mengurai direktori dan bisa meng-hardcode nilai untuk template spesifik saya. Saya mungkin masih perlu meminjam beberapa kode Anda untuk benar-benar mendapatkan WP untuk menggunakan templat yang ditetapkan untuk pos tersebut.
Scott B

Jawaban:

12

Benci menjadi pembawa berita buruk tetapi WordPress hardcodes fungsionalitas Templat Halaman ke tipe posting "halaman" , setidaknya dalam v3.0 (yang mungkin berubah di versi masa depan tetapi tidak ada inisiatif khusus saya sadar untuk mengubahnya Jadi, ini adalah salah satu dari beberapa kali saya berjuang untuk mencari cara untuk mengatasi sesuatu tanpa meretas inti.)

Solusi yang saya buat adalah pada dasarnya menyalin kode yang relevan dari inti WordPress dan memodifikasinya sesuai kebutuhan kita. Berikut langkah-langkahnya (nomor baris berasal dari v3.0.1):

  1. Salin page_attributes_meta_box()fungsi dari baris 535 /wp-admin/includes/meta-boxes.phpdan modifikasi agar sesuai.

  2. Kode add_meta_boxeskail untuk menambahkan metabox yang dibuat di # 1.

  3. Salin get_page_templates()fungsi dari baris 166 /wp-admin/includes/theme.php dan modifikasi agar sesuai.

  4. Salin page_template_dropdown()fungsi dari baris 2550 /wp-admin/includes/template.phpdan modifikasi agar sesuai.

  5. Tambahkan Template Posting ke tema Anda.

  6. Beri kode save_postkait untuk memungkinkan penyimpanan nama file templat pos saat disimpan.

  7. Beri kode pada single_templatekail untuk mengaktifkan pemuatan templat kiriman untuk kiriman terkait.

Sekarang lanjutkan dengan itu!


1. Salin page_attributes_meta_box()fungsi

Sebagai langkah pertama kami, Anda perlu menyalin page_attributes_meta_box()fungsi dari baris 535 dari /wp-admin/includes/meta-boxes.phpdan saya telah memilih untuk mengganti namanya post_template_meta_box(). Karena Anda hanya meminta templat halaman, saya menghapus kode untuk menentukan pos induk dan untuk menentukan urutan yang membuat kode lebih sederhana. Saya juga memilih untuk menggunakan postmeta untuk ini daripada mencoba menggunakan kembali page_templateproperti objek untuk menghindari dan ketidakcocokan potensial yang disebabkan oleh kopling yang tidak disengaja. Jadi, inilah kodenya:

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. Kode add_meta_boxeskail

Langkah selanjutnya adalah menambahkan metabox menggunakan add_meta_boxeshook:

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. Salin get_page_templates()fungsi

Saya berasumsi hanya masuk akal untuk membedakan antara templat halaman dan templat pos sehingga diperlukan get_post_templates()fungsi berdasarkan get_page_templates()dari baris 166 of /wp-admin/includes/theme.php. Namun alih-alih menggunakan Template Name:penanda templat halaman mana yang menggunakan fungsi ini, gunakan Post Template:penanda yang bisa Anda lihat di bawah.

Saya juga menyaring inspeksi functions.php (tidak yakin bagaimana cara get_page_templates()kerjanya dengan benar tanpa itu, tapi apa pun!) Dan satu-satunya yang tersisa adalah mengubah referensi kata pageke postuntuk pembacaan pemeliharaan di jalan:

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. Salin page_template_dropdown()fungsi

Demikian pula salin page_template_dropdown()dari baris 2550 dari /wp-admin/includes/template.phpuntuk membuat post_template_dropdown()dan cukup mengubahnya untuk menelepon get_post_templates()sebagai gantinya:

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. Tambahkan Template Posting

Langkah selanjutnya adalah menambahkan templat pos untuk pengujian. Dengan menggunakan Post Template:penanda yang disebutkan dalam langkah # 3 salin single.phpdari tema Anda ke single-test.phpdan tambahkan tajuk komentar berikut ( pastikan untuk memodifikasi sesuatu single-test.phpsehingga Anda dapat mengatakan itu sedang memuat alih-alih single.php) :

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

Setelah Anda melakukan langkah-langkah # 1 hingga # 5 Anda dapat melihat metabox "Templat Posting" Anda muncul di halaman editor posting Anda:

Seperti apa Postablates Metabox ketika ditambahkan ke WordPress 3.0
(sumber: mikeschinkel.com )

6. Kode save_postkait

Sekarang setelah Anda memiliki editor yang sudah dihapus, Anda harus benar-benar menyimpan nama file templat halaman Anda ke postmeta ketika pengguna mengklik "Terbitkan". Berikut kode untuk itu:

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. Kode single_templatekait

Dan terakhir, Anda harus benar-benar mendapatkan WordPress untuk menggunakan templat posting baru Anda. Anda melakukannya dengan mengaitkan single_templatedan mengembalikan nama templat yang Anda inginkan untuk pos-pos yang telah ditetapkan satu:

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

Dan itu saja!

CATATAN bahwa saya tidak mempertimbangkan Jenis Pos Kustom , hanya post_type=='post'. Menurut pendapat saya mengatasi jenis posting kustom akan membutuhkan pembedaan antara berbagai jenis posting dan, meskipun tidak terlalu sulit, saya tidak mencoba di sini.

MikeSchinkel
sumber
Bagus! Saya tidur dengan kode yang hampir lengkap di editor saya dengan pendekatan yang sama dengan menyalin fungsi WordPress default (sudah selesai, tapi saya tidak akan mempostingnya karena saya tidak menguji). :)
sorich87
@ sorich87 - Anda tahu pepatah lama, "Kamu tidur sebentar, kamu lepas!" Serius, HANYA bercanda. Benar-benar hanya ada satu cara yang masuk akal untuk membuatnya bekerja sehingga tidak heran kode Anda akan sama!
MikeSchinkel
Mike, kamu terus kagum. Terima kasih banyak telah meluangkan waktu untuk menyelesaikan ini.
Scott B
@ sorich87 - Terima kasih telah mengerjakannya. Saya sangat menghargai upaya ini.
Scott B
1
@Scott B : Tidak masalah, senang saya bisa membantu. Saya mencari pertanyaan yang cukup umum yang berpotensi dapat membantu banyak orang dan mencoba menjawabnya bukan hanya untuk orang yang mengajukan pertanyaan tetapi juga untuk mereka yang mungkin datang setelah itu.
MikeSchinkel
0

Wordpress memungkinkan Anda untuk menambahkan Meta ke Kategori menggunakan plugin:

Untuk melakukan ini, Anda perlu menambahkan salah satu dari berbagai ekstensi yang menambahkan meta ke kategori (meniru halaman apa yang keluar dari kotak), Simple Term Meta melakukan pekerjaan dengan baik.

NB WordPress 3.x diperlukan untuk memperluas Kategori.

Setelah itu Anda bisa menggunakan:

  • add_term_meta
  • update_term_meta
  • get_term_meta

Gunakan Functions.php untuk menambahkan metode untuk melakukan apa yang Anda inginkan misalnya

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

Memanggil bidang baru dalam tema itu mudah:

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

Lebih detail dan contoh: http://www.wphub.com/adding-metadata-taxonomy-terms/

Jay
sumber