it-swarm-eu.dev

Mohu přidat kategorii Metabox do přílohy?

Používám register_taxonomy_for_object_type() k přidání pole taxonomie kategorie do aplikace Media uploads (přílohy). K tomu používám tento kód:

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

To funguje a přidává jednoduché textové pole pro kategorii na stránku Média při zobrazení obrázku. To, co opravdu chci, je, aby se zobrazila skutečná kategorie Metabox tak, abych si mohl vybrat kategorie, které chci použít, spíše než je zapsat do prostého pole. Také jsem zjistil, že uvedení slug pro kategorii do tohoto textového pole, jako je my-category-name, skončí zobrazením jako skutečný název kategorie, jako je My Category Name když je uložen, což činí jednoduché textové pole ještě méně užitečnou možností.

Díval jsem se na funkci add_post_type_support() pro přidávání Metaboxů a viděl jsem, že je používán pro vlastní typy příspěvků, prostě nevidím, zda je možné přidat stejné pro přílohy.

18
Rick Curran

Edit: 12/09/2017 Podívejte se na tuto odpověď pro více aktuální řešení tohoto problému: Jak používat taxonomie příloh s novou Knihovnou médií?

Odpovím zde na svou vlastní otázku, protože se mi podařilo najít řešení toho, co jsem se snažil udělat. Dospěl jsem k závěru, že není možné získat kategorii Metabox pro přílohy. Zjistil jsem však, že bylo jednoduché získat základní pole pro kategorie přidané na stránku příloh pomocí register_taxonomy_for_object_type a 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');
}

Přidané pole se zobrazilo takto:

alt text

Je to jen textové pole, ale to, co jsem našel, bylo, že byste mohli zadat název existující kategorie a pak by bylo úspěšně uloženo, kdyby byla příloha aktualizována (Jediným zvláštním chováním je, že vrátila normální verzi namísto po uložení).

Jakmile jsem si uvědomil, že můžu takto zachránit kategorie, pak jsem si uvědomil, že mohu dostat seznam všech dostupných kategorií jako zaškrtávacích políček a zkontrolovat ty, které byly vybrány. Potom jsem použil trochu jQuery, abych chytil hodnoty kontrolovaných kategorií a umístil všechny kategorie 'slimáky do pole Kategorie. Aby to vypadalo ještě více bezproblémově, pak jsem použil jednoduchý kousek CSS, abych skryl řádek tabulky, který obsahoval pole Kategorie, takže vše, co jste kdy viděli, jsou zaškrtávací políčka, jako například:

alt text

Nyní, když mohu přidat kategorie do obrázkových příloh, mohu použít něco jako:

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

A roztáhněte roztříděné obrázky na stránku! Přesně to, co jsem doufal, že udělám, jsem si nemyslel, že to bude způsob, jak to udělat, ale rád, že se mi podařilo něco vymyslet.

Změnil jsem to na plugin nazvaný WOS Media Categories, který jsem si zpřístupnil ke stažení z mých webových stránek, Suburbia.org.uk , doufám, že to může být užitečné někomu jinému! Ještě jednou díky těm, kteří komentovali tuto a další otázky, o které jsem se zde zeptal.

Aktualizace: Přidala jsem opravu, která umožňuje přidávat kategorie, které jsou přidávány v době, kdy jsou obrázky nahrány pomocí hromadného odesílatele aplikace Flash.

13
Rick Curran

právě toto vytvořilo, což je úplné řešení pro spojení herky-jerk javascriptu do pole formuláře. Vzhledem k tomu, že hodnoty vašich zaškrtávacích polí jsou předány spolu s příkazem $ _POST na odeslání, můžete je jednoduše zachytit během filtru add_image_attachment_fields_to_save a nastavit podmínky příspěvku.

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

(Všimněte si, že používám vlastní taxonomii a nikoli kategorie, takže budete muset změnit pole kategorií $ tak, aby odpovídalo stejnému poli, jaké používáte při nastavení zaškrtávacích políček)

Shabam, shabozzle. Užívat si.

4
Drew Gourley

Jako výchozí bod jsem vytvořil plugin používající @ RickCurran WOS Media Kategorie. Nicméně, kategorie WOS Media, stejně jako ostatní pluginy, které přidávají podporu kategorie pro média, vlastně nepřidávají metabox, udělal jsem to.

overall view

Jeho nutně zjednodušená forma metaboxes na příspěvky a stránky, ale já jsem zahrnoval filtrační schopnost, která umožňuje snadné použití.

filterable categories

Já jsem vlastně generování celé kategorie metabox, které vidíte na stránkách a příspěvky, ale skrývá bity, které dont práce na stránce médií, protože jak nedostatek styling a chybějící javascript.

Vítám jakékoli myšlenky, které by někdo mohl mít, jak udělat metabox plně funkční - něco, co mám v úmyslu udělat v pozdější verzi.

1
eddiemoya

To je obtížné/komplikované, pokud chcete použít výchozí kategorii WordPress. Za prvé, metabox nevrací výstup, jen to odráží. Navíc by vám nedávalo správný název vstupního pole, takže by to nešetřilo. Jednou z možností by mohlo být použití jQuery UI Autocomplete pro replikaci funkčnosti tagů.

Pokud však chcete hrát s poli editoru médií, můžete zavést do souboru 'attachment_fields_to_edit' a upravit pole polí. Filtr předá zpětné volání dva argumenty: první argument je pole polí, druhý je objekt přílohy přílohy. Další podrobnosti naleznete zde:

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

1
John P Bloch

Velký plugin Rick - velmi užitečné.

Pokud přesouváte inclick spoušť inline namísto toho, abyste ji zavázali k načtení (a udělejte několik dalších drobných vylepšení), bude fungovat i na hromadném nahrávání aplikace Flash. S aktuální verzí se Flash načte po události jQuery load, takže objekty ještě neexistují.

revidováno 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);
}

přidat onclick pro vložení do php souboru:

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

přidat ID hromadného uploaderu do souboru css:

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

}

0
djbokka