Kann ich dem Anhang eine Kategorie-Metabox hinzufügen?

18

Ich verwende register_taxonomy_for_object_type(), um das Feld Kategorie Taxonomie zu Medien-Uploads (Anhängen) hinzuzufügen. Ich benutze dazu diesen Code:

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

Dies funktioniert und fügt der Seite Medien ein einfaches Textfeld für Kategorie hinzu, wenn ein Bild angezeigt wird. Ich möchte wirklich, dass die eigentliche Kategorien-Metabox angezeigt wird, damit ich die Kategorien auswählen kann, die ich verwenden möchte, anstatt sie einfach in das einfache Feld einzugeben. Ich habe auch festgestellt, dass das Einfügen des Slugs für eine Kategorie in dieses Textfeld, beispielsweise my-category-name, als tatsächlicher Kategoriename angezeigt wird, wie My Category Namebeim Speichern, was das einfache Textfeld noch weniger zu einer nützlichen Option macht.

Ich habe mir die add_post_type_support()Funktion zum Hinzufügen von Metaboxen angeschaut und gesehen, dass sie für benutzerdefinierte Post-Typen verwendet wird. Ich kann nur nicht sehen, ob es möglich ist, dasselbe für Anhänge hinzuzufügen.

Rick Curran
quelle
Wenn Sie ein oder zwei Tage warten, bevor Sie die beste Antwort auswählen, schreibe ich Ihnen ein Plug-in ... (Ich habe gerade Kundentermine und ein WordPress-Meetup, um WordPress Answers to tonight
vorzustellen
@ Mike: Danke, ich bin gespannt, welche Lösungen es für dieses Problem gibt. Es sieht so aus, als wäre das, wonach ich suche, in WordPress zu 90% so, wie es aussieht. Die letzten 10% bleiben abzuwarten!
Rick Curran
Ich habe etwas sehr Ähnliches mit einer benutzerdefinierten Post-Metabox gemacht. dh Einbetten einer (einfachen) Kategorieliste (dh ohne die Registerkarten für alle / beliebtesten). Es hängt nur davon ab, wie 'attachment_fields_to_edit' seinen POST implementiert. Jedenfalls kann ich heute Nacht nicht machen. Brauche Schlaf.
MikeSchinkel
Hoppla, da du es bereits selbst beantwortet hast, werde ich meine To-Do-Liste streichen.
MikeSchinkel
@Mike: Danke für Ihre Hilfe, ich würde mich über Feedback zu meiner Lösung freuen. Ich bin froh, dass ich einen Weg gefunden habe, es zum Laufen zu bringen. Es wäre toll zu sehen, wie man über die eigentliche Kategoriemetabox Kategorien zu Anhängen hinzufügt, aber meine Lösung funktioniert gut genug.
Rick Curran

Antworten:

14

Bearbeiten: 12/09/2017 In dieser Antwort finden Sie eine aktuellere Lösung für dieses Problem: Wie werden Taxonomien für Anhänge mit der neuen Medienbibliothek verwendet?

Ich werde hier meine eigene Frage beantworten, da ich es geschafft habe, eine Lösung für das zu finden, was ich versucht habe. Ich bin zu dem Schluss gekommen, dass es nicht möglich war, die Category Metabox für Anhänge zu aktivieren. Ich fand jedoch, dass es einfach genug war, ein Basisfeld für Kategorien zu erhalten, die der Seite mit Anhängen hinzugefügt wurden, indem register_taxonomy_for_object_typeund verwendet wurden 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');
}

Das hinzugefügte Feld sah folgendermaßen aus:

Alt-Text

Es ist nur ein Klartextfeld, aber ich habe festgestellt, dass Sie den Namen einer vorhandenen Kategorie eingeben können, die dann erfolgreich gespeichert wird, wenn der Anhang aktualisiert wird die Schnecke nach dem Speichern).

Als ich merkte, dass ich Kategorien auf diese Weise speichern konnte, stellte ich fest, dass ich eine Liste aller verfügbaren Kategorien als Kontrollkästchen erhalten und die ausgewählten markieren konnte. Ich habe dann ein bisschen jQuery verwendet, um die Werte der aktivierten Kategorien zu erfassen und alle Slugs der Kategorien in das Feld Category zu übernehmen. Um dies noch nahtloser erscheinen zu lassen, habe ich dann die Tabellenzeile mit einem einfachen CSS-Code ausgeblendet, in der sich das Feld "Kategorie" befand. Sie sehen also immer nur die Kontrollkästchen:

Alt-Text

Da ich jetzt Kategorien zu Bildanhängen hinzufügen kann, kann ich Folgendes verwenden:

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

Und ziehen Sie die kategorisierten Bilder in eine Seite! Genau das, was ich mir erhofft hatte, hätte ich nicht gedacht, dass es einen Weg geben würde, aber ich bin froh, dass ich etwas herausgefunden habe.

Ich habe dieses Plugin in ein Plugin umgewandelt, WOS Media Categoriesdas ich auf meiner Website Suburbia.org.uk zum Herunterladen zur Verfügung gestellt habe . Ich hoffe, es kann jemand anderem von Nutzen sein! Nochmals vielen Dank an alle, die diese und andere Fragen, die ich hier gestellt habe, kommentiert haben.

Update: Es wurde ein Fix hinzugefügt, mit dem Kategorien hinzugefügt werden können, während Bilder mit dem Flash-Bulk-Uploader hochgeladen werden.

