Cara Membuat Plugin Manajemen Avatar WordPress: Sentuhan Akhir
() translation by (you can also view the original English article)
Avatar Manager untuk WordPress adalah plugin yang manis dan sederhana untuk menyimpan avatar secara lokal dan banyak lagi. Dengan mudah.
Tingkatkan situs WordPress Anda dengan memungkinkan pengguna memilih antara menggunakan Gravatar atau gambar avatar yang dihosting sendiri langsung dari layar profil mereka. Alur kerja yang ditingkatkan, pembuatan gambar on-demand dan izin pengguna khusus di bawah antarmuka asli. Ucapkan salam ke plugin Avatar Manager.
Rekap Cepat
Pada bagian pertama dari tutorial, kita meninjau:
- Apa itu WordPress plugin;
- cara membuat plugin WordPress dasar, pilih lisensi dan format yang sesuai untuk nomor versi;
- apa itu action dan filter hooks dan bagaimana menggunakannya untuk membuat plugin;
- cara menambahkan pengaturan baru ke layar pengaturan yang ada;
- cara membuat plugin lebih fleksibel dengan menggunakan opsi khusus.
Hari ini, kita akan mengambil langkah lebih jauh dan menyelesaikan plugin: kita akan menangani unggahan avatar dan pembuatan gambar sesuai permintaan, menginternasionalisasikan plugin, dan banyak lagi.
Langkah 1. Mengubah Ukuran Gambar Avatar
Mari kita mulai dengan menulis fungsi berikut:
1 |
/**
|
2 |
* Generates a resized copy of the specified avatar image.
|
3 |
*
|
4 |
* @uses wp_upload_dir() For retrieving path information on the currently
|
5 |
* configured uploads directory.
|
6 |
* @uses wp_basename() For i18n friendly version of basename().
|
7 |
* @uses wp_get_image_editor() For retrieving a WP_Image_Editor instance and
|
8 |
* loading a file into it.
|
9 |
* @uses is_wp_error() For checking whether the passed variable is a WordPress
|
10 |
* Error.
|
11 |
* @uses do_action() For calling the functions added to an action hook.
|
12 |
*
|
13 |
* @since Avatar Manager 1.0.0
|
14 |
*
|
15 |
* @param string $url URL of the avatar image to resize.
|
16 |
* @param int $size Size of the new avatar image.
|
17 |
* @return array Array with the URL of the new avatar image.
|
18 |
*/
|
19 |
function avatar_manager_avatar_resize( $url, $size ) { |
20 |
// Retrieves path information on the currently configured uploads directory.
|
21 |
$upload_dir = wp_upload_dir(); |
22 |
|
23 |
$filename = str_replace( $upload_dir['baseurl'], $upload_dir['basedir'], $url ); |
24 |
$pathinfo = pathinfo( $filename ); |
25 |
$dirname = $pathinfo['dirname']; |
26 |
$extension = $pathinfo['extension']; |
27 |
|
28 |
// i18n friendly version of basename().
|
29 |
$basename = wp_basename( $filename, '.' . $extension ); |
30 |
|
31 |
$suffix = $size . 'x' . $size; |
32 |
$dest_path = $dirname . '/' . $basename . '-' . $suffix . '.' . $extension; |
33 |
$avatar = array(); |
34 |
|
35 |
if ( file_exists( $dest_path ) ) { |
36 |
$avatar['url'] = str_replace( $upload_dir['basedir'], $upload_dir['baseurl'], $dest_path ); |
37 |
$avatar['skip'] = true; |
38 |
} else { |
39 |
// Retrieves a WP_Image_Editor instance and loads a file into it.
|
40 |
$image = wp_get_image_editor( $filename ); |
41 |
|
42 |
if ( ! is_wp_error( $image ) ) { |
43 |
// Resizes current image.
|
44 |
$image->resize( $size, $size, true ); |
45 |
|
46 |
// Saves current image to file.
|
47 |
$image->save( $dest_path ); |
48 |
|
49 |
$avatar['url'] = str_replace( $upload_dir['basedir'], $upload_dir['baseurl'], $dest_path ); |
50 |
$avatar['skip'] = false; |
51 |
}
|
52 |
}
|
53 |
|
54 |
// Calls the functions added to avatar_manager_avatar_resize action hook.
|
55 |
do_action( 'avatar_manager_avatar_resize', $url, $size ); |
56 |
|
57 |
return $avatar; |
58 |
}
|
Ringkasan
- Fungsi
avatar_manager_avatar_resize()
menghasilkan salinan ukuran gambar avatar yang ditentukan. - Panggilan
wp_upload_dir()
mengembalikan larik yang berisi informasi jalur pada direktori unggahan yang saat ini dikonfigurasikan. - Fungsi
str_replace()
menggantikan semua kemunculan string pencarian dengan string pengganti. - Fungsi
pathinfo()
mengembalikan informasi tentang path file. - Fungsi
wp_basename()
adalah versi ramah iunn daribasename()
yang mengembalikan trailing name component dari sebuah path. - Fungsi
file_exists()
memeriksa apakah file atau direktori ada. - Bendera
skip
diatur ketrue
jika file gambar tujuan sudah ada, jika ada gambar baru yang dihasilkan. - Fungsi
wp_get_image_editor()
mengembalikan instanceWP_Image_Editor
dan memuat file ke dalamnya. Dengan itu kita dapat memanipulasi gambar dengan memanggil metode di atasnya. - Fungsi
is_wp_error()
memeriksa apakah variabel yang diteruskan adalah kesalahan WordPress. - Kemudian, kita mengubah ukuran dan menyimpan gambar dengan memanggil metode
resize()
dansave()
dari objek$image
. -
Do_action()
mengeksekusi hook yang dibuat olehadd_action()
; ini memungkinkan tema dan plugin untuk menghubungkan ke tindakanavatar_manager_avatar_resize
yang dipicu setelah mengubah ukuran gambar avatar.
Langkah 2. Menghapus Gambar Avatar
Sebelum mengurus pembaruan profil, kita perlu mendefinisikan satu fungsi lagi:
1 |
/**
|
2 |
* Deletes an avatar image based on attachment ID.
|
3 |
*
|
4 |
* @uses get_post_meta() For retrieving attachment meta fields.
|
5 |
* @uses wp_upload_dir() For retrieving path information on the currently
|
6 |
* configured uploads directory.
|
7 |
* @uses delete_post_meta() For deleting attachment meta fields.
|
8 |
* @uses get_users() For retrieving an array of users.
|
9 |
* @uses delete_user_meta() For deleting user meta fields.
|
10 |
* @uses do_action() For calling the functions added to an action hook.
|
11 |
*
|
12 |
* @since Avatar Manager 1.0.0
|
13 |
*
|
14 |
* @param int $attachment_id An attachment ID
|
15 |
*/
|
16 |
function avatar_manager_delete_avatar( $attachment_id ) { |
17 |
// Retrieves attachment meta field based on attachment ID.
|
18 |
$is_custom_avatar = get_post_meta( $attachment_id, '_avatar_manager_is_custom_avatar', true ); |
19 |
|
20 |
if ( ! $is_custom_avatar ) |
21 |
return; |
22 |
|
23 |
// Retrieves path information on the currently configured uploads directory.
|
24 |
$upload_dir = wp_upload_dir(); |
25 |
|
26 |
// Retrieves attachment meta field based on attachment ID.
|
27 |
$custom_avatar = get_post_meta( $attachment_id, '_avatar_manager_custom_avatar', true ); |
28 |
|
29 |
if ( is_array( $custom_avatar ) ) { |
30 |
foreach ( $custom_avatar as $file ) { |
31 |
if ( ! $file['skip'] ) { |
32 |
$file = str_replace( $upload_dir['baseurl'], $upload_dir['basedir'], $file['url'] ); |
33 |
@unlink( $file ); |
34 |
}
|
35 |
}
|
36 |
}
|
37 |
|
38 |
// Deletes attachment meta fields based on attachment ID.
|
39 |
delete_post_meta( $attachment_id, '_avatar_manager_custom_avatar' ); |
40 |
delete_post_meta( $attachment_id, '_avatar_manager_custom_avatar_rating' ); |
41 |
delete_post_meta( $attachment_id, '_avatar_manager_is_custom_avatar' ); |
42 |
|
43 |
// An associative array with criteria to match.
|
44 |
$args = array( |
45 |
'meta_key' => 'avatar_manager_custom_avatar', |
46 |
'meta_value' => $attachment_id |
47 |
);
|
48 |
|
49 |
// Retrieves an array of users matching the criteria given in $args.
|
50 |
$users = get_users( $args ); |
51 |
|
52 |
foreach ( $users as $user ) { |
53 |
// Deletes user meta fields based on user ID.
|
54 |
delete_user_meta( $user->ID, 'avatar_manager_avatar_type' ); |
55 |
delete_user_meta( $user->ID, 'avatar_manager_custom_avatar' ); |
56 |
}
|
57 |
|
58 |
// Calls the functions added to avatar_manager_delete_avatar action hook.
|
59 |
do_action( 'avatar_manager_delete_avatar', $attachment_id ); |
60 |
}
|
61 |
|
62 |
add_action( 'delete_attachment', 'avatar_manager_delete_avatar' ); |
Ringkasan
- Kaitan tindakan
delete_attachment
dipanggil saat lampiran dihapus olehwp_delete_attachment()
. - get_post_meta() mengembalikan nilai dari kolom kustom dengan kunci yang ditentukan dari posting yang ditentukan. Pertama, kita menguji apakah lampiran dengan ID yang ditentukan adalah gambar avatar.
- Panggilan
is_array()
menemukan apakah suatu variabel adalah larik. - Kemudian, kita menggunakan fungsi
unlink()
untuk menghapus gambar avatar termasuk salinan yang diubah ukurannya, tetapi melewatkannya dengan flagskip
diatur ketrue
. - Fungsi
delete_post_meta()
menghapus semua kolom kustom dengan kunci yang ditentukan dari posting yang ditentukan. - Fungsi
get_users()
mengambil array pengguna yang cocok dengan kriteria yang diberikan dalam$args
. - Fungsi
delete_user_meta()
menghapus kriteria pencocokan metadata dari pengguna. - Terakhir, kita menjalankan hook tindakan
avatar_manager_delete_avatar
.
Langkah 3. Memperbarui Profil Pengguna
Saat memperbarui profil pengguna, kita tidak hanya perlu menyimpan opsi yang diubah oleh pengguna tetapi juga untuk menangani unggahan dan penghapusan avatar. Ayo lakukan:
1 |
/**
|
2 |
* Updates user profile based on user ID.
|
3 |
*
|
4 |
* @uses avatar_manager_get_options() For retrieving plugin options.
|
5 |
* @uses sanitize_text_field() For sanitizing a string from user input or from
|
6 |
* the database.
|
7 |
* @uses update_user_meta() For updating user meta fields.
|
8 |
* @uses get_user_meta() For retrieving user meta fields.
|
9 |
* @uses update_post_meta() For updating attachment meta fields.
|
10 |
* @uses wp_handle_upload() For handling PHP uploads in WordPress.
|
11 |
* @uses wp_die() For killing WordPress execution and displaying HTML error
|
12 |
* message.
|
13 |
* @uses __() For retrieving the translated string from the translate().
|
14 |
* @uses avatar_manager_delete_avatar() For deleting an avatar image.
|
15 |
* @uses wp_insert_attachment() For inserting an attachment into the media
|
16 |
* library.
|
17 |
* @uses wp_generate_attachment_metadata() For generating metadata for an
|
18 |
* attachment.
|
19 |
* @uses wp_update_attachment_metadata() For updating metadata for an
|
20 |
* attachment.
|
21 |
* @uses avatar_manager_avatar_resize() For generating a resized copy of the
|
22 |
* specified avatar image.
|
23 |
* @uses avatar_manager_delete_avatar() For deleting an avatar image based on
|
24 |
* attachment ID.
|
25 |
* @uses get_edit_user_link() For getting the link to the users edit profile
|
26 |
* page in the WordPress admin.
|
27 |
* @uses add_query_arg() For retrieving a modified URL (with) query string.
|
28 |
* @uses wp_redirect() For redirecting the user to a specified absolute URI.
|
29 |
*
|
30 |
* @since Avatar Manager 1.0.0
|
31 |
*
|
32 |
* @param int $user_id User to update.
|
33 |
*/
|
34 |
function avatar_manager_edit_user_profile_update( $user_id ) { |
35 |
// Retrieves plugin options.
|
36 |
$options = avatar_manager_get_options(); |
37 |
|
38 |
// Sanitizes the string from user input.
|
39 |
$avatar_type = isset( $_POST['avatar_manager_avatar_type'] ) ? sanitize_text_field( $_POST['avatar_manager_avatar_type'] ) : 'gravatar'; |
40 |
|
41 |
// Updates user meta field based on user ID.
|
42 |
update_user_meta( $user_id, 'avatar_manager_avatar_type', $avatar_type ); |
43 |
|
44 |
// Retrieves user meta field based on user ID.
|
45 |
$custom_avatar = get_user_meta( $user_id, 'avatar_manager_custom_avatar', true ); |
46 |
|
47 |
if ( ! empty( $custom_avatar ) ) { |
48 |
// Sanitizes the string from user input.
|
49 |
$custom_avatar_rating = isset( $_POST['avatar_manager_custom_avatar_rating'] ) ? sanitize_text_field( $_POST['avatar_manager_custom_avatar_rating'] ) : 'G'; |
50 |
|
51 |
// Updates attachment meta field based on attachment ID.
|
52 |
update_post_meta( $custom_avatar, '_avatar_manager_custom_avatar_rating', $custom_avatar_rating ); |
53 |
}
|
54 |
|
55 |
...
|
56 |
}
|
57 |
|
58 |
add_action( 'edit_user_profile_update', 'avatar_manager_edit_user_profile_update' ); |
59 |
add_action( 'personal_options_update', 'avatar_manager_edit_user_profile_update' ); |
Ringkasan
-
edit_user_profile_update
danpersonal_options_update
tindakan umumnya digunakan untuk menghemat custom fields yang telah ditambahkan ke halaman profil WordPress. - Fungsi
sanitize_text_field()
membersihkan string dari input pengguna atau dari database. -
update_user_meta()
fungsi memperbarui bidang meta pengguna berdasarkan ID pengguna, sementaraget_user_meta()
mengambil satu bidang meta atau semua bidang data meta pengguna untuk pengguna yang diberikan. - Fungsi
update_post_meta()
memperbarui nilai kunci meta yang ada (bidang kustom) untuk posting tertentu.
Penanganan Upload Avatar
Untuk menangani unggahan avatar, tulis kode berikut:
1 |
if ( isset( $_POST['avatar-manager-upload-avatar'] ) && $_POST['avatar-manager-upload-avatar'] ) { |
2 |
if ( ! function_exists( 'wp_handle_upload' ) ) |
3 |
require_once( ABSPATH . 'wp-admin/includes/file.php' ); |
4 |
|
5 |
// An associative array with allowed MIME types.
|
6 |
$mimes = array( |
7 |
'bmp' => 'image/bmp', |
8 |
'gif' => 'image/gif', |
9 |
'jpe' => 'image/jpeg', |
10 |
'jpeg' => 'image/jpeg', |
11 |
'jpg' => 'image/jpeg', |
12 |
'png' => 'image/png', |
13 |
'tif' => 'image/tiff', |
14 |
'tiff' => 'image/tiff' |
15 |
);
|
16 |
|
17 |
// An associative array to override default variables.
|
18 |
$overrides = array( |
19 |
'mimes' => $mimes, |
20 |
'test_form' => false |
21 |
);
|
22 |
|
23 |
// Handles PHP uploads in WordPress.
|
24 |
$avatar = wp_handle_upload( $_FILES['avatar_manager_import'], $overrides ); |
25 |
|
26 |
if ( isset( $avatar['error'] ) ) |
27 |
// Kills WordPress execution and displays HTML error message.
|
28 |
wp_die( $avatar['error'], __( 'Image Upload Error', 'avatar-manager' ) ); |
29 |
|
30 |
if ( ! empty( $custom_avatar ) ) |
31 |
// Deletes users old avatar image.
|
32 |
avatar_manager_delete_avatar( $custom_avatar ); |
33 |
|
34 |
// An associative array about the attachment.
|
35 |
$attachment = array( |
36 |
'guid' => $avatar['url'], |
37 |
'post_content' => $avatar['url'], |
38 |
'post_mime_type' => $avatar['type'], |
39 |
'post_title' => basename( $avatar['file'] ) |
40 |
);
|
41 |
|
42 |
// Inserts the attachment into the media library.
|
43 |
$attachment_id = wp_insert_attachment( $attachment, $avatar['file'] ); |
44 |
|
45 |
// Generates metadata for the attachment.
|
46 |
$attachment_metadata = wp_generate_attachment_metadata( $attachment_id, $avatar['file'] ); |
47 |
|
48 |
// Updates metadata for the attachment.
|
49 |
wp_update_attachment_metadata( $attachment_id, $attachment_metadata ); |
50 |
|
51 |
$custom_avatar = array(); |
52 |
|
53 |
// Generates a resized copy of the avatar image.
|
54 |
$custom_avatar[ $options['default_size'] ] = avatar_manager_avatar_resize( $avatar['url'], $options['default_size'] ); |
55 |
|
56 |
// Updates attachment meta fields based on attachment ID.
|
57 |
update_post_meta( $attachment_id, '_avatar_manager_custom_avatar', $custom_avatar ); |
58 |
update_post_meta( $attachment_id, '_avatar_manager_custom_avatar_rating', 'G' ); |
59 |
update_post_meta( $attachment_id, '_avatar_manager_is_custom_avatar', true ); |
60 |
|
61 |
// Updates user meta fields based on user ID.
|
62 |
update_user_meta( $user_id, 'avatar_manager_avatar_type', 'custom' ); |
63 |
update_user_meta( $user_id, 'avatar_manager_custom_avatar', $attachment_id ); |
64 |
}
|
Ringkasan
-
function_exists()
mengembalikantrue
jika fungsi yang diberikan telah didefinisikan, makarequire_once()
pernyataan memeriksa apakah file yang ditentukan telah dimasukkan, dan jika demikian, tidak memasukkannya lagi. - Fungsi
wp_handle_upload()
menangani upload PHP di WordPress, membersihkan nama file, memeriksa ekstensi untuk tipe mime, dan memindahkan file ke direktori yang sesuai dalam direktori upload. - Sebelum menambahkan gambar avatar baru, kita memanggil
avatar_manager_delete_avatar()
fungsi untuk menghapus avatar lama, jika ada yang diatur. - Fungsi
wp_insert_attachment()
menyisipkan lampiran ke perpustakaan media. - Fungsi
wp_generate_attachment_metadata()
menghasilkan metadata untuk lampiran gambar; itu juga menciptakan thumbnail dan ukuran menengah lainnya dari lampiran gambar berdasarkan ukuran yang ditentukan padaPengaturan Layar Media
. - Fungsi
wp_update_attachment_metadata()
memperbarui metadata untuk lampiran. - Selanjutnya, kita memanggil fungsi
avatar_manager_avatar_resize()
untuk menghasilkan salinan gambar avatar pada ukuran default. - Terakhir, kita memperbarui metadata untuk lampiran dan untuk pengguna yang saat ini sedang diedit.
Menghapus Gambar Avatar
Sekarang, saatnya untuk membuat plugin untuk benar-benar menghapus gambar avatar saat diminta:
1 |
if ( isset( $_GET['avatar_manager_action'] ) && $_GET['avatar_manager_action'] ) { |
2 |
global $wp_http_referer; |
3 |
|
4 |
$action = $_GET['avatar_manager_action']; |
5 |
|
6 |
switch ( $action ) { |
7 |
case 'remove-avatar': |
8 |
// Deletes avatar image based on attachment ID.
|
9 |
avatar_manager_delete_avatar( $_GET['avatar_manager_custom_avatar'] ); |
10 |
|
11 |
break; |
12 |
}
|
13 |
|
14 |
// Gets the link to the users edit profile page in the WordPress admin.
|
15 |
$edit_user_link = get_edit_user_link( $user_id ); |
16 |
|
17 |
// Retrieves a modified URL (with) query string.
|
18 |
$redirect = add_query_arg( 'updated', true, $edit_user_link ); |
19 |
|
20 |
if ( $wp_http_referer ) |
21 |
// Retrieves a modified URL (with) query string.
|
22 |
$redirect = add_query_arg( 'wp_http_referer', urlencode( $wp_http_referer ), $redirect ); |
23 |
|
24 |
// Redirects the user to a specified absolute URI.
|
25 |
wp_redirect( $redirect ); |
26 |
|
27 |
exit; |
28 |
}
|
Ringkasan
- Jika nilai dari tindakan yang diminta adalah
remove-avatar
, kita memanggilavatar_manager_delete_avatar()
untuk menghapus gambar avatar yang ditentukan. - Fungsi
get_edit_user_link()
mendapat tautan ke pengguna mengedit halaman profil di admin WordPress. - Fungsi
urlencode()
mengkodekan string yang akan digunakan dalam bagian query dari URL. - Pada akhir fungsi, kita memanggil fungsi
wp_redirect()
untuk mengarahkan kembali pengguna ke profil pengguna yang diperbarui. - Panggilan
exit
akan menghentikan eksekusi skrip; ini adalah konstruksi bahasa dan itu bisa disebut tanpa tanda kurung jika tidak adastatus
yang dilewatkan.
Langkah 4. Mengambil Gambar Avatar Kustom
Selanjutnya, kita akan menulis fungsi pembantu untuk mengambil gambar avatar khusus:
1 |
/**
|
2 |
* Returns user custom avatar based on user ID.
|
3 |
*
|
4 |
* @uses get_option() For getting values for a named option.
|
5 |
* @uses avatar_manager_get_options() For retrieving plugin options.
|
6 |
* @uses get_userdata() For retrieving user data by user ID.
|
7 |
* @uses is_ssl() For checking if SSL is being used.
|
8 |
* @uses add_query_arg() For retrieving a modified URL (with) query string.
|
9 |
* @uses esc_attr() For escaping HTML attributes.
|
10 |
* @uses get_user_meta() For retrieving user meta fields.
|
11 |
* @uses get_post_meta() For retrieving attachment meta fields.
|
12 |
* @uses wp_get_attachment_image_src() For retrieving an array with the image
|
13 |
* attributes "url", "width" and "height", of an image attachment file.
|
14 |
* @uses avatar_manager_avatar_resize() For generating a resized copy of the
|
15 |
* specified avatar image.
|
16 |
* @uses update_post_meta() For updating attachment meta fields.
|
17 |
* @uses apply_filters() For calling the functions added to a filter hook.
|
18 |
*
|
19 |
* @since Avatar Manager 1.0.0
|
20 |
*
|
21 |
* @param int $user_id User to update.
|
22 |
* @param int $size Size of the avatar image
|
23 |
* @param string $default URL to a default image to use if no avatar is
|
24 |
* available.
|
25 |
* @param string $alt Alternative text to use in image tag. Defaults to blank.
|
26 |
* @return string <img> tag for the user's avatar.
|
27 |
*/
|
28 |
function avatar_manager_get_custom_avatar( $user_id, $size = '', $default = '', $alt = false ) { |
29 |
// Returns if showing avatars is not enabled.
|
30 |
if ( ! get_option( 'show_avatars' ) ) |
31 |
return false; |
32 |
|
33 |
// Retrieves plugin options.
|
34 |
$options = avatar_manager_get_options(); |
35 |
|
36 |
if ( empty( $size ) || ! is_numeric( $size ) ) { |
37 |
$size = $options['avatar-manager-default-size']; |
38 |
} else { |
39 |
$size = absint( $size ); |
40 |
|
41 |
if ( $size < 1 ) |
42 |
$size = 1; |
43 |
elseif ( $size > 512 ) |
44 |
$size = 512; |
45 |
}
|
46 |
|
47 |
// Retrieves user data by user ID.
|
48 |
$user = get_userdata( $user_id ); |
49 |
|
50 |
// Returns if no user data was retrieved.
|
51 |
if ( empty( $user ) ) |
52 |
return false; |
53 |
|
54 |
$email = $user->user_email; |
55 |
|
56 |
if ( empty( $default ) ) { |
57 |
// Retrieves values for the named option.
|
58 |
$avatar_default = get_option( 'avatar_default' ); |
59 |
|
60 |
if ( empty( $avatar_default ) ) |
61 |
$default = 'mystery'; |
62 |
else
|
63 |
$default = $avatar_default; |
64 |
}
|
65 |
|
66 |
$email_hash = md5( strtolower( trim( $email ) ) ); |
67 |
|
68 |
if ( is_ssl() ) |
69 |
$host = 'https://secure.gravatar.com'; |
70 |
else
|
71 |
$host = sprintf( 'http://%d.gravatar.com', ( hexdec( $email_hash[0] ) % 2 ) ); |
72 |
|
73 |
if ( $default == 'mystery' ) |
74 |
$default = $host . '/avatar/ad516503a11cd5ca435acc9bb6523536?s=' . $size; |
75 |
elseif ( $default == 'gravatar_default' ) |
76 |
$default = ''; |
77 |
elseif ( strpos( $default, 'http://' ) === 0 ) |
78 |
// Retrieves a modified URL (with) query string.
|
79 |
$default = add_query_arg( 's', $size, $default ); |
80 |
|
81 |
if ( $alt === false ) |
82 |
$alt = ''; |
83 |
else
|
84 |
// Escapes HTML attributes.
|
85 |
$alt = esc_attr( $alt ); |
86 |
|
87 |
// Retrieves values for the named option.
|
88 |
$avatar_rating = get_option( 'avatar_rating' ); |
89 |
|
90 |
// Retrieves user meta field based on user ID.
|
91 |
$custom_avatar = get_user_meta( $user_id, 'avatar_manager_custom_avatar', true ); |
92 |
|
93 |
// Returns if no attachment ID was retrieved.
|
94 |
if ( empty( $custom_avatar ) ) |
95 |
return false; |
96 |
|
97 |
// Retrieves attachment meta field based on attachment ID.
|
98 |
$custom_avatar_rating = get_post_meta( $custom_avatar, '_avatar_manager_custom_avatar_rating', true ); |
99 |
|
100 |
$ratings['G'] = 1; |
101 |
$ratings['PG'] = 2; |
102 |
$ratings['R'] = 3; |
103 |
$ratings['X'] = 4; |
104 |
|
105 |
if ( $ratings[ $custom_avatar_rating ] <= $ratings[ $avatar_rating ] ) { |
106 |
// Retrieves attachment meta field based on attachment ID.
|
107 |
$avatar = get_post_meta( $custom_avatar, '_avatar_manager_custom_avatar', true ); |
108 |
|
109 |
if ( empty( $avatar[ $size ] ) ) { |
110 |
// Retrieves an array with the image attributes "url", "width"
|
111 |
// and "height", of the image attachment file.
|
112 |
$url = wp_get_attachment_image_src( $custom_avatar, 'full' ); |
113 |
|
114 |
// Generates a resized copy of the avatar image.
|
115 |
$avatar[ $size ] = avatar_manager_avatar_resize( $url[0], $size ); |
116 |
|
117 |
// Updates attachment meta field based on attachment ID.
|
118 |
update_post_meta( $custom_avatar, '_avatar_manager_custom_avatar', $avatar ); |
119 |
}
|
120 |
|
121 |
$src = $avatar[ $size ]['url']; |
122 |
$avatar = '<img alt="' . $alt . '" class="avatar avatar-' . $size . ' photo avatar-default" height="' . $size . '" src="' . $src . '" width="' . $size . '">'; |
123 |
} else { |
124 |
$src = $host . '/avatar/'; |
125 |
$src .= $email_hash; |
126 |
$src .= '?s=' . $size; |
127 |
$src .= '&d=' . urlencode( $default ); |
128 |
$src .= '&forcedefault=1'; |
129 |
|
130 |
$avatar = '<img alt="' . $alt . '" class="avatar avatar-' . $size . ' photo avatar-default" height="' . $size . '" src="' . $src . '" width="' . $size . '">'; |
131 |
}
|
132 |
|
133 |
// Calls the functions added to avatar_manager_get_custom_avatar
|
134 |
// filter hook.
|
135 |
return apply_filters( 'avatar_manager_get_custom_avatar', $avatar, $user_id, $size, $default, $alt ); |
136 |
}
|
Ringkasan
- Fungsi
avatar_manager_get_custom_avatar
mengembalikan gambar avatar kustom berdasarkan ID pengguna ataufalse
jika menampilkan avatar tidak diaktifkan. Fungsi mengambil opsi plugin, membersihkan parameter$size
dan melepaskan atribut HTML dari variabel$alt
. - Kemudian, ia mengambil gambar default untuk digunakan sebagai pengganti gambar avatar jika peringkat avatar tidak cocok. Salinan gambar avatar yang diubah ukurannya dibuat sesuai permintaan jika ukuran yang diminta tidak cocok dengan file gambar yang ada.
- Fungsi
get_userdata()
mengembalikan objekWP_User
dengan informasi yang berkaitan dengan pengguna yang ID-nya diteruskan ke sana. - The
md5()
mengembalikan fungsi MD5 hash untuk string yang disediakan. - Fungsi
strtolower()
mengembalikan string yang disediakan tetapi dengan semua karakter alfabetik diubah menjadi huruf kecil. - Panggilan is_ssl() memeriksa jika SSL sedang digunakan.
- Fungsi
sprintf()
mengembalikan string berformat. - Fungsi
hexdec()
mengembalikan nilai desimal desimal dari angka heksadesimal yang ditentukan. - Panggilan
strpos()
menemukan posisi numerik dari terjadinyaneedle
pertama di tumpukanhaystack
. - Fungsi
wp_get_attachment_image_src()
mengembalikan array denganurl
atribut gambar,width
danheight
, file lampiran gambar. - Terakhir, kita menggunakan fungsi
apply_filters()
untuk memanggil fungsi yang ditambahkan ke hook filteravatar_manager_get_custom_avatar
.
Langkah 5. Mengambil Gambar Avatar
Pada dasarnya, fungsi selanjutnya adalah fungsi utama dari plugin:
1 |
/**
|
2 |
* Returns the avatar for a user who provided a user ID or email address.
|
3 |
*
|
4 |
* @uses get_option() For getting values for a named option.
|
5 |
* @uses avatar_manager_get_options() For retrieving plugin options.
|
6 |
* @uses get_userdata() For retrieving user data by user ID.
|
7 |
* @uses avatar_manager_get_custom_avatar() For retrieving user custom avatar
|
8 |
* based on user ID.
|
9 |
* @uses apply_filters() For calling the functions added to a filter hook.
|
10 |
*
|
11 |
* @since Avatar Manager 1.0.0
|
12 |
*
|
13 |
* @param int|string|object $id_or_email A user ID, email address, or comment
|
14 |
* object.
|
15 |
* @param int $size Size of the avatar image
|
16 |
* @param string $default URL to a default image to use if no avatar is
|
17 |
* available.
|
18 |
* @param string $alt Alternative text to use in image tag. Defaults to blank.
|
19 |
* @return string <img> tag for the user's avatar.
|
20 |
*/
|
21 |
function avatar_manager_get_avatar( $avatar = '', $id_or_email, $size = '', $default = '', $alt = false ) { |
22 |
// Returns if showing avatars is not enabled.
|
23 |
if ( ! get_option( 'show_avatars' ) ) |
24 |
return false; |
25 |
|
26 |
// Retrieves plugin options.
|
27 |
$options = avatar_manager_get_options(); |
28 |
|
29 |
if ( empty( $size ) || ! is_numeric( $size ) ) { |
30 |
$size = $options['avatar-manager-default-size']; |
31 |
} else { |
32 |
$size = absint( $size ); |
33 |
|
34 |
if ( $size < 1 ) |
35 |
$size = 1; |
36 |
elseif ( $size > 512 ) |
37 |
$size = 512; |
38 |
}
|
39 |
|
40 |
$email = ''; |
41 |
|
42 |
if ( is_numeric( $id_or_email ) ) { |
43 |
$id = (int) $id_or_email; |
44 |
|
45 |
// Retrieves user data by user ID.
|
46 |
$user = get_userdata( $id ); |
47 |
|
48 |
if ( $user ) |
49 |
$email = $user->user_email; |
50 |
} elseif ( is_object( $id_or_email ) ) { |
51 |
if ( ! empty( $id_or_email->user_id ) ) { |
52 |
$id = (int) $id_or_email->user_id; |
53 |
|
54 |
// Retrieves user data by user ID.
|
55 |
$user = get_userdata( $id ); |
56 |
|
57 |
if ( $user ) |
58 |
$email = $user->user_email; |
59 |
} elseif ( ! empty( $id_or_email->comment_author_email ) ) { |
60 |
$email = $id_or_email->comment_author_email; |
61 |
}
|
62 |
} else { |
63 |
$email = $id_or_email; |
64 |
|
65 |
if ( $id = email_exists( $email ) ) |
66 |
// Retrieves user data by user ID.
|
67 |
$user = get_userdata( $id ); |
68 |
}
|
69 |
|
70 |
if ( isset( $user ) ) |
71 |
$avatar_type = $user->avatar_manager_avatar_type; |
72 |
else
|
73 |
return $avatar; |
74 |
|
75 |
if ( $avatar_type == 'custom' ) |
76 |
// Retrieves user custom avatar based on user ID.
|
77 |
$avatar = avatar_manager_get_custom_avatar( $user->ID, $size, $default, $alt ); |
78 |
|
79 |
// Calls the functions added to avatar_manager_get_avatar filter hook.
|
80 |
return apply_filters( 'avatar_manager_get_avatar', $avatar, $id_or_email, $size, $default, $alt ); |
81 |
}
|
82 |
|
83 |
add_filter( 'get_avatar', 'avatar_manager_get_avatar', 10, 5 ); |
Ringkasan
- Fungsi
avatar_manager_get_avatar()
mengembalikan avatar untuk pengguna yang memberikan ID pengguna atau alamat email, atau salah jika menampilkan avatar tidak diaktifkan. - Kita menggunakan filter
get_avatar
untuk mengubah output fungsiget_avatar()
. Fungsi kita mengambil opsi plugin, membersihkan parameter$size
dan menemukan ID dari pengguna yang ditentukan. - Kemudian, mengembalikan hasil dari
avatar_manager_get_custom_avatar()
fungsi panggilan, atau output yang tidak dimodifikasi dariget_avatar()
jika pengguna tidak menggunakan avatar kustom. - Panggilan
is_object()
menemukan apakah suatu variabel adalah objek. - Fungsi
email_exists()
memeriksa apakah alamat email yang diberikan sudah terdaftar untuk nama pengguna, dan mengembalikan ID pengguna itu, atau salah jika tidak ada.
Untuk menguji hasilnya, buka Pengguna -> Layar Profil Anda.
Jelajahi gambar dan unggah. Sekarang, Anda harus dapat memilih antara menggunakan Gravatar atau gambar avatar kustom yang baru saja Anda unggah.
Langkah 6. Menghilangkan Hook Filter yang Tidak Diperlukan
Jika Anda pergi ke Layar Pengaturan Pengaturan Anda akan melihat bahwa avatar dari pengaturan Avatar Default diganti dengan avatar kustom Anda. Untuk memperbaiki masalah ini, kita akan mengembalikan avatar default dengan menghapus fungsi kustom kita ketika tidak diperlukan dengan bantuan hook filter avatar_defaults
. Untuk melakukannya, tambahkan kode berikut:
1 |
/**
|
2 |
* Prevents custom avatars from being applied to the Default Avatar setting.
|
3 |
*
|
4 |
* @uses remove_filter() For removing a function attached to a specified action
|
5 |
* hook.
|
6 |
*
|
7 |
* @since Avatar Manager 1.0.0
|
8 |
*
|
9 |
* @param array $avatar_defaults An associative array with default avatars.
|
10 |
* @return array An associative array with default avatars.
|
11 |
*/
|
12 |
function avatar_manager_avatar_defaults( $avatar_defaults ) { |
13 |
// Removes the avatar_manager_get_avatar function attached to get_avatar
|
14 |
// action hook.
|
15 |
remove_filter( 'get_avatar', 'avatar_manager_get_avatar' ); |
16 |
|
17 |
return $avatar_defaults; |
18 |
}
|
19 |
|
20 |
add_filter( 'avatar_defaults', 'avatar_manager_avatar_defaults', 10, 1 ); |
Untuk mencegah avatar kustom diterapkan ke pengaturan Avatar Default, kita memanggil fungsi remove_filter()
. Ini menghapus fungsi yang melekat pada hook filter yang ditentukan. Metode ini dapat digunakan untuk menghapus fungsi-fungsi standar yang melekat pada hook filter tertentu dan mungkin menggantikannya dengan pengganti.
Langkah 7. Menampilkan Negara Media Kustom
Layar Pustaka Media memungkinkan Anda untuk mengedit, melihat, dan menghapus gambar, video, rekaman, dan file yang sebelumnya diunggah ke blog Anda. Untuk mengidentifikasi lampiran yang digunakan sebagai gambar avatar, kita akan menampilkan status media khusus untuknya:
1 |
/**
|
2 |
* Displays media states for avatar images.
|
3 |
*
|
4 |
* @uses get_post_meta() For retrieving attachment meta fields.
|
5 |
* @uses __() For retrieving the translated string from the translate().
|
6 |
* @uses apply_filters() For calling the functions added to a filter hook.
|
7 |
*
|
8 |
* @since Avatar Manager 1.0.0
|
9 |
*
|
10 |
* @param array $media_states An associative array with media states.
|
11 |
* @return array An associative array with media states.
|
12 |
*/
|
13 |
function avatar_manager_display_media_states( $media_states ) { |
14 |
global $post; |
15 |
|
16 |
// Retrieves attachment meta field based on attachment ID.
|
17 |
$meta_avatar = get_post_meta( $post->ID, '_avatar_manager_is_custom_avatar', true ); |
18 |
|
19 |
if ( ! empty( $meta_avatar ) ) |
20 |
$media_states[] = __( 'Avatar Image', 'avatar-manager' ); |
21 |
|
22 |
// Calls the functions added to avatar_manager_display_media_states filter
|
23 |
// hook.
|
24 |
return apply_filters( 'avatar_manager_display_media_states', $media_states ); |
25 |
}
|
26 |
|
27 |
add_filter( 'display_media_states', 'avatar_manager_display_media_states', 10, 1 ); |
Filter display_media_states
digunakan untuk menampilkan status media khusus untuk attachmets yang telah ditambahkan ke Media Library. Kita menggunakan variabel global $post
untuk mengambil ID dari lampiran saat ini. Jika bidang kustom _avatar_manager_is_custom_avatar
tidak kosong, lampiran adalah gambar avatar sehingga kita menambahkan status media khusus untuknya.
Jika Anda tidak memiliki gambar avatar khusus apa pun, unggah satu dan masuk ke Layar Pustaka Media.
Perhatikan bahwa setiap lampiran yang digunakan sebagai gambar avatar khusus memiliki gambar Avatar yang ditambahkan di samping nama file.
Langkah 8. Menambahkan Uninstaller
Untuk menangani proses uninstal, plugin harus membuat file bernama uninstall.php di direktori plugin dasar daripada menggunakan register_uninstall_hook()
. File ini akan dipanggil, jika ada, selama proses penghapusan instalasi melewati hook penginstalan. Untuk melakukannya, buka avatar-manager/uninstall.php dan tambahkan kode berikut:
1 |
<?php
|
2 |
/**
|
3 |
* @package Avatar_Manager
|
4 |
* @subpackage Uninstaller
|
5 |
*/
|
6 |
|
7 |
// Exits if uninstall is not called from WordPress.
|
8 |
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) |
9 |
exit; |
10 |
|
11 |
if ( ! function_exists( 'avatar_manager_delete_avatar' ) ) |
12 |
include_once( 'avatar-manager.php' ); |
13 |
|
14 |
// Deletes plugin options.
|
15 |
delete_option( 'avatar_manager' ); |
16 |
|
17 |
// An associative array with criteria to match.
|
18 |
$args = array( |
19 |
'meta_key' => 'avatar_manager_custom_avatar' |
20 |
);
|
21 |
|
22 |
// Retrieves an array of users matching the criteria given in $args.
|
23 |
$users = get_users( $args ); |
24 |
|
25 |
foreach ( $users as $user ) { |
26 |
// Deletes avatar image based on attachment ID.
|
27 |
avatar_manager_delete_avatar( $user->avatar_manager_custom_avatar ); |
28 |
}
|
29 |
?>
|
Saat menggunakan uninstall.php plugin harus selalu memeriksa konstanta WP_UNINSTALL_PLUGIN
, sebelum mengeksekusi. Konstanta WP_UNINSTALL_PLUGIN
didefinisikan oleh WordPress pada saat runtime selama plugin uninstall dan itu tidak akan hadir jika uninstall.php diminta secara langsung. Yang define()
memeriksa apakah ada konstanta bernama yang diberikan. Pernyataan include_once
menyertakan dan mengevaluasi file yang ditentukan selama eksekusi skrip; jika kode dari file sudah dimasukkan, itu tidak akan dimasukkan lagi. Fungsi delete_option()
menghapus opsi bernama dari tabel database opsi.
Langkah 9. Internasionalisasi dan Penerjemahan Plugin
Setelah Anda memiliki pemrograman untuk plugin Anda selesai, pertimbangan lain adalah internasionalisasi. Internasionalisasi, sering disingkat sebagai i18n, adalah proses pengaturan perangkat lunak sehingga dapat dilokalisasi; lokalisasi, atau l10n, adalah proses menerjemahkan teks yang ditampilkan oleh perangkat lunak ke dalam bahasa yang berbeda. WordPress menggunakan pustaka gettext dan alat untuk i18n.
Sangat disarankan agar Anda menginternasionalkan plugin Anda, sehingga pengguna dari berbagai negara dapat melokalkannya.
String diterjemahkan
Untuk membuat string yang dapat diterjemahkan, Anda hanya harus membungkus string asli dalam panggilan fungsi __()
. Jika kode Anda harus menggemakan string ke browser, gunakan fungsi _e()
sebagai gantinya. Seperti yang Anda ketahui, kita sudah melakukannya di plugin.
Teks Domain
Domain teks adalah pengenal unik, yang memastikan WordPress dapat membedakan antara semua terjemahan yang dimuat. Menggunakan basename dari plugin Anda selalu merupakan pilihan yang baik. Anda dapat memuat string terjemahan plugin dengan memanggil fungsi load_plugin_textdomain()
, yang telah dilakukan di bagian pertama dari tutorial.
File PO
Sekarang, kita perlu membuat file .po untuk penerjemah. Untuk melakukan ini, kita akan menggunakan perangkat lunak penerjemahan Poedit. Setelah Anda mengunduhnya, klik File -> New Catalog ... untuk menyiapkan katalog baru. Jendela baru seharusnya terbuka. Buka tab Info proyek dan masukkan Avatar Manager sebagai nama proyek.



