Bisakah saya menambahkan Metabox Kategori ke lampiran?

18

Saya menggunakan register_taxonomy_for_object_type()untuk menambahkan bidang taksonomi Kategori ke unggahan Media (lampiran). Saya menggunakan kode ini untuk melakukannya:

add_action('init', 'reg_tax');
function reg_tax() {
   register_taxonomy_for_object_type('category', 'attachment');
}

Ini berfungsi dan menambahkan bidang teks sederhana untuk Kategori ke halaman Media saat melihat gambar. Yang benar-benar saya inginkan adalah membuatnya menampilkan Kategori Metabox yang sebenarnya sehingga saya bisa memilih Kategori yang ingin saya gunakan daripada hanya mengetiknya ke dalam bidang polos. Saya juga menemukan bahwa menempatkan siput untuk kategori ke dalam bidang teks ini seperti my-category-nameakhirnya ditampilkan sebagai nama kategori yang sebenarnya seperti My Category Nameketika disimpan, yang membuat bidang teks sederhana semakin sedikit pilihan yang berguna.

Saya telah melihat add_post_type_support()fungsi untuk menambahkan Metabox dan telah melihatnya digunakan untuk Jenis Posting Kustom, saya tidak bisa melihat apakah mungkin untuk menambahkan yang sama untuk lampiran.

Rick Curran
sumber
Jika Anda menunggu satu atau dua hari sebelum mengambil jawaban terbaik saya akan menulis Anda sebuah plugin ... (Saya baru saja mendapat tenggat waktu klien dan pertemuan WordPress untuk menyajikan Jawaban WordPress untuk malam ini ...)
MikeSchinkel
@ Mike: Terima kasih, saya ingin melihat solusi apa yang ada untuk masalah ini. Sepertinya apa yang saya kejar adalah sekitar 90% ada di WordPress sebagaimana adanya, itu masih harus dilihat tentang 10% terakhir!
Rick Curran
Saya telah melakukan sesuatu yang sangat mirip dengan metabox pos kustom; yaitu menyematkan daftar kategori (dasar) (yaitu tanpa tab untuk semua / paling populer). Itu hanya tergantung pada bagaimana 'attachment_fields_to_edit' mengimplementasikan POST-nya. Lagi pula, aku tidak bisa melakukannya malam ini. Butuh tidur.
MikeSchinkel
Ups, seperti yang sudah Anda jawab sendiri, saya akan menghapus daftar tugas saya.
MikeSchinkel
@ Mike: Terima kasih atas bantuan Anda, saya ingin umpan balik tentang solusi saya. Saya senang saya menemukan cara untuk membuatnya bekerja. Akan lebih bagus melihat menambahkan kategori ke lampiran melalui metabox kategori yang sebenarnya, tetapi solusi saya cukup berhasil.
Rick Curran

Jawaban:

14

Sunting: 12/09/2017 Lihat jawaban ini untuk solusi yang lebih terkini untuk ini: Bagaimana cara menggunakan taksonomi pada lampiran dengan Perpustakaan Media baru?

Saya akan menjawab pertanyaan saya sendiri di sini karena saya telah berhasil menemukan solusi untuk apa yang saya coba lakukan. Saya sampai pada kesimpulan bahwa Kategori Metabox tidak mungkin diaktifkan untuk lampiran. Namun, saya menemukan bahwa cukup mudah untuk mendapatkan bidang dasar untuk Kategori yang ditambahkan ke halaman lampiran dengan menggunakan register_taxonomy_for_object_typedan add_post_type_support:

add_action('admin_init', 'reg_tax');
function reg_tax() {
   register_taxonomy_for_object_type('category', 'attachment');
   add_post_type_support('attachment', 'category');
}

Bidang yang ditambahkan menunjukkan seperti ini:

teks alternatif

Ini hanya bidang teks biasa tetapi yang saya temukan adalah Anda bisa mengetik nama kategori yang ada di sana dan kemudian akan berhasil disimpan ketika lampiran diperbarui (Satu-satunya perilaku aneh adalah bahwa ia merender kembali versi normal bukan siput setelah disimpan).

Setelah saya menyadari bahwa saya bisa menyimpan kategori dengan cara ini maka saya pikir saya bisa mendapatkan daftar semua kategori yang tersedia sebagai kotak centang dan memeriksa yang sudah dipilih. Saya kemudian menggunakan sedikit jQuery untuk mengambil nilai dari kategori yang diperiksa dan memasukkan siput semua kategori ke dalam bidang Kategori. Untuk membuatnya tampak lebih mulus, saya kemudian menggunakan sedikit CSS sederhana untuk menyembunyikan baris tabel yang berisi bidang Kategori, jadi yang Anda lihat hanyalah kotak centang, seperti:

teks alternatif

Sekarang saya bisa menambahkan kategori ke lampiran gambar saya bisa menggunakan sesuatu seperti:

