Czy mogę dodać metaboks kategorii do załącznika?

18

Używam, register_taxonomy_for_object_type()aby dodać pole kategorii kategorii do przesyłanych multimediów (załączników). Używam tego kodu, aby to zrobić:

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

Działa to i dodaje proste pole tekstowe kategorii do strony Media podczas przeglądania obrazu. Naprawdę chcę, aby wyświetlał rzeczywisty Metaboks kategorii, dzięki czemu mogę wybrać kategorie, których chcę użyć, zamiast po prostu wpisać je w zwykłe pole. Odkryłem również, że umieszczenie informacji o kategorii w tym polu tekstowym, na przykład my-category-name, wyświetla się jako rzeczywista nazwa kategorii, tak jak w My Category Nameprzypadku jej zapisania, co sprawia, że ​​proste pole tekstowe jest jeszcze mniej przydatne.

add_post_type_support()Patrzyłem na funkcję dodawania Metaboksów i widziałem, że jest używana w niestandardowych typach postów, po prostu nie widzę, czy można dodać to samo dla załączników.

Rick Curran
źródło
Jeśli poczekasz dzień lub dwa, zanim wybierzesz najlepszą odpowiedź, napiszę ci wtyczkę ... (Właśnie dotrzymałem terminów klienta i spotkania WordPress, aby przedstawić odpowiedzi WordPress dziś wieczorem ...)
MikeSchinkel
@ Mike: Dzięki, chętnie zobaczę, jakie są rozwiązania tego problemu. Wygląda na to, że to, czego szukam, wynosi około 90% w WordPress w obecnej formie, po prostu okaże się, że o 10%!
Rick Curran
Zrobiłem coś bardzo podobnego z niestandardowym metaboxem; tj. osadzanie (podstawowej) listy kategorii (tj. bez zakładek dla wszystkich / najbardziej popularnych). Zależy to tylko od tego, jak „attach_fields_to_edit” implementuje swój test POST. W każdym razie nie mogę tego dziś zrobić. Potrzebuje snu.
MikeSchinkel,
Ups, skoro już sam na to odpowiedziałeś, usunę moją listę rzeczy do zrobienia.
MikeSchinkel
@Mike: Dziękuję za pomoc, chętnie podzielę się opinią na temat mojego rozwiązania. Cieszę się, że znalazłem sposób, aby to zadziałało. Byłoby wspaniale zobaczyć dodawanie kategorii do załączników za pośrednictwem faktycznego metaboksu kategorii, ale moje rozwiązanie działa wystarczająco dobrze.
Rick Curran

Odpowiedzi:

14

Edytuj: 12/09/2017 Zobacz tę odpowiedź, aby uzyskać bardziej aktualne rozwiązanie tego: Jak korzystać z taksonomii załączników w nowej bibliotece multimediów?

Odpowiem na własne pytanie tutaj, ponieważ udało mi się znaleźć rozwiązanie tego, co próbowałem zrobić. Doszedłem do wniosku, że włączenie Metabox kategorii dla załączników nie było możliwe. Stwierdziłem jednak, że łatwo było uzyskać podstawowe pole dla kategorii dodanych do strony załączników, używając register_taxonomy_for_object_typei 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');
}

Dodane pole pokazało się następująco:

alternatywny tekst

To tylko zwykłe pole tekstowe, ale znalazłem, że możesz wpisać tam nazwę istniejącej kategorii, a następnie z powodzeniem zapisano ją po aktualizacji załącznika (Jedynym dziwnym zachowaniem jest to, że przywróciła normalną wersję zamiast ślimak po zapisaniu).

Kiedy zdałem sobie sprawę, że mogę zapisać kategorie w ten sposób, pomyślałem, że mogę uzyskać listę wszystkich dostępnych kategorii jako pola wyboru i sprawdzić te, które zostały wybrane. Następnie użyłem trochę jQuery, aby pobrać wartości zaznaczonych kategorii i umieścić wszystkie dane kategorii w polu Kategoria. Aby wyglądało to jeszcze bardziej płynnie, użyłem prostego kodu CSS, aby ukryć wiersz tabeli zawierający pole Kategoria, więc wszystko, co kiedykolwiek widzisz, to pola wyboru, takie jak:

alternatywny tekst

Teraz, gdy mogę dodawać kategorie do załączników obrazów, mogę użyć czegoś takiego:

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

I przeciągnij skategoryzowane obrazy na stronę! Dokładnie to, co chciałem zrobić, nie sądziłem, że będzie na to sposób, ale cieszę się, że udało mi się coś wymyślić.

Przekształciłem to w wtyczkę o nazwie WOS Media CategoriesUdostępniłem do pobrania z mojej strony internetowej Suburbia.org.uk , mam nadzieję, że może się przydać komuś innemu! Jeszcze raz dziękuję tym, którzy skomentowali to i inne pytania, które tu zadałem, które pomogły to rozgryźć!

Aktualizacja: Dodałem poprawkę umożliwiającą dodawanie kategorii podczas przesyłania zdjęć za pomocą programu do przesyłania zbiorczego Flash.

