Tôi có thể thêm Danh mục Metabox vào tệp đính kèm không?


18

Tôi đang sử dụng register_taxonomy_for_object_type()để thêm trường phân loại Danh mục vào tải lên Phương tiện (tệp đính kèm). Tôi đang sử dụng mã này để làm như vậy:

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

Điều này hoạt động và thêm một trường văn bản đơn giản cho Danh mục vào trang Phương tiện khi xem hình ảnh. Điều tôi thực sự muốn là làm cho nó hiển thị Danh mục Metabox thực tế để tôi có thể chọn Danh mục tôi muốn sử dụng thay vì chỉ nhập chúng vào trường đơn giản. Tôi cũng thấy rằng việc đặt sên cho một danh mục vào trường văn bản này, chẳng hạn như my-category-namehiển thị dưới dạng tên danh mục thực tế như My Category Namekhi nó được lưu, điều này làm cho trường văn bản đơn giản thậm chí không còn là một tùy chọn hữu ích.

Tôi đã xem xét add_post_type_support()chức năng thêm Metaboxes và đã thấy nó được sử dụng cho Loại bài đăng tùy chỉnh, tôi chỉ không thể xem liệu có thể thêm tương tự cho các tệp đính kèm hay không.


Nếu bạn đợi một hoặc hai ngày trước khi chọn câu trả lời hay nhất, tôi sẽ viết cho bạn một plugin ... (Tôi vừa có thời hạn của khách hàng một cuộc họp WordPress để trình bày Câu trả lời WordPress cho tối nay ...)
MikeSchinkel

@Mike: Cảm ơn, tôi rất muốn xem giải pháp nào cho vấn đề này. Có vẻ như những gì tôi theo sau là khoảng 90% trong WordPress khi nó tồn tại, nó vẫn chỉ được nhìn thấy về 10% cuối cùng đó!
Rick Curran

Tôi đã làm một cái gì đó rất giống với một metabox bài tùy chỉnh; tức là nhúng danh sách danh mục (cơ bản) (nghĩa là không có các tab cho tất cả / phổ biến nhất). Nó chỉ phụ thuộc vào cách 'tệp đính kèm_fields_to_edit' thực hiện POST của nó. Dù sao, tôi không thể làm tối nay. Cần ngủ.
MikeSchinkel

Rất tiếc, vì bạn đã tự trả lời rồi, tôi sẽ gỡ danh sách việc cần làm của tôi.
MikeSchinkel

@Mike: Cảm ơn sự giúp đỡ của bạn, tôi rất thích một số phản hồi về giải pháp của tôi. Tôi vui vì tôi đã tìm ra cách để nó hoạt động. Thật tuyệt khi thấy thêm danh mục vào tệp đính kèm thông qua siêu dữ liệu danh mục thực tế, nhưng giải pháp của tôi hoạt động đủ tốt.
Rick Curran

Câu trả lời:


14

Chỉnh sửa: 12/09/2017 Xem câu trả lời này để có giải pháp cập nhật hơn cho vấn đề này: Làm cách nào để sử dụng các phân loại trên tệp đính kèm với Thư viện phương tiện mới?

Tôi sẽ trả lời câu hỏi của riêng tôi ở đây vì tôi đã tìm ra giải pháp cho những gì tôi đã cố gắng làm. Tôi đi đến kết luận rằng không thể kích hoạt Metabox Danh mục cho các tệp đính kèm. Tuy nhiên, tôi thấy rằng thật dễ dàng để có được một trường cơ bản cho Danh mục được thêm vào trang đính kèm bằng cách sử dụng register_taxonomy_for_object_typeadd_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');
}

Trường được thêm vào cho thấy như thế này:

văn bản thay thế

Đó chỉ là một trường văn bản đơn giản nhưng điều tôi tìm thấy là bạn có thể nhập tên của một danh mục hiện có trong đó và sau đó nó sẽ được lưu thành công khi tệp đính kèm được cập nhật (Hành vi kỳ lạ duy nhất là nó hiển thị lại phiên bản bình thường thay vì sên sau khi tiết kiệm).

