Subida de Avatar Local Simple en el Frontend

4 ago 2011, 11:49:12
Vistas: 15.4K
Votos: 3

Estoy usando Simple Local Avatars para permitir a los usuarios subir avatares personalizados.

¿Cómo puedo crear una página en el frontend con la función de subida de avatares?

A continuación encontrarás el código del plugin Simple Local Avatars:

    <?php
    /**
     * Añade campo a los perfiles de usuario
     */
     class simple_local_avatars {
        function simple_local_avatars() {
            add_filter('get_avatar', array($this, 'get_avatar'), 10, 5);
            add_action('admin_init', array($this, 'admin_init'));
            add_action('show_user_profile', array($this, 'edit_user_profile'));
            add_action('edit_user_profile', array($this, 'edit_user_profile'));
            add_action('personal_options_update', array($this, 'edit_user_profile_update'));
            add_action('edit_user_profile_update', array($this, 'edit_user_profile_update'));
            add_filter('avatar_defaults', array($this, 'avatar_defaults'));
        }
    function get_avatar($avatar = '', $id_or_email, $size = '80', $default = '', $alt = false) {
        if (is_numeric($id_or_email))
            $user_id = (int) $id_or_email;
        elseif (is_string($id_or_email)) {
            if ($user = get_user_by_email($id_or_email))
                $user_id = $user->ID;
        } elseif (is_object($id_or_email) && !empty($id_or_email->user_id))
            $user_id = (int) $id_or_email->user_id;
        if (!empty($user_id))
            $local_avatars = get_user_meta($user_id, 'simple_local_avatar', true);
        if (!isset($local_avatars) || empty($local_avatars) || !isset($local_avatars['full'])) {
            if (!empty($avatar))
                return "<img src='http://www.wrongmag.ru/wp-content/themes/wrongmag/scripts/timthumb.php?src=/uploads/default-avatar.png&amp;w={$size}&amp;h={$size}&amp;zc=1' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
            remove_filter('get_avatar', 'get_simple_local_avatar');
            $avatar = get_avatar($id_or_email, $size, $default);
            add_filter('get_avatar', 'get_simple_local_avatar', 10, 5);
            return $avatar;
        }
        if (!is_numeric($size))
            $size = '80';
        if (empty($alt))
            $alt = get_the_author_meta('display_name', $user_id);
        if (empty($local_avatars[$size])) {
            $upload_path = wp_upload_dir();
            $avatar_full_path = str_replace($upload_path['baseurl'], $upload_path['basedir'], $local_avatars['full']);
            $image_sized = image_resize($avatar_full_path, $size, $size, true);
            if (is_wp_error($image_sized))
                $local_avatars[$size] = $local_avatars['full'];
            else
                $local_avatars[$size] = str_replace($upload_path['basedir'], $upload_path['baseurl'], $image_sized);
            update_user_meta($user_id, 'simple_local_avatar', $local_avatars);
        } elseif (substr($local_avatars[$size], 0, 4) != 'http')
            $local_avatars[$size] = site_url($local_avatars[$size]);
        $author_class = is_author($user_id) ? ' current-author' : '';
        $avatar = "<img alt='" . esc_attr($alt) . "' src='" . $local_avatars[$size] . "' class='avatar avatar-{$size}{$author_class} photo' height='{$size}' width='{$size}' />";
        return $avatar;
    }

    function admin_init() {
        load_plugin_textdomain('simple-local-avatars', false, dirname(plugin_basename(__FILE__)) . '/languages/');
        register_setting('discussion', 'simple_local_avatars_caps', array($this, 'sanitize_options'));
        add_settings_field('simple-local-avatars-caps', __('Permisos de Avatar Local', 'simple-local-avatars'), array($this, 'avatar_settings_field'), 'discussion', 'avatars');
    }

    function sanitize_options($input) {
        $new_input['simple_local_avatars_caps'] = empty($input['simple_local_avatars_caps']) ? 0 : 1;
        return $new_input;
    }

    function avatar_settings_field($args) {
        $options = get_option('simple_local_avatars_caps');
        echo '<label for="simple_local_avatars_caps">
            <input type="checkbox" name="simple_local_avatars_caps" id="simple_local_avatars_caps" value="1" ' . @checked($options['simple_local_avatars_caps'], 1, false) . ' />
            ' . __('Solo permitir que usuarios con capacidad de subir archivos puedan subir avatares locales (Autores y superiores)', 'simple-local-avatars') . '
        </label>';
    }

    function edit_user_profile($profileuser) {
        ?>
        <h3><?php _e('Avatar', 'simple-local-avatars'); ?></h3>
        <table class="form-table">
            <tr>
                <th><label for="simple-local-avatar"><?php _e('Subir Avatar', 'simple-local-avatars'); ?></label></th>
                <td style="width: 50px;" valign="top">
                    <?php echo get_avatar($profileuser->ID); ?>
                </td>
                <td>
                    <?php
                    $options = get_option('simple_local_avatars_caps');
                    if (empty($options['simple_local_avatars_caps']) || current_user_can('upload_files')) {
                        do_action('simple_local_avatar_notices');
                        wp_nonce_field('simple_local_avatar_nonce', '_simple_local_avatar_nonce', false);
                    ?>
                    <input type="file" name="simple-local-avatar" id="simple-local-avatar" /><br />
                    <?php
                    if (empty($profileuser->simple_local_avatar))
                        echo '<span class="description">' . __('No hay un avatar local configurado. Usa el campo de subida para añadir un avatar local.', 'simple-local-avatars') . '</span>';
                    else
                        echo '<input type="checkbox" name="simple-local-avatar-erase" value="1" /> ' . __('Eliminar avatar local', 'simple-local-avatars') . '<br />
                            <span class="description">' . __('Reemplaza el avatar local subiendo uno nuevo, o borra el avatar local (volviendo al gravatar) marcando la opción de eliminar.', 'simple-local-avatars') . '</span>';
                    } else {
                        if (empty($profileuser->simple_local_avatar))
                            echo '<span class="description">' . __('No hay un avatar local configurado. Configura tu avatar en Gravatar.com.', 'simple-local-avatars') . '</span>';
                        else
                            echo '<span class="description">' . __('No tienes permisos de gestión de medios. Para cambiar tu avatar local, contacta al administrador del sitio.', 'simple-local-avatars') . '</span>';
                    }
                    ?>
                </td>
            </tr>
        </table>
        <script type="text/javascript">var form=document.getElementById('your-profile');form.encoding='multipart/form-data';form.setAttribute('enctype','multipart/form-data');</script>
        <?php
    }

    function edit_user_profile_update($user_id) {
        if (!wp_verify_nonce($_POST['_simple_local_avatar_nonce'], 'simple_local_avatar_nonce'))
            return;
        if (!empty($_FILES['simple-local-avatar']['name'])) {
            $mimes = array(
                'jpg|jpeg|jpe' => 'image/jpeg',
                'gif' => 'image/gif',
                'png' => 'image/png',
                'bmp' => 'image/bmp',
                'tif|tiff' => 'image/tiff'
            );
            $avatar = wp_handle_upload($_FILES['simple-local-avatar'], array('mimes' => $mimes, 'test_form' => false));
            if (empty($avatar['file'])) {
                switch ($avatar['error']) {
                    case 'File type does not meet security guidelines. Try another.':
                        add_action('user_profile_update_errors', create_function('$a', '$a->add("avatar_error",__("Por favor sube un archivo de imagen válido para el avatar.","simple-local-avatars"));'));
                        break;
                    default:
                        add_action('user_profile_update_errors', create_function('$a', '$a->add("avatar_error","<strong>".__("Hubo un error al subir el avatar:","simple-local-avatars")."</strong> ' . esc_attr($avatar['error']) . '");'));
                }
                return;
            }
            $this->avatar_delete($user_id);
            update_user_meta($user_id, 'simple_local_avatar', array('full' => $avatar['url']));
        } elseif (isset($_POST['simple-local-avatar-erase']) && $_POST['simple-local-avatar-erase'] == 1)
            $this->avatar_delete($user_id);
    }

    function avatar_defaults($avatar_defaults) {
        remove_action('get_avatar', array($this, 'get_avatar'));
        return $avatar_defaults;
    }

    function avatar_delete($user_id) {
        $old_avatars = get_user_meta($user_id, 'simple_local_avatar', true);
        $upload_path = wp_upload_dir();
        if (is_array($old_avatars)) {
            foreach ($old_avatars as $old_avatar) {
                $old_avatar_path = str_replace($upload_path['baseurl'], $upload_path['basedir'], $old_avatar);
                @unlink($old_avatar_path);
            }
        }
        delete_user_meta($user_id, 'simple_local_avatar');
    }
}
$simple_local_avatars = new simple_local_avatars;

