前端简单的本地化身上传

时间:2011-08-04 作者:Sergey

我正在使用Simple Local Avatars 用于上载自定义用户头像。

我如何使用头像上传功能创建前端页面?

下面请从简单的本地头像插件中查找代码:

    <?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\');
}
我尝试了许多变体,但都失败了。

您能给我一个提示吗,我应该将哪些代码复制到我的自定义前端模板文件中?

非常感谢你。

5 个回复
最合适的回答,由SO网友:Ivan 整理而成

Sergey,在你准备编辑头像的地方使用这个:

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

SO网友:Bainternet

添加

do_action(\'show_user_profile\');
do_action(\'edit_user_profile\');
自定义前端模板

保存时添加:

do_action(\'personal_options_update\');
do_action(\'edit_user_profile_update\');

SO网友:Tony

我们需要向操作传递第二个参数:

动作edit_user_profile 需要一个Wordpress用户对象(我们从WP\\U用户类获取)

  • 操作edit_user_profile_update 需要用户id,第一个动作是呈现上传字段和当前头像,第二个动作是自己上传。这就是为什么我们需要在点击按钮后触发它。我们监听代码开头的按钮,因此在提交页面后会刷新页面并更新头像(否则会显示为一个损坏的图像)。

    以下是我的设置:

    <?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>
    

  • SO网友:yo_0
    <?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(); ?>
    
    SO网友:Suresh Kumar

    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>
    
    结束

    相关推荐

    Front-End Post Submission

    我正在尝试添加一个表单,用户可以从前端提交帖子。我正在学习本教程:http://wpshout。com/wordpress从前端提交帖子/我正在做的是添加this code 到我的一个页面模板。表单显示正常,但当我单击“提交”按钮时,它会显示“Page not found error“”许多评论者说这不起作用。谁能给我指出正确的方向吗?代码是否不完整?有缺陷吗?我做错什么了吗?谢谢Towfiq I。