Frontend Simple Local Avatar upload

I’m using Simple Local Avatars for uploading custom user avatars.

How can I create a frontend page with the avatar upload function?

Read More

Below please find the code from Simple Local Avatars plugin:

    <?php
    /**
     * add field to user profiles
     */
     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', __('Local Avatar Permissions', '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) . ' />
            ' . __('Only allow users with file upload capabilities to upload local avatars (Authors and above)', '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('Upload 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 local avatar is set. Use the upload field to add a local avatar.', 'simple-local-avatars') . '</span>';
                    else
                        echo '<input type="checkbox" name="simple-local-avatar-erase" value="1" /> ' . __('Delete local avatar', 'simple-local-avatars') . '<br />
                            <span class="description">' . __('Replace the local avatar by uploading a new avatar, or erase the local avatar (falling back to a gravatar) by checking the delete option.', 'simple-local-avatars') . '</span>';
                    } else {
                        if (empty($profileuser->simple_local_avatar))
                            echo '<span class="description">' . __('No local avatar is set. Set up your avatar at Gravatar.com.', 'simple-local-avatars') . '</span>';
                        else
                            echo '<span class="description">' . __('You do not have media management permissions. To change your local avatar, contact the blog administrator.', '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",__("Please upload a valid image file for the avatar.","simple-local-avatars"));'));
                        break;
                    default:
                        add_action('user_profile_update_errors', create_function('$a', '$a->add("avatar_error","<strong>".__("There was an error uploading the 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');
}

I have tried many variants but all of them failed.

Could you please give a hint, what pieces of code I shall copy to my custom frontend template file?

Thank you very much.

Related posts

Leave a Reply

5 comments

  1. Sergey, use this in place where you are going to put form to edit avatar:

    <?php
    $myAv = new simple_local_avatars();
    $myAv->edit_user_profile($profileuser); 
    ?>
    
  2. add

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

    to your custom frontend template

    and when saving add :

    do_action('personal_options_update');
    do_action('edit_user_profile_update');
    
  3. We need second parameters passed to the actions:

    1. action edit_user_profile needs a WordPress user object (we take it from WP_User class)
    2. action edit_user_profile_update needs the user id

    The first action is rendering the upload field and the current avatar and the second one is doing the upload itself. That’s why we need to trigger it after clicking the button. We listen for the button in the beginning of the code, so after submitting the page refreshes and the avatar is updated (otherwise it shows up as a broken image).

    Here is my setup:

    <?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>
    
  4. <?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="OK"/>
    </form>
    
    
    
    <?php get_footer(); ?>
    
  5. Editor Note: The following snippet appears to contain source code in part from the following 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() );
            // ensure no conflicts with existing file names
            $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 ) {
            // delete the old avatar
            $this->avatar_delete( $user_id );   // delete old images if successful
            $meta_value = array();
            // set the new 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 );   // save user information (overwriting old)
        }
    
        public function avatar_delete( $user_id ) {
            $old_avatars = (array) get_user_meta( $user_id, 'simple_local_avatar', true );
            if ( empty( $old_avatars ) )
                return;
            // if it was uploaded media, don't erase the full size or try to erase an the 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 ) {
                    // derive the path for the file based on the upload directory
                    $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'];
            // check for uploaded files
            if ( ! empty( $_FILES['simple-local-avatar']['name'] ) ) :
                // front end (theme my profile etc) support
                if ( ! function_exists( 'wp_handle_upload' ) )
                    require_once( ABSPATH . 'wp-admin/includes/file.php' );
                $this->user_id_being_edited = $user_id; // make user_id known to unique_filename_callback function
                $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']) ) {     // handle failures
                    switch ( $avatar['error'] ) {
                        case 'File type does not meet security guidelines. Try another.' :
                            $this->avatar_upload_error = __('Please upload a valid image file for the avatar.','simple-local-avatars');
                            break;
                        default :
                            $this->avatar_upload_error = '<strong>' . __('There was an error uploading the avatar:','simple-local-avatars') . '</strong> ' . esc_html( $avatar['error'] );
                    }
    
                    return;
                }
                $this->assign_new_user_avatar( $avatar['url'], $user_id );
            endif;
            // handle rating
            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 'Updated';
        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="Upload Image">
    </form>