PluginProbe ʕ •ᴥ•ʔ
Conditional Fields for Contact Form 7 / 2.2.10
Conditional Fields for Contact Form 7 v2.2.10
2.7.10 2.7.9 2.7.8 2.7.7 2.7.6 2.7.5 2.7.4 2.7.3 2.7.2 0.2.4 0.2.5 0.2.6 0.2.7 0.2.8 0.2.9 1.0 1.1 1.2 1.2.1 1.2.2 1.2.3 1.3 1.3.1 1.3.2 1.3.3 1.3.4 1.4 1.4.1 1.4.2 1.4.3 1.5 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.6.1 1.6.2 1.6.3 1.6.5 1.7 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.8 1.7.9 1.8 1.8.1 1.8.2 1.8.3 1.8.5 1.8.6 1.8.7 1.9 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.15 1.9.16 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.2 2.2.1 2.2.10 2.2.11 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.2.7 2.2.8 2.2.9 2.3 2.3.1 2.3.10 2.3.11 2.3.12 2.3.2 2.3.3 2.3.4 2.3.5 2.3.6 2.3.7 2.3.8 2.3.9 2.4 2.4.1 2.4.10 2.4.11 2.4.12 2.4.13 2.4.14 2.4.15 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.4.8 2.4.9 2.5 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.14 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6 2.6.1 2.6.2 2.6.3 2.6.4 2.6.5 2.6.6 2.6.7 2.6.8 2.7 2.7.1 trunk 0.1 0.1.1 0.1.2 0.1.3 0.1.4 0.1.5 0.1.6 0.1.7 0.2 0.2.1 0.2.2 0.2.3
cf7-conditional-fields / cf7cf.php
cf7-conditional-fields Last commit date
js 3 years ago jsdoc-out 4 years ago Wpcf7cfMailParser.php 4 years ago admin-style.css 4 years ago admin-style.css.map 6 years ago admin-style.scss 4 years ago admin.php 3 years ago cf7cf.php 3 years ago contact-form-7-conditional-fields.php 3 years ago init.php 3 years ago readme.txt 3 years ago style.css 3 years ago tg_pane_group.php 5 years ago wpcf7cf-options.php 4 years ago
cf7cf.php
552 lines
1 <?php
2
3 class CF7CF {
4 private $hidden_fields = array();
5 private $visible_groups = array();
6 private $hidden_groups = array();
7 private $repeaters = array();
8
9 function __construct() {
10
11 // Register shortcodes
12 add_action('wpcf7_init', array(__CLASS__, 'add_shortcodes'));
13
14 // Tag generator
15 add_action('admin_init', array(__CLASS__, 'tag_generator'), 590);
16
17 // compatibility with CF7 multi-step forms by Webhead LLC.
18 add_filter( 'wpcf7_posted_data', array($this,'cf7msm_merge_post_with_cookie'), 8, 1 );
19
20 // compatibility with CF7 Multi Step by NinjaTeam https://wordpress.org/plugins/cf7-multi-step/
21 add_action('wp_ajax_cf7mls_validation', array($this,'cf7mls_validation_callback'),9);
22 add_action('wp_ajax_nopriv_cf7mls_validation', array($this,'cf7mls_validation_callback'),9);
23
24 add_filter( 'wpcf7_validate', array($this, 'skip_validation_for_hidden_fields'), 2, 2 );
25
26 add_filter( 'wpcf7_validate_file*', array($this, 'skip_validation_for_hidden_file_field'), 30, 3);
27 add_filter( 'wpcf7_validate_multifile*', array($this, 'skip_validation_for_hidden_file_field'), 30, 3);
28
29 // If acceptance_as_validation is on, then Acceptance fields inside hidden groups should not trigger an error
30 add_filter( 'wpcf7_acceptance', function($accepted, $submission) {
31 $acceptance_as_validation = $submission->get_contact_form()->additional_setting('acceptance_as_validation');
32 return $accepted || (is_array($acceptance_as_validation) && in_array('on', $acceptance_as_validation));
33 }, 20, 2 );
34
35 // validation messages
36 add_action('wpcf7_config_validator_validate', array($this,'wpcf7cf_config_validator_validate'));
37
38 add_action("wpcf7_before_send_mail", [$this, 'hide_hidden_mail_fields'], 10, 3);
39
40 // disable autop because it introduces too many problems with parsing.
41 // If you still want to use autop (at your own risk) copy this line to your functions.php file:
42 // add_filter( 'wpcf7_autop_or_not', '__return_true', 41, 0);
43 add_filter( 'wpcf7_autop_or_not', '__return_false', 40, 0);
44
45 register_activation_hook(__FILE__, array($this, 'activate'));
46
47 if (is_admin()) {
48 require_once dirname(__FILE__) . '/admin.php';
49 }
50 }
51
52
53
54 /**
55 * Suppress invalid mailbox syntax errors on fields that contain existing conditional
56 */
57 function wpcf7cf_config_validator_validate(WPCF7_ConfigValidator $wpcf7_config_validator) {
58
59 // TODO: For now we kill every syntax error once a [groupname] tag is detected.
60 // Ideally, this function should check each string inside the group for invalid syntax.
61 // TODO 2: ajax validation not working yet, because $cf->scan_form_tags() does not seem to contain group tags if it's an ajax request. Need to investigate.
62
63 $cf = $wpcf7_config_validator->contact_form();
64 $all_group_tags = $cf->scan_form_tags();
65
66 foreach ($wpcf7_config_validator->collect_error_messages() as $err_type => $err) {
67
68 // print_r($err_type);
69
70 $parts = explode('.',$err_type);
71
72 $property = $parts[0];
73
74 if ($property == 'form') continue; // the 'form' field can be safely validated by CF7. No need to suppress it.
75
76 $sub_prop = $parts[1];
77 $prop_val = $cf->prop($property)[$sub_prop];
78
79
80 // TODO 2: Dirty hack. Because of TODO 2 we are just going to kill the error message if we detect the string '[/'
81 // Start removing here.
82 if (strpos($prop_val, '[/') !== false) {
83 $wpcf7_config_validator->remove_error($err_type, WPCF7_ConfigValidator::error_invalid_mailbox_syntax);
84 continue;
85 }
86 // TODO 2: Stop removing here. and uncomment code below.
87
88 // foreach ($all_group_tags as $form_tag) {
89 // if (strpos($prop_val, '['.$form_tag->name.']') !== false) {
90 // $wpcf7_config_validator->remove_error($err_type, WPCF7_ConfigValidator::error_invalid_mailbox_syntax);
91 // }
92 // }
93
94 }
95
96 return new WPCF7_ConfigValidator($wpcf7_config_validator->contact_form());
97 }
98
99 function activate() {
100 //add options with add_option and stuff
101 }
102
103 public static function add_shortcodes() {
104 if (function_exists('wpcf7_add_form_tag'))
105 wpcf7_add_form_tag('group', array(__CLASS__, 'shortcode_handler'), true);
106 else if (function_exists('wpcf7_add_shortcode')) {
107 wpcf7_add_shortcode('group', array(__CLASS__, 'shortcode_handler'), true);
108 } else {
109 throw new Exception('functions wpcf7_add_form_tag and wpcf7_add_shortcode not found.');
110 }
111 }
112
113 function group_shortcode_handler( $atts, $content = "" ) {
114 return $content;
115 }
116
117 public static function shortcode_handler($tag) {
118 //$tag = new WPCF7_Shortcode($tag);
119 $tag = new WPCF7_FormTag($tag);
120 //ob_start();
121 //print_r($tag);
122 //return print_r($tag, true);
123 return $tag->content;
124 }
125
126
127 public static function tag_generator() {
128 if (! function_exists( 'wpcf7_add_tag_generator'))
129 return;
130
131 wpcf7_add_tag_generator('group',
132 __('Conditional Fields Group', 'cf7-conditional-fields'),
133 'wpcf7-tg-pane-group',
134 array(__CLASS__, 'tg_pane')
135 );
136
137 do_action('wpcf7cf_tag_generator');
138 }
139
140 static function tg_pane( $contact_form, $args = '' ) {
141 $args = wp_parse_args( $args, array() );
142 $type = 'group';
143
144 $description = __( "Generate a group tag to group form elements that can be shown conditionally.", 'cf7-conditional-fields' );
145
146 include 'tg_pane_group.php';
147 }
148
149 /**
150 * Remove validation requirements for fields that are hidden at the time of form submission.
151 * Required/invalid fields should never trigger validation errors if they are inside a hidden group during submission.
152 * Called using add_filter( 'wpcf7_validate', array($this, 'skip_validation_for_hidden_fields'), 2, 2 );
153 * where the priority of 2 causes this to kill any validations with a priority higher than 2
154 *
155 * NOTE: CF7 is weirdly designed when it comes to validating a form with files.
156 * Only the non-file fields are considered during the wpcf7_validate filter.
157 * When validation passes for all fields (except the file fields), the files fields are validated individually.
158 * ( see skip_validation_for_hidden_file_field )
159 *
160 * @param $result
161 * @param $tag
162 *
163 * @return mixed
164 */
165 function skip_validation_for_hidden_fields($result, $tags, $args = []) {
166
167 if(isset($_POST)) {
168 $this->set_hidden_fields_arrays($_POST);
169 }
170
171 $invalid_fields = $result->get_invalid_fields();
172 $return_result = new WPCF7_Validation();
173
174 if (count($this->hidden_fields) == 0 || !is_array($invalid_fields) || count($invalid_fields) == 0) {
175 $return_result = $result;
176 } else {
177 foreach ($invalid_fields as $invalid_field_key => $invalid_field_data) {
178 if (!in_array($invalid_field_key, $this->hidden_fields)) {
179 foreach ($tags as $tag) {
180 if ($tag['name'] === $invalid_field_key) {
181 $return_result->invalidate($tag, $invalid_field_data['reason']);
182 }
183 }
184 }
185 }
186 }
187
188 return apply_filters('wpcf7cf_validate', $return_result, $tags);
189
190 }
191
192 /**
193 * Does the same thing as skip_validation_for_hidden_fields, but CF7 will check files again later
194 * via the wpcf7_unship_uploaded_files function
195 * so we need to skip validation a second time for individual file fields
196 */
197 function skip_validation_for_hidden_file_field($result, $tag, $args=[]) {
198
199 if (!count($result->get_invalid_fields())) {
200 return $result;
201 }
202 if(isset($_POST)) {
203 $this->set_hidden_fields_arrays($_POST);
204 }
205
206 $invalid_field_keys = array_keys($result->get_invalid_fields());
207
208 // if the current file is the only invalid tag in the result AND if the file is hidden: return a valid (blank) object
209 if (isset($this->hidden_fields) && is_array($this->hidden_fields) && in_array($tag->name, $this->hidden_fields) && count($invalid_field_keys) == 1) {
210 return new WPCF7_Validation();
211 }
212
213 // if the current file is not hidden, we'll just return the result (keep it invalid).
214 // (Note that this might also return the hidden files as invalid, but that shouldn't matter because the form is invalid, and the notification will be inside a hidden group)
215 return $result;
216 }
217
218 function cf7msm_merge_post_with_cookie($posted_data) {
219
220 if (!function_exists('cf7msm_get') || !key_exists('cf7msm_posted_data',$_COOKIE)) return $posted_data;
221
222 if (!$posted_data) {
223 $posted_data = WPCF7_Submission::get_instance()->get_posted_data();
224 }
225
226 // this will temporarily set the hidden fields data to the posted_data.
227 // later this function will be called again with the updated posted_data
228 $this->set_hidden_fields_arrays($_POST);
229
230 // get cookie data
231 $cookie_data = cf7msm_get('cf7msm_posted_data');
232 $cookie_data_hidden_group_fields = json_decode(stripslashes($cookie_data['_wpcf7cf_hidden_group_fields']));
233 $cookie_data_hidden_groups = json_decode(stripslashes($cookie_data['_wpcf7cf_hidden_groups']));
234 $cookie_data_visible_groups = json_decode(stripslashes($cookie_data['_wpcf7cf_visible_groups']));
235
236 // remove all the currently posted data from the cookie data (we don't wanna add it twice)
237 $cookie_data_hidden_group_fields = array_diff($cookie_data_hidden_group_fields, array_keys($posted_data));
238 $cookie_data_hidden_groups = array_diff((array) $cookie_data_hidden_groups, $this->hidden_groups, $this->visible_groups);
239 $cookie_data_visible_groups = array_diff((array) $cookie_data_visible_groups, $this->hidden_groups, $this->visible_groups);
240
241 // update current post data with cookie data
242 $posted_data['_wpcf7cf_hidden_group_fields'] = addslashes(json_encode(array_merge((array) $cookie_data_hidden_group_fields, $this->hidden_fields)));
243 $posted_data['_wpcf7cf_hidden_groups'] = addslashes(json_encode(array_merge((array) $cookie_data_hidden_groups, $this->hidden_groups)));
244 $posted_data['_wpcf7cf_visible_groups'] = addslashes(json_encode(array_merge((array) $cookie_data_visible_groups, $this->visible_groups)));
245
246 return $posted_data;
247 }
248
249 // compatibility with CF7 Multi Step by NinjaTeam https://wordpress.org/plugins/cf7-multi-step/
250 function cf7mls_validation_callback() {
251 $this->set_hidden_fields_arrays($_POST);
252 }
253
254 /**
255 * Finds the currently submitted form and set the hidden_fields variables accoringly
256 *
257 * @param bool|array $posted_data
258 */
259 function set_hidden_fields_arrays($posted_data = false) {
260
261 if (!$posted_data) $posted_data = $_POST;
262
263 $hidden_fields = json_decode(stripslashes($posted_data['_wpcf7cf_hidden_group_fields']));
264 if (is_array($hidden_fields) && count($hidden_fields) > 0) {
265 foreach ($hidden_fields as $field) {
266 $this->hidden_fields[] = $field;
267 if (wpcf7cf_endswith($field, '[]')) {
268 $this->hidden_fields[] = substr($field,0,strlen($field)-2);
269 }
270 }
271 }
272 $this->hidden_groups = json_decode(stripslashes($posted_data['_wpcf7cf_hidden_groups']));
273 $this->visible_groups = json_decode(stripslashes($posted_data['_wpcf7cf_visible_groups']));
274 $this->repeaters = json_decode(stripslashes($posted_data['_wpcf7cf_repeaters']));
275 $this->steps = json_decode(stripslashes($posted_data['_wpcf7cf_steps']));
276 }
277
278 function hide_hidden_mail_fields($form,$abort,$submission) {
279 $props = $form->get_properties();
280 $mails = ['mail','mail_2','messages'];
281 foreach ($mails as $mail) {
282 if (!is_array($props[$mail])) { continue; }
283 foreach ($props[$mail] as $key=>$val) {
284
285 // remove unwanted whitespace between closing and opening groups from email
286 $count = 1;
287 while ($count) {
288 $val = preg_replace(WPCF7CF_REGEX_MAIL_UNWANTED_WHITESPACE, '$1$2', $val, -1, $count);
289 }
290
291 // remove hiddden groups from email
292 $parser = new Wpcf7cfMailParser($val, $this->visible_groups, $this->hidden_groups, $this->repeaters, $_POST);
293 $props[$mail][$key] = $parser->getParsedMail();
294 }
295 }
296
297
298 //$props['mail']['body'] = 'xxx';
299 $form->set_properties($props);
300 }
301
302 function hide_hidden_mail_fields_regex_callback ( $matches ) {
303 $name = $matches[1];
304 $content = $matches[2];
305 if ( in_array( $name, $this->hidden_groups ) ) {
306 // The tag name represents a hidden group, so replace everything from [tagname] to [/tagname] with nothing
307 return '';
308 } elseif ( in_array( $name, $this->visible_groups ) ) {
309 // The tag name represents a visible group, so remove the tags themselves, but return everything else
310 // instead of just returning the $content, return the preg_replaced content :)
311 return preg_replace_callback(WPCF7CF_REGEX_MAIL_GROUP, array($this, 'hide_hidden_mail_fields_regex_callback'), $content );
312 } else {
313 // The tag name doesn't represent a group that was used in the form. Leave it alone (return the entire match).
314 return $matches[0];
315 }
316 }
317
318 public static function parse_conditions($string, $format='array') {
319 // Parse stuff like "show [g1] if [field] equals 2" to Array
320
321 preg_match_all(WPCF7CF_REGEX_CONDITIONS, $string, $matches);
322
323 $conditions = [];
324
325 $prev_then_field = '';
326 foreach ($matches[0] as $i=>$line) {
327 $then_field = $matches[1][$i];
328 $if_field = $matches[2][$i];
329 $operator = $matches[3][$i];
330 $if_value = $matches[4][$i];
331
332 $index = count($conditions);
333
334 if ($then_field == '') {
335 $index = $index -1;
336 $then_field = $prev_then_field;
337 } else {
338 $conditions[$index]['then_field'] = $then_field;
339 }
340
341 $conditions[$index]['and_rules'][] = [
342 'if_field' => $if_field,
343 'operator' => $operator,
344 'if_value' => $if_value,
345 ];
346
347 $prev_then_field = $then_field;
348
349 }
350
351 $conditions = array_values($conditions);
352
353 if ($format == 'array') {
354 return $conditions;
355 } else if ($format == 'json') {
356 return json_encode($conditions);
357 }
358 }
359
360 /**
361 * load the conditions from the form's post_meta
362 *
363 * @param string $form_id
364 * @return array
365 */
366 public static function getConditions($form_id) {
367 // make sure conditions are an array.
368 $options = get_post_meta($form_id,'wpcf7cf_options',true);
369 return is_array($options) ? $options : array(); // the meta key 'wpcf7cf_options' is a bit misleading at this point, because it only holds the form's conditions, no other options/settings
370 }
371
372 /**
373 * load the conditions from the form's post_meta as plain text
374 *
375 * @param string $form_id
376 * @return void
377 */
378 public static function getConditionsPlainText($form_id) {
379 return CF7CF::serializeConditions(CF7CF::getConditions($form_id));
380 }
381
382 public static function serializeConditions($array) {
383
384 $lines = [];
385
386 foreach ($array as $entry) {
387 $then_field = $entry['then_field'];
388 $and_rules = $entry['and_rules'];
389 $indent = strlen($then_field) + 4;
390 foreach ($and_rules as $i => $rule) {
391 $if_field = $rule['if_field'];
392 $operator = $rule['operator'];
393 $if_value = $rule['if_value'];
394
395 if ($i == 0) {
396 $lines[] = "show [${then_field}] if [${if_field}] ${operator} \"${if_value}\"";
397 } else {
398 $lines[] = str_repeat(' ',$indent)."and if [${if_field}] ${operator} \"${if_value}\"";
399 }
400 }
401 }
402
403 return implode("\n", $lines);
404 }
405
406 /**
407 * save the conditions to the form's post_meta
408 *
409 * @param string $form_id
410 * @return void
411 */
412 public static function setConditions($form_id, $conditions) {
413 return update_post_meta($form_id,'wpcf7cf_options',$conditions); // the meta key 'wpcf7cf_options' is a bit misleading at this point, because it only holds the form's conditions, no other options/settings
414 }
415 }
416
417 new CF7CF;
418
419 add_filter( 'wpcf7_contact_form_properties', 'wpcf7cf_properties', 10, 2 );
420
421 function wpcf7cf_properties($properties, $wpcf7form) {
422 // Before CF7 5.5.3, this function was called each time we call get_properties() on a contact form. Since CF7 5.5.3 this function is called only once in the WPCF7_ContactForm
423 if (!is_admin() || (defined('DOING_AJAX') && DOING_AJAX)) { // TODO: kind of hacky. maybe find a better solution. Needed because otherwise the group tags will be replaced in the editor as well.
424 $form = $properties['form'];
425
426 $form_parts = preg_split('/(\[\/?group(?:\]|\s.*?\]))/',$form, -1,PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
427
428 ob_start();
429
430 $stack = array();
431
432 foreach ($form_parts as $form_part) {
433 if (substr($form_part,0,7) == '[group ') {
434 $tag_parts = explode(' ',rtrim($form_part,']'));
435
436 array_shift($tag_parts);
437
438 $tag_id = $tag_parts[0];
439 $tag_html_type = 'div';
440 $tag_html_data = array();
441
442 foreach ($tag_parts as $i => $tag_part) {
443 if ($i==0) continue;
444 $tag_part = explode(':',$tag_part);
445 if ($tag_part[0] == 'inline') $tag_html_type = 'span';
446 else if ($tag_part[0] == 'clear_on_hide') $tag_html_data[] = 'data-clear_on_hide';
447 else if ($tag_part[0] == 'disable_on_hide' && WPCF7CF_IS_PRO) $tag_html_data[] = 'data-disable_on_hide';
448 else if ($tag_part[0] == 'class') $tag_html_data[] = 'class="'.($tag_part[1]??'').'"';
449 }
450
451 array_push($stack,$tag_html_type);
452
453 echo '<'.$tag_html_type.' data-id="'.$tag_id.'" data-orig_data_id="'.$tag_id.'" '.implode(' ',$tag_html_data).' data-class="wpcf7cf_group">';
454 } else if ($form_part == '[/group]') {
455 echo '</'.array_pop($stack).'>';
456 } else {
457 echo $form_part;
458 }
459 }
460
461 $properties['form'] = ob_get_clean();
462 }
463 return $properties;
464 }
465
466 add_action('wpcf7_form_hidden_fields', 'wpcf7cf_form_hidden_fields',10,1);
467
468 function wpcf7cf_form_hidden_fields($hidden_fields) {
469
470 $current_form = wpcf7_get_current_contact_form();
471 $current_form_id = $current_form->id();
472
473 $options = array(
474 'form_id' => $current_form_id,
475 'conditions' => CF7CF::getConditions($current_form_id),
476 'settings' => wpcf7cf_get_settings()
477 );
478
479 unset($options['settings']['license_key']); // don't show license key in the source code duh.
480
481 return array_merge($hidden_fields, array(
482 '_wpcf7cf_hidden_group_fields' => '[]',
483 '_wpcf7cf_hidden_groups' => '[]',
484 '_wpcf7cf_visible_groups' => '[]',
485 '_wpcf7cf_repeaters' => '[]',
486 '_wpcf7cf_steps' => '{}',
487 '_wpcf7cf_options' => ''.json_encode($options),
488 ));
489 }
490
491 function wpcf7cf_endswith($string, $test) {
492 $strlen = strlen($string);
493 $testlen = strlen($test);
494 if ($testlen > $strlen) return false;
495 return substr_compare($string, $test, $strlen - $testlen, $testlen) === 0;
496 }
497
498 add_filter( 'wpcf7_form_tag_data_option', 'wpcf7cf_form_tag_data_option', 10, 3 );
499
500 function wpcf7cf_form_tag_data_option($output, $args, $nog) {
501 $data = array();
502 return $data;
503 }
504
505 /* Scripts & Styles */
506
507 function wpcf7cf_load_js() {
508 return apply_filters( 'wpcf7cf_load_js', WPCF7CF_LOAD_JS );
509 }
510
511 function wpcf7cf_load_css() {
512 return apply_filters( 'wpcf7cf_load_css', WPCF7CF_LOAD_CSS );
513 }
514
515 add_action( 'wp_enqueue_scripts', 'wpcf7cf_do_enqueue_scripts', 20, 0 );
516
517 function wpcf7cf_do_enqueue_scripts() {
518 if ( wpcf7cf_load_js() ) {
519 wpcf7cf_enqueue_scripts();
520 }
521
522 if ( wpcf7cf_load_css() ) {
523 wpcf7cf_enqueue_styles();
524 }
525 }
526
527 function wpcf7cf_enqueue_scripts() {
528 if (is_admin()) return;
529 wp_enqueue_script('wpcf7cf-scripts', plugins_url('js/scripts.js', __FILE__), array('jquery'), WPCF7CF_VERSION, true);
530 wp_localize_script('wpcf7cf-scripts', 'wpcf7cf_global_settings',
531 array(
532 'ajaxurl' => admin_url('admin-ajax.php'),
533 )
534 );
535
536 }
537
538 function wpcf7cf_enqueue_styles() {
539 if (is_admin()) return;
540 wp_enqueue_style('cf7cf-style', plugins_url('style.css', __FILE__), array(), WPCF7CF_VERSION);
541 }
542
543 // Make sure CF7 doesn't target any disabled fields for validation
544 // (HTML standard: "disabled fields don't get submitted", so no need to validate them)
545 add_filter( 'wpcf7_feedback_response', function($response, $result) {
546 foreach ($response['invalid_fields'] as $i => $inv) {
547 if (isset($response['invalid_fields'][$i]['into'])) {
548 $response['invalid_fields'][$i]['into'] .= ':not(.wpcf7cf-disabled)';
549 }
550 }
551 return $response;
552 }, 2, 10 );