ฉันสามารถเพิ่มประเภท Metabox ลงในไฟล์แนบได้หรือไม่


18

ฉันใช้register_taxonomy_for_object_type()เพื่อเพิ่มฟิลด์ Taxonomy ของหมวดหมู่ไปยังการอัปโหลดสื่อ (ไฟล์แนบ) ฉันใช้รหัสนี้เพื่อทำ:

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

วิธีนี้ใช้งานได้และเพิ่มฟิลด์ข้อความแบบง่ายสำหรับหมวดหมู่ไปยังหน้าสื่อเมื่อดูภาพ สิ่งที่ฉันต้องการจริงๆคือทำให้มันแสดงหมวดหมู่ Metabox ตามจริงเพื่อให้ฉันสามารถเลือกหมวดหมู่ที่ฉันต้องการใช้แทนที่จะพิมพ์ลงในฟิลด์ธรรมดา ฉันยังพบว่าการใส่กระสุนสำหรับหมวดหมู่ลงในช่องข้อความเช่นmy-category-nameจบการแสดงเป็นชื่อหมวดหมู่ที่แท้จริงเช่นMy Category Nameเมื่อมันถูกบันทึกไว้ซึ่งทำให้ฟิลด์ข้อความง่าย ๆ มีตัวเลือกที่มีประโยชน์น้อยลง

ฉันได้ดูadd_post_type_support()ฟังก์ชั่นสำหรับเพิ่ม Metaboxes และเห็นว่ามันใช้สำหรับประเภทโพสต์ที่กำหนดเองฉันไม่สามารถดูว่าเป็นไปได้หรือไม่ที่จะเพิ่มสิ่งที่แนบมาด้วย


ถ้าคุณรอสักหนึ่งหรือสองวันก่อนจะเลือกคำตอบที่ดีที่สุดฉันจะเขียนปลั๊กอินให้คุณ ... (ฉันเพิ่งจะถึงกำหนดเวลาของลูกค้าและการประชุม WordPress เพื่อนำเสนอคำตอบ WordPress เพื่อคืนนี้ ... )
MikeSchinkel

@ ไมค์: ขอบคุณฉันอยากเห็นว่ามีวิธีแก้ไขปัญหานี้ ดูเหมือนว่าสิ่งที่ฉันหลังจากนั้นประมาณ 90% ใน WordPress ตามที่มีอยู่มันก็ยังคงมีให้เห็นเกี่ยวกับ 10% สุดท้าย!
Curran ริก

ฉันได้ทำสิ่งที่คล้ายกันมากกับโพสต์ metabox ที่กำหนดเอง; เช่นการฝังรายการหมวดหมู่ (ขั้นพื้นฐาน) (เช่นไม่มีแท็บสำหรับ / นิยมมากที่สุด) มันขึ้นอยู่กับว่า 'Attach_fields_to_edit' ใช้ POST อย่างไร อย่างไรก็ตามฉันไม่สามารถทำได้ในคืนนี้ ต้องการนอน.
MikeSchinkel

โอ๊ะโอตามที่คุณตอบไปแล้วด้วยตัวเองฉันจะลบรายการที่ต้องทำ
MikeSchinkel

@ ไมค์: ขอบคุณสำหรับความช่วยเหลือของคุณฉันชอบความคิดเห็นเกี่ยวกับโซลูชันของฉัน ฉันดีใจที่ฉันพบวิธีที่จะทำให้มันทำงานได้ มันจะเป็นการดีมากหากคุณเห็นการเพิ่มหมวดหมู่ไปยังไฟล์แนบผ่านเมตาบอทหมวดหมู่จริง แต่โซลูชันของฉันทำงานได้ดีพอ
Curran ริก

คำตอบ:


14

แก้ไข: 12/09/2017 ดูคำตอบนี้เพื่อแก้ปัญหาที่ทันสมัยยิ่งขึ้น: วิธีใช้ taxonomies กับไฟล์แนบกับ Media Library ใหม่

ฉันจะตอบคำถามของฉันเองที่นี่เนื่องจากฉันพยายามหาวิธีแก้ไขสิ่งที่ฉันพยายามทำ ฉันได้ข้อสรุปว่ามันเป็นไปไม่ได้ที่จะเปิดใช้งานหมวดหมู่ Metabox สำหรับสิ่งที่แนบมา อย่างไรก็ตามฉันพบว่ามันง่ายพอที่จะรับฟิลด์พื้นฐานสำหรับประเภทที่เพิ่มไปยังหน้าสิ่งที่แนบมาโดยใช้register_taxonomy_for_object_typeและ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');
}

ฟิลด์ที่เพิ่มเข้ามาแสดงดังนี้:

ข้อความแสดงแทน

มันเป็นเพียงช่องข้อความธรรมดา แต่สิ่งที่ฉันพบคือคุณสามารถพิมพ์ชื่อของหมวดหมู่ที่มีอยู่ในนั้นและมันจะถูกบันทึกได้สำเร็จเมื่อสิ่งที่แนบมาได้รับการปรับปรุง (พฤติกรรมแปลก ๆ เท่านั้นคือมันแสดงผลเวอร์ชันปกติแทน กระสุนหลังจากบันทึก)

