Posso adicionar um Metabox de Categoria ao anexo?

17

Estou usando register_taxonomy_for_object_type() para adicionar o campo Taxonomia de categoria a Uploads de mídia (anexos). Estou usando este código para fazer isso:

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

Isso funciona e adiciona um campo de texto simples para Category na página Media ao exibir uma imagem. O que eu realmente quero é exibir o Metabox de Categorias para que eu possa escolher as Categorias que eu quero usar, em vez de apenas digitá-las no campo simples. Eu também descobri que colocar o slug para uma categoria neste campo de texto como my-category-name acaba exibindo como o nome da categoria real como My Category Name quando é salvo, o que torna o campo de texto simples ainda menos útil.

Eu estive examinando a função add_post_type_support() para adicionar Metaboxes e a vi usada para Tipos de Postagens Personalizadas, mas não consigo ver se é possível adicionar o mesmo para anexos.

    
por Rick Curran 18.08.2010 / 18:19
fonte

5 respostas

13

Edit: 09/12/2017 Veja esta resposta para uma solução mais atualizada:

Vou responder à minha pergunta aqui, pois consegui descobrir uma solução para o que estou tentando fazer. Cheguei à conclusão de que não era possível obter o Category Metabox ativado para anexos. No entanto, descobri que era fácil obter um campo básico para Categorias adicionadas à página de anexos usando register_taxonomy_for_object_type e 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');
}

O campo adicionado ficou assim:

Éapenasumcampodetextosimples,masoqueeudescobrifoiquevocêpoderiadigitaronomedeumacategoriaexistenteesersalvocomsucessoquandooanexofosseatualizado(Oúnicocomportamentoestranhoéqueelerenderizaonormalversãoemvezdoslugapóssalvar).

Quandopercebiquepodiasalvarcategoriasdessaforma,concluíquepoderiaobterumalistadetodasascategoriasdisponíveiscomocaixasdeseleçãoemarcarasquehaviamsidoselecionadas.EntãouseiumpoucodejQueryparapegarosvaloresdascategoriasverificadasecolocartodasasslugsdascategoriasnocampoCategory.Paraqueissopareçaaindamaissimples,useiumpoucodeCSSsimplesparaocultaralinhadatabelaquecontinhaocampoCategory.Assim,tudoquevocêvêsãoascaixasdeseleção,assim:

Agora que posso adicionar categorias a anexos de imagem, posso usar algo como:

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

E puxe as imagens categorizadas para uma página! Exatamente o que eu estava esperando fazer, eu não achava que haveria uma maneira de fazer isso, mas feliz por ter conseguido descobrir algo.

Transformei isso em um plug-in chamado WOS Media Categories , que disponibilizei para download no meu website, Suburbia.org.uk , espero que seja útil para outra pessoa! Obrigado novamente àqueles que comentaram sobre esta e outras perguntas que fiz aqui, que ajudaram a descobrir isso!

Atualização: adicionei uma correção para permitir que as categorias sejam adicionadas enquanto as imagens são carregadas usando o carregador em massa do Flash.

    
por Rick Curran 20.08.2010 / 19:44
fonte
4

acabou de criar isso, que é uma solução completa para a vinculação javascript herky-jerk no campo de formulário. Como os valores de suas caixas de seleção são passados junto com o $ _POST ao enviar, você pode simplesmente pegá-los durante o filtro add_image_attachment_fields_to_save e definir os termos do objeto de postagem.

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

(observe que estou usando uma taxonomia personalizada e não categorias, portanto, será necessário alterar a matriz $ categories para que corresponda à mesma matriz usada quando você configura as caixas de seleção)

Shabam, shabozzle. Aproveite.

    
por Drew Gourley 30.12.2011 / 17:53
fonte
1

Isso é difícil / complicado se você quiser usar a caixa de categoria padrão do WordPress. Por um lado, o metabox não retorna a saída, apenas o ecoa. Além disso, não lhe daria o nome do campo de entrada correto, por isso não salvaria. Uma ideia pode ser usar um Autocompletar de UI do jQuery para replicar a funcionalidade da caixa de tags.

No entanto, se você quiser brincar com os campos do editor de mídia, poderá conectar-se a 'attachment_fields_to_edit' e editar a matriz de campos. O filtro passa dois argumentos para o callback: primeiro argumento é o array de campos, o segundo é o objeto post do anexo. Veja aqui para mais detalhes:

enlace

    
por John P Bloch 18.08.2010 / 19:07
fonte
1

Eu criei um plugin usando as categorias de mídia WOS do @ RickCurran como ponto de partida. No entanto, WOS Media Categories, assim como outros plugins que adicionam suporte à categoria na mídia, na verdade não adicionam um metabox, eu fiz exatamente isso.

Énecessariamenteumaformasimplificadadosmetaboxesempostsepáginas,masincluíumacapacidadedefiltragemquefacilitaouso.

Na verdade, estou gerando toda a categoria metabox que você vê em páginas e postagens, mas escondendo os bits que não funcionam na página de mídia por causa da falta de estilo e do javascript ausente.

Dou as boas-vindas a qualquer pensamento que alguém possa ter sobre como tornar o metabox totalmente funcional - algo que pretendo fazer em uma versão posterior.

    
por eddiemoya 17.01.2012 / 01:17
fonte
0

Ótimo plugin Rick - muito útil.

Se você mover o gatilho onclick inline em vez de vinculá-lo ao onload (e fazer alguns outros pequenos ajustes), ele também funcionará no uploader em massa do Flash. Com a versão atual, o Flash carrega após o evento de carregamento do jQuery, para que os objetos ainda não existam.

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

adicione onclick para inserir no arquivo php:

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

adicione o id do formulário de upload em massa ao arquivo css:

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

}

    
por djbokka 20.10.2010 / 17:23
fonte