Статьи

Как создать плагин для управления аватарами в WordPress: последние штрихи

Avatar Manager for WordPress — это приятный и простой плагин для локального хранения аватаров и многое другое. С легкостью.

Расширьте возможности своего веб-сайта WordPress, предоставив пользователям возможность выбирать между использованием Gravatar или размещенного в нем аватара прямо с экрана своего профиля. Улучшенный рабочий процесс, генерация изображений по требованию и пользовательские разрешения в собственном интерфейсе. Передайте привет плагину Avatar Manager.


В первой части нашего урока мы рассмотрели:

  • что такое плагин WordPress;
  • как создать базовый плагин для WordPress, выбрать подходящую лицензию и формат для номера версии;
  • что такое ловушки действий и фильтров и как их использовать для создания нашего плагина;
  • как добавить новые настройки на существующие экраны настроек;
  • Как сделать плагин более гибким с помощью пользовательских опций.

Сегодня мы пойдем дальше и завершим наш плагин: мы будем обрабатывать загрузку аватаров и генерацию изображений по требованию, интернационализировать наш плагин и многое другое.


Давайте начнем с написания следующей функции:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/**
 * Generates a resized copy of the specified avatar image.
 *
 * @uses wp_upload_dir() For retrieving path information on the currently
 * configured uploads directory.
 * @uses wp_basename() For i18n friendly version of basename().
 * @uses wp_get_image_editor() For retrieving a WP_Image_Editor instance and
 * loading a file into it.
 * @uses is_wp_error() For checking whether the passed variable is a WordPress
 * Error.
 * @uses do_action() For calling the functions added to an action hook.
 *
 * @since Avatar Manager 1.0.0
 *
 * @param string $url URL of the avatar image to resize.
 * @param int $size Size of the new avatar image.
 * @return array Array with the URL of the new avatar image.
 */
function avatar_manager_avatar_resize( $url, $size ) {
    // Retrieves path information on the currently configured uploads directory.
    $upload_dir = wp_upload_dir();
 
    $filename = str_replace( $upload_dir[‘baseurl’], $upload_dir[‘basedir’], $url );
    $pathinfo = pathinfo( $filename );
    $dirname = $pathinfo[‘dirname’];
    $extension = $pathinfo[‘extension’];
 
    // i18n friendly version of basename().
    $basename = wp_basename( $filename, ‘.’ . $extension );
 
    $suffix = $size .
    $dest_path = $dirname .
    $avatar = array();
 
    if ( file_exists( $dest_path ) ) {
        $avatar[‘url’] = str_replace( $upload_dir[‘basedir’], $upload_dir[‘baseurl’], $dest_path );
        $avatar[‘skip’] = true;
    } else {
        // Retrieves a WP_Image_Editor instance and loads a file into it.
        $image = wp_get_image_editor( $filename );
 
        if ( ! is_wp_error( $image ) ) {
            // Resizes current image.
            $image->resize( $size, $size, true );
 
            // Saves current image to file.
            $image->save( $dest_path );
 
            $avatar[‘url’] = str_replace( $upload_dir[‘basedir’], $upload_dir[‘baseurl’], $dest_path );
            $avatar[‘skip’] = false;
        }
    }
 
    // Calls the functions added to avatar_manager_avatar_resize action hook.
    do_action( ‘avatar_manager_avatar_resize’, $url, $size );
 
    return $avatar;
}

Резюме

  • Функция avatar_manager_avatar_resize() создает копию указанного изображения аватара с avatar_manager_avatar_resize() .
  • wp_upload_dir() возвращает массив, содержащий информацию о пути в текущем настроенном каталоге загрузок.
  • Функция str_replace() заменяет все вхождения строки поиска строкой замены.
  • Функция pathinfo() возвращает информацию о пути к файлу.
  • Функция wp_basename() — это дружественная к i18n версия basename() которая возвращает конечный компонент имени пути.
  • Функция file_exists() проверяет, существует ли файл или каталог.
  • Флаг skip устанавливается в значение true если целевой файл изображения уже существует, в противном случае создается новое изображение.
  • Функция wp_get_image_editor() возвращает экземпляр WP_Image_Editor и загружает в него файл. При этом мы можем манипулировать изображением, вызывая методы для него.
  • Функция is_wp_error() проверяет, является ли переданная переменная ошибкой WordPress.
  • Затем мы изменяем размеры и сохраняем изображение, вызывая методы resize() и save() объекта $image .
  • do_action() выполняет хук, созданный add_action() ; это позволяет темам и плагинам подключаться к действию avatar_manager_avatar_resize которое запускается после изменения размера изображения аватара.