if (!function_exists('get_simple_local_avatar')):
    function get_simple_local_avatar($id_or_email, $size = '80', $default = '', $alt = false) {
        global $simple_local_avatars;
        return $simple_local_avatars->get_avatar('', $id_or_email, $size, $default, $alt);
    }
endif;

register_uninstall_hook(__FILE__, 'simple_local_avatars_uninstall');

function simple_local_avatars_uninstall() {
    $simple_local_avatars = new simple_local_avatars;
    $users = get_users_of_blog();
    foreach ($users as $user)
        $simple_local_avatars->avatar_delete($user->user_id);
    delete_option('simple_local_avatars_caps');
}

He probado muchas variantes pero todas han fallado.

¿Podrías darme una pista sobre qué partes del código debo copiar a mi archivo de plantilla personalizado para el frontend?

Muchas gracias.

0
Todas las respuestas a la pregunta 5
4

agrega

do_action('show_user_profile');
do_action('edit_user_profile');

a tu plantilla personalizada en el frontend

y al guardar añade:

do_action('personal_options_update');
do_action('edit_user_profile_update');
4 ago 2011 12:25:25
Comentarios

OK, gracias. Pero ¿qué pasa con el resto del código? ¿Qué fragmento de código debo poner entre los dos snippets que me diste?

