it-swarm.com.de

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

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 wie my-category-name beim Speichern als tatsächlicher Kategoriename wie My Category Name angezeigt wird, was das einfache Textfeld noch weniger zu einer nützlichen Option macht.

Ich habe mir die Funktion add_post_type_support() zum Hinzufügen von Metaboxen angesehen und festgestellt, dass sie für benutzerdefinierte Beitragstypen verwendet wird. Ich kann nur nicht feststellen, ob es möglich ist, dasselbe für Anhänge hinzuzufügen.

18
Rick Curran

Edit: 12/09/2017 In dieser Antwort finden Sie eine aktuellere Lösung für Folgendes: Verwendung von Taxonomien für Anhänge mit der neuen Medienbibliothek?

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_type und add_post_type_support verwendet wurden:

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

Sobald ich feststellte, 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. Alles, was Sie jemals sehen, sind die Kontrollkästchen, wie folgt:

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 es geschafft habe, etwas herauszufinden.

Ich habe daraus ein Plugin namens WOS Media Categories gemacht, das ich von 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.

13
Rick Curran

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.

4
Drew Gourley

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

overall view

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

filterable categories

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.

1
eddiemoya

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 Idee könnte sein, ein jQuery UI Autocomplete zu verwenden, um die Funktionen der Tag-Box zu replizieren.

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

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

1
John P Bloch

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 für den 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; 

}

0
djbokka