PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 14.3.1
Jetpack – WP Security, Backup, Speed, & Growth v14.3.1
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 14.4.2 All 500 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