jetpack
Last commit date
3rd-party
2 years ago
_inc
2 years ago
css
2 years ago
extensions
2 years ago
images
3 years ago
jetpack_vendor
1 day ago
json-endpoints
2 years ago
modules
1 year ago
sal
2 years ago
src
3 years ago
vendor
2 years ago
views
3 years ago
CHANGELOG.md
2 years ago
LICENSE.txt
5 years ago
SECURITY.md
5 years ago
class-jetpack-connection-status.php
2 years ago
class-jetpack-connection-widget.php
3 years ago
class-jetpack-gallery-settings.php
3 years ago
class-jetpack-pre-connection-jitms.php
4 years ago
class-jetpack-recommendations-banner.php
2 years ago
class-jetpack-stats-dashboard-widget.php
3 years ago
class-jetpack-wizard-banner.php
5 years ago
class-jetpack-xmlrpc-methods.php
3 years ago
class.frame-nonce-preview.php
4 years ago
class.jetpack-admin.php
2 years ago
class.jetpack-affiliate.php
2 years ago
class.jetpack-autoupdate.php
2 years ago
class.jetpack-bbpress-json-api.compat.php
2 years ago
class.jetpack-boost-modules.php
3 years ago
class.jetpack-cli.php
3 years ago
class.jetpack-client-server.php
4 years ago
class.jetpack-connection-banner.php
3 years ago
class.jetpack-data.php
2 years ago
class.jetpack-gutenberg.php
2 years ago
class.jetpack-heartbeat.php
2 years ago
class.jetpack-idc.php
5 years ago
class.jetpack-modules-list-table.php
2 years ago
class.jetpack-network-sites-list-table.php
3 years ago
class.jetpack-network.php
3 years ago
class.jetpack-plan.php
3 years ago
class.jetpack-post-images.php
2 years ago
class.jetpack-twitter-cards.php
3 years ago
class.jetpack-user-agent.php
2 years ago
class.jetpack.php
2 years ago
class.json-api-endpoints.php
2 years ago
class.json-api.php
3 years ago
class.photon.php
3 years ago
composer.json
2 years ago
enhanced-open-graph.php
3 years ago
functions.compat.php
2 years ago
functions.cookies.php
2 years ago
functions.global.php
2 years ago
functions.is-mobile.php
2 years ago
functions.opengraph.php
2 years ago
functions.photon.php
2 years ago
jetpack.php
1 day ago
json-api-config.php
3 years ago
json-endpoints.php
2 years ago
load-jetpack.php
3 years ago
locales.php
4 years ago
readme.txt
1 day ago
uninstall.php
5 years ago
wpml-config.xml
4 years ago
class-jetpack-recommendations-banner.php
286 lines
| 1 | <?php |
| 2 | /** |
| 3 | * Displays the site type recommendations question as a banner. |
| 4 | * |
| 5 | * @package automattic/jetpack |
| 6 | */ |
| 7 | |
| 8 | use Automattic\Jetpack\Assets; |
| 9 | use Automattic\Jetpack\Assets\Logo as Jetpack_Logo; |
| 10 | use Automattic\Jetpack\Identity_Crisis; |
| 11 | use Automattic\Jetpack\Tracking; |
| 12 | |
| 13 | /** |
| 14 | * Jetpack_Recommendations_Banner |
| 15 | **/ |
| 16 | class Jetpack_Recommendations_Banner { |
| 17 | /** |
| 18 | * Jetpack_Recommendations_Banner |
| 19 | * |
| 20 | * @var Jetpack_Recommendations_Banner |
| 21 | **/ |
| 22 | private static $instance = null; |
| 23 | |
| 24 | /** |
| 25 | * Factory method |
| 26 | */ |
| 27 | public static function init() { |
| 28 | if ( self::$instance === null ) { |
| 29 | self::$instance = new Jetpack_Recommendations_Banner(); |
| 30 | } |
| 31 | |
| 32 | return self::$instance; |
| 33 | } |
| 34 | |
| 35 | /** |
| 36 | * Jetpack_Recommendations_Banner constructor. |
| 37 | */ |
| 38 | private function __construct() { |
| 39 | add_action( 'current_screen', array( $this, 'maybe_initialize_hooks' ) ); |
| 40 | } |
| 41 | |
| 42 | /** |
| 43 | * Initialize hooks to display the banner |
| 44 | * |
| 45 | * @since 9.7 Added the $current_screen parameter. |
| 46 | * |
| 47 | * @param \WP_Screen $current_screen Current WordPress screen. |
| 48 | */ |
| 49 | public function maybe_initialize_hooks( $current_screen ) { |
| 50 | if ( ! static::can_be_displayed() ) { |
| 51 | return; |
| 52 | } |
| 53 | |
| 54 | if ( Jetpack_Connection_Banner::can_be_displayed( $current_screen ) ) { |
| 55 | // We don't want to overcrowd the screen with both the Connection banner and the Recommendations banner. |
| 56 | return; |
| 57 | } |
| 58 | |
| 59 | add_action( 'admin_print_styles', array( $this, 'admin_banner_styles' ) ); |
| 60 | add_action( 'admin_notices', array( $this, 'render_banner' ) ); |
| 61 | add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_banner_scripts' ) ); |
| 62 | } |
| 63 | |
| 64 | /** |
| 65 | * Determines if the banner can be displayed |
| 66 | */ |
| 67 | public static function can_be_displayed() { |
| 68 | if ( ! Jetpack_Recommendations::is_banner_enabled() ) { |
| 69 | return false; |
| 70 | } |
| 71 | |
| 72 | // Only the dashboard and plugins pages should see the banner. |
| 73 | if ( ! in_array( get_current_screen()->id, array( 'dashboard', 'plugins' ), true ) ) { |
| 74 | return false; |
| 75 | } |
| 76 | |
| 77 | if ( ! current_user_can( 'jetpack_manage_modules' ) ) { |
| 78 | return false; |
| 79 | } |
| 80 | |
| 81 | if ( Jetpack_Options::get_option( 'recommendations_banner_dismissed' ) ) { |
| 82 | return false; |
| 83 | } |
| 84 | |
| 85 | if ( ! in_array( |
| 86 | Jetpack_Options::get_option( 'recommendations_step', 'not-started' ), |
| 87 | array( |
| 88 | 'not-started', |
| 89 | 'site-type-question', |
| 90 | ), |
| 91 | true |
| 92 | ) ) { |
| 93 | return false; |
| 94 | } |
| 95 | |
| 96 | if ( Identity_Crisis::has_identity_crisis() ) { |
| 97 | return false; |
| 98 | } |
| 99 | |
| 100 | return true; |
| 101 | } |
| 102 | |
| 103 | /** |
| 104 | * Handles storing the user responses in the banner. |
| 105 | */ |
| 106 | public static function ajax_callback() { |
| 107 | check_ajax_referer( 'jp-recommendations-banner-nonce', 'nonce' ); |
| 108 | |
| 109 | if ( ! current_user_can( 'jetpack_manage_modules' ) ) { |
| 110 | wp_die(); |
| 111 | } |
| 112 | |
| 113 | $tracking = new Tracking(); |
| 114 | |
| 115 | if ( isset( $_REQUEST['dismissBanner'] ) && 'true' === $_REQUEST['dismissBanner'] ) { |
| 116 | Jetpack_Options::update_option( 'recommendations_banner_dismissed', 1 ); |
| 117 | $tracking->record_user_event( 'recommendations_banner_dismissed' ); |
| 118 | wp_send_json_success(); |
| 119 | wp_die(); |
| 120 | } |
| 121 | |
| 122 | $data = Jetpack_Recommendations::get_recommendations_data(); |
| 123 | |
| 124 | $tracking_answers = array(); |
| 125 | |
| 126 | if ( isset( $_REQUEST['personal'] ) && is_string( $_REQUEST['personal'] ) ) { |
| 127 | $value = 'true' === $_REQUEST['personal'] ? true : false; |
| 128 | $data['site-type-personal'] = $value; |
| 129 | $tracking_answers['personal'] = $value; |
| 130 | } |
| 131 | |
| 132 | if ( isset( $_REQUEST['builder'] ) && is_string( $_REQUEST['builder'] ) ) { |
| 133 | $value = 'true' === $_REQUEST['builder'] ? true : false; |
| 134 | $data['site-type-agency'] = $value; |
| 135 | $tracking_answers['builder'] = $value; |
| 136 | } |
| 137 | |
| 138 | if ( isset( $_REQUEST['store'] ) && is_string( $_REQUEST['store'] ) ) { |
| 139 | $value = 'true' === $_REQUEST['store'] ? true : false; |
| 140 | $data['site-type-store'] = $value; |
| 141 | $tracking_answers['store'] = $value; |
| 142 | } |
| 143 | |
| 144 | Jetpack_Recommendations::update_recommendations_data( $data ); |
| 145 | Jetpack_Options::update_option( 'recommendations_step', 'banner-completed' ); |
| 146 | |
| 147 | $tracking->record_user_event( 'recommendations_banner_answered', $tracking_answers ); |
| 148 | |
| 149 | wp_send_json_success(); |
| 150 | wp_die(); |
| 151 | } |
| 152 | |
| 153 | /** |
| 154 | * Enqueue JavaScript files. |
| 155 | */ |
| 156 | public function enqueue_banner_scripts() { |
| 157 | wp_enqueue_script( |
| 158 | 'jetpack-recommendations-banner-js', |
| 159 | Assets::get_file_url_for_environment( |
| 160 | '_inc/build/jetpack-recommendations-banner.min.js', |
| 161 | '_inc/jetpack-recommendations-banner.js' |
| 162 | ), |
| 163 | array( 'jquery' ), |
| 164 | JETPACK__VERSION, |
| 165 | true |
| 166 | ); |
| 167 | |
| 168 | wp_localize_script( |
| 169 | 'jetpack-recommendations-banner-js', |
| 170 | 'jp_banner', |
| 171 | array( |
| 172 | 'nonce' => wp_create_nonce( 'jp-recommendations-banner-nonce' ), |
| 173 | 'ajax_url' => admin_url( 'admin-ajax.php' ), |
| 174 | 'recommendations_url' => admin_url( 'admin.php?page=jetpack#/recommendations' ), |
| 175 | ) |
| 176 | ); |
| 177 | } |
| 178 | |
| 179 | /** |
| 180 | * Include the needed styles |
| 181 | */ |
| 182 | public function admin_banner_styles() { |
| 183 | wp_enqueue_style( |
| 184 | 'jetpack-recommendations-banner', |
| 185 | Assets::get_file_url_for_environment( |
| 186 | 'css/jetpack-recommendations-banner.min.css', |
| 187 | 'css/jetpack-recommendations-banner.css' |
| 188 | ), |
| 189 | array(), |
| 190 | JETPACK__VERSION |
| 191 | ); |
| 192 | } |
| 193 | |
| 194 | /** |
| 195 | * Renders the Recommendations Banner |
| 196 | */ |
| 197 | public function render_banner() { |
| 198 | $jetpack_logo = new Jetpack_Logo(); |
| 199 | $site_name = get_bloginfo( 'name' ); |
| 200 | ?> |
| 201 | <div id="jp-recommendations-banner-main" class="jp-recommendations-banner-main"> |
| 202 | <div class="jp-recommendations-banner__content"> |
| 203 | <div class="jp-recommendations-banner__logo"> |
| 204 | <?php |
| 205 | echo $jetpack_logo->get_jp_emblem_larger(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped |
| 206 | ?> |
| 207 | </div> |
| 208 | <h1 class="jp-recommendations-banner__question"> |
| 209 | <?php |
| 210 | /* translators: placeholder is the name of the website */ |
| 211 | printf( esc_html__( 'Tell us more about %s?', 'jetpack' ), esc_html( $site_name ) ); |
| 212 | ?> |
| 213 | </h1> |
| 214 | <p class="jp-recommendations-banner__description"> |
| 215 | <?php esc_html_e( 'To help you get the most from Jetpack, tell us about your site. Check all that apply:', 'jetpack' ); ?> |
| 216 | </p> |
| 217 | <div class="jp-recommendations-banner__answer"> |
| 218 | <form id="jp-recommendations-banner__form" class="jp-recommendations-banner__form"> |
| 219 | <div class="jp-recommendations-banner__checkboxes"> |
| 220 | <?php $this->render_checkbox( 'builder', __( 'I build or manage this site for a client', 'jetpack' ) ); ?> |
| 221 | <?php $this->render_checkbox( 'store', __( 'This is an e-commerce store', 'jetpack' ) ); ?> |
| 222 | <?php $this->render_checkbox( 'personal', __( 'This is a personal site', 'jetpack' ) ); ?> |
| 223 | </div> |
| 224 | </form> |
| 225 | <a id="jp-recommendations-banner__continue-button" class="jp-banner-cta-button"> |
| 226 | <?php esc_html_e( 'Continue', 'jetpack' ); ?> |
| 227 | </a> |
| 228 | <div class="jp-recommendations-banner__continue-description"> |
| 229 | <?php esc_html_e( 'All Jetpack’s great features await you and we’ll recommend some of our favorites', 'jetpack' ); ?> |
| 230 | </div> |
| 231 | </div> |
| 232 | </div> |
| 233 | <div class="jp-recommendations-banner__illustration-container"> |
| 234 | <button id="jp-recommendations-banner__notice-dismiss" class="jp-recommendations-banner__notice-dismiss"> |
| 235 | <svg class="jp-recommendations-banner__svg-dismiss" width="25" height="24" viewBox="0 0 25 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"> |
| 236 | <path fill-rule="evenodd" d="M12.5232 2C7.02034 2 2.57227 6.47 2.57227 12C2.57227 17.53 7.02034 22 12.5232 22C18.0261 22 22.4742 17.53 22.4742 12C22.4742 6.47 18.0261 2 12.5232 2ZM15.1005 8L12.5232 10.59L9.94591 8L8.54283 9.41L11.1201 12L8.54283 14.59L9.94591 16L12.5232 13.41L15.1005 16L16.5036 14.59L13.9263 12L16.5036 9.41L15.1005 8ZM4.56245 12C4.56245 16.41 8.13484 20 12.5232 20C16.9116 20 20.484 16.41 20.484 12C20.484 7.59 16.9116 4 12.5232 4C8.13484 4 4.56245 7.59 4.56245 12Z" /> |
| 237 | </svg> |
| 238 | <span><?php esc_attr_e( 'Dismiss', 'jetpack' ); ?></span> |
| 239 | </button> |
| 240 | <picture> |
| 241 | <source |
| 242 | type="image/webp" |
| 243 | srcset="<?php echo esc_url( $this->img_path( 1, 'webp' ) ); ?> 1x, <?php echo esc_url( $this->img_path( 2, 'webp' ) ); ?> 2x"> |
| 244 | <img |
| 245 | class="jp-recommendations-banner__illustration-foreground" |
| 246 | srcset="<?php echo esc_url( $this->img_path( 2 ) ); ?> 2x" |
| 247 | src="<?php echo esc_url( $this->img_path() ); ?>" |
| 248 | alt=""> |
| 249 | </picture> |
| 250 | </div> |
| 251 | </div> |
| 252 | <?php |
| 253 | } |
| 254 | |
| 255 | /** |
| 256 | * Renders a checkbox. |
| 257 | * |
| 258 | * @param string $name The name to give the form input. |
| 259 | * @param string $title The title to put on the checkbox. |
| 260 | */ |
| 261 | private function render_checkbox( $name, $title ) { |
| 262 | ?> |
| 263 | <label for="<?php echo esc_html( $name ); ?>" class="jp-recommendations-answer__checkbox-label"> |
| 264 | <input id="<?php echo esc_html( $name ); ?>" name="<?php echo esc_html( $name ); ?>" type="checkbox" tabindex="-1"/> |
| 265 | <div class="jp-recommendations-answer__title"> |
| 266 | <?php echo esc_html( $title ); ?> |
| 267 | </div> |
| 268 | </label> |
| 269 | <?php |
| 270 | } |
| 271 | |
| 272 | /** |
| 273 | * Returns the path of the banner image for the specified version. |
| 274 | * |
| 275 | * @param string $res Requested resolution. |
| 276 | * @param string $format Requested format. |
| 277 | * @return string Path |
| 278 | */ |
| 279 | private function img_path( $res = 1, $format = 'png' ) { |
| 280 | $suffix = 2 === $res ? '-2x' : ''; |
| 281 | $ext = in_array( $format, array( 'webp', 'png' ), true ) ? $format : 'png'; |
| 282 | |
| 283 | return plugins_url( "images/recommendations/assistant-site-type$suffix.$ext", JETPACK__PLUGIN_FILE ); |
| 284 | } |
| 285 | } |
| 286 |