เมื่อฉันรู้ว่าฉันสามารถบันทึกหมวดหมู่ด้วยวิธีนี้ฉันก็คิดว่าฉันจะได้รับรายชื่อของหมวดหมู่ที่มีอยู่ทั้งหมดเป็นช่องทำเครื่องหมายและตรวจสอบรายการที่เลือกไว้ จากนั้นฉันก็ใช้ jQuery นิดหน่อยเพื่อหยิบค่าของหมวดหมู่ที่ตรวจสอบแล้วและใส่ทากหมวดหมู่ทั้งหมดลงในฟิลด์หมวดหมู่ เมื่อต้องการทำให้สิ่งนี้ดูราบรื่นยิ่งขึ้นฉันจึงใช้ CSS ง่าย ๆ เพื่อซ่อนแถวของตารางที่มีฟิลด์ Category ดังนั้นสิ่งที่คุณเห็นคือช่องทำเครื่องหมายเช่น:

ข้อความแสดงแทน

ตอนนี้ฉันสามารถเพิ่มหมวดหมู่ให้กับภาพที่แนบมาฉันสามารถใช้สิ่งที่ชอบ:

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

และดึงภาพที่จัดหมวดหมู่ไว้ในหน้า! สิ่งที่ฉันหวังว่าจะทำฉันไม่คิดว่าจะมีวิธีที่จะทำ แต่ดีใจที่ฉันได้คิดอะไรบางอย่างออกมา

ฉันได้เปลี่ยนสิ่งนี้เป็นปลั๊กอินที่เรียกว่าWOS Media Categoriesฉันสามารถดาวน์โหลดได้จากเว็บไซต์ของฉัน Suburbia.org.ukฉันหวังว่ามันจะเป็นประโยชน์กับคนอื่น! ขอขอบคุณอีกครั้งสำหรับผู้ที่ให้ความเห็นเกี่ยวกับคำถามนี้และคำถามอื่น ๆ ที่ฉันถามที่นี่ซึ่งช่วยให้เข้าใจได้!

อัปเดต: ฉันได้เพิ่มการแก้ไขเพื่อให้สามารถเพิ่มหมวดหมู่ได้ในขณะที่อัปโหลดรูปภาพโดยใช้เครื่องมืออัปโหลดจำนวนมากแบบ Flash


ฉันกังวลเล็กน้อยโดยใช้ jQuery จากสิ่งที่ต้องการความถูกต้องของข้อมูล ฉันค่อนข้างแน่ใจว่าทั้งหมดนี้สามารถทำได้บนเซิร์ฟเวอร์ ฉันจะลองดูมันในไม่ช้า
MikeSchinkel

1
@ ไมค์: ใช่ฉันก็เป็นห่วงเช่นกัน อย่างไรก็ตามมีหลายกรณีที่มีส่วนเกี่ยวข้องกับ JavaScript ดังนั้นฉันตัดสินใจว่าฉันมีความสุขมากกับโซลูชันนั้น มีความสุขที่ได้รับคำติชมเกี่ยวกับวิธีการอื่น ๆ เมื่อฉันได้รับโอกาสฉันต้องการส่งสิ่งนี้ลงในที่เก็บ WordPress แม้ว่าฉันจะรอและดูว่าคุณจะกลับมาพร้อมกับอะไร ขอบคุณ!
Curran ริ

@Mike หรือ @Rick - คุณอาจให้ตัวอย่างอื่นซึ่งอาจกำหนดโพสต์ให้กับหมวดหมู่เฉพาะเมื่อมีการเพิ่มสื่อ? การเชื่อมโยงหมวดหมู่จะยึดตามประเภทโพสต์ที่เขาเปิดหรือตั้งค่าด้วยตนเองผ่านรหัส
NetConstructor.com

@ NetConstructor.com - เสียงเหมือนคำถามอื่นฉัน ...
MikeSchinkel

@ netconstructor.com: อ๋อฟังดูเหมือนคำถามใหญ่อีกข้อสำหรับฉัน!
Curran ริ

4

เพิ่งสร้างสิ่งนี้ซึ่งเป็นวิธีการแก้ปัญหาที่สมบูรณ์สำหรับการเชื่อมโยงจาวาสคริปต์ herky-jerk ไปยังเขตข้อมูลฟอร์ม เนื่องจากค่าของช่องทำเครื่องหมายของคุณถูกส่งผ่านพร้อมกับ $ _POST เมื่อส่งคุณสามารถคว้าได้ในระหว่างตัวกรอง add_image_attachment_fields_to_save และตั้งเงื่อนไขของโพสต์วัตถุ

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

