| @@ -1,8 +1,10 @@ | ||
| 1 | 1 | <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName |
| 2 | 2 | /** |
| 3 | - * Adds the PSH functionality to Jetpack. | |
| 3 | + * Plugin Search Hints, aka Feature Suggestions. | |
| 4 | 4 | * |
| 5 | + * @since 7.1.0 | |
| 6 | + * | |
| 5 | 7 | * @package automattic/jetpack |
| 6 | 8 | */ |
| 7 | 9 | |
| 8 | 10 | // phpcs:disable Universal.Files.SeparateFunctionsFromOO.Mixed -- TODO: Move classes to appropriately-named class files. |
| @@ -13,9 +15,9 @@ | ||
| 13 | 15 | use Automattic\Jetpack\Tracking; |
| 14 | 16 | |
| 15 | 17 | // Disable direct access and execution. |
| 16 | 18 | if ( ! defined( 'ABSPATH' ) ) { |
| 17 | - exit; | |
| 19 | + exit( 0 ); | |
| 18 | 20 | } |
| 19 | 21 | |
| 20 | 22 | if ( |
| 21 | 23 | is_admin() && |
| @@ -237,9 +239,8 @@ | ||
| 237 | 239 | 'jetpackPluginSearch', |
| 238 | 240 | array( |
| 239 | 241 | 'nonce' => wp_create_nonce( 'wp_rest' ), |
| 240 | 242 | 'base_rest_url' => rest_url( '/jetpack/v4' ), |
| 241 | - 'poweredBy' => esc_html__( 'by Jetpack (installed)', 'jetpack' ), | |
| 242 | 243 | 'manageSettings' => esc_html__( 'Configure', 'jetpack' ), |
| 243 | 244 | 'activateModule' => esc_html__( 'Activate Module', 'jetpack' ), |
| 244 | 245 | 'getStarted' => esc_html__( 'Get started', 'jetpack' ), |
| 245 | 246 | 'activated' => esc_html__( 'Activated', 'jetpack' ), |
| @@ -299,9 +300,9 @@ | ||
| 299 | 300 | * @return array List of features. |
| 300 | 301 | */ |
| 301 | 302 | public function get_extra_features() { |
| 302 | 303 | return array( |
| 303 | - 'akismet' => array( | |
| 304 | + 'akismet' => array( | |
| 304 | 305 | 'name' => 'Akismet', |
| 305 | 306 | 'search_terms' => 'akismet, anti-spam, antispam, comments, spam, spam protection, form spam, captcha, no captcha, nocaptcha, recaptcha, phising, google', |
| 306 | 307 | 'short_description' => esc_html__( 'Keep your visitors and search engines happy by stopping comment and contact form spam with Akismet.', 'jetpack' ), |
| 307 | 308 | 'requires_connection' => true, |
| @@ -309,8 +310,18 @@ | ||
| 309 | 310 | 'sort' => '16', |
| 310 | 311 | 'learn_more_button' => Redirect::get_url( 'plugin-hint-upgrade-akismet' ), |
| 311 | 312 | 'configure_url' => admin_url( 'admin.php?page=akismet-key-config' ), |
| 312 | 313 | ), |
| 314 | + 'sharing-block' => array( | |
| 315 | + 'name' => esc_html__( 'Sharing buttons block', 'jetpack' ), | |
| 316 | + 'search_terms' => 'share, sharing, sharing block, sharing button, social buttons, buttons, share facebook, share twitter, social share, icons, email, facebook, twitter, x, linkedin, pinterest, social media', | |
| 317 | + 'short_description' => esc_html__( 'Add sharing buttons blocks anywhere on your website to help your visitors share your content.', 'jetpack' ), | |
| 318 | + 'requires_connection' => false, | |
| 319 | + 'module' => 'sharing-block', | |
| 320 | + 'sort' => '13', | |
| 321 | + 'learn_more_button' => Redirect::get_url( 'jetpack-support-sharing-block' ), | |
| 322 | + 'configure_url' => admin_url( 'site-editor.php?path=%2Fwp_template' ), | |
| 323 | + ), | |
| 313 | 324 | ); |
| 314 | 325 | } |
| 315 | 326 | |
| 316 | 327 | /** |
| @@ -330,28 +341,48 @@ | ||
| 330 | 341 | } |
| 331 | 342 | |
| 332 | 343 | // Looks like a search query; it's matching time. |
| 333 | 344 | if ( ! empty( $args->search ) ) { |
| 345 | + $searchable_modules = array( | |
| 346 | + 'contact-form', | |
| 347 | + 'monitor', | |
| 348 | + 'photon', | |
| 349 | + 'photon-cdn', | |
| 350 | + 'protect', | |
| 351 | + 'publicize', | |
| 352 | + 'related-posts', | |
| 353 | + 'akismet', | |
| 354 | + 'vaultpress', | |
| 355 | + 'videopress', | |
| 356 | + 'search', | |
| 357 | + ); | |
| 358 | + | |
| 359 | + /* | |
| 360 | + * Let's handle the Sharing feature differently. | |
| 361 | + * If we're using a block-based theme, we should suggest the sharing block. | |
| 362 | + * If using a classic theme, we should suggest the old sharing module. | |
| 363 | + */ | |
| 364 | + if ( wp_is_block_theme() ) { | |
| 365 | + $searchable_modules[] = 'sharing-block'; | |
| 366 | + } else { | |
| 367 | + $searchable_modules[] = 'sharedaddy'; | |
| 368 | + } | |
| 369 | + | |
| 370 | + /* | |
| 371 | + * Only surface the SEO Tools hint once the new Jetpack SEO admin page is | |
| 372 | + * available. The page is gated behind the `rsm_jetpack_seo` feature flag, | |
| 373 | + * so without this gate the hint's CTAs would point to a page that isn't | |
| 374 | + * registered yet. | |
| 375 | + */ | |
| 376 | + if ( apply_filters( 'rsm_jetpack_seo', false ) ) { | |
| 377 | + $searchable_modules[] = 'seo-tools'; | |
| 378 | + } | |
| 379 | + | |
| 334 | 380 | require_once JETPACK__PLUGIN_DIR . 'class.jetpack-admin.php'; |
| 335 | 381 | $tracking = new Tracking(); |
| 336 | 382 | $jetpack_modules_list = array_intersect_key( |
| 337 | 383 | array_merge( $this->get_extra_features(), Jetpack_Admin::init()->get_modules() ), |
| 338 | - array_flip( | |
| 339 | - array( | |
| 340 | - 'contact-form', | |
| 341 | - 'monitor', | |
| 342 | - 'photon', | |
| 343 | - 'photon-cdn', | |
| 344 | - 'protect', | |
| 345 | - 'publicize', | |
| 346 | - 'related-posts', | |
| 347 | - 'sharedaddy', | |
| 348 | - 'akismet', | |
| 349 | - 'vaultpress', | |
| 350 | - 'videopress', | |
| 351 | - 'search', | |
| 352 | - ) | |
| 353 | - ) | |
| 384 | + array_flip( $searchable_modules ) | |
| 354 | 385 | ); |
| 355 | 386 | uasort( $jetpack_modules_list, array( $this, 'by_sorting_option' ) ); |
| 356 | 387 | |
| 357 | 388 | // Record event when user searches for a term over 3 chars (less than 3 is not very useful). |
| @@ -397,8 +428,9 @@ | ||
| 397 | 428 | esc_html_x( 'Jetpack: %s', 'Jetpack: Module Name', 'jetpack' ), |
| 398 | 429 | $jetpack_modules_list[ $matching_module ]['name'] |
| 399 | 430 | ), |
| 400 | 431 | 'short_description' => $jetpack_modules_list[ $matching_module ]['short_description'], |
| 432 | + 'author' => esc_attr__( 'Jetpack (installed)', 'jetpack' ), | |
| 401 | 433 | 'requires_connection' => (bool) $jetpack_modules_list[ $matching_module ]['requires_connection'], |
| 402 | 434 | 'slug' => self::$slug, |
| 403 | 435 | 'version' => JETPACK__VERSION, |
| 404 | 436 | 'icons' => array( |
| @@ -494,14 +526,11 @@ | ||
| 494 | 526 | case 'publicize': |
| 495 | 527 | $configure_url = Redirect::get_url( 'calypso-marketing-connections' ); |
| 496 | 528 | break; |
| 497 | 529 | case 'seo-tools': |
| 498 | - $configure_url = Redirect::get_url( | |
| 499 | - 'calypso-marketing-traffic', | |
| 500 | - array( | |
| 501 | - 'anchor' => 'seo', | |
| 502 | - ) | |
| 503 | - ); | |
| 530 | + // Jetpack SEO has its own wp-admin page (the new SEO home base); | |
| 531 | + // send users there rather than the legacy Traffic page. | |
| 532 | + $configure_url = admin_url( 'admin.php?page=jetpack-seo' ); | |
| 504 | 533 | break; |
| 505 | 534 | case 'google-analytics': |
| 506 | 535 | $configure_url = Redirect::get_url( |
| 507 | 536 | 'calypso-marketing-traffic', |
| @@ -532,13 +561,22 @@ | ||
| 532 | 561 | remove_filter( 'self_admin_url', array( $this, 'plugin_details' ) ); |
| 533 | 562 | |
| 534 | 563 | $links = array(); |
| 535 | 564 | |
| 536 | - if ( 'akismet' === $plugin['module'] || 'vaultpress' === $plugin['module'] ) { | |
| 565 | + if ( 'sharing-block' === $plugin['module'] ) { | |
| 537 | 566 | $links['jp_get_started'] = '<a |
| 538 | 567 | id="plugin-select-settings" |
| 539 | 568 | class="jetpack-plugin-search__primary jetpack-plugin-search__get-started button" |
| 569 | + href="' . esc_url( admin_url( 'site-editor.php?path=%2Fwp_template' ) ) . '" | |
| 570 | + data-module="' . esc_attr( $plugin['module'] ) . '" | |
| 571 | + data-track="get_started" | |
| 572 | + >' . esc_html__( 'Add block', 'jetpack' ) . '</a>'; | |
| 573 | + } elseif ( 'akismet' === $plugin['module'] || 'vaultpress' === $plugin['module'] ) { | |
| 574 | + $links['jp_get_started'] = '<a | |
| 575 | + id="plugin-select-settings" | |
| 576 | + class="jetpack-plugin-search__primary jetpack-plugin-search__get-started button" | |
| 540 | 577 | href="' . esc_url( Redirect::get_url( 'plugin-hint-learn-' . $plugin['module'] ) ) . '" |
| 578 | + target="_blank" | |
| 541 | 579 | data-module="' . esc_attr( $plugin['module'] ) . '" |
| 542 | 580 | data-track="get_started" |
| 543 | 581 | >' . esc_html__( 'Get started', 'jetpack' ) . '</a>'; |
| 544 | 582 | // Jetpack installed, active, feature not enabled; prompt to enable. |
| @@ -569,13 +607,26 @@ | ||
| 569 | 607 | data-module="' . esc_attr( $plugin['module'] ) . '" |
| 570 | 608 | data-track="configure" |
| 571 | 609 | >' . esc_html__( 'Configure', 'jetpack' ) . '</a>'; |
| 572 | 610 | // Module is active, doesn't have options to configure. |
| 611 | + } elseif ( 'seo-tools' === $plugin['module'] && Jetpack::is_module_active( $plugin['module'] ) ) { | |
| 612 | + // Jetpack SEO has its own wp-admin page; send users there (same tab) | |
| 613 | + // rather than a jetpack.com doc redirect, which isn't registered for | |
| 614 | + // this module. Reuse get_configure_url() so the destination stays in | |
| 615 | + // one place. | |
| 616 | + $links['jp_get_started'] = '<a | |
| 617 | + id="plugin-select-settings" | |
| 618 | + class="jetpack-plugin-search__primary jetpack-plugin-search__get-started button" | |
| 619 | + href="' . esc_url( $this->get_configure_url( $plugin['module'], $plugin['configure_url'] ) ) . '" | |
| 620 | + data-module="' . esc_attr( $plugin['module'] ) . '" | |
| 621 | + data-track="get_started" | |
| 622 | + >' . esc_html__( 'Get started', 'jetpack' ) . '</a>'; | |
| 573 | 623 | } elseif ( Jetpack::is_module_active( $plugin['module'] ) ) { |
| 574 | 624 | $links['jp_get_started'] = '<a |
| 575 | 625 | id="plugin-select-settings" |
| 576 | 626 | class="jetpack-plugin-search__primary jetpack-plugin-search__get-started button" |
| 577 | 627 | href="' . esc_url( Redirect::get_url( 'plugin-hint-learn-' . $plugin['module'] ) ) . '" |
| 628 | + target="_blank" | |
| 578 | 629 | data-module="' . esc_attr( $plugin['module'] ) . '" |
| 579 | 630 | data-track="get_started" |
| 580 | 631 | >' . esc_html__( 'Get started', 'jetpack' ) . '</a>'; |
| 581 | 632 | } |