Posso aggiungere una categoria Metabox all'allegato?


18

Sto usando register_taxonomy_for_object_type()per aggiungere il campo Tassonomia categoria ai caricamenti multimediali (allegati). Sto usando questo codice per farlo:

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

Funziona e aggiunge un semplice campo di testo per Categoria alla pagina Media durante la visualizzazione di un'immagine. Quello che voglio davvero è far sì che visualizzi le categorie attuali Metabox in modo che io possa scegliere le categorie che voglio usare piuttosto che digitarle nel campo semplice. Ho anche scoperto che inserendo la lumaca per una categoria in questo campo di testo, ad esempio my-category-name, viene visualizzato come il nome della categoria reale come My Category Namequando viene salvato, il che rende il semplice campo di testo ancora meno un'opzione utile.

Ho esaminato la add_post_type_support()funzione per aggiungere Metabox e l'ho vista utilizzata per i tipi di posta personalizzati, non riesco proprio a vedere se è possibile aggiungere lo stesso per gli allegati.


Se aspetti un giorno o due prima di scegliere una risposta migliore, ti scriverò un plug-in ... (Ho appena avuto le scadenze dei clienti e un incontro con WordPress per presentare le risposte di WordPress a stasera ...)
MikeSchinkel,

@ Mike: grazie, sono ansioso di vedere quali soluzioni ci sono a questo problema. Sembra che quello che sto cercando sia circa il 90% lì in WordPress così com'è, resta solo da vedere su quell'ultimo 10%!
Rick Curran,

Ho fatto qualcosa di molto simile con un post metabox personalizzato; cioè incorporando un elenco di categorie (di base) (cioè senza le schede per tutti / i più popolari). Dipende solo da come 'attachment_fields_to_edit' implementa il suo POST. Comunque, non posso fare stasera. Bisogno di dormire.
MikeSchinkel,

Oops, dato che hai già risposto tu stesso, toglierò la mia lista di cose da fare.
MikeSchinkel,

@ Mike: grazie per il tuo aiuto, mi piacerebbe un feedback sulla mia soluzione. Sono contento di aver trovato il modo di farlo funzionare. Sarebbe bello vedere l'aggiunta di categorie agli allegati tramite la categoria metabox reale, ma la mia soluzione funziona abbastanza bene.
Rick Curran,

Risposte:


14

Modifica: 12/09/2017 Vedi questa risposta per una soluzione più aggiornata a questo: come utilizzare le tassonomie sugli allegati con la nuova libreria multimediale?

Risponderò alla mia domanda qui, poiché sono riuscito a trovare una soluzione a ciò che ho cercato di fare. Sono giunto alla conclusione che non era possibile abilitare la categoria Metabox per gli allegati. Tuttavia, ho scoperto che era abbastanza facile ottenere un campo di base per Categorie aggiunte alla pagina degli allegati usando register_taxonomy_for_object_typee 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');
}

Il campo aggiunto ha mostrato in questo modo:

testo alternativo

È solo un campo di testo semplice ma quello che ho scoperto è che potresti digitare il nome di una categoria esistente e sarebbe stato salvato con successo quando l'allegato è stato aggiornato (L'unico comportamento strano è che ha restituito la versione normale invece di la lumaca dopo il salvataggio).

Una volta capito che potevo salvare le categorie in questo modo, ho pensato che avrei potuto ottenere un elenco di tutte le categorie disponibili come caselle di controllo e controllare quelle che erano state selezionate. Ho quindi usato un po 'di jQuery per afferrare i valori delle categorie selezionate e inserire tutti gli slug delle categorie nel campo Categoria. Per rendere questo ancora più semplice, ho usato un po 'di CSS per nascondere la riga della tabella che conteneva il campo Categoria, quindi tutto ciò che vedi sono le caselle di controllo, in questo modo:

testo alternativo

Ora che posso aggiungere categorie agli allegati di immagini, posso usare qualcosa come:

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

E tira le immagini classificate in una pagina! Esattamente quello che speravo di fare, non pensavo che ci sarebbe stato un modo per farlo, ma sono contento di essere riuscito a capire qualcosa.

L'ho trasformato in un plugin chiamato WOS Media Categoriesche ho reso disponibile per il download dal mio sito Web, Suburbia.org.uk , spero che possa essere utile a qualcun altro! Grazie ancora a coloro che hanno commentato questa e altre domande che ho posto qui che mi hanno aiutato a capirlo!

Aggiornamento: ho aggiunto una correzione per consentire l'aggiunta di categorie mentre le immagini vengono caricate utilizzando l'uploader di massa Flash.