Sergey Sergey
4 ago 2011 12:30:28

hmmm, tu plantilla personalizada para el frontend, echa un vistazo a http://wordpress.stackexchange.com/questions/9775/how-to-edit-a-user-profile-on-the-front-end/9786#9786

Bainternet Bainternet
4 ago 2011 12:34:31

Gracias por el enlace, pero todo lo que necesito es el campo de entrada para subir avatares. ¿Puedes indicarme qué parte de Simple Avatar Uploads debo usar entre los dos snippets de código?

Sergey Sergey
4 ago 2011 12:51:26

¿Todavía no puedes lograrlo? ¿Alguna pista?

Sergey Sergey
15 ago 2011 12:24:07
1

Sergey, utiliza esto en el lugar donde vas a colocar el formulario para editar el avatar:

<?php
$myAv = new simple_local_avatars();
$myAv->edit_user_profile($profileuser); 
?>
30 ago 2011 10:46:11
Comentarios

Por favor, mantén el uso del inglés para que todos los usuarios del sitio puedan beneficiarse de tus respuestas.

Rarst Rarst
30 ago 2011 11:54:21
1

Necesitamos pasar segundos parámetros a las acciones:

  1. La acción edit_user_profile necesita un objeto de usuario de Wordpress (lo tomamos de la clase WP_User)
  2. La acción edit_user_profile_update necesita el ID del usuario

La primera acción renderiza el campo de carga y el avatar actual, mientras que la segunda realiza la carga en sí. Es por eso que necesitamos activarla después de hacer clic en el botón. Escuchamos el botón al principio del código, así que después de enviar la página se actualiza y el avatar se muestra correctamente (de lo contrario aparece como una imagen rota).

Aquí está mi configuración:

<?php if(isset($_POST['user_avatar_edit_submit']))
      {
           do_action('edit_user_profile_update', bbp_get_displayed_user_id());
      }
