php 为用户上传自定义头像以覆盖gravatar以获取评论和author_meta

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php 为用户上传自定义头像以覆盖gravatar以获取评论和author_meta相关的知识,希望对你有一定的参考价值。

<?php
/*
Plugin Name: Custom WordPress Avatars
Plugin URI: http://c3mdigital.com
Description: Adds a custom avatar uploader in the user profile to replace gravatars with a custom avatar
Version: 1.0
Author: Chris Olbekson
Author URI: http://c3mdigital.com/
License: GPL v2
*/


/*  Copyright 2011  Chris Olbekson  (email : chris@c3mdigital.com)

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License, version 2, as
    published by the Free Software Foundation.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

    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='96', $default='', $alt=false ) {

            if ( is_numeric( $id_or_email ) )
                $user_id=(int)$id_or_email;
            elseif ( is_string( $id_or_email ) && ( $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 ) )
                return $avatar;
            $auth = get_the_author_meta( 'user_login', $user_id );
            $wp_content = WP_CONTENT_DIR;
            $wp_content_url = WP_CONTENT_URL;
            $filename=$wp_content . '/images/authors/' . $auth . '.jpg';
            if ( file_exists( $filename ) ) {
                $avatar=$wp_content_url . '/images/authors/' . $auth . '.jpg';
                $meta=array (
                    'full'=>$avatar
                );

                if ( !get_user_meta( $user_id, 'simple_local_avatar', true ) )

                    update_user_meta( $user_id, 'simple_local_avatar', $meta );
                    update_user_meta ( $user_id, 'big_avatar', $meta );
            }

            $local_avatars = get_user_meta( $user_id, 'simple_local_avatar', true );


            if ( empty( $local_avatars ) || empty( $local_avatars[ 'full' ] ) )
                return $avatar;

            $size=(int)$size;

            if ( empty( $alt ) )
                $alt=get_the_author_meta( 'display_name', $user_id );

            // generate a new size
            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 );


                // deal with original being >= to original image (or lack of sizing ability)
                $local_avatars[ $size ]=is_wp_error( $image_sized )
                        ? $local_avatars[ $size ]=$local_avatars[ 'full' ]
                        : 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 apply_filters( 'simple_local_avatar', $avatar );
        }

        function admin_init() {


            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 ( !isset( $_POST[ '_simple_local_avatar_nonce' ] ) || !wp_verify_nonce( $_POST[ '_simple_local_avatar_nonce' ], 'simple_local_avatar_nonce' ) ) //security
                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'
                );

                // front end (theme my profile etc) support
                if ( !function_exists( 'wp_handle_upload' ) )
                    require_once( ABSPATH . 'wp-admin/includes/file.php' );

                $this->avatar_delete( $user_id ); // delete old images if successful

                $avatar=wp_handle_upload( $_FILES[ 'simple-local-avatar' ], array ( 'mimes'=>$mimes, '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.' :
                            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;
                }

                update_user_meta( $user_id, 'simple_local_avatar', array ( 'full'=>$avatar[ 'url' ] ) ); // save user information (overwriting old)
            } elseif ( !empty( $_POST[ 'simple-local-avatar-erase' ] ) ) {
                $this->avatar_delete( $user_id );
            }
        }

        /**
         * remove the custom get_avatar hook for the default avatar list output on options-discussion.php
         */
        function avatar_defaults( $avatar_defaults ) {
            remove_action( 'get_avatar', array ( $this, 'get_avatar' ) );
            return $avatar_defaults;
        }

        /**
         * delete avatars based on user_id
         */
        function avatar_delete( $user_id ) {
            $old_avatars=get_user_meta( $user_id, 'simple_local_avatar', true );
            $auth=get_the_author_meta( 'user_login', $user_id );
            $wp_content=WP_CONTENT_DIR;
            $filename=$wp_content . '/images/authors/' . $auth . '.jpg';
            if ( file_exists( $filename ) ) {

                unlink( $filename );
            }
            else {
                $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' );
        }

        function unique_filename_callback( $dir, $user_id, $ext ) {
            global $user_id;
           $user_picname =  get_the_author_meta ( 'display_name', $user_id );
            $user = wp_get_current_user();
            $name = sanitize_file_name( $user_picname . '_avatar' );

            $number = 1;

            while ( file_exists( $dir . "/$name$ext" ) ) {
                $name = $name . '_' . $number;
                $number++;
            }

            return $name . $ext;
        }
    }

    $simple_local_avatars = new simple_local_avatars;

    function get_simple_local_avatar( $id_or_email, $size='300', $default='', $alt=false ) {
        global $simple_local_avatars;
        $avatar=$simple_local_avatars->get_avatar( '', $id_or_email, $size, $default, $alt );

        if ( empty ( $avatar ) )
            $avatar=get_avatar( $id_or_email, $size, $default, $alt );

        return $avatar;
    }

以上是关于php 为用户上传自定义头像以覆盖gravatar以获取评论和author_meta的主要内容,如果未能解决你的问题,请参考以下文章

杨泽业:如何给你的博客评论添加自定义的gravatar头像?

使用gravatar生成头像

php 添加默认头像头像gravatar

工具 - gravatar保存头像

php 自定义Gravatar

Rails 头像上传