api-helpers.php ➔ acf_validate_attachment()   F
last analyzed

Complexity

Conditions 25
Paths 1088

Size

Total Lines 156

Duplication

Lines 30
Ratio 19.23 %

Importance

Changes 0
Metric Value
cc 25
nc 1088
nop 3
dl 30
loc 156
rs 0
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php 
2
3
/*
4
*  acf_get_setting
5
*
6
*  This function will return a value from the settings array found in the acf object
7
*
8
*  @type	function
9
*  @date	28/09/13
10
*  @since	5.0.0
11
*
12
*  @param	$name (string) the setting name to return
13
*  @return	(mixed)
14
*/
15
16
function acf_get_setting( $name, $default = null ) {
17
	
18
	// vars
19
	$settings = acf()->settings;
20
	
21
	
22
	// find setting
23
	$setting = acf_maybe_get( $settings, $name, $default );
24
	
25
	
26
	// filter for 3rd party customization
27
	$setting = apply_filters( "acf/settings/{$name}", $setting );
28
	
29
	
30
	// return
31
	return $setting;
32
	
33
}
34
35
36
/*
37
*  acf_get_compatibility
38
*
39
*  This function will return true or false for a given compatibility setting
40
*
41
*  @type	function
42
*  @date	20/01/2015
43
*  @since	5.1.5
44
*
45
*  @param	$name (string)
46
*  @return	(boolean)
47
*/
48
49
function acf_get_compatibility( $name ) {
50
	
51
	return apply_filters( "acf/compatibility/{$name}", false );
52
	
53
}
54
55
56
/*
57
*  acf_update_setting
58
*
59
*  This function will update a value into the settings array found in the acf object
60
*
61
*  @type	function
62
*  @date	28/09/13
63
*  @since	5.0.0
64
*
65
*  @param	$name (string)
66
*  @param	$value (mixed)
67
*  @return	n/a
68
*/
0 ignored issues
show
Documentation introduced by
The doc-type n/a could not be parsed: Unknown type name "n/a" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
69
70
function acf_update_setting( $name, $value ) {
71
	
72
	acf()->settings[ $name ] = $value;
73
	
74
}
75
76
77
/*
78
*  acf_append_setting
79
*
80
*  This function will add a value into the settings array found in the acf object
81
*
82
*  @type	function
83
*  @date	28/09/13
84
*  @since	5.0.0
85
*
86
*  @param	$name (string)
87
*  @param	$value (mixed)
88
*  @return	n/a
89
*/
0 ignored issues
show
Documentation introduced by
The doc-type n/a could not be parsed: Unknown type name "n/a" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
90
91
function acf_append_setting( $name, $value ) {
92
	
93
	// createa array if needed
94
	if( !isset(acf()->settings[ $name ]) ) {
95
		
96
		acf()->settings[ $name ] = array();
97
		
98
	}
99
	
100
	
101
	// append to array
102
	acf()->settings[ $name ][] = $value;
103
}
104
105
106
/*
107
*  acf_has_done
108
*
109
*  This function will return true if this action has already been done
110
*
111
*  @type	function
112
*  @date	16/12/2015
113
*  @since	5.3.2
114
*
115
*  @param	$name (string)
116
*  @return	(boolean)
117
*/
118
119
function acf_has_done( $name ) {
120
	
121
	// vars
122
	$setting = 'has_done_' . $name;
123
	
124
	
125
	// return true if already done
126
	if( acf_get_setting($setting) ) return true;
127
	
128
	
129
	// update setting
130
	acf_update_setting($setting, true);
131
	
132
	
133
	// return
134
	return false;
135
	
136
}
137
138
139
/*
140
*  acf_get_path
141
*
142
*  This function will return the path to a file within the ACF plugin folder
143
*
144
*  @type	function
145
*  @date	28/09/13
146
*  @since	5.0.0
147
*
148
*  @param	$path (string) the relative path from the root of the ACF plugin folder
149
*  @return	(string)
150
*/
151
152
function acf_get_path( $path ) {
153
	
154
	return acf_get_setting('path') . $path;
155
	
156
}
157
158
159
/*
160
*  acf_get_dir
161
*
162
*  This function will return the url to a file within the ACF plugin folder
163
*
164
*  @type	function
165
*  @date	28/09/13
166
*  @since	5.0.0
167
*
168
*  @param	$path (string) the relative path from the root of the ACF plugin folder
169
*  @return	(string)
170
*/
171
172
function acf_get_dir( $path ) {
173
	
174
	return acf_get_setting('dir') . $path;
175
	
176
}
177
178
179
/*
180
*  acf_include
181
*
182
*  This function will include a file
183
*
184
*  @type	function
185
*  @date	10/03/2014
186
*  @since	5.0.0
187
*
188
*  @param	$post_id (int)
189
*  @return	$post_id (int)
190
*/
0 ignored issues
show
Documentation introduced by
The doc-type $post_id could not be parsed: Unknown type name "$post_id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
191
192
function acf_include( $file ) {
193
	
194
	$path = acf_get_path( $file );
195
	
196
	if( file_exists($path) ) {
197
		
198
		include_once( $path );
199
		
200
	}
201
	
202
}
203
204
205
/*
206
*  acf_parse_args
207
*
208
*  This function will merge together 2 arrays and also convert any numeric values to ints
209
*
210
*  @type	function
211
*  @date	18/10/13
212
*  @since	5.0.0
213
*
214
*  @param	$args (array)
215
*  @param	$defaults (array)
216
*  @return	$args (array)
217
*/
0 ignored issues
show
Documentation introduced by
The doc-type $args could not be parsed: Unknown type name "$args" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
218
219
function acf_parse_args( $args, $defaults = array() ) {
220
	
221
	// $args may not be na array!
222
	if( !is_array($args) ) {
223
		
224
		$args = array();
225
		
226
	}
227
	
228
	
229
	// parse args
230
	$args = wp_parse_args( $args, $defaults );
231
	
232
	
233
	// parse types
234
	$args = acf_parse_types( $args );
235
	
236
	
237
	// return
238
	return $args;
239
	
240
}
241
242
243
/*
244
*  acf_parse_types
245
*
246
*  This function will convert any numeric values to int and trim strings
247
*
248
*  @type	function
249
*  @date	18/10/13
250
*  @since	5.0.0
251
*
252
*  @param	$var (mixed)
253
*  @return	$var (mixed)
254
*/
0 ignored issues
show
Documentation introduced by
The doc-type $var could not be parsed: Unknown type name "$var" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
255
256
function acf_parse_types( $array ) {
257
	
258
	// some keys are restricted
259
	$restricted = array(
260
		'label',
261
		'name',
262
		'value',
263
		'instructions',
264
		'nonce'
265
	);
266
	
267
	
268
	// loop
269
	foreach( array_keys($array) as $k ) {
270
		
271
		// parse type if not restricted
272
		if( !in_array($k, $restricted, true) ) {
273
			
274
			$array[ $k ] = acf_parse_type( $array[ $k ] );
275
			
276
		}
277
278
	}
279
	
280
	// return
281
	return $array;
282
}
283
284
285
/*
286
*  acf_parse_type
287
*
288
*  description
289
*
290
*  @type	function
291
*  @date	11/11/2014
292
*  @since	5.0.9
293
*
294
*  @param	$post_id (int)
295
*  @return	$post_id (int)
296
*/
0 ignored issues
show
Documentation introduced by
The doc-type $post_id could not be parsed: Unknown type name "$post_id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
297
298
function acf_parse_type( $v ) {
299
	
300
	// test for array
301
	if( is_array($v) ) {
302
		
303
		return acf_parse_types($v);
304
	}
305
	
306
	
307
	// bail early if not string
308
	if( !is_string($v) ) {
309
		
310
		return $v;
311
				
312
	}
313
	
314
	
315
	// trim
316
	$v = trim($v);
317
	
318
	
319
	// numbers
320
	if( is_numeric($v) && strval((int)$v) === $v ) {
321
		
322
		$v = intval( $v );
323
		
324
	}
325
	
326
	
327
	// return
328
	return $v;
329
	
330
}
331
332
333
/*
334
*  acf_get_view
335
*
336
*  This function will load in a file from the 'admin/views' folder and allow variables to be passed through
337
*
338
*  @type	function
339
*  @date	28/09/13
340
*  @since	5.0.0
341
*
342
*  @param	$view_name (string)
343
*  @param	$args (array)
344
*  @return	n/a
345
*/
0 ignored issues
show
Documentation introduced by
The doc-type n/a could not be parsed: Unknown type name "n/a" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
346
347
function acf_get_view( $view_name = '', $args = array() ) {
348
349
	// vars
350
	$path = acf_get_path("admin/views/{$view_name}.php");
351
	
352
	if( file_exists($path) ) {
353
		
354
		include( $path );
355
		
356
	}
357
	
358
}
359
360
361
/*
362
*  acf_merge_atts
363
*
364
*  description
365
*
366
*  @type	function
367
*  @date	2/11/2014
368
*  @since	5.0.9
369
*
370
*  @param	$post_id (int)
371
*  @return	$post_id (int)
372
*/
0 ignored issues
show
Documentation introduced by
The doc-type $post_id could not be parsed: Unknown type name "$post_id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
373
374
function acf_merge_atts( $atts, $extra = array() ) {
375
	
376
	// bail ealry if no $extra
377
	if( empty($extra) ) {
378
		
379
		return $atts;
380
		
381
	}
382
	
383
	
384
	// merge in new atts
385
	foreach( $extra as $k => $v ) {
386
			
387
		if( $k == 'class' || $k == 'style' ) {
388
			
389
			if( $v === '' ) {
390
				
391
				continue;
392
				
393
			}
394
			
395
			$v = $atts[ $k ] . ' ' . $v;
396
			
397
		}
398
		
399
		$atts[ $k ] = $v;
400
		
401
	}
402
	
403
	
404
	// return
405
	return $atts;
406
	
407
}
408
409
410
/*
411
*  acf_esc_attr
412
*
413
*  This function will return a render of an array of attributes to be used in markup
414
*
415
*  @type	function
416
*  @date	1/10/13
417
*  @since	5.0.0
418
*
419
*  @param	$atts (array)
420
*  @return	n/a
421
*/
0 ignored issues
show
Documentation introduced by
The doc-type n/a could not be parsed: Unknown type name "n/a" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
422
423
function acf_esc_attr( $atts ) {
424
	
425
	// is string?
426
	if( is_string($atts) ) {
427
		
428
		$atts = trim( $atts );
429
		return esc_attr( $atts );
430
		
431
	}
432
	
433
	
434
	// validate
435
	if( empty($atts) ) {
436
		
437
		return '';
438
		
439
	}
440
	
441
	
442
	// vars
443
	$e = array();
444
	
445
	
446
	// loop through and render
447
	foreach( $atts as $k => $v ) {
448
		
449
		// object
450
		if( is_array($v) || is_object($v) ) {
451
			
452
			$v = json_encode($v);
453
		
454
		// boolean	
455
		} elseif( is_bool($v) ) {
456
			
457
			$v = $v ? 1 : 0;
458
		
459
		// string
460
		} elseif( is_string($v) ) {
461
			
462
			$v = trim($v);
463
			
464
		}
465
		
466
		
467
		// append
468
		$e[] = $k . '="' . esc_attr( $v ) . '"';
469
	}
470
	
471
	
472
	// echo
473
	return implode(' ', $e);
474
	
475
}
476
477
function acf_esc_attr_e( $atts ) {
478
	
479
	echo acf_esc_attr( $atts );
480
	
481
}
482
483
484
/*
485
*  acf_hidden_input
486
*
487
*  description
488
*
489
*  @type	function
490
*  @date	3/02/2014
491
*  @since	5.0.0
492
*
493
*  @param	$post_id (int)
494
*  @return	$post_id (int)
495
*/
0 ignored issues
show
Documentation introduced by
The doc-type $post_id could not be parsed: Unknown type name "$post_id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
496
497
function acf_get_hidden_input( $atts ) {
498
	
499
	$atts['type'] = 'hidden';
500
	
501
	return '<input ' . acf_esc_attr( $atts ) . ' />';
502
	
503
}
504
505
function acf_hidden_input( $atts ) {
506
	
507
	echo acf_get_hidden_input( $atts );
508
	
509
}
510
511
512
/*
513
*  acf_extract_var
514
*
515
*  This function will remove the var from the array, and return the var
516
*
517
*  @type	function
518
*  @date	2/10/13
519
*  @since	5.0.0
520
*
521
*  @param	$array (array)
522
*  @param	$key (string)
523
*  @return	(mixed)
524
*/
525
526
function acf_extract_var( &$array, $key, $default = null ) {
527
	
528
	// check if exists
529
	if( is_array($array) && array_key_exists($key, $array) ) {
530
		
531
		// store value
532
		$v = $array[ $key ];
533
		
534
		
535
		// unset
536
		unset( $array[ $key ] );
537
		
538
		
539
		// return
540
		return $v;
541
		
542
	}
543
	
544
	
545
	// return
546
	return $default;
547
}
548
549
550
/*
551
*  acf_extract_vars
552
*
553
*  This function will remove the vars from the array, and return the vars
554
*
555
*  @type	function
556
*  @date	8/10/13
557
*  @since	5.0.0
558
*
559
*  @param	$post_id (int)
560
*  @return	$post_id (int)
561
*/
0 ignored issues
show
Documentation introduced by
The doc-type $post_id could not be parsed: Unknown type name "$post_id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
562
563
function acf_extract_vars( &$array, $keys ) {
564
	
565
	$r = array();
566
	
567
	foreach( $keys as $key ) {
568
		
569
		$r[ $key ] = acf_extract_var( $array, $key );
570
		
571
	}
572
	
573
	return $r;
574
}
575
576
577
/*
578
*  acf_get_post_types
579
*
580
*  This function will return an array of available post types
581
*
582
*  @type	function
583
*  @date	7/10/13
584
*  @since	5.0.0
585
*
586
*  @param	$exclude (array)
587
*  @param	$include (array)
588
*  @return	(array)
589
*/
590
591
function acf_get_post_types( $exclude = array(), $include = array() ) {
592
	
593
	// get all custom post types
594
	$post_types = get_post_types();
595
	
596
	
597
	// core exclude
598
	$exclude = wp_parse_args( $exclude, array('acf-field', 'acf-field-group', 'revision', 'nav_menu_item') );
599
	
600
	
601
	// include
602
	if( !empty($include) ) {
603
		
604
		foreach( array_keys($include) as $i ) {
605
			
606
			$post_type = $include[ $i ];
607
			
608
			if( post_type_exists($post_type) ) {	
609
									
610
				$post_types[ $post_type ] = $post_type;
611
				
612
			}
613
			
614
		}
615
		
616
	}
617
	
618
	
619
	// exclude
620
	foreach( array_values($exclude) as $i ) {
621
		
622
		unset( $post_types[ $i ] );
623
		
624
	}
625
	
626
	
627
	// simplify keys
628
	$post_types = array_values($post_types);
629
	
630
	
631
	// return
632
	return $post_types;
633
	
634
}
635
636
637 View Code Duplication
function acf_get_pretty_post_types( $post_types = array() ) {
0 ignored issues
show
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
638
	
639
	// get post types
640
	if( empty($post_types) ) {
641
		
642
		// get all custom post types
643
		$post_types = acf_get_post_types();
644
		
645
	}
646
	
647
	
648
	// get labels
649
	$ref = array();
650
	$r = array();
651
	
652
	foreach( $post_types as $post_type ) {
653
		
654
		// vars
655
		$label = $post_type;
656
		
657
		
658
		// check that object exists (case exists when importing field group from another install and post type does not exist)
659
		if( post_type_exists($post_type) ) {
660
			
661
			$obj = get_post_type_object($post_type);
662
			$label = $obj->labels->singular_name;
663
			
664
		}
665
		
666
		
667
		// append to r
668
		$r[ $post_type ] = $label;
669
		
670
		
671
		// increase counter
672
		if( !isset($ref[ $label ]) ) {
673
			
674
			$ref[ $label ] = 0;
675
			
676
		}
677
		
678
		$ref[ $label ]++;
679
	}
680
	
681
	
682
	// get slugs
683
	foreach( array_keys($r) as $i ) {
684
		
685
		// vars
686
		$post_type = $r[ $i ];
687
		
688
		if( $ref[ $post_type ] > 1 ) {
689
			
690
			$r[ $i ] .= ' (' . $i . ')';
691
			
692
		}
693
		
694
	}
695
	
696
	
697
	// return
698
	return $r;
699
	
700
}
701
702
703
/*
704
*  acf_verify_nonce
705
*
706
*  This function will look at the $_POST['_acfnonce'] value and return true or false
707
*
708
*  @type	function
709
*  @date	15/10/13
710
*  @since	5.0.0
711
*
712
*  @param	$nonce (string)
713
*  @return	(boolean)
714
*/
715
716
function acf_verify_nonce( $value, $post_id = 0 ) {
717
	
718
	// vars
719
	$nonce = acf_maybe_get( $_POST, '_acfnonce' );
720
	
721
	
722
	// bail early if no nonce or if nonce does not match (post|user|comment|term)
723
	if( !$nonce || !wp_verify_nonce($nonce, $value) ) {
724
		
725
		return false;
726
		
727
	}
728
	
729
	
730
	// if saving specific post
731
	if( $post_id ) {
732
		
733
		// vars
734
		$form_post_id = (int) acf_maybe_get( $_POST, 'post_ID' );
735
		$post_parent = wp_is_post_revision( $post_id );
736
		
737
			
738
		// 1. no $_POST['post_id'] (shopp plugin)
739
		if( !$form_post_id ) {
740
			
741
			// do nothing (don't remove this if statement!)
742
			
743
		// 2. direct match (this is the post we were editing)
744
		} elseif( $post_id === $form_post_id ) {
745
			
746
			// do nothing (don't remove this if statement!)
747
			
748
		// 3. revision (this post is a revision of the post we were editing)
749
		} elseif( $post_parent === $form_post_id ) {
750
			
751
			// return true early and prevent $_POST['_acfnonce'] from being reset
752
			// this will allow another save_post to save the real post
753
			return true;
754
			
755
		// 4. no match (this post is a custom created one during the save proccess via either WP or 3rd party)
756
		} else {
757
			
758
			// return false early and prevent $_POST['_acfnonce'] from being reset
759
			// this will allow another save_post to save the real post
760
			return false;
761
			
762
		}
763
		
764
	}
765
	
766
	
767
	// reset nonce (only allow 1 save)
768
	$_POST['_acfnonce'] = false;
769
	
770
	
771
	// return
772
	return true;
773
		
774
}
775
776
777
/*
778
*  acf_verify_ajax
779
*
780
*  This function will return true if the current AJAX request is valid
781
*  It's action will also allow WPML to set the lang and avoid AJAX get_posts issues
782
*
783
*  @type	function
784
*  @date	7/08/2015
785
*  @since	5.2.3
786
*
787
*  @param	n/a
788
*  @return	(boolean)
789
*/
790
791
function acf_verify_ajax() {
792
	
793
	// bail early if not acf action
794
	if( empty($_POST['action']) || substr($_POST['action'], 0, 3) !== 'acf' ) {
795
		
796
		return false;
797
		
798
	}
799
	
800
	
801
	// bail early if not acf nonce
802
	if( empty($_POST['nonce']) || !wp_verify_nonce($_POST['nonce'], 'acf_nonce') ) {
803
	
804
		return false;
805
		
806
	}
807
	
808
	
809
	// action for 3rd party customization
810
	do_action('acf/verify_ajax');
811
	
812
	
813
	// return
814
	return true;
815
	
816
}
817
818
819
/*
820
*  acf_add_admin_notice
821
*
822
*  This function will add the notice data to a setting in the acf object for the admin_notices action to use
823
*
824
*  @type	function
825
*  @date	17/10/13
826
*  @since	5.0.0
827
*
828
*  @param	$text (string)
829
*  @param	$class (string)
830
*  @return	(int) message ID (array position)
831
*/
832
833
function acf_add_admin_notice( $text, $class = '', $wrap = 'p' )
834
{
835
	// vars
836
	$admin_notices = acf_get_admin_notices();
837
	
838
	
839
	// add to array
840
	$admin_notices[] = array(
841
		'text'	=> $text,
842
		'class'	=> "updated {$class}",
843
		'wrap'	=> $wrap
844
	);
845
	
846
	
847
	// update
848
	acf_update_setting( 'admin_notices', $admin_notices );
849
	
850
	
851
	// return
852
	return ( count( $admin_notices ) - 1 );
853
	
854
}
855
856
857
/*
858
*  acf_get_admin_notices
859
*
860
*  This function will return an array containing any admin notices
861
*
862
*  @type	function
863
*  @date	17/10/13
864
*  @since	5.0.0
865
*
866
*  @param	n/a
867
*  @return	(array)
868
*/
869
870
function acf_get_admin_notices()
871
{
872
	// vars
873
	$admin_notices = acf_get_setting( 'admin_notices' );
874
	
875
	
876
	// validate
877
	if( !$admin_notices )
878
	{
879
		$admin_notices = array();
880
	}
881
	
882
	
883
	// return
884
	return $admin_notices;
885
}
886
887
888
/*
889
*  acf_get_image_sizes
890
*
891
*  This function will return an array of available image sizes
892
*
893
*  @type	function
894
*  @date	23/10/13
895
*  @since	5.0.0
896
*
897
*  @param	n/a
898
*  @return	(array)
899
*/
900
901
function acf_get_image_sizes() {
902
	
903
	// global
904
	global $_wp_additional_image_sizes;
905
	
906
	
907
	// vars
908
	$sizes = array(
909
		'thumbnail'	=>	__("Thumbnail",'acf'),
910
		'medium'	=>	__("Medium",'acf'),
911
		'large'		=>	__("Large",'acf')
912
	);
913
	
914
	
915
	// find all sizes
916
	$all_sizes = get_intermediate_image_sizes();
917
	
918
	
919
	// add extra registered sizes
920 View Code Duplication
	if( !empty($all_sizes) ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
921
		
922
		foreach( $all_sizes as $size ) {
923
			
924
			// bail early if already in array
925
			if( isset($sizes[ $size ]) ) {
926
			
927
				continue;
928
				
929
			}
930
			
931
			
932
			// append to array
933
			$label = str_replace('-', ' ', $size);
934
			$label = ucwords( $label );
935
			$sizes[ $size ] = $label;
936
			
937
		}
938
		
939
	}
940
	
941
	
942
	// add sizes
943
	foreach( array_keys($sizes) as $s ) {
944
		
945
		// vars
946
		$w = isset($_wp_additional_image_sizes[$s]['width']) ? $_wp_additional_image_sizes[$s]['width'] : get_option( "{$s}_size_w" );
947
		$h = isset($_wp_additional_image_sizes[$s]['height']) ? $_wp_additional_image_sizes[$s]['height'] : get_option( "{$s}_size_h" );
948
		
949
		if( $w && $h ) {
950
			
951
			$sizes[ $s ] .= " ({$w} x {$h})";
952
			
953
		}
954
		
955
	}
956
	
957
	
958
	// add full end
959
	$sizes['full'] = __("Full Size",'acf');
960
	
961
	
962
	// filter for 3rd party customization
963
	$sizes = apply_filters( 'acf/get_image_sizes', $sizes );
964
	
965
	
966
	// return
967
	return $sizes;
968
	
969
}
970
971
972
/*
973
*  acf_get_taxonomies
974
*
975
*  This function will return an array of available taxonomies
976
*
977
*  @type	function
978
*  @date	7/10/13
979
*  @since	5.0.0
980
*
981
*  @param	n/a
982
*  @return	(array)
983
*/
984
985
function acf_get_taxonomies() {
986
987
	// get all taxonomies
988
	$taxonomies = get_taxonomies( false, 'objects' );
989
	$ignore = array( 'nav_menu', 'link_category' );
990
	$r = array();
991
	
992
	
993
	// populate $r
994
	foreach( $taxonomies as $taxonomy )
995
	{
996
		if( in_array($taxonomy->name, $ignore) )
997
		{
998
			continue;
999
		
1000
		}
1001
		
1002
		$r[ $taxonomy->name ] = $taxonomy->name; //"{$taxonomy->labels->singular_name}"; // ({$taxonomy->name})
1003
	}
1004
	
1005
	
1006
	// return
1007
	return $r;
1008
	
1009
}
1010
1011
1012 View Code Duplication
function acf_get_pretty_taxonomies( $taxonomies = array() ) {
0 ignored issues
show
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
1013
	
1014
	// get post types
1015
	if( empty($taxonomies) ) {
1016
		
1017
		// get all custom post types
1018
		$taxonomies = acf_get_taxonomies();
1019
		
1020
	}
1021
	
1022
	
1023
	// get labels
1024
	$ref = array();
1025
	$r = array();
1026
	
1027
	foreach( array_keys($taxonomies) as $i ) {
1028
		
1029
		// vars
1030
		$taxonomy = acf_extract_var( $taxonomies, $i);
1031
		$obj = get_taxonomy( $taxonomy );
1032
		$name = $obj->labels->singular_name;
1033
		
1034
		
1035
		// append to r
1036
		$r[ $taxonomy ] = $name;
1037
		
1038
		
1039
		// increase counter
1040
		if( !isset($ref[ $name ]) ) {
1041
			
1042
			$ref[ $name ] = 0;
1043
			
1044
		}
1045
		
1046
		$ref[ $name ]++;
1047
	}
1048
	
1049
	
1050
	// get slugs
1051
	foreach( array_keys($r) as $i ) {
1052
		
1053
		// vars
1054
		$taxonomy = $r[ $i ];
1055
		
1056
		if( $ref[ $taxonomy ] > 1 ) {
1057
			
1058
			$r[ $i ] .= ' (' . $i . ')';
1059
			
1060
		}
1061
		
1062
	}
1063
	
1064
	
1065
	// return
1066
	return $r;
1067
	
1068
}
1069
1070
1071
/*
1072
*  acf_get_taxonomy_terms
1073
*
1074
*  This function will return an array of available taxonomy terms
1075
*
1076
*  @type	function
1077
*  @date	7/10/13
1078
*  @since	5.0.0
1079
*
1080
*  @param	$taxonomies (array)
1081
*  @return	(array)
1082
*/
1083
1084
function acf_get_taxonomy_terms( $taxonomies = array() ) {
1085
	
1086
	// force array
1087
	$taxonomies = acf_get_array( $taxonomies );
0 ignored issues
show
Documentation introduced by
$taxonomies is of type array, but the function expects a boolean.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
1088
	
1089
	
1090
	// get pretty taxonomy names
1091
	$taxonomies = acf_get_pretty_taxonomies( $taxonomies );
1092
	
1093
	
1094
	// vars
1095
	$r = array();
1096
	
1097
	
1098
	// populate $r
1099
	foreach( array_keys($taxonomies) as $taxonomy ) {
1100
		
1101
		// vars
1102
		$label = $taxonomies[ $taxonomy ];
1103
		$terms = get_terms( $taxonomy, array( 'hide_empty' => false ) );
1104
		$is_hierarchical = is_taxonomy_hierarchical( $taxonomy );
1105
		
1106
		
1107
		// bail early i no terms
1108
		if( empty($terms) ) continue;
1109
		
1110
		
1111
		// sort into hierachial order!
1112
		if( $is_hierarchical ) {
1113
			
1114
			$terms = _get_term_children( 0, $terms, $taxonomy );
1115
			
1116
		}
1117
		
1118
		
1119
		// add placeholder		
1120
		$r[ $label ] = array();
1121
		
1122
		
1123
		// add choices
1124
		foreach( $terms as $term ) {
1125
		
1126
			$k = "{$taxonomy}:{$term->slug}"; 
1127
			$r[ $label ][ $k ] = acf_get_term_title( $term );
1128
			
1129
		}
1130
		
1131
	}
1132
		
1133
	
1134
	// return
1135
	return $r;
1136
	
1137
}
1138
1139
1140
function acf_get_term_title( $term ) {
1141
	
1142
	// title
1143
	$title = $term->name;
1144
	
1145
	
1146
	// empty
1147
	if( $title === '' ) {
1148
		
1149
		$title = __('(no title)', 'acf');
1150
		
1151
	}
1152
	
1153
	
1154
	// ancestors
1155
	if( is_taxonomy_hierarchical($term->taxonomy) ) {
1156
		
1157
		$ancestors = get_ancestors( $term->term_id, $term->taxonomy );
1158
		
1159
		$title = str_repeat('- ', count($ancestors)) . $title;
1160
		
1161
	}
1162
	
1163
	
1164
	// return
1165
	return $title;
1166
	
1167
}
1168
1169
1170
/*
1171
*  acf_decode_taxonomy_terms
1172
*
1173
*  This function decodes the $taxonomy:$term strings into a nested array
1174
*
1175
*  @type	function
1176
*  @date	27/02/2014
1177
*  @since	5.0.0
1178
*
1179
*  @param	$terms (array)
1180
*  @return	(array)
1181
*/
1182
1183
function acf_decode_taxonomy_terms( $terms = false ) {
1184
	
1185
	// load all taxonomies if not specified in args
1186
	if( !$terms ) {
1187
		
1188
		$terms = acf_get_taxonomy_terms();
1189
		
1190
	}
1191
	
1192
	
1193
	// vars
1194
	$r = array();
1195
	
1196
	
1197
	foreach( $terms as $term ) {
0 ignored issues
show
Bug introduced by
The expression $terms of type array|boolean is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
1198
		
1199
		// vars
1200
		$data = acf_decode_taxonomy_term( $term );
1201
		
1202
		
1203
		// create empty array
1204
		if( !array_key_exists($data['taxonomy'], $r) )
1205
		{
1206
			$r[ $data['taxonomy'] ] = array();
1207
		}
1208
		
1209
		
1210
		// append to taxonomy
1211
		$r[ $data['taxonomy'] ][] = $data['term'];
1212
		
1213
	}
1214
	
1215
	
1216
	// return
1217
	return $r;
1218
	
1219
}
1220
1221
1222
/*
1223
*  acf_decode_taxonomy_term
1224
*
1225
*  This function will convert a term string into an array of term data
1226
*
1227
*  @type	function
1228
*  @date	31/03/2014
1229
*  @since	5.0.0
1230
*
1231
*  @param	$string (string)
1232
*  @return	(array)
1233
*/
1234
1235
function acf_decode_taxonomy_term( $string ) {
1236
	
1237
	// vars
1238
	$r = array();
1239
	
1240
	
1241
	// vars
1242
	$data = explode(':', $string);
1243
	$taxonomy = 'category';
1244
	$term = '';
1245
	
1246
	
1247
	// check data
1248
	if( isset($data[1]) ) {
1249
		
1250
		$taxonomy = $data[0];
1251
		$term = $data[1];
1252
		
1253
	}
1254
	
1255
	
1256
	// add data to $r
1257
	$r['taxonomy'] = $taxonomy;
1258
	$r['term'] = $term;
1259
	
1260
	
1261
	// return
1262
	return $r;
1263
	
1264
}
1265
1266
1267
/*
1268
*  acf_cache_get
1269
*
1270
*  This function is a wrapper for the wp_cache_get to allow for 3rd party customization
1271
*
1272
*  @type	function
1273
*  @date	4/12/2013
1274
*  @since	5.0.0
1275
*
1276
*  @param	$post_id (int)
1277
*  @return	$post_id (int)
1278
*/
1279
1280
/*
1281
function acf_cache_get( $key, &$found ) {
1282
	
1283
	// vars
1284
	$group = 'acf';
1285
	$force = false;
1286
	
1287
	
1288
	// load from cache
1289
	$cache = wp_cache_get( $key, $group, $force, $found );
1290
	
1291
	
1292
	// allow 3rd party customization if cache was not found
1293
	if( !$found )
1294
	{
1295
		$custom = apply_filters("acf/get_cache/{$key}", $cache);
1296
		
1297
		if( $custom !== $cache )
1298
		{
1299
			$cache = $custom;
1300
			$found = true;
1301
		}
1302
	}
1303
	
1304
	
1305
	// return
1306
	return $cache;
1307
	
1308
}
1309
*/
1310
1311
1312
/*
1313
*  acf_get_array
1314
*
1315
*  This function will force a variable to become an array
1316
*
1317
*  @type	function
1318
*  @date	4/02/2014
1319
*  @since	5.0.0
1320
*
1321
*  @param	$var (mixed)
1322
*  @return	(array)
1323
*/
1324
1325
function acf_get_array( $var = false, $delimiter = ',' ) {
1326
	
1327
	// is array?
1328
	if( is_array($var) ) {
1329
	
1330
		return $var;
1331
	
1332
	}
1333
	
1334
	
1335
	// bail early if empty
1336
	if( empty($var) && !is_numeric($var) ) {
1337
		
1338
		return array();
1339
		
1340
	}
1341
	
1342
	
1343
	// string 
1344
	if( is_string($var) && $delimiter ) {
1345
		
1346
		return explode($delimiter, $var);
1347
		
1348
	}
1349
	
1350
	
1351
	// place in array
1352
	return array( $var );
1353
	
1354
} 
1355
1356
1357
/*
1358
*  acf_get_posts
1359
*
1360
*  This function will return an array of posts making sure the order is correct
1361
*
1362
*  @type	function
1363
*  @date	3/03/2015
1364
*  @since	5.1.5
1365
*
1366
*  @param	$args (array)
1367
*  @return	(array)
1368
*/
1369
1370
function acf_get_posts( $args = array() ) {
1371
	
1372
	// vars
1373
	$posts = array();
0 ignored issues
show
Unused Code introduced by
$posts is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
1374
	
1375
	
1376
	// defaults
1377
	// leave suppress_filters as true becuase we don't want any plugins to modify the query as we know exactly what 
1378
	$args = acf_parse_args( $args, array(
1379
		'posts_per_page'	=> -1,
1380
		'post_type'			=> '',
1381
		'post_status'		=> 'any'
1382
	));
1383
	
1384
1385
	// post type
1386
	if( empty($args['post_type']) ) {
1387
		
1388
		$args['post_type'] = acf_get_post_types();
1389
		
1390
	}
1391
	
1392
	
1393
	// validate post__in
1394
	if( $args['post__in'] ) {
1395
		
1396
		// force value to array
1397
		$args['post__in'] = acf_get_array( $args['post__in'] );
1398
		
1399
		
1400
		// convert to int
1401
		$args['post__in'] = array_map('intval', $args['post__in']);
1402
		
1403
		
1404
		// add filter to remove post_type
1405
		// use 'query' filter so that 'suppress_filters' can remain true
1406
		//add_filter('query', '_acf_query_remove_post_type');
1407
		
1408
		
1409
		// order by post__in
1410
		$args['orderby'] = 'post__in';
1411
		
1412
	}
1413
	
1414
	
1415
	// load posts in 1 query to save multiple DB calls from following code
1416
	$posts = get_posts($args);
1417
	
1418
	
1419
	// remove this filter (only once)
1420
	//remove_filter('query', '_acf_query_remove_post_type');
1421
	
1422
	
1423
	// validate order
1424
	if( $posts && $args['post__in'] ) {
1425
		
1426
		// vars
1427
		$order = array();
1428
		
1429
		
1430
		// generate sort order
1431
		foreach( $posts as $i => $post ) {
1432
			
1433
			$order[ $i ] = array_search($post->ID, $args['post__in']);
1434
			
1435
		}
1436
		
1437
		
1438
		// sort
1439
		array_multisort($order, $posts);
1440
			
1441
	}
1442
	
1443
	
1444
	// return
1445
	return $posts;
1446
	
1447
}
1448
1449
1450
/*
1451
*  _acf_query_remove_post_type
1452
*
1453
*  This function will remove the 'wp_posts.post_type' WHERE clause completely
1454
*  When using 'post__in', this clause is unneccessary and slow.
1455
*
1456
*  @type	function
1457
*  @date	4/03/2015
1458
*  @since	5.1.5
1459
*
1460
*  @param	$sql (string)
1461
*  @return	$sql
1462
*/
0 ignored issues
show
Documentation introduced by
The doc-type $sql could not be parsed: Unknown type name "$sql" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
1463
1464
function _acf_query_remove_post_type( $sql ) {
1465
	
1466
	// global
1467
	global $wpdb;
1468
	
1469
	
1470
	// bail ealry if no 'wp_posts.ID IN'
1471
	if( strpos($sql, "$wpdb->posts.ID IN") === false ) {
1472
		
1473
		return $sql;
1474
		
1475
	}
1476
	
1477
    
1478
    // get bits
1479
	$glue = 'AND';
1480
	$bits = explode($glue, $sql);
1481
	
1482
    
1483
	// loop through $where and remove any post_type queries
1484
	foreach( $bits as $i => $bit ) {
1485
		
1486
		if( strpos($bit, "$wpdb->posts.post_type") !== false ) {
1487
			
1488
			unset( $bits[ $i ] );
1489
			
1490
		}
1491
		
1492
	}
1493
	
1494
	
1495
	// join $where back together
1496
	$sql = implode($glue, $bits);
1497
    
1498
    
1499
    // return
1500
    return $sql;
1501
    
1502
}
1503
1504
1505
/*
1506
*  acf_get_grouped_posts
1507
*
1508
*  This function will return all posts grouped by post_type
1509
*  This is handy for select settings
1510
*
1511
*  @type	function
1512
*  @date	27/02/2014
1513
*  @since	5.0.0
1514
*
1515
*  @param	$args (array)
1516
*  @return	(array)
1517
*/
1518
1519
function acf_get_grouped_posts( $args ) {
1520
	
1521
	// vars
1522
	$r = array();
1523
	
1524
	
1525
	// defaults
1526
	$args = acf_parse_args( $args, array(
1527
		'posts_per_page'			=> -1,
1528
		'paged'						=> 0,
1529
		'post_type'					=> 'post',
1530
		'orderby'					=> 'menu_order title',
1531
		'order'						=> 'ASC',
1532
		'post_status'				=> 'any',
1533
		'suppress_filters'			=> false,
1534
		'update_post_meta_cache'	=> false,
1535
	));
1536
1537
	
1538
	// find array of post_type
1539
	$post_types = acf_get_array( $args['post_type'] );
1540
	$post_types_labels = acf_get_pretty_post_types($post_types);
1541
	
1542
	
1543
	// attachment doesn't work if it is the only item in an array
1544
	if( count($post_types) == 1 ) {
1545
	
1546
		$args['post_type'] = current($post_types);
1547
		
1548
	}
1549
	
1550
	
1551
	// add filter to orderby post type
1552
	add_filter('posts_orderby', '_acf_orderby_post_type', 10, 2);
1553
	
1554
	
1555
	// get posts
1556
	$posts = get_posts( $args );
1557
	
1558
	
1559
	// remove this filter (only once)
1560
	remove_filter('posts_orderby', '_acf_orderby_post_type');
1561
	
1562
	
1563
	// loop
1564
	foreach( $post_types as $post_type ) {
1565
		
1566
		// vars
1567
		$this_posts = array();
1568
		$this_group = array();
1569
		
1570
		
1571
		// populate $this_posts
1572
		foreach( array_keys($posts) as $key ) {
1573
		
1574
			if( $posts[ $key ]->post_type == $post_type ) {
1575
				
1576
				$this_posts[] = acf_extract_var( $posts, $key );
1577
				
1578
			}
1579
			
1580
		}
1581
		
1582
		
1583
		// bail early if no posts for this post type
1584
		if( empty($this_posts) ) {
1585
		
1586
			continue;
1587
			
1588
		}
1589
	
1590
		
1591
		// sort into hierachial order!
1592
		// this will fail if a search has taken place because parents wont exist
1593
		if( is_post_type_hierarchical($post_type) && empty($args['s'])) {
1594
			
1595
			// vars
1596
			$match_id = $this_posts[ 0 ]->ID;
1597
			$offset = 0;
1598
			$length = count($this_posts);
1599
			$parent = acf_maybe_get( $args, 'post_parent', 0 );
1600
			
1601
			
1602
			// reset $this_posts
1603
			$this_posts = array();
1604
			
1605
			
1606
			// get all posts
1607
			$all_args = array_merge($args, array(
1608
				'posts_per_page'	=> -1,
1609
				'paged'				=> 0,
1610
				'post_type'			=> $post_type
1611
			));
1612
			
1613
			$all_posts = get_posts( $all_args );
1614
			
1615
			
1616
			// loop over posts and update $offset
1617
			foreach( $all_posts as $offset => $p ) {
1618
				
1619
				if( $p->ID == $match_id ) {
1620
					
1621
					break;
1622
					
1623
				}
1624
				
1625
			}
1626
			
1627
			
1628
			// order posts
1629
			$all_posts = get_page_children( $parent, $all_posts );
1630
			
1631
			
1632
			// append
1633
			for( $i = $offset; $i < ($offset + $length); $i++ ) {
1634
				
1635
				$this_posts[] = acf_extract_var( $all_posts, $i);
1636
				
1637
			}			
1638
			
1639
		}
1640
		
1641
				
1642
		// populate $this_posts
1643
		foreach( array_keys($this_posts) as $key ) {
1644
			
1645
			// extract post
1646
			$post = acf_extract_var( $this_posts, $key );
1647
			
1648
			
1649
			
1650
			// add to group
1651
			$this_group[ $post->ID ] = $post;
1652
			
1653
		}
1654
		
1655
		
1656
		// group by post type
1657
		$post_type_name = $post_types_labels[ $post_type ];
1658
		
1659
		$r[ $post_type_name ] = $this_group;
1660
					
1661
	}
1662
	
1663
	
1664
	// return
1665
	return $r;
1666
	
1667
}
1668
1669
function _acf_orderby_post_type( $ordeby, $wp_query ) {
1670
	
1671
	// global
1672
	global $wpdb;
1673
	
1674
	
1675
	// get post types
1676
	$post_types = $wp_query->get('post_type');
1677
	
1678
1679
	// prepend SQL
1680
	if( is_array($post_types) ) {
1681
		
1682
		$post_types = implode("','", $post_types);
1683
		$ordeby = "FIELD({$wpdb->posts}.post_type,'$post_types')," . $ordeby;
1684
		
1685
	}
1686
	
1687
	
1688
	// return
1689
	return $ordeby;
1690
	
1691
}
1692
1693
1694
function acf_get_post_title( $post = 0 ) {
1695
	
1696
	// load post if given an ID
1697
	if( is_numeric($post) ) {
1698
		
1699
		$post = get_post($post);
1700
		
1701
	}
1702
	
1703
	
1704
	// title
1705
	$title = get_the_title( $post->ID );
1706
	
1707
	
1708
	// empty
1709
	if( $title === '' ) {
1710
		
1711
		$title = __('(no title)', 'acf');
1712
		
1713
	}
1714
	
1715
	
1716
	// ancestors
1717
	if( $post->post_type != 'attachment' ) {
1718
		
1719
		$ancestors = get_ancestors( $post->ID, $post->post_type );
1720
		
1721
		$title = str_repeat('- ', count($ancestors)) . $title;
1722
		
1723
	}
1724
	
1725
	
1726
	// status
1727
	if( get_post_status( $post->ID ) != "publish" ) {
1728
		
1729
		$title .= ' (' . get_post_status( $post->ID ) . ')';
1730
		
1731
	}
1732
	
1733
	
1734
	// return
1735
	return $title;
1736
	
1737
}
1738
1739
1740
function acf_order_by_search( $array, $search ) {
1741
	
1742
	// vars
1743
	$weights = array();
1744
	$needle = strtolower( $search );
1745
	
1746
	
1747
	// add key prefix
1748
	foreach( array_keys($array) as $k ) {
1749
		
1750
		$array[ '_' . $k ] = acf_extract_var( $array, $k );
1751
		
1752
	}
1753
1754
1755
	// add search weight
1756
	foreach( $array as $k => $v ) {
1757
	
1758
		// vars
1759
		$weight = 0;
1760
		$haystack = strtolower( $v );
1761
		$strpos = strpos( $haystack, $needle );
1762
		
1763
		
1764
		// detect search match
1765
		if( $strpos !== false ) {
1766
			
1767
			// set eright to length of match
1768
			$weight = strlen( $search );
1769
			
1770
			
1771
			// increase weight if match starts at begining of string
1772
			if( $strpos == 0 ) {
1773
				
1774
				$weight++;
1775
				
1776
			}
1777
			
1778
		}
1779
		
1780
		
1781
		// append to wights
1782
		$weights[ $k ] = $weight;
1783
		
1784
	}
1785
	
1786
	
1787
	// sort the array with menu_order ascending
1788
	array_multisort( $weights, SORT_DESC, $array );
1789
	
1790
	
1791
	// remove key prefix
1792
	foreach( array_keys($array) as $k ) {
1793
		
1794
		$array[ substr($k,1) ] = acf_extract_var( $array, $k );
1795
		
1796
	}
1797
		
1798
	
1799
	// return
1800
	return $array;
1801
}
1802
1803
1804
1805
/*
1806
*  acf_json_encode
1807
*
1808
*  This function will return pretty JSON for all PHP versions
1809
*
1810
*  @type	function
1811
*  @date	6/03/2014
1812
*  @since	5.0.0
1813
*
1814
*  @param	$json (array)
1815
*  @return	(string)
1816
*/
1817
1818
function acf_json_encode( $json ) {
1819
	
1820
	// PHP at least 5.4
1821
	if( version_compare(PHP_VERSION, '5.4.0', '>=') ) {
1822
		
1823
		return json_encode($json, JSON_PRETTY_PRINT);
1824
		
1825
	}
1826
1827
	
1828
	
1829
	// PHP less than 5.4
1830
	$json = json_encode($json);
1831
	
1832
	
1833
	// http://snipplr.com/view.php?codeview&id=60559
1834
    $result      = '';
1835
    $pos         = 0;
1836
    $strLen      = strlen($json);
1837
    $indentStr   = "    ";
1838
    $newLine     = "\n";
1839
    $prevChar    = '';
1840
    $outOfQuotes = true;
1841
1842
    for ($i=0; $i<=$strLen; $i++) {
1843
1844
        // Grab the next character in the string.
1845
        $char = substr($json, $i, 1);
1846
1847
        // Are we inside a quoted string?
1848
        if ($char == '"' && $prevChar != '\\') {
1849
            $outOfQuotes = !$outOfQuotes;
1850
        
1851
        // If this character is the end of an element, 
1852
        // output a new line and indent the next line.
1853
        } else if(($char == '}' || $char == ']') && $outOfQuotes) {
1854
            $result .= $newLine;
1855
            $pos --;
1856
            for ($j=0; $j<$pos; $j++) {
1857
                $result .= $indentStr;
1858
            }
1859
        }
1860
        
1861
        // Add the character to the result string.
1862
        $result .= $char;
1863
		
1864
		// If this character is ':' adda space after it
1865
        if($char == ':' && $outOfQuotes) {
1866
            $result .= ' ';
1867
        }
1868
        
1869
        // If the last character was the beginning of an element, 
1870
        // output a new line and indent the next line.
1871
        if (($char == ',' || $char == '{' || $char == '[') && $outOfQuotes) {
1872
            $result .= $newLine;
1873
            if ($char == '{' || $char == '[') {
1874
                $pos ++;
1875
            }
1876
            
1877
            for ($j = 0; $j < $pos; $j++) {
1878
                $result .= $indentStr;
1879
            }
1880
        }
1881
        
1882
        $prevChar = $char;
1883
    }
1884
	
1885
	
1886
	// return
1887
    return $result;
1888
	
1889
}
1890
1891
1892
/*
1893
*  acf_str_exists
1894
*
1895
*  This function will return true if a sub string is found
1896
*
1897
*  @type	function
1898
*  @date	1/05/2014
1899
*  @since	5.0.0
1900
*
1901
*  @param	$needle (string)
1902
*  @param	$haystack (string)
1903
*  @return	(boolean)
1904
*/
1905
1906
function acf_str_exists( $needle, $haystack ) {
1907
	
1908
	// return true if $haystack contains the $needle
1909
	if( is_string($haystack) && strpos($haystack, $needle) !== false ) {
1910
		
1911
		return true;
1912
		
1913
	}
1914
	
1915
	
1916
	// return
1917
	return false;
1918
}
1919
1920
1921
/*
1922
*  acf_debug
1923
*
1924
*  description
1925
*
1926
*  @type	function
1927
*  @date	2/05/2014
1928
*  @since	5.0.0
1929
*
1930
*  @param	$post_id (int)
1931
*  @return	$post_id (int)
1932
*/
0 ignored issues
show
Documentation introduced by
The doc-type $post_id could not be parsed: Unknown type name "$post_id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
1933
1934
function acf_debug() {
1935
	
1936
	// vars
1937
	$args = func_get_args();
1938
	$s = array_shift($args);
1939
	$o = '';
1940
	$nl = "\r\n";
1941
	
1942
	
1943
	// start script
1944
	$o .= '<script type="text/javascript">' . $nl;
1945
	
1946
	$o .= 'console.log("' . $s . '"';
1947
	
1948
	if( !empty($args) ) {
1949
		
1950
		foreach( $args as $arg ) {
1951
			
1952
			if( is_object($arg) || is_array($arg) ) {
1953
				
1954
				$arg = json_encode($arg);
1955
				
1956
			} elseif( is_bool($arg) ) {
1957
				
1958
				$arg = $arg ? 'true' : 'false';
1959
				
1960
			}elseif( is_string($arg) ) {
1961
				
1962
				$arg = '"' . $arg . '"';
1963
				
1964
			}
1965
			
1966
			$o .= ', ' . $arg;
1967
			
1968
		}
1969
	}
1970
	
1971
	$o .= ');' . $nl;
1972
	
1973
	
1974
	// end script
1975
	$o .= '</script>' . $nl;
1976
	
1977
	
1978
	// echo
1979
	echo $o;
1980
}
1981
1982
function acf_debug_start() {
1983
	
1984
	acf_update_setting( 'debug_start', memory_get_usage());
1985
	
1986
}
1987
1988
function acf_debug_end() {
1989
	
1990
	$start = acf_get_setting( 'debug_start' );
1991
	$end = memory_get_usage();
1992
	
1993
	return $end - $start;
1994
	
1995
}
1996
1997
1998
/*
1999
*  acf_get_updates
2000
*
2001
*  This function will reutrn all or relevant updates for ACF
2002
*
2003
*  @type	function
2004
*  @date	12/05/2014
2005
*  @since	5.0.0
2006
*
2007
*  @param	$post_id (int)
2008
*  @return	$post_id (int)
2009
*/
0 ignored issues
show
Documentation introduced by
The doc-type $post_id could not be parsed: Unknown type name "$post_id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
2010
2011
function acf_get_updates() {
2012
	
2013
	// vars
2014
	$updates = array();
2015
	$plugin_version = acf_get_setting('version');
2016
	$acf_version = get_option('acf_version');
2017
	$path = acf_get_path('admin/updates');
2018
	
2019
	
2020
	// bail early if no version (not activated)
2021
	if( !$acf_version ) {
2022
		
2023
		return false;
2024
		
2025
	}
2026
	
2027
	
2028
	// check that path exists
2029
	if( !file_exists( $path ) ) {
2030
	
2031
		return false;
2032
		
2033
	}
2034
	
2035
	
2036
	$dir = opendir( $path );
2037
2038
    while(false !== ( $file = readdir($dir)) ) {
2039
    
2040
    	// only php files
2041
    	if( substr($file, -4) !== '.php' ) {
2042
    	
2043
	    	continue;
2044
	    	
2045
    	}
2046
    	
2047
    	
2048
    	// get version number
2049
    	$update_version = substr($file, 0, -4);
2050
    	
2051
    	
2052
    	// ignore if update is for a future version. May exist for testing
2053
		if( version_compare( $update_version, $plugin_version, '>') ) {
2054
		
2055
			continue;
2056
			
2057
		}
2058
		
2059
		// ignore if update has already been run
2060
		if( version_compare( $update_version, $acf_version, '<=') ) {
2061
		
2062
			continue;
2063
			
2064
		}
2065
		
2066
		
2067
    	// append
2068
        $updates[] = $update_version;
2069
        
2070
    }
2071
    
2072
    
2073
    // return
2074
    return $updates;
2075
	
2076
}
2077
2078
2079
/*
2080
*  acf_encode_choices
2081
*
2082
*  description
2083
*
2084
*  @type	function
2085
*  @date	4/06/2014
2086
*  @since	5.0.0
2087
*
2088
*  @param	$post_id (int)
2089
*  @return	$post_id (int)
2090
*/
0 ignored issues
show
Documentation introduced by
The doc-type $post_id could not be parsed: Unknown type name "$post_id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
2091
2092
function acf_encode_choices( $array = array() ) {
2093
	
2094
	// bail early if not array
2095
	if( !is_array($array) ) {
2096
		
2097
		return $array;
2098
		
2099
	}
2100
	
2101
	
2102
	// vars
2103
	$string = '';
2104
	
2105
	
2106
	if( !empty($array) ) {
2107
		
2108
		foreach( $array as $k => $v ) { 
2109
			
2110
			if( $k !== $v ) {
2111
				
2112
				$array[ $k ] = $k . ' : ' . $v;
2113
				
2114
			}
2115
			
2116
		}
2117
		
2118
		$string = implode("\n", $array);
2119
		
2120
	}
2121
	
2122
	
2123
	// return
2124
	return $string;
2125
	
2126
}
2127
2128
function acf_decode_choices( $string = '' ) {
2129
	
2130
	// validate
2131
	if( $string === '') {
2132
		
2133
		return array();
2134
		
2135
	// force array on single numeric values
2136
	} elseif( is_numeric($string) ) {
2137
		
2138
		// allow
2139
	
2140
	// bail early if not a a string
2141
	} elseif( !is_string($string) ) {
2142
		
2143
		return $string;
2144
		
2145
	}
2146
	
2147
	
2148
	// vars
2149
	$array = array();
2150
	
2151
	
2152
	// explode
2153
	$lines = explode("\n", $string);
2154
	
2155
	
2156
	// key => value
2157
	foreach( $lines as $line ) {
2158
		
2159
		// vars
2160
		$k = trim($line);
2161
		$v = trim($line);
2162
		
2163
		
2164
		// look for ' : '
2165
		if( acf_str_exists(' : ', $line) ) {
2166
		
2167
			$line = explode(' : ', $line);
2168
			
2169
			$k = trim($line[0]);
2170
			$v = trim($line[1]);
2171
			
2172
		}
2173
		
2174
		
2175
		// append
2176
		$array[ $k ] = $v;
2177
		
2178
	}
2179
	
2180
	
2181
	// return
2182
	return $array;
2183
	
2184
}
2185
2186
2187
2188
/*
2189
*  acf_convert_date_to_php
2190
*
2191
*  This fucntion converts a date format string from JS to PHP
2192
*
2193
*  @type	function
2194
*  @date	20/06/2014
2195
*  @since	5.0.0
2196
*
2197
*  @param	$date (string)
2198
*  @return	$date (string)
2199
*/
0 ignored issues
show
Documentation introduced by
The doc-type $date could not be parsed: Unknown type name "$date" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
2200
2201
acf_update_setting('php_to_js_date_formats', array(
2202
2203
	// Year
2204
	'Y'	=> 'yy',	// Numeric, 4 digits 								1999, 2003
2205
	'y'	=> 'y',		// Numeric, 2 digits 								99, 03
2206
	
2207
	
2208
	// Month
2209
	'm'	=> 'mm',	// Numeric, with leading zeros  					01–12
2210
	'n'	=> 'm',		// Numeric, without leading zeros  					1–12
2211
	'F'	=> 'MM',	// Textual full   									January – December
2212
	'M'	=> 'M',		// Textual three letters    						Jan - Dec 
2213
	
2214
	
2215
	// Weekday
2216
	'l'	=> 'DD',	// Full name  (lowercase 'L') 						Sunday – Saturday
2217
	'D'	=> 'D',		// Three letter name 	 							Mon – Sun 
2218
	
2219
	
2220
	// Day of Month
2221
	'd'	=> 'dd',	// Numeric, with leading zeros						01–31
2222
	'j'	=> 'd',		// Numeric, without leading zeros 					1–31
2223
	'S'	=> '',		// The English suffix for the day of the month  	st, nd or th in the 1st, 2nd or 15th. 
2224
2225
));
2226
2227 View Code Duplication
function acf_convert_date_to_php( $date ) {
0 ignored issues
show
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
2228
	
2229
	// vars
2230
	$ignore = array();
2231
	
2232
	
2233
	// conversion
2234
	$php_to_js = acf_get_setting('php_to_js_date_formats');
2235
	
2236
	
2237
	// loop over conversions
2238
	foreach( $php_to_js as $replace => $search ) {
2239
		
2240
		// ignore this replace?
2241
		if( in_array($search, $ignore) ) {
2242
			
2243
			continue;
2244
			
2245
		}
2246
		
2247
		
2248
		// replace
2249
		$date = str_replace($search, $replace, $date);
2250
		
2251
		
2252
		// append to ignore
2253
		$ignore[] = $replace;
2254
	}
2255
	
2256
	
2257
	// return
2258
	return $date;
2259
	
2260
}
2261
2262
/*
2263
*  acf_convert_date_to_js
2264
*
2265
*  This fucntion converts a date format string from PHP to JS
2266
*
2267
*  @type	function
2268
*  @date	20/06/2014
2269
*  @since	5.0.0
2270
*
2271
*  @param	$post_id (int)
2272
*  @return	$post_id (int)
2273
*/
0 ignored issues
show
Documentation introduced by
The doc-type $post_id could not be parsed: Unknown type name "$post_id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
2274
2275 View Code Duplication
function acf_convert_date_to_js( $date ) {
0 ignored issues
show
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
2276
	
2277
	// vars
2278
	$ignore = array();
2279
	
2280
	
2281
	// conversion
2282
	$php_to_js = acf_get_setting('php_to_js_date_formats');
2283
	
2284
	
2285
	// loop over conversions
2286
	foreach( $php_to_js as $search => $replace ) {
2287
		
2288
		// ignore this replace?
2289
		if( in_array($search, $ignore) ) {
2290
			
2291
			continue;
2292
			
2293
		}
2294
		
2295
		
2296
		// replace
2297
		$date = str_replace($search, $replace, $date);
2298
		
2299
		
2300
		// append to ignore
2301
		$ignore[] = $replace;
2302
	}
2303
	
2304
	
2305
	// return
2306
	return $date;
2307
	
2308
}
2309
2310
2311
/*
2312
*  acf_update_user_setting
2313
*
2314
*  description
2315
*
2316
*  @type	function
2317
*  @date	15/07/2014
2318
*  @since	5.0.0
2319
*
2320
*  @param	$post_id (int)
2321
*  @return	$post_id (int)
2322
*/
0 ignored issues
show
Documentation introduced by
The doc-type $post_id could not be parsed: Unknown type name "$post_id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
2323
2324
function acf_update_user_setting( $name, $value ) {
2325
	
2326
	// get current user id
2327
	$user_id = get_current_user_id();
2328
	
2329
	
2330
	// get user settings
2331
	$settings = get_user_meta( $user_id, 'acf_user_settings', false );
2332
	
2333
	
2334
	// find settings
2335
	if( isset($settings[0]) ) {
2336
	
2337
		$settings = $settings[0];
2338
	
2339
	} else {
2340
		
2341
		$settings = array();
2342
		
2343
	}
2344
	
2345
	
2346
	// delete setting (allow 0 to save)
2347
	if( !$value && !is_numeric($value) ) {
2348
		
2349
		unset($settings[ $name ]);
2350
	
2351
	// append setting	
2352
	} else {
2353
		
2354
		$settings[ $name ] = $value;
2355
		
2356
	}
2357
	
2358
	
2359
	// update user data
2360
	return update_metadata('user', $user_id, 'acf_user_settings', $settings);
2361
	
2362
	
2363
}
2364
2365
2366
/*
2367
*  acf_get_user_setting
2368
*
2369
*  description
2370
*
2371
*  @type	function
2372
*  @date	15/07/2014
2373
*  @since	5.0.0
2374
*
2375
*  @param	$post_id (int)
2376
*  @return	$post_id (int)
2377
*/
0 ignored issues
show
Documentation introduced by
The doc-type $post_id could not be parsed: Unknown type name "$post_id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
2378
2379
function acf_get_user_setting( $name = '', $default = false ) {
2380
	
2381
	// get current user id
2382
	$user_id = get_current_user_id();
2383
	
2384
	
2385
	// get user settings
2386
	$settings = get_user_meta( $user_id, 'acf_user_settings', false );
2387
	
2388
	
2389
	// bail arly if no settings
2390
	if( !isset($settings[0][$name]) ) {
2391
		
2392
		return $default;
2393
		
2394
	}
2395
	
2396
	
2397
	// return
2398
	return $settings[0][$name];
2399
	
2400
}
2401
2402
2403
/*
2404
*  acf_in_array
2405
*
2406
*  description
2407
*
2408
*  @type	function
2409
*  @date	22/07/2014
2410
*  @since	5.0.0
2411
*
2412
*  @param	$post_id (int)
2413
*  @return	$post_id (int)
2414
*/
0 ignored issues
show
Documentation introduced by
The doc-type $post_id could not be parsed: Unknown type name "$post_id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
2415
2416
function acf_in_array( $value, $array ) {
2417
	
2418
	// bail early if not array
2419
	if( !is_array($array) ) {
2420
		
2421
		return false;
2422
		
2423
	}
2424
	
2425
	
2426
	// find value in array
2427
	return in_array($value, $array);
2428
	
2429
}
2430
2431
2432
/*
2433
*  acf_get_valid_post_id
2434
*
2435
*  This function will return a valid post_id based on the current screen / parameter
2436
*
2437
*  @type	function
2438
*  @date	8/12/2013
2439
*  @since	5.0.0
2440
*
2441
*  @param	$post_id (mixed)
2442
*  @return	$post_id (mixed)
2443
*/
0 ignored issues
show
Documentation introduced by
The doc-type $post_id could not be parsed: Unknown type name "$post_id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
2444
2445
function acf_get_valid_post_id( $post_id = 0 ) {
2446
	
2447
	// set post_id to global
2448
	if( !$post_id ) {
2449
	
2450
		$post_id = (int) get_the_ID();
2451
		
2452
	}
2453
	
2454
	
2455
	// allow for option == options
2456
	if( $post_id == 'option' ) {
2457
	
2458
		$post_id = 'options';
2459
		
2460
	}
2461
	
2462
	
2463
	// $post_id may be an object
2464
	if( is_object($post_id) ) {
2465
		
2466
		if( isset($post_id->roles, $post_id->ID) ) {
2467
		
2468
			$post_id = 'user_' . $post_id->ID;
2469
			
2470
		} elseif( isset($post_id->taxonomy, $post_id->term_id) ) {
2471
		
2472
			$post_id = $post_id->taxonomy . '_' . $post_id->term_id;
2473
			
2474
		} elseif( isset($post_id->comment_ID) ) {
2475
		
2476
			$post_id = 'comment_' . $post_id->comment_ID;
2477
			
2478
		} elseif( isset($post_id->ID) ) {
2479
		
2480
			$post_id = $post_id->ID;
2481
			
2482
		}
2483
		
2484
	}
2485
	
2486
	
2487
	// append language code
2488
	if( $post_id == 'options' ) {
2489
		
2490
		$dl = acf_get_setting('default_language');
2491
		$cl = acf_get_setting('current_language');
2492
		
2493
		if( $cl && $cl !== $dl ) {
2494
			
2495
			$post_id .= '_' . $cl;
2496
			
2497
		}
2498
		
2499
	}
2500
	
2501
	
2502
	/*
2503
	*  Override for preview
2504
	*  
2505
	*  If the $_GET['preview_id'] is set, then the user wants to see the preview data.
2506
	*  There is also the case of previewing a page with post_id = 1, but using get_field
2507
	*  to load data from another post_id.
2508
	*  In this case, we need to make sure that the autosave revision is actually related
2509
	*  to the $post_id variable. If they match, then the autosave data will be used, otherwise, 
2510
	*  the user wants to load data from a completely different post_id
2511
	*/
2512
	
2513
	if( isset($_GET['preview_id']) ) {
2514
	
2515
		$autosave = wp_get_post_autosave( $_GET['preview_id'] );
2516
		
2517
		if( $autosave && $autosave->post_parent == $post_id ) {
2518
		
2519
			$post_id = (int) $autosave->ID;
2520
			
2521
		}
2522
		
2523
	}
2524
	
2525
	
2526
	// return
2527
	return $post_id;
2528
	
2529
}
2530
2531
2532
/*
2533
*  acf_upload_files
2534
*
2535
*  This function will walk througfh the $_FILES data and upload each found
2536
*
2537
*  @type	function
2538
*  @date	25/10/2014
2539
*  @since	5.0.9
2540
*
2541
*  @param	$ancestors (array) an internal parameter, not required
2542
*  @return	n/a
2543
*/
0 ignored issues
show
Documentation introduced by
The doc-type n/a could not be parsed: Unknown type name "n/a" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
2544
	