Прежде чем заботиться об обновлениях профиля, нам нужно определить еще одну функцию:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/**
 * Deletes an avatar image based on attachment ID.
 *
 * @uses get_post_meta() For retrieving attachment meta fields.
 * @uses wp_upload_dir() For retrieving path information on the currently
 * configured uploads directory.
 * @uses delete_post_meta() For deleting attachment meta fields.
 * @uses get_users() For retrieving an array of users.
 * @uses delete_user_meta() For deleting user meta fields.
 * @uses do_action() For calling the functions added to an action hook.
 *
 * @since Avatar Manager 1.0.0
 *
 * @param int $attachment_id An attachment ID
 */
function avatar_manager_delete_avatar( $attachment_id ) {
    // Retrieves attachment meta field based on attachment ID.
    $is_custom_avatar = get_post_meta( $attachment_id, ‘_avatar_manager_is_custom_avatar’, true );
 
    if ( ! $is_custom_avatar )
        return;
 
    // Retrieves path information on the currently configured uploads directory.
    $upload_dir = wp_upload_dir();
 
    // Retrieves attachment meta field based on attachment ID.
    $custom_avatar = get_post_meta( $attachment_id, ‘_avatar_manager_custom_avatar’, true );
 
    if ( is_array( $custom_avatar ) ) {
        foreach ( $custom_avatar as $file ) {
            if ( ! $file[‘skip’] ) {
                $file = str_replace( $upload_dir[‘baseurl’], $upload_dir[‘basedir’], $file[‘url’] );
                @unlink( $file );
            }
        }
    }
 
    // Deletes attachment meta fields based on attachment ID.
    delete_post_meta( $attachment_id, ‘_avatar_manager_custom_avatar’ );
    delete_post_meta( $attachment_id, ‘_avatar_manager_custom_avatar_rating’ );
    delete_post_meta( $attachment_id, ‘_avatar_manager_is_custom_avatar’ );
 
    // An associative array with criteria to match.
    $args = array(
        ‘meta_key’ => ‘avatar_manager_custom_avatar’,
        ‘meta_value’ => $attachment_id
    );
 
    // Retrieves an array of users matching the criteria given in $args.
    $users = get_users( $args );
 
    foreach ( $users as $user ) {
        // Deletes user meta fields based on user ID.
        delete_user_meta( $user->ID, ‘avatar_manager_avatar_type’ );
        delete_user_meta( $user->ID, ‘avatar_manager_custom_avatar’ );
    }
 
    // Calls the functions added to avatar_manager_delete_avatar action hook.
    do_action( ‘avatar_manager_delete_avatar’, $attachment_id );
}
 
add_action( ‘delete_attachment’, ‘avatar_manager_delete_avatar’ );

Резюме

  • delete_attachment действия delete_attachment вызывается, когда вложение удаляется с помощью wp_delete_attachment() .
  • get_post_meta() возвращает значения пользовательских полей с указанным ключом из указанного поста. Сначала мы проверяем, является ли вложение с указанным идентификатором изображением аватара.
  • is_array() определяет, является ли переменная массивом.
  • Затем мы используем функцию unlink() для удаления изображения аватара, включая его копии с измененным размером, но пропускаем их с установленным в true флагом skip .
  • Функция delete_post_meta() удаляет все настраиваемые поля с указанным ключом из указанного поста.
  • Функция get_users() извлекает массив пользователей, соответствующих критериям, указанным в $args .
  • Функция delete_user_meta() удаляет критерии соответствия метаданных у пользователя.
  • Наконец, мы выполняем avatar_manager_delete_avatar действия avatar_manager_delete_avatar .

При обновлении профиля пользователя нам нужно не только сохранять параметры, измененные пользователем, но и обрабатывать загрузки и удаления аватаров. Давай сделаем это:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/**
 * Updates user profile based on user ID.
 *
 * @uses avatar_manager_get_options() For retrieving plugin options.
 * @uses sanitize_text_field() For sanitizing a string from user input or from
 * the database.
 * @uses update_user_meta() For updating user meta fields.
 * @uses get_user_meta() For retrieving user meta fields.
 * @uses update_post_meta() For updating attachment meta fields.
 * @uses wp_handle_upload() For handling PHP uploads in WordPress.
 * @uses wp_die() For killing WordPress execution and displaying HTML error
 * message.
 * @uses __() For retrieving the translated string from the translate().
 * @uses avatar_manager_delete_avatar() For deleting an avatar image.
 * @uses wp_insert_attachment() For inserting an attachment into the media
 * library.
 * @uses wp_generate_attachment_metadata() For generating metadata for an
 * attachment.
 * @uses wp_update_attachment_metadata() For updating metadata for an
 * attachment.
 * @uses avatar_manager_avatar_resize() For generating a resized copy of the
 * specified avatar image.
 * @uses avatar_manager_delete_avatar() For deleting an avatar image based on
 * attachment ID.
 * @uses get_edit_user_link() For getting the link to the users edit profile
 * page in the WordPress admin.
 * @uses add_query_arg() For retrieving a modified URL (with) query string.
 * @uses wp_redirect() For redirecting the user to a specified absolute URI.
 *
 * @since Avatar Manager 1.0.0
 *
 * @param int $user_id User to update.
 */
