Advertisement
  1. Code
  2. WordPress
  3. Plugin Development

Cara Membuat Plugin Manajemen Avatar WordPress: Sentuhan Akhir

Scroll to top
Read Time: 27 min
This post is part of a series called How to Create a WordPress Avatar Management Plugin from Scratch.
How to Create a WordPress Avatar Management Plugin from Scratch: Getting Started

() 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 dari basename() yang mengembalikan trailing name component dari sebuah path.
  • Fungsi file_exists() memeriksa apakah file atau direktori ada.
  • Bendera skip diatur ke true jika file gambar tujuan sudah ada, jika ada gambar baru yang dihasilkan.
  • Fungsi wp_get_image_editor() mengembalikan instance WP_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() dan save() dari objek $image.
  • Do_action() mengeksekusi hook yang dibuat oleh add_action(); ini memungkinkan tema dan plugin untuk menghubungkan ke tindakan avatar_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 oleh wp_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 flag skip diatur ke true.
  • 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

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() mengembalikan true jika fungsi yang diberikan telah didefinisikan, maka require_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 pada Pengaturan 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 memanggil avatar_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 ada status 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 atau false 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 objek WP_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 terjadinya needle pertama di tumpukan haystack.
  • Fungsi wp_get_attachment_image_src() mengembalikan array dengan url atribut gambar, width dan height, file lampiran gambar.
  • Terakhir, kita menggunakan fungsi apply_filters() untuk memanggil fungsi yang ditambahkan ke hook filter avatar_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 fungsi get_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 dari get_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.

The Avatar Manager plugin options under the User Your Profile ScreenThe Avatar Manager plugin options under the User Your Profile ScreenThe Avatar Manager plugin options under the User Your Profile Screen
Opsi Plugin Manajer Avatar di bawah Layar Pengguna 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.

The Avatar Manager plugin media states under the Media Library ScreenThe Avatar Manager plugin media states under the Media Library ScreenThe Avatar Manager plugin media states under the Media Library Screen
Status media plugin Avatar Manager berada di bawah Layar Media Library

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.

Poedits Project info tab under the Settings windowPoedits Project info tab under the Settings windowPoedits Project info tab under the Settings window
Tab Info Proyek Poedit di bawah jendela Pengaturan

Pada tab Paths, mari tinggalkan jalur dasar sebagai . yang mengacu pada direktori di mana katalog tersebut.

Poedits Paths tab under the Settings windowPoedits Paths tab under the Settings windowPoedits Paths tab under the Settings window
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.

Poedits Keywords tab under the Settings windowPoedits Keywords tab under the Settings windowPoedits Keywords tab under the Settings window
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.

Poedits main windowPoedits main windowPoedits main window
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

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.