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