Agregar metacuadro de etiqueta de WordPress predeterminado al perfil de usuario

8

He configurado mis perfiles de usuario para permitir taxonomías personalizadas siguiendo este tutorial .

Idealmente, me gustaría usar el metacuadro de etiqueta predeterminado de la pantalla Publicar, para que los usuarios puedan agregar fácilmente nuevos términos y encontrar los que se usan comúnmente. Actualmente estoy usando una lista de casillas de verificación, pero esto podría ser muy largo ya que tendremos varias taxonomías. ¿Podría de alguna manera usar el post_tags_meta_box()? Lo he investigado add_meta_box()pero eso no funciona 'user'.

epschmidt
fuente
2
+1 para ese enlace ... ¡no sabía que podía agregar taxonomías a los usuarios!
Michael Lewis
¿Podrías por favor mostrar lo que has probado? Me refiero a "mostrar con tu código que no funciona".
Kaiser
@kaiser El único código que realmente intenté fue add_meta_box () pero solo se puede usar en tipos de publicación, no en el objeto de usuario.
epschmidt
Como nota al margen, las taxonomías se pueden agregar a cualquier cosa que tenga una ID, incluidos los comentarios, los usuarios, las publicaciones o incluso las propias taxonomías. Esto se debe a que los términos de la taxonomía relacionan las ID pero no hacen ninguna suposición sobre lo que esa ID representa más allá de un formato de datos. Son las funciones en la parte superior las que hacen esas suposiciones
Tom J Nowell

Respuestas:

1

Lamentablemente, diría que la respuesta es no.

Podría secuestrar (copiar + pegar) el código post_categories_meta_box()e intentar adaptarlo al usuario, sin embargo, pasaría más tiempo tratando de volver a conectar todas las piezas. Estoy bastante seguro de que los meta box de post usan ajax para guardar y agregar nuevos términos, por lo que tendrías que secuestrar algunos JavaScript y modificarlos también.

Creo que tu mejor opción es continuar por el camino en el que estás. Puede agregar una overflow:scroll;propiedad css a su contenedor de casilla de verificación para que no se alargue demasiado.

Hace unos meses invertí la ingeniería de las cajas meta meta para el front-end, y no fue demasiado difícil. Sin embargo, no sugeriría intentar reutilizar las funciones de marcado y php desde el núcleo. En cambio, úsalos como guía si te quedas atascado.

Michael Lewis
fuente
Seguí el camino de intentar extraer el código del cuadro Etiqueta en post_tags_meta_box () desde el núcleo y agregarlo al perfil del usuario. Pero tienes razón, hay algunas cosas de javascript y ajax que también necesito copiar, lo que haría que esto sea más complicado de lo que necesito. Creo que simplemente crearé un tipo de publicación personalizada 'Miembro' y publicaré una publicación cuando un usuario esté registrado y usaré taxonomías con eso.
epschmidt
1

Breve respuesta para esbozar solo lo que hay que hacer:

  1. WP utiliza javascript para añadir toda la magia de las cajas de meta (arrastrar y colocar, plegado, etc.) -> Tendrá que wp_enqueue_script( 'posts' );(o mango sin embargo, que la escritura se llamaba).
  2. Necesitará los ganchos que permiten registrar los meta cuadros.
  3. Hay un MarkUp específico (en su mayoría contenedores y similares) que debe mostrarse en la pantalla de perfil de usuario.
emperador
fuente
1

Este código me funciona. Utiliza taxonomía personalizada de 'ubicaciones' y javascript 'sugerir'. Debe extenderlo para admitir la selección de términos múltiples .

Agregue un campo personalizado a la pantalla de edición del usuario y almacene metadatos cuando el usuario / administrador actualice el 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);
}

Enqueue sugerir javascript solo para la pantalla de edición del usuario (suponiendo que use esto en un 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: ","
    });
});
usuario51434
fuente