Completed
Pull Request — 2.x (#3632)
by Phil
05:45
created

PodsInit::object_label_fix()   C

Complexity

Conditions 7
Paths 12

Size

Total Lines 69
Code Lines 57

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 57
nc 12
nop 2
dl 0
loc 69
rs 6.9081
c 0
b 0
f 0

How to fix   Long Method   

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
 * @package Pods
4
 */
5
class PodsInit {
6
7
	/**
8
	 * @var PodsInit
9
	 */
10
	static $instance = null;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $instance.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
11
12
	/**
13
	 * @var array
14
	 */
15
	static $no_conflict = array();
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $no_conflict.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
16
17
	/**
18
	 * @var array
19
	 */
20
	static $content_types_registered = array();
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $content_types_registered.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
21
22
	/**
23
	 * @var PodsComponents
24
	 */
25
	static $components;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $components.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
26
27
	/**
28
	 * @var PodsMeta
29
	 */
30
	static $meta;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $meta.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
31
32
	/**
33
	 * @var PodsI18n
34
	 */
35
	static $i18n;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $i18n.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
36
37
	/**
38
	 * @var PodsAdmin
39
	 */
40
	static $admin;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $admin.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
41
42
	/**
43
	 * @var mixed|void
44
	 */
45
	static $version;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $version.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
46
47
	/**
48
	 * @var mixed|void
49
	 */
50
	static $version_last;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $version_last.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
51
52
	/**
53
	 * @var mixed|void
54
	 */
55
	static $db_version;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $db_version.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
56
57
	/**
58
	 * Upgrades to trigger (last installed version => upgrade version)
59
	 *
60
	 * @var array
61
	 */
62
	static $upgrades = array(
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $upgrades.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
63
		'1.0.0' => '2.0.0'
64
		//'2.0.0' => '2.1.0'
65
	);
66
67
	/**
68
	 * Whether an Upgrade for 1.x has happened
69
	 *
70
	 * @var bool
71
	 */
72
	static $upgraded;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $upgraded.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
73
74
	/**
75
	 * Whether an Upgrade is needed
76
	 *
77
	 * @var bool
78
	 */
79
	static $upgrade_needed = false;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $upgrade_needed.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
80
81
	/**
82
	 * Singleton handling for a basic pods_init() request
83
	 *
84
	 * @return \PodsInit
85
	 *
86
	 * @since 2.3.5
87
	 */
88
	public static function init() {
89
90
		if ( ! is_object( self::$instance ) ) {
91
			self::$instance = new PodsInit();
92
		}
93
94
		return self::$instance;
95
	}
96
97
	/**
98
	 * Setup and Initiate Pods
99
	 *
100
	 * @return \PodsInit
0 ignored issues
show
Comprehensibility Best Practice introduced by
Adding a @return annotation to constructors is generally not recommended as a constructor does not have a meaningful return value.

Adding a @return annotation to a constructor is not recommended, since a constructor does not have a meaningful return value.

Please refer to the PHP core documentation on constructors.

Loading history...
101
	 *
102
	 * @license http://www.gnu.org/licenses/gpl-2.0.html
103
	 * @since   1.8.9
104
	 */
105
	function __construct() {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
106
107
		self::$version      = get_option( 'pods_framework_version' );
108
		self::$version_last = get_option( 'pods_framework_version_last' );
109
		self::$db_version   = get_option( 'pods_framework_db_version' );
110
		self::$upgraded     = (int) get_option( 'pods_framework_upgraded_1_x' );
111
112
		if ( empty( self::$version_last ) && 0 < strlen( get_option( 'pods_version' ) ) ) {
113
			$old_version = get_option( 'pods_version' );
114
115
			if ( ! empty( $old_version ) ) {
116
				if ( false === strpos( $old_version, '.' ) ) {
117
					$old_version = pods_version_to_point( $old_version );
118
				}
119
120
				update_option( 'pods_framework_version_last', $old_version );
121
122
				self::$version_last = $old_version;
123
			}
124
		}
125
126
		self::$upgrade_needed = $this->needs_upgrade();
127
128
		add_action( 'plugins_loaded', array( $this, 'plugins_loaded' ) );
129
		add_action( 'plugins_loaded', array( $this, 'activate_install' ), 9 );
130
131
		add_action( 'wp_loaded', array( $this, 'flush_rewrite_rules' ) );
132
133
		$this->run();
134
135
	}
136
137
	/**
138
	 * Load the plugin textdomain and set default constants
139
	 */
140
	public function plugins_loaded() {
141
142
		if ( ! defined( 'PODS_LIGHT' ) ) {
143
			define( 'PODS_LIGHT', false );
144
		}
145
146
		if ( ! defined( 'PODS_TABLELESS' ) ) {
147
			define( 'PODS_TABLELESS', false );
148
		}
149
150
		load_plugin_textdomain( 'pods' );
151
152
	}
153
154
	/**
155
	 * Load Pods Components
156
	 */
157
	public function load_components() {
158
159
		if ( empty( self::$version ) ) {
160
			return;
161
		}
162
163
		if ( ! defined( 'PODS_LIGHT' ) || ! PODS_LIGHT ) {
164
			self::$components = pods_components();
165
		}
166
167
	}
168
169
	/**
170
	 * Load Pods Meta
171
	 */
172
	public function load_meta() {
173
174
		self::$meta = pods_meta()->core();
175
	}
176
177
	/**
178
	 *
179
	 */
180
	public function load_i18n() {
181
182
		self::$i18n = pods_i18n();
183
	}
184
185
186
	/**
187
	 * Set up the Pods core
188
	 */
189
	public function core() {
190
191
		if ( empty( self::$version ) ) {
192
			return;
193
		}
194
195
		// Session start
196
		pods_session_start();
197
198
		add_shortcode( 'pods', 'pods_shortcode' );
199
		add_shortcode( 'pods-form', 'pods_shortcode_form' );
200
201
		$security_settings = array(
202
			'pods_disable_file_browser'     => 0,
203
			'pods_files_require_login'      => 1,
204
			'pods_files_require_login_cap'  => '',
205
			'pods_disable_file_upload'      => 0,
206
			'pods_upload_require_login'     => 1,
207
			'pods_upload_require_login_cap' => ''
208
		);
209
210
		foreach ( $security_settings as $security_setting => $setting ) {
211
			$setting = get_option( $security_setting );
212
			if ( ! empty( $setting ) ) {
213
				$security_settings[ $security_setting ] = $setting;
214
			}
215
		}
216
217
		foreach ( $security_settings as $security_setting => $setting ) {
218
			if ( 0 == $setting ) {
219
				$setting = false;
220
			} elseif ( 1 == $setting ) {
221
				$setting = true;
222
			}
223
224
			if ( in_array( $security_setting, array( 'pods_files_require_login', 'pods_upload_require_login' ) ) ) {
225
				if ( 0 < strlen( $security_settings[ $security_setting . '_cap' ] ) ) {
226
					$setting = $security_settings[ $security_setting . '_cap' ];
227
				}
228
			} elseif ( in_array( $security_setting, array(
229
				'pods_files_require_login_cap',
230
				'pods_upload_require_login_cap'
231
			) ) ) {
232
				continue;
233
			}
234
235
			if ( ! defined( strtoupper( $security_setting ) ) ) {
236
				define( strtoupper( $security_setting ), $setting );
237
			}
238
		}
239
240
		$this->register_pods();
241
242
		$avatar = PodsForm::field_loader( 'avatar' );
243
244
		if ( method_exists( $avatar, 'get_avatar' ) ) {
245
			add_filter( 'get_avatar', array( $avatar, 'get_avatar' ), 10, 4 );
246
		}
247
	}
248
249
	/**
250
	 * Register Scripts and Styles
251
	 */
252
	public function register_assets() {
253
254
		if ( ! wp_style_is( 'jquery-ui', 'registered' ) ) {
255
			wp_register_style( 'jquery-ui', PODS_URL . 'ui/css/smoothness/jquery-ui.custom.css', array(), '1.8.16' );
256
		}
257
258
		wp_register_script( 'pods-json', PODS_URL . 'ui/js/jquery.json.js', array( 'jquery' ), '2.3' );
259
260
		if ( ! wp_style_is( 'jquery-qtip2', 'registered' ) ) {
261
			wp_register_style( 'jquery-qtip2', PODS_URL . 'ui/css/jquery.qtip.min.css', array(), '2.2' );
262
		}
263
264
		if ( ! wp_script_is( 'jquery-qtip2', 'registered' ) ) {
265
			wp_register_script( 'jquery-qtip2', PODS_URL . 'ui/js/jquery.qtip.min.js', array( 'jquery' ), '2.2' );
266
		}
267
268
		wp_register_script( 'pods', PODS_URL . 'ui/js/jquery.pods.js', array(
269
			'jquery',
270
			'pods-i18n',
271
			'pods-json',
272
			'jquery-qtip2'
273
		), PODS_VERSION, true );
274
275
		wp_register_style( 'pods-form', PODS_URL . 'ui/css/pods-form.css', array(), PODS_VERSION );
276
277
		wp_register_style( 'pods-cleditor', PODS_URL . 'ui/css/jquery.cleditor.css', array(), '1.3.0' );
278
		wp_register_script( 'pods-cleditor', PODS_URL . 'ui/js/jquery.cleditor.min.js', array( 'jquery' ), '1.3.0' );
279
280
		wp_register_style( 'pods-codemirror', PODS_URL . 'ui/css/codemirror.css', array(), '4.8' );
281
		wp_register_script( 'pods-codemirror', PODS_URL . 'ui/js/codemirror.js', array(), '4.8', true );
282
		wp_register_script( 'pods-codemirror-loadmode', PODS_URL . 'ui/js/codemirror/addon/mode/loadmode.js', array( 'pods-codemirror' ), '4.8', true );
283
		wp_register_script( 'pods-codemirror-overlay', PODS_URL . 'ui/js/codemirror/addon/mode/overlay.js', array( 'pods-codemirror' ), '4.8', true );
284
		wp_register_script( 'pods-codemirror-hints', PODS_URL . 'ui/js/codemirror/addon/mode/show-hint.js', array( 'pods-codemirror' ), '4.8', true );
285
		wp_register_script( 'pods-codemirror-mode-xml', PODS_URL . 'ui/js/codemirror/mode/xml/xml.js', array( 'pods-codemirror' ), '4.8', true );
286
		wp_register_script( 'pods-codemirror-mode-html', PODS_URL . 'ui/js/codemirror/mode/htmlmixed/htmlmixed.js', array( 'pods-codemirror' ), '4.8', true );
287
		wp_register_script( 'pods-codemirror-mode-css', PODS_URL . 'ui/js/codemirror/mode/css/css.js', array( 'pods-codemirror' ), '4.8', true );
288
289
		if ( ! wp_style_is( 'jquery-ui-timepicker', 'registered' ) ) {
290
			wp_register_style( 'jquery-ui-timepicker', PODS_URL . 'ui/css/jquery.ui.timepicker.css', array(), '1.1.1' );
291
		}
292
293
		if ( ! wp_script_is( 'jquery-ui-timepicker', 'registered' ) ) {
294
			wp_register_script( 'jquery-ui-timepicker', PODS_URL . 'ui/js/jquery.ui.timepicker.min.js', array(
295
				'jquery',
296
				'jquery-ui-core',
297
				'jquery-ui-datepicker',
298
				'jquery-ui-slider'
299
			), '1.1.1' );
300
		}
301
302
		wp_register_style( 'pods-select2', PODS_URL . 'ui/js/select2/select2.css', array(), '3.3.1' );
303
		wp_register_script( 'pods-select2', PODS_URL . 'ui/js/select2/select2.min.js', array( 'jquery', 'pods-i18n' ), '3.3.1' );
304
305
		wp_register_script( 'pods-handlebars', PODS_URL . 'ui/js/handlebars.js', array(), '1.0.0.beta.6' );
306
307
		// Marionette dependencies for MV fields
308
		wp_register_script( 'backbone.radio', PODS_URL . 'ui/js/marionette/backbone.radio.js', array( 'backbone' ), '2.0.0', true );
309
		wp_register_script( 'marionette', PODS_URL . 'ui/js/marionette/backbone.marionette.js', array( 'backbone', 'backbone.radio' ), '3.1.0', true );
310
311
		// MV stuff
312
		wp_register_script(
313
			'pods-mv-fields',
314
			PODS_URL . 'ui/fields-mv/js/pods-mv-fields.min.js',
315
			array(
316
				'jquery',
317
				'jquery-ui-core',
318
				'jquery-ui-sortable',
319
				'pods-i18n',
320
				'marionette',
321
				'media-views',
322
				'media-models'
323
			),
324
			PODS_VERSION,
325
			true
326
		);
327
		wp_register_style( 'pods-flex', PODS_URL . 'ui/css/pods-flex.css', array(), PODS_VERSION );
328
	}
329
330
	/**
331
	 * Register internal Post Types
332
	 */
333
	public function register_pods() {
334
335
		$args = array(
336
			'label'           => 'Pods',
337
			'labels'          => array( 'singular_name' => 'Pod' ),
338
			'public'          => false,
339
			'can_export'      => false,
340
			'query_var'       => false,
341
			'rewrite'         => false,
342
			'capability_type' => 'pods_pod',
343
			'has_archive'     => false,
344
			'hierarchical'    => false,
345
			'supports'        => array( 'title', 'author' ),
346
			'menu_icon'       => 'dashicons-pods'
347
		);
348
349
		$args = self::object_label_fix( $args, 'post_type' );
350
351
		register_post_type( '_pods_pod', apply_filters( 'pods_internal_register_post_type_pod', $args ) );
352
353
		$args = array(
354
			'label'           => 'Pod Fields',
355
			'labels'          => array( 'singular_name' => 'Pod Field' ),
356
			'public'          => false,
357
			'can_export'      => false,
358
			'query_var'       => false,
359
			'rewrite'         => false,
360
			'capability_type' => 'pods_pod',
361
			'has_archive'     => false,
362
			'hierarchical'    => true,
363
			'supports'        => array( 'title', 'editor', 'author' ),
364
			'menu_icon'       => 'dashicons-pods'
365
		);
366
367
		$args = self::object_label_fix( $args, 'post_type' );
368
369
		register_post_type( '_pods_field', apply_filters( 'pods_internal_register_post_type_field', $args ) );
370
	}
371
372
	/**
373
	 * Include Admin
374
	 */
375
	public function admin_init() {
376
377
		self::$admin = pods_admin();
378
	}
379
380
	/**
381
	 * Register Post Types and Taxonomies
382
	 */
383
	public function setup_content_types( $force = false ) {
384
385
		if ( empty( self::$version ) ) {
386
			return;
387
		}
388
389
		$post_types = PodsMeta::$post_types;
390
		$taxonomies = PodsMeta::$taxonomies;
391
392
		$existing_post_types = get_post_types();
393
		$existing_taxonomies = get_taxonomies();
394
395
		$pods_cpt_ct = pods_transient_get( 'pods_wp_cpt_ct' );
396
397
		$cpt_positions = array();
398
399
		if ( empty( $pods_cpt_ct ) && ( ! empty( $post_types ) || ! empty( $taxonomies ) ) ) {
400
			$force = true;
401
		} elseif ( ! empty( $pods_cpt_ct ) && empty( $pods_cpt_ct['post_types'] ) && ! empty( $post_types ) ) {
402
			$force = true;
403
		} elseif ( ! empty( $pods_cpt_ct ) && empty( $pods_cpt_ct['taxonomies'] ) && ! empty( $taxonomies ) ) {
404
			$force = true;
405
		}
406
407
		if ( false === $pods_cpt_ct || $force ) {
408
			/**
409
			 * @var WP_Query
410
			 */
411
			global $wp_query;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
412
413
			$reserved_query_vars = array(
414
				'post_type',
415
				'taxonomy',
416
				'output'
417
			);
418
419
			if ( is_object( $wp_query ) ) {
420
				$reserved_query_vars = array_merge( $reserved_query_vars, array_keys( $wp_query->fill_query_vars( array() ) ) );
421
			}
422
423
			$pods_cpt_ct = array(
424
				'post_types' => array(),
425
				'taxonomies' => array()
426
			);
427
428
			$pods_post_types      = $pods_taxonomies = array();
429
			$supported_post_types = $supported_taxonomies = array();
430
431
			foreach ( $post_types as $post_type ) {
432
				// Post Type exists already
433 View Code Duplication
				if ( isset( $pods_cpt_ct['post_types'][ $post_type['name'] ] ) ) {
434
					continue;
435
				} elseif ( ! empty( $post_type['object'] ) && isset( $existing_post_types[ $post_type['object'] ] ) ) {
436
					continue;
437
				} elseif ( ! $force && isset( $existing_post_types[ $post_type['name'] ] ) ) {
438
					continue;
439
				}
440
441
				$post_type['options']['name'] = $post_type['name'];
442
				$post_type                    = array_merge( $post_type, (array) $post_type['options'] );
443
444
				$post_type_name = pods_v_sanitized( 'name', $post_type );
445
446
				// Labels
447
				$cpt_label    = esc_html( pods_v( 'label', $post_type, ucwords( str_replace( '_', ' ', pods_v( 'name', $post_type ) ) ), true ) );
448
				$cpt_singular = esc_html( pods_v( 'label_singular', $post_type, ucwords( str_replace( '_', ' ', pods_v( 'label', $post_type, $post_type_name, null, true ) ) ), true ) );
449
450
				$cpt_labels                          = array();
451
				$cpt_labels['name']                  = $cpt_label;
452
				$cpt_labels['singular_name']         = $cpt_singular;
453
				$cpt_labels['menu_name']             = pods_v( 'menu_name', $post_type, '', true );
454
				$cpt_labels['name_admin_bar']        = pods_v( 'name_admin_bar', $post_type, '', true );
455
				$cpt_labels['add_new']               = pods_v( 'label_add_new', $post_type, '', true );
456
				$cpt_labels['add_new_item']          = pods_v( 'label_add_new_item', $post_type, '', true );
457
				$cpt_labels['new_item']              = pods_v( 'label_new_item', $post_type, '', true );
458
				$cpt_labels['edit']                  = pods_v( 'label_edit', $post_type, '', true );
459
				$cpt_labels['edit_item']             = pods_v( 'label_edit_item', $post_type, '', true );
460
				$cpt_labels['view']                  = pods_v( 'label_view', $post_type, '', true );
461
				$cpt_labels['view_item']             = pods_v( 'label_view_item', $post_type, '', true );
462
				$cpt_labels['all_items']             = pods_v( 'label_all_items', $post_type, '', true );
463
				$cpt_labels['search_items']          = pods_v( 'label_search_items', $post_type, '', true );
464
				$cpt_labels['not_found']             = pods_v( 'label_not_found', $post_type, '', true );
465
				$cpt_labels['not_found_in_trash']    = pods_v( 'label_not_found_in_trash', $post_type, '', true );
466
				$cpt_labels['parent']                = pods_v( 'label_parent', $post_type, '', true );
467
				$cpt_labels['parent_item_colon']     = pods_v( 'label_parent_item_colon', $post_type, '', true );
468
				$cpt_labels['archives']              = pods_v( 'label_archives', $post_type, '', true );
469
				$cpt_labels['insert_into_item']      = pods_v( 'label_insert_into_item', $post_type, '', true );
470
				$cpt_labels['uploaded_to_this_item'] = pods_v( 'label_uploaded_to_this_item', $post_type, '', true );
471
				$cpt_labels['featured_image']        = pods_v( 'label_featured_image', $post_type, '', true );
472
				$cpt_labels['set_featured_image']    = pods_v( 'label_set_featured_image', $post_type, '', true );
473
				$cpt_labels['remove_featured_image'] = pods_v( 'label_remove_featured_image', $post_type, '', true );
474
				$cpt_labels['use_featured_image']    = pods_v( 'label_use_featured_image', $post_type, '', true );
475
				$cpt_labels['filter_items_list']     = pods_v( 'label_filter_items_list', $post_type, '', true );
476
				$cpt_labels['items_list_navigation'] = pods_v( 'label_items_list_navigation', $post_type, '', true );
477
				$cpt_labels['items_list']            = pods_v( 'label_items_list', $post_type, '', true );
478
479
				// Supported
480
				$cpt_supported = array(
481
					'title'           => (boolean) pods_v( 'supports_title', $post_type, false ),
482
					'editor'          => (boolean) pods_v( 'supports_editor', $post_type, false ),
483
					'author'          => (boolean) pods_v( 'supports_author', $post_type, false ),
484
					'thumbnail'       => (boolean) pods_v( 'supports_thumbnail', $post_type, false ),
485
					'excerpt'         => (boolean) pods_v( 'supports_excerpt', $post_type, false ),
486
					'trackbacks'      => (boolean) pods_v( 'supports_trackbacks', $post_type, false ),
487
					'custom-fields'   => (boolean) pods_v( 'supports_custom_fields', $post_type, false ),
488
					'comments'        => (boolean) pods_v( 'supports_comments', $post_type, false ),
489
					'revisions'       => (boolean) pods_v( 'supports_revisions', $post_type, false ),
490
					'page-attributes' => (boolean) pods_v( 'supports_page_attributes', $post_type, false ),
491
					'post-formats'    => (boolean) pods_v( 'supports_post_formats', $post_type, false )
492
				);
493
494
				// Custom Supported
495
				$cpt_supported_custom = pods_v_sanitized( 'supports_custom', $post_type, '' );
496
497
				if ( ! empty( $cpt_supported_custom ) ) {
498
					$cpt_supported_custom = explode( ',', $cpt_supported_custom );
499
					$cpt_supported_custom = array_filter( array_unique( $cpt_supported_custom ) );
500
501
					foreach ( $cpt_supported_custom as $cpt_support ) {
502
						$cpt_supported[ $cpt_support ] = true;
503
					}
504
				}
505
506
				// Genesis Support
507
				if ( function_exists( 'genesis' ) ) {
508
					$cpt_supported['genesis-seo']             = (boolean) pods_var( 'supports_genesis_seo', $post_type, false );
509
					$cpt_supported['genesis-layouts']         = (boolean) pods_var( 'supports_genesis_layouts', $post_type, false );
510
					$cpt_supported['genesis-simple-sidebars'] = (boolean) pods_var( 'supports_genesis_simple_sidebars', $post_type, false );
511
				}
512
513
				// YARPP Support
514
				if ( defined( 'YARPP_VERSION' ) ) {
515
					$cpt_supported['yarpp_support'] = (boolean) pods_var( 'supports_yarpp_support', $post_type, false );
516
				}
517
518
				// Jetpack Support
519
				if ( class_exists( 'Jetpack' ) ) {
520
					$cpt_supported['supports_jetpack_publicize'] = (boolean) pods_var( 'supports_jetpack_publicize', $post_type, false );
521
					$cpt_supported['supports_jetpack_markdown']  = (boolean) pods_var( 'supports_jetpack_markdown', $post_type, false );
522
				}
523
524
				// WP needs something, if this was empty and none were enabled, it would show title+editor pre 3.5 :(
525
				$cpt_supports = array();
526
527
				if ( ! pods_version_check( 'wp', '3.5' ) ) {
528
					$cpt_supports = array( '_bug_fix_pre_35' );
529
				}
530
531
				foreach ( $cpt_supported as $cpt_support => $supported ) {
532
					if ( true === $supported ) {
533
						$cpt_supports[] = $cpt_support;
534
					}
535
				}
536
537
				if ( empty( $cpt_supports ) && pods_version_check( 'wp', '3.5' ) ) {
538
					$cpt_supports = false;
539
				}
540
541
				// Rewrite
542
				$cpt_rewrite       = (boolean) pods_var( 'rewrite', $post_type, true );
543
				$cpt_rewrite_array = array(
544
					'slug'       => pods_var( 'rewrite_custom_slug', $post_type, str_replace( '_', '-', $post_type_name ), null, true ),
545
					'with_front' => (boolean) pods_var( 'rewrite_with_front', $post_type, true ),
546
					'feeds'      => (boolean) pods_var( 'rewrite_feeds', $post_type, (boolean) pods_var( 'has_archive', $post_type, false ) ),
547
					'pages'      => (boolean) pods_var( 'rewrite_pages', $post_type, true )
548
				);
549
550
				if ( false !== $cpt_rewrite ) {
551
					$cpt_rewrite = $cpt_rewrite_array;
552
				}
553
554
				$capability_type = pods_var( 'capability_type', $post_type, 'post' );
555
556
				if ( 'custom' == $capability_type ) {
557
					$capability_type = pods_var( 'capability_type_custom', $post_type, 'post' );
558
				}
559
560
				$show_in_menu = (boolean) pods_var( 'show_in_menu', $post_type, true );
561
562
				if ( $show_in_menu && 0 < strlen( pods_var_raw( 'menu_location_custom', $post_type ) ) ) {
563
					$show_in_menu = pods_var_raw( 'menu_location_custom', $post_type );
564
				}
565
566
				$menu_icon = pods_var( 'menu_icon', $post_type, null, null, true );
567
568
				if ( ! empty( $menu_icon ) ) {
569
					$menu_icon = pods_evaluate_tags( $menu_icon );
570
				}
571
572
				// Register Post Type
573
				$pods_post_types[ $post_type_name ] = array(
574
					'label'               => $cpt_label,
575
					'labels'              => $cpt_labels,
576
					'description'         => esc_html( pods_var_raw( 'description', $post_type ) ),
577
					'public'              => (boolean) pods_var( 'public', $post_type, true ),
578
					'publicly_queryable'  => (boolean) pods_var( 'publicly_queryable', $post_type, (boolean) pods_var( 'public', $post_type, true ) ),
579
					'exclude_from_search' => (boolean) pods_var( 'exclude_from_search', $post_type, ( (boolean) pods_var( 'public', $post_type, true ) ? false : true ) ),
580
					'show_ui'             => (boolean) pods_var( 'show_ui', $post_type, (boolean) pods_var( 'public', $post_type, true ) ),
581
					'show_in_menu'        => $show_in_menu,
582
					'show_in_nav_menus'   => (boolean) pods_var( 'show_in_nav_menus', $post_type, (boolean) pods_var( 'public', $post_type, true ) ),
583
					'show_in_admin_bar'   => (boolean) pods_var( 'show_in_admin_bar', $post_type, (boolean) pods_var( 'show_in_menu', $post_type, true ) ),
584
					'menu_position'       => (int) pods_var( 'menu_position', $post_type, 0, null, true ),
585
					'menu_icon'           => $menu_icon,
586
					'capability_type'     => $capability_type,
587
					//'capabilities' => $cpt_capabilities,
0 ignored issues
show
Unused Code Comprehensibility introduced by
67% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
588
					'map_meta_cap'        => (boolean) pods_var( 'capability_type_extra', $post_type, true ),
589
					'hierarchical'        => (boolean) pods_var( 'hierarchical', $post_type, false ),
590
					'supports'            => $cpt_supports,
591
					//'register_meta_box_cb' => array($this, 'manage_meta_box'),
0 ignored issues
show
Unused Code Comprehensibility introduced by
67% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
592
					//'permalink_epmask' => EP_PERMALINK,
0 ignored issues
show
Unused Code Comprehensibility introduced by
50% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
593
					'has_archive'         => pods_v( 'has_archive_slug', $post_type, (boolean) pods_v( 'has_archive', $post_type, false ), true ),
594
					'rewrite'             => $cpt_rewrite,
595
					'query_var'           => ( false !== (boolean) pods_var( 'query_var', $post_type, true ) ? pods_var( 'query_var_string', $post_type, $post_type_name, null, true ) : false ),
596
					'can_export'          => (boolean) pods_var( 'can_export', $post_type, true )
597
				);
598
599
				// YARPP doesn't use 'supports' array option (yet)
600
				if ( ! empty( $cpt_supports['yarpp_support'] ) ) {
601
					$pods_post_types[ $post_type_name ]['yarpp_support'] = true;
602
				}
603
604
				// Prevent reserved query_var issues
605
				if ( in_array( $pods_post_types[ $post_type_name ]['query_var'], $reserved_query_vars ) ) {
606
					$pods_post_types[ $post_type_name ]['query_var'] = 'post_type_' . $pods_post_types[ $post_type_name ]['query_var'];
607
				}
608
609
				if ( 25 == $pods_post_types[ $post_type_name ]['menu_position'] ) {
610
					$pods_post_types[ $post_type_name ]['menu_position'] ++;
611
				}
612
613
				if ( $pods_post_types[ $post_type_name ]['menu_position'] < 1 || in_array( $pods_post_types[ $post_type_name ]['menu_position'], $cpt_positions ) ) {
614
					unset( $pods_post_types[ $post_type_name ]['menu_position'] );
615
				} else {
616
					$cpt_positions[] = $pods_post_types[ $post_type_name ]['menu_position'];
617
618
					// This would be nice if WP supported floats in menu_position
619
					// $pods_post_types[ $post_type_name ][ 'menu_position' ] = $pods_post_types[ $post_type_name ][ 'menu_position' ] . '.1';
0 ignored issues
show
Unused Code Comprehensibility introduced by
52% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
620
				}
621
622
				// Taxonomies
623
				$cpt_taxonomies = array();
624
				$_taxonomies    = get_taxonomies();
625
				$_taxonomies    = array_merge_recursive( $_taxonomies, $pods_taxonomies );
626
				$ignore         = array( 'nav_menu', 'link_category', 'post_format' );
627
628 View Code Duplication
				foreach ( $_taxonomies as $taxonomy => $label ) {
629
					if ( in_array( $taxonomy, $ignore ) ) {
630
						continue;
631
					}
632
633
					if ( false !== (boolean) pods_var( 'built_in_taxonomies_' . $taxonomy, $post_type, false ) ) {
634
						$cpt_taxonomies[] = $taxonomy;
635
636
						if ( isset( $supported_post_types[ $taxonomy ] ) && ! in_array( $post_type_name, $supported_post_types[ $taxonomy ] ) ) {
637
							$supported_post_types[ $taxonomy ][] = $post_type_name;
638
						}
639
					}
640
				}
641
642
				if ( isset( $supported_taxonomies[ $post_type_name ] ) ) {
643
					$supported_taxonomies[ $post_type_name ] = array_merge( (array) $supported_taxonomies[ $post_type_name ], $cpt_taxonomies );
644
				} else {
645
					$supported_taxonomies[ $post_type_name ] = $cpt_taxonomies;
646
				}
647
			}
648
649
			foreach ( $taxonomies as $taxonomy ) {
650
				// Taxonomy Type exists already
651 View Code Duplication
				if ( isset( $pods_cpt_ct['taxonomies'][ $taxonomy['name'] ] ) ) {
652
					continue;
653
				} elseif ( ! empty( $taxonomy['object'] ) && isset( $existing_taxonomies[ $taxonomy['object'] ] ) ) {
654
					continue;
655
				} elseif ( ! $force && isset( $existing_taxonomies[ $taxonomy['name'] ] ) ) {
656
					continue;
657
				}
658
659
				$taxonomy['options']['name'] = $taxonomy['name'];
660
				$taxonomy                    = array_merge( $taxonomy, (array) $taxonomy['options'] );
661
662
				$taxonomy_name = pods_var( 'name', $taxonomy );
663
664
				// Labels
665
				$ct_label    = esc_html( pods_v( 'label', $taxonomy, ucwords( str_replace( '_', ' ', pods_v( 'name', $taxonomy ) ) ), true ) );
666
				$ct_singular = esc_html( pods_v( 'label_singular', $taxonomy, ucwords( str_replace( '_', ' ', pods_v( 'label', $taxonomy, pods_v( 'name', $taxonomy ), null, true ) ) ), true ) );
667
668
				$ct_labels                               = array();
669
				$ct_labels['name']                       = $ct_label;
670
				$ct_labels['singular_name']              = $ct_singular;
671
				$ct_labels['menu_name']                  = pods_v( 'menu_name', $taxonomy, '', true );
672
				$ct_labels['search_items']               = pods_v( 'label_search_items', $taxonomy, '', true );
673
				$ct_labels['popular_items']              = pods_v( 'label_popular_items', $taxonomy, '', true );
674
				$ct_labels['all_items']                  = pods_v( 'label_all_items', $taxonomy, '', true );
675
				$ct_labels['parent_item']                = pods_v( 'label_parent_item', $taxonomy, '', true );
676
				$ct_labels['parent_item_colon']          = pods_v( 'label_parent_item_colon', $taxonomy, '', true );
677
				$ct_labels['edit_item']                  = pods_v( 'label_edit_item', $taxonomy, '', true );
678
				$ct_labels['update_item']                = pods_v( 'label_update_item', $taxonomy, '', true );
679
				$ct_labels['view_item']                  = pods_v( 'label_view_item', $taxonomy, '', true );
680
				$ct_labels['add_new_item']               = pods_v( 'label_add_new_item', $taxonomy, '', true );
681
				$ct_labels['new_item_name']              = pods_v( 'label_new_item_name', $taxonomy, '', true );
682
				$ct_labels['separate_items_with_commas'] = pods_v( 'label_separate_items_with_commas', $taxonomy, '', true );
683
				$ct_labels['add_or_remove_items']        = pods_v( 'label_add_or_remove_items', $taxonomy, '', true );
684
				$ct_labels['choose_from_most_used']      = pods_v( 'label_choose_from_the_most_used', $taxonomy, '', true );
685
				$ct_labels['not_found']                  = pods_v( 'label_not_found', $taxonomy, '', true );
686
				$ct_labels['no_terms']                   = pods_v( 'label_no_terms', $taxonomy, '', true );
687
				$ct_labels['items_list']                 = pods_v( 'label_items_list', $taxonomy, '', true );
688
				$ct_labels['items_list_navigation']      = pods_v( 'label_items_list_navigation', $taxonomy, '', true );
689
690
				// Rewrite
691
				$ct_rewrite       = (boolean) pods_var( 'rewrite', $taxonomy, true );
692
				$ct_rewrite_array = array(
693
					'slug'         => pods_var( 'rewrite_custom_slug', $taxonomy, str_replace( '_', '-', $taxonomy_name ), null, true ),
694
					'with_front'   => (boolean) pods_var( 'rewrite_with_front', $taxonomy, true ),
695
					'hierarchical' => (boolean) pods_var( 'rewrite_hierarchical', $taxonomy, (boolean) pods_var( 'hierarchical', $taxonomy, false ) )
696
				);
697
698
				if ( false !== $ct_rewrite ) {
699
					$ct_rewrite = $ct_rewrite_array;
700
				}
701
702
				/**
703
				 * Default tax capabilities
704
				 * @see https://codex.wordpress.org/Function_Reference/register_taxonomy
705
				 */
706
				$capability_type = pods_var( 'capability_type', $taxonomy, 'default' );
707
				$tax_capabilities = array();
708
709
				if ( 'custom' == $capability_type ) {
710
					$capability_type = pods_var( 'capability_type_custom', $taxonomy, 'default' );
711
					if ( ! empty( $capability_type ) && 'default' != $capability_type ) {
712
						$capability_type .=  '_terms';
713
						$tax_capabilities = array(
714
							'manage_terms' => 'manage_' . $capability_type,
715
							'edit_terms'   => 'edit_' . $capability_type,
716
							'delete_terms' => 'delete_' . $capability_type,
717
							'assign_terms' => 'assign_' . $capability_type,
718
						);
719
					}
720
				}
721
722
				// Register Taxonomy
723
				$pods_taxonomies[ $taxonomy_name ] = array(
724
					'label'                 => $ct_label,
725
					'labels'                => $ct_labels,
726
					'public'                => (boolean) pods_var( 'public', $taxonomy, true ),
727
					'show_ui'               => (boolean) pods_var( 'show_ui', $taxonomy, (boolean) pods_var( 'public', $taxonomy, true ) ),
728
					'show_in_nav_menus'     => (boolean) pods_var( 'show_in_nav_menus', $taxonomy, (boolean) pods_var( 'public', $taxonomy, true ) ),
729
					'show_tagcloud'         => (boolean) pods_var( 'show_tagcloud', $taxonomy, (boolean) pods_var( 'show_ui', $taxonomy, (boolean) pods_var( 'public', $taxonomy, true ) ) ),
730
					'show_tagcloud_in_edit' => (boolean) pods_var( 'show_tagcloud_in_edit', $taxonomy, (boolean) pods_var( 'show_tagcloud', $taxonomy, (boolean) pods_var( 'show_ui', $taxonomy, (boolean) pods_var( 'public', $taxonomy, true ) ) ) ),
731
					'show_in_quick_edit'    => (boolean) pods_var( 'show_in_quick_edit', $taxonomy, (boolean) pods_var( 'show_ui', $taxonomy, (boolean) pods_var( 'public', $taxonomy, true ) ) ),
732
					'hierarchical'          => (boolean) pods_var( 'hierarchical', $taxonomy, false ),
733
					//'capability_type'       => $capability_type,
0 ignored issues
show
Unused Code Comprehensibility introduced by
67% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
734
					'capabilities'          => $tax_capabilities,
735
					//'map_meta_cap'          => (boolean) pods_var( 'capability_type_extra', $taxonomy, true ),
0 ignored issues
show
Unused Code Comprehensibility introduced by
58% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
736
					'update_count_callback' => pods_var( 'update_count_callback', $taxonomy, null, null, true ),
737
					'query_var'             => ( false !== (boolean) pods_var( 'query_var', $taxonomy, true ) ? pods_var( 'query_var_string', $taxonomy, $taxonomy_name, null, true ) : false ),
738
					'rewrite'               => $ct_rewrite,
739
					'show_admin_column'     => (boolean) pods_var( 'show_admin_column', $taxonomy, false ),
740
					'sort'                  => (boolean) pods_var( 'sort', $taxonomy, false ),
741
				);
742
743
				if ( is_array( $ct_rewrite ) && ! $pods_taxonomies[ $taxonomy_name ]['query_var'] ) {
744
					$pods_taxonomies[ $taxonomy_name ]['query_var'] = pods_var( 'query_var_string', $taxonomy, $taxonomy_name, null, true );
745
				};
746
747
				// Prevent reserved query_var issues
748
				if ( in_array( $pods_taxonomies[ $taxonomy_name ]['query_var'], $reserved_query_vars ) ) {
749
					$pods_taxonomies[ $taxonomy_name ]['query_var'] = 'taxonomy_' . $pods_taxonomies[ $taxonomy_name ]['query_var'];
750
				}
751
752
				// Integration for Single Value Taxonomy UI
753
				if ( function_exists( 'tax_single_value_meta_box' ) ) {
754
					$pods_taxonomies[ $taxonomy_name ]['single_value'] = (boolean) pods_var( 'single_value', $taxonomy, false );
755
					$pods_taxonomies[ $taxonomy_name ]['required']     = (boolean) pods_var( 'single_value_required', $taxonomy, false );
756
				}
757
758
				// Post Types
759
				$ct_post_types = array();
760
				$_post_types   = get_post_types();
761
				$_post_types   = array_merge_recursive( $_post_types, $pods_post_types );
762
				$ignore        = array( 'revision' );
763
764 View Code Duplication
				foreach ( $_post_types as $post_type => $options ) {
765
					if ( in_array( $post_type, $ignore ) ) {
766
						continue;
767
					}
768
769
					if ( false !== (boolean) pods_var( 'built_in_post_types_' . $post_type, $taxonomy, false ) ) {
770
						$ct_post_types[] = $post_type;
771
772
						if ( isset( $supported_taxonomies[ $post_type ] ) && ! in_array( $taxonomy_name, $supported_taxonomies[ $post_type ] ) ) {
773
							$supported_taxonomies[ $post_type ][] = $taxonomy_name;
774
						}
775
					}
776
				}
777
778
				if ( isset( $supported_post_types[ $taxonomy_name ] ) ) {
779
					$supported_post_types[ $taxonomy_name ] = array_merge( $supported_post_types[ $taxonomy_name ], $ct_post_types );
780
				} else {
781
					$supported_post_types[ $taxonomy_name ] = $ct_post_types;
782
				}
783
			}
784
785
			$pods_post_types = apply_filters( 'pods_wp_post_types', $pods_post_types );
786
			$pods_taxonomies = apply_filters( 'pods_wp_taxonomies', $pods_taxonomies );
787
788
			$supported_post_types = apply_filters( 'pods_wp_supported_post_types', $supported_post_types );
789
			$supported_taxonomies = apply_filters( 'pods_wp_supported_taxonomies', $supported_taxonomies );
790
791
			foreach ( $pods_taxonomies as $taxonomy => $options ) {
792
				$ct_post_types = null;
793
794
				if ( isset( $supported_post_types[ $taxonomy ] ) && ! empty( $supported_post_types[ $taxonomy ] ) ) {
795
					$ct_post_types = $supported_post_types[ $taxonomy ];
796
				}
797
798
				$pods_cpt_ct['taxonomies'][ $taxonomy ] = array(
799
					'post_types' => $ct_post_types,
800
					'options'    => $options
801
				);
802
			}
803
804
			foreach ( $pods_post_types as $post_type => $options ) {
805
				if ( isset( $supported_taxonomies[ $post_type ] ) && ! empty( $supported_taxonomies[ $post_type ] ) ) {
806
					$options['taxonomies'] = $supported_taxonomies[ $post_type ];
807
				}
808
809
				$pods_cpt_ct['post_types'][ $post_type ] = $options;
810
			}
811
812
			pods_transient_set( 'pods_wp_cpt_ct', $pods_cpt_ct );
813
		}
814
815
		foreach ( $pods_cpt_ct['taxonomies'] as $taxonomy => $options ) {
816
			if ( isset( self::$content_types_registered['taxonomies'] ) && in_array( $taxonomy, self::$content_types_registered['taxonomies'] ) ) {
817
				continue;
818
			}
819
820
			$ct_post_types = $options['post_types'];
821
			$options       = $options['options'];
822
823
			$options = apply_filters( 'pods_register_taxonomy_' . $taxonomy, $options, $taxonomy );
824
			$options = apply_filters( 'pods_register_taxonomy', $options, $taxonomy );
825
826
			$options = self::object_label_fix( $options, 'taxonomy' );
827
828
			/**
829
			 * Hide tagcloud compatibility
830
			 * @todo check https://core.trac.wordpress.org/ticket/36964
831
			 * @see wp-admin/edit-tags.php L389
832
			 */
833
			if ( true != (boolean) pods_var( 'show_tagcloud_in_edit', $options, (boolean) pods_var( 'show_tagcloud', $options, true ) ) ) {
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like you are loosely comparing two booleans. Considering using the strict comparison !== instead.

When comparing two booleans, it is generally considered safer to use the strict comparison operator.

Loading history...
834
				$options['labels']['popular_items'] = null;
835
			}
836
837
			// Max length for taxonomies are 32 characters
838
			$taxonomy = substr( $taxonomy, 0, 32 );
839
840
			// i18n compatibility for plugins that override it
841 View Code Duplication
			if ( is_array( $options['rewrite'] ) && isset( $options['rewrite']['slug'] ) && ! empty( $options['rewrite']['slug'] ) ) {
842
				$options['rewrite']['slug'] = _x( $options['rewrite']['slug'], 'URL taxonomy slug', 'pods' );
843
			}
844
845 View Code Duplication
			if ( 1 == pods_var( 'pods_debug_register', 'get', 0 ) && pods_is_admin( array( 'pods' ) ) ) {
846
				pods_debug( array( $taxonomy, $ct_post_types, $options ) );
847
			}
848
849
			register_taxonomy( $taxonomy, $ct_post_types, $options );
850
851
			if ( ! isset( self::$content_types_registered['taxonomies'] ) ) {
852
				self::$content_types_registered['taxonomies'] = array();
853
			}
854
855
			self::$content_types_registered['taxonomies'][] = $taxonomy;
856
		}
857
858
		foreach ( $pods_cpt_ct['post_types'] as $post_type => $options ) {
859
			if ( isset( self::$content_types_registered['post_types'] ) && in_array( $post_type, self::$content_types_registered['post_types'] ) ) {
860
				continue;
861
			}
862
863
			$options = apply_filters( 'pods_register_post_type_' . $post_type, $options, $post_type );
864
			$options = apply_filters( 'pods_register_post_type', $options, $post_type );
865
866
			$options = self::object_label_fix( $options, 'post_type' );
867
868
			// Max length for post types are 20 characters
869
			$post_type = substr( $post_type, 0, 20 );
870
871
			// i18n compatibility for plugins that override it
872 View Code Duplication
			if ( is_array( $options['rewrite'] ) && isset( $options['rewrite']['slug'] ) && ! empty( $options['rewrite']['slug'] ) ) {
873
				$options['rewrite']['slug'] = _x( $options['rewrite']['slug'], 'URL slug', 'pods' );
874
			}
875
876 View Code Duplication
			if ( 1 == pods_var( 'pods_debug_register', 'get', 0 ) && pods_is_admin( array( 'pods' ) ) ) {
877
				pods_debug( array( $post_type, $options ) );
878
			}
879
880
			register_post_type( $post_type, $options );
881
882
			if ( ! isset( self::$content_types_registered['post_types'] ) ) {
883
				self::$content_types_registered['post_types'] = array();
884
			}
885
886
			self::$content_types_registered['post_types'][] = $post_type;
887
		}
888
889
	}
890
891
	/**
892
	 * Check if we need to flush WordPress rewrite rules
893
	 * This gets run during 'init' action late in the game to give other plugins time to register their rewrite rules
894
	 */
895
	public function flush_rewrite_rules() {
896
897
		$flush = (int) pods_transient_get( 'pods_flush_rewrites' );
898
899
		if ( 1 === $flush ) {
900
			/**
901
			 * @var $wp_rewrite WP_Rewrite
902
			 */
903
			global $wp_rewrite;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
904
			$wp_rewrite->flush_rules();
905
			$wp_rewrite->init();
906
907
			pods_transient_set( 'pods_flush_rewrites', 0 );
908
		}
909
	}
910
911
	/**
912
	 * Update Post Type messages
913
	 *
914
	 * @param array $messages
915
	 *
916
	 * @return array
917
	 * @since 2.0.2
918
	 */
919
	public function setup_updated_messages( $messages ) {
920
921
		global $post, $post_ID;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
922
923
		$post_types          = PodsMeta::$post_types;
924
		$existing_post_types = get_post_types();
925
926
		$pods_cpt_ct = pods_transient_get( 'pods_wp_cpt_ct' );
927
928
		if ( empty( $pods_cpt_ct ) || empty( $post_types ) ) {
929
			return $messages;
930
		}
931
932
		foreach ( $post_types as $post_type ) {
933
			if ( ! isset( $pods_cpt_ct['post_types'][ $post_type['name'] ] ) ) {
934
				continue;
935
			}
936
937
			$labels = self::object_label_fix( $pods_cpt_ct['post_types'][ $post_type['name'] ], 'post_type' );
938
			$labels = $labels['labels'];
939
940
			$messages[ $post_type['name'] ] = array(
941
				1  => sprintf( __( '%s updated. <a href="%s">%s</a>', 'pods' ), $labels['singular_name'], esc_url( get_permalink( $post_ID ) ), $labels['view_item'] ),
942
				2  => __( 'Custom field updated.', 'pods' ),
943
				3  => __( 'Custom field deleted.', 'pods' ),
944
				4  => sprintf( __( '%s updated.', 'pods' ), $labels['singular_name'] ),
945
				/* translators: %s: date and time of the revision */
946
				5  => isset( $_GET['revision'] ) ? sprintf( __( '%s restored to revision from %s', 'pods' ), $labels['singular_name'], wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
947
				6  => sprintf( __( '%s published. <a href="%s">%s</a>', 'pods' ), $labels['singular_name'], esc_url( get_permalink( $post_ID ) ), $labels['view_item'] ),
948
				7  => sprintf( __( '%s saved.', 'pods' ), $labels['singular_name'] ),
949
				8  => sprintf( __( '%s submitted. <a target="_blank" href="%s">Preview %s</a>', 'pods' ), $labels['singular_name'], esc_url( add_query_arg( 'preview', 'true', get_permalink( $post_ID ) ) ), $labels['singular_name'] ),
950
				9  => sprintf( __( '%s scheduled for: <strong>%s</strong>. <a target="_blank" href="%s">Preview %s</a>', 'pods' ), $labels['singular_name'], // translators: Publish box date format, see http://php.net/date
951
					date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink( $post_ID ) ), $labels['singular_name'] ),
952
				10 => sprintf( __( '%s draft updated. <a target="_blank" href="%s">Preview %s</a>', 'pods' ), $labels['singular_name'], esc_url( add_query_arg( 'preview', 'true', get_permalink( $post_ID ) ) ), $labels['singular_name'] )
953
			);
954
955
			if ( false === (boolean) $pods_cpt_ct['post_types'][ $post_type['name'] ]['public'] ) {
956
				$messages[ $post_type['name'] ][1]  = sprintf( __( '%s updated.', 'pods' ), $labels['singular_name'] );
957
				$messages[ $post_type['name'] ][6]  = sprintf( __( '%s published.', 'pods' ), $labels['singular_name'] );
958
				$messages[ $post_type['name'] ][8]  = sprintf( __( '%s submitted.', 'pods' ), $labels['singular_name'] );
959
				$messages[ $post_type['name'] ][9]  = sprintf( __( '%s scheduled for: <strong>%1$s</strong>.', 'pods' ), $labels['singular_name'], // translators: Publish box date format, see http://php.net/date
960
					date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ) );
961
				$messages[ $post_type['name'] ][10] = sprintf( __( '%s draft updated.', 'pods' ), $labels['singular_name'] );
962
			}
963
		}
964
965
		return $messages;
966
	}
967
968
	/**
969
	 * @param        $args
970
	 * @param string $type
971
	 *
972
	 * @return array
973
	 */
974
	public static function object_label_fix( $args, $type = 'post_type' ) {
975
976
		if ( empty( $args ) || ! is_array( $args ) ) {
977
			$args = array();
978
		}
979
980
		if ( ! isset( $args['labels'] ) || ! is_array( $args['labels'] ) ) {
981
			$args['labels'] = array();
982
		}
983
984
		$label          = pods_v( 'name', $args['labels'], pods_v( 'label', $args, __( 'Items', 'pods' ), true ), true );
985
		$singular_label = pods_v( 'singular_name', $args['labels'], pods_v( 'label_singular', $args, __( 'Item', 'pods' ), true ), true );
986
987
		$labels = $args['labels'];
988
989
		$labels['name']          = $label;
990
		$labels['singular_name'] = $singular_label;
991
992
		if ( 'post_type' == $type ) {
993
			$labels['menu_name']             = pods_v( 'menu_name', $labels, $label, true );
994
			$labels['name_admin_bar']        = pods_v( 'name_admin_bar', $labels, $singular_label, true );
995
			$labels['add_new']               = pods_v( 'add_new', $labels, __( 'Add New', 'pods' ), true );
996
			$labels['add_new_item']          = pods_v( 'add_new_item', $labels, sprintf( __( 'Add New %s', 'pods' ), $singular_label ), true );
997
			$labels['new_item']              = pods_v( 'new_item', $labels, sprintf( __( 'New %s', 'pods' ), $singular_label ), true );
998
			$labels['edit']                  = pods_v( 'edit', $labels, __( 'Edit', 'pods' ), true );
999
			$labels['edit_item']             = pods_v( 'edit_item', $labels, sprintf( __( 'Edit %s', 'pods' ), $singular_label ), true );
1000
			$labels['view']                  = pods_v( 'view', $labels, sprintf( __( 'View %s', 'pods' ), $singular_label ), true );
1001
			$labels['view_item']             = pods_v( 'view_item', $labels, sprintf( __( 'View %s', 'pods' ), $singular_label ), true );
1002
			$labels['all_items']             = pods_v( 'all_items', $labels, sprintf( __( 'All %s', 'pods' ), $label ), true );
1003
			$labels['search_items']          = pods_v( 'search_items', $labels, sprintf( __( 'Search %s', 'pods' ), $label ), true );
1004
			$labels['not_found']             = pods_v( 'not_found', $labels, sprintf( __( 'No %s Found', 'pods' ), $label ), true );
1005
			$labels['not_found_in_trash']    = pods_v( 'not_found_in_trash', $labels, sprintf( __( 'No %s Found in Trash', 'pods' ), $label ), true );
1006
			$labels['parent']                = pods_v( 'parent', $labels, sprintf( __( 'Parent %s', 'pods' ), $singular_label ), true );
1007
			$labels['parent_item_colon']     = pods_v( 'parent_item_colon', $labels, sprintf( __( 'Parent %s:', 'pods' ), $singular_label ), true );
1008
			$labels['featured_image']        = pods_v( 'featured_image', $labels, __( 'Featured Image', 'pods' ), true );
1009
			$labels['set_featured_image']    = pods_v( 'set_featured_image', $labels, __( 'Set featured image', 'pods' ), true );
1010
			$labels['remove_featured_image'] = pods_v( 'remove_featured_image', $labels, __( 'Remove featured image', 'pods' ), true );
1011
			$labels['use_featured_image']    = pods_v( 'use_featured_image', $labels, __( 'Use as featured image', 'pods' ), true );
1012
			$labels['archives']              = pods_v( 'archives', $labels, sprintf( __( '%s Archives', 'pods' ), $singular_label ), true );
1013
			$labels['insert_into_item']      = pods_v( 'insert_into_item', $labels, sprintf( __( 'Insert into %s', 'pods' ), $singular_label ), true );
1014
			$labels['uploaded_to_this_item'] = pods_v( 'uploaded_to_this_item', $labels, sprintf( __( 'Uploaded to this %s', 'pods' ), $singular_label ), true );
1015
			$labels['filter_items_list']     = pods_v( 'filter_items_list', $labels, sprintf( __( 'Filter %s lists', 'pods' ), $label ), true );
1016
			$labels['items_list_navigation'] = pods_v( 'items_list_navigation', $labels, sprintf( __( '%s navigation', 'pods' ), $label ), true );
1017
			$labels['items_list']            = pods_v( 'items_list', $labels, sprintf( __( '%s list', 'pods' ), $label ), true );
1018
		} elseif ( 'taxonomy' == $type ) {
1019
			$labels['menu_name']                  = pods_v( 'menu_name', $labels, $label, true );
1020
			$labels['search_items']               = pods_v( 'search_items', $labels, sprintf( __( 'Search %s', 'pods' ), $label ), true );
1021
			$labels['popular_items']              = pods_v( 'popular_items', $labels, sprintf( __( 'Popular %s', 'pods' ), $label ), true );
1022
			$labels['all_items']                  = pods_v( 'all_items', $labels, sprintf( __( 'All %s', 'pods' ), $label ), true );
1023
			$labels['parent_item']                = pods_v( 'parent_item', $labels, sprintf( __( 'Parent %s', 'pods' ), $singular_label ), true );
1024
			$labels['parent_item_colon']          = pods_v( 'parent_item_colon', $labels, sprintf( __( 'Parent %s :', 'pods' ), $singular_label ), true );
1025
			$labels['edit_item']                  = pods_v( 'edit_item', $labels, sprintf( __( 'Edit %s', 'pods' ), $singular_label ), true );
1026
			$labels['view_item']                  = pods_v( 'view_item', $labels, sprintf( __( 'View %s', 'pods' ), $singular_label ), true );
1027
			$labels['update_item']                = pods_v( 'update_item', $labels, sprintf( __( 'Update %s', 'pods' ), $singular_label ), true );
1028
			$labels['add_new_item']               = pods_v( 'add_new_item', $labels, sprintf( __( 'Add New %s', 'pods' ), $singular_label ), true );
1029
			$labels['new_item_name']              = pods_v( 'new_item_name', $labels, sprintf( __( 'New %s Name', 'pods' ), $singular_label ), true );
1030
			$labels['separate_items_with_commas'] = pods_v( 'separate_items_with_commas', $labels, sprintf( __( 'Separate %s with commas', 'pods' ), $label ), true );
1031
			$labels['add_or_remove_items']        = pods_v( 'add_or_remove_items', $labels, sprintf( __( 'Add or remove %s', 'pods' ), $label ), true );
1032
			$labels['choose_from_most_used']      = pods_v( 'choose_from_most_used', $labels, sprintf( __( 'Choose from the most used %s', 'pods' ), $label ), true );
1033
			$labels['not_found']                  = pods_v( 'not_found', $labels, sprintf( __( 'No %s found.', 'pods' ), $label ), true );
1034
			$labels['no_terms']                   = pods_v( 'no_terms', $labels, sprintf( __( 'No %s', 'pods' ), $label ), true );
1035
			$labels['items_list_navigation']      = pods_v( 'items_list_navigation', $labels, sprintf( __( '%s navigation', 'pods' ), $label ), true );
1036
			$labels['items_list']                 = pods_v( 'items_list', $labels, sprintf( __( '%s list', 'pods' ), $label ), true );
1037
		}
1038
1039
		$args['labels'] = $labels;
1040
1041
		return $args;
1042
	}
1043
1044
	/**
1045
	 * Activate and Install
1046
	 */
1047
	public function activate_install() {
1048
1049
		register_activation_hook( PODS_DIR . 'init.php', array( $this, 'activate' ) );
1050
		register_deactivation_hook( PODS_DIR . 'init.php', array( $this, 'deactivate' ) );
1051
1052
		add_action( 'wpmu_new_blog', array( $this, 'new_blog' ), 10, 6 );
1053
1054
		if ( empty( self::$version ) || version_compare( self::$version, PODS_VERSION, '<' ) || version_compare( self::$version, PODS_DB_VERSION, '<=' ) || self::$upgrade_needed ) {
1055
			$this->setup();
1056
		} elseif ( self::$version !== PODS_VERSION ) {
1057
			delete_option( 'pods_framework_version' );
1058
			add_option( 'pods_framework_version', PODS_VERSION, '', 'yes' );
1059
1060
			self::$version = PODS_VERSION;
1061
1062
			pods_api()->cache_flush_pods();
1063
		}
1064
1065
	}
1066
1067
	/**
1068
	 *
1069
	 */
1070
	public function activate() {
1071
1072
		global $wpdb;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
1073
1074
		if ( function_exists( 'is_multisite' ) && is_multisite() && isset( $_GET['networkwide'] ) && 1 == $_GET['networkwide'] ) {
1075
			$_blog_ids = $wpdb->get_col( "SELECT `blog_id` FROM `{$wpdb->blogs}`" );
1076
1077
			foreach ( $_blog_ids as $_blog_id ) {
1078
				$this->setup( $_blog_id );
1079
			}
1080
		} else {
1081
			$this->setup();
1082
		}
1083
	}
1084
1085
	/**
1086
	 *
1087
	 */
1088
	public function deactivate() {
1089
1090
		pods_api()->cache_flush_pods();
1091
1092
	}
1093
1094
	/**
1095
	 *
1096
	 */
1097
	public function needs_upgrade( $current = null, $last = null ) {
1098
1099
		if ( null === $current ) {
1100
			$current = self::$version;
1101
		}
1102
1103
		if ( null === $last ) {
1104
			$last = self::$version_last;
1105
		}
1106
1107
		$upgrade_needed = false;
1108
1109
		if ( ! empty( $current ) ) {
1110
			foreach ( self::$upgrades as $old_version => $new_version ) {
1111
				/*if ( '2.1.0' == $new_version && ( is_developer() ) )
0 ignored issues
show
Unused Code Comprehensibility introduced by
50% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
1112
					continue;*/
1113
1114
				if ( version_compare( $last, $old_version, '>=' ) && version_compare( $last, $new_version, '<' ) && version_compare( $current, $new_version, '>=' ) && 1 != self::$upgraded ) {
1115
					$upgrade_needed = true;
1116
1117
					break;
1118
				}
1119
			}
1120
		}
1121
1122
		return $upgrade_needed;
1123
	}
1124
1125
	/**
1126
	 * @param $_blog_id
1127
	 * @param $user_id
1128
	 * @param $domain
1129
	 * @param $path
1130
	 * @param $site_id
1131
	 * @param $meta
1132
	 */
1133
	public function new_blog( $_blog_id, $user_id, $domain, $path, $site_id, $meta ) {
0 ignored issues
show
Unused Code introduced by
The parameter $user_id 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...
Unused Code introduced by
The parameter $domain 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...
Unused Code introduced by
The parameter $path 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...
Unused Code introduced by
The parameter $site_id 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...
Unused Code introduced by
The parameter $meta 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...
1134
1135
		if ( function_exists( 'is_multisite' ) && is_multisite() && is_plugin_active_for_network( basename( PODS_DIR ) . '/init.php' ) ) {
1136
			$this->setup( $_blog_id );
1137
		}
1138
	}
1139
1140
	/**
1141
	 * @param null $_blog_id
1142
	 */
1143
	public function setup( $_blog_id = null ) {
1144
1145
		global $wpdb;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
1146
1147
		// Switch DB table prefixes
1148 View Code Duplication
		if ( null !== $_blog_id && $_blog_id != $wpdb->blogid ) {
1149
			switch_to_blog( pods_absint( $_blog_id ) );
1150
		} else {
1151
			$_blog_id = null;
1152
		}
1153
1154
		// Setup DB tables
1155
		$pods_version      = get_option( 'pods_framework_version' );
1156
		$pods_version_last = get_option( 'pods_framework_version_last' );
1157
1158
		// Install Pods
1159
		if ( empty( $pods_version ) ) {
1160
			pods_upgrade()->install( $_blog_id );
1161
1162
			$old_version = get_option( 'pods_version' );
1163
1164
			if ( ! empty( $old_version ) ) {
1165
				if ( false === strpos( $old_version, '.' ) ) {
1166
					$old_version = pods_version_to_point( $old_version );
1167
				}
1168
1169
				delete_option( 'pods_framework_version_last' );
1170
				add_option( 'pods_framework_version_last', $pods_version, '', 'yes' );
1171
1172
				self::$version_last = $old_version;
1173
			}
1174
		} // Upgrade Wizard needed
1175
		elseif ( $this->needs_upgrade( $pods_version, $pods_version_last ) ) {
1176
			// Do not do anything
1177
			return;
1178
		} // Update Pods and run any required DB updates
1179
		elseif ( version_compare( $pods_version, PODS_VERSION, '<=' ) ) {
1180
			if ( false !== apply_filters( 'pods_update_run', null, PODS_VERSION, $pods_version, $_blog_id ) && ! isset( $_GET['pods_bypass_update'] ) ) {
1181
				do_action( 'pods_update', PODS_VERSION, $pods_version, $_blog_id );
1182
1183
				// Update 2.0 alpha / beta sites
1184
				if ( version_compare( '2.0.0-a-1', $pods_version, '<=' ) && version_compare( $pods_version, '2.0.0-b-15', '<=' ) ) {
1185
					include( PODS_DIR . 'sql/update-2.0-beta.php' );
1186
				}
1187
1188
				if ( version_compare( $pods_version, PODS_DB_VERSION, '<=' ) ) {
1189
					include( PODS_DIR . 'sql/update.php' );
1190
				}
1191
1192
				do_action( 'pods_update_post', PODS_VERSION, $pods_version, $_blog_id );
1193
			}
1194
1195
			delete_option( 'pods_framework_version_last' );
1196
			add_option( 'pods_framework_version_last', $pods_version, '', 'yes' );
1197
1198
			self::$version_last = $pods_version;
1199
		}
1200
1201
		delete_option( 'pods_framework_version' );
1202
		add_option( 'pods_framework_version', PODS_VERSION, '', 'yes' );
1203
1204
		delete_option( 'pods_framework_db_version' );
1205
		add_option( 'pods_framework_db_version', PODS_DB_VERSION, '', 'yes' );
1206
1207
		self::$version = PODS_VERSION;
1208
		self::$db_version = PODS_DB_VERSION;
1209
1210
		pods_api()->cache_flush_pods();
1211
1212
		// Restore DB table prefix (if switched)
1213
		if ( null !== $_blog_id ) {
1214
			restore_current_blog();
1215
		}
1216
1217
	}
1218
1219
	/**
1220
	 * @param null $_blog_id
1221
	 */
1222
	public function reset( $_blog_id = null ) {
1223
1224
		global $wpdb;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
1225
1226
		// Switch DB table prefixes
1227 View Code Duplication
		if ( null !== $_blog_id && $_blog_id != $wpdb->blogid ) {
1228
			switch_to_blog( pods_absint( $_blog_id ) );
1229
		} else {
1230
			$_blog_id = null;
1231
		}
1232
1233
		$api = pods_api();
1234
1235
		$pods = $api->load_pods( array( 'names_ids' => true, 'table_info' => false ) );
1236
1237
		foreach ( $pods as $pod_id => $pod_label ) {
0 ignored issues
show
Bug introduced by
The expression $pods of type array|object|integer|double|string|null|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...
1238
			$api->delete_pod( array( 'id' => $pod_id ) );
1239
		}
1240
1241
		$templates = $api->load_templates();
1242
1243
		foreach ( $templates as $template ) {
1244
			$api->delete_template( array( 'id' => $template['id'] ) );
1245
		}
1246
1247
		$pages = $api->load_pages();
1248
1249
		foreach ( $pages as $page ) {
1250
			$api->delete_page( array( 'id' => $page['id'] ) );
1251
		}
1252
1253
		$helpers = $api->load_helpers();
1254
1255
		foreach ( $helpers as $helper ) {
1256
			$api->delete_helper( array( 'id' => $helper['id'] ) );
1257
		}
1258
1259
		$tables = $wpdb->get_results( "SHOW TABLES LIKE '{$wpdb->prefix}pods%'", ARRAY_N );
1260
1261
		if ( ! empty( $tables ) ) {
1262
			foreach ( $tables as $table ) {
1263
				$table = $table[0];
1264
1265
				pods_query( "DROP TABLE `{$table}`", false );
1266
			}
1267
		}
1268
1269
		// Remove any orphans
1270
		$wpdb->query( "
1271
                DELETE `p`, `pm`
1272
                FROM `{$wpdb->posts}` AS `p`
1273
                LEFT JOIN `{$wpdb->postmeta}` AS `pm`
1274
                    ON `pm`.`post_id` = `p`.`ID`
1275
                WHERE
1276
                    `p`.`post_type` LIKE '_pods_%'
1277
            " );
1278
1279
		delete_option( 'pods_framework_version' );
1280
		delete_option( 'pods_framework_db_version' );
1281
		delete_option( 'pods_framework_upgrade_2_0' );
1282
		delete_option( 'pods_framework_upgraded_1_x' );
1283
1284
		// @todo Make sure all entries are being cleaned and do something about the pods_framework_upgrade_{version} dynamic entries created by PodsUpgrade
1285
		delete_option( 'pods_framework_upgrade_2_0_0' );
1286
		delete_option( 'pods_framework_upgrade_2_0_sister_ids' );
1287
		delete_option( 'pods_framework_version_last' );
1288
1289
		delete_option( 'pods_component_settings' );
1290
1291
		$api->cache_flush_pods();
1292
1293
		pods_transient_clear( 'pods_flush_rewrites' );
1294
1295
		self::$version = '';
1296
1297
		// Restore DB table prefix (if switched)
1298
		if ( null !== $_blog_id ) {
1299
			restore_current_blog();
1300
		}
1301
	}
1302
1303
	public function run() {
1304
1305
		static $ran;
1306
1307
		if ( ! empty( $ran ) ) {
1308
			return;
1309
		}
1310
1311
		$ran = true;
1312
1313
		$this->load_i18n();
1314
1315
		if ( ! did_action( 'plugins_loaded' ) ) {
1316
			add_action( 'plugins_loaded', array( $this, 'load_components' ), 11 );
1317
		} else {
1318
			$this->load_components();
1319
		}
1320
1321
		if ( ! did_action( 'setup_theme' ) ) {
1322
			add_action( 'setup_theme', array( $this, 'load_meta' ), 14 );
1323
		} else {
1324
			$this->load_meta();
1325
		}
1326
1327
		if ( ! did_action( 'init' ) ) {
1328
			add_action( 'init', array( $this, 'core' ), 11 );
1329
			add_action( 'init', array( $this, 'add_rest_support' ), 12 );
1330
			add_action( 'init', array( $this, 'setup_content_types' ), 11 );
1331
1332
			if ( is_admin() ) {
1333
				add_action( 'init', array( $this, 'admin_init' ), 12 );
1334
			}
1335
		} else {
1336
			$this->core();
1337
			$this->add_rest_support();
1338
			$this->setup_content_types();
1339
1340
			if ( is_admin() ) {
1341
				$this->admin_init();
1342
			}
1343
		}
1344
1345
		add_action( 'wp_enqueue_scripts', array( $this, 'register_assets' ), 15 );
1346
		add_action( 'admin_enqueue_scripts', array( $this, 'register_assets' ), 15 );
1347
		add_action( 'login_enqueue_scripts', array( $this, 'register_assets' ), 15 );
1348
1349
		add_filter( 'post_updated_messages', array( $this, 'setup_updated_messages' ), 10, 1 );
1350
		add_action( 'delete_attachment', array( $this, 'delete_attachment' ) );
1351
1352
		// Register widgets
1353
		add_action( 'widgets_init', array( $this, 'register_widgets' ) );
1354
1355
		// Show admin bar links
1356
		add_action( 'admin_bar_menu', array( $this, 'admin_bar_links' ), 81 );
1357
1358
	}
1359
1360
	/**
1361
	 * Delete Attachments from relationships
1362
	 *
1363
	 * @param int $_ID
1364
	 */
1365
	public function delete_attachment( $_ID ) {
1366
1367
		global $wpdb;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
1368
1369
		$_ID = (int) $_ID;
1370
1371
		do_action( 'pods_delete_attachment', $_ID );
1372
1373
		$file_types = "'" . implode( "', '", PodsForm::file_field_types() ) . "'";
1374
1375
		if ( ! pods_tableless() ) {
1376
			$sql = "
1377
                DELETE `rel`
1378
                FROM `@wp_podsrel` AS `rel`
1379
                LEFT JOIN `{$wpdb->posts}` AS `p`
1380
                    ON
1381
                        `p`.`post_type` = '_pods_field'
1382
                        AND ( `p`.`ID` = `rel`.`field_id` OR `p`.`ID` = `rel`.`related_field_id` )
1383
                LEFT JOIN `{$wpdb->postmeta}` AS `pm`
1384
                    ON
1385
                        `pm`.`post_id` = `p`.`ID`
1386
                        AND `pm`.`meta_key` = 'type'
1387
                        AND `pm`.`meta_value` IN ( {$file_types} )
1388
                WHERE
1389
                    `p`.`ID` IS NOT NULL
1390
                    AND `pm`.`meta_id` IS NOT NULL
1391
                    AND `rel`.`item_id` = {$_ID}";
1392
1393
			pods_query( $sql, false );
1394
		}
1395
1396
		// Post Meta
1397 View Code Duplication
		if ( ! empty( PodsMeta::$post_types ) ) {
1398
			$sql = "
1399
                DELETE `rel`
1400
                FROM `@wp_postmeta` AS `rel`
1401
                LEFT JOIN `{$wpdb->posts}` AS `p`
1402
                    ON
1403
                        `p`.`post_type` = '_pods_field'
1404
                LEFT JOIN `{$wpdb->postmeta}` AS `pm`
1405
                    ON
1406
                        `pm`.`post_id` = `p`.`ID`
1407
                        AND `pm`.`meta_key` = 'type'
1408
                        AND `pm`.`meta_value` IN ( {$file_types} )
1409
                WHERE
1410
                    `p`.`ID` IS NOT NULL
1411
                    AND `pm`.`meta_id` IS NOT NULL
1412
                    AND `rel`.`meta_key` = `p`.`post_name`
1413
                    AND `rel`.`meta_value` = '{$_ID}'";
1414
1415
			pods_query( $sql, false );
1416
		}
1417
1418
		// User Meta
1419 View Code Duplication
		if ( ! empty( PodsMeta::$user ) ) {
1420
			$sql = "
1421
                DELETE `rel`
1422
                FROM `@wp_usermeta` AS `rel`
1423
                LEFT JOIN `{$wpdb->posts}` AS `p`
1424
                    ON
1425
                        `p`.`post_type` = '_pods_field'
1426
                LEFT JOIN `{$wpdb->postmeta}` AS `pm`
1427
                    ON
1428
                        `pm`.`post_id` = `p`.`ID`
1429
                        AND `pm`.`meta_key` = 'type'
1430
                        AND `pm`.`meta_value` IN ( {$file_types} )
1431
                WHERE
1432
                    `p`.`ID` IS NOT NULL
1433
                    AND `pm`.`meta_id` IS NOT NULL
1434
                    AND `rel`.`meta_key` = `p`.`post_name`
1435
                    AND `rel`.`meta_value` = '{$_ID}'";
1436
1437
			pods_query( $sql, false );
1438
		}
1439
1440
		// Comment Meta
1441 View Code Duplication
		if ( ! empty( PodsMeta::$comment ) ) {
1442
			$sql = "
1443
                DELETE `rel`
1444
                FROM `@wp_commentmeta` AS `rel`
1445
                LEFT JOIN `{$wpdb->posts}` AS `p`
1446
                    ON
1447
                        `p`.`post_type` = '_pods_field'
1448
                LEFT JOIN `{$wpdb->postmeta}` AS `pm`
1449
                    ON
1450
                        `pm`.`post_id` = `p`.`ID`
1451
                        AND `pm`.`meta_key` = 'type'
1452
                        AND `pm`.`meta_value` IN ( {$file_types} )
1453
                WHERE
1454
                    `p`.`ID` IS NOT NULL
1455
                    AND `pm`.`meta_id` IS NOT NULL
1456
                    AND `rel`.`meta_key` = `p`.`post_name`
1457
                    AND `rel`.`meta_value` = '{$_ID}'";
1458
1459
			pods_query( $sql, false );
1460
		}
1461
	}
1462
1463
	/**
1464
	 * Register widgets for Pods
1465
	 */
1466
	public function register_widgets() {
1467
1468
		$widgets = array(
1469
			'PodsWidgetSingle',
1470
			'PodsWidgetList',
1471
			'PodsWidgetField',
1472
			'PodsWidgetForm',
1473
			'PodsWidgetView'
1474
		);
1475
1476
		foreach ( $widgets as $widget ) {
1477
			if ( ! file_exists( PODS_DIR . 'classes/widgets/' . $widget . '.php' ) ) {
1478
				continue;
1479
			}
1480
1481
			require_once PODS_DIR . 'classes/widgets/' . $widget . '.php';
1482
1483
			register_widget( $widget );
1484
		}
1485
	}
1486
1487
	/**
1488
	 * Add Admin Bar links
1489
	 */
1490
	public function admin_bar_links() {
1491
1492
		global $wp_admin_bar, $pods;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
1493
1494
		if ( ! is_user_logged_in() || ! is_admin_bar_showing() ) {
1495
			return;
1496
		}
1497
1498
		$all_pods = pods_api()->load_pods( array( 'type' => 'pod', 'fields' => false, 'table_info' => false ) );
1499
1500
		// Add New item links for all pods
1501
		foreach ( $all_pods as $pod ) {
0 ignored issues
show
Bug introduced by
The expression $all_pods of type array|object|integer|double|string|null|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...
1502
			if ( 0 == $pod['options']['show_in_menu'] ) {
1503
				continue;
1504
			}
1505
1506
			if ( ! pods_is_admin( array( 'pods', 'pods_content', 'pods_add_' . $pod['name'] ) ) ) {
1507
				continue;
1508
			}
1509
1510
			$singular_label = pods_var_raw( 'label_singular', $pod['options'], pods_var_raw( 'label', $pod, ucwords( str_replace( '_', ' ', $pod['name'] ) ), null, true ), null, true );
1511
1512
			$wp_admin_bar->add_node( array(
1513
				'id'     => 'new-pod-' . $pod['name'],
1514
				'title'  => $singular_label,
1515
				'parent' => 'new-content',
1516
				'href'   => admin_url( 'admin.php?page=pods-manage-' . $pod['name'] . '&action=add' )
1517
			) );
1518
		}
1519
1520
		// Add edit link if we're on a pods page
1521
		if ( is_object( $pods ) && ! is_wp_error( $pods ) && ! empty( $pods->id ) && isset( $pods->pod_data ) && ! empty( $pods->pod_data ) && 'pod' == $pods->pod_data['type'] ) {
1522
			$pod = $pods->pod_data;
1523
1524
			if ( pods_is_admin( array( 'pods', 'pods_content', 'pods_edit_' . $pod['name'] ) ) ) {
1525
				$singular_label = pods_var_raw( 'label_singular', $pod['options'], pods_var_raw( 'label', $pod, ucwords( str_replace( '_', ' ', $pod['name'] ) ), null, true ), null, true );
1526
1527
				$wp_admin_bar->add_node( array(
1528
					'title' => sprintf( __( 'Edit %s', 'pods' ), $singular_label ),
1529
					'id'    => 'edit-pod',
1530
					'href'  => admin_url( 'admin.php?page=pods-manage-' . $pod['name'] . '&action=edit&id=' . $pods->id() )
1531
				) );
1532
			}
1533
		}
1534
1535
	}
1536
1537
	/**
1538
	 * Add REST API support to post type and taxonomy objects.
1539
	 *
1540
	 * @uses  "init"
1541
	 *
1542
	 * @since 2.5.6
1543
	 */
1544
	public function add_rest_support() {
1545
1546
		if ( empty( self::$version ) ) {
1547
			return;
1548
		}
1549
1550
		static $rest_support_added;
1551
1552
		if ( ! function_exists( 'register_rest_field' ) ) {
1553
			return;
1554
		}
1555
1556
		include_once( PODS_DIR . 'classes/PodsRESTFields.php' );
1557
		include_once( PODS_DIR . 'classes/PodsRESTHandlers.php' );
1558
1559
		$rest_bases = pods_transient_get( 'pods_rest_bases' );
1560
1561
		if ( empty( $rest_bases ) ) {
1562
	        $pods = pods_api()->load_pods( array( 'type' => array( 'post_type', 'taxonomy', 'user', 'media', 'comment' ), 'fields' => false, 'table_info' => false ) );
1563
1564
			$rest_bases = array();
1565
1566
			if ( ! empty( $pods ) && is_array( $pods ) ) {
1567
				foreach ( $pods as $pod ) {
1568
					$type = $pod['type'];
1569
1570
					if ( in_array( $type, array( 'post_type', 'taxonomy', 'user', 'media', 'comment' ) ) ) {
1571
						if ( $pod && PodsRESTHandlers::pod_extends_core_route( $pod ) ) {
1572
							$rest_bases[ $pod['name'] ] = array(
1573
								'type' => $type,
1574
								'base' => sanitize_title( pods_v( 'rest_base', $pod['options'], $pod['name'] ) ),
1575
							);
1576
						}
1577
					}
1578
				}
1579
			}
1580
1581
			if ( empty( $rest_bases ) ) {
1582
				$rest_bases = 'none';
1583
			}
1584
1585
			pods_transient_set( 'pods_rest_bases', $rest_bases );
1586
		}
1587
1588
		if ( empty( $rest_support_added ) && ! empty( $rest_bases ) && 'none' !== $rest_bases ) {
1589
			foreach ( $rest_bases as $pod_name => $pod_info ) {
1590
				$pod_type  = $pod_info['type'];
1591
				$rest_base = $pod_info['base'];
1592
1593
				if ( 'post_type' == $pod_type ) {
1594
					PodsRESTHandlers::post_type_rest_support( $pod_name, $rest_base );
1595
				} elseif ( 'taxonomy' == $pod_type ) {
1596
					PodsRESTHandlers::taxonomy_rest_support( $pod_name, $rest_base );
1597
				}
1598
1599
				new PodsRESTFields( $pod_name );
1600
			}
1601
1602
			$rest_support_added = true;
1603
		}
1604
1605
	}
1606
}
1607