2545
function acf_upload_files( $ancestors = array() ) {
2546
	
2547
	// vars
2548
	$file = array(
2549
		'name'		=> '',
2550
		'type'		=> '',
2551
		'tmp_name'	=> '',
2552
		'error'		=> '',
2553
		'size' 		=> ''
2554
	);
2555
	
2556
	
2557
	// populate with $_FILES data
2558
	foreach( array_keys($file) as $k ) {
2559
		
2560
		$file[ $k ] = $_FILES['acf'][ $k ];
2561
		
2562
	}
2563
	
2564
	
2565
	// walk through ancestors
2566
	if( !empty($ancestors) ) {
2567
		
2568
		foreach( $ancestors as $a ) {
2569
			
2570
			foreach( array_keys($file) as $k ) {
2571
				
2572
				$file[ $k ] = $file[ $k ][ $a ];
2573
				
2574
			}
2575
			
2576
		}
2577
		
2578
	}
2579
	
2580
	
2581
	// is array?
2582
	if( is_array($file['name']) ) {
2583
		
2584
		foreach( array_keys($file['name']) as $k ) {
2585
				
2586
			$_ancestors = array_merge($ancestors, array($k));
2587
			
2588
			acf_upload_files( $_ancestors );
2589
			
2590
		}
2591
		
2592
		return;
2593
		
2594
	}
2595
	
2596
	
2597
	// bail ealry if file has error (no file uploaded)
2598
	if( $file['error'] ) {
2599
		
2600
		return;
2601
		
2602
	}
2603
	
2604
	
2605
	// assign global _acfuploader for media validation
2606
	$_POST['_acfuploader'] = end($ancestors);
2607
	
2608
	
2609
	// file found!
2610
	$attachment_id = acf_upload_file( $file );
2611
	
2612
	
2613
	// update $_POST
2614
	array_unshift($ancestors, 'acf');
2615
	acf_update_nested_array( $_POST, $ancestors, $attachment_id );
2616
	
2617
}
2618
2619
2620
/*
2621
*  acf_upload_file
2622
*
2623
*  This function will uploade a $_FILE
2624
*
2625
*  @type	function
2626
*  @date	27/10/2014
2627
*  @since	5.0.9
2628
*
2629
*  @param	$uploaded_file (array) array found from $_FILE data
2630
*  @return	$id (int) new attachment ID
2631
*/
0 ignored issues
show
Documentation introduced by
The doc-type $id could not be parsed: Unknown type name "$id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
2632
2633
function acf_upload_file( $uploaded_file ) {
2634
	
2635
	// required
2636
	require_once( ABSPATH . "/wp-load.php" );
2637
	require_once( ABSPATH . "/wp-admin/includes/file.php" );
2638
	require_once( ABSPATH . "/wp-admin/includes/image.php" );
2639
	 
2640
	 
2641
	// required for wp_handle_upload() to upload the file
2642
	$upload_overrides = array( 'test_form' => false );
2643
	
2644
	
2645
	// upload
2646
	$file = wp_handle_upload( $uploaded_file, $upload_overrides );
2647
	
2648
	
2649
	// bail ealry if upload failed
2650
	if( isset($file['error']) ) {
2651
		
2652
		return $file['error'];
2653
		
2654
	}
2655
	
2656
	
2657
	// vars
2658
	$url = $file['url'];
2659
	$type = $file['type'];
2660
	$file = $file['file'];
2661
	$filename = basename($file);
2662
	
2663
2664
	// Construct the object array
2665
	$object = array(
2666
		'post_title' => $filename,
2667
		'post_mime_type' => $type,
2668
		'guid' => $url,
2669
		'context' => 'acf-upload'
2670
	);
2671
2672
	// Save the data
2673
	$id = wp_insert_attachment($object, $file);
2674
2675
	// Add the meta-data
2676
	wp_update_attachment_metadata( $id, wp_generate_attachment_metadata( $id, $file ) );
2677
	
2678
	/** This action is documented in wp-admin/custom-header.php */
2679
	do_action( 'wp_create_file_in_uploads', $file, $id ); // For replication
2680
	
2681
	// return new ID
2682
	return $id;
2683
	
2684
}
2685
2686
2687
/*
2688
*  acf_update_nested_array
2689
*
2690
*  This function will update a nested array value. Useful for modifying the $_POST array
2691
*
2692
*  @type	function
2693
*  @date	27/10/2014
2694
*  @since	5.0.9
2695
*
2696
*  @param	$array (array) target array to be updated
2697
*  @param	$ancestors (array) array of keys to navigate through to find the child
2698
*  @param	$value (mixed) The new value
2699
*  @return	(boolean)
2700
*/
2701
2702
function acf_update_nested_array( &$array, $ancestors, $value ) {
2703
	
2704
	// if no more ancestors, update the current var
2705
	if( empty($ancestors) ) {
2706
		
2707
		$array = $value;
2708
		
2709
		// return
2710
		return true;
2711
		
2712
	}
2713
	
2714
	
2715
	// shift the next ancestor from the array
2716
	$k = array_shift( $ancestors );
2717
	
2718
	
2719
	// if exists
2720
	if( isset($array[ $k ]) ) {
2721
		
2722
		return acf_update_nested_array( $array[ $k ], $ancestors, $value );
2723
		
2724
	}
2725
		
2726
	
2727
	// return 
2728
	return false;
2729
}
2730
2731
2732
/*
2733
*  acf_is_screen
2734
*
2735
*  This function will return true if all args are matched for the current screen
2736
*
2737
*  @type	function
2738
*  @date	9/12/2014
2739
*  @since	5.1.5
2740
*
2741
*  @param	$post_id (int)
2742
*  @return	$post_id (int)
2743
*/
0 ignored issues
show
Documentation introduced by
The doc-type $post_id could not be parsed: Unknown type name "$post_id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
2744
2745
function acf_is_screen( $id = '' ) {
2746
	
2747
	// vars
2748
	$current_screen = get_current_screen();
2749
	
2750
	
2751
	// return
2752
	return ($id === $current_screen->id);
2753
	
2754
}
2755
2756
2757
/*
2758
*  acf_maybe_get
2759
*
2760
*  This function will return a var if it exists in an array
2761
*
2762
*  @type	function
2763
*  @date	9/12/2014
2764
*  @since	5.1.5
2765
*
2766
*  @param	$array (array) the array to look within
2767
*  @param	$key (key) the array key to look for. Nested values may be found using '/'
2768
*  @param	$default (mixed) the value returned if not found
2769
*  @return	$post_id (int)
2770
*/
0 ignored issues
show
Documentation introduced by
The doc-type $post_id could not be parsed: Unknown type name "$post_id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
2771
2772
function acf_maybe_get( $array, $key, $default = null ) {
2773
	
2774
	// vars
2775
	$keys = explode('/', $key);
2776
	
2777
	
2778
	// loop through keys
2779
	foreach( $keys as $k ) {
2780
		
2781
		// return default if does not exist
2782
		if( !isset($array[ $k ]) ) {
2783
			
2784
			return $default;
2785
			
2786
		}
2787
		
2788
		
2789
		// update $array
2790
		$array = $array[ $k ];
2791
		
2792
	}
2793
	
2794
	
2795
	// return
2796
	return $array;
2797
	
2798
}
2799
2800
2801
/*
2802
*  acf_get_attachment
2803
*
2804
*  This function will return an array of attachment data
2805
*
2806
*  @type	function
2807
*  @date	5/01/2015
2808
*  @since	5.1.5
2809
*
2810
*  @param	$post (mixed) either post ID or post object
2811
*  @return	(array)
2812
*/
2813
2814
function acf_get_attachment( $post ) {
2815
	
2816
	// get post
2817
	if ( !$post = get_post( $post ) ) {
2818
		
2819
		return false;
2820
		
2821
	}
2822
	
2823
	
2824
	// vars
2825
	$thumb_id = 0;
2826
	$id = $post->ID;
2827
	$a = array(
2828
		'ID'			=> $id,
2829
		'id'			=> $id,
2830
		'title'       	=> $post->post_title,
2831
		'filename'    	=> wp_basename( $post->guid ),
2832
		'url'			=> wp_get_attachment_url( $id ),
2833
		'alt'			=> get_post_meta($id, '_wp_attachment_image_alt', true),
2834
		'author'		=> $post->post_author,
2835
		'description'	=> $post->post_content,
2836
		'caption'		=> $post->post_excerpt,
2837
		'name'			=> $post->post_name,
2838
		'date'			=> $post->post_date_gmt,
2839
		'modified'		=> $post->post_modified_gmt,
2840
		'mime_type'		=> $post->post_mime_type,
2841
		'type'			=> acf_maybe_get( explode('/', $post->post_mime_type), 0, '' ),
2842
		'icon'			=> wp_mime_type_icon( $id )
2843
	);
2844
	
2845
	
2846
	// video may use featured image
2847
	if( $a['type'] === 'image' ) {
2848
		
2849
		$thumb_id = $id;
2850
		$src = wp_get_attachment_image_src( $id, 'full' );
2851
		
2852
		$a['url'] = $src[0];
2853
		$a['width'] = $src[1];
2854
		$a['height'] = $src[2];
2855
		
2856
		
2857
	} elseif( $a['type'] === 'audio' || $a['type'] === 'video' ) {
2858
		
2859
		// video dimentions
2860
		if( $a['type'] == 'video' ) {
2861
			
2862
			$meta = wp_get_attachment_metadata( $id );
2863
			$a['width'] = acf_maybe_get($meta, 'width', 0);
2864
			$a['height'] = acf_maybe_get($meta, 'height', 0);
2865
		
2866
		}
2867
		
2868
		
2869
		// feature image
2870
		if( $featured_id = get_post_thumbnail_id($id) ) {
2871
		
2872
			$thumb_id = $featured_id;
2873
			
2874
		}
2875
						
2876
	}
2877
	
2878
	
2879
	// sizes
2880
	if( $thumb_id ) {
2881
		
2882
		// find all image sizes
2883
		if( $sizes = get_intermediate_image_sizes() ) {
2884
			
2885
			$a['sizes'] = array();
2886
			
2887
			foreach( $sizes as $size ) {
2888
				
2889
				// url
2890
				$src = wp_get_attachment_image_src( $thumb_id, $size );
2891
				
2892
				// add src
2893
				$a['sizes'][ $size ] = $src[0];
2894
				$a['sizes'][ $size . '-width' ] = $src[1];
2895
				$a['sizes'][ $size . '-height' ] = $src[2];
2896
				
2897
			}
2898
			
2899
		}
2900
		
2901
	}
2902
	
2903
	
2904
	// return
2905
	return $a;
2906
	
2907
}
2908
2909
2910
/*
2911
*  acf_get_truncated
2912
*
2913
*  This function will truncate and return a string
2914
*
2915
*  @type	function
2916
*  @date	8/08/2014
2917
*  @since	5.0.0
2918
*
2919
*  @param	$text (string)
2920
*  @param	$length (int)
2921
*  @return	(string)
2922
*/
2923
2924
function acf_get_truncated( $text, $length = 64 ) {
2925
	
2926
	// vars
2927
	$text = trim($text);
2928
	$the_length = strlen( $text );
2929
	
2930
	
2931
	// cut
2932
	$return = substr( $text, 0, ($length - 3) );
2933
	
2934
	
2935
	// ...
2936
	if( $the_length > ($length - 3) ) {
2937
	
2938
		$return .= '...';
2939
		
2940
	}
2941
	
2942
	
2943
	// return
2944
	return $return;
2945
	
2946
}
2947
2948
2949
/*
2950
*  acf_get_current_url
2951
*
2952
*  This function will return the current URL
2953
*
2954
*  @type	function
2955
*  @date	23/01/2015
2956
*  @since	5.1.5
2957
*
2958
*  @param	n/a
2959
*  @return	(string)
2960
*/
2961
2962
function acf_get_current_url() {
2963
	
2964
	// vars
2965
	$home = home_url();
2966
	$url = home_url($_SERVER['REQUEST_URI']);
2967
	
2968
	
2969
	// test
2970
	//$home = 'http://acf5/dev/wp-admin';
2971
	//$url = $home . '/dev/wp-admin/api-template/acf_form';
2972
	
2973
	
2974
	// explode url (4th bit is the sub folder)
2975
	$bits = explode('/', $home, 4);
2976
	
2977
	
2978
	/*
2979
	Array (
2980
	    [0] => http:
2981
	    [1] => 
2982
	    [2] => acf5
2983
	    [3] => dev
2984
	)
2985
	*/
2986
	
2987
	
2988
	// handle sub folder
2989
	if( !empty($bits[3]) ) {
2990
		
2991
		$find = '/' . $bits[3];
2992
		$pos = strpos($url, $find);
2993
		$length = strlen($find);
2994
		
2995
		if( $pos !== false ) {
2996
			
2997
		    $url = substr_replace($url, '', $pos, $length);
2998
		    
2999
		}
3000
				
3001
	}
3002
	
3003
	
3004
	// return
3005
	return $url;
3006
	
3007
}
3008
3009
3010
/*
3011
*  acf_current_user_can_admin
3012
*
3013
*  This function will return true if the current user can administrate the ACF field groups
3014
*
3015
*  @type	function
3016
*  @date	9/02/2015
3017
*  @since	5.1.5
3018
*
3019
*  @param	$post_id (int)
3020
*  @return	$post_id (int)
3021
*/
0 ignored issues
show
Documentation introduced by
The doc-type $post_id could not be parsed: Unknown type name "$post_id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
3022
3023
function acf_current_user_can_admin() {
3024
	
3025
	if( acf_get_setting('show_admin') && current_user_can(acf_get_setting('capability')) ) {
3026
		
3027
		return true;
3028
		
3029
	}
3030
	
3031
	
3032
	// return
3033
	return false;
3034
	
3035
}
3036
3037
3038
/*
3039
*  acf_get_filesize
3040
*
3041
*  This function will return a numeric value of bytes for a given filesize string
3042
*
3043
*  @type	function
3044
*  @date	18/02/2015
3045
*  @since	5.1.5
3046
*
3047
*  @param	$size (mixed)
3048
*  @return	(int)
3049
*/
3050
3051
function acf_get_filesize( $size = 1 ) {
3052
	
3053
	// vars
3054
	$unit = 'MB';
3055
	$units = array(
3056
		'TB' => 4,
3057
		'GB' => 3,
3058
		'MB' => 2,
3059
		'KB' => 1,
3060
	);
3061
	
3062
	
3063
	// look for $unit within the $size parameter (123 KB)
3064
	if( is_string($size) ) {
3065
		
3066
		// vars
3067
		$custom = strtoupper( substr($size, -2) );
3068
		
3069
		foreach( $units as $k => $v ) {
3070
			
3071
			if( $custom === $k ) {
3072
				
3073
				$unit = $k;
3074
				$size = substr($size, 0, -2);
3075
					
3076
			}
3077
			
3078
		}
3079
		
3080
	}
3081
	
3082
	
3083
	// calc bytes
3084
	$bytes = floatval($size) * pow(1024, $units[$unit]); 
3085
	
3086
	
3087
	// return
3088
	return $bytes;
3089
	
3090
}
3091
3092
3093
/*
3094
*  acf_format_filesize
3095
*
3096
*  This function will return a formatted string containing the filesize and unit
3097
*
3098
*  @type	function
3099
*  @date	18/02/2015
3100
*  @since	5.1.5
3101
*
3102
*  @param	$size (mixed)
3103
*  @return	(int)
3104
*/
3105
3106
function acf_format_filesize( $size = 1 ) {
3107
	
3108
	// convert
3109
	$bytes = acf_get_filesize( $size );
3110
	
3111
	
3112
	// vars
3113
	$units = array(
3114
		'TB' => 4,
3115
		'GB' => 3,
3116
		'MB' => 2,
3117
		'KB' => 1,
3118
	);
3119
	
3120
	
3121
	// loop through units
3122
	foreach( $units as $k => $v ) {
3123
		
3124
		$result = $bytes / pow(1024, $v);
3125
		
3126
		if( $result >= 1 ) {
3127
			
3128
			return $result . ' ' . $k;
3129
			
3130
		}
3131
		
3132
	}
3133
	
3134
	
3135
	// return
3136
	return $bytes . ' B';
3137
		
3138
}
3139
3140
3141
/*
3142
*  acf_get_valid_terms
3143
*
3144
*  This function will replace old terms with new split term ids
3145
*
3146
*  @type	function
3147
*  @date	27/02/2015
3148
*  @since	5.1.5
3149
*
3150
*  @param	$terms (int|array)
3151
*  @param	$taxonomy (string)
3152
*  @return	$terms
3153
*/
0 ignored issues
show
Documentation introduced by
The doc-type $terms could not be parsed: Unknown type name "$terms" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
3154
3155
function acf_get_valid_terms( $terms = false, $taxonomy = 'category' ) {
3156
	
3157
	// bail early if function does not yet exist or
3158
	if( !function_exists('wp_get_split_term') || empty($terms) ) {
3159
		
3160
		return $terms;
3161
		
3162
	}
3163
	
3164
	
3165
	// vars
3166
	$is_array = is_array($terms);
3167
	
3168
	
3169
	// force into array
3170
	$terms = acf_get_array( $terms );
3171
	
3172
	
3173
	// force ints
3174
	$terms = array_map('intval', $terms);
3175
	
3176
	
3177
	// attempt to find new terms
3178
	foreach( $terms as $i => $term_id ) {
3179
		
3180
		$new_term_id = wp_get_split_term($term_id, $taxonomy);
3181
		
3182
		if( $new_term_id ) {
3183
			
3184
			$terms[ $i ] = $new_term_id;
3185
			
3186
		}
3187
		
3188
	}
3189
	
3190
	
3191
	// revert array if needed
3192
	if( !$is_array ) {
3193
		
3194
		$terms = $terms[0];
3195
		
3196
	}
3197
	
3198
	
3199
	// return
3200
	return $terms;
3201
	
3202
}
3203
3204
3205
/*
3206
*  acf_esc_html_deep
3207
*
3208
*  Navigates through an array and escapes html from the values.
3209
*
3210
*  @type	function
3211
*  @date	10/06/2015
3212
*  @since	5.2.7
3213
*
3214
*  @param	$value (mixed)
3215
*  @return	$value
3216
*/
3217
3218
/*
3219
function acf_esc_html_deep( $value ) {
3220
	
3221
	// array
3222
	if( is_array($value) ) {
3223
		
3224
		$value = array_map('acf_esc_html_deep', $value);
3225
	
3226
	// object
3227
	} elseif( is_object($value) ) {
3228
		
3229
		$vars = get_object_vars( $value );
3230
		
3231
		foreach( $vars as $k => $v ) {
3232
			
3233
			$value->{$k} = acf_esc_html_deep( $v );
3234
		
3235
		}
3236
		
3237
	// string
3238
	} elseif( is_string($value) ) {
3239
3240
		$value = esc_html($value);
3241
3242
	}
3243
	
3244
	
3245
	// return
3246
	return $value;
3247
3248
}
3249
*/
3250
3251
3252
/*
3253
*  acf_validate_attachment
3254
*
3255
*  This function will validate an attachment based on a field's resrictions and return an array of errors
3256
*
3257
*  @type	function
3258
*  @date	3/07/2015
3259
*  @since	5.2.3
3260
*
3261
*  @param	$attachment (array) attachment data. Cahnges based on context
3262
*  @param	$field (array) field settings containing restrictions
3263
*  @param	$context (string) $file is different when uploading / preparing
3264
*  @return	$errors (array)
3265
*/
0 ignored issues
show
Documentation introduced by
The doc-type $errors could not be parsed: Unknown type name "$errors" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
3266
3267
function acf_validate_attachment( $attachment, $field, $context = 'prepare' ) {
3268
	
3269
	// vars
3270
	$errors = array();
3271
	$file = array(
3272
		'type'		=> '',
3273
		'width'		=> 0,
3274
		'height'	=> 0,
3275
		'size'		=> 0
3276
	);
3277
	
3278
	
3279
	// upload
3280
	if( $context == 'upload' ) {
3281
		
3282
		// vars
3283
		$file['type'] = pathinfo($attachment['name'], PATHINFO_EXTENSION);
3284
		$file['size'] = filesize($attachment['tmp_name']);
3285
		
3286
		if( strpos($attachment['type'], 'image') !== false ) {
3287
			
3288
			$size = getimagesize($attachment['tmp_name']);
3289
			$file['width'] = acf_maybe_get($size, 0);
3290
			$file['height'] = acf_maybe_get($size, 1);
3291
				
3292
		}
3293
	
3294
	// prepare
3295
	} elseif( $context == 'prepare' ) {
3296
		
3297
		$file['type'] = pathinfo($attachment['url'], PATHINFO_EXTENSION);
3298
		$file['size'] = acf_maybe_get($attachment, 'filesizeInBytes', 0);
3299
		$file['width'] = acf_maybe_get($attachment, 'width', 0);
3300
		$file['height'] = acf_maybe_get($attachment, 'height', 0);
3301
	
3302
	// custom
3303
	} else {
3304
		
3305
		$file = wp_parse_args($file, $attachment);
3306
		
3307
	}
3308
	
3309
	
3310
	// image
3311
	if( $file['width'] || $file['height'] ) {
3312
		
3313
		// width
3314
		$min_width = (int) acf_maybe_get($field, 'min_width', 0);
3315
		$max_width = (int) acf_maybe_get($field, 'max_width', 0);
3316
		
3317 View Code Duplication
		if( $file['width'] ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
3318
			
3319
			if( $min_width && $file['width'] < $min_width ) {
3320
				
3321
				// min width
3322
				$errors['min_width'] = sprintf(__('Image width must be at least %dpx.', 'acf'), $min_width );
3323
				
3324
			} elseif( $max_width && $file['width'] > $max_width ) {
3325
				
3326
				// min width
3327
				$errors['max_width'] = sprintf(__('Image width must not exceed %dpx.', 'acf'), $max_width );
3328
				
3329
			}
3330
			
3331
		}
3332
		
3333
		
3334
		// height
3335
		$min_height = (int) acf_maybe_get($field, 'min_height', 0);
3336
		$max_height = (int) acf_maybe_get($field, 'max_height', 0);
3337
		
3338 View Code Duplication
		if( $file['height'] ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
3339
			
3340
			if( $min_height && $file['height'] < $min_height ) {
3341
				
3342
				// min height
3343
				$errors['min_height'] = sprintf(__('Image height must be at least %dpx.', 'acf'), $min_height );
3344
				
3345
			}  elseif( $max_height && $file['height'] > $max_height ) {
3346
				
3347
				// min height
3348
				$errors['max_height'] = sprintf(__('Image height must not exceed %dpx.', 'acf'), $max_height );
3349
				
3350
			}
3351
			
3352
		}
3353
			
3354
	}
3355
	
3356
	
3357
	// file size
3358
	if( $file['size'] ) {
3359
		
3360
		$min_size = acf_maybe_get($field, 'min_size', 0);
3361
		$max_size = acf_maybe_get($field, 'max_size', 0);
3362
		
3363
		if( $min_size && $file['size'] < acf_get_filesize($min_size) ) {
3364
				
3365
			// min width
3366
			$errors['min_size'] = sprintf(__('File size must be at least %s.', 'acf'), acf_format_filesize($min_size) );
3367
			
3368
		} elseif( $max_size && $file['size'] > acf_get_filesize($max_size) ) {
3369
				
3370
			// min width
3371
			$errors['max_size'] = sprintf(__('File size must must not exceed %s.', 'acf'), acf_format_filesize($max_size) );
3372
			
3373
		}
3374
	
3375
	}
3376
	
3377
	
3378
	// file type
3379
	if( $file['type'] ) {
3380
		
3381
		$mime_types = acf_maybe_get($field, 'mime_types', '');
3382
		
3383
		// lower case
3384
		$file['type'] = strtolower($file['type']);
3385
		$mime_types = strtolower($mime_types);
3386
		
3387
		
3388
		// explode
3389
		$mime_types = str_replace(array(' ', '.'), '', $mime_types);
3390
		$mime_types = explode(',', $mime_types); // split pieces
3391
		$mime_types = array_filter($mime_types); // remove empty pieces
3392
		
3393
		if( !empty($mime_types) && !in_array($file['type'], $mime_types) ) {
3394
			
3395
			// glue together last 2 types
3396
			if( count($mime_types) > 1 ) {
3397
				
3398
				$last1 = array_pop($mime_types);
3399
				$last2 = array_pop($mime_types);
3400
				
3401
				$mime_types[] = $last2 . ' ' . __('or', 'acf') . ' ' . $last1;
3402
				
3403
			}
3404
			
3405
			$errors['mime_types'] = sprintf(__('File type must be %s.', 'acf'), implode(', ', $mime_types) );
3406
			
3407
		}
3408
				
3409
	}
3410
	
3411
	
3412
	// filter for 3rd party customization
3413
	$errors = apply_filters("acf/validate_attachment", $errors, $file, $attachment, $field);
3414
	$errors = apply_filters("acf/validate_attachment/type={$field['type']}", $errors, $file, $attachment, $field );
3415
	$errors = apply_filters("acf/validate_attachment/name={$field['name']}", $errors, $file, $attachment, $field );
3416
	$errors = apply_filters("acf/validate_attachment/key={$field['key']}", $errors, $file, $attachment, $field );
3417
	
3418
	
3419
	// return
3420
	return $errors;
3421
	
3422
}
3423
3424
3425
/*
3426
*  _acf_settings_uploader
3427
*
3428
*  Dynamic logic for uploader setting
3429
*
3430
*  @type	function
3431
*  @date	7/05/2015
3432
*  @since	5.2.3
3433
*
3434
*  @param	$uploader (string)
3435
*  @return	$uploader
3436
*/
0 ignored issues
show
Documentation introduced by
The doc-type $uploader could not be parsed: Unknown type name "$uploader" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
3437
3438
add_filter('acf/settings/uploader', '_acf_settings_uploader');
3439
3440
function _acf_settings_uploader( $uploader ) {
3441
	
3442
	// if can't upload files
3443
	if( !current_user_can('upload_files') ) {
3444
		
3445
		$uploader = 'basic';
3446
		
3447
	}
3448
	
3449
	
3450
	// return
3451
	return $uploader;
3452
}
3453
3454
3455
/*
3456
*  acf_translate_keys
3457
*
3458
*  description
3459
*
3460
*  @type	function
3461
*  @date	7/12/2015
3462
*  @since	5.3.2
3463
*
3464
*  @param	$post_id (int)
3465
*  @return	$post_id (int)
3466
*/
0 ignored issues
show
Documentation introduced by
The doc-type $post_id could not be parsed: Unknown type name "$post_id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
3467
3468
function acf_translate_keys( $array, $keys ) {
3469
	
3470
	// bail early if no keys
3471
	if( empty($keys) ) return $array;
3472
	
3473
	
3474
	// translate
3475
	foreach( $keys as $k ) {
3476
		
3477
		// bail ealry if not exists
3478
		if( !isset($array[ $k ]) ) continue;
3479
		
3480
		
3481
		// translate
3482
		$array[ $k ] = acf_translate( $array[ $k ] );
3483
		
3484
	}
3485
	
3486
	
3487
	// return
3488
	return $array;
3489
	
3490
}
3491
3492
3493
/*
3494
*  acf_translate
3495
*
3496
*  This function will translate a string using the new 'l10n_textdomain' setting
3497
*  Also works for arrays which is great for fields - select -> choices
3498
*
3499
*  @type	function
3500
*  @date	4/12/2015
3501
*  @since	5.3.2
3502
*
3503
*  @param	$string (mixed) string or array containins strings to be translated
3504
*  @return	$string
3505
*/
0 ignored issues
show
Documentation introduced by
The doc-type $string could not be parsed: Unknown type name "$string" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
3506
3507
function acf_translate( $string ) {
3508
	
3509
	// bail early if not enabled
3510
	if( !acf_get_setting('l10n') ) return $string;
3511
	
3512
	
3513
	// bail early if no textdomain
3514
	if( !acf_get_setting('l10n_textdomain') ) return $string;
3515
	
3516
	
3517
	// is array
3518
	if( is_array($string) ) {
3519
		
3520
		return array_map('acf_translate', $string);
3521
		
3522
	}
3523
	
3524
	
3525
	// bail early if not string
3526
	if( !is_string($string) ) return $string;
3527
	
3528
	
3529
	// bail early if empty
3530
	if( $string === '' ) return $string;
3531
	
3532
	
3533
	// allow for var_export export
3534
	if( acf_get_setting('l10n_var_export') ){
3535
		
3536
		return "!!__(!!'" .  $string . "!!', !!'" . acf_get_setting('l10n_textdomain') . "!!')!!";
3537
			
3538
	}
3539
	
3540
	
3541
	// vars
3542
	return __( $string, acf_get_setting('l10n_textdomain') );
3543
	
3544
}
3545
3546
3547
/*
3548
*  acf_maybe_add_action
3549
*
3550
*  This function will determine if the action has already run before adding / calling the function
3551
*
3552
*  @type	function
3553
*  @date	13/01/2016
3554
*  @since	5.3.2
3555
*
3556
*  @param	$post_id (int)
3557
*  @return	$post_id (int)
3558
*/
0 ignored issues
show
Documentation introduced by
The doc-type $post_id could not be parsed: Unknown type name "$post_id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
3559
3560
function acf_maybe_add_action( $tag, $function_to_add, $priority = 10, $accepted_args = 1 ) {
3561
	
3562
	// if action has already run, execute it
3563
	if( did_action($tag) ) {
3564
			
3565
		call_user_func( $function_to_add );
3566
	
3567
	// if action has not yet run, add it
3568
	} else {
3569
		
3570
		add_action( $tag, $function_to_add, $priority, $accepted_args );
3571
		
3572
	}
3573
	
3574
}
3575
3576
3577
/*
3578
*  Hacks
3579
*
3580
*  description
3581
*
3582
*  @type	function
3583
*  @date	17/01/2014
3584
*  @since	5.0.0
3585
*
3586
*  @param	$post_id (int)
3587
*  @return	$post_id (int)
3588
*/
0 ignored issues
show
Documentation introduced by
The doc-type $post_id could not be parsed: Unknown type name "$post_id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
3589
3590
add_filter("acf/settings/slug", '_acf_settings_slug');
3591
3592
function _acf_settings_slug( $v ) {
0 ignored issues
show
Unused Code introduced by
The parameter $v is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
3593
	
3594
	$basename = acf_get_setting('basename');
3595
    $slug = explode('/', $basename);
3596
    $slug = current($slug);
3597
	
3598
	return $slug;
3599
}
3600
3601
?>
0 ignored issues
show
Best Practice introduced by
It is not recommended to use PHP's closing tag ?> in files other than templates.

Using a closing tag in PHP files that only contain PHP code is not recommended as you might accidentally add whitespace after the closing tag which would then be output by PHP. This can cause severe problems, for example headers cannot be sent anymore.

A simple precaution is to leave off the closing tag as it is not required, and it also has no negative effects whatsoever.

Loading history...
3602