function avatar_manager_edit_user_profile_update( $user_id ) {
    // Retrieves plugin options.
    $options = avatar_manager_get_options();
 
    // Sanitizes the string from user input.
    $avatar_type = isset( $_POST[‘avatar_manager_avatar_type’] ) ?
 
    // Updates user meta field based on user ID.
    update_user_meta( $user_id, ‘avatar_manager_avatar_type’, $avatar_type );
 
    // Retrieves user meta field based on user ID.
    $custom_avatar = get_user_meta( $user_id, ‘avatar_manager_custom_avatar’, true );
 
    if ( ! empty( $custom_avatar ) ) {
        // Sanitizes the string from user input.
        $custom_avatar_rating = isset( $_POST[‘avatar_manager_custom_avatar_rating’] ) ?
 
        // Updates attachment meta field based on attachment ID.
        update_post_meta( $custom_avatar, ‘_avatar_manager_custom_avatar_rating’, $custom_avatar_rating );
    }
 
    …
}
 
add_action( ‘edit_user_profile_update’, ‘avatar_manager_edit_user_profile_update’ );
add_action( ‘personal_options_update’, ‘avatar_manager_edit_user_profile_update’ );

Резюме

  • Действия edit_user_profile_update и personal_options_update обычно используются для сохранения пользовательских полей, которые были добавлены на страницу профиля WordPress.
  • Функция sanitize_text_field() очищает строку из пользовательского ввода или из базы данных.
  • Функция update_user_meta() обновляет мета-поле пользователя на основе идентификатора пользователя, в то время как get_user_meta() извлекает одно мета-поле или все поля мета-данных пользователя для данного пользователя.
  • Функция update_post_meta() обновляет значение существующего мета-ключа (настраиваемое поле) для указанного сообщения.

Для обработки загрузки аватаров напишите следующий код:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
if ( isset( $_POST[‘avatar-manager-upload-avatar’] ) && $_POST[‘avatar-manager-upload-avatar’] ) {
    if ( ! function_exists( ‘wp_handle_upload’ ) )
        require_once( ABSPATH . ‘wp-admin/includes/file.php’ );
 
    // An associative array with allowed MIME types.
    $mimes = array(
        ‘bmp’ => ‘image/bmp’,
        ‘gif’ => ‘image/gif’,
        ‘jpe’ => ‘image/jpeg’,
        ‘jpeg’ => ‘image/jpeg’,
        ‘jpg’ => ‘image/jpeg’,
        ‘png’ => ‘image/png’,
        ‘tif’ => ‘image/tiff’,
        ‘tiff’ => ‘image/tiff’
    );
 
    // An associative array to override default variables.
    $overrides = array(
        ‘mimes’ => $mimes,
        ‘test_form’ => false
    );
 
    // Handles PHP uploads in WordPress.
    $avatar = wp_handle_upload( $_FILES[‘avatar_manager_import’], $overrides );
 
    if ( isset( $avatar[‘error’] ) )
        // Kills WordPress execution and displays HTML error message.
        wp_die( $avatar[‘error’], __( ‘Image Upload Error’, ‘avatar-manager’ ) );
 
    if ( ! empty( $custom_avatar ) )
        // Deletes users old avatar image.
        avatar_manager_delete_avatar( $custom_avatar );
 
    // An associative array about the attachment.
    $attachment = array(
        ‘guid’ => $avatar[‘url’],
        ‘post_content’ => $avatar[‘url’],
        ‘post_mime_type’ => $avatar[‘type’],
        ‘post_title’ => basename( $avatar[‘file’] )
    );
 
    // Inserts the attachment into the media library.
    $attachment_id = wp_insert_attachment( $attachment, $avatar[‘file’] );
 
    // Generates metadata for the attachment.
    $attachment_metadata = wp_generate_attachment_metadata( $attachment_id, $avatar[‘file’] );
 
    // Updates metadata for the attachment.
    wp_update_attachment_metadata( $attachment_id, $attachment_metadata );
 
    $custom_avatar = array();
 
    // Generates a resized copy of the avatar image.
    $custom_avatar[ $options[‘default_size’] ] = avatar_manager_avatar_resize( $avatar[‘url’], $options[‘default_size’] );
 
    // Updates attachment meta fields based on attachment ID.
    update_post_meta( $attachment_id, ‘_avatar_manager_custom_avatar’, $custom_avatar );
    update_post_meta( $attachment_id, ‘_avatar_manager_custom_avatar_rating’, ‘G’ );
    update_post_meta( $attachment_id, ‘_avatar_manager_is_custom_avatar’, true );
 
    // Updates user meta fields based on user ID.
    update_user_meta( $user_id, ‘avatar_manager_avatar_type’, ‘custom’ );
    update_user_meta( $user_id, ‘avatar_manager_custom_avatar’, $attachment_id );
}

