Eke bir Kategori Meta Kutusu ekleyebilir miyim?


18

register_taxonomy_for_object_type()Medya yüklemelerine (ekler) Kategori sınıflandırma alanını eklemek için 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, 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 Kutusunu görüntülemesini sağlamaktır, böylece kullanmak istediğim Kategorileri yalnızca düz alana yazmak yerine seçebilirim. Ayrıca, bu metin alanına bir kategori için sülük koymanın, kaydedildiği zamanki my-category-namegibi gerçek kategori adı olarak görüntülenmesinin My Category Namebasit metin alanını daha az kullanışlı bir seçenek haline getirdiğini buldum .

add_post_type_support()Meta Kutu ekleme işlevine baktım ve Özel Yazı Türleri için kullanıldığını gördüm, sadece ekler için aynı eklemenin mümkün olup olmadığını göremiyorum.


Eğer en iyi yanıtı almadan önce bir veya iki gün beklerseniz (Ben sadece istemci süreler var ... size bir eklenti yazacağım ve bu gece mevcut WordPress Cevaplar için bir WordPress buluşmasına ...)
MikeSchinkel

@Mike: Teşekkürler, bu soruna hangi çözümlerin geldiğini görmek istiyorum. Görünüşe göre, WordPress'te olduğu gibi yaklaşık% 90 var, sadece son% 10 hakkında görülmeye devam ediyor!
Rick Curran

Ben özel bir yazı metabox ile çok benzer bir şey yaptım; (temel) bir kategori listesinin gömülmesi (örneğin, tüm / en popülerler için sekmeler olmadan). Sadece 'attachment_fields_to_edit' in POST'unu nasıl uyguladığına bağlıdır. Her neyse, bu gece yapamam. Uykuya ihtiyacım var.
MikeSchinkel

Hata! Daha önce kendiniz cevapladığınız için yapılacaklar listemden çıkartacağım.
MikeSchinkel

@Mike: Yardımınız için teşekkürler, çözümüm hakkında bazı geri bildirimler almak isterim. Çalıştırmak için bir yol bulduğuma sevindim. Gerçek kategori meta kutusu aracılığıyla eklere kategori eklemeyi görmek harika olurdu, ancak çözümüm yeterince iyi çalışıyor.
Rick Curran

Yanıtlar:


14

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

Burada kendi soruma cevap vereceğim çünkü yapmaya çalıştığım şeye bir çözüm bulmayı başardım. Ekler için Kategori Meta Kutusu'nu etkinleştirmenin mümkün olmadığı sonucuna vardım. Ancak, ekler sayfasına eklenen kategoriler için temel bir alanı almanın register_taxonomy_for_object_typeve kullanarak şunu kolay buldum 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');
}

Eklenen alan şöyle gösterdi:

alternatif metin

Bu sadece düz bir metin alanı, ancak bulduğum şey, mevcut bir kategorinin adını oraya yazabilmeniz ve ekin güncellendiğinde başarılı bir şekilde kaydedilmesiydi (Tek garip davranış, bunun yerine normal sürümü oluşturmasıydı. Kaydettikten sonra sülük).

Kategorileri bu şekilde kaydedebileceğimi fark ettikten sonra, onay kutuları olarak mevcut tüm kategorilerin bir listesini alabileceğimi ve seçilenleri kontrol edebileceğimi düşündüm. Daha sonra işaretli kategorilerin değerlerini almak ve tüm kategorilerin salyangozlarını Kategori alanına koymak için biraz jQuery kullandım. Bu daha sorunsuz görünmesini sağlamak için daha sonra Kategori alanı içeren tablo satır gizlemek için basit bir CSS biraz kullandım, böylece şimdiye kadar gördüğünüz tüm onay kutuları, şöyle:

alternatif metin

Artık resim eklerine kategoriler ekleyebildiğime göre şöyle bir şey kullanabilirim:

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

Ve kategorize edilmiş görüntüleri bir sayfaya çekin! Tam olarak yapmayı umduğum şey, bunu yapmanın bir yolu olacağını düşünmemiştim ama bir şey bulmayı başardığım için mutluyum.

