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..9925b3c
--- /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();
+ }
+ }
+
+ 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.
+ sprintf( __( 'Map not available for activity "%s"', 'wp-strava' ), $activity->name ) :
+ "" .
+ self::get_static_image( $id, $activity, $build_new ) .
+ '';
+ }
+
+ }
+
+ /**
+ * 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..7975faa 100644
--- a/includes/WPStrava/LatestMapWidget.php
+++ b/includes/WPStrava/LatestMapWidget.php
@@ -70,128 +70,19 @@ class WPStrava_LatestMapWidget extends WP_Widget {
*/
public function widget( $args, $instance ) {
- $title = apply_filters( 'widget_title', empty( $instance['title'] ) ? __( 'Latest Activity Map', 'wp-strava' ) : $instance['title'] );
- $client_id = isset( $instance['client_id'] ) ? $instance['client_id'] : WPStrava::get_instance()->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,
+ );
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 );
- }
}