PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 13.5
Jetpack – WP Security, Backup, Speed, & Growth v13.5
16.2-beta 12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 All 501 releases
jetpack / modules / shortcodes / gravatar.php
gravatar.php
219 lines 6.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Gravatar shortcode for avatar and profile.
4 *
5 * Usage:
6 *
7 * [gravatar email="user@example.org" size="48"]
8 * [gravatar_profile who="user@example.org"]
9 *
10 * @package automattic/jetpack
11 */
12
13 add_shortcode( 'gravatar', 'jetpack_gravatar_shortcode' );
14 add_shortcode( 'gravatar_profile', 'jetpack_gravatar_profile_shortcode' );
15
16 /**
17 * Get gravatar using the email provided at the specified size.
18 *
19 * @since 4.5.0
20 *
21 * @param array $atts Shortcode attributes.
22 *
23 * @return bool|string
24 */
25 function jetpack_gravatar_shortcode( $atts ) {
26 $atts = shortcode_atts(
27 array(
28 'email' => '',
29 'size' => 96,
30 ),
31 $atts
32 );
33
34 if ( empty( $atts['email'] ) || ! is_email( $atts['email'] ) ) {
35 return false;
36 }
37
38 $atts['size'] = (int) $atts['size'];
39 if ( 0 > $atts['size'] ) {
40 $atts['size'] = 96;
41 }
42
43 return get_avatar( $atts['email'], $atts['size'] );
44 }
45
46 /**
47 * Display Gravatar profile
48 *
49 * @since 4.5.0
50 *
51 * @param array $atts Shortcode attributes.
52 *
53 * @uses shortcode_atts()
54 * @uses get_user_by()
55 * @uses is_email()
56 * @uses sanitize_email()
57 * @uses sanitize_user()
58 * @uses set_url_scheme()
59 * @uses wpcom_get_avatar_url()
60 * @uses get_user_attribute()
61 * @uses esc_url()
62 * @uses esc_html()
63 * @uses _e()
64 *
65 * @return string
66 */
67 function jetpack_gravatar_profile_shortcode( $atts ) {
68 // Give each use of the shortcode a unique ID.
69 static $instance = 0;
70
71 // Process passed attributes.
72 $atts = shortcode_atts(
73 array(
74 'who' => null,
75 ),
76 $atts,
77 'jetpack_gravatar_profile'
78 );
79
80 // Can specify username, user ID, or email address.
81 if ( is_numeric( $atts['who'] ) ) {
82 $user_id = (int) $atts['who'];
83 if ( ! is_user_member_of_blog( $user_id, get_current_blog_id() ) ) {
84 // Bail if the user id is not a member of this site.
85 return false;
86 }
87 $user = get_user_by( 'id', $user_id );
88 } elseif ( is_email( $atts['who'] ) ) {
89 $user = get_user_by( 'email', sanitize_email( $atts['who'] ) );
90 } elseif ( is_string( $atts['who'] ) ) {
91 $user = get_user_by( 'login', sanitize_user( $atts['who'] ) );
92 } else {
93 $user = false;
94 }
95
96 // Bail if we don't have a user.
97 if ( false === $user ) {
98 return false;
99 }
100
101 $hashed_email = hash( 'sha256', strtolower( trim( $user->user_email ) ) );
102 $cache_key = 'jetpack_gravatar_profile_' . $hashed_email;
103 $profile = get_transient( $cache_key );
104
105 if ( empty( $profile ) ) {
106 $profile_url = sprintf(
107 'https://secure.gravatar.com/%s.json',
108 $hashed_email
109 );
110
111 $response = wp_remote_get(
112 esc_url_raw( $profile_url ),
113 array( 'User-Agent' => 'Jetpack Plugin Gravatar Profile Shortcode' )
114 );
115 $response_code = wp_remote_retrieve_response_code( $response );
116 $expire = 300; // Cache any errors for 5 minutes.
117 $profile = array();
118
119 if ( $response_code === 200 ) {
120 $profile = json_decode( wp_remote_retrieve_body( $response ), true );
121
122 if (
123 is_array( $profile )
124 && ! empty( $profile['entry'] )
125 && is_array( $profile['entry'] )
126 ) {
127 // Sucessfully fetched the profile. Cache for 15 minutes.
128 $expire = 900;
129 $profile = $profile['entry'][0];
130 }
131 }
132
133 set_transient( $cache_key, $profile, $expire );
134 }
135
136 // Fetching the profile returned an error. Bail.
137 if ( empty( $profile ) ) {
138 return false;
139 }
140
141 // Render the shortcode.
142 $gravatar_url = 'https://gravatar.com/' . $hashed_email;
143 $user_location = ! empty( $profile['currentLocation'] ) ? $profile['currentLocation'] : '';
144 $display_name = ! empty( $profile['displayName'] ) ? $profile['displayName'] : '';
145 $user_description = ! empty( $profile['aboutMe'] ) ? $profile['aboutMe'] : '';
146
147 if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) {
148 $gravatar_url = 'https://gravatar.com/' . $user->user_login;
149 $avatar_url = wpcom_get_avatar_url( $user->ID, 96 );
150 $avatar_url = $avatar_url[0];
151 } else {
152 $avatar_url = get_avatar_url( $user->user_email, array( 'size' => 96 ) );
153 }
154
155 ob_start();
156
157 if ( class_exists( 'Jetpack_AMP_Support' ) && Jetpack_AMP_Support::is_amp_request() ) {
158 wp_enqueue_style( 'gravatar-style', plugins_url( '/css/gravatar-amp.css', __FILE__ ), array(), JETPACK__VERSION );
159 } else {
160 ?>
161 <script type="text/javascript">
162 ( function() {
163 if ( null === document.getElementById( 'gravatar-profile-embed-styles' ) ) {
164 var headID = document.getElementsByTagName( 'head' )[0];
165 var styleNode = document.createElement( 'style' );
166 styleNode.type = 'text/css';
167 styleNode.id = 'gravatar-profile-embed-styles';
168
169 var gCSS = '.grofile-wrap { border: solid 1px #f0f0f1; padding: 10px; } .grofile { padding: 0 0 5px 0; } .grofile-left { float: left; display: block; width: 96px; margin-right: 15px; } .grofile .gravatar { margin-bottom: 5px; } .grofile-clear { clear: left; font-size: 1px; height: 1px; } .grofile ul li a { text-indent: -99999px; } .grofile .grofile-left a:hover { text-decoration: none !important; border: none !important; } .grofile-name { margin-top: 0; }';
170
171 if ( document.all ) {
172 styleNode.innerText = gCSS;
173 } else {
174 styleNode.textContent = gCSS;
175 }
176
177 headID.appendChild( styleNode );
178 }
179 } )();
180 </script>
181 <?php
182 }
183 ?>
184
185 <div class="grofile vcard" id="grofile-embed-<?php echo esc_attr( $instance ); ?>">
186 <div class="grofile-inner">
187 <div class="grofile-left">
188 <div class="grofile-img">
189 <a href="<?php echo esc_url( $gravatar_url ); ?>">
190 <img src="<?php echo esc_url( $avatar_url ); ?>" width="96" height="96" class="no-grav gravatar photo" />
191 </a>
192 </div>
193 </div>
194 <div class="grofile-right">
195 <p class="grofile-name fn">
196 <strong><?php echo esc_html( $display_name ); ?></strong>
197 <?php
198 if ( ! empty( $user_location ) ) :
199 ?>
200 <br><span class="grofile-location adr"><?php echo esc_html( $user_location ); ?></span><?php endif; ?>
201 </p>
202 <p class="grofile-bio">
203 <strong><?php esc_html_e( 'Bio:', 'jetpack' ); ?></strong> <?php echo wp_kses_post( $user_description ); ?>
204 </p>
205 <p class="grofile-view">
206 <a href="<?php echo esc_url( $gravatar_url ); ?>"><?php esc_html_e( 'View complete profile', 'jetpack' ); ?></a>
207 </p>
208 </div>
209 <span class="grofile-clear">&nbsp;</span>
210 </div>
211 </div>
212 <?php
213
214 // Increment and return the rendered profile.
215 ++$instance;
216
217 return ob_get_clean();
218 }
219