PluginProbe ʕ •ᴥ•ʔ
Advanced Custom Fields: Extended / 0.8
Advanced Custom Fields: Extended v0.8
0.9.2.6 0.9.2.5 0.8.6 0.8.6.1 0.8.6.3 0.8.6.5 0.8.6.6 0.8.6.7 0.8.6.8 0.8.6.9 0.8.7 0.8.7.1 0.8.7.2 0.8.7.3 0.8.7.4 0.8.7.5 0.8.7.6 0.8.8 0.8.8.1 0.8.8.10 0.8.8.11 0.8.8.2 0.8.8.3 0.8.8.4 0.8.8.5 0.8.8.6 0.8.8.7 0.8.8.8 0.8.8.9 0.8.9 0.8.9.1 0.8.9.2 0.8.9.3 0.8.9.4 0.8.9.5 0.9 0.9.0.1 0.9.0.2 0.9.0.3 0.9.0.4 0.9.0.5 0.9.0.6 0.9.0.7 0.9.0.8 0.9.0.9 0.9.1 0.9.1.1 0.9.2 0.9.2.1 0.9.2.2 0.9.2.3 0.9.2.4 trunk 0.5 0.5.1 0.5.2 0.5.2.1 0.5.2.3 0.5.5 0.5.5.1 0.5.8 0.5.8.1 0.6 0.6.0.1 0.6.0.2 0.6.1 0.6.3 0.6.5 0.6.7 0.6.7.2 0.7 0.7.0.3 0.7.5 0.7.5.5 0.7.8 0.7.9 0.7.9.3 0.7.9.4 0.7.9.9.8 0.7.9.9.9 0.8 0.8.1 0.8.2 0.8.3 0.8.3.1 0.8.4 0.8.4.1 0.8.4.5 0.8.4.6 0.8.5 0.8.5.5
acf-extended / includes / core / helpers.php
acf-extended / includes / core Last commit date
compatibility.php 6 years ago enqueue.php 6 years ago helpers.php 6 years ago menu.php 6 years ago
helpers.php
747 lines
1 <?php
2
3 if(!defined('ABSPATH'))
4 exit;
5
6 /**
7 * Get Flexible
8 */
9 if(!function_exists('get_flexible')){
10
11 function get_flexible($selector, $post_id = false){
12
13 if(!have_rows($selector, $post_id))
14 return;
15
16 // Vars
17 $field = acf_get_field($selector);
18 $flexible = acf_get_field_type('flexible_content');
19 $is_preview = false;
20
21 // Actions
22 do_action('acfe/flexible/enqueue', $field, $is_preview);
23 do_action('acfe/flexible/enqueue/name=' . $field['_name'], $field, $is_preview);
24 do_action('acfe/flexible/enqueue/key=' . $field['key'], $field, $is_preview);
25
26 ob_start();
27
28 while(have_rows($selector, $post_id)): the_row();
29
30 // Vars
31 $layout_name = get_row_layout();
32 $layout = $flexible->get_layout($layout_name, $field);
33
34 // Render: HTML Comment
35 echo "\n" . '<!-- ' . $layout['label'] . ' -->' . "\n";
36
37 // Render: Enqueue
38 acfe_flexible_render_layout_enqueue($layout, $field);
39
40 // Render: Template
41 acfe_flexible_render_layout_template($layout, $field);
42
43 endwhile;
44
45 return ob_get_clean();
46
47 }
48
49 }
50
51 /**
52 * The Flexible
53 */
54 if(!function_exists('the_flexible')){
55
56 function the_flexible($selector, $post_id = false){
57
58 echo get_flexible($selector, $post_id);
59
60 }
61
62 }
63
64 /**
65 * Has Flexible
66 */
67 if(!function_exists('has_flexible')){
68
69 function has_flexible($selector, $post_id = false){
70
71 return have_rows($selector, $post_id);
72
73 }
74
75 }
76
77 /**
78 * ACFE Flexible: Render Template
79 */
80 function acfe_flexible_render_layout_template($layout, $field){
81
82 // Vars
83 global $is_preview;
84
85 // Template
86 $acfe_flexible_render_template = false;
87
88 // Filters
89 $acfe_flexible_render_template = apply_filters('acfe/flexible/render/template', $acfe_flexible_render_template, $field, $layout, $is_preview);
90 $acfe_flexible_render_template = apply_filters('acfe/flexible/render/template/name=' . $field['_name'], $acfe_flexible_render_template, $field, $layout, $is_preview);
91 $acfe_flexible_render_template = apply_filters('acfe/flexible/render/template/key=' . $field['key'], $acfe_flexible_render_template, $field, $layout, $is_preview);
92
93 $acfe_flexible_render_template = apply_filters('acfe/flexible/layout/render/template/layout=' . $layout['name'], $acfe_flexible_render_template, $field, $layout, $is_preview);
94 $acfe_flexible_render_template = apply_filters('acfe/flexible/layout/render/template/name=' . $field['_name'] . '&layout=' . $layout['name'], $acfe_flexible_render_template, $field, $layout, $is_preview);
95 $acfe_flexible_render_template = apply_filters('acfe/flexible/layout/render/template/key=' . $field['key'] . '&layout=' . $layout['name'], $acfe_flexible_render_template, $field, $layout, $is_preview);
96
97 // Render: Template
98 if(!empty($acfe_flexible_render_template)){
99
100 $acfe_flexible_render_template_path = false;
101
102 // Full path
103 if(file_exists($acfe_flexible_render_template)){
104
105 $acfe_flexible_render_template_path = $acfe_flexible_render_template;
106
107 }
108
109 // Parent/child relative
110 else{
111
112 $acfe_flexible_render_template_path = locate_template(array($acfe_flexible_render_template));
113
114 }
115
116 // Include
117 if(!empty($acfe_flexible_render_template_path)){
118
119 do_action('acfe/flexible/render/before_template', $field, $layout, $is_preview);
120 do_action('acfe/flexible/render/before_template/name=' . $field['_name'], $field, $layout, $is_preview);
121 do_action('acfe/flexible/render/before_template/key=' . $field['key'], $field, $layout, $is_preview);
122
123 do_action('acfe/flexible/layout/render/before_template/layout=' . $layout['name'], $field, $layout, $is_preview);
124 do_action('acfe/flexible/layout/render/before_template/name=' . $field['_name'] . '&layout=' . $layout['name'], $field, $layout, $is_preview);
125 do_action('acfe/flexible/layout/render/before_template/key=' . $field['key'] . '&layout=' . $layout['name'], $field, $layout, $is_preview);
126
127 include($acfe_flexible_render_template_path);
128
129 do_action('acfe/flexible/render/after_template', $field, $layout, $is_preview);
130 do_action('acfe/flexible/render/after_template/name=' . $field['_name'], $field, $layout, $is_preview);
131 do_action('acfe/flexible/render/after_template/key=' . $field['key'], $field, $layout, $is_preview);
132
133 do_action('acfe/flexible/layout/render/after_template/layout=' . $layout['name'], $field, $layout, $is_preview);
134 do_action('acfe/flexible/layout/render/after_template/name=' . $field['_name'] . '&layout=' . $layout['name'], $field, $layout, $is_preview);
135 do_action('acfe/flexible/layout/render/after_template/key=' . $field['key'] . '&layout=' . $layout['name'], $field, $layout, $is_preview);
136
137 }
138
139 }
140
141 }
142
143 /**
144 * ACFE Flexible: Render Enqueue
145 */
146 function acfe_flexible_render_layout_enqueue($layout, $field){
147
148 // Vars
149 global $is_preview;
150 $handle = acf_slugify($field['name']) . '-layout-' . acf_slugify($layout['name']);
151
152 /**
153 * Actions
154 */
155 do_action('acfe/flexible/layout/enqueue/layout=' . $layout['name'], $field, $layout, $is_preview);
156 do_action('acfe/flexible/layout/enqueue/name=' . $field['_name'] . '&layout=' . $layout['name'], $field, $layout, $is_preview);
157 do_action('acfe/flexible/layout/enqueue/key=' . $field['key'] . '&layout=' . $layout['name'], $field, $layout, $is_preview);
158
159 /**
160 * Style
161 */
162 $acfe_flexible_render_style = false;
163
164 // Filters
165 $acfe_flexible_render_style = apply_filters('acfe/flexible/render/style', $acfe_flexible_render_style, $field, $layout, $is_preview);
166 $acfe_flexible_render_style = apply_filters('acfe/flexible/render/style/name=' . $field['_name'], $acfe_flexible_render_style, $field, $layout, $is_preview);
167 $acfe_flexible_render_style = apply_filters('acfe/flexible/render/style/key=' . $field['key'], $acfe_flexible_render_style, $field, $layout, $is_preview);
168
169 $acfe_flexible_render_style = apply_filters('acfe/flexible/layout/render/style/layout=' . $layout['name'], $acfe_flexible_render_style, $field, $layout, $is_preview);
170 $acfe_flexible_render_style = apply_filters('acfe/flexible/layout/render/style/name=' . $field['_name'] . '&layout=' . $layout['name'], $acfe_flexible_render_style, $field, $layout, $is_preview);
171 $acfe_flexible_render_style = apply_filters('acfe/flexible/layout/render/style/key=' . $field['key'] . '&layout=' . $layout['name'], $acfe_flexible_render_style, $field, $layout, $is_preview);
172
173 // Enqueue
174 if(!empty($acfe_flexible_render_style)){
175
176 $acfe_flexible_render_style_url = false;
177
178 // URL: https://www.domain.com/template/style.js
179 if(stripos($acfe_flexible_render_style, 'http://') === 0 || stripos($acfe_flexible_render_style, 'https://') === 0 || stripos($acfe_flexible_render_style, '//') === 0){
180
181 $acfe_flexible_render_style_url = $acfe_flexible_render_style;
182
183 }
184
185 // Path: template/style.css
186 else{
187
188 $acfe_flexible_render_style_url = acfe_locate_file_url(array($acfe_flexible_render_style));
189
190 }
191
192 // Include
193 if(!empty($acfe_flexible_render_style_url))
194 wp_enqueue_style($handle, $acfe_flexible_render_style_url, array(), false, 'all');
195
196 }
197
198 /**
199 * Script
200 */
201 $acfe_flexible_render_script = false;
202
203 // Filters
204 $acfe_flexible_render_script = apply_filters('acfe/flexible/render/script', $acfe_flexible_render_script, $field, $layout, $is_preview);
205 $acfe_flexible_render_script = apply_filters('acfe/flexible/render/script/name=' . $field['_name'], $acfe_flexible_render_script, $field, $layout, $is_preview);
206 $acfe_flexible_render_script = apply_filters('acfe/flexible/render/script/key=' . $field['key'], $acfe_flexible_render_script, $field, $layout, $is_preview);
207
208 $acfe_flexible_render_script = apply_filters('acfe/flexible/layout/render/script/layout=' . $layout['name'], $acfe_flexible_render_script, $field, $layout, $is_preview);
209 $acfe_flexible_render_script = apply_filters('acfe/flexible/layout/render/script/name=' . $field['_name'] . '&layout=' . $layout['name'], $acfe_flexible_render_script, $field, $layout, $is_preview);
210 $acfe_flexible_render_script = apply_filters('acfe/flexible/layout/render/script/key=' . $field['key'] . '&layout=' . $layout['name'], $acfe_flexible_render_script, $field, $layout, $is_preview);
211
212 // Enqueue
213 if(!empty($acfe_flexible_render_script)){
214
215 $acfe_flexible_render_script_url = false;
216
217 // URL: https://www.domain.com/template/script.js
218 if(stripos($acfe_flexible_render_script, 'http://') === 0 || stripos($acfe_flexible_render_script, 'https://') === 0 || stripos($acfe_flexible_render_script, '//') === 0){
219
220 $acfe_flexible_render_script_url = $acfe_flexible_render_script;
221
222 }
223
224 // Path: template/script.js
225 else{
226
227 $acfe_flexible_render_script_url = acfe_locate_file_url(array($acfe_flexible_render_script));
228
229 }
230
231 // Include
232 if(!empty($acfe_flexible_render_script_url))
233 wp_enqueue_script($handle, $acfe_flexible_render_script_url, array(), false, true);
234
235 }
236
237 }
238
239 /**
240 * Get Field Group from Field
241 */
242 function acfe_get_field_group_from_field($field){
243
244 if(!acf_maybe_get($field, 'parent'))
245 return false;
246
247 $field_parent = $field['parent'];
248
249 if(!$field_ancestors = acf_get_field_ancestors($field))
250 return acf_get_field_group($field_parent);
251
252 // Reverse for DESC order (Top field first)
253 $field_ancestors = array_reverse($field_ancestors);
254
255 $field_top_ancestor = $field_ancestors[0];
256 $field_top_ancestor = acf_get_field($field_top_ancestor);
257
258 return acf_get_field_group($field_top_ancestor['parent']);
259
260 }
261
262 /**
263 * Add custom key to fields and all sub fields
264 */
265 function acfe_field_add_key_recursive(&$field, $key, $value){
266
267 if(isset($field['sub_fields'])){
268
269 foreach($field['sub_fields'] as &$sub_field){
270
271 acfe_field_add_key_recursive($sub_field, $key, $value);
272
273 }
274
275 }
276
277 elseif(isset($field['layouts'])){
278
279 foreach($field['layouts'] as &$layout){
280
281 acfe_field_add_key_recursive($layout, $key, $value);
282
283 }
284
285 }
286
287 $field[$key] = $value;
288
289 }
290
291 /**
292 * Is Json
293 * Source: https://stackoverflow.com/a/6041773
294 */
295 function acfe_is_json($string){
296
297 // in case string = 1
298 if(is_numeric($string))
299 return false;
300
301 json_decode($string);
302
303 return (json_last_error() == JSON_ERROR_NONE);
304
305 }
306
307 /**
308 * Folder Exists
309 */
310 function acfe_folder_exists($folder){
311
312 if(!is_dir(ACFE_THEME_PATH . '/' . $folder))
313 return false;
314
315 return true;
316
317 }
318
319 /**
320 * Array Keys Recursive
321 */
322 function acfe_array_keys_r($array){
323
324 $keys = array_keys($array);
325
326 foreach($array as $i){
327
328 if(!is_array($i))
329 continue;
330
331 $keys = array_merge($keys, acfe_array_keys_r($i));
332
333 }
334
335 return $keys;
336
337 }
338
339 /**
340 * Locate File URL
341 * Check if file exists locally and return URL (supports parent/child theme)
342 */
343 function acfe_locate_file_url($filenames){
344
345 $located = '';
346
347 foreach((array) $filenames as $filename){
348
349 if(!$filename)
350 continue;
351
352 // Child
353 if(file_exists(STYLESHEETPATH . '/' . $filename)){
354
355 $located = get_stylesheet_directory_uri() . '/' . $filename;
356 break;
357
358 }
359
360 // Parent
361 elseif(file_exists(TEMPLATEPATH . '/' . $filename)){
362
363 $located = get_template_directory_uri() . '/' . $filename;
364 break;
365
366 }
367
368 }
369
370 return $located;
371
372 }
373
374 /**
375 * Get Roles
376 */
377 function acfe_get_roles($user_roles = array()){
378
379 if(empty($user_roles)){
380
381 $user_roles = array();
382
383 global $wp_roles;
384
385 if(is_multisite())
386 $user_roles['super_admin'] = __('Super Admin');
387
388 foreach($wp_roles->roles as $role => $settings){
389
390 $user_roles[$role] = $settings['name'];
391
392 }
393
394 }
395
396 return $user_roles;
397
398 }
399
400 /**
401 * Get Current Roles
402 */
403 function acfe_get_current_user_roles(){
404
405 global $current_user;
406
407 if(!is_object($current_user) || !isset($current_user->roles))
408 return false;
409
410 $roles = $current_user->roles;
411
412 if(is_multisite() && current_user_can('setup_network'))
413 $roles[] = 'super_admin';
414
415 return $roles;
416
417 }
418
419 /**
420 * Get post types objects
421 */
422 function acfe_get_post_type_objects($args = array()){
423
424 // vars
425 $return = array();
426
427 // Post Types
428 $posts_types = acf_get_post_types($args);
429
430 // Choices
431 if(!empty($posts_types)){
432
433 foreach($posts_types as $post_type){
434
435 $post_type_object = get_post_type_object($post_type);
436
437 $return[$post_type_object->name] = $post_type_object;
438
439 }
440
441 }
442
443 return $return;
444
445 }
446
447 /**
448 * Get taxonomy objects
449 */
450 function acfe_get_taxonomy_objects($args = array()){
451
452 // vars
453 $return = array();
454
455 // Post Types
456 $taxonomies = acf_get_taxonomies($args);
457
458 // Choices
459 if(!empty($taxonomies)){
460
461 foreach($taxonomies as $taxonomy){
462
463 $taxonomy_object = get_taxonomy($taxonomy);
464
465 $return[$taxonomy_object->name] = $taxonomy_object;
466
467 }
468
469 }
470
471 return $return;
472
473 }
474
475 /**
476 * Get post statuses
477 */
478 function acfe_get_pretty_post_statuses($posts_statuses = array()){
479
480 if(empty($posts_statuses)){
481
482 $posts_statuses = get_post_stati(array(), 'names');
483
484 }
485
486 $return = array();
487
488 // Choices
489 if(!empty($posts_statuses)){
490
491 foreach($posts_statuses as $post_status){
492
493 $post_status_object = get_post_status_object($post_status);
494
495 $return[$post_status_object->name] = $post_status_object->label . ' (' . $post_status_object->name . ')';
496
497 }
498
499 }
500
501 return $return;
502
503 }
504
505 /**
506 * Get forms
507 */
508 function acfe_get_pretty_forms($forms = array()){
509
510 if(empty($forms)){
511
512 $forms = get_posts(array(
513 'post_type' => 'acfe-form',
514 'posts_per_page' => -1,
515 'fields' => 'ids',
516 ));
517
518 }
519
520 $return = array();
521
522 // Choices
523 if(!empty($forms)){
524
525 foreach($forms as $form_id){
526
527 $form_name = get_the_title($form_id);
528
529 $return[$form_id] = $form_name;
530
531 }
532
533 }
534
535 return $return;
536
537 }
538
539 /**
540 * Starts with
541 */
542 function acfe_starts_with($haystack, $needle){
543
544 $length = strlen($needle);
545 return (substr($haystack, 0, $length) === $needle);
546
547 }
548
549 /**
550 * Ends with
551 */
552 function acfe_ends_with($haystack, $needle){
553
554 $length = strlen($needle);
555
556 if($length == 0)
557 return true;
558
559 return (substr($haystack, -$length) === $needle);
560
561 }
562
563 add_filter('acf/load_field', 'acfe_load_field');
564 function acfe_load_field($field){
565
566 if(acf_is_screen(array('edit-acf-field-group', 'acf-field-group', 'acf_page_acf-tools')))
567 return $field;
568
569 // Everywhere
570 $field = apply_filters('acfe/load_field', $field);
571
572 // Admin
573 if(acfe_form_is_admin()){
574
575 $field = apply_filters('acfe/load_field_admin', $field);
576
577 }
578
579 // Front
580 elseif(acfe_form_is_front()){
581
582 $field = apply_filters('acfe/load_field_front', $field);
583
584 }
585
586 return $field;
587
588 }
589
590 if(function_exists('acf_add_filter_variations')){
591
592 acf_add_filter_variations('acfe/load_field', array('type', 'name', 'key'), 0);
593 acf_add_filter_variations('acfe/load_field_front', array('type', 'name', 'key'), 0);
594 acf_add_filter_variations('acfe/load_field_admin', array('type', 'name', 'key'), 0);
595
596 }
597
598 function acfe_form_is_admin(){
599
600 if((is_admin() && !wp_doing_ajax()) || (is_admin() && wp_doing_ajax() && acf_maybe_get_POST('_acf_screen') !== 'acf_form'))
601 return true;
602
603 return false;
604
605 }
606
607 function acfe_form_is_front(){
608
609 if(!is_admin() || (is_admin() && wp_doing_ajax() && acf_maybe_get_POST('_acf_screen') === 'acf_form'))
610 return true;
611
612 return false;
613
614 }
615
616 function acfe_array_insert_before($key, array &$array, $new_key, $new_value){
617
618 if(!array_key_exists($key, $array))
619 return $array;
620
621 $new = array();
622
623 foreach($array as $k => $value){
624
625 if($k === $key)
626 $new[$new_key] = $new_value;
627
628 $new[$k] = $value;
629
630 }
631
632 return $new;
633
634 }
635
636 function acfe_array_insert_after($key, array &$array, $new_key, $new_value){
637
638 if(!array_key_exists($key, $array))
639 return $array;
640
641 $new = array();
642
643 foreach($array as $k => $value){
644
645 $new[$k] = $value;
646
647 if($k === $key)
648 $new[$new_key] = $new_value;
649
650 }
651
652 return $new;
653
654 }
655
656 function acfe_add_validation_error($selector = '', $message = ''){
657
658 // General error
659 if(empty($selector))
660 return acf_add_validation_error('', $message);
661
662 $row = acf_get_loop('active');
663
664 if($row){
665
666 $field = acf_get_sub_field($selector, $row['field']);
667
668 }
669
670 else{
671
672 $field = acf_get_field($selector);
673
674 }
675
676
677
678 // Field not found: General error
679 if(!$field)
680 return acf_add_validation_error('', $message);
681
682 // Specific field error
683 add_filter('acf/validate_value/key=' . $field['key'], function($valid) use($message){
684
685 return $message;
686
687 });
688
689 }
690
691 /*
692 * Similar to acf_get_taxonomy_terms() but returns array('256' => 'Category name') instead of array('category:category_name' => 'Category name')
693 */
694 function acfe_get_taxonomy_terms_ids($taxonomies = array()){
695
696 // force array
697 $taxonomies = acf_get_array($taxonomies);
698
699 // get pretty taxonomy names
700 $taxonomies = acf_get_pretty_taxonomies( $taxonomies );
701
702 // vars
703 $r = array();
704
705 // populate $r
706 foreach( array_keys($taxonomies) as $taxonomy ) {
707
708 // vars
709 $label = $taxonomies[ $taxonomy ];
710 $is_hierarchical = is_taxonomy_hierarchical( $taxonomy );
711 $terms = acf_get_terms(array(
712 'taxonomy' => $taxonomy,
713 'hide_empty' => false
714 ));
715
716
717 // bail early i no terms
718 if( empty($terms) ) continue;
719
720
721 // sort into hierachial order!
722 if( $is_hierarchical ) {
723
724 $terms = _get_term_children( 0, $terms, $taxonomy );
725
726 }
727
728
729 // add placeholder
730 $r[ $label ] = array();
731
732
733 // add choices
734 foreach( $terms as $term ) {
735
736 $k = "{$term->term_id}";
737 $r[ $label ][ $k ] = acf_get_term_title( $term );
738
739 }
740
741 }
742
743
744 // return
745 return $r;
746
747 }