Adicione a caixa meta padrão da tag WordPress ao perfil do usuário

8

Configurei meus perfis de usuário para permitir taxonomias personalizadas após este tutorial .

Idealmente, eu gostaria de usar a meta box Tag padrão na tela Post, para que os usuários possam adicionar novos termos com facilidade e encontrar os mais usados. Atualmente, estou usando uma lista de opções, mas isso pode demorar muito, pois teremos várias taxonomias. Eu poderia de alguma forma usar o post_tags_meta_box()? Eu olhei, add_meta_box()mas isso não funciona 'user'.

epschmidt
fonte
2
+1 para esse link ... não sabia que era possível adicionar taxonomias aos usuários!
Michael Lewis
Você poderia realmente mostrar o que tentou? Quero dizer "mostre com seu código que não está funcionando".
Kaiser #
@ Kaiser O único código que eu realmente tentei foi add_meta_box (), mas só pode ser usado em tipos de post, não no objeto de usuário.
Epschmidt 6/08/2013
Como nota de rodapé, as taxonomias podem ser adicionadas a qualquer coisa que tenha um ID, incluindo comentários, usuários, postagens ou até mesmo taxonomias. Isso ocorre porque os termos de taxonomia relacionam IDs, mas não assumem o que esse ID representa além de um formato de dados. São as funções no topo que fazem essas suposições.
Tom J Nowell

Respostas:

1

Infelizmente, eu diria que a resposta é não.

Você pode seqüestrar (copiar + colar) o código post_categories_meta_box()e tentar adaptá-lo ao usuário, mas gastaria mais tempo tentando reconectar todas as peças. Tenho certeza de que as metarcas de postagem usam o ajax para salvar e adicionar novos termos, então você precisa seqüestrar algum javascript e modificá-lo também.

Acho que sua melhor aposta é continuar no caminho em que você está. Você pode adicionar uma overflow:scroll;propriedade css ao contêiner da caixa de seleção para que não demore muito.

Eu inverti a engenharia das metarcas pós para o front end há alguns meses, e não foi muito difícil. Eu não sugeriria tentar reutilizar as funções de marcação e php do núcleo. Em vez disso, use-os como um guia se você ficar preso.

Michael Lewis
fonte
Eu segui o caminho de tentar extrair o código da caixa Tag em post_tags_meta_box () do núcleo e adicioná-lo ao perfil do usuário. Mas você está certo, há algumas coisas de javascript e ajax acontecendo que eu precisaria copiar também, o que tornaria isso mais complicado do que eu preciso. Acho que vou apenas criar um tipo de postagem personalizada 'Membro' e publicar uma postagem quando um usuário estiver registrado e usar taxonomias com isso.
Epschmidt 6/08
1

Resposta breve para apenas esboçar o que precisa ser feito:

  1. O WP usa javascript para adicionar toda a magia às meta boxes (arrastar e soltar, dobrar etc.) -> Você precisará wp_enqueue_script( 'posts' );(ou no entanto esse identificador de script foi chamado).
  2. Você precisará dos ganchos que permitem registrar as meta boxes.
  3. Há MarkUp específico (principalmente contêineres e afins) que precisa ser renderizado na tela de perfil do usuário.
kaiser
fonte
1

Este código funciona para mim. Ele usa a taxonomia personalizada de 'locais' e o javascript 'sugerir'. Você precisa estendê-lo para suportar a seleção de múltiplos termos .

Adicionar campo personalizado à tela de edição do usuário e armazenar metadados quando o usuário / administrador atualizar o perfil

// for account owner
add_action('show_user_profile', 'add_custom_user_profile_fields');
add_action('personal_options_update', 'save_custom_user_profile_fields');

// for admins
add_action('edit_user_profile', 'add_custom_user_profile_fields');
add_action('edit_user_profile_update', 'save_custom_user_profile_fields');

function add_custom_user_profile_fields($user) {
    printf(
    '
<h3>%1$s</h3>
<table class="form-table">
<tr>
<th><label for="location">%2$s</label></th>
<td>
  <input type="text" name="location" id="location" value="%3$s" class="regular-text" />
  <br /><span class="description">%4$s</span>
</td>
</tr>
</table>
',      __('Extra Profile Information', 'locale'),
        __('Location', 'locale'),
        esc_attr(get_user_meta($user->ID, 'location', true)),
        __('Start typing location name.', 'locale')
    );
}

function save_custom_user_profile_fields($user_id) {
    if (!current_user_can('edit_user', $user_id))
        return FALSE;

    $location_name = ( isset($_POST['location']) ) ? $_POST['location'] : '';

    // use your taxonomy name instead of 'locations'
    $location = get_term_by('name', $location_name, 'locations');

    // human readable value and id
    update_user_meta($user_id, 'location', $location_name);
    update_user_meta($user_id, 'location_id', $location->term_id);
}

Enfileirar sugerir javascript apenas para a tela de edição do usuário (supondo que você o use no tema personalizado)

function admin_scripts($hook) {
    $screen = get_current_screen();
    if ('user-edit' == $screen->id) {
    wp_enqueue_script(
        'user-edit-tag',
        get_stylesheet_directory_uri() . '/js/usermeta.js',
        array('suggest'),
        '20140509',
        true
    );
    }
}

usermeta.js

jQuery(document).ready(function($) {
   // use 'tax=your_taxonomy_name' instead of 'tax=locations'
   $('#location').suggest(ajaxurl+"?action=ajax-tag-search&tax=locations",{
        multiple:false,
        multipleSep: ","
    });
});
user51434
fonte