(โปรดทราบว่าฉันใช้อนุกรมวิธานที่กำหนดเองและไม่ใช่หมวดหมู่ดังนั้นคุณจะต้องเปลี่ยนอาร์เรย์ $ categories ให้ตรงกับอาร์เรย์เดียวกันกับที่คุณใช้เมื่อคุณตั้งค่าช่องทำเครื่องหมายของคุณ)

Shabam, Shabozzle สนุก.


ฟังก์ชั่น add_image_attachment_fields_to_save ของคุณจำเป็นต้องส่งคืน $ post เมื่อสิ้นสุด wp_set_object_terms( $post['ID'], $terms, 'image-format' ); return $post;. และสคริปต์ที่คุณโพสต์ไม่ได้ดำเนินการ register_custom_taxonomies แต่สคริปต์ที่ดีอยู่แล้ว จะใช้สิ่งนี้ในอนาคตอย่างแน่นอน!
Rob Vermeer

โอ้โอ้ฉันเดินไปรอบ ๆ มันด้วยความคิดว่าฉันสะดวก ฉันจะแก้ไขที่นี่ในไม่กี่วินาที จุดดีในการกลับมา แต่ฉันไม่ได้มีปัญหาใด ๆ กับมัน
Drew Gourley

1

นี่เป็นเรื่องยาก / ซับซ้อนหากคุณต้องการใช้กล่องหมวดหมู่เริ่มต้นของ WordPress สำหรับสิ่งหนึ่งที่ metabox จะไม่ส่งกลับผลลัพธ์มันก็สะท้อนออกมา ยิ่งไปกว่านั้นมันจะไม่ให้ชื่อฟิลด์อินพุตที่ถูกต้องดังนั้นมันจะไม่บันทึก แนวคิดหนึ่งอาจใช้การเติมข้อความอัตโนมัติ jQuery UIเพื่อทำซ้ำการทำงานของกล่องแท็ก

อย่างไรก็ตามหากคุณต้องการเล่นกับฟิลด์ของเครื่องมือแก้ไขสื่อคุณสามารถขอ'attachment_fields_to_edit'และแก้ไขอาร์เรย์ของฟิลด์ได้ ตัวกรองผ่านสองอาร์กิวเมนต์ไปยังการเรียกกลับ: อาร์กิวเมนต์แรกคืออาร์เรย์ของฟิลด์ที่สองคือวัตถุโพสต์สิ่งที่แนบมา ดูที่นี่สำหรับรายละเอียดเพิ่มเติม:

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


ขอบคุณฉันจะดูattachment_fields_to_editและดูว่ามันจะไปอย่างไร
Curran ริก

1

ฉันสร้างปลั๊กอินโดยใช้ @ RickCurran หมวดหมู่สื่อ WOS เป็นจุดเริ่มต้น อย่างไรก็ตามหมวดหมู่สื่อของ WOS เช่นเดียวกับปลั๊กอินอื่น ๆ ที่เพิ่มการสนับสนุนหมวดหมู่ให้กับสื่อไม่ได้เพิ่ม metabox อย่างที่ฉันทำไปแล้ว

มุมมองโดยรวม

รูปแบบที่จำเป็นต้องเรียบง่ายของมันใน metaboxes ในโพสต์และหน้า แต่ฉันได้รวมความสามารถในการกรองที่ทำให้ใช้งานง่าย

หมวดหมู่ที่กรองได้

จริงๆแล้วฉันกำลังสร้าง metabox ประเภททั้งหมดที่คุณเห็นในหน้าและโพสต์ แต่ซ่อนบิตที่ไม่ทำงานบนหน้าสื่อเพราะทั้งขาดสไตล์และจาวาสคริปต์ที่ขาดหายไป

ฉันยินดีต้อนรับความคิดใด ๆ ที่ทุกคนอาจมีเกี่ยวกับวิธีทำให้ Metabox ทำงานได้อย่างสมบูรณ์ - สิ่งที่ฉันตั้งใจจะทำในรุ่นต่อมา


0

ปลั๊กอินที่ยอดเยี่ยม Rick - มีประโยชน์มาก

หากคุณย้ายทริกเกอร์ onclick แบบอินไลน์แทนที่จะผูกไว้กับ onload (และทำการปรับแต่งเล็กน้อยอื่น ๆ ) มันจะทำงานบนตัวอัปโหลดแฟลชจำนวนมากเช่นกัน ด้วยเวอร์ชันปัจจุบันแฟลชจะโหลดหลังจากเหตุการณ์โหลด jQuery ดังนั้นจึงไม่มีวัตถุอยู่

ปรับปรุง js:

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

เพิ่ม onclick เพื่อใส่ในไฟล์ php:

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

เพิ่ม id แบบฟอร์มอัพโหลดอัพโหลดไปยังไฟล์ css:

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

}


ขอบคุณ djbokka! ฉันได้เพิ่มที่แก้ไข codebase ตอนนี้ผมได้ปรับปรุงไฟล์ปลั๊กอินซึ่งสามารถดาวน์โหลดได้จากเว็บไซต์ของฉันที่suburbia.org.uk/page/projects.html#wos_media_categories
ริกเคอร์แร
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.