Tab Info Proyek Poedit di bawah jendela Pengaturan
Pada tab Paths, mari tinggalkan jalur dasar sebagai . yang mengacu pada direktori di mana katalog tersebut.



Tab Paths Poedit di bawah jendela Pengaturan
Selanjutnya, buka tab Keywords. Hapus semua item di sana, dan tambahkan kata kunci ini: __, _e, _n, dan _x.



Tab Keywords Poedit di bawah jendela Pengaturan
Tekan OK dan simpan file sebagai avatar-manager/languages/avatar-manager-default.po. Sekarang, file sudah siap untuk diterjemahkan.



Jendela utama Poedit
Terjemahkan semua string yang Anda inginkan dan kemudian simpan file sebagai avatar-manager/languages/avatar-manager-{locale}.po. Lokal adalah kode bahasa dan/atau kode negara yang Anda tentukan dalam WPLANG
konstan dalam file wp-config.php.
MO file
File .mo adalah file biner yang berisi semua string asli dan terjemahannya dalam format yang cocok untuk ekstraksi terjemahan cepat. Konversi dilakukan secara otomatis jika Anda pergi ke Edit -> Preferences -> Editor dan check Automatically compile .mo file on save.
Langkah 10. Melepaskan dan Mempromosikan Plugin
Bagian ini membahas langkah-langkah untuk mengambil plugin yang Anda buat dan mendistribusikannya secara luas.
Mengirimkan ke Direktori Plugin WordPress
Cara tercepat, termudah, dan terbaik untuk mengeluarkan plugin Anda adalah mengunggah plugin Anda ke Direktori Plugin WordPress. Untuk detail lebih lanjut tentang mengirimkan plugin Anda, lihat tentang halaman atau lompat langsung ke halaman pengiriman plugin
.
Mempromosikan dan Mendokumentasikan Plugin Anda
Untuk mengirimkan dan mempromosikan plugin Anda ke Komunitas WordPress, pertama-tama buat halaman untuk plugin di situs Anda dengan instruksi yang lengkap dan ditulis dengan baik. Sertakan tautan ke halaman penjelasan ini di tajuk plugin, sehingga orang dapat dengan mudah memeriksa pembaruan dan informasi serta bantuan lebih lanjut.
Jika Anda memilih untuk mengirimkan plugin Anda ke Direktori Plugin WordPress, buat juga informasi ini sejelas mungkin sehingga mereka dapat mengkategorikan dan membantu orang lain memahami penggunaan plugin Anda. Anda juga perlu membuat file readme.txt dalam format standar, dan sertakan dengan plugin Anda.
Kesimpulan
Ini menutup tutorial; sekarang, kita memiliki plugin yang berfungsi penuh dan belajar beberapa tips dan trik praktis tentang pengembangan plugin WordPress. Ide di balik plugin ini dimulai sebagai fitur yang diminta di inti WordPress; Saya akan senang mendengar pendapat Anda tentang hal itu. Apakah itu meningkatkan alur kerja saat ini? Akankah Anda menemukan pendekatan serupa yang berguna tetapi mengelola gambar Gravatar langsung dari layar profil Anda?
Sebagai bonus, plugin Avatar Manager juga tersedia di WordPress Plugin Directory dan GitHub. Lihat untuk mendapatkan info terbaru tentang rilis terbaru. Terima kasih sudah membaca!
Referensi
- Standar Coding WordPress - Informasi umum tentang standar pengkodean untuk pengembangan WordPress.
- Menulis Plugin - Tempat awal terbaik untuk belajar tentang cara mengembangkan plugin WordPress.
- API Plugin - Deskripsi cara menggunakan hook tindakan dan filter di plugin WordPress Anda, dan fungsi inti yang dapat diganti plugin.
- Referensi Fungsi - Sebuah artikel dengan banyak fungsi inti WordPress yang berguna untuk plugin dan pengembang tema; daftar sebagian besar fungsi inti, kecuali Tag Template.
- I18n untuk Pengembang WordPress - Internasionalisasi, termasuk bagian tentang cara menginternasionalisasikan plugin Anda.
- Pengajuan dan Promosi Plugin - Setelah Anda menulis plugin Anda, berikut beberapa petunjuk untuk mendistribusikannya secara luas.
Tautan Eksternal
- Manajer Avatar pada Direktori Plugin WordPress - Rumah resmi untuk plugin Avatar Manager.
- Avatar Manager di GitHub - Kode sumber dari plugin Avatar Manager.