Резюме

  • Функция function_exists() возвращает true если заданная функция была определена, затем оператор require_once() проверяет, был ли указанный файл уже включен, и, если это так, не включает его снова.
  • Функция wp_handle_upload() обрабатывает загрузки PHP в WordPress, очищает имена файлов, проверяет расширения для типа mime и перемещает файл в соответствующий каталог в каталоге загрузки.
  • Перед добавлением нового изображения аватара мы вызываем avatar_manager_delete_avatar() чтобы удалить старый аватар, если он установлен.
  • Функция wp_insert_attachment() вставляет вложение в медиа-библиотеку.
  • Функция wp_generate_attachment_metadata() генерирует метаданные для вложения изображения; он также создает миниатюру и другие промежуточные размеры вложения изображения на основе размеров, определенных на Settings Media Screen .
  • Функция wp_update_attachment_metadata() обновляет метаданные для вложения.
  • Затем мы вызываем avatar_manager_avatar_resize() для создания копии изображения аватара с размером по умолчанию.
  • Наконец, мы обновляем метаданные для вложения и для редактируемого пользователя.

Теперь пришло время сделать плагин для фактического удаления изображения аватара по запросу:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
if ( isset( $_GET[‘avatar_manager_action’] ) && $_GET[‘avatar_manager_action’] ) {
    global $wp_http_referer;
 
    $action = $_GET[‘avatar_manager_action’];
 
    switch ( $action ) {
        case ‘remove-avatar’:
            // Deletes avatar image based on attachment ID.
            avatar_manager_delete_avatar( $_GET[‘avatar_manager_custom_avatar’] );
 
            break;
    }
 
    // Gets the link to the users edit profile page in the WordPress admin.
    $edit_user_link = get_edit_user_link( $user_id );
 
    // Retrieves a modified URL (with) query string.
    $redirect = add_query_arg( ‘updated’, true, $edit_user_link );
 
    if ( $wp_http_referer )
        // Retrieves a modified URL (with) query string.
        $redirect = add_query_arg( ‘wp_http_referer’, urlencode( $wp_http_referer ), $redirect );
 
    // Redirects the user to a specified absolute URI.
    wp_redirect( $redirect );
 
    exit;
}

Резюме

  • Если значение запрашиваемого действия — remove-avatar мы вызываем avatar_manager_delete_avatar() чтобы удалить указанное изображение аватара.
  • Функция get_edit_user_link() получает ссылку на страницу редактирования профиля пользователя в админке WordPress.
  • Функция urlencode() кодирует строку, которая будет использоваться в части запроса URL-адреса.
  • В конце функции мы вызываем wp_redirect() чтобы перенаправить пользователя обратно в обновленный профиль пользователя.
  • exit вызов завершает выполнение скрипта; это языковая конструкция, и ее можно вызывать без скобок, если status не передан.

Далее мы напишем вспомогательную функцию для извлечения пользовательского изображения аватара:

001
002
003
004
005
006
007
008
009
010
011
012
013
014
+015
016
+017
018
019
020
021
022
023
024
025
026
027
028
029
+030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
+055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/**
 * Returns user custom avatar based on user ID.
 *
 * @uses get_option() For getting values for a named option.
 * @uses avatar_manager_get_options() For retrieving plugin options.
 * @uses get_userdata() For retrieving user data by user ID.
 * @uses is_ssl() For checking if SSL is being used.
 * @uses add_query_arg() For retrieving a modified URL (with) query string.
 * @uses esc_attr() For escaping HTML attributes.
 * @uses get_user_meta() For retrieving user meta fields.
 * @uses get_post_meta() For retrieving attachment meta fields.
 * @uses wp_get_attachment_image_src() For retrieving an array with the image
 * attributes «url», «width» and «height», of an image attachment file.
 * @uses avatar_manager_avatar_resize() For generating a resized copy of the
 * specified avatar image.
 * @uses update_post_meta() For updating attachment meta fields.
 * @uses apply_filters() For calling the functions added to a filter hook.
 *
 * @since Avatar Manager 1.0.0
 *
 * @param int $user_id User to update.
 * @param int $size Size of the avatar image
 * @param string $default URL to a default image to use if no avatar is
 * available.
 * @param string $alt Alternative text to use in image tag.
 * @return string <img> tag for the user’s avatar.
 */