?>
<form id="your-profile" action="<?php bbp_user_profile_edit_url( bbp_get_displayed_user_id() ); ?>" method="post">
<?php 
    $this_user = new WP_User(bbp_get_displayed_user_id());
    do_action('edit_user_profile', $this_user);
?>

    <input type="submit" name="user_avatar_edit_submit" value="OK"/>
</form>
14 sept 2012 05:11:53
Comentarios

¿Eres el tipo que hizo la pregunta originalmente?

kaiser kaiser
14 sept 2012 05:23:52
1
<?php get_header();
global $user_ID;
if ($user_ID) {
$user_info = get_userdata($user_ID);
$id = $user_info->ID;
}
 ?>
<?php if(isset($_POST['user_avatar_edit_submit']))
      {
           do_action('edit_user_profile_update', $id);
      }
?>

<form id="your-profile" action="" method="post">
    <?php
    $myAv = new simple_local_avatars();
    $myAv->edit_user_profile($user_info);
    ?>
    <input type="submit" name="user_avatar_edit_submit" value="Aceptar"/>
</form>
19 nov 2012 16:31:23
Comentarios

Explicar lo que sucede en tu código de ejemplo mejoraría significativamente la calidad de tu respuesta. Ya sea una breve introducción o en forma de comentarios dentro del código.

brasofilo brasofilo
19 nov 2012 18:42:11
5
-2

Nota del Editor: El siguiente fragmento parece contener código fuente en parte del siguiente plugin, Simple Local Avatars.

<?php
global $current_user;
 $user_id = get_current_user_id();
$user_last = get_user_meta($user_id);
$unserialize = unserialize($user_last['simple_local_avatar'][0]);
class Simple_Local_Avatarssss {
    private $user_id_being_edited, $avatar_upload_error, $remove_nonce, $avatar_ratings;
    public $options;        
    public function unique_filename_callback( $dir, $name, $ext ) {
        $user = get_user_by( 'id', (int) $this->user_id_being_edited ); 
        $name = $base_name = sanitize_file_name( $user->display_name . '_avatar_' . time() );
        // asegurar que no haya conflictos con nombres de archivos existentes
        $number = 1;
        while ( file_exists( $dir . "/$name$ext" ) ) {
            $name = $base_name . '_' . $number;
            $number++;
        }

        return $name . $ext;
    }
    private function assign_new_user_avatar( $url_or_media_id, $user_id ) {
        // eliminar el avatar antiguo
        $this->avatar_delete( $user_id );   // eliminar imágenes antiguas si es exitoso
        $meta_value = array();
        // establecer el nuevo avatar
        if ( is_int( $url_or_media_id ) ) {
            $meta_value['media_id'] = $url_or_media_id;
            $url_or_media_id = wp_get_attachment_url( $url_or_media_id );
        }
        $meta_value['full'] = $url_or_media_id;
        update_user_meta( $user_id, 'simple_local_avatar', $meta_value );   // guardar información del usuario (sobrescribiendo la antigua)
    }

    public function avatar_delete( $user_id ) {
        $old_avatars = (array) get_user_meta( $user_id, 'simple_local_avatar', true );
        if ( empty( $old_avatars ) )
            return;
        // si era un medio cargado, no borrar el tamaño completo ni intentar borrar un ID
        if ( array_key_exists( 'media_id', $old_avatars ) )
            unset( $old_avatars['media_id'], $old_avatars['full'] );
        if ( ! empty( $old_avatars ) ) {
            $upload_path = wp_upload_dir();
            foreach ($old_avatars as $old_avatar ) {
                // derivar la ruta del archivo basada en el directorio de carga
                $old_avatar_path = str_replace( $upload_path['baseurl'], $upload_path['basedir'], $old_avatar );
                if ( file_exists( $old_avatar_path ) )
                    unlink( $old_avatar_path );
            }
        }

        delete_user_meta( $user_id, 'simple_local_avatar' );
        delete_user_meta( $user_id, 'simple_local_avatar_rating' );
    }

