diff --git a/composer.json b/composer.json index d21f81c..a279357 100644 --- a/composer.json +++ b/composer.json @@ -1,6 +1,9 @@ { "name": "wpackagist-plugin/wp-strava", "description": "Show your strava.com activity on your WordPress site.", + "homepage": "https://wordpress.org/plugins/wp-strava/", + "license": "GPL-2.0+", + "type": "wordpress-plugin", "require": { "php": ">=5.2.4" }, diff --git a/includes/WPStrava.php b/includes/WPStrava.php index edfd60e..56867dd 100644 --- a/includes/WPStrava.php +++ b/includes/WPStrava.php @@ -173,5 +173,6 @@ class WPStrava { new WPStrava_ActivityShortcode(); new WPStrava_LatestActivitiesShortcode(); new WPStrava_RouteShortcode(); + new WPStrava_LatestMapShortcode(); } } diff --git a/includes/WPStrava/LatestMap.php b/includes/WPStrava/LatestMap.php new file mode 100644 index 0000000..58b68f1 --- /dev/null +++ b/includes/WPStrava/LatestMap.php @@ -0,0 +1,129 @@ + WPStrava::get_instance()->settings->get_default_id(), + 'strava_club_id' => null, + 'distance_min' => 0, + ); + + $args = wp_parse_args( $args, $defaults ); + + $id = empty( $args['strava_club_id'] ) ? $args['client_id'] : $args['strava_club_id']; + + // Try our transient first. + $activity_transient = get_transient( 'strava_latest_map_activity_' . $id ); + $activity_option = get_option( 'strava_latest_map_activity_' . $id ); + + $activity = $activity_transient ? $activity_transient : null; + + if ( ! $activity || empty( $activity->map ) ) { + $strava_activity = WPStrava::get_instance()->activity; + + $activities = array(); + + try { + $activities = $strava_activity->get_activities( $args['client_id'], $args['strava_club_id'] ); + } catch ( WPStrava_Exception $e ) { + // If athlete_token is still set, warn about that first and foremost. + if ( isset( $args['athlete_token'] ) ) { + // Translators: Message shown when using deprecated athlete_token parameter. + echo wp_kses_post( __( 'The athlete_token parameter is deprecated as of WP-Strava version 2 and should be replaced with client_id.', 'wp-strava' ) ); + } else { + echo $e->to_html(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Debug only. + } + } + + if ( ! empty( $activities ) ) { + + if ( ! empty( $args['distance_min'] ) ) { + $activities = $strava_activity->get_activities_longer_than( $activities, $args['distance_min'] ); + } + + $activity = current( $activities ); + + // Compare transient (temporary storage) to option (more permanent). + // If the option isn't set or the transient is different, update the option. + if ( empty( $activity_option->id ) || $activity->id != $activity_option->id ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison + $build_new = true; + self::update_activity( $id, $activity ); + } + + // Update the transient if it needs updating. + if ( empty( $activity_transient->id ) || $activity->id != $activity_transient->id ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison + self::update_activity_transient( $id, $activity ); + } + } + } + + if ( $activity ) { + echo empty( $activity->map ) ? + // Translators: Text with activity name shown in place of image if not available. + esc_html( sprintf( __( 'Map not available for activity "%s"', 'wp-strava' ), $activity->name ) ) : + "" . + self::get_static_image( $id, $activity, $build_new ) . // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Image OK. + ''; + } + + } + + /** + * Get image for specific activity using Static Maps class. + * + * @author Justin Foell + * @param string $id Client ID or Club ID. + * @param object $activity Activity to get image for. + * @param boolean $build_new Whether to refresh the image from cache. + * @return string Image tag. + */ + private static function get_static_image( $id, $activity, $build_new ) { + $img = get_option( 'strava_latest_map_' . $id ); + + if ( $build_new || ! $img ) { + $img = WPStrava_StaticMap::get_image_tag( $activity ); + self::update_map( $id, $img ); + } + + return $img; + } + + /** + * Update map in option to cache. + * + * @author Justin Foell + * @since 1.2.0 + * @param string $id Client ID or Club ID. + * @param string $img Image tag. + */ + private static function update_map( $id, $img ) { + update_option( 'strava_latest_map_' . $id, $img ); + } + + /** + * Update activity in option to cache. + * + * @author Justin Foell + * @since 1.2.0 + * @param string $id Client ID or Club ID. + * @param object $activity stdClass Strava activity object. + */ + private static function update_activity( $id, $activity ) { + update_option( 'strava_latest_map_activity_' . $id, $activity ); + } + + /** + * Update activity in transient to cache. + * + * @author Justin Foell + * @since 1.2.0 + * @param string $id CLient ID or Club ID. + * @param object $activity stdClass Strava activity object. + */ + private static function update_activity_transient( $id, $activity ) { + set_transient( 'strava_latest_map_activity_' . $id, $activity, HOUR_IN_SECONDS ); + } +} diff --git a/includes/WPStrava/LatestMapShortcode.php b/includes/WPStrava/LatestMapShortcode.php new file mode 100644 index 0000000..69464bc --- /dev/null +++ b/includes/WPStrava/LatestMapShortcode.php @@ -0,0 +1,38 @@ + + * @since 2.0.1 + */ +class WPStrava_LatestMapShortcode { + + /** + * Constructor. + * + * @author Justin Foell + * @since 2.0.1 + */ + public function __construct() { + add_shortcode( 'latest_map', array( $this, 'handler' ) ); + } + /** + * Shortcode handler for [latest_map]. + * + * [latest_map som=metric distance_min=10 client_id=xxx|strava_club_id=yyy] + * + * @param array $atts Array of attributes (client_id, som, etc.). + * @return string Shortcode output + * @author Justin Foell + * @since 2.0.1 + */ + public function handler( $atts ) { + return WPStrava_LatestMap::get_map_html( $atts ); + } + +} diff --git a/includes/WPStrava/LatestMapWidget.php b/includes/WPStrava/LatestMapWidget.php index 3f8922e..630ce19 100644 --- a/includes/WPStrava/LatestMapWidget.php +++ b/includes/WPStrava/LatestMapWidget.php @@ -24,30 +24,30 @@ class WPStrava_LatestMapWidget extends WP_Widget { ?>