Sono un po 'infastidito dall'utilizzo di jQuery da qualcosa che richiede l'integrità dei dati. Sono abbastanza sicuro che tutto ciò possa essere fatto sul server. Proverò a guardarlo presto.
MikeSchinkel,

1
@ Mike: Sì, sono anche un po 'preoccupato per quello. Tuttavia, ci sono molti casi in cui è coinvolto JavaScript, quindi ho deciso di essere abbastanza soddisfatto di quella soluzione. Sicuramente felice di avere un feedback su metodi alternativi però. Quando ne avrò la possibilità, vorrei inviarlo nel repository di WordPress, anche se posso aspettare e vedere con cosa ritorni. Grazie!
Rick Curran,

@Mike o @Rick - Potresti forse fornire un altro esempio che potrebbe assegnare automaticamente un post a una categoria specifica quando viene aggiunto un media? L'associazione di categoria si baserebbe sul tipo di post su cui si trova o impostata manualmente tramite il codice?
NetConstructor.com,

@ NetConstructor.com - Mi sembra un'altra domanda ...
MikeSchinkel,

@ netconstructor.com: Sì, mi sembra un'altra grande domanda!
Rick Curran,

4

appena creato questo, che è una soluzione completa al collegamento javascript herky-jerk al campo del modulo. Poiché i valori delle tue caselle di controllo vengono passati insieme a $ _POST al momento dell'invio, puoi semplicemente acquisirli durante il filtro add_image_attachment_fields_to_save e impostare i termini dell'oggetto post.

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

(nota che sto usando una tassonomia personalizzata e non le categorie, quindi dovrai cambiare l'array $ categorie in modo che corrisponda allo stesso array che usi quando imposti le caselle di controllo)

Shabam, shabozzle. Godere.


La tua funzione add_image_attachment_fields_to_save deve restituire $ post alla fine. wp_set_object_terms( $post['ID'], $terms, 'image-format' ); return $post;. E lo script che hai pubblicato non esegue register_custom_taxonomies. Ma comunque bella sceneggiatura. Lo userò sicuramente in futuro!
Rob Vermeer,

Oh oops, l'ho messo insieme perché pensavo di essere conveniente. Lo aggiusterò qui tra un secondo. Un buon punto sul ritorno, tuttavia, non ho avuto alcun problema.
Ha disegnato Gourley il

1

Questo è difficile / complicato se si desidera utilizzare la casella della categoria predefinita di WordPress. Per prima cosa, il metabox non restituisce l'output, ma semplicemente lo fa eco. Inoltre, non ti darebbe il nome corretto del campo di input, quindi non salverebbe. Un'idea potrebbe essere quella di utilizzare un Completamento automatico dell'interfaccia utente jQuery per replicare la funzionalità della casella dei tag.

Tuttavia, se vuoi giocare con i campi dell'editor multimediale, puoi collegarti 'attachment_fields_to_edit'e modificare l'array di campi. Il filtro passa due argomenti al callback: il primo argomento è l'array di campi, il secondo è l'oggetto post allegato. Vedi qui per maggiori dettagli:

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


Grazie, darò un'occhiata attachment_fields_to_edite vedrò come va.
Rick Curran,

1

Ho creato un plug-in usando come punto di partenza le categorie multimediali WOS di @ RickCurran. Tuttavia, le categorie di media WOS, come altri plugin che aggiungono il supporto di categoria ai media, in realtà non aggiungono un metabox, l'ho fatto proprio questo.

visione d'insieme

È necessariamente semplificato dai metabox su post e pagine, ma ho incluso una capacità di filtro che lo rende facile da usare.

categorie filtrabili

In realtà sto generando l'intera categoria metabox che vedi su pagine e post, ma nascondo i bit che non funzionano sulla pagina multimediale a causa sia della mancanza di stile che del javascript mancante.

Accolgo con favore qualsiasi pensiero che qualcuno possa avere su come rendere il metabox pienamente funzionante, cosa che intendo fare in una versione successiva.


0

Ottimo plugin Rick - molto utile.

Se sposti il ​​trigger onclick in linea invece di associarlo a onload (e apporta alcune altre modifiche minori), funzionerà anche sull'uploader di massa Flash. Con la versione corrente, Flash viene caricato dopo l'evento di caricamento jQuery, quindi gli oggetti non esistono ancora.

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

aggiungi onclick per inserire nel file php:

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

aggiungi ID modulo uploader collettivo al file CSS:

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

}


Grazie djbokka! Ho aggiunto quella correzione al codebase ora, ho aggiornato i file del plugin che possono essere scaricati dal mio sito Web all'indirizzo suburbia.org.uk/page/projects.html#wos_media_categories
Rick Curran,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.