    public function edit_user_profile_update( $file , $user_id ) {
                $_FILES['simple-local-avatar'] = $file['file'];
        // verificar archivos cargados
        if ( ! empty( $_FILES['simple-local-avatar']['name'] ) ) :
            // soporte para front-end (theme my profile etc)
            if ( ! function_exists( 'wp_handle_upload' ) )
                require_once( ABSPATH . 'wp-admin/includes/file.php' );
            $this->user_id_being_edited = $user_id; // hacer user_id conocido por la función unique_filename_callback
            $avatar = wp_handle_upload( $_FILES['simple-local-avatar'], array(
                'mimes'                     => array(
                    'jpg|jpeg|jpe'  => 'image/jpeg',
                    'gif'           => 'image/gif',
                    'png'           => 'image/png',
                ),
                'test_form'                 => false,
                'unique_filename_callback'  => array( $this, 'unique_filename_callback' )
            ) );
            if ( empty($avatar['file']) ) ) {     // manejar fallos
                switch ( $avatar['error'] ) {
                    case 'File type does not meet security guidelines. Try another.' :
                        $this->avatar_upload_error = __('Por favor, sube un archivo de imagen válido para el avatar.','simple-local-avatars');
                        break;
                    default :
                        $this->avatar_upload_error = '<strong>' . __('Hubo un error al cargar el avatar:','simple-local-avatars') . '</strong> ' . esc_html( $avatar['error'] );
                }

                return;
            }
            $this->assign_new_user_avatar( $avatar['url'], $user_id );
        endif;
        // manejar calificación
        if ( isset( $avatar['url'] ) || $avatar = get_user_meta( $user_id, 'simple_local_avatar', true ) ) {
            if ( empty( $_POST['simple_local_avatar_rating'] ) || ! array_key_exists( $_POST['simple_local_avatar_rating'], $this->avatar_ratings ) )
            //  $_POST['simple_local_avatar_rating'] = key( $this->avatar_ratings );
                                update_user_meta( $user_id, 'simple_local_avatar_rating', $_POST['simple_local_avatar_rating'] );
                                return 1;
        }
    }
}

if(isset($_POST['sub']))
{
    $fname=$_FILES['file']['name'];
    $ftype=$_FILES['file']['type']; 
}
if(isset($_FILES['file']['name']) && !empty($_FILES['file']['name'])     ){
    $simple_local_avatars = new Simple_Local_Avatarssss;
    $result = $simple_local_avatars->edit_user_profile_update($_FILES,$user_id);
    if($result)):
  echo 'Actualizado';
    endif; } ?>
<form action="" method="POST" enctype="multipart/form-data">
    <?php echo get_avatar( $user_id, 96, $default, $alt ); ?><br /><br />
    <input type="file" name="file"><br /><br />
    <input style="float: left;" type="submit" name="sub" value="Subir Imagen">
</form>
3 jun 2014 13:46:32
Comentarios

Por favor, agrega tu código correctamente. Resalta todo tu código en el editor y haz clic en el signo {}. Esto agregará tu código adecuadamente en un bloque de código. También, añade una explicación de lo que hace tu código y cómo funciona.

Pieter Goosen Pieter Goosen
3 jun 2014 13:56:34

Además: Si copiaste ese código de algún lugar, debes mencionar/enlazar a la fuente y respetar su licencia. Entonces: ¿Es este tu código o de alguien más?

kaiser kaiser
3 jun 2014 14:22:02

@kaiser Parece ser un conjunto de ejemplo del plugin mencionado anteriormente.

Adam Adam
3 jun 2014 15:18:08

@userabuser Gracias por intervenir. ¿Estás seguro sobre la parte de "para ajustar esta pregunta"?

kaiser kaiser
3 jun 2014 15:42:37

@kaiser No, en retrospectiva después de escribirlo, me doy cuenta de que puede no ser el caso exacto. Probablemente podamos omitir esa parte. Hecho.

Adam Adam
3 jun 2014 15:45:26