PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / trunk
Jetpack – WP Security, Backup, Speed, & Growth vtrunk
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 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 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 / _inc / content-guidelines-ai.php
jetpack / _inc Last commit date
blocks 14 hours ago build 14 hours ago fonts 2 years ago genericons 6 months ago lib 14 hours ago shared 1 week ago accessible-focus.js 6 years ago blogging-prompts.php 2 months ago class.jetpack-provision.php 8 months ago content-guidelines-ai.js 1 month ago content-guidelines-ai.php 1 week ago crowdsignal-shortcode.js 1 year ago crowdsignal-survey.js 6 years ago deprecate.js 9 months ago facebook-embed.js 4 years ago gallery-settings.js 6 years ago genericons.php 1 year ago jetpack-admin.js 3 years ago jetpack-ai-scheduled-tasks-provider.js 14 hours ago jetpack-deactivate-dialog.js 1 year ago jetpack-modules.js 4 weeks ago jetpack-modules.models.js 4 weeks ago jetpack-modules.views.js 4 weeks ago polldaddy-shortcode.js 1 month ago site-switcher-endpoint.php 7 months ago site-switcher.jsx 1 week ago site-switcher.php 6 months ago social-logos.php 5 months ago twitter-timeline.js 2 months ago
content-guidelines-ai.php
143 lines
1 <?php
2 /**
3 * Content Guidelines AI — Jetpack AI integration.
4 *
5 * Enqueues a standalone JS bundle on the Content Guidelines admin page
6 * that adds AI-powered guideline generation via Jetpack.
7 *
8 * @package automattic/jetpack
9 */
10
11 use Automattic\Jetpack\Assets;
12 use Automattic\Jetpack\Status\Host;
13 use Automattic\Jetpack\Status\Visitor;
14 use Automattic\Jetpack\Tracking;
15
16 if ( ! defined( 'ABSPATH' ) ) {
17 exit( 0 );
18 }
19
20 /**
21 * Check whether the current visitor should be marked as Automattician traffic.
22 *
23 * @since 16.2
24 *
25 * @return bool True when the visitor is Automattician traffic.
26 */
27 function jetpack_content_guidelines_ai_is_tracking_automattician() {
28 $visitor = new Visitor();
29
30 // Another plugin can supply an older copy of jetpack-status through its own
31 // autoloader, where this method does not exist yet.
32 if ( ! method_exists( $visitor, 'is_tracking_automattician' ) ) {
33 return ( function_exists( 'is_automattician' ) && is_automattician() )
34 || ( function_exists( 'wpcom_is_proxied_request' ) && wpcom_is_proxied_request() )
35 || ( defined( 'AT_PROXIED_REQUEST' ) && AT_PROXIED_REQUEST );
36 }
37
38 return $visitor->is_tracking_automattician();
39 }
40
41 /**
42 * Enqueue content-guidelines-ai script on the Content Guidelines admin page.
43 *
44 * @since 16.0
45 *
46 * @param string $hook_suffix The current admin page hook suffix.
47 */
48 function jetpack_content_guidelines_ai_enqueue_scripts( $hook_suffix ) {
49 if ( 'settings_page_guidelines-wp-admin' !== $hook_suffix ) {
50 return;
51 }
52
53 // Content Guidelines AI is only offered on WordPress.com platform sites
54 // (Simple and Atomic) and WordPress VIP sites — a hard gate the
55 // jetpack_ai_enabled filter below cannot widen. Free-tier sites still load
56 // the bundle so the upgrade path can be shown — the paid-plan requirement
57 // is enforced by the suggest-guidelines API.
58 $host = new Host();
59 if ( ! $host->is_wpcom_platform() && ! $host->is_vip_site() ) {
60 return;
61 }
62
63 // Bail when Jetpack AI is disabled for the site: the AI settings master
64 // switch and other site-wide disables ride this filter.
65 /** This filter is documented in projects/plugins/jetpack/_inc/lib/class-jetpack-ai-helper.php */
66 if ( ! apply_filters( 'jetpack_ai_enabled', true ) ) {
67 return;
68 }
69
70 // Bail when build artifacts are missing rather than enqueueing a script
71 // with guessed (and likely wrong) dependencies.
72 if ( ! file_exists( JETPACK__PLUGIN_DIR . '_inc/build/content-guidelines-ai.min.asset.php' ) ) {
73 return;
74 }
75
76 // The bundle records Tracks events via @automattic/jetpack-analytics,
77 // which only queues into window._tkq. Enqueue the Tracks client (w.js)
78 // so events send without relying on whichever platform widgets happen
79 // to load it.
80 Tracking::register_tracks_functions_scripts( true );
81
82 // Handles dependencies/version from the asset file, JS translations for
83 // the text domain, the CSS (including the .rtl.css variant), and style
84 // dependencies derived from the script's.
85 Assets::register_script(
86 'jetpack-content-guidelines-ai',
87 '_inc/build/content-guidelines-ai.min.js',
88 JETPACK__PLUGIN_FILE,
89 array(
90 'in_footer' => true,
91 'textdomain' => 'jetpack',
92 'css_path' => '_inc/build/content-guidelines-ai.css',
93 'enqueue' => true,
94 )
95 );
96
97 // Jetpack_AI_Helper backs both preloaded values below: the per-user
98 // "banner dismissed" flag and the AI feature state.
99 if ( ! class_exists( 'Jetpack_AI_Helper' ) && is_readable( JETPACK__PLUGIN_DIR . '_inc/lib/class-jetpack-ai-helper.php' ) ) {
100 require_once JETPACK__PLUGIN_DIR . '_inc/lib/class-jetpack-ai-helper.php';
101 }
102
103 // Preload the per-user "banner dismissed" flag so the empty-state banner
104 // doesn't flash before an async read. Persisted via the
105 // guidelines-banner-dismissed REST endpoint, but read via Jetpack_AI_Helper
106 // rather than the endpoint class: on Simple sites the wpcom-endpoints
107 // classes are only loaded in REST requests, so a class_exists() check on
108 // the endpoint always failed here and permanently suppressed the banner
109 // and upgrade notice.
110 $initial_state = array(
111 'bannerDismissed' => class_exists( 'Jetpack_AI_Helper' ) && Jetpack_AI_Helper::is_guidelines_banner_dismissed(),
112 // Tags every Tracks event fired from this page as internal traffic. The
113 // feature is new and low-volume, so Automattician testing is otherwise a
114 // visible share of the numbers with no way to filter it out after the fact.
115 'isA11n' => jetpack_content_guidelines_ai_is_tracking_automattician(),
116 );
117
118 // Resolve the AI feature state server-side so the bundle can hydrate the
119 // wordpress-com/plans store at boot and render the correct locked/unlocked
120 // buttons on first paint, with no client-side plan fetch. On WordPress.com
121 // Simple this is a synchronous local lookup; on Atomic/self-hosted it is
122 // transient-cached with a blocking remote refresh when cold. On failure
123 // the key is omitted and the bundle renders no AI UI for this load (fail
124 // closed) rather than guessing.
125 if ( class_exists( 'Jetpack_AI_Helper' ) ) {
126 $ai_feature = Jetpack_AI_Helper::get_ai_assistance_feature();
127 if ( ! is_wp_error( $ai_feature ) ) {
128 $initial_state['aiFeature'] = $ai_feature;
129 }
130 }
131
132 wp_add_inline_script(
133 'jetpack-content-guidelines-ai',
134 'window.jetpackContentGuidelinesAi = ' . wp_json_encode(
135 $initial_state,
136 JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT
137 ) . ';',
138 'before'
139 );
140 }
141
142 add_action( 'admin_enqueue_scripts', 'jetpack_content_guidelines_ai_enqueue_scripts' );
143