PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 16.3-a.5
Jetpack – WP Security, Backup, Speed, & Growth v16.3-a.5
16.3-a.5 16.3-a.7 16.3-a.3 16.3-a.1 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 All 506 releases
← All changes | jetpack_vendor/automattic/jetpack-forms/src/class-jetpack-forms.php +235 -10 12.7.3 → 16.3-a.5 View file →
@@ -6,38 +6,74 @@
6 6 */
7 7
8 8 namespace Automattic\Jetpack\Forms;
9 9
10 +use Automattic\Jetpack\Feature_Flags\Feature_Flags;
11 +use Automattic\Jetpack\Forms\ContactForm\Feedback_Source;
10 12 use Automattic\Jetpack\Forms\ContactForm\Util;
11 13 use Automattic\Jetpack\Forms\Dashboard\Dashboard;
12 -use Automattic\Jetpack\Forms\Dashboard\Dashboard_View_Switch;
13 14 /**
14 15 * Understands the Jetpack Forms package.
15 16 */
16 17 class Jetpack_Forms {
17 18
18 - const PACKAGE_VERSION = '0.22.2';
19 + const PACKAGE_VERSION = '8.2.1';
19 20
20 21 /**
22 + * Name of the feature flag gating field conditional logic.
23 + */
24 + const CONDITIONAL_LOGIC_FLAG = 'forms-conditional-logic';
25 +
26 + /**
27 + * Register the package's feature flags.
28 + *
29 + * Registration is unconditional and happens as the package loads, so the full set stays
30 + * discoverable through `Feature_Flags::all()` and nothing can call `is_enabled()` on an
31 + * unregistered flag.
32 + *
33 + * @return void
34 + */
35 + public static function register_feature_flags() {
36 + Feature_Flags::register(
37 + self::CONDITIONAL_LOGIC_FLAG,
38 + array(
39 + 'default' => false,
40 + 'description' => 'Show or hide a form field based on the answer to another field.',
41 + 'owner' => 'jetpack-forms',
42 + )
43 + );
44 + }
45 +
46 + /**
21 47 * Load the contact form module.
22 48 */
23 49 public static function load_contact_form() {
50 + self::register_feature_flags();
51 +
24 52 Util::init();
25 53
26 - if ( is_admin() && self::is_feedback_dashboard_enabled() ) {
27 - $view_switch = new Dashboard_View_Switch();
28 -
29 - $dashboard = new Dashboard( $view_switch );
54 + if ( self::is_feedback_dashboard_enabled() ) {
55 + $dashboard = new Dashboard();
30 56 $dashboard->init();
31 57 }
32 58
33 - if ( is_admin() && apply_filters( 'tmp_grunion_allow_editor_view', true ) ) {
59 + if ( is_admin() && apply_filters_deprecated( 'tmp_grunion_allow_editor_view', array( true ), '0.30.5', '', 'This functionality will be removed in an upcoming version.' ) ) {
34 60 add_action( 'current_screen', '\Automattic\Jetpack\Forms\ContactForm\Editor_View::add_hooks' );
35 61 }
36 62
37 63 add_action( 'init', '\Automattic\Jetpack\Forms\ContactForm\Util::register_pattern' );
38 64
39 - add_action( 'rest_api_init', array( new WPCOM_REST_API_V2_Endpoint_Forms(), 'register_rest_routes' ) );
65 + // Add hook to delete file attachments when a feedback post is deleted
66 + add_action( 'before_delete_post', array( '\Automattic\Jetpack\Forms\ContactForm\Contact_Form', 'delete_feedback_files' ) );
67 +
68 + // Invalidate the source post IDs cache when a feedback post is permanently deleted.
69 + add_action( 'deleted_post', array( '\Automattic\Jetpack\Forms\ContactForm\Feedback', 'invalidate_source_ids_cache_on_delete' ), 10, 2 );
70 +
71 + // Enforces the availability of block support controls in the UI for classic themes.
72 + add_filter( 'wp_theme_json_data_default', array( '\Automattic\Jetpack\Forms\ContactForm\Contact_Form', 'add_theme_json_data_for_classic_themes' ) );
73 +
74 + // Initialize abilities registration for WordPress Abilities API (WP 6.9+)
75 + \Automattic\Jetpack\Forms\Abilities\Forms_Abilities::init();
40 76 }
41 77
42 78 /**
43 79 * Get the plugin URL.
@@ -59,14 +95,203 @@
59 95 * @return boolean
60 96 */
61 97 public static function is_feedback_dashboard_enabled() {
62 98 /**
63 - * Enable the new Jetpack Forms dashboard.
99 + * Enable the Jetpack Forms dashboard.
64 100 *
101 + * Returning false hides the Forms admin menu entry and skips the dashboard
102 + * entirely. Unrelated to which dashboard renders — there is only one.
103 + *
65 104 * @module contact-form
66 105 * @since 0.3.0
67 106 *
68 - * @param bool false Should the new Jetpack Forms dashboard be enabled? Default to false.
107 + * @param bool $enabled Should the Jetpack Forms dashboard be enabled? Default true.
69 108 */
70 109 return apply_filters( 'jetpack_forms_dashboard_enable', true );
110 + }
111 +
112 + /**
113 + * Returns true if the legacy menu item is retired.
114 + *
115 + * @return boolean
116 + */
117 + public static function is_legacy_menu_item_retired() {
118 + return apply_filters( 'jetpack_forms_retire_legacy_menu_item', true );
119 + }
120 +
121 + /**
122 + * Returns true if MailPoet integration is enabled.
123 + *
124 + * @return boolean
125 + */
126 + public static function is_mailpoet_enabled() {
127 + /**
128 + * Enable MailPoet integration.
129 + *
130 + * @param bool false Whether MailPoet integration be enabled. Default is false.
131 + */
132 + return apply_filters( 'jetpack_forms_mailpoet_enable', true );
133 + }
134 +
135 + /**
136 + * Returns true if Hostinger Reach integration is enabled.
137 + *
138 + * @return boolean
139 + */
140 + public static function is_hostinger_reach_enabled() {
141 + /**
142 + * Enable Hostinger Reach integration.
143 + *
144 + * @param bool false Whether Hostinger Reach integration be enabled. Default is false.
145 + */
146 + return apply_filters( 'jetpack_forms_hostinger_reach_enable', false );
147 + }
148 +
149 + /**
150 + * Returns true if the Integrations UI should be enabled.
151 + *
152 + * @return boolean
153 + */
154 + public static function is_integrations_enabled() {
155 + /**
156 + * Whether to enable the Integrations UI.
157 + *
158 + * @param bool true Whether to enable the Integrations UI. Default true.
159 + */
160 + return apply_filters( 'jetpack_forms_is_integrations_enabled', true );
161 + }
162 +
163 + /**
164 + * Returns true if field conditional logic is enabled.
165 + *
166 + * One switch for the whole feature: the editor panel, the front-end show/hide, and the
167 + * submission-time enforcement in validation and storage. Gating them together means a
168 + * form can never hide a field from the visitor while still requiring it on submit.
169 + *
170 + * Turning the flag off on a form that already has conditions is safe: the conditions are
171 + * simply ignored, so every field renders, validates and stores as an ordinary field.
172 + *
173 + * @return boolean
174 + */
175 + public static function is_conditional_logic_enabled() {
176 + return Feature_Flags::is_enabled( self::CONDITIONAL_LOGIC_FLAG );
177 + }
178 +
179 + /**
180 + * Returns true if webhooks are enabled.
181 + *
182 + * @return boolean
183 + */
184 + public static function is_webhooks_enabled() {
185 + /**
186 + * Whether to enable webhooks for Jetpack Forms.
187 + *
188 + * @param bool true Whether webhooks should be enabled. Default true.
189 + */
190 + return apply_filters( 'jetpack_forms_webhooks_enabled', true );
191 + }
192 +
193 + /**
194 + * Whether author-configured outbound destinations from a form source should be honored.
195 + *
196 + * Destinations declared in the form content (webhooks, the legacy postToUrl attribute and
197 + * the Salesforce integration) carry submission data to an outbound URL, so they are only
198 + * honored when whoever placed the form had an administrator-level capability:
199 + *
200 + * - For post/page forms (`single`, numeric source id) the source post's author must have
201 + * the `manage_options` capability. Editor/Author/Contributor-authored forms are dropped.
202 + * - For block templates, block template parts and widgets the source id is not a numeric
203 + * post, so there is no author to check. Editing any of those surfaces already requires
204 + * the `edit_theme_options` capability — administrator-tier, strictly above the
205 + * capabilities an Editor/Author/Contributor holds — so their destinations are trusted.
206 + *
207 + * The source type is established server-side (from the signed JWT, or by re-rendering the
208 + * real template/template part on the legacy path) and is not forgeable by the submitter.
209 + *
210 + * Returns false for any other unresolved source (non-numeric id of an unknown type, or a
211 + * numeric id with no admin-capable author).
212 + *
213 + * @param int|string $source_id The form source id: a post id for post/page forms, or a
214 + * non-numeric value for widget or block-template sources.
215 + * @param string $source_type The form source type: single, widget, block_template or
216 + * block_template_part. Defaults to 'single'.
217 + * @return boolean
218 + */
219 + public static function should_honor_content_destinations( $source_id, $source_type = 'single' ) {
220 + // Block templates, template parts and widgets can only be authored by users with the
221 + // administrator-tier `edit_theme_options` capability, so their destinations are trusted
222 + // even though the source id is not a numeric post.
223 + if ( in_array( $source_type, Feedback_Source::ADMIN_TIER_SOURCE_TYPES, true ) ) {
224 + return true;
225 + }
226 +
227 + if ( ! is_numeric( $source_id ) ) {
228 + return false;
229 + }
230 +
231 + $source_id = (int) $source_id;
232 + if ( $source_id <= 0 ) {
233 + return false;
234 + }
235 +
236 + $author_id = (int) get_post_field( 'post_author', $source_id );
237 +
238 + return $author_id > 0 && user_can( $author_id, 'manage_options' );
239 + }
240 +
241 + /**
242 + * Returns true if the Integrations UI should be shown in the Forms dashboard.
243 + *
244 + * @since 6.22.0
245 + *
246 + * @return boolean
247 + */
248 + public static function show_dashboard_integrations() {
249 + /**
250 + * Whether to show Integrations UI in the Forms dashboard.
251 + *
252 + * @since 6.22.0
253 + *
254 + * @param bool true Whether to show the Integrations UI in the dashboard. Default true.
255 + */
256 + return apply_filters( 'jetpack_forms_show_dashboard_integrations', true );
257 + }
258 +
259 + /**
260 + * Returns true if the Integrations UI should be shown in the Form block editor.
261 + *
262 + * @since 6.22.0
263 + *
264 + * @return boolean
265 + */
266 + public static function show_block_integrations() {
267 + /**
268 + * Whether to show Integrations UI in the Form block editor.
269 + *
270 + * @since 6.22.0
271 + *
272 + * @param bool true Whether to show the Integrations UI in the editor. Default true.
273 + */
274 + return apply_filters( 'jetpack_forms_show_block_integrations', true );
275 + }
276 +
277 + /**
278 + * Returns true if integration icons should be shown (editor sidebar and integrations modal).
279 + *
280 + * @since 6.22.0
281 + *
282 + * @return boolean
283 + */
284 + public static function show_integration_icons() {
285 + /**
286 + * Whether to show integration icons in the UI.
287 + *
288 + * If set to false, the ActiveIntegrations component (editor sidebar) will be hidden
289 + * and integration icons in the integrations modal will not be rendered.
290 + *
291 + * @since 6.22.0
292 + *
293 + * @param bool true Whether to show integration icons. Default true.
294 + */
295 + return apply_filters( 'jetpack_forms_show_integration_icons', true );
71 296 }
72 297 }