PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.2-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.2-a.1
16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / jetpack_vendor / automattic / jetpack-seo / src / class-surface-visibility.php
jetpack / jetpack_vendor / automattic / jetpack-seo / src Last commit date
class-admin-page.php 3 weeks ago class-ai-crawlers.php 3 weeks ago class-ai-seo-enhancer.php 3 days ago class-author-schema-node.php 1 month ago class-breadcrumb-schema-node.php 1 month ago class-content-coverage.php 3 weeks ago class-dashboard-data.php 2 weeks ago class-initializer.php 3 days ago class-llms-txt.php 3 weeks ago class-local-business-schema-node.php 1 month ago class-organization-schema-node.php 1 month ago class-post-schema-node.php 1 month ago class-post-types.php 3 weeks ago class-schema-builder.php 1 month ago class-schema-graph.php 1 month ago class-schema-node-ids.php 1 month ago class-schema-settings-controller.php 1 month ago class-schema-settings.php 1 month ago class-surface-visibility.php 2 weeks ago class-website-schema-node.php 1 month ago
class-surface-visibility.php
128 lines
1 <?php
2 /**
3 * The discoverability cohort for the Jetpack SEO surface, and the opt-in
4 * that flips it: whether the admin menu registers on this site, and the
5 * REST route existing self-hosted installs use to switch over.
6 *
7 * @package automattic/jetpack-seo-package
8 */
9
10 namespace Automattic\Jetpack\SEO;
11
12 use Automattic\Jetpack\Modules;
13 use Automattic\Jetpack\Status\Host;
14
15 /**
16 * Decides whether the SEO surface is discoverable and handles the opt-in.
17 */
18 class Surface_Visibility {
19
20 /**
21 * Whether the Jetpack SEO surface should be discoverable (admin menu registered).
22 *
23 * WordPress.com sites (Simple + Atomic) are always discoverable — how SEO presents
24 * there is a Dotcom decision, independent of the self-hosted rollout. On self-hosted
25 * sites the durable {@see Initializer::VISIBILITY_OPTION} cohort flag decides: fresh installs
26 * are seeded visible, existing installs stay hidden until they opt in. Defaults to
27 * hidden when the option is absent (e.g. before the plugin's seed has run), so an
28 * existing site is never surprised by the new surface before its cohort is recorded.
29 *
30 * @return bool
31 */
32 public static function is_visible() {
33 if ( class_exists( 'Automattic\\Jetpack\\Status\\Host' ) && ( new Host() )->is_wpcom_platform() ) {
34 return true;
35 }
36
37 return (bool) get_option( Initializer::VISIBILITY_OPTION, false );
38 }
39
40 /**
41 * Whether to offer an existing install the chance to opt into the new SEO experience.
42 *
43 * The single source of truth for the opt-in surfaces (legacy Traffic-page banner, My
44 * Jetpack card). True only when the SEO product is available and the surface isn't
45 * visible yet — and since {@see self::is_visible()} already returns true for
46 * WordPress.com and for self-hosted installs that have opted in, "not visible"
47 * cleanly means "a self-hosted install that hasn't opted in".
48 *
49 * @return bool
50 */
51 public static function is_optin_available() {
52 return Initializer::is_available() && ! self::is_visible();
53 }
54
55 /**
56 * Expose whether this install should be offered the SEO opt-in, onto
57 * `window.JetpackScriptData.seo.optin_available` for other admin surfaces (e.g. the
58 * legacy Traffic-page banner). Only hooked when the feature flag is on, so the field is
59 * simply absent otherwise.
60 *
61 * @param array $data Script data being injected onto the page.
62 * @return array
63 */
64 public static function inject_optin_availability( $data ) {
65 if ( ! is_array( $data ) ) {
66 $data = array();
67 }
68
69 $data[ Initializer::SCRIPT_DATA_KEY ]['optin_available'] = self::is_optin_available();
70 // Read by the legacy Traffic page to hide its SEO / Sitemaps sections once the
71 // site is on the new experience (fresh install / opted-in / WordPress.com), so the
72 // two surfaces never show at once. The legacy sections stay for self-hosted installs
73 // that haven't opted in.
74 $data[ Initializer::SCRIPT_DATA_KEY ]['surface_visible'] = self::is_visible();
75
76 return $data;
77 }
78
79 /**
80 * Register the opt-in REST route that switches an existing self-hosted install over to
81 * the new SEO experience.
82 *
83 * Lives on the `jetpack/v4` namespace and is registered ahead of the cohort gate, so a
84 * site whose SEO surface is still hidden can reach it from the legacy Traffic page or
85 * My Jetpack. See {@see self::handle_optin()}.
86 *
87 * @return void
88 */
89 public static function register_optin_route() {
90 register_rest_route(
91 'jetpack/v4',
92 '/seo/opt-in',
93 array(
94 'methods' => \WP_REST_Server::CREATABLE,
95 'callback' => array( __CLASS__, 'handle_optin' ),
96 'permission_callback' => function () {
97 return current_user_can( 'manage_options' );
98 },
99 )
100 );
101 }
102
103 /**
104 * Opt an existing install into the new SEO experience: mark the surface visible and
105 * activate the `seo-tools` module, then hand back the dashboard URL to redirect to.
106 *
107 * Idempotent — re-opting-in is harmless. `Modules::activate()` is called with
108 * `$exit = false, $redirect = false`; the defaults would `exit()` and send a 302,
109 * which break a REST response.
110 *
111 * @return \WP_REST_Response
112 */
113 public static function handle_optin() {
114 update_option( Initializer::VISIBILITY_OPTION, true );
115
116 if ( class_exists( 'Automattic\\Jetpack\\Modules' ) ) {
117 ( new Modules() )->activate( 'seo-tools', false, false );
118 }
119
120 return rest_ensure_response(
121 array(
122 'success' => true,
123 'redirect' => admin_url( 'admin.php?page=' . Admin_Page::MENU_SLUG ),
124 )
125 );
126 }
127 }
128