Khi tôi nhận ra rằng tôi có thể lưu các danh mục theo cách này thì tôi đoán rằng tôi có thể lấy danh sách tất cả các danh mục có sẵn dưới dạng hộp kiểm và kiểm tra các danh mục đã được chọn. Sau đó, tôi đã sử dụng một chút jQuery để lấy các giá trị của các danh mục đã kiểm tra và đặt tất cả các sên của danh mục vào trường Danh mục. Để làm cho điều này dường như thậm chí liền mạch hơn, sau đó tôi đã sử dụng một chút CSS đơn giản để ẩn hàng bảng chứa trường Danh mục, vì vậy tất cả những gì bạn từng thấy là các hộp kiểm, như vậy:

văn bản thay thế

Bây giờ tôi có thể thêm các danh mục vào tệp đính kèm hình ảnh, tôi có thể sử dụng một cái gì đó như:

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

Và kéo các hình ảnh được phân loại vào một trang! Chính xác những gì tôi đã hy vọng sẽ làm, tôi đã không nghĩ rằng sẽ có một cách để làm điều đó nhưng rất vui vì tôi đã xoay sở để tìm ra điều gì đó.

Tôi đã biến nó thành một plugin có tên WOS Media Categoriesmà tôi đã có sẵn để tải xuống từ trang web của tôi, Suburbia.org.uk , tôi hy vọng nó có thể được sử dụng cho người khác! Một lần nữa xin cảm ơn những người đã bình luận về vấn đề này và những câu hỏi khác mà tôi đã hỏi ở đây đã giúp tìm ra nó!

Cập nhật: Tôi đã thêm một bản sửa lỗi để cho phép các danh mục được thêm vào trong khi hình ảnh được tải lên bằng trình tải lên hàng loạt Flash.


Tôi hơi bận tâm khi sử dụng jQuery từ một cái gì đó đòi hỏi tính toàn vẹn dữ liệu. Tôi khá chắc chắn rằng tất cả có thể được thực hiện trên máy chủ. Tôi sẽ cố gắng xem xét nó sớm.
MikeSchinkel

1
@Mike: Yep, tôi cũng hơi lo lắng về điều đó. Tuy nhiên, có nhiều trường hợp có liên quan đến JavaScript nên tôi quyết định rằng tôi đã đủ hài lòng với giải pháp đó. Chắc chắn rất vui khi nhận được một số phản hồi về các phương pháp thay thế mặc dù. Khi tôi có cơ hội tôi muốn gửi cái này vào kho lưu trữ WordPress mặc dù tôi có thể chờ xem bạn sẽ quay lại với cái gì. Cảm ơn!
Rick Curran

@Mike hoặc @Rick - Bạn có thể cung cấp một ví dụ khác có thể tự động gán một bài đăng cho một danh mục cụ thể khi phương tiện được thêm vào không? Liên kết danh mục sẽ được dựa trên loại bài đăng anh ấy đang bật hoặc được đặt thủ công thông qua mã?
NetConstructor.com

@ NetConstructor.com - Nghe có vẻ như là một câu hỏi khác đối với tôi ...
MikeSchinkel

@ netconstructor.com: Đúng, nghe có vẻ là một câu hỏi lớn đối với tôi!
Rick Curran

4

chỉ cần tạo cái này, đây là một cách giải quyết hoàn chỉnh cho liên kết javascript cực kỳ khó hiểu với trường biểu mẫu. Vì các giá trị của các hộp kiểm của bạn được chuyển cùng với $ _POST khi gửi, bạn chỉ có thể lấy chúng trong bộ lọc add_image_attachment_fields_to_save và đặt điều khoản của đối tượng bài đăng.

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

