web-development-kb-pt.site

Posso adicionar um Metabox de categoria ao anexo?

Estou usando register_taxonomy_for_object_type() para adicionar o campo Taxonomia de categoria a Uploads de mídia (anexos). Eu 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 olhando para a função add_post_type_support() para adicionar Metaboxes e vi que é usado para Custom Post Types, mas não consigo ver se é possível adicionar o mesmo para anexos.

18
Rick Curran

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

Eu vou responder a minha própria pergunta aqui, já que consegui descobrir uma solução para o que eu tenho tentado 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:

alt text

É apenas um campo de texto simples, mas o que eu encontrei foi que você poderia digitar o nome de uma categoria existente lá e ele seria salvo com sucesso quando o anexo fosse atualizado (O único comportamento estranho é que ele renderiza a versão normal em vez de a lesma depois de salvar).

Quando percebi que podia salvar as categorias dessa maneira, concluí que poderia obter uma lista de todas as categorias disponíveis como caixas de seleção e marcar as que haviam sido selecionadas. Eu então usei um pouco de jQuery para pegar os valores das categorias selecionadas e colocar todas as slugs das categorias no campo Category. Para fazer isso parecer ainda mais perfeito, usei um pouco de CSS para esconder a linha da tabela que continha o campo Category, então tudo que você vê são as caixas de seleção, como:

alt text

Agora que posso adicionar categorias a 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 estava esperando fazer, eu não achava que haveria uma maneira de fazer isso, mas feliz por ter conseguido descobrir alguma coisa.

Eu transformei isso em um plugin chamado WOS Media Categories que disponibilizei para download de meu site, Suburbia.org.uk , espero que possa ser ú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 categorias sejam adicionadas enquanto as imagens são carregadas usando o uploader em massa do Flash.

13
Rick Curran

acabou de criar isso, que é uma solução completa para a ligaçã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, você precisará alterar a matriz $ categories para que corresponda à mesma matriz usada ao configurar suas caixas de seleção)

Shabam, shabozzle. Apreciar.

4
Drew Gourley

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

overall view

É necessariamente simplificado a forma dos metaboxes em posts e páginas, mas incluí uma capacidade de filtragem que facilita o uso.

filterable categories

Eu estou realmente gerando toda a categoria metabox que você vê em páginas e posts, mas escondendo 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.

1
eddiemoya

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 Autocomplete 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 ao '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:

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

1
John P Bloch

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

revista 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 entrar 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; 

}

0
djbokka