get_posts('post_type=attachment&category_name=timber-fixed-windows')

Dan tarik gambar yang dikategorikan ke dalam halaman! Tepat seperti yang kuharapkan, aku tidak berpikir akan ada cara untuk melakukannya, tetapi senang aku berhasil menemukan sesuatu.

Saya telah mengubah ini menjadi sebuah plugin bernama WOS Media Categoriesyang telah saya sediakan untuk diunduh dari situs web saya, Suburbia.org.uk , saya harap ini dapat bermanfaat bagi orang lain! Terima kasih sekali lagi kepada mereka yang mengomentari ini dan pertanyaan lain yang saya ajukan di sini yang membantu memecahkannya!

Pembaruan: Saya telah menambahkan perbaikan untuk memungkinkan kategori ditambahkan sementara gambar diunggah menggunakan pengunggah massal Flash.

Rick Curran
sumber
Saya sedikit terganggu dengan menggunakan jQuery dari sesuatu yang membutuhkan integritas data. Saya cukup yakin ini semua bisa dilakukan di server. Saya akan mencoba melihatnya segera.
MikeSchinkel
1
@ Mike: Ya, saya juga sedikit khawatir tentang itu. Namun, ada banyak contoh di mana JavaScript terlibat jadi saya memutuskan saya cukup senang dengan solusi itu. Pasti senang mendapatkan umpan balik tentang metode alternatif. Ketika saya mendapat kesempatan, saya ingin mengirimkan ini ke dalam repositori WordPress meskipun saya dapat menunggu dan melihat apa yang Anda dapatkan. Terima kasih!
Rick Curran
@Mike atau @Rick - Mungkinkah Anda memberikan contoh lain yang mungkin secara otomatis menetapkan kiriman ke kategori tertentu saat media ditambahkan? Asosiasi kategori akan didasarkan pada jenis posnya atau ditetapkan secara manual melalui kode?
NetConstructor.com
@ NetConstructor.com - Kedengarannya seperti pertanyaan lain untuk saya ...
MikeSchinkel
@ netconstructor.com: Ya, terdengar seperti pertanyaan besar bagi saya!
Rick Curran
4

baru saja membuat ini, yang merupakan solusi lengkap untuk tautan javascript herky-jerk ke bidang formulir. Karena nilai kotak centang Anda diteruskan bersama dengan $ _POST saat kirim, Anda bisa mengambilnya selama filter add_image_attachment_fields_to_save dan mengatur ketentuan objek posting.

function register_custom_taxonomies() {
    $labels = array(
        'name' => _x( 'Image Formats', 'taxonomy general name' ),
        'singular_name' => _x( 'Image Format', 'taxonomy singular name' ),
        'search_items' =>  __( 'Search Formats' ),
        'all_items' => __( 'All Formats' ),
        'parent_item' => __( 'Parent Format' ),
        'parent_item_colon' => __( 'Parent Format:' ),
        'edit_item' => __( 'Edit Format' ), 
        'update_item' => __( 'Update Format' ),
        'add_new_item' => __( 'Add New Format' ),
        'new_item_name' => __( 'New Format Name' ),
        'menu_name' => __( 'Image Format' )
    );
    $capabilities = array(
        'manage_terms' => 'nobody',
        'edit_terms' => 'nobody',
        'delete_terms' => 'nobody'
    );
    $args = array(
        'public' => false,
        'hierarchical' => true,
        'labels' => $labels,
        'capabilities' => $capabilities,
        'show_ui' => false,
        'query_var' => 'image-format',
        'rewrite' => false
    );
    register_taxonomy('image-format', array('attachment'), $args);
}
add_action( 'init', 'register_custom_taxonomies', 1);

function add_media_categories($fields, $post) {
    $categories = get_categories(array('taxonomy' => 'image-format', 'hide_empty' => 0));
    $post_categories = wp_get_object_terms($post->ID, 'image-format', array('fields' => 'ids'));
    $all_cats .= '<ul id="media-categories-list" style="width:500px;">'; 
    foreach ($categories as $category) {
        if (in_array($category->term_id, $post_categories)) {
            $checked = ' checked="checked"';
        } else {
            $checked = '';  
        }
        $option = '<li style="width:240px;float:left;"><input type="checkbox" value="'.$category->category_nicename.'" id="'.$post->ID.'-'.$category->category_nicename.'" name="'.$post->ID.'-'.$category->category_nicename.'"'.$checked.'> ';
        $option .= '<label for="'.$post->ID.'-'.$category->category_nicename.'">'.$category->cat_name.'</label>';
        $option .= '</li>';
        $all_cats .= $option;
    }
    $all_cats .= '</ul>';

    $categories = array('all_categories' => array (
            'label' => __('Image Formats'),
            'input' => 'html',
            'html' => $all_cats
    ));
    return array_merge($fields, $categories);
}
add_filter('attachment_fields_to_edit', 'add_media_categories', null, 2);

