it-swarm.asia

Eke bir Kategori Meta Kutusu ekleyebilir miyim?

Kategori yüklemeleri alanını Medya yüklemelerine (ekler) eklemek için register_taxonomy_for_object_type() kullanıyorum. Bunu yapmak için bu kodu kullanıyorum:

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

Bu, çalışır ve bir görüntüyü görüntülerken, Medya sayfasına Kategori için basit bir metin alanı ekler. Gerçekten istediğim, gerçek Kategoriler Meta Kutusu'nu göstermesini sağlamak, böylece sadece düz alana yazmak yerine kullanmak istediğim Kategorileri seçebiliyorum. Ayrıca bir kategori için sümüklü böceklerin my-category-name gibi bu metin alanına yerleştirilmesinin, kaydedildiğinde My Category Name gibi gerçek kategori adı olarak görüntülenmesinin sona erdiğini ve basit metin alanını daha da kullanışlı bir seçenek haline getirdiğini buldum.

Meta kutuları eklemek için add_post_type_support() işlevine bakıyorum ve Özel Posta Türleri için kullanıldığını gördüm, ekleri eklemek için aynı olup olmadığını göremiyorum.

18
Rick Curran

Edit: 12/09/2017 Buna daha güncel bir çözüm için bu cevaba bakınız: Yeni Medya Kütüphanesi eklerinde taksonomiler nasıl kullanılır?

Yapmaya çalıştığım şeye bir çözüm bulmayı başardığım için kendi soruma cevap vereceğim. Kategori Metabox'ın ekler için etkinleştirilmesinin mümkün olmadığı sonucuna vardım. Ancak, register_taxonomy_for_object_type ve add_post_type_support komutlarını kullanarak ekler sayfasına eklenen Kategoriler için basit bir alan elde etmenin kolay olduğunu gördüm:

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

Eklenen alan şöyle gösterdi:

alt text

Bu sadece düz bir metin alanı, ancak buldum, orada varolan bir kategorinin adını yazabiliyordunuz ve ek güncellendiğinde başarılı bir şekilde kaydedilebiliyordu (Tek tuhaf davranış, normal sürüm yerine normal sürümü geri getirmesidir. kaydettikten sonra sümüklü böcek).

Bir kere kategorileri bu şekilde kaydedebileceğimi fark ettikten sonra, mevcut tüm kategorilerin bir listesini onay kutusu olarak alabileceğimi ve seçilenleri kontrol edebileceğimi düşündüm. Daha sonra kontrol edilen kategorilerin değerlerini almak ve tüm kategorilerin dilimlerini Kategori alanına koymak için bir miktar jQuery kullandım. Bunun daha da sorunsuz görünmesini sağlamak için, Kategori alanını içeren tablo satırını gizlemek için basit bir CSS bit kullandım, böylece gördüğünüz tek şey onay kutuları.

alt text

Artık resim eklerine kategori ekleyebildiğim için şöyle bir şey kullanabilirim:

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

Ve kategorilere ayrılmış görüntüleri bir sayfaya çekin! Tam olarak ne yapmayı umduğumdu, bunu yapmanın bir yolu olacağını düşünmedim, ancak bir şeyleri çözmeyi başardığıma sevindim.

Bunu, web sitemden, Suburbia.org.uk adresinden indirmeyi mümkün kılan WOS Media Categories adlı bir eklentiye dönüştürdüm, başka birine yararı olur! Bu soruyu yorumlayanlara ve bu soruyu çözenlere bu soruları cevaplayanlara tekrar teşekkürler!

Güncelleme: Görüntüler toplu Flash yükleyici kullanılarak yüklenirken kategorilerin eklenmesini sağlamak için bir düzeltme ekledim.

13
Rick Curran

sadece bunu yarattım; bu, herky-jerk javascript'in form alanına bağlanması için tam bir geçici çözümdür. Onay kutularınızın değerleri, gönderim sırasında $ _POST ile birlikte geçtiğinden, bunları add_image_attachment_fields_to_save filtresi sırasında alabilir ve gönderim nesnesinin koşullarını belirleyebilirsiniz.

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

(kategorileri değil, özel bir taksonomi kullandığımı unutmayın; bu nedenle, onay kutularını ayarlarken kullandığınız aynı diziyle eşleşmesi için $ category dizisini değiştirmeniz gerekir.)

Shabam, shabozzle. Keyfini çıkarın.

4
Drew Gourley

@ RickCurran'ın WOS Medya Kategorileri'ni başlangıç ​​noktası olarak kullanarak bir eklenti oluşturdum. Ancak, WOS Medya Kategorileri, medyaya kategori desteği ekleyen diğer eklentiler gibi, aslında bir meta kutu eklemiyor, sadece bunu yaptım.

overall view

Yazılardaki ve sayfalardaki meta kutulardan zorunlu olarak basitleştirildi, ancak kullanımını kolaylaştıran bir filtreleme özelliği kullandım.

filterable categories

Aslında sayfalarda ve yayınlarda gördüğünüz tüm kategori meta kutusunu oluşturuyorum, ancak hem stil eksikliği hem de eksik javascript nedeniyle medya sayfasında çalışmayan bitleri gizliyorum.

Metabox'ın tamamen işlevsel hale getirilmesi konusunda sahip olabileceği herhangi bir düşünceyi memnuniyetle karşılarım - daha sonraki bir sürümde yapmak istediğim bir şey.

1
eddiemoya

WordPress 'varsayılan kategori kutusunu kullanmak istiyorsanız, bu zor/karmaşıktır. Birincisi, metabox çıktıyı döndürmez, sadece eko eder. Bunun da ötesinde, size doğru giriş alanı adını vermez, bu yüzden kaydetmez. Bir fikir etiket kutusunun işlevselliğini çoğaltmak için jQuery UI Autocomplete kullanmak olabilir.

Bununla birlikte, medya editörünün alanlarıyla uğraşmak istiyorsanız, 'attachment_fields_to_edit' içine bağlanıp alan dizisini düzenleyebilirsiniz. Filtre geri çağrıya iki argüman iletir: ilk argüman alanların dizisi, ikincisi de ek posta nesnesidir. Daha fazla bilgi için buraya bakınız:

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

1
John P Bloch

Büyük eklenti Rick - çok yararlı.

Onclick tetiğini aşırı yüke bağlamak yerine satır içi hareket ettirirseniz (ve birkaç tane küçük ince ayar yaparsanız), Flash toplu yükleyicide de çalışır. Geçerli sürümde Flash, jQuery load olayından sonra yüklenir, böylece nesneler henüz yoktur.

revize edilmiş 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);
}

php dosyasına girmek için onclick ekleyin:

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

css dosyasına toplu yükleyici form kimliği ekleyin:

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

}

0
djbokka