ay( 'jetpack-boost-action' => 'install', ), admin_url( 'admin.php?page=jetpack' ) ), 'jetpack-boost-install' ); } /** * A special filter used in the CTA of a JITM offering to activate the Jetpack Boost plugin. * * @return string The new CTA */ public static function jitm_jetpack_boost_activate() { return wp_nonce_url( add_query_arg( array( 'jetpack-boost-action' => 'activate', ), admin_url( 'admin.php?page=jetpack' ) ), 'jetpack-boost-install' ); } /** * Dismisses a JITM feature class so that it will no longer be shown. * * @param string $id The id of the JITM that was dismissed. * @param string $feature_class The feature class of the JITM that was dismissed. * * @return bool Always true. */ public function dismiss( $id, $feature_class ) { $this->tracking->record_user_event( 'jitm_dismiss_client', array( 'jitm_id' => $id, 'feature_class' => $feature_class, ) ); $this->save_dismiss( $feature_class ); return true; } /** * Asks the wpcom API for the current message to display keyed on query string and message path * * @param string $message_path The message path to ask for. * @param string $query The query string originally from the front end. * @param bool $full_jp_logo_exists If there is a full Jetpack logo already on the page. * * @return array The JITM's to show, or an empty array if there is nothing to show */ public function get_messages( $message_path, $query, $full_jp_logo_exists ) { // WooCommerce Services. add_filter( 'jitm_woocommerce_services_msg', array( $this, 'jitm_woocommerce_services_msg' ) ); add_filter( 'jitm_jetpack_woo_services_install', array( $this, 'jitm_jetpack_woo_services_install' ) ); add_filter( 'jitm_jetpack_woo_services_activate', array( $this, 'jitm_jetpack_woo_services_activate' ) ); // Creative Mail. add_filter( 'jitm_jetpack_creative_mail_install', array( $this, 'jitm_jetpack_creative_mail_install' ) ); add_filter( 'jitm_jetpack_creative_mail_activate', array( $this, 'jitm_jetpack_creative_mail_activate' ) ); // Jetpack Backup. add_filter( 'jitm_jetpack_backup_install', array( $this, 'jitm_jetpack_backup_install' ) ); add_filter( 'jitm_jetpack_backup_activate', array( $this, 'jitm_jetpack_backup_activate' ) ); // Jetpack Boost. add_filter( 'jitm_jetpack_boost_install', array( $this, 'jitm_jetpack_boost_install' ) ); add_filter( 'jitm_jetpack_boost_activate', array( $this, 'jitm_jetpack_boost_activate' ) ); $user = wp_get_current_user(); // Unauthenticated or invalid requests just bail. if ( ! $user ) { return array(); } $user_roles = implode( ',', $user->roles ); $site_id = \Jetpack_Options::get_option( 'id' ); // Build our jitm request. $path = add_query_arg( array( 'external_user_id' => urlencode_deep( $user->ID ), 'user_roles' => urlencode_deep( $user_roles ), 'query_string' => urlencode_deep( build_query( $query ) ), 'mobile_browser' => Device_Detection::is_smartphone() ? 1 : 0, '_locale' => get_user_locale(), ), sprintf( '/sites/%d/jitm/%s', $site_id, $message_path ) ); // Attempt to get from cache. $envelopes = get_transient( 'jetpack_jitm_' . substr( md5( $path ), 0, 31 ) ); // If something is in the cache and it was put in the cache after the last sync we care about, use it. $use_cache = false; /** * Filter to turn off jitm caching * * @since 1.1.0 * @since-jetpack 5.4.0 * * @param bool true Whether to cache just in time messages */ if ( apply_filters( 'jetpack_just_in_time_msg_cache', true ) ) { $use_cache = true; } if ( $use_cache ) { $last_sync = (int) get_transient( 'jetpack_last_plugin_sync' ); $from_cache = $envelopes && $last_sync > 0 && $last_sync < $envelopes['last_response_time']; } else { $from_cache = false; } // Otherwise, ask again. if ( ! $from_cache ) { $wpcom_response = Client::wpcom_json_api_request_as_blog( $path, '2', array( 'user_id' => $user->ID, 'user_roles' => implode( ',', $user->roles ), ), null, 'wpcom' ); // silently fail...might be helpful to track it? if ( is_wp_error( $wpcom_response ) ) { return array(); } $envelopes = json_decode( $wpcom_response['body'] ); if ( ! is_array( $envelopes ) ) { return array(); } $expiration = isset( $envelopes[0] ) ? $envelopes[0]->ttl : 300; // Do not cache if expiration is 0 or we're not using the cache. if ( 0 !== $expiration && $use_cache ) { $envelopes['last_response_time'] = time(); set_transient( 'jetpack_jitm_' . substr( md5( $path ), 0, 31 ), $envelopes, $expiration ); } } $hidden_jitms = \Jetpack_Options::get_option( 'hide_jitm' ); unset( $envelopes['last_response_time'] ); /** * Allow adding your own custom JITMs after a set of JITMs has been received. * * @since 1.1.0 * @since-jetpack 6.9.0 * @since-jetpack 8.3.0 - Added Message path. * * @param array $envelopes array of existing JITMs. * @param string $message_path The message path to ask for. */ $envelopes = apply_filters( 'jetpack_jitm_received_envelopes', $envelopes, $message_path ); foreach ( $envelopes as $idx => &$envelope ) { $dismissed_feature = isset( $hidden_jitms[ $envelope->feature_class ] ) && is_array( $hidden_jitms[ $envelope->feature_class ] ) ? $hidden_jitms[ $envelope->feature_class ] : null; // If the this feature class has been dismissed and the request has not passed the ttl, skip it as it's been dismissed. if ( is_array( $dismissed_feature ) && ( time() - $dismissed_feature['last_dismissal'] < $envelope->expires || $dismissed_feature['number'] >= $envelope->max_dismissal ) ) { unset( $envelopes[ $idx ] ); continue; } $this->tracking->record_user_event( 'jitm_view_client', array( 'jitm_id' => $envelope->id, 'jitm_message_path' => $message_path, ) ); $url_params = array( 'u' => $user->ID, ); // Get affiliate code and add it to the array of URL parameters. $aff = Partner::init()->get_partner_code( Partner::AFFILIATE_CODE ); if ( '' !== $aff ) { $url_params['aff'] = $aff; } // Check if the current user has connected their WP.com account // and if not add this information to the the array of URL parameters. if ( ! ( new Manager() )->is_user_connected( $user->ID ) ) { $url_params['query'] = 'unlinked=1'; } $envelope->url = esc_url( Redirect::get_url( "jitm-$envelope->id", $url_params ) ); $stats = new A8c_Mc_Stats(); $envelope->jitm_stats_url = $stats->build_stats_url( array( 'x_jetpack-jitm' => $envelope->id ) ); // phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase // $CTA is not valid per PHPCS, but it is part of the return from WordPress.com, so allowing. if ( $envelope->CTA->hook ) { $envelope->url = apply_filters( 'jitm_' . $envelope->CTA->hook, $envelope->url ); unset( $envelope->CTA->hook ); } // phpcs:enable if ( isset( $envelope->content->hook ) ) { $envelope->content = apply_filters( 'jitm_' . $envelope->content->hook, $envelope->content ); unset( $envelope->content->hook ); } // No point in showing an empty message. if ( empty( $envelope->content->message ) ) { unset( $envelopes[ $idx ] ); continue; } $envelope->content->icon = $this->generate_icon( $envelope->content->icon, $full_jp_logo_exists ); $envelope->message_path = esc_attr( $message_path ); $stats->add( 'jitm', $envelope->id . '-viewed' ); $stats->do_server_side_stats(); } return $envelopes; } }