PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.2-a.1
Jetpack – WP Security, Backup, Speed, & Growth v16.2-a.1
16.2-a.3 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-connection / src / class-site-health.php
jetpack / jetpack_vendor / automattic / jetpack-connection / src Last commit date
abilities 6 days ago connectors 6 days ago health 6 days ago identity-crisis 2 months ago sso 2 months ago traits 9 months ago webhooks 9 months ago class-authorize-json-api.php 2 months ago class-client.php 6 days ago class-connection-assets.php 1 year ago class-connection-notice.php 8 months ago class-error-handler.php 6 days ago class-external-storage.php 4 months ago class-heartbeat.php 1 month ago class-initial-state.php 4 weeks ago class-manager.php 6 days ago class-nonce-handler.php 9 months ago class-package-version-tracker.php 2 months ago class-package-version.php 6 days ago class-partner-coupon.php 3 months ago class-partner.php 2 years ago class-plugin-storage.php 8 months ago class-plugin.php 9 months ago class-rest-authentication.php 6 days ago class-rest-connector.php 6 days ago class-secrets.php 9 months ago class-server-sandbox.php 3 months ago class-site-health.php 6 days ago class-terms-of-service.php 6 days ago class-tokens-locks.php 9 months ago class-tokens.php 6 days ago class-tracking.php 6 days ago class-urls.php 6 months ago class-user-account-status.php 6 days ago class-users-connection-admin.php 2 months ago class-utils.php 2 years ago class-webhooks.php 2 months ago class-xmlrpc-async-call.php 2 years ago class-xmlrpc-connector.php 9 months ago interface-manager.php 4 years ago interface-storage-provider.php 6 months ago
class-site-health.php
206 lines
1 <?php
2 /**
3 * WordPress Site Health integration for the Jetpack Connection package.
4 *
5 * @package automattic/jetpack-connection
6 */
7
8 namespace Automattic\Jetpack\Connection;
9
10 /**
11 * Integrates connection health tests into WordPress Site Health.
12 *
13 * This class defers to the Jetpack plugin's own debugger integration when it
14 * is present (old Jetpack versions). When no legacy integration is detected,
15 * it registers the connection health tests directly.
16 *
17 * @since 8.5.0
18 */
19 class Site_Health {
20
21 /**
22 * Whether the class has been initialized.
23 *
24 * @var bool
25 */
26 private static $initialized = false;
27
28 /**
29 * Initialize Site Health integration.
30 *
31 * Should be called once, typically from the package's actions.php via a plugins_loaded hook.
32 *
33 * @since 8.5.0
34 */
35 public static function init() {
36 if ( self::$initialized ) {
37 return;
38 }
39 self::$initialized = true;
40
41 add_action( 'admin_init', array( __CLASS__, 'maybe_register_site_health' ), 1 );
42
43 // Deliberately hooked to the cron-only `jetpack_heartbeat` action (end of
44 // Heartbeat::cron_exec()) and not `jetpack_heartbeat_stats_array`, which
45 // also fires in synchronous request contexts (XML-RPC, REST, WP-CLI) where
46 // a remote test would be slow and an amplification vector.
47 add_action( 'jetpack_heartbeat', array( __CLASS__, 'do_daily_connection_check' ) );
48 }
49
50 /**
51 * Runs the WP.com connection test once a day on the heartbeat cron.
52 *
53 * The test result itself is discarded: the point is the test's side effects,
54 * which keep the Error_Handler state for failures that WP.com cannot report
55 * through a request of its own (e.g. the site blocking WP.com requests) fresh —
56 * reported while the condition persists, cleared once it resolves. Without this,
57 * the error would only update on Site Health page visits and Core's weekly
58 * Site Health cron, and would expire (ERROR_LIFE_TIME) while still unresolved.
59 *
60 * @since 8.10.0
61 */
62 public static function do_daily_connection_check() {
63 if ( ! ( new Manager() )->is_connected() ) {
64 return;
65 }
66
67 ( new Connection_Health_Tests() )->run_test( 'test__wpcom_connection_test' );
68 }
69
70 /**
71 * Conditionally register Site Health hooks.
72 *
73 * Checks whether the legacy Jetpack debugger has already registered its
74 * Site Health hooks. If so, we defer to avoid duplicate tests.
75 *
76 * @since 8.5.0
77 */
78 public static function maybe_register_site_health() {
79 // Defer to the old Jetpack plugin's debugger if it has already registered
80 // its Site Health filter. Old Jetpack versions add this filter during plugin
81 // loading, so by admin_init it is already present.
82 if ( has_filter( 'site_status_tests', 'jetpack_debugger_site_status_tests' ) ) {
83 return;
84 }
85
86 add_filter( 'site_status_tests', array( __CLASS__, 'register_site_health_tests' ) );
87 add_action( 'wp_ajax_health-check-jetpack-connection-health', array( __CLASS__, 'ajax_local_testing_suite' ) );
88 }
89
90 /**
91 * Register connection tests with WordPress Site Health.
92 *
93 * @since 8.5.0
94 *
95 * @param array $core_tests Array of tests from Core's Site Health.
96 *
97 * @return array Modified array of tests.
98 */
99 public static function register_site_health_tests( $core_tests ) {
100 $cxn_tests = new Connection_Health_Tests();
101 $tests = $cxn_tests->list_tests( 'direct' );
102
103 foreach ( $tests as $test ) {
104 $core_tests['direct'][ $test['name'] ] = array(
105 'label' => __( 'Jetpack: ', 'jetpack-connection' ) . $test['name'],
106 'test' => self::make_site_health_callback( $test, $cxn_tests ),
107 );
108 }
109
110 $core_tests['async']['jetpack_connection_test_suite'] = array(
111 'label' => __( 'Jetpack Connection Tests', 'jetpack-connection' ),
112 'test' => 'jetpack-connection-health',
113 );
114
115 return $core_tests;
116 }
117
118 /**
119 * Create a closure for a Site Health direct test.
120 *
121 * @since 8.5.0
122 *
123 * @param array $test Test definition array.
124 * @param Connection_Health_Tests $cxn_tests Test suite instance.
125 *
126 * @return callable The Site Health test callback.
127 */
128 private static function make_site_health_callback( $test, $cxn_tests ) {
129 return function () use ( $test, $cxn_tests ) {
130 $results = $cxn_tests->run_test( $test['name'] );
131 if ( is_wp_error( $results ) ) {
132 return;
133 }
134
135 $label = $results['label'] ?
136 $results['label'] :
137 ucwords(
138 str_replace(
139 '_',
140 ' ',
141 str_replace( 'test__', '', $test['name'] )
142 )
143 );
144
145 if ( $results['long_description'] ) {
146 $description = $results['long_description'];
147 } elseif ( $results['short_description'] ) {
148 $description = sprintf(
149 '<p>%s</p>',
150 $results['short_description']
151 );
152 } else {
153 $description = sprintf(
154 '<p>%s</p>',
155 __( 'This test successfully passed!', 'jetpack-connection' )
156 );
157 }
158
159 $badge_label = $cxn_tests->get_site_health_badge_label();
160
161 $return = array(
162 'label' => $label,
163 'status' => 'good',
164 'badge' => array(
165 'label' => $badge_label,
166 'color' => 'green',
167 ),
168 'description' => $description,
169 'actions' => '',
170 'test' => 'jetpack_' . $test['name'],
171 );
172
173 if ( false === $results['pass'] ) {
174 $return['status'] = $results['severity'];
175 if ( ! empty( $results['action'] ) ) {
176 $return['actions'] = sprintf(
177 '<a href="%1$s" target="_blank" rel="noopener noreferrer">%2$s <span class="screen-reader-text">%3$s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a>',
178 esc_url( $results['action'] ),
179 $results['action_label'],
180 /* translators: accessibility text */
181 __( '(opens in a new tab)', 'jetpack-connection' )
182 );
183 }
184 }
185
186 return $return;
187 };
188 }
189
190 /**
191 * AJAX handler for async Site Health tests.
192 *
193 * @since 8.5.0
194 */
195 public static function ajax_local_testing_suite() {
196 check_ajax_referer( 'health-check-site-status' );
197 if ( ! current_user_can( 'manage_options' ) ) {
198 // @phan-suppress-next-line PhanTypeMismatchArgumentProbablyReal
199 wp_send_json_error( null, null, JSON_UNESCAPED_SLASHES );
200 }
201 $tests = new Connection_Health_Tests();
202 // @phan-suppress-next-line PhanTypeMismatchArgumentProbablyReal
203 wp_send_json_success( $tests->output_results_for_core_async_site_health(), null, JSON_UNESCAPED_SLASHES );
204 }
205 }
206