PluginProbe ʕ •ᴥ•ʔ
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments / 2.13.0
SureCart – Ecommerce Made Easy For Selling Physical Products, Digital Downloads, Subscriptions, Donations, & Payments v2.13.0
4.4.2 4.4.1 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.3 4.2.2 4.2.1 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.11.0 1.11.1 1.11.2 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.4.0 1.4.1 1.4.2 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.9.0 1.9.1 1.9.2 1.9.3 1.9.4 1.9.5 2.0.0 2.0.1 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.10.0 2.10.1 2.11.0 2.11.1 2.11.2 2.11.3 2.11.4 2.12.0 2.13.0 2.14.0 2.14.1 2.15.0 2.15.1 2.16.0 2.16.1 2.16.2 2.16.3 2.17.0 2.17.1 2.17.2 2.18.0 2.19.0 2.19.2 2.19.3 2.19.4 2.2.0 2.2.1 2.20.0 2.20.1 2.20.2 2.20.3 2.20.4 2.20.5 2.20.6 2.21.0 2.22.0 2.22.1 2.23.0 2.24.0 2.25.0 2.25.1 2.25.2 2.26.0 2.27.0 2.27.1 2.28.0 2.29.0 2.29.1 2.29.2 2.29.3 2.29.4 2.3.0 2.3.1 2.30.0 2.31.0 2.31.1 2.31.2 2.31.3 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.40.0 2.40.1 2.5.0 2.5.1 2.5.2 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.8.2 2.8.3 2.8.4 2.9.0 3.0.0 3.0.0-RC1 3.0.0-RC2 3.0.0-beta1 3.0.0-beta2 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.10.0 3.10.1 3.11.0 3.12.0 3.13.0 3.13.1 3.13.2 3.13.3 3.13.4 3.14.0 3.15.0 3.15.1 3.15.2 3.15.3 3.15.4 3.15.5 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.16.6 3.16.7 3.16.8 3.17.0 3.17.1 3.17.2 3.17.3 3.17.4 3.17.5 3.17.6 3.18.0 3.19.0 3.19.1 3.19.2 3.2.0 3.2.1 3.2.2 3.20.0 3.20.1 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.4.3 3.5.0 3.5.1 3.5.2 3.5.3 3.6.0 3.6.1 3.6.2 3.7.0 3.7.1 3.7.2 3.7.3 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.9.0 4.0.0 4.0.1 4.0.2 4.0.3 trunk 4.1.0 0.2.19.1 4.1.1 1.0.0 4.2.0 1.0.1 1.0.2
surecart / core / app-core / src / Avatar / Avatar.php
surecart / core / app-core / src / Avatar Last commit date
Avatar.php 3 years ago AvatarServiceProvider.php 3 years ago
Avatar.php
182 lines
1 <?php
2 /**
3 * @package SureCartAppCore
4 * @author SureCart <support@surecart.com>
5 * @copyright SureCart
6 * @license https://www.gnu.org/licenses/gpl-2.0.html GPL-2.0
7 * @link https://surecart.com
8 */
9
10 namespace SureCartAppCore\Avatar;
11
12 use WP_Comment;
13
14 class Avatar {
15 /**
16 * Default avatar attachment id.
17 *
18 * @var integer
19 */
20 protected $default_avatar_id = 0;
21
22 /**
23 * User meta keys that should be used as the avatar, in order.
24 *
25 * @var string[]
26 */
27 protected $avatar_user_meta_keys = [];
28
29 /**
30 * Bootstrap.
31 *
32 * @return void
33 */
34 public function bootstrap() {
35 add_filter( 'get_avatar_url', [ $this, 'filterAvatar' ], 10, 3 );
36 }
37
38 /**
39 * Set the default avatar to an attachment id.
40 *
41 * @param integer $attachment_id
42 * @return void
43 */
44 public function setDefault( $attachment_id ) {
45 $this->default_avatar_id = intval( $attachment_id );
46 }
47
48 /**
49 * Add a meta key which should be checked for a valid attachment id
50 *
51 * @param string $user_meta_key
52 * @return void
53 */
54 public function addUserMetaKey( $user_meta_key ) {
55 $this->avatar_user_meta_keys[] = strval( $user_meta_key );
56 }
57
58 /**
59 * Remove a previously added meta key
60 *
61 * @param string $user_meta_key
62 * @return void
63 */
64 public function removeUserMetaKey( $user_meta_key ) {
65 $filter = function( $meta_key ) use ( $user_meta_key ) {
66 return $meta_key !== $user_meta_key;
67 };
68 $this->avatar_user_meta_keys = array_filter( $this->avatar_user_meta_keys, $filter );
69 }
70
71 /**
72 * Converts an id_or_email to an ID if possible.
73 *
74 * @param integer|string|WP_Comment $id_or_email
75 * @return integer|string
76 */
77 protected function idOrEmailToId( $id_or_email ) {
78 if ( is_a( $id_or_email, WP_Comment::class ) ) {
79 return intval( $id_or_email->user_id );
80 }
81
82 if ( ! is_numeric( $id_or_email ) ) {
83 $user = get_user_by( 'email', $id_or_email );
84 if ( $user ) {
85 return intval( $user->ID );
86 }
87 }
88
89 return strval( $id_or_email );
90 }
91
92 /**
93 * Returns a size (name or [widget, height]) for the given avatar arguments.
94 *
95 * @param array $arguments
96 * @return array<integer>|string
97 */
98 protected function getSize( $arguments ) {
99 $size = 'full';
100
101 if ( ! empty( $arguments['width'] ) && ! empty( $arguments['height'] ) ) {
102 $size = [ intval( $arguments['width'] ), intval( $arguments['height'] ) ];
103 } elseif ( ! empty( $arguments['size'] ) ) {
104 $size = [ intval( $arguments['size'] ), intval( $arguments['size'] ) ];
105 }
106
107 return $size;
108 }
109
110 /**
111 * Get attachment fallback chain for the user avatar.
112 *
113 * @param integer $user_id
114 * @return array<integer>
115 */
116 protected function getAttachmentFallbackChain( $user_id ) {
117 $chain = [];
118
119 foreach ( $this->avatar_user_meta_keys as $user_meta_key ) {
120 $attachment_id = get_user_meta( $user_id, $user_meta_key, true );
121 if ( is_numeric( $attachment_id ) ) {
122 $chain[] = intval( $attachment_id );
123 }
124 }
125
126 if ( $this->default_avatar_id !== 0 ) {
127 $chain[] = $this->default_avatar_id;
128 }
129
130 return $chain;
131 }
132
133 /**
134 * Get avatar url
135 *
136 * @param integer $id
137 * @param array<integer>|string $size
138 * @return string|null
139 */
140 protected function getAvatarUrl( $id, $size ) {
141 $attachments_fallback_chain = $this->getAttachmentFallbackChain( $id );
142
143 foreach ( $attachments_fallback_chain as $attachment_id ) {
144 $image = wp_get_attachment_image_src( $attachment_id, $size );
145 if ( ! empty( $image ) ) {
146 return $image[0];
147 }
148 }
149
150 return null;
151 }
152
153 /**
154 * Filter an avatar url based on the default avatar attachment id and registered meta keys.
155 *
156 * @param string $url
157 * @param integer|string $id_or_email
158 * @param array $args
159 * @return string
160 */
161 public function filterAvatar( $url, $id_or_email, $args ) {
162 if ( ! empty( $args['force_default'] ) ) {
163 return $url;
164 }
165
166 if ( $this->default_avatar_id === 0 && empty( $this->avatar_user_meta_keys ) ) {
167 return $url;
168 }
169
170 $id = $this->idOrEmailToId( $id_or_email );
171
172 if ( is_numeric( $id ) ) {
173 $filtered_url = $this->getAvatarUrl( (int) $id, $this->getSize( $args ) );
174 if ( $filtered_url !== null ) {
175 $url = $filtered_url;
176 }
177 }
178
179 return $url;
180 }
181 }
182