function add_image_attachment_fields_to_save($post, $attachment) {
    $categories = get_categories(array('taxonomy' => 'image-format', 'hide_empty' => 0));
    $terms = array();
    foreach($categories as $category) {
        if (isset($_POST[$post['ID'].'-'.$category->category_nicename])) {
            $terms[] = $_POST[$post['ID'].'-'.$category->category_nicename];        
        }
    }
    wp_set_object_terms( $post['ID'], $terms, 'image-format' );
    return $post;
}
add_filter('attachment_fields_to_save', 'add_image_attachment_fields_to_save', null , 2);

(perhatikan bahwa saya menggunakan taksonomi ubahsuaian, dan bukan kategori, jadi Anda harus mengubah array $ kategori agar sesuai dengan array yang sama seperti yang Anda gunakan saat mengatur kotak centang)

Shabam, shabozzle. Nikmati.

Drew Gourley
sumber
Fungsi add_image_attachment_fields_to_save Anda perlu mengembalikan $ post di akhir. wp_set_object_terms( $post['ID'], $terms, 'image-format' ); return $post;. Dan skrip yang Anda posting tidak menjalankan register_custom_taxonomies. Tapi bagaimanapun juga skrip yang bagus. Pasti akan menggunakan ini di masa depan!
Rob Vermeer
Oh oops, aku menggulungnya bersama-sama berpikir aku sedang nyaman. Saya akan memperbaikinya di sini sebentar lagi. Poin bagus tentang kembalinya, meskipun, saya tidak punya masalah dengan itu.
Drew Gourley
1

Ini sulit / rumit jika Anda ingin menggunakan kotak kategori default WordPress. Untuk satu hal, metabox tidak mengembalikan output, itu hanya menggemakannya. Selain itu, itu tidak akan memberi Anda nama bidang input yang benar, sehingga tidak akan menyimpan. Satu ide mungkin menggunakan jQuery UI Autocomplete untuk mereplikasi fungsi kotak tag.

Namun, jika Anda ingin bermain-main dengan bidang editor media, Anda dapat mengaitkannya 'attachment_fields_to_edit' dan mengedit array bidang. Filter melewati dua argumen ke callback: argumen pertama adalah array bidang, kedua adalah objek posting lampiran. Lihat di sini untuk detail lebih lanjut:

http://phpxref.ftwr.co.uk/wordpress/nav.html?wp-admin/includes/media.php.source.html#l1025

John P Bloch
sumber
Terima kasih, saya akan melihat attachment_fields_to_editdan melihat bagaimana hasilnya.
Rick Curran
1

Saya telah membuat plugin menggunakan Kategori Media WOS @ RickCurran sebagai titik awal. Namun, Kategori Media WOS, seperti plugin lain yang menambahkan dukungan kategori ke media, tidak benar-benar menambahkan metabox, saya telah melakukan hal itu.

tampilan keseluruhan

Ini tentu disederhanakan dari metabox pada posting dan halaman, tetapi saya memang menyertakan kemampuan penyaringan yang membuatnya mudah digunakan.

kategori yang dapat disaring

Saya sebenarnya menghasilkan seluruh kotak metabox yang Anda lihat di halaman dan posting, tetapi menyembunyikan bit yang tidak berfungsi pada halaman media karena kurangnya gaya dan javascript yang hilang.

Saya menyambut setiap pemikiran yang mungkin dimiliki seseorang tentang bagaimana membuat metabox berfungsi penuh - sesuatu yang ingin saya lakukan di versi yang lebih baru.

eddiemoya
sumber
0

Plugin hebat Rick - sangat membantu.

Jika Anda memindahkan sebaris pemicu onclick alih-alih mengikatnya ke onload (dan membuat beberapa tweak kecil lainnya), itu juga akan berfungsi pada pengunggah massal Flash. Dengan versi saat ini, Flash dimuat setelah acara pemuatan jQuery sehingga objek belum ada.

js direvisi:

 function wos_category_click(cat){
    var container = jQuery(cat).closest("tbody");
    var cat_checked = jQuery(container).find("tr.all_categories input:checked");
    var cat_arr = jQuery(cat_checked).map(function() {
        return jQuery(this).val();
    }).get().join();
    jQuery(container).find("tr.category > td.field > input.text").val(cat_arr);
}

tambahkan onclick ke input dalam file php:

<input type="checkbox" onclick="wos_category_click(this)" class="wos-categories-cb"....

tambahkan id formulir pengunggah massal ke file css:

form#media-single-form tr.category,form#file-form tr.category {
display:none; 

}


sumber
Terima kasih djbokka! Saya telah menambahkan perbaikan itu ke basis kode sekarang, saya telah memperbarui file plugin yang dapat diunduh dari situs web saya di suburbia.org.uk/page/projects.html#wos_media_categories
Rick Curran