(lưu ý rằng tôi đang sử dụng phân loại tùy chỉnh chứ không phải danh mục, vì vậy bạn sẽ phải thay đổi mảng $ loại để khớp với mảng giống như bạn sử dụng khi thiết lập hộp kiểm của mình)

Shabam, shababab. Thưởng thức.


Hàm add_image_attachment_fields_to_save của bạn cần trả về $ post ở cuối. wp_set_object_terms( $post['ID'], $terms, 'image-format' ); return $post;. Và tập lệnh bạn đã đăng không thực hiện register_custom_taxonomies. Nhưng dù sao kịch bản tốt đẹp. Chắc chắn sẽ sử dụng điều này trong tương lai!
Rob Vermeer

Ôi trời, tôi đã cùng nhau nghĩ rằng tôi đang thuận tiện. Tôi sẽ sửa nó ở đây trong một giây. Điểm tốt về sự trở lại, mặc dù, tôi đã không gặp rắc rối với nó.
Drew Gourley

1

Điều này thật khó khăn / phức tạp nếu bạn muốn sử dụng hộp danh mục mặc định của WordPress. Đối với một điều, metabox không trả lại đầu ra, nó chỉ lặp lại nó. Trên hết, nó sẽ không cung cấp cho bạn tên trường nhập chính xác, vì vậy nó sẽ không lưu. Một ý tưởng có thể là sử dụng Tự động hoàn thành giao diện người dùng jQuery để sao chép chức năng của hộp thẻ.

Tuy nhiên, nếu bạn muốn chơi xung quanh với các trường của trình soạn thảo phương tiện, bạn có thể nối vào 'attachment_fields_to_edit'và chỉnh sửa mảng các trường. Bộ lọc chuyển hai đối số cho cuộc gọi lại: đối số đầu tiên là mảng các trường, thứ hai là đối tượng bài đính kèm. Xem tại đây để biết thêm chi tiết:

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


Cảm ơn, tôi sẽ xem attachment_fields_to_editvà xem điều đó diễn ra như thế nào.
Rick Curran

1

Tôi đã tạo một plugin bằng cách sử dụng Danh mục truyền thông WOS của @ RickCurran làm điểm khởi đầu. Tuy nhiên, Danh mục phương tiện truyền thông WOS, giống như các plugin khác có thêm hỗ trợ danh mục cho phương tiện, không thực sự thêm một metabox, tôi đã làm điều đó.

Nhìn tổng thể

Nó nhất thiết phải đơn giản hóa các metaboxes trên các bài đăng và trang, nhưng tôi đã bao gồm một khả năng lọc giúp dễ sử dụng.

danh mục có thể lọc

Tôi thực sự đang tạo ra toàn bộ siêu dữ liệu danh mục mà bạn thấy trên các trang và bài đăng, nhưng ẩn các bit không hoạt động trên trang truyền thông vì thiếu kiểu dáng và thiếu javascript.

Tôi hoan nghênh mọi suy nghĩ của bất kỳ ai có thể có về cách làm cho metabox có đầy đủ chức năng - điều mà tôi dự định sẽ làm trong phiên bản sau.


0

Plugin tuyệt vời Rick - rất hữu ích.

Nếu bạn di chuyển nội tuyến kích hoạt onclick thay vì ràng buộc nó vào tải (và thực hiện một vài điều chỉnh nhỏ khác), nó cũng sẽ hoạt động trên trình tải lên hàng loạt Flash. Với phiên bản hiện tại, Flash tải sau sự kiện tải jQuery để các đối tượng chưa tồn tại.

sửa đổi 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);
}

thêm onclick vào đầu vào trong tệp php:

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

thêm id mẫu tải lên số lượng lớn vào tập tin css:

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

}


Cảm ơn djbokka! Tôi đã thêm bản sửa lỗi đó vào codebase ngay bây giờ, tôi đã cập nhật các tệp plugin có thể tải xuống từ trang web của tôi tại suburbia.org.uk/page/projects.html#wos_media_clists
Rick Curran
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.