PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.2
Jetpack – WP Security, Backup, Speed, & Growth v16.2
16.2 16.2-beta 12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 All 502 releases
jetpack / sal / class.json-api-site-jetpack.php

class.json-api-site-jetpack.php in Jetpack – WP Security, Backup, Speed, & Growth 16.2, at sal/class.json-api-site-jetpack.php

739 lines 18.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php // phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2 /**
3 * This class extends the Abstract_Jetpack_Site class, which includes providing
4 * the implementation for functions that were declared in that class.
5 *
6 * @see class.json-api-site-jetpack-base.php for more context on some of
7 * the functions extended here.
8 *
9 * @package automattic/jetpack
10 */
11 use Automattic\Jetpack\Status\Host;
12 use Automattic\Jetpack\Sync\Functions;
13
14 if ( ! defined( 'ABSPATH' ) ) {
15 exit( 0 );
16 }
17
18 require_once __DIR__ . '/class.json-api-site-jetpack-base.php';
19 require_once __DIR__ . '/class.json-api-post-jetpack.php';
20
21 /**
22 * Base class for Jetpack_Site. This code runs on Jetpack (.org) sites.
23 */
24 class Jetpack_Site extends Abstract_Jetpack_Site {
25
26 /**
27 * Retrieves a Jetpack option's value, given the option name.
28 *
29 * @param string $name the name of the Jetpack option, without the 'jetpack' prefix (eg. 'log' for 'jetpack_log').
30 *
31 * @return mixed
32 */
33 protected function get_mock_option( $name ) {
34 return get_option( 'jetpack_' . $name );
35 }
36
37 /**
38 * If a Jetpack constant name has been defined, this will return the value of the constant.
39 *
40 * @param string $name the name of the Jetpack constant to check.
41 *
42 * @return mixed
43 */
44 protected function get_constant( $name ) {
45 if ( defined( $name ) ) {
46 return constant( $name );
47 }
48 return null;
49 }
50
51 /**
52 * Returns the site URL for the current network.
53 *
54 * @return string
55 */
56 protected function main_network_site() {
57 return network_site_url();
58 }
59
60 /**
61 * Returns the WordPress version for the current site.
62 *
63 * @return string
64 */
65 protected function wp_version() {
66 global $wp_version;
67 return $wp_version;
68 }
69
70 /**
71 * Returns the maximum upload size allowed in php.ini.
72 *
73 * @return int
74 */
75 protected function max_upload_size() {
76 return wp_max_upload_size();
77 }
78
79 /**
80 * This function returns the value of the 'WP_MEMORY_LIMIT' constant converted to an integer byte value.
81 *
82 * @return int
83 */
84 protected function wp_memory_limit() {
85 return wp_convert_hr_to_bytes( WP_MEMORY_LIMIT );
86 }
87
88 /**
89 * This function returns the value of the 'WP_MAX_MEMORY_LIMIT' constant converted to an integer byte value.
90 *
91 * @return int
92 */
93 protected function wp_max_memory_limit() {
94 return wp_convert_hr_to_bytes( WP_MAX_MEMORY_LIMIT );
95 }
96
97 /**
98 * Returns true if the site is within a system with a multiple networks, false otherwise.
99 *
100 * @see /projects/packages/status/src/class-status.php
101 *
102 * @return bool
103 */
104 protected function is_main_network() {
105 return Jetpack::is_multi_network();
106 }
107
108 /**
109 * Returns true if Multisite is enabled, false otherwise.
110 *
111 * @return bool
112 */
113 public function is_multisite() {
114 return (bool) is_multisite();
115 }
116
117 /**
118 * Returns true if the current site is a single user site, false otherwise.
119 *
120 * @return bool
121 */
122 public function is_single_user_site() {
123 return (bool) Jetpack::is_single_user_site();
124 }
125
126 /**
127 * Returns true if is_vcs_checkout discovers a version control checkout, false otherwise.
128 *
129 * @see projects/packages/sync/src/class-functions.php.
130 *
131 * @return bool
132 */
133 protected function is_version_controlled() {
134 return Functions::is_version_controlled();
135 }
136
137 /**
138 * Returns true if the site has file write access, false otherwise.
139 *
140 * @see projects/packages/sync/src/class-functions.php.
141 *
142 * @return bool
143 */
144 protected function file_system_write_access() {
145 return Functions::file_system_write_access();
146 }
147
148 /**
149 * Returns true if the current theme supports the $feature_name, false otherwise.
150 *
151 * @param string $feature_name the name of the Jetpack feature.
152 *
153 * @return bool
154 */
155 protected function current_theme_supports( $feature_name ) {
156 return current_theme_supports( $feature_name );
157 }
158
159 /**
160 * Gets theme support arguments to be checked against the specific Jetpack feature.
161 *
162 * @param string $feature_name the name of the Jetpack feature to check against.
163 *
164 * @return array
165 */
166 protected function get_theme_support( $feature_name ) {
167 return get_theme_support( $feature_name );
168 }
169
170 /**
171 * Fetch a list of active plugins that are using Jetpack Connection.
172 *
173 * @return array An array of active plugins (by slug) that are using Jetpack Connection.
174 */
175 protected function get_connection_active_plugins() {
176 $plugins = $this->get_mock_option( 'connection_active_plugins' );
177
178 return is_array( $plugins ) ? array_keys( $plugins ) : array();
179 }
180
181 /**
182 * Gets updates and then stores them in the jetpack_updates option, returning an array with the option schema.
183 *
184 * @return array
185 */
186 public function get_updates() {
187 return (array) Jetpack::get_updates();
188 }
189
190 /**
191 * Returns the Jetpack blog ID for a site.
192 *
193 * @return int
194 */
195 public function get_id() {
196 return $this->platform->token->blog_id;
197 }
198
199 /**
200 * Returns true if a site has the 'videopress' option enabled, false otherwise.
201 *
202 * @return bool
203 */
204 public function has_videopress() {
205 // TODO - this only works on wporg site - need to detect videopress option for remote Jetpack site on WPCOM.
206 $videopress = Jetpack_Options::get_option( 'videopress', array() );
207 if ( isset( $videopress['blog_id'] ) && $videopress['blog_id'] > 0 ) {
208 return true;
209 }
210
211 return false;
212 }
213
214 /**
215 * Returns VideoPress storage used, in MB.
216 *
217 * @see class.json-api-site-jetpack-shadow.php on WordPress.com for implementation. Only applicable on WordPress.com.
218 *
219 * @return float
220 */
221 public function get_videopress_storage_used() {
222 return 0;
223 }
224
225 /**
226 * Sets the upgraded_filetypes_enabled Jetpack option to true as a default.
227 *
228 * Only relevant for WordPress.com sites:
229 * See wpcom_site_has_upgraded_upload_filetypes at /wpcom/wp-content/mu-plugins/misc.php.
230 *
231 * @return bool
232 */
233 public function upgraded_filetypes_enabled() {
234 return true;
235 }
236
237 /**
238 * Sets the is_mapped_domain Jetpack option to true as a default.
239 *
240 * Primarily used in WordPress.com to confirm the current blog's domain does or doesn't match the primary redirect.
241 *
242 * @see /wpcom/wp-content/mu-plugins/insecure-content-helpers.php within WordPress.com.
243 *
244 * @return bool
245 */
246 public function is_mapped_domain() {
247 return true;
248 }
249
250 /**
251 * Fallback to the home URL since all Jetpack sites don't have an unmapped *.wordpress.com domain.
252 *
253 * @return string
254 */
255 public function get_unmapped_url() {
256 // Fallback to the home URL since all Jetpack sites don't have an unmapped *.wordpress.com domain.
257 return $this->get_url();
258 }
259
260 /**
261 * Whether the domain is a site redirect or not. Defaults to false on a Jetpack site.
262 *
263 * Primarily used in WordPress.com where it is determined if a HTTP status check is a redirect or not and whether an exception should be thrown.
264 *
265 * @see /wpcom/wp-includes/Requests/Response.php within WordPress.com.
266 *
267 * @return bool
268 */
269 public function is_redirect() {
270 return false;
271 }
272
273 /**
274 * Whether or not the current user is following this blog. Defaults to false.
275 *
276 * @return bool
277 */
278 public function is_following() {
279 return false;
280 }
281
282 /**
283 * Points to the user ID of the site owner
284 *
285 * @return null for Jetpack sites
286 */
287 public function get_site_owner() {
288 return null;
289 }
290
291 /**
292 * Whether or not the Jetpack 'wordads' module is active on the site.
293 *
294 * @return bool
295 */
296 public function has_wordads() {
297 return Jetpack::is_module_active( 'wordads' );
298 }
299
300 /**
301 * Defaults to false on Jetpack sites, however is used on WordPress.com sites. This nonce is used for previews on Jetpack sites.
302 *
303 * @see /wpcom/public.api/rest/sal/class.json-api-site-jetpack-shadow.php.
304 *
305 * @return bool
306 */
307 public function get_frame_nonce() {
308 return false;
309 }
310
311 /**
312 * Defaults to false on Jetpack sites, however is used on WordPress.com sites,
313 * where it creates a nonce to be used with iframed block editor requests to a Jetpack site.
314 *
315 * @see /wpcom/public.api/rest/sal/class.json-api-site-jetpack-shadow.php.
316 *
317 * @return bool
318 */
319 public function get_jetpack_frame_nonce() {
320 return false;
321 }
322
323 /**
324 * Defaults to false on Jetpack sites, however is used on WordPress.com sites, where it returns true if the headstart-fresh blog sticker is present.
325 *
326 * @see /wpcom/public.api/rest/sal/trait.json-api-site-wpcom.php.
327 *
328 * @return bool
329 */
330 public function is_headstart_fresh() {
331 return false;
332 }
333
334 /**
335 * Returns the allowed mime types and file extensions for a site.
336 *
337 * @return array
338 */
339 public function allowed_file_types() {
340 $allowed_file_types = array();
341
342 // https://codex.wordpress.org/Uploading_Files.
343 $mime_types = get_allowed_mime_types();
344 foreach ( $mime_types as $type => $mime_type ) {
345 $extras = explode( '|', $type );
346 foreach ( $extras as $extra ) {
347 $allowed_file_types[] = $extra;
348 }
349 }
350
351 return $allowed_file_types;
352 }
353
354 /**
355 * Return site's privacy status.
356 *
357 * @return bool Is site private?
358 */
359 public function is_private() {
360 return (int) $this->get_atomic_cloud_site_option( 'blog_public' ) === -1;
361 }
362
363 /**
364 * Return site's coming soon status.
365 *
366 * @return bool Is site "Coming soon"?
367 */
368 public function is_coming_soon() {
369 return $this->is_private() && (int) $this->get_atomic_cloud_site_option( 'wpcom_coming_soon' ) === 1;
370 }
371
372 /**
373 * Return site's launch status.
374 *
375 * @return string|bool Launch status ('launched', 'unlaunched', or false).
376 */
377 public function get_launch_status() {
378 return $this->get_atomic_cloud_site_option( 'launch-status' );
379 }
380
381 /**
382 * Given an option name, returns false if the site isn't WoA or doesn't have the ability to retrieve cloud site options.
383 * Otherwise, if the option name exists amongst Jetpack options, the option value is returned.
384 *
385 * @param string $option The option name to check.
386 *
387 * @return string|bool
388 */
389 public function get_atomic_cloud_site_option( $option ) {
390 if ( ! ( new Host() )->is_woa_site() ) {
391 return false;
392 }
393
394 $jetpack = Jetpack::init();
395 if ( ! method_exists( $jetpack, 'get_cloud_site_options' ) ) {
396 return false;
397 }
398
399 $result = $jetpack->get_cloud_site_options( array( $option ) );
400 if ( ! array_key_exists( $option, $result ) ) {
401 return false;
402 }
403
404 return $result[ $option ];
405 }
406
407 /**
408 * Defaults to false instead of returning the current site plan.
409 *
410 * @return bool
411 */
412 public function get_plan() {
413 return false;
414 }
415
416 /**
417 * Defaults to 0 for the number of WordPress.com subscribers - this is filled in on the WordPress.com side.
418 *
419 * @see /wpcom/public.api/rest/sal/trait.json-api-site-wpcom.php.
420 *
421 * @return int
422 */
423 public function get_subscribers_count() {
424 return 0;
425 }
426
427 /**
428 * Defaults to false - this is filled on the WordPress.com side in multiple locations.
429 *
430 * @see WPCOM_JSON_API_GET_Site_Endpoint::decorate_jetpack_response.
431 * @return bool
432 */
433 public function get_capabilities() {
434 return false;
435 }
436
437 /**
438 * Returns the language code for the current site.
439 *
440 * @return string
441 */
442 public function get_locale() {
443 return get_bloginfo( 'language' );
444 }
445
446 /**
447 * The flag indicates that the site has Jetpack installed.
448 *
449 * @return bool
450 */
451 public function is_jetpack() {
452 return true;
453 }
454
455 /**
456 * The flag indicates that the site is connected to WP.com via Jetpack Connection.
457 *
458 * @return bool
459 */
460 public function is_jetpack_connection() {
461 return true;
462 }
463
464 /**
465 * Returns the current site's Jetpack version.
466 *
467 * @return string
468 */
469 public function get_jetpack_version() {
470 return JETPACK__VERSION;
471 }
472
473 /**
474 * Empty function declaration - this function is filled out on the WordPress.com side, returning true if the site has an AK / VP bundle.
475 *
476 * @see /wpcom/public.api/rest/sal/class.json-api-site-jetpack-shadow.php.
477 */
478 public function get_ak_vp_bundle_enabled() {}
479
480 /**
481 * Returns the front page meta description for current site.
482 *
483 * @see /modules/seo-tools/class-jetpack-seo-utils.php.
484 *
485 * @return string
486 */
487 public function get_jetpack_seo_front_page_description() {
488 return Jetpack_SEO_Utils::get_front_page_meta_description();
489 }
490
491 /**
492 * Returns custom title formats from site option.
493 *
494 * @see /modules/seo-tools/class-jetpack-seo-titles.php.
495 *
496 * @return array
497 */
498 public function get_jetpack_seo_title_formats() {
499 return Jetpack_SEO_Titles::get_custom_title_formats();
500 }
501
502 /**
503 * Returns website verification codes. Allowed keys include: google, pinterest, bing, yandex, facebook.
504 *
505 * @see /modules/verification-tools/blog-verification-tools.php.
506 *
507 * @return array
508 */
509 public function get_verification_services_codes() {
510 return get_option( 'verification_services_codes', null );
511 }
512
513 /**
514 * Returns null for Jetpack sites. For WordPress.com sites this returns the value of the 'podcasting_archive' option.
515 *
516 * @see /wpcom/public.api/rest/sal/class.json-api-site-wpcom.php.
517 *
518 * @return null
519 */
520 public function get_podcasting_archive() {
521 return null;
522 }
523
524 /**
525 * Defaulting to true, this function is expanded out on the WordPress.com side, returning an error if the site is not connected or not communicating to us.
526 *
527 * @see /wpcom/public.api/rest/sal/class.json-api-site-jetpack-shadow.php.
528 *
529 * @return bool
530 */
531 public function is_connected_site() {
532 return true;
533 }
534
535 /**
536 * Defaulting to false and not relevant for Jetpack sites, this is expanded on the WordPress.com side for a specific wp.com/start 'WP for teams' flow.
537 *
538 * @see /wpcom/public.api/rest/sal/class.json-api-site-wpcom.php.
539 *
540 * @return bool
541 */
542 public function is_wpforteams_site() {
543 return false;
544 }
545
546 /**
547 * Returns true if a user has got the capability that is being checked, false otherwise.
548 *
549 * @param string $role The capability to check.
550 *
551 * @return bool
552 */
553 public function current_user_can( $role ) {
554 return current_user_can( $role );
555 }
556
557 /**
558 * Check if full site editing should be considered as currently active. Full site editing
559 * requires the FSE plugin to be installed and activated, as well the current
560 * theme to be FSE compatible. The plugin can also be explicitly disabled via the
561 * a8c_disable_full_site_editing filter.
562 *
563 * @since 7.7.0
564 *
565 * @return bool true if full site editing is currently active.
566 */
567 public function is_fse_active() {
568 if ( ! Jetpack::is_plugin_active( 'full-site-editing/full-site-editing-plugin.php' ) ) {
569 return false;
570 }
571 if ( function_exists( '\Automattic\Jetpack\Jetpack_Mu_Wpcom\Wpcom_Legacy_FSE\is_full_site_editing_active' ) ) {
572 // @phan-suppress-next-line PhanUndeclaredFunction
573 return \Automattic\Jetpack\Jetpack_Mu_Wpcom\Wpcom_Legacy_FSE\is_full_site_editing_active();
574 }
575 return function_exists( '\A8C\FSE\is_full_site_editing_active' ) && \A8C\FSE\is_full_site_editing_active();
576 }
577
578 /**
579 * Check if site should be considered as eligible for full site editing. Full site editing
580 * requires the FSE plugin to be installed and activated. For this method to return true
581 * the current theme does not need to be FSE compatible. The plugin can also be explicitly
582 * disabled via the a8c_disable_full_site_editing filter.
583 *
584 * @since 8.1.0
585 *
586 * @return bool true if site is eligible for full site editing
587 */
588 public function is_fse_eligible() {
589 if ( ! Jetpack::is_plugin_active( 'full-site-editing/full-site-editing-plugin.php' ) ) {
590 return false;
591 }
592 if ( function_exists( '\Automattic\Jetpack\Jetpack_Mu_Wpcom\Wpcom_Legacy_FSE\is_site_eligible_for_full_site_editing' ) ) {
593 // @phan-suppress-next-line PhanUndeclaredFunction
594 return \Automattic\Jetpack\Jetpack_Mu_Wpcom\Wpcom_Legacy_FSE\is_site_eligible_for_full_site_editing();
595 }
596 return function_exists( '\A8C\FSE\is_site_eligible_for_full_site_editing' ) && \A8C\FSE\is_site_eligible_for_full_site_editing();
597 }
598
599 /**
600 * Check if site should be considered as eligible for use of the core Site Editor.
601 * The Site Editor requires a block based theme to be active.
602 *
603 * @since 12.2 Uses wp_is_block_theme() to determine if site is eligible instead of gutenberg_is_fse_theme().
604 * @return bool true if site is eligible for the Site Editor
605 */
606 public function is_core_site_editor_enabled() {
607 return wp_is_block_theme();
608 }
609
610 /**
611 * Return the last engine used for an import on the site. Not used in Jetpack.
612 *
613 * @see /wpcom/public.api/rest/sal/class.json-api-site-wpcom.php.
614 *
615 * @return null
616 */
617 public function get_import_engine() {
618 return null;
619 }
620
621 /**
622 * Post functions
623 */
624
625 /**
626 * Wrap a WP_Post object with SAL methods, returning a Jetpack_Post object.
627 *
628 * @param WP_Post $post A WP_Post object.
629 * @param string $context The post request context (for example 'edit' or 'display').
630 *
631 * @return Jetpack_Post
632 */
633 public function wrap_post( $post, $context ) {
634 return new Jetpack_Post( $this, $post, $context );
635 }
636
637 /**
638 * Get the option storing the Anchor podcast ID that identifies a site as a podcasting site.
639 *
640 * @return string
641 */
642 public function get_anchor_podcast() {
643 return $this->get_atomic_cloud_site_option( 'anchor_podcast' );
644 }
645
646 /**
647 * Get user interactions with a site. Not used in Jetpack.
648 *
649 * @see /wpcom/public.api/rest/sal/trait.json-api-site-wpcom.php.
650 *
651 * @return null
652 */
653 public function get_user_interactions() {
654 return null;
655 }
656
657 /**
658 * Get site deleted status. Not used in Jetpack.
659 *
660 * @see /wpcom/public.api/rest/sal/trait.json-api-site-wpcom.php.
661 *
662 * @return bool
663 */
664 public function is_deleted() {
665 return false;
666 }
667
668 /**
669 * Indicates that a site is an A4A client. Not used in Jetpack.
670 *
671 * @see /wpcom/public.api/rest/sal/trait.json-api-site-wpcom.php.
672 *
673 * @return bool
674 */
675 public function is_a4a_client() {
676 return false;
677 }
678
679 /**
680 * Detect whether a site is WordPress.com Staging Site. Not used in Jetpack.
681 *
682 * @see /wpcom/public.api/rest/sal/trait.json-api-site-wpcom.php.
683 *
684 * @return false
685 */
686 public function is_wpcom_staging_site() {
687 return false;
688 }
689
690 /**
691 * Get site option for the production blog id (if is a WP.com Staging Site). Not used in Jetpack.
692 *
693 * @see /wpcom/public.api/rest/sal/trait.json-api-site-wpcom.php.
694 *
695 * @return null
696 */
697 public function get_wpcom_production_blog_id() {
698 return null;
699 }
700
701 /**
702 * Get site option for the staging blog ids (if it has them). Not used in Jetpack.
703 *
704 * @see /wpcom/public.api/rest/sal/trait.json-api-site-wpcom.php.
705 *
706 * @return null
707 */
708 public function get_wpcom_staging_blog_ids() {
709 return null;
710 }
711
712 /**
713 * Get site option for the admin interface on WordPress.com Atomic sites. Not used in Jetpack.
714 *
715 * @return null
716 */
717 public function get_wpcom_admin_interface() {
718 return null;
719 }
720
721 /**
722 * Get Zendesk site meta. Not used in Jetpack.
723 *
724 * @return null
725 */
726 public function get_zendesk_site_meta() {
727 return null;
728 }
729
730 /**
731 * Detect whether there's a pending plan for this site. Not used in Jetpack.
732 *
733 * @return false
734 */
735 public function is_pending_plan() {
736 return false;
737 }
738 }
739