function avatar_manager_get_custom_avatar( $user_id, $size = », $default = », $alt = false ) {
    // Returns if showing avatars is not enabled.
    if ( ! get_option( ‘show_avatars’ ) )
        return false;
 
    // Retrieves plugin options.
    $options = avatar_manager_get_options();
 
    if ( empty( $size ) || ! is_numeric( $size ) ) {
        $size = $options[‘avatar-manager-default-size’];
    } else {
        $size = absint( $size );
 
        if ( $size < 1 )
            $size = 1;
        elseif ( $size > 512 )
            $size = 512;
    }
 
    // Retrieves user data by user ID.
    $user = get_userdata( $user_id );
 
    // Returns if no user data was retrieved.
    if ( empty( $user ) )
        return false;
 
    $email = $user->user_email;
 
    if ( empty( $default ) ) {
        // Retrieves values for the named option.
        $avatar_default = get_option( ‘avatar_default’ );
 
        if ( empty( $avatar_default ) )
            $default = ‘mystery’;
        else
            $default = $avatar_default;
    }
 
    $email_hash = md5( strtolower( trim( $email ) ) );
 
    if ( is_ssl() )
        $host = ‘https://secure.gravatar.com’;
    else
        $host = sprintf( ‘http://%d.gravatar.com’, ( hexdec( $email_hash[0] ) % 2 ) );
 
    if ( $default == ‘mystery’ )
        $default = $host .
    elseif ( $default == ‘gravatar_default’ )
        $default = »;
    elseif ( strpos( $default, ‘http://’ ) === 0 )
        // Retrieves a modified URL (with) query string.
        $default = add_query_arg( ‘s’, $size, $default );
 
    if ( $alt === false )
        $alt = »;
    else
        // Escapes HTML attributes.
        $alt = esc_attr( $alt );
 
    // Retrieves values for the named option.
    $avatar_rating = get_option( ‘avatar_rating’ );
 
    // Retrieves user meta field based on user ID.
    $custom_avatar = get_user_meta( $user_id, ‘avatar_manager_custom_avatar’, true );
 
    // Returns if no attachment ID was retrieved.
    if ( empty( $custom_avatar ) )
        return false;
 
    // Retrieves attachment meta field based on attachment ID.
    $custom_avatar_rating = get_post_meta( $custom_avatar, ‘_avatar_manager_custom_avatar_rating’, true );
 
    $ratings[‘G’] = 1;
    $ratings[‘PG’] = 2;
    $ratings[‘R’] = 3;
    $ratings[‘X’] = 4;
 
    if ( $ratings[ $custom_avatar_rating ] <= $ratings[ $avatar_rating ] ) {
        // Retrieves attachment meta field based on attachment ID.
        $avatar = get_post_meta( $custom_avatar, ‘_avatar_manager_custom_avatar’, true );
 
        if ( empty( $avatar[ $size ] ) ) {
            // Retrieves an array with the image attributes «url», «width»
            // and «height», of the image attachment file.
            $url = wp_get_attachment_image_src( $custom_avatar, ‘full’ );
 
            // Generates a resized copy of the avatar image.
            $avatar[ $size ] = avatar_manager_avatar_resize( $url[0], $size );
 
            // Updates attachment meta field based on attachment ID.
            update_post_meta( $custom_avatar, ‘_avatar_manager_custom_avatar’, $avatar );
        }
 
        $src = $avatar[ $size ][‘url’];
        $avatar = ‘<img alt=»‘ . $alt . ‘» class=»avatar avatar-‘ . $size . ‘ photo avatar-default» height=»‘ . $size . ‘» src=»‘ . $src . ‘» width=»‘ . $size . ‘»>’;
    } else {
        $src = $host .
        $src .= $email_hash;
        $src .= ‘?s=’ .
        $src .= ‘&d=’ .
        $src .= ‘&forcedefault=1’;
 
        $avatar = ‘<img alt=»‘ . $alt . ‘» class=»avatar avatar-‘ . $size . ‘ photo avatar-default» height=»‘ . $size . ‘» src=»‘ . $src . ‘» width=»‘ . $size . ‘»>’;
    }
 
    // Calls the functions added to avatar_manager_get_custom_avatar
    // filter hook.
    return apply_filters( ‘avatar_manager_get_custom_avatar’, $avatar, $user_id, $size, $default, $alt );
}

Резюме

  • Функция avatar_manager_get_custom_avatar возвращает пользовательское изображение аватара на основе идентификатора пользователя или значение false если отображение аватаров не включено. Функция извлекает параметры плагина, очищает параметр $size и экранирует атрибуты HTML из переменной $alt .
  • Затем он получает изображение по умолчанию для использования вместо изображения аватара, если рейтинг аватара не совпадает. Копия изображения аватара с измененным размером создается по запросу, если запрошенный размер не соответствует существующему файлу изображения.
  • Функция get_userdata() возвращает объект WP_User с информацией, относящейся к пользователю, чей ID передается ему.
  • Функция md5() возвращает хеш MD5 для предоставленной строки.
  • Функция strtolower() возвращает предоставленную строку, но со всеми буквенными символами, преобразованными в нижний регистр.
  • is_ssl() проверяет, используется ли SSL.
  • Функция sprintf() возвращает отформатированную строку.
  • Функция hexdec() возвращает десятичный эквивалент указанного шестнадцатеричного числа.
  • Вызов strpos() находит числовую позицию первого вхождения needle в строке haystack .
  • Функция wp_get_attachment_image_src() возвращает массив с атрибутами изображения url , width и height файла вложения изображения.
  • Наконец, мы используем apply_filters() для вызова функций, добавленных в avatar_manager_get_custom_avatar фильтра avatar_manager_get_custom_avatar .

По сути, следующая функция является основной функцией нашего плагина:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/**
 * Returns the avatar for a user who provided a user ID or email address.
 *
 * @uses get_option() For getting values for a named option.
 * @uses avatar_manager_get_options() For retrieving plugin options.
 * @uses get_userdata() For retrieving user data by user ID.
 * @uses avatar_manager_get_custom_avatar() For retrieving user custom avatar
 * based on user ID.
 * @uses apply_filters() For calling the functions added to a filter hook.
 *
 * @since Avatar Manager 1.0.0
 *
 * @param int|string|object $id_or_email A user ID, email address, or comment
 * object.
 * @param int $size Size of the avatar image
 * @param string $default URL to a default image to use if no avatar is
 * available.
 * @param string $alt Alternative text to use in image tag.
 * @return string <img> tag for the user’s avatar.
 */
function avatar_manager_get_avatar( $avatar = », $id_or_email, $size = », $default = », $alt = false ) {
    // Returns if showing avatars is not enabled.
    if ( ! get_option( ‘show_avatars’ ) )
        return false;
 
    // Retrieves plugin options.
    $options = avatar_manager_get_options();
 
    if ( empty( $size ) || ! is_numeric( $size ) ) {
        $size = $options[‘avatar-manager-default-size’];
    } else {
        $size = absint( $size );
 
        if ( $size < 1 )
            $size = 1;
        elseif ( $size > 512 )
            $size = 512;
    }
 
    $email = »;
 
    if ( is_numeric( $id_or_email ) ) {
        $id = (int) $id_or_email;
 
        // Retrieves user data by user ID.
        $user = get_userdata( $id );
 
        if ( $user )
            $email = $user->user_email;
    } elseif ( is_object( $id_or_email ) ) {
        if ( ! empty( $id_or_email->user_id ) ) {
            $id = (int) $id_or_email->user_id;
 
            // Retrieves user data by user ID.
            $user = get_userdata( $id );
 
            if ( $user )
                $email = $user->user_email;
        } elseif ( ! empty( $id_or_email->comment_author_email ) ) {
            $email = $id_or_email->comment_author_email;
        }
    } else {
        $email = $id_or_email;
 
        if ( $id = email_exists( $email ) )
            // Retrieves user data by user ID.
            $user = get_userdata( $id );
    }
 
    if ( isset( $user ) )
        $avatar_type = $user->avatar_manager_avatar_type;
    else
        return $avatar;
 
    if ( $avatar_type == ‘custom’ )
        // Retrieves user custom avatar based on user ID.
        $avatar = avatar_manager_get_custom_avatar( $user->ID, $size, $default, $alt );
 
    // Calls the functions added to avatar_manager_get_avatar filter hook.
    return apply_filters( ‘avatar_manager_get_avatar’, $avatar, $id_or_email, $size, $default, $alt );
}
 
add_filter( ‘get_avatar’, ‘avatar_manager_get_avatar’, 10, 5 );

Резюме

  • Функция avatar_manager_get_avatar() возвращает аватар для пользователя, предоставившего идентификатор пользователя или адрес электронной почты, или значение false, если отображение аватаров не включено.
  • Мы используем фильтр get_avatar чтобы изменить выходные get_avatar() функции get_avatar() . Наша функция извлекает параметры плагина, дезинфицирует параметр $size и находит идентификатор указанного пользователя.
  • Затем он возвращает результат avatar_manager_get_custom_avatar() функции avatar_manager_get_custom_avatar() или неизмененный вывод get_avatar() если пользователь не использует собственный аватар.
  • is_object() определяет, является ли переменная объектом.
  • Функция email_exists() проверяет, был ли данный адрес электронной почты уже зарегистрирован для имени пользователя, и возвращает этот идентификатор пользователя, или false, если таковой не существует.

Чтобы проверить результат, перейдите на Пользователи -> Ваш профиль .

Параметры подключаемого модуля Менеджер аватаров на экране «Ваш профиль пользователя»
Параметры подключаемого модуля Avatar Manager на экране «Ваш профиль пользователя»

Найдите изображение и загрузите его. Теперь вы сможете выбирать между использованием Gravatar или пользовательским изображением аватара, которое вы только что загрузили.


Если вы перейдете на экран обсуждений настроек, вы заметите, что аватары из настроек аватара по умолчанию заменяются вашими собственными аватарами. Чтобы исправить эту проблему, мы восстановим аватары по умолчанию, удалив нашу пользовательскую функцию, когда она не нужна, с помощью avatar_defaults фильтра avatar_defaults . Для этого добавьте следующий код:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
/**
 * Prevents custom avatars from being applied to the Default Avatar setting.
 *
 * @uses remove_filter() For removing a function attached to a specified action
 * hook.
 *
 * @since Avatar Manager 1.0.0
 *
 * @param array $avatar_defaults An associative array with default avatars.
 * @return array An associative array with default avatars.
 */
function avatar_manager_avatar_defaults( $avatar_defaults ) {
    // Removes the avatar_manager_get_avatar function attached to get_avatar
    // action hook.
    remove_filter( ‘get_avatar’, ‘avatar_manager_get_avatar’ );
 
    return $avatar_defaults;
}
 
add_filter( ‘avatar_defaults’, ‘avatar_manager_avatar_defaults’, 10, 1 );

Чтобы предотвратить применение пользовательских аватаров к настройке аватара по умолчанию, мы вызываем remove_filter() . Удаляет функцию, прикрепленную к указанному фильтру. Этот метод может использоваться для удаления функций по умолчанию, прикрепленных к конкретному фильтру, и, возможно, замены их на замену.


Экран библиотеки мультимедиа позволяет редактировать, просматривать и удалять изображения, видео, записи и файлы, ранее загруженные в ваш блог. Чтобы определить вложение, используемое в качестве изображения аватара, мы собираемся отобразить для него пользовательское состояние мультимедиа

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
 * Displays media states for avatar images.
 *
 * @uses get_post_meta() For retrieving attachment meta fields.
 * @uses __() For retrieving the translated string from the translate().
 * @uses apply_filters() For calling the functions added to a filter hook.
 *
 * @since Avatar Manager 1.0.0
 *
 * @param array $media_states An associative array with media states.
 * @return array An associative array with media states.
 */
function avatar_manager_display_media_states( $media_states ) {
    global $post;
 
    // Retrieves attachment meta field based on attachment ID.
    $meta_avatar = get_post_meta( $post->ID, ‘_avatar_manager_is_custom_avatar’, true );
 
    if ( ! empty( $meta_avatar ) )
        $media_states[] = __( ‘Avatar Image’, ‘avatar-manager’ );
 
    // Calls the functions added to avatar_manager_display_media_states filter
    // hook.
    return apply_filters( ‘avatar_manager_display_media_states’, $media_states );
}
 
add_filter( ‘display_media_states’, ‘avatar_manager_display_media_states’, 10, 1 );

Фильтр display_media_states используется для отображения пользовательских состояний мультимедиа для вложения, которые были добавлены в библиотеку мультимедиа . Мы используем глобальную переменную $post чтобы получить идентификатор текущего вложения. Если настраиваемое поле _avatar_manager_is_custom_avatar не пустое, вложение является изображением аватара, поэтому мы добавляем для него пользовательское состояние мультимедиа.

Если у вас нет настроенного изображения аватара, загрузите его и перейдите на экран библиотеки мультимедиа .

Медиа-статус плагина Avatar Manager под экраном библиотеки мультимедиа
Медиа- статус плагина Avatar Manager под экраном библиотеки мультимедиа

Обратите внимание, что к каждому вложению, используемому в качестве пользовательского изображения аватара, рядом с его именем файла добавляется строка изображения аватара .


Чтобы обработать процесс удаления, плагин должен создать файл с именем uninstall.php в каталоге базовых плагинов, а не с помощью register_uninstall_hook() . Этот файл будет вызываться, если он существует, во время процесса удаления, минуя ловушку удаления. Для этого откройте avatar-manager / uninstall.php и добавьте следующий код:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
/**
 * @package Avatar_Manager
 * @subpackage Uninstaller
 */
 
// Exits if uninstall is not called from WordPress.
if ( ! defined( ‘WP_UNINSTALL_PLUGIN’ ) )
    exit;
 
if ( ! function_exists( ‘avatar_manager_delete_avatar’ ) )
    include_once( ‘avatar-manager.php’ );
 
// Deletes plugin options.
delete_option( ‘avatar_manager’ );
 
// An associative array with criteria to match.
$args = array(
    ‘meta_key’ => ‘avatar_manager_custom_avatar’
);
 
// Retrieves an array of users matching the criteria given in $args.
$users = get_users( $args );
 
foreach ( $users as $user ) {
    // Deletes avatar image based on attachment ID.
    avatar_manager_delete_avatar( $user->avatar_manager_custom_avatar );
}
?>

При использовании WP_UNINSTALL_PLUGIN плагин должен всегда проверять константу WP_UNINSTALL_PLUGIN перед выполнением. Константа WP_UNINSTALL_PLUGIN определяется WordPress во время выполнения во время удаления плагина и не будет присутствовать, если uninstall.php запрашивается напрямую. defined() проверяет, существует ли данная именованная константа. Оператор include_once включает и оценивает указанный файл во время выполнения скрипта; если код из файла уже был включен, он не будет включен снова. Функция delete_option() удаляет именованную опцию из таблицы базы данных опций.


После того, как вы запрограммируете свой плагин, еще один вопрос — интернационализация . Интернационализация, часто сокращенно i18n, — это процесс настройки программного обеспечения, чтобы его можно было локализовать ; локализация или l10n — это процесс перевода текста, отображаемого программным обеспечением, на разные языки. WordPress использует библиотеки и инструменты gettext для i18n.

Настоятельно рекомендуется интернационализировать свой плагин, чтобы пользователи из разных стран могли его локализовать.

Чтобы сделать строку переводимой, нужно просто обернуть оригинальную строку в вызов функции __() . Если ваш код должен отображать строку в браузере, используйте функцию _e() . Как вы могли заметить, мы уже сделали это в нашем плагине.

Текстовый домен — это уникальный идентификатор, который позволяет WordPress различать все загруженные переводы. Использование базового имени вашего плагина всегда хороший выбор. Вы можете загрузить переведенные строки плагина, вызвав load_plugin_textdomain() , что мы уже сделали в первой части нашего урока.

Теперь нам нужно сделать .po файл для переводчиков. Для этого мы будем использовать программное обеспечение для перевода Poedit . Как только вы загрузили его, нажмите Файл -> Новый каталог …, чтобы настроить новый каталог. Новое окно должно открыться. Перейдите на вкладку Информация о проекте и введите Avatar Manager в качестве имени проекта.

Вкладка с информацией о проекте Poedits в окне настроек
Вкладка информации о проекте Poedit под окном настроек

На вкладке Пути оставим базовый путь как . который относится к каталогу, в котором находится каталог.

Вкладка Poedits Paths под окном настроек
Вкладка Пути Poedit под окном Настройки

Далее перейдите на вкладку Ключевые слова . Удалите все элементы и добавьте следующие ключевые слова: __ , _e , _n и _x .

Вкладка «Ключевые слова» в окне «Настройки»
Вкладка « Ключевые слова » Poedit в окне « Настройки»

Нажмите ОК и сохраните файл как avatar-manager / languages ​​/ avatar-manager-default.po . Теперь файл готов к переводу.

Главное окно
Главное окно Poedit

Переведите все нужные вам строки и сохраните файл как avatar-manager / languages ​​/ avatar-manager- {locale} .po . Локаль — это код языка и / или код страны, который вы определили в константе WPLANG в файле wp-config.php .

Файл .mo — это двоичный файл, который содержит все исходные строки и их переводы в формате, подходящем для быстрого извлечения перевода. Преобразование выполняется автоматически, если вы идете в « Правка» -> «Настройки» -> «Редактор» и отмечаете « Автоматически компилировать .mo файл при сохранении»


В этом разделе рассматриваются шаги по созданию созданного вами плагина и его широкому распространению.

Самый быстрый, простой и лучший способ получить ваш плагин — это загрузить его в каталог плагинов WordPress . Для получения более подробной информации о том, как отправить плагин, см. Страницу about или перейдите прямо к plugin submission page .

Чтобы отправить и рекламировать свой плагин в сообществе WordPress, сначала создайте страницу для плагина на своем сайте с полными и хорошо написанными инструкциями . Включите ссылку на эту страницу объяснения в заголовке плагина, чтобы люди могли легко проверять наличие обновлений, дополнительную информацию и помощь.

Если вы решите отправить свой плагин в каталог плагинов WordPress , также сделайте эту информацию как можно более понятной, чтобы они могли классифицировать и помогать другим понять использование вашего плагина. Вам также необходимо создать файл readme.txt в стандартном формате и включить его в свой плагин.


Это закрывает наш учебник; Теперь у нас есть полностью работающий плагин и мы изучили некоторые практические советы и рекомендации по разработке плагина WordPress. Идея этого плагина возникла как функция, запрошенная в ядре WordPress; Я хотел бы услышать ваши мысли об этом. Улучшает ли это текущий рабочий процесс? Считаете ли вы подобный подход полезным, но для управления изображениями Gravatar прямо с экрана вашего профиля?

В качестве бонуса плагин Avatar Manager также доступен в каталоге плагинов WordPress и на GitHub . Проверьте это, чтобы оставаться в курсе последних выпусков. Спасибо за прочтение!