Edit File by line
/home/zeestwma/richards.../wp-conte.../plugins/jetpack/modules
File: gravatar-hovercards.php
<?php
[0] Fix | Delete
/**
[1] Fix | Delete
* Module Name: Gravatar Hovercards
[2] Fix | Delete
* Module Description: Show a user’s Gravatar profile when visitors hover over their name or image.
[3] Fix | Delete
* Sort Order: 11
[4] Fix | Delete
* Recommendation Order: 13
[5] Fix | Delete
* First Introduced: 1.1
[6] Fix | Delete
* Requires Connection: No
[7] Fix | Delete
* Auto Activate: No
[8] Fix | Delete
* Module Tags: Social, Appearance
[9] Fix | Delete
* Feature: Appearance
[10] Fix | Delete
* Additional Search Queries: gravatar, hovercards
[11] Fix | Delete
*
[12] Fix | Delete
* @package automattic/jetpack
[13] Fix | Delete
*/
[14] Fix | Delete
[15] Fix | Delete
if ( ! defined( 'ABSPATH' ) ) {
[16] Fix | Delete
exit( 0 );
[17] Fix | Delete
}
[18] Fix | Delete
[19] Fix | Delete
define( 'GROFILES__CACHE_BUSTER', gmdate( 'YW' ) );
[20] Fix | Delete
[21] Fix | Delete
/**
[22] Fix | Delete
* Actions that are run on init.
[23] Fix | Delete
*/
[24] Fix | Delete
function grofiles_hovercards_init() {
[25] Fix | Delete
add_filter( 'get_avatar', 'grofiles_get_avatar', 10, 2 );
[26] Fix | Delete
add_action( 'wp_enqueue_scripts', 'grofiles_attach_cards' );
[27] Fix | Delete
add_action( 'wp_footer', 'grofiles_extra_data' );
[28] Fix | Delete
add_action( 'admin_init', 'grofiles_add_settings' );
[29] Fix | Delete
[30] Fix | Delete
add_action( 'load-index.php', 'grofiles_admin_cards' );
[31] Fix | Delete
add_action( 'load-users.php', 'grofiles_admin_cards' );
[32] Fix | Delete
add_action( 'load-edit-comments.php', 'grofiles_admin_cards' );
[33] Fix | Delete
add_action( 'load-options-discussion.php', 'grofiles_admin_cards_forced' );
[34] Fix | Delete
[35] Fix | Delete
add_filter( 'jetpack_module_configuration_url_gravatar-hovercards', 'gravatar_hovercards_configuration_url' );
[36] Fix | Delete
[37] Fix | Delete
add_filter( 'get_comment_author_url', 'grofiles_amp_comment_author_url', 10, 2 );
[38] Fix | Delete
}
[39] Fix | Delete
[40] Fix | Delete
/**
[41] Fix | Delete
* Set configuration page URL.
[42] Fix | Delete
*/
[43] Fix | Delete
function gravatar_hovercards_configuration_url() {
[44] Fix | Delete
return admin_url( 'options-discussion.php#show_avatars' );
[45] Fix | Delete
}
[46] Fix | Delete
[47] Fix | Delete
add_action( 'jetpack_modules_loaded', 'grofiles_hovercards_init' );
[48] Fix | Delete
[49] Fix | Delete
/* Hovercard Settings */
[50] Fix | Delete
[51] Fix | Delete
/**
[52] Fix | Delete
* Adds Gravatar Hovercard setting
[53] Fix | Delete
*
[54] Fix | Delete
* @todo - always print HTML, hide via CSS/JS if !show_avatars
[55] Fix | Delete
*/
[56] Fix | Delete
function grofiles_add_settings() {
[57] Fix | Delete
if ( ! get_option( 'show_avatars' ) ) {
[58] Fix | Delete
return;
[59] Fix | Delete
}
[60] Fix | Delete
[61] Fix | Delete
add_settings_field( 'gravatar_disable_hovercards', __( 'Gravatar Hovercards', 'jetpack' ), 'grofiles_setting_callback', 'discussion', 'avatars' );
[62] Fix | Delete
register_setting( 'discussion', 'gravatar_disable_hovercards', 'grofiles_hovercard_option_sanitize' );
[63] Fix | Delete
}
[64] Fix | Delete
[65] Fix | Delete
/**
[66] Fix | Delete
* HTML for Gravatar Hovercard setting
[67] Fix | Delete
*/
[68] Fix | Delete
function grofiles_setting_callback() {
[69] Fix | Delete
global $current_user;
[70] Fix | Delete
[71] Fix | Delete
$option = get_option( 'gravatar_disable_hovercards' );
[72] Fix | Delete
printf(
[73] Fix | Delete
"<label id='gravatar-hovercard-options'><input %s name='gravatar_disable_hovercards' id='gravatar_disable_hovercards' type='checkbox' value='enabled' class='code'/>%s</label>",
[74] Fix | Delete
checked( $option, 'enabled', false ),
[75] Fix | Delete
esc_html__( 'View people\'s profiles when you mouse over their Gravatars', 'jetpack' )
[76] Fix | Delete
);
[77] Fix | Delete
[78] Fix | Delete
?>
[79] Fix | Delete
<style type="text/css">
[80] Fix | Delete
#grav-profile-example img {
[81] Fix | Delete
float: left;
[82] Fix | Delete
}
[83] Fix | Delete
#grav-profile-example span {
[84] Fix | Delete
padding: 0 1em;
[85] Fix | Delete
}
[86] Fix | Delete
</style>
[87] Fix | Delete
<script type="text/javascript">
[88] Fix | Delete
// <![CDATA[
[89] Fix | Delete
jQuery( function($) {
[90] Fix | Delete
var tr = $( '#gravatar_disable_hovercards' ).change( function() {
[91] Fix | Delete
if ( $( this ).is( ':checked' ) ) {
[92] Fix | Delete
$( '#grav-profile-example' ).slideDown( 'fast' );
[93] Fix | Delete
} else {
[94] Fix | Delete
$( '#grav-profile-example' ).slideUp( 'fast' );
[95] Fix | Delete
}
[96] Fix | Delete
} ).parents( 'tr' );
[97] Fix | Delete
var ftr = tr.parents( 'table' ).find( 'tr:first' );
[98] Fix | Delete
if ( ftr.length && !ftr.find( '#gravatar_disable_hovercards' ).length ) {
[99] Fix | Delete
ftr.after( tr );
[100] Fix | Delete
}
[101] Fix | Delete
} );
[102] Fix | Delete
// ]]>
[103] Fix | Delete
</script>
[104] Fix | Delete
<p id="grav-profile-example" class="hide-if-no-js"
[105] Fix | Delete
<?php
[106] Fix | Delete
if ( 'disabled' === $option ) {
[107] Fix | Delete
echo ' style="display:none"';}
[108] Fix | Delete
?>
[109] Fix | Delete
>
[110] Fix | Delete
<?php echo get_avatar( $current_user->ID, 64 ); ?> <span><?php esc_html_e( 'Put your mouse over your Gravatar to check out your profile.', 'jetpack' ); ?> <br class="clear" /></span></p>
[111] Fix | Delete
<?php
[112] Fix | Delete
}
[113] Fix | Delete
[114] Fix | Delete
/**
[115] Fix | Delete
* Sanitation filter for Gravatar Hovercard setting
[116] Fix | Delete
*
[117] Fix | Delete
* @param string $val Disabled or enabled.
[118] Fix | Delete
*/
[119] Fix | Delete
function grofiles_hovercard_option_sanitize( $val ) {
[120] Fix | Delete
if ( 'disabled' === $val ) {
[121] Fix | Delete
return $val;
[122] Fix | Delete
}
[123] Fix | Delete
[124] Fix | Delete
return $val ? 'enabled' : 'disabled';
[125] Fix | Delete
}
[126] Fix | Delete
[127] Fix | Delete
/* Hovercard Display */
[128] Fix | Delete
[129] Fix | Delete
/**
[130] Fix | Delete
* Stores the gravatars' users that need extra profile data attached.
[131] Fix | Delete
*
[132] Fix | Delete
* Getter/Setter
[133] Fix | Delete
*
[134] Fix | Delete
* @param int|string|null $author Setter: User ID or email address. Getter: null.
[135] Fix | Delete
*
[136] Fix | Delete
* @return mixed Setter: void. Getter: array of user IDs and email addresses.
[137] Fix | Delete
*/
[138] Fix | Delete
function grofiles_gravatars_to_append( $author = null ) {
[139] Fix | Delete
static $authors = array();
[140] Fix | Delete
[141] Fix | Delete
// Get.
[142] Fix | Delete
if ( $author === null ) {
[143] Fix | Delete
return array_keys( $authors );
[144] Fix | Delete
}
[145] Fix | Delete
[146] Fix | Delete
// Set.
[147] Fix | Delete
[148] Fix | Delete
if ( is_numeric( $author ) ) {
[149] Fix | Delete
$author = (int) $author;
[150] Fix | Delete
}
[151] Fix | Delete
[152] Fix | Delete
$authors[ $author ] = true;
[153] Fix | Delete
}
[154] Fix | Delete
[155] Fix | Delete
/**
[156] Fix | Delete
* In AMP, override the comment URL to allow for interactivity without
[157] Fix | Delete
* navigating to a new page
[158] Fix | Delete
*
[159] Fix | Delete
* @param string $url The comment author's URL.
[160] Fix | Delete
* @param int $id The comment ID.
[161] Fix | Delete
*
[162] Fix | Delete
* @return string The adjusted URL
[163] Fix | Delete
*/
[164] Fix | Delete
function grofiles_amp_comment_author_url( $url, $id ) {
[165] Fix | Delete
if ( 'comment' === get_comment_type( $id ) && class_exists( 'Jetpack_AMP_Support' ) && Jetpack_AMP_Support::is_amp_request() ) {
[166] Fix | Delete
// @todo Disabling the comment author link in this way is not ideal since clicking the link does not cause the lightbox to open in the same way as clicking the gravatar. Likely get_comment_author_url_link should be used instead so that the href attribute can be replaced with an `on` attribute that activates the gallery.
[167] Fix | Delete
return '#!';
[168] Fix | Delete
}
[169] Fix | Delete
[170] Fix | Delete
return $url;
[171] Fix | Delete
}
[172] Fix | Delete
[173] Fix | Delete
/**
[174] Fix | Delete
* Stores the user ID or email address for each gravatar generated.
[175] Fix | Delete
*
[176] Fix | Delete
* Attached to the 'get_avatar' filter.
[177] Fix | Delete
*
[178] Fix | Delete
* @param string $avatar The <img/> element of the avatar.
[179] Fix | Delete
* @param mixed $author User ID, email address, user login, comment object, user object, post object.
[180] Fix | Delete
*
[181] Fix | Delete
* @return string The <img/> element of the avatar.
[182] Fix | Delete
*/
[183] Fix | Delete
function grofiles_get_avatar( $avatar, $author ) {
[184] Fix | Delete
$is_amp = class_exists( 'Jetpack_AMP_Support' ) && Jetpack_AMP_Support::is_amp_request();
[185] Fix | Delete
[186] Fix | Delete
if ( is_numeric( $author ) ) {
[187] Fix | Delete
grofiles_gravatars_to_append( $author );
[188] Fix | Delete
} elseif ( is_string( $author ) ) {
[189] Fix | Delete
if ( str_contains( $author, '@' ) ) {
[190] Fix | Delete
grofiles_gravatars_to_append( $author );
[191] Fix | Delete
} else {
[192] Fix | Delete
$user = get_user_by( 'slug', $author );
[193] Fix | Delete
if ( $user ) {
[194] Fix | Delete
grofiles_gravatars_to_append( $user->ID );
[195] Fix | Delete
}
[196] Fix | Delete
}
[197] Fix | Delete
} elseif ( isset( $author->comment_type ) ) {
[198] Fix | Delete
if ( $is_amp ) {
[199] Fix | Delete
if ( 1 === preg_match( '/avatar\/([a-zA-Z0-9]+)\?/', $avatar, $email_hash ) ) {
[200] Fix | Delete
$email_hash = $email_hash[1];
[201] Fix | Delete
$cache_group = 'gravatar_profiles_';
[202] Fix | Delete
$cache_key = 'gravatar_profile_' . $email_hash;
[203] Fix | Delete
[204] Fix | Delete
$response_body = wp_cache_get( $cache_key, $cache_group );
[205] Fix | Delete
if ( false === $response_body ) {
[206] Fix | Delete
$response = wp_remote_get( esc_url_raw( 'https://gravatar.com/' . $email_hash . '.json' ) );
[207] Fix | Delete
if ( is_array( $response ) && ! is_wp_error( $response ) ) {
[208] Fix | Delete
$response_body = json_decode( $response['body'] );
[209] Fix | Delete
wp_cache_set( $cache_key, $response_body, $cache_group, 60 * MINUTE_IN_SECONDS );
[210] Fix | Delete
}
[211] Fix | Delete
}
[212] Fix | Delete
[213] Fix | Delete
$profile = isset( $response_body->entry[0] ) ? $response_body->entry[0] : null;
[214] Fix | Delete
$display_name = isset( $profile->displayName ) ? $profile->displayName : ''; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
[215] Fix | Delete
$location = isset( $profile->currentLocation ) ? $profile->currentLocation : ''; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
[216] Fix | Delete
$description = isset( $profile->aboutMe ) ? $profile->aboutMe : ''; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
[217] Fix | Delete
[218] Fix | Delete
$avatar = '
[219] Fix | Delete
<figure data-amp-lightbox="true">
[220] Fix | Delete
' . $avatar . '
[221] Fix | Delete
<figcaption>
[222] Fix | Delete
' . esc_html( $display_name ) . ( ! empty( $location ) ? ' – ' . esc_html( $location ) : '' ) . ( ! empty( $description ) ? ' – ' . esc_html( $description ) : '' ) . '
[223] Fix | Delete
</figcaption>
[224] Fix | Delete
</figure>
[225] Fix | Delete
';
[226] Fix | Delete
}
[227] Fix | Delete
[228] Fix | Delete
return $avatar;
[229] Fix | Delete
}
[230] Fix | Delete
[231] Fix | Delete
if ( '' !== $author->comment_type && 'comment' !== $author->comment_type ) {
[232] Fix | Delete
return $avatar;
[233] Fix | Delete
}
[234] Fix | Delete
if ( $author->user_id ) {
[235] Fix | Delete
grofiles_gravatars_to_append( $author->user_id );
[236] Fix | Delete
} else {
[237] Fix | Delete
grofiles_gravatars_to_append( $author->comment_author_email );
[238] Fix | Delete
}
[239] Fix | Delete
} elseif ( isset( $author->user_login ) ) {
[240] Fix | Delete
grofiles_gravatars_to_append( $author->ID );
[241] Fix | Delete
} elseif ( isset( $author->post_author ) ) {
[242] Fix | Delete
grofiles_gravatars_to_append( $author->post_author );
[243] Fix | Delete
}
[244] Fix | Delete
[245] Fix | Delete
return $avatar;
[246] Fix | Delete
}
[247] Fix | Delete
[248] Fix | Delete
/**
[249] Fix | Delete
* Loads Gravatar Hovercard script.
[250] Fix | Delete
*
[251] Fix | Delete
* @todo is_singular() only?
[252] Fix | Delete
*/
[253] Fix | Delete
function grofiles_attach_cards() {
[254] Fix | Delete
[255] Fix | Delete
// Is the display of Avatars disabled?
[256] Fix | Delete
if ( ! get_option( 'show_avatars' ) ) {
[257] Fix | Delete
return;
[258] Fix | Delete
}
[259] Fix | Delete
[260] Fix | Delete
// Is the display of Gravatar Hovercards disabled?
[261] Fix | Delete
if ( 'disabled' === Jetpack_Options::get_option_and_ensure_autoload( 'gravatar_disable_hovercards', '0' ) ) {
[262] Fix | Delete
return;
[263] Fix | Delete
}
[264] Fix | Delete
[265] Fix | Delete
if ( class_exists( 'Jetpack_AMP_Support' ) && Jetpack_AMP_Support::is_amp_request() ) {
[266] Fix | Delete
wp_enqueue_style( 'gravatar-hovercard-style', plugins_url( '/gravatar/gravatar-hovercards-amp.css', __FILE__ ), array(), JETPACK__VERSION );
[267] Fix | Delete
} else {
[268] Fix | Delete
wp_enqueue_script( 'grofiles-cards', 'https://secure.gravatar.com/js/gprofiles.js', array(), GROFILES__CACHE_BUSTER, true );
[269] Fix | Delete
wp_enqueue_script( 'wpgroho', plugins_url( 'wpgroho.js', __FILE__ ), array( 'grofiles-cards' ), JETPACK__VERSION, true );
[270] Fix | Delete
if ( is_user_logged_in() ) {
[271] Fix | Delete
$cu = wp_get_current_user();
[272] Fix | Delete
$my_hash = md5( $cu->user_email );
[273] Fix | Delete
} elseif ( ! empty( $_COOKIE[ 'comment_author_email_' . COOKIEHASH ] ) ) {
[274] Fix | Delete
$my_hash = md5( filter_var( wp_unslash( $_COOKIE[ 'comment_author_email_' . COOKIEHASH ] ) ) );
[275] Fix | Delete
} else {
[276] Fix | Delete
$my_hash = '';
[277] Fix | Delete
}
[278] Fix | Delete
wp_localize_script( 'wpgroho', 'WPGroHo', compact( 'my_hash' ) );
[279] Fix | Delete
}
[280] Fix | Delete
}
[281] Fix | Delete
/**
[282] Fix | Delete
* Add hovercards on Discussion settings panel.
[283] Fix | Delete
*/
[284] Fix | Delete
function grofiles_attach_cards_forced() {
[285] Fix | Delete
add_filter( 'pre_option_gravatar_disable_hovercards', 'grofiles_force_gravatar_enable_hovercards' );
[286] Fix | Delete
grofiles_attach_cards();
[287] Fix | Delete
}
[288] Fix | Delete
/**
[289] Fix | Delete
* Set hovercards as enabled on Discussion settings panel.
[290] Fix | Delete
*/
[291] Fix | Delete
function grofiles_force_gravatar_enable_hovercards() {
[292] Fix | Delete
return 'enabled';
[293] Fix | Delete
}
[294] Fix | Delete
/**
[295] Fix | Delete
* Add script to admin footer on Discussion settings panel.
[296] Fix | Delete
*/
[297] Fix | Delete
function grofiles_admin_cards_forced() {
[298] Fix | Delete
add_action( 'admin_footer', 'grofiles_attach_cards_forced' );
[299] Fix | Delete
}
[300] Fix | Delete
/**
[301] Fix | Delete
* Add script to admin footer.
[302] Fix | Delete
*/
[303] Fix | Delete
function grofiles_admin_cards() {
[304] Fix | Delete
add_action( 'admin_footer', 'grofiles_attach_cards' );
[305] Fix | Delete
}
[306] Fix | Delete
/**
[307] Fix | Delete
* Dequeue the FE assets when there are no gravatars on the page to be displayed.
[308] Fix | Delete
*/
[309] Fix | Delete
function grofiles_extra_data() {
[310] Fix | Delete
$authors = grofiles_gravatars_to_append();
[311] Fix | Delete
[312] Fix | Delete
if ( ! $authors ) {
[313] Fix | Delete
wp_dequeue_script( 'grofiles-cards' );
[314] Fix | Delete
wp_dequeue_script( 'wpgroho' );
[315] Fix | Delete
} else {
[316] Fix | Delete
?>
[317] Fix | Delete
<div style="display:none">
[318] Fix | Delete
<?php
[319] Fix | Delete
foreach ( $authors as $author ) {
[320] Fix | Delete
grofiles_hovercards_data_html( $author );
[321] Fix | Delete
}
[322] Fix | Delete
?>
[323] Fix | Delete
</div>
[324] Fix | Delete
<?php
[325] Fix | Delete
}
[326] Fix | Delete
}
[327] Fix | Delete
[328] Fix | Delete
/**
[329] Fix | Delete
* Echoes the data from grofiles_hovercards_data() as HTML elements.
[330] Fix | Delete
*
[331] Fix | Delete
* @since 5.5.0 Add support for a passed WP_User object
[332] Fix | Delete
*
[333] Fix | Delete
* @param int|string|WP_User $author User ID, email address, or a WP_User object.
[334] Fix | Delete
*/
[335] Fix | Delete
function grofiles_hovercards_data_html( $author ) {
[336] Fix | Delete
$data = grofiles_hovercards_data( $author );
[337] Fix | Delete
$hash = '';
[338] Fix | Delete
if ( is_numeric( $author ) ) {
[339] Fix | Delete
$user = get_userdata( $author );
[340] Fix | Delete
if ( $user ) {
[341] Fix | Delete
$hash = md5( $user->user_email );
[342] Fix | Delete
}
[343] Fix | Delete
} elseif ( is_email( $author ) ) {
[344] Fix | Delete
$hash = md5( $author );
[345] Fix | Delete
} elseif ( is_a( $author, 'WP_User' ) ) {
[346] Fix | Delete
$hash = md5( $author->user_email );
[347] Fix | Delete
}
[348] Fix | Delete
[349] Fix | Delete
if ( ! $hash ) {
[350] Fix | Delete
return;
[351] Fix | Delete
}
[352] Fix | Delete
?>
[353] Fix | Delete
<div class="grofile-hash-map-<?php echo esc_attr( $hash ); ?>">
[354] Fix | Delete
<?php foreach ( $data as $key => $value ) : ?>
[355] Fix | Delete
<span class="<?php echo esc_attr( $key ); ?>"><?php echo esc_html( $value ); ?></span>
[356] Fix | Delete
<?php endforeach; ?>
[357] Fix | Delete
</div>
[358] Fix | Delete
<?php
[359] Fix | Delete
}
[360] Fix | Delete
[361] Fix | Delete
/* API */
[362] Fix | Delete
[363] Fix | Delete
/**
[364] Fix | Delete
* Returns the PHP callbacks for data sources.
[365] Fix | Delete
*
[366] Fix | Delete
* 'grofiles_hovercards_data_callbacks' filter
[367] Fix | Delete
*
[368] Fix | Delete
* @return array<string,callable> ( data_key => data_callback, ... )
[369] Fix | Delete
*/
[370] Fix | Delete
function grofiles_hovercards_data_callbacks() {
[371] Fix | Delete
/**
[372] Fix | Delete
* Filter the Gravatar Hovercard PHP callbacks.
[373] Fix | Delete
*
[374] Fix | Delete
* @module gravatar-hovercards
[375] Fix | Delete
*
[376] Fix | Delete
* @since 1.1.0
[377] Fix | Delete
*
[378] Fix | Delete
* @param array $args Array of data callbacks.
[379] Fix | Delete
*/
[380] Fix | Delete
return apply_filters( 'grofiles_hovercards_data_callbacks', array() );
[381] Fix | Delete
}
[382] Fix | Delete
[383] Fix | Delete
/**
[384] Fix | Delete
* Keyed JSON object containing all profile data provided by registered callbacks
[385] Fix | Delete
*
[386] Fix | Delete
* @param int|string $author User ID or email address.
[387] Fix | Delete
*
[388] Fix | Delete
* @return array<string,mixed> ( data_key => data, ... )
[389] Fix | Delete
*/
[390] Fix | Delete
function grofiles_hovercards_data( $author ) {
[391] Fix | Delete
$r = array();
[392] Fix | Delete
foreach ( grofiles_hovercards_data_callbacks() as $key => $callback ) {
[393] Fix | Delete
if ( ! is_callable( $callback ) ) {
[394] Fix | Delete
continue;
[395] Fix | Delete
}
[396] Fix | Delete
$data = call_user_func( $callback, $author, $key );
[397] Fix | Delete
if ( $data !== null ) {
[398] Fix | Delete
$r[ $key ] = $data;
[399] Fix | Delete
}
[400] Fix | Delete
}
[401] Fix | Delete
[402] Fix | Delete
return $r;
[403] Fix | Delete
}
[404] Fix | Delete
[405] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function