Rick Curran
źródło
Trochę przeszkadza mi użycie jQuery z czegoś, co wymaga integralności danych. Jestem prawie pewien, że można to wszystko zrobić na serwerze. Spróbuję wkrótce to obejrzeć.
MikeSchinkel,
1
@Mike: Tak, ja też trochę się tym przejmuję. Istnieje jednak wiele przypadków, w których występuje JavaScript, więc zdecydowałem, że jestem zadowolony z tego rozwiązania. Zdecydowanie chętnie otrzymam opinie na temat metod alternatywnych. Kiedy będę miał okazję, chciałbym przesłać to do repozytorium WordPress, chociaż mogę poczekać i zobaczyć, z czym wrócisz. Dzięki!
Rick Curran
@Mike lub @Rick - Czy możesz podać inny przykład, który może automatycznie przypisać post do określonej kategorii po dodaniu multimediów? Powiązanie kategorii będzie oparte na typie wpisu, na którym jest on ustawiony, lub ustawiany ręcznie za pomocą kodu?
NetConstructor.com
@ NetConstructor.com - Brzmi jak kolejne pytanie do mnie ...
MikeSchinkel,
@ netconstructor.com: Tak, brzmi dla mnie jak kolejne wielkie pytanie!
Rick Curran
4

właśnie to stworzyłem, co stanowi całkowite obejście połączenia herky-jerk javascript z polem formularza. Ponieważ wartości pól wyboru są przekazywane wraz z $ _POST podczas wysyłania, możesz je po prostu pobrać podczas filtru add_image_attachment_fields_to_save i ustawić warunki obiektu postu.

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

(zwróć uwagę, że używam niestandardowej taksonomii, a nie kategorii, więc musisz zmienić tablicę $ kategorie, aby pasowała do tej samej tablicy, której używasz podczas konfigurowania pól wyboru)

Shabam, shabozzle. Cieszyć się.

Drew Gourley
źródło
Twoja funkcja add_image_attachment_fields_to_save musi zwrócić $ post na końcu. wp_set_object_terms( $post['ID'], $terms, 'image-format' ); return $post;. A skrypt, który opublikowałeś, nie wykonuje register_custom_taxonomies. Ale zresztą fajny skrypt. Z pewnością skorzystam z tego w przyszłości!
Rob Vermeer
Ojej, zebrałem to razem, myśląc, że jest mi wygodnie. Naprawię to za chwilę. Dobra uwaga po powrocie, nie miałem z tym żadnych problemów.
Drew Gourley,
1

Jest to trudne / skomplikowane, jeśli chcesz użyć domyślnego pola kategorii WordPress. Po pierwsze, metabox nie zwraca danych wyjściowych, po prostu je powtarza. Ponadto nie podałby prawidłowej nazwy pola wejściowego, więc nie zapisałby. Jednym z pomysłów może być użycie autouzupełniania interfejsu użytkownika jQuery do replikacji funkcjonalności pola znaczników.

Jeśli jednak chcesz bawić się polami edytora multimediów, możesz podłączyć 'attachment_fields_to_edit'i edytować tablicę pól. Filtr przekazuje dwa argumenty do wywołania zwrotnego: pierwszy argument to tablica pól, drugi to obiekt postu załącznika. Zobacz tutaj po więcej szczegółów:

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

John P. Bloch
źródło
Dzięki, spojrzę na to attachment_fields_to_editi zobaczę jak to pójdzie.
Rick Curran,
1

Stworzyłem wtyczkę, używając @ Wick Media Categories @ RickCurran jako punktu wyjścia. Jednak kategorie multimediów WOS, podobnie jak inne wtyczki, które dodają obsługę kategorii do multimediów, tak naprawdę nie dodają metaboksu, właśnie to zrobiłem.

widok ogólny

Jest koniecznie uproszczony z metaboksów na postach i stronach, ale dodałem możliwość filtrowania, która sprawia, że ​​jest łatwy w użyciu.

kategorie filtrowalne

W rzeczywistości generuję metaboks całej kategorii, który widzisz na stronach i postach, ale ukrywam bity, które nie działają na stronie mediów z powodu zarówno braku stylizacji, jak i brakującego javascript.

Z zadowoleniem przyjmuję wszelkie przemyślenia, jak sprawić, by metaboks był w pełni funkcjonalny - co zamierzam zrobić w późniejszej wersji.

eddiemoya
źródło
0

Świetna wtyczka Rick - bardzo pomocna.

Jeśli przesuniesz wyzwalacz onclick w miejscu zamiast powiązania go z onload (i wprowadzisz kilka innych drobnych poprawek), będzie on działał również w programie do przesyłania zbiorczego Flash. W bieżącej wersji Flash ładuje się po zdarzeniu ładowania jQuery, więc obiekty jeszcze nie istnieją.

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

dodaj onclick do pliku wejściowego w pliku php:

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

dodaj identyfikator formularza przesyłania zbiorczego do pliku css:

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

}


źródło
Dzięki djbokka! Dodałem tę poprawkę do bazy kodu, zaktualizowałem pliki wtyczek, które można pobrać z mojej strony internetowej na suburbia.org.uk/page/projects.html#wos_media_categories
Rick Curran