Rick Curran
quelle
Ich bin etwas besorgt, wenn ich jQuery von etwas verwende, das Datenintegrität erfordert. Ich bin mir ziemlich sicher, dass dies alles auf dem Server erledigt werden kann. Ich werde versuchen, es mir bald anzusehen.
MikeSchinkel
1
@ Mike: Ja, ich bin auch ein bisschen besorgt darüber. Da es jedoch viele Fälle gibt, in denen JavaScript eine Rolle spielt, habe ich beschlossen, mit dieser Lösung zufrieden zu sein. Ich freue mich auf jeden Fall über Feedback zu alternativen Methoden. Wenn ich die Chance bekomme, möchte ich dies in das WordPress-Repository einreichen, obwohl ich abwarten kann, mit was Sie zurückkommen. Vielen Dank!
Rick Curran
@Mike oder @Rick - Könnten Sie möglicherweise ein anderes Beispiel angeben, das einen Beitrag automatisch einer bestimmten Kategorie zuweist, wenn Medien hinzugefügt werden? Die Kategoriezuordnung basiert auf dem Beitragstyp, den er aktiviert oder manuell über den Code festgelegt hat.
NetConstructor.com
@ NetConstructor.com - Klingt nach einer anderen Frage für mich ...
MikeSchinkel
@ netconstructor.com: Ja, das klingt nach einer weiteren großen Frage für mich!
Rick Curran
4

Dies wurde soeben erstellt. Dies ist eine vollständige Problemumgehung für die herky-jerk-Javascript-Verknüpfung mit dem Formularfeld. Da die Werte Ihrer Kontrollkästchen beim Senden zusammen mit $ _POST übergeben werden, können Sie sie einfach während des Filters add_image_attachment_fields_to_save abrufen und die Bedingungen für das Post-Objekt festlegen.

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

(Beachten Sie, dass ich eine benutzerdefinierte Taxonomie und keine Kategorien verwende. Daher müssen Sie das $ categories-Array so ändern, dass es mit dem Array übereinstimmt, das Sie beim Einrichten Ihrer Kontrollkästchen verwenden.)

Shabam, shabozzle. Genießen.

Drew Gourley
quelle
Ihre Funktion add_image_attachment_fields_to_save muss am Ende $ post zurückgeben. wp_set_object_terms( $post['ID'], $terms, 'image-format' ); return $post;. Und das Skript, das Sie gepostet haben, führt register_custom_taxonomies nicht aus. Aber trotzdem schönes Drehbuch. Ich werde dies auf jeden Fall in der Zukunft nutzen!
Rob Vermeer
Oh, hoppla, ich habe es zusammengeschustert, weil ich dachte, ich wäre bequem. Ich werde es hier in einer Sekunde beheben. Ein guter Punkt bei der Rückkehr, aber ich hatte keine Probleme damit.
Drew Gourley
1

Dies ist schwierig / kompliziert, wenn Sie das Standard-Kategoriefeld von WordPress verwenden möchten. Zum einen gibt die Metabox die Ausgabe nicht zurück, sondern gibt sie nur wieder. Darüber hinaus würde es Ihnen nicht den richtigen Namen für das Eingabefeld geben, sodass es nicht speichern würde. Eine Möglichkeit besteht darin, die Funktionen des Felds "Tags" mithilfe der automatischen Vervollständigung der jQuery-Benutzeroberfläche zu replizieren.

Wenn Sie jedoch mit den Feldern 'attachment_fields_to_edit'des Medieneditors herumspielen möchten, können Sie das Feldarray einbinden und bearbeiten. Der Filter übergibt zwei Argumente an den Rückruf: Das erste Argument ist das Feldarray, das zweite das Objekt für den Anhangsposten. Weitere Details finden Sie hier:

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

John P Bloch
quelle
Danke, ich werfe einen Blick darauf attachment_fields_to_editund sehe, wie das geht.
Rick Curran
1

Ich habe ein Plugin mit @ RickCurrans WOS Media Categories als Ausgangspunkt erstellt. Allerdings fügt WOS Media Categories, wie andere Plugins, die Medien Kategoriefunktionen hinzufügen, keine Metabox hinzu. Ich habe genau das getan.

Überblick

Die Metaboxen auf Posts und Seiten sind notwendigerweise vereinfacht, aber ich habe eine Filterfunktion hinzugefügt, die die Verwendung vereinfacht.

Filterbare Kategorien

Ich erstelle tatsächlich die gesamte Kategorie-Metabox, die Sie auf Seiten und Posts sehen, aber verstecke die Teile, die auf der Medienseite nicht funktionieren, sowohl wegen des Mangels an Styling als auch wegen des fehlenden Javascript.

Ich freue mich über alle Überlegungen, wie die Metabox voll funktionsfähig gemacht werden kann - etwas, das ich in einer späteren Version beabsichtige.

eddiemoya
quelle
0

Tolles Plugin Rick - sehr hilfreich.

Wenn Sie den Onclick-Trigger inline verschieben, anstatt ihn an Onload zu binden (und ein paar kleinere Änderungen vornehmen), funktioniert dies auch beim Flash-Bulk-Uploader. In der aktuellen Version wird Flash nach dem jQuery-Ladeereignis geladen, sodass die Objekte noch nicht vorhanden sind.

überarbeitetes 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);
}

Füge einen Klick zur Eingabe in die PHP-Datei hinzu:

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

Bulk-Uploader-Formular-ID zur CSS-Datei hinzufügen:

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

}


quelle
Danke, djbokka! Ich habe das Update jetzt zur Codebasis hinzugefügt und die Plugin-Dateien aktualisiert, die von meiner Website unter suburbia.org.uk/page/projects.html#wos_media_categories
Rick Curran,