Posso adicionar uma Metabox de categoria ao anexo?

18

Estou usando register_taxonomy_for_object_type()para adicionar o campo Taxonomia da categoria aos 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 Categoria à página Mídia ao exibir uma imagem. O que eu realmente quero é fazer com que ele mostre a Metabox de Categorias real, para que eu possa escolher as Categorias que quero usar, em vez de apenas digitá-las no campo comum. Também descobri que colocar a lesma de uma categoria nesse campo de texto, como my-category-nameacaba sendo exibido como o nome da categoria real, comoMy Category Name quando é salvo, o que torna o campo de texto simples ainda menos uma opção útil.

Eu estive analisando a add_post_type_support()função para adicionar Metaboxes e a vi usada para tipos de postagem personalizados, mas não consigo ver se é possível adicionar o mesmo para anexos.

Rick Curran
fonte
Se você esperar um dia ou dois antes de escolher uma melhor resposta eu vou escrever-lhe um plugin ... (Eu só tenho prazos do cliente e um meetup WordPress para Respostas WordPress presentes para esta noite ...)
MikeSchinkel
@ Mike: Obrigado, estou ansioso para ver quais soluções existem para esse problema. Parece que o que eu estou procurando é de cerca de 90% no WordPress como está, resta apenas ver os últimos 10%!
Rick Curran
Eu fiz algo muito semelhante com uma metabox pós personalizada; ou seja, incorporar uma lista de categorias (básica) (ou seja, sem as guias de todos / mais populares). Depende apenas de como 'attachment_fields_to_edit' implementa seu POST. Enfim, eu não posso fazer hoje à noite. Precisa dormir.
MikeSchinkel
Opa, como você já respondeu, eu retirarei minha lista de tarefas.
precisa saber é o seguinte
@ Mike: Obrigado pela sua ajuda, eu adoraria alguns comentários sobre a minha solução. Estou feliz por ter encontrado uma maneira de fazê-lo funcionar. Seria ótimo ver a adição de categorias a anexos por meio da metabox da categoria real, mas minha solução funciona bem o suficiente.
Rick Curran

Respostas:

14

Edit: 12/09/2017 Veja esta resposta para obter uma solução mais atualizada para isso: Como usar taxonomias em anexos com a nova Biblioteca de Mídia?

Vou responder minha própria pergunta aqui, pois consegui descobrir uma solução para o que tenho tentado fazer. Cheguei à conclusão de que não era possível ativar a Metabox da categoria 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_typee 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 mostrou assim:

texto alternativo

É apenas um campo de texto simples, mas o que descobri foi que você poderia digitar o nome de uma categoria existente e ser salvo com sucesso quando o anexo fosse atualizado (o único comportamento estranho é que ele retornou a versão normal em vez de lesma após salvar).

Depois que percebi que podia salvar categorias dessa maneira, achei que poderia obter uma lista de todas as categorias disponíveis como caixas de seleção e verificar as que foram selecionadas. Em seguida, usei um pouco de jQuery para capturar os valores das categorias verificadas e colocar todas as lesmas das categorias no campo Categoria. Para tornar isso ainda mais transparente, usei um pouco de CSS para ocultar a linha da tabela que continha o campo Categoria, para que você só veja as caixas de seleção, assim:

texto alternativo

Agora que posso adicionar categorias aos anexos de imagens, posso usar algo como:

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

E puxe as imagens categorizadas em uma página! Exatamente o que eu esperava fazer, não achei que houvesse uma maneira de fazê-lo, mas feliz por ter conseguido descobrir alguma coisa.

Transformei isso em um plugin chamado WOS Media Categoriesque disponibilizei para download no meu site, Suburbia.org.uk , espero que possa ser útil para outra pessoa! Mais uma vez obrigado a quem comentou sobre esta e outras perguntas que fiz aqui, que ajudaram a descobrir!

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

Rick Curran
fonte
Estou um pouco incomodado usando jQuery de algo que requer integridade de dados. Tenho certeza de que tudo isso pode ser feito no servidor. Vou tentar ver isso em breve.
MikeSchinkel
11
@ Mike: Sim, também estou um pouco preocupado com isso. No entanto, há muitos casos em que o JavaScript está envolvido, então decidi que estava feliz o suficiente com essa solução. Definitivamente, fico feliz em receber algum feedback sobre métodos alternativos. Quando eu tiver uma chance, gostaria de enviá-lo para o repositório do WordPress, embora eu possa esperar e ver o que você voltará. Obrigado!
Rick Curran
@Mike ou @Rick - Você poderia fornecer outro exemplo que pode atribuir automaticamente uma postagem a uma categoria específica quando a mídia é adicionada? A associação de categoria seria baseada no tipo de postagem em que ele está ou definida manualmente através do código?
NetConstructor.com 19/10/10
@ NetConstructor.com - soa como uma outra pergunta para mim ...
MikeSchinkel
@ netconstructor.com: Sim, parece outra grande pergunta para mim!
Rick Curran
4

acabou de criar isso, que é uma solução completa para a ligação javascript herky-jerk ao campo de formulário. Como os valores de suas caixas de seleção são passados ​​juntamente com o $ _POST no envio, você pode apenas 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, você precisará alterar a matriz $ categories para corresponder à mesma matriz usada quando configura suas caixas de seleção)

Shabam, shabozzle. Desfrutar.

Drew Gourley
fonte
Sua função add_image_attachment_fields_to_save precisa retornar $ post no final. wp_set_object_terms( $post['ID'], $terms, 'image-format' ); return $post;. E o script que você postou não executa register_custom_taxonomies. Mas de qualquer maneira roteiro legal. Definitivamente vai usar isso no futuro!
Rob Vermeer
Ah, oops, eu juntei tudo pensando que estava sendo conveniente. Vou consertar aqui em um segundo. Bom ponto no retorno, no entanto, eu não estava tendo nenhum problema com isso.
Tirou Gourley
1

Isso é difícil / complicado se você deseja usar a caixa de categoria padrão do WordPress. Por um lado, o metabox não retorna a saída, apenas a repete. Além disso, ele não forneceria o nome correto do campo de entrada, portanto não seria salvo. Uma idéia pode ser usar um preenchimento automático da interface do usuário 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 retorno de chamada: o primeiro argumento é a matriz de campos, o segundo é o objeto de postagem do anexo. Veja aqui para mais detalhes:

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

John P Bloch
fonte
Obrigado, vou dar uma olhada attachment_fields_to_edite ver como isso acontece.
Rick Curran
1

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

visão abrangente

É necessariamente simplificado os metaboxes nas postagens e páginas, mas eu incluí uma capacidade de filtragem que facilita o uso.

categorias filtráveis

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

Congratulo-me com qualquer pensamento que alguém possa ter sobre como tornar o metabox totalmente funcional - algo que pretendo fazer em uma versão posterior.

eddiemoya
fonte
0

Ótimo plugin Rick - muito útil.

Se você mover o gatilho onclick em linha, em vez de vinculá-lo ao onload (e fazer alguns outros pequenos ajustes), ele funcionará também no upload 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.

js revisado:

 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 do upload em massa ao arquivo css:

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

}


fonte
Obrigado djbokka! Eu adicionei essa correção para a base de código agora, eu já atualizou os arquivos de plug-in que pode ser baixado a partir de meu site em suburbia.org.uk/page/projects.html#wos_media_categories
Rick Curran