-

- - $nickname ) : ?> - +

-

- - + +

settings->get_default_id(); - $distance_min = empty( $instance['distance_min'] ) ? 0 : absint( $instance['distance_min'] ); - $strava_club_id = empty( $instance['strava_club_id'] ) ? null : $instance['strava_club_id']; - $build_new = false; + $title = apply_filters( 'widget_title', empty( $instance['title'] ) ? __( 'Latest Activity Map', 'wp-strava' ) : $instance['title'] ); - $id = empty( $strava_club_id ) ? $client_id : $strava_club_id; - - // Try our transient first. - $activity_transient = get_transient( 'strava_latest_map_activity_' . $id ); - $activity_option = get_option( 'strava_latest_map_activity_' . $id ); - - $activity = $activity_transient ? $activity_transient : null; + $activities_args = array( + 'client_id' => isset( $instance['client_id'] ) ? $instance['client_id'] : null, + 'strava_club_id' => isset( $instance['strava_club_id'] ) ? $instance['strava_club_id'] : null, + 'distance_min' => isset( $instance['distance_min'] ) ? absint( $instance['distance_min'] ) : 0, + ); + // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped -- Widget OK. echo $args['before_widget']; if ( $title ) { echo $args['before_title'] . $title . $args['after_title']; } - - if ( ! $activity || empty( $activity->map ) ) { - $strava_activity = WPStrava::get_instance()->activity; - - $activities = array(); - - try { - $activities = $strava_activity->get_activities( $client_id, $strava_club_id ); - } catch ( WPStrava_Exception $e ) { - // If athlete_token is still set, warn about that first and foremost. - if ( isset( $instance['athlete_token'] ) ) { - // Translators: Message shown when using deprecated athlete_token parameter. - echo wp_kses_post( __( 'The athlete_token parameter is deprecated as of WP-Strava version 2 and should be replaced with client_id.', 'wp-strava' ) ); - } else { - echo $e->to_html(); - } - } - - if ( ! empty( $activities ) ) { - - if ( ! empty( $distance_min ) ) { - $activities = $strava_activity->get_activities_longer_than( $activities, $distance_min ); - } - - $activity = current( $activities ); - - // Compare transient (temporary storage) to option (more permanent). - // If the option isn't set or the transient is different, update the option. - if ( empty( $activity_option->id ) || $activity->id != $activity_option->id ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison - $build_new = true; - $this->update_activity( $id, $activity ); - } - - // Update the transient if it needs updating. - if ( empty( $activity_transient->id ) || $activity->id != $activity_transient->id ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison - $this->update_activity_transient( $id, $activity ); - } - } - } - - if ( $activity ) { - echo empty( $activity->map ) ? - // Translators: Text with activity name shown in place of image if not available. - sprintf( __( 'Map not available for activity "%s"', 'wp-strava' ), $activity->name ) : - "" . - $this->get_static_image( $id, $activity, $build_new ) . - ''; - } + echo WPStrava_LatestMap::get_map_html( $activities_args ); echo $args['after_widget']; - } - - /** - * Get image for specific activity using Static Maps class. - * - * @author Justin Foell - * @param string $id Client ID or Club ID. - * @param object $activity Activity to get image for. - * @param boolean $build_new Whether to refresh the image from cache. - * @return string Image tag. - */ - private function get_static_image( $id, $activity, $build_new ) { - $img = get_option( 'strava_latest_map_' . $id ); - - if ( $build_new || ! $img ) { - $img = WPStrava_StaticMap::get_image_tag( $activity ); - $this->update_map( $id, $img ); - } - - return $img; - } - - /** - * Update map in option to cache. - * - * @author Justin Foell - * @since 1.2.0 - * @param string $id Client ID or Club ID. - * @param string $img Image tag. - */ - private function update_map( $id, $img ) { - update_option( 'strava_latest_map_' . $id, $img ); - } - - /** - * Update activity in option to cache. - * - * @author Justin Foell - * @since 1.2.0 - * @param string $id Client ID or Club ID. - * @param object $activity stdClass Strava activity object. - */ - private function update_activity( $id, $activity ) { - update_option( 'strava_latest_map_activity_' . $id, $activity ); - } - - /** - * Update activity in transient to cache. - * - * @author Justin Foell - * @since 1.2.0 - * @param string $id CLient ID or Club ID. - * @param object $activity stdClass Strava activity object. - */ - private function update_activity_transient( $id, $activity ) { - set_transient( 'strava_latest_map_activity_' . $id, $activity, HOUR_IN_SECONDS ); + // phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped } } diff --git a/readme.txt b/readme.txt index e5553d9..c142d8c 100755 --- a/readme.txt +++ b/readme.txt @@ -92,6 +92,11 @@ WP-Strava caches activity for one hour so your site doesn't hit the Strava API o == Changelog == += 2.0.1 = + +Added latest_map shortcode https://wordpress.org/support/topic/show-latest-map-not-in-widget/ + + = 2.0.0 = Added new Strava "refresh tokens" ala https://developers.strava.com/docs/oauth-updates/#migration-instructions