it-swarm-vi.com

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

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-name sẽ hiển thị dưới dạng tên danh mục thực tế như My Category Name khi nó được lưu, điều này làm cho trường văn bản đơn giản trở thành một tùy chọn hữu ích.

Tôi đã xem xét hàm add_post_type_support() để 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.

18
Rick Curran

Chỉnh sửa: 12/09/2017 Xem câu trả lời này để biết giải pháp cập nhật hơn cho vấn đề này: Làm cách nào để sử dụng 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ể bậ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:

alt text

Đó 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 có 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:

alt text

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 Categories mà 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.

13
Rick Curran

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

4
Drew Gourley

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 WOS, giống như các plugin khác 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 đó.

overall view

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.

filterable categories

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ĩ mà bất kỳ ai cũng 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.

1
eddiemoya

Đ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 jQuery UI Autocomplete để 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

1
John P Bloch

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; 

}

0
djbokka