Bunu web sitem Suburbia.org.uk'danWOS Media Categories indirmeye hazırladığım bir eklentiye dönüştürdüm , umarım başka biri için yararlı olabilir! Bu ve burada sordum hangi anlamaya yardımcı olan diğer sorular yorumcular için tekrar teşekkürler!

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


Veri bütünlüğü gerektiren bir şey jQuery kullanarak biraz rahatsız. Tüm bunların sunucuda yapılabileceğinden eminim. Yakında bakmaya çalışacağım.
MikeSchinkel

1
@Mike: Evet, ben de biraz endişeliyim. Ancak, JavaScript'in dahil olduğu birçok örnek var, bu yüzden bu çözümden yeterince memnun olduğuma karar verdim. Alternatif yöntemler hakkında bazı görüşler almak için kesinlikle mutlu. Bir şans bulduğumda, WordPress veri havuzuna göndermek istiyorum, ancak bekleyip neyle geri döndüğünüzü görebiliyorum. Teşekkürler!
Rick Curran

@Mike veya @Rick - Medya eklendiğinde belirli bir kategoriye otomatik olarak yayın atayabilecek başka bir örnek verebilir misiniz? Kategori ilişkilendirmesi açık olduğu yazı türünü temel alır mı yoksa kod aracılığıyla el ile mi ayarlanır?
NetConstructor.com

@ NetConstructor.com - Bana başka bir soru gibi geliyor ...
MikeSchinkel

@ netconstructor.com: Evet, bana başka bir büyük soru gibi geliyor!
Rick Curran

4

sadece form alanına herky-jerk javascript bağlantı için tam bir çözüm olan bu yarattı. Onay kutularınızın değerleri gönderildiğinde $ _POST ile birlikte iletildiğinden, add_image_attachment_fields_to_save filtresi sırasında bunları alabilir ve yazı nesnesinin koşullarını ayarlayabilirsiniz.

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 sınıflandırma kullandığımı unutmayın, bu yüzden $ category dizisini onay kutularınızı ayarlarken kullandığınız diziyle eşleşecek şekilde değiştirmeniz gerekir)

Shabam, shabozzle. Zevk almak.


Add_image_attachment_fields_to_save işlevinizin sonunda $ post döndürmesi gerekiyor. wp_set_object_terms( $post['ID'], $terms, 'image-format' ); return $post;. Gönderdiğiniz komut dosyası register_custom_taxonomies'i çalıştırmaz. Ama yine de güzel bir senaryo. Kesinlikle gelecekte kullanacak!
Rob Vermeer

Hata! Uygun olduğumu düşünerek birlikte Arnavut kaldırımı doldurdum. Burada bir saniye içinde tamir edeceğim. Dönüş iyi nokta olsa da, ben onunla herhangi bir sorun yoktu.
Drew Gourley

1

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

Ancak, medya düzenleyicisinin alanlarıyla oynamak istiyorsanız, 'attachment_fields_to_edit'alan dizisine takılabilir ve bunları düzenleyebilirsiniz. Filtre geri aramaya iki argüman iletir: ilk argüman alan dizisidir, ikincisi ek sonrası nesnesidir. Daha fazla ayrıntı için buraya bakın:

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


Teşekkürler, bir göz atacağım attachment_fields_to_editve bunun nasıl gittiğini göreceğim.
Rick Curran

1

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

Genel Bakış

Bu mesajlar ve sayfalardaki meta kutulardan mutlaka basitleştirilmiştir, ancak kullanımı kolaylaştıran bir filtreleme yeteneği ekledim.

filtrelenebilir kategoriler

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 saklıyorum.

Ben kimsenin metabox tamamen işlevsel hale getirmek için olabilecek herhangi bir düşünce hoş geldiniz - bir sonraki sürümünde yapmak niyetinde bir şey.


0

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

Onclick tetikleyiciyi onload'a bağlamak yerine satır içi taşırsanız (ve birkaç küçük değişiklik 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 mevcut olmaz.

gözden geçirilmiş 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ında girişe onclick ekleyin:

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

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

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

}


Teşekkürler djbokka! Bu düzeltmeyi kod tabanına ekledim, suburbia.org.uk/page/projects.html#wos_media_categories
Rick Curran
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.