Completed
Pull Request — 2.x (#3632)
by Scott Kingsley
04:53
created

PodsInit::object_label_fix()   C

Complexity

Conditions 7
Paths 12

Size

Total Lines 71
Code Lines 59

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 59
nc 12
nop 2
dl 0
loc 71
rs 6.7968
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.min.css', array(), '4.0.3' );
303
		wp_register_script( 'pods-select2', PODS_URL . 'ui/js/select2/select2.min.js', array( 'jquery', 'pods-i18n' ), '4.0.3' );
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['view_items']            = pods_v( 'label_view_items', $post_type, '', true );
463
				$cpt_labels['all_items']             = pods_v( 'label_all_items', $post_type, '', true );
464
				$cpt_labels['search_items']          = pods_v( 'label_search_items', $post_type, '', true );
465
				$cpt_labels['not_found']             = pods_v( 'label_not_found', $post_type, '', true );
466
				$cpt_labels['not_found_in_trash']    = pods_v( 'label_not_found_in_trash', $post_type, '', true );
467
				$cpt_labels['parent']                = pods_v( 'label_parent', $post_type, '', true );
468
				$cpt_labels['parent_item_colon']     = pods_v( 'label_parent_item_colon', $post_type, '', true );
469
				$cpt_labels['archives']              = pods_v( 'label_archives', $post_type, '', true );
470
				$cpt_labels['attributes']            = pods_v( 'label_attributes', $post_type, '', true );
471
				$cpt_labels['insert_into_item']      = pods_v( 'label_insert_into_item', $post_type, '', true );
472
				$cpt_labels['uploaded_to_this_item'] = pods_v( 'label_uploaded_to_this_item', $post_type, '', true );
473
				$cpt_labels['featured_image']        = pods_v( 'label_featured_image', $post_type, '', true );
474
				$cpt_labels['set_featured_image']    = pods_v( 'label_set_featured_image', $post_type, '', true );
475
				$cpt_labels['remove_featured_image'] = pods_v( 'label_remove_featured_image', $post_type, '', true );
476
				$cpt_labels['use_featured_image']    = pods_v( 'label_use_featured_image', $post_type, '', true );
477
				$cpt_labels['filter_items_list']     = pods_v( 'label_filter_items_list', $post_type, '', true );
478
				$cpt_labels['items_list_navigation'] = pods_v( 'label_items_list_navigation', $post_type, '', true );
479
				$cpt_labels['items_list']            = pods_v( 'label_items_list', $post_type, '', true );
480
481
				// Supported
482
				$cpt_supported = array(
483
					'title'           => (boolean) pods_v( 'supports_title', $post_type, false ),
484
					'editor'          => (boolean) pods_v( 'supports_editor', $post_type, false ),
485
					'author'          => (boolean) pods_v( 'supports_author', $post_type, false ),
486
					'thumbnail'       => (boolean) pods_v( 'supports_thumbnail', $post_type, false ),
487
					'excerpt'         => (boolean) pods_v( 'supports_excerpt', $post_type, false ),
488
					'trackbacks'      => (boolean) pods_v( 'supports_trackbacks', $post_type, false ),
489
					'custom-fields'   => (boolean) pods_v( 'supports_custom_fields', $post_type, false ),
490
					'comments'        => (boolean) pods_v( 'supports_comments', $post_type, false ),
491
					'revisions'       => (boolean) pods_v( 'supports_revisions', $post_type, false ),
492
					'page-attributes' => (boolean) pods_v( 'supports_page_attributes', $post_type, false ),
493
					'post-formats'    => (boolean) pods_v( 'supports_post_formats', $post_type, false )
494
				);
495
496
				// Custom Supported
497
				$cpt_supported_custom = pods_v_sanitized( 'supports_custom', $post_type, '' );
498
499
				if ( ! empty( $cpt_supported_custom ) ) {
500
					$cpt_supported_custom = explode( ',', $cpt_supported_custom );
501
					$cpt_supported_custom = array_filter( array_unique( $cpt_supported_custom ) );
502
503
					foreach ( $cpt_supported_custom as $cpt_support ) {
504
						$cpt_supported[ $cpt_support ] = true;
505
					}
506
				}
507
508
				// Genesis Support
509
				if ( function_exists( 'genesis' ) ) {
510
					$cpt_supported['genesis-seo']             = (boolean) pods_var( 'supports_genesis_seo', $post_type, false );
511
					$cpt_supported['genesis-layouts']         = (boolean) pods_var( 'supports_genesis_layouts', $post_type, false );
512
					$cpt_supported['genesis-simple-sidebars'] = (boolean) pods_var( 'supports_genesis_simple_sidebars', $post_type, false );
513
				}
514
515
				// YARPP Support
516
				if ( defined( 'YARPP_VERSION' ) ) {
517
					$cpt_supported['yarpp_support'] = (boolean) pods_var( 'supports_yarpp_support', $post_type, false );
518
				}
519
520
				// Jetpack Support
521
				if ( class_exists( 'Jetpack' ) ) {
522
					$cpt_supported['supports_jetpack_publicize'] = (boolean) pods_var( 'supports_jetpack_publicize', $post_type, false );
523
					$cpt_supported['supports_jetpack_markdown']  = (boolean) pods_var( 'supports_jetpack_markdown', $post_type, false );
524
				}
525
526
				// WP needs something, if this was empty and none were enabled, it would show title+editor pre 3.5 :(
527
				$cpt_supports = array();
528
529
				if ( ! pods_version_check( 'wp', '3.5' ) ) {
530
					$cpt_supports = array( '_bug_fix_pre_35' );
531
				}
532
533
				foreach ( $cpt_supported as $cpt_support => $supported ) {
534
					if ( true === $supported ) {
535
						$cpt_supports[] = $cpt_support;
536
					}
537
				}
538
539
				if ( empty( $cpt_supports ) && pods_version_check( 'wp', '3.5' ) ) {
540
					$cpt_supports = false;
541
				}
542
543
				// Rewrite
544
				$cpt_rewrite       = (boolean) pods_var( 'rewrite', $post_type, true );
545
				$cpt_rewrite_array = array(
546
					'slug'       => pods_var( 'rewrite_custom_slug', $post_type, str_replace( '_', '-', $post_type_name ), null, true ),
547
					'with_front' => (boolean) pods_var( 'rewrite_with_front', $post_type, true ),
548
					'feeds'      => (boolean) pods_var( 'rewrite_feeds', $post_type, (boolean) pods_var( 'has_archive', $post_type, false ) ),
549
					'pages'      => (boolean) pods_var( 'rewrite_pages', $post_type, true )
550
				);
551
552
				if ( false !== $cpt_rewrite ) {
553
					$cpt_rewrite = $cpt_rewrite_array;
554
				}
555
556
				$capability_type = pods_var( 'capability_type', $post_type, 'post' );
557
558
				if ( 'custom' == $capability_type ) {
559
					$capability_type = pods_var( 'capability_type_custom', $post_type, 'post' );
560
				}
561
562
				$show_in_menu = (boolean) pods_var( 'show_in_menu', $post_type, true );
563
564
				if ( $show_in_menu && 0 < strlen( pods_var_raw( 'menu_location_custom', $post_type ) ) ) {
565
					$show_in_menu = pods_var_raw( 'menu_location_custom', $post_type );
566
				}
567
568
				$menu_icon = pods_var( 'menu_icon', $post_type, null, null, true );
569
570
				if ( ! empty( $menu_icon ) ) {
571
					$menu_icon = pods_evaluate_tags( $menu_icon );
572
				}
573
574
				// Register Post Type
575
				$pods_post_types[ $post_type_name ] = array(
576
					'label'               => $cpt_label,
577
					'labels'              => $cpt_labels,
578
					'description'         => esc_html( pods_var_raw( 'description', $post_type ) ),
579
					'public'              => (boolean) pods_var( 'public', $post_type, true ),
580
					'publicly_queryable'  => (boolean) pods_var( 'publicly_queryable', $post_type, (boolean) pods_var( 'public', $post_type, true ) ),
581
					'exclude_from_search' => (boolean) pods_var( 'exclude_from_search', $post_type, ( (boolean) pods_var( 'public', $post_type, true ) ? false : true ) ),
582
					'show_ui'             => (boolean) pods_var( 'show_ui', $post_type, (boolean) pods_var( 'public', $post_type, true ) ),
583
					'show_in_menu'        => $show_in_menu,
584
					'show_in_nav_menus'   => (boolean) pods_var( 'show_in_nav_menus', $post_type, (boolean) pods_var( 'public', $post_type, true ) ),
585
					'show_in_admin_bar'   => (boolean) pods_var( 'show_in_admin_bar', $post_type, (boolean) pods_var( 'show_in_menu', $post_type, true ) ),
586
					'menu_position'       => (int) pods_var( 'menu_position', $post_type, 0, null, true ),
587
					'menu_icon'           => $menu_icon,
588
					'capability_type'     => $capability_type,
589
					//'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...
590
					'map_meta_cap'        => (boolean) pods_var( 'capability_type_extra', $post_type, true ),
591
					'hierarchical'        => (boolean) pods_var( 'hierarchical', $post_type, false ),
592
					'supports'            => $cpt_supports,
593
					//'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...
594
					//'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...
595
					'has_archive'         => pods_v( 'has_archive_slug', $post_type, (boolean) pods_v( 'has_archive', $post_type, false ), true ),
596
					'rewrite'             => $cpt_rewrite,
597
					'query_var'           => ( false !== (boolean) pods_var( 'query_var', $post_type, true ) ? pods_var( 'query_var_string', $post_type, $post_type_name, null, true ) : false ),
598
					'can_export'          => (boolean) pods_var( 'can_export', $post_type, true )
599
				);
600
601
				// YARPP doesn't use 'supports' array option (yet)
602
				if ( ! empty( $cpt_supports['yarpp_support'] ) ) {
603
					$pods_post_types[ $post_type_name ]['yarpp_support'] = true;
604
				}
605
606
				// Prevent reserved query_var issues
607
				if ( in_array( $pods_post_types[ $post_type_name ]['query_var'], $reserved_query_vars ) ) {
608
					$pods_post_types[ $post_type_name ]['query_var'] = 'post_type_' . $pods_post_types[ $post_type_name ]['query_var'];
609
				}
610
611
				if ( 25 == $pods_post_types[ $post_type_name ]['menu_position'] ) {
612
					$pods_post_types[ $post_type_name ]['menu_position'] ++;
613
				}
614
615
				if ( $pods_post_types[ $post_type_name ]['menu_position'] < 1 || in_array( $pods_post_types[ $post_type_name ]['menu_position'], $cpt_positions ) ) {
616
					unset( $pods_post_types[ $post_type_name ]['menu_position'] );
617
				} else {
618
					$cpt_positions[] = $pods_post_types[ $post_type_name ]['menu_position'];
619
620
					// This would be nice if WP supported floats in menu_position
621
					// $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...
622
				}
623
624
				// Taxonomies
625
				$cpt_taxonomies = array();
626
				$_taxonomies    = get_taxonomies();
627
				$_taxonomies    = array_merge_recursive( $_taxonomies, $pods_taxonomies );
628
				$ignore         = array( 'nav_menu', 'link_category', 'post_format' );
629
630 View Code Duplication
				foreach ( $_taxonomies as $taxonomy => $label ) {
631
					if ( in_array( $taxonomy, $ignore ) ) {
632
						continue;
633
					}
634
635
					if ( false !== (boolean) pods_var( 'built_in_taxonomies_' . $taxonomy, $post_type, false ) ) {
636
						$cpt_taxonomies[] = $taxonomy;
637
638
						if ( isset( $supported_post_types[ $taxonomy ] ) && ! in_array( $post_type_name, $supported_post_types[ $taxonomy ] ) ) {
639
							$supported_post_types[ $taxonomy ][] = $post_type_name;
640
						}
641
					}
642
				}
643
644
				if ( isset( $supported_taxonomies[ $post_type_name ] ) ) {
645
					$supported_taxonomies[ $post_type_name ] = array_merge( (array) $supported_taxonomies[ $post_type_name ], $cpt_taxonomies );
646
				} else {
647
					$supported_taxonomies[ $post_type_name ] = $cpt_taxonomies;
648
				}
649
			}
650
651
			foreach ( $taxonomies as $taxonomy ) {
652
				// Taxonomy Type exists already
653 View Code Duplication
				if ( isset( $pods_cpt_ct['taxonomies'][ $taxonomy['name'] ] ) ) {
654
					continue;
655
				} elseif ( ! empty( $taxonomy['object'] ) && isset( $existing_taxonomies[ $taxonomy['object'] ] ) ) {
656
					continue;
657
				} elseif ( ! $force && isset( $existing_taxonomies[ $taxonomy['name'] ] ) ) {
658
					continue;
659
				}
660
661
				$taxonomy['options']['name'] = $taxonomy['name'];
662
				$taxonomy                    = array_merge( $taxonomy, (array) $taxonomy['options'] );
663
664
				$taxonomy_name = pods_var( 'name', $taxonomy );
665
666
				// Labels
667
				$ct_label    = esc_html( pods_v( 'label', $taxonomy, ucwords( str_replace( '_', ' ', pods_v( 'name', $taxonomy ) ) ), true ) );
668
				$ct_singular = esc_html( pods_v( 'label_singular', $taxonomy, ucwords( str_replace( '_', ' ', pods_v( 'label', $taxonomy, pods_v( 'name', $taxonomy ), null, true ) ) ), true ) );
669
670
				$ct_labels                               = array();
671
				$ct_labels['name']                       = $ct_label;
672
				$ct_labels['singular_name']              = $ct_singular;
673
				$ct_labels['menu_name']                  = pods_v( 'menu_name', $taxonomy, '', true );
674
				$ct_labels['search_items']               = pods_v( 'label_search_items', $taxonomy, '', true );
675
				$ct_labels['popular_items']              = pods_v( 'label_popular_items', $taxonomy, '', true );
676
				$ct_labels['all_items']                  = pods_v( 'label_all_items', $taxonomy, '', true );
677
				$ct_labels['parent_item']                = pods_v( 'label_parent_item', $taxonomy, '', true );
678
				$ct_labels['parent_item_colon']          = pods_v( 'label_parent_item_colon', $taxonomy, '', true );
679
				$ct_labels['edit_item']                  = pods_v( 'label_edit_item', $taxonomy, '', true );
680
				$ct_labels['update_item']                = pods_v( 'label_update_item', $taxonomy, '', true );
681
				$ct_labels['view_item']                  = pods_v( 'label_view_item', $taxonomy, '', true );
682
				$ct_labels['add_new_item']               = pods_v( 'label_add_new_item', $taxonomy, '', true );
683
				$ct_labels['new_item_name']              = pods_v( 'label_new_item_name', $taxonomy, '', true );
684
				$ct_labels['separate_items_with_commas'] = pods_v( 'label_separate_items_with_commas', $taxonomy, '', true );
685
				$ct_labels['add_or_remove_items']        = pods_v( 'label_add_or_remove_items', $taxonomy, '', true );
686
				$ct_labels['choose_from_most_used']      = pods_v( 'label_choose_from_the_most_used', $taxonomy, '', true );
687
				$ct_labels['not_found']                  = pods_v( 'label_not_found', $taxonomy, '', true );
688
				$ct_labels['no_terms']                   = pods_v( 'label_no_terms', $taxonomy, '', true );
689
				$ct_labels['items_list']                 = pods_v( 'label_items_list', $taxonomy, '', true );
690
				$ct_labels['items_list_navigation']      = pods_v( 'label_items_list_navigation', $taxonomy, '', true );
691
692
				// Rewrite
693
				$ct_rewrite       = (boolean) pods_var( 'rewrite', $taxonomy, true );
694
				$ct_rewrite_array = array(
695
					'slug'         => pods_var( 'rewrite_custom_slug', $taxonomy, str_replace( '_', '-', $taxonomy_name ), null, true ),
696
					'with_front'   => (boolean) pods_var( 'rewrite_with_front', $taxonomy, true ),
697
					'hierarchical' => (boolean) pods_var( 'rewrite_hierarchical', $taxonomy, (boolean) pods_var( 'hierarchical', $taxonomy, false ) )
698
				);
699
700
				if ( false !== $ct_rewrite ) {
701
					$ct_rewrite = $ct_rewrite_array;
702
				}
703
704
				/**
705
				 * Default tax capabilities
706
				 * @see https://codex.wordpress.org/Function_Reference/register_taxonomy
707
				 */
708
				$capability_type = pods_var( 'capability_type', $taxonomy, 'default' );
709
				$tax_capabilities = array();
710
711
				if ( 'custom' == $capability_type ) {
712
					$capability_type = pods_var( 'capability_type_custom', $taxonomy, 'default' );
713
					if ( ! empty( $capability_type ) && 'default' != $capability_type ) {
714
						$capability_type .=  '_terms';
715
						$tax_capabilities = array(
716
							'manage_terms' => 'manage_' . $capability_type,
717
							'edit_terms'   => 'edit_' . $capability_type,
718
							'delete_terms' => 'delete_' . $capability_type,
719
							'assign_terms' => 'assign_' . $capability_type,
720
						);
721
					}
722
				}
723
724
				// Register Taxonomy
725
				$pods_taxonomies[ $taxonomy_name ] = array(
726
					'label'                 => $ct_label,
727
					'labels'                => $ct_labels,
728
					'public'                => (boolean) pods_var( 'public', $taxonomy, true ),
729
					'show_ui'               => (boolean) pods_var( 'show_ui', $taxonomy, (boolean) pods_var( 'public', $taxonomy, true ) ),
730
					'show_in_menu'          => (boolean) pods_var( 'show_in_menu', $taxonomy, (boolean) pods_var( 'public', $taxonomy, true ) ),
731
					'show_in_nav_menus'     => (boolean) pods_var( 'show_in_nav_menus', $taxonomy, (boolean) pods_var( 'public', $taxonomy, true ) ),
732
					'show_tagcloud'         => (boolean) pods_var( 'show_tagcloud', $taxonomy, (boolean) pods_var( 'show_ui', $taxonomy, (boolean) pods_var( 'public', $taxonomy, true ) ) ),
733
					'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 ) ) ) ),
734
					'show_in_quick_edit'    => (boolean) pods_var( 'show_in_quick_edit', $taxonomy, (boolean) pods_var( 'show_ui', $taxonomy, (boolean) pods_var( 'public', $taxonomy, true ) ) ),
735
					'hierarchical'          => (boolean) pods_var( 'hierarchical', $taxonomy, false ),
736
					//'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...
737
					'capabilities'          => $tax_capabilities,
738
					//'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...
739
					'update_count_callback' => pods_var( 'update_count_callback', $taxonomy, null, null, true ),
740
					'query_var'             => ( false !== (boolean) pods_var( 'query_var', $taxonomy, true ) ? pods_var( 'query_var_string', $taxonomy, $taxonomy_name, null, true ) : false ),
741
					'rewrite'               => $ct_rewrite,
742
					'show_admin_column'     => (boolean) pods_var( 'show_admin_column', $taxonomy, false ),
743
					'sort'                  => (boolean) pods_var( 'sort', $taxonomy, false ),
744
				);
745
746
				if ( is_array( $ct_rewrite ) && ! $pods_taxonomies[ $taxonomy_name ]['query_var'] ) {
747
					$pods_taxonomies[ $taxonomy_name ]['query_var'] = pods_var( 'query_var_string', $taxonomy, $taxonomy_name, null, true );
748
				};
749
750
				// Prevent reserved query_var issues
751
				if ( in_array( $pods_taxonomies[ $taxonomy_name ]['query_var'], $reserved_query_vars ) ) {
752
					$pods_taxonomies[ $taxonomy_name ]['query_var'] = 'taxonomy_' . $pods_taxonomies[ $taxonomy_name ]['query_var'];
753
				}
754
755
				// Integration for Single Value Taxonomy UI
756
				if ( function_exists( 'tax_single_value_meta_box' ) ) {
757
					$pods_taxonomies[ $taxonomy_name ]['single_value'] = (boolean) pods_var( 'single_value', $taxonomy, false );
758
					$pods_taxonomies[ $taxonomy_name ]['required']     = (boolean) pods_var( 'single_value_required', $taxonomy, false );
759
				}
760
761
				// Post Types
762
				$ct_post_types = array();
763
				$_post_types   = get_post_types();
764
				$_post_types   = array_merge_recursive( $_post_types, $pods_post_types );
765
				$ignore        = array( 'revision' );
766
767 View Code Duplication
				foreach ( $_post_types as $post_type => $options ) {
768
					if ( in_array( $post_type, $ignore ) ) {
769
						continue;
770
					}
771
772
					if ( false !== (boolean) pods_var( 'built_in_post_types_' . $post_type, $taxonomy, false ) ) {
773
						$ct_post_types[] = $post_type;
774
775
						if ( isset( $supported_taxonomies[ $post_type ] ) && ! in_array( $taxonomy_name, $supported_taxonomies[ $post_type ] ) ) {
776
							$supported_taxonomies[ $post_type ][] = $taxonomy_name;
777
						}
778
					}
779
				}
780
781
				if ( isset( $supported_post_types[ $taxonomy_name ] ) ) {
782
					$supported_post_types[ $taxonomy_name ] = array_merge( $supported_post_types[ $taxonomy_name ], $ct_post_types );
783
				} else {
784
					$supported_post_types[ $taxonomy_name ] = $ct_post_types;
785
				}
786
			}
787
788
			$pods_post_types = apply_filters( 'pods_wp_post_types', $pods_post_types );
789
			$pods_taxonomies = apply_filters( 'pods_wp_taxonomies', $pods_taxonomies );
790
791
			$supported_post_types = apply_filters( 'pods_wp_supported_post_types', $supported_post_types );
792
			$supported_taxonomies = apply_filters( 'pods_wp_supported_taxonomies', $supported_taxonomies );
793
794
			foreach ( $pods_taxonomies as $taxonomy => $options ) {
795
				$ct_post_types = null;
796
797
				if ( isset( $supported_post_types[ $taxonomy ] ) && ! empty( $supported_post_types[ $taxonomy ] ) ) {
798
					$ct_post_types = $supported_post_types[ $taxonomy ];
799
				}
800
801
				$pods_cpt_ct['taxonomies'][ $taxonomy ] = array(
802
					'post_types' => $ct_post_types,
803
					'options'    => $options
804
				);
805
			}
806
807
			foreach ( $pods_post_types as $post_type => $options ) {
808
				if ( isset( $supported_taxonomies[ $post_type ] ) && ! empty( $supported_taxonomies[ $post_type ] ) ) {
809
					$options['taxonomies'] = $supported_taxonomies[ $post_type ];
810
				}
811
812
				$pods_cpt_ct['post_types'][ $post_type ] = $options;
813
			}
814
815
			pods_transient_set( 'pods_wp_cpt_ct', $pods_cpt_ct );
816
		}
817
818
		foreach ( $pods_cpt_ct['taxonomies'] as $taxonomy => $options ) {
819
			if ( isset( self::$content_types_registered['taxonomies'] ) && in_array( $taxonomy, self::$content_types_registered['taxonomies'] ) ) {
820
				continue;
821
			}
822
823
			$ct_post_types = $options['post_types'];
824
			$options       = $options['options'];
825
826
			$options = apply_filters( 'pods_register_taxonomy_' . $taxonomy, $options, $taxonomy );
827
			$options = apply_filters( 'pods_register_taxonomy', $options, $taxonomy );
828
829
			$options = self::object_label_fix( $options, 'taxonomy' );
830
831
			/**
832
			 * Hide tagcloud compatibility
833
			 * @todo check https://core.trac.wordpress.org/ticket/36964
834
			 * @see wp-admin/edit-tags.php L389
835
			 */
836
			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...
837
				$options['labels']['popular_items'] = null;
838
			}
839
840
			// Max length for taxonomies are 32 characters
841
			$taxonomy = substr( $taxonomy, 0, 32 );
842
843
			// i18n compatibility for plugins that override it
844 View Code Duplication
			if ( is_array( $options['rewrite'] ) && isset( $options['rewrite']['slug'] ) && ! empty( $options['rewrite']['slug'] ) ) {
845
				$options['rewrite']['slug'] = _x( $options['rewrite']['slug'], 'URL taxonomy slug', 'pods' );
846
			}
847
848 View Code Duplication
			if ( 1 == pods_var( 'pods_debug_register', 'get', 0 ) && pods_is_admin( array( 'pods' ) ) ) {
849
				pods_debug( array( $taxonomy, $ct_post_types, $options ) );
850
			}
851
852
			register_taxonomy( $taxonomy, $ct_post_types, $options );
853
854
			if ( ! isset( self::$content_types_registered['taxonomies'] ) ) {
855
				self::$content_types_registered['taxonomies'] = array();
856
			}
857
858
			self::$content_types_registered['taxonomies'][] = $taxonomy;
859
		}
860
861
		foreach ( $pods_cpt_ct['post_types'] as $post_type => $options ) {
862
			if ( isset( self::$content_types_registered['post_types'] ) && in_array( $post_type, self::$content_types_registered['post_types'] ) ) {
863
				continue;
864
			}
865
866
			$options = apply_filters( 'pods_register_post_type_' . $post_type, $options, $post_type );
867
			$options = apply_filters( 'pods_register_post_type', $options, $post_type );
868
869
			$options = self::object_label_fix( $options, 'post_type' );
870
871
			// Max length for post types are 20 characters
872
			$post_type = substr( $post_type, 0, 20 );
873
874
			// i18n compatibility for plugins that override it
875 View Code Duplication
			if ( is_array( $options['rewrite'] ) && isset( $options['rewrite']['slug'] ) && ! empty( $options['rewrite']['slug'] ) ) {
876
				$options['rewrite']['slug'] = _x( $options['rewrite']['slug'], 'URL slug', 'pods' );
877
			}
878
879 View Code Duplication
			if ( 1 == pods_var( 'pods_debug_register', 'get', 0 ) && pods_is_admin( array( 'pods' ) ) ) {
880
				pods_debug( array( $post_type, $options ) );
881
			}
882
883
			register_post_type( $post_type, $options );
884
885
			if ( ! isset( self::$content_types_registered['post_types'] ) ) {
886
				self::$content_types_registered['post_types'] = array();
887
			}
888
889
			self::$content_types_registered['post_types'][] = $post_type;
890
		}
891
892
	}
893
894
	/**
895
	 * Check if we need to flush WordPress rewrite rules
896
	 * This gets run during 'init' action late in the game to give other plugins time to register their rewrite rules
897
	 */
898
	public function flush_rewrite_rules() {
899
900
		$flush = (int) pods_transient_get( 'pods_flush_rewrites' );
901
902
		if ( 1 === $flush ) {
903
			/**
904
			 * @var $wp_rewrite WP_Rewrite
905
			 */
906
			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...
907
			$wp_rewrite->flush_rules();
908
			$wp_rewrite->init();
909
910
			pods_transient_set( 'pods_flush_rewrites', 0 );
911
		}
912
	}
913
914
	/**
915
	 * Update Post Type messages
916
	 *
917
	 * @param array $messages
918
	 *
919
	 * @return array
920
	 * @since 2.0.2
921
	 */
922
	public function setup_updated_messages( $messages ) {
923
924
		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...
925
926
		$post_types          = PodsMeta::$post_types;
927
		$existing_post_types = get_post_types();
928
929
		$pods_cpt_ct = pods_transient_get( 'pods_wp_cpt_ct' );
930
931
		if ( empty( $pods_cpt_ct ) || empty( $post_types ) ) {
932
			return $messages;
933
		}
934
935
		foreach ( $post_types as $post_type ) {
936
			if ( ! isset( $pods_cpt_ct['post_types'][ $post_type['name'] ] ) ) {
937
				continue;
938
			}
939
940
			$labels = self::object_label_fix( $pods_cpt_ct['post_types'][ $post_type['name'] ], 'post_type' );
941
			$labels = $labels['labels'];
942
943
			$messages[ $post_type['name'] ] = array(
944
				1  => sprintf( __( '%s updated. <a href="%s">%s</a>', 'pods' ), $labels['singular_name'], esc_url( get_permalink( $post_ID ) ), $labels['view_item'] ),
945
				2  => __( 'Custom field updated.', 'pods' ),
946
				3  => __( 'Custom field deleted.', 'pods' ),
947
				4  => sprintf( __( '%s updated.', 'pods' ), $labels['singular_name'] ),
948
				/* translators: %s: date and time of the revision */
949
				5  => isset( $_GET['revision'] ) ? sprintf( __( '%s restored to revision from %s', 'pods' ), $labels['singular_name'], wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
950
				6  => sprintf( __( '%s published. <a href="%s">%s</a>', 'pods' ), $labels['singular_name'], esc_url( get_permalink( $post_ID ) ), $labels['view_item'] ),
951
				7  => sprintf( __( '%s saved.', 'pods' ), $labels['singular_name'] ),
952
				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'] ),
953
				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
954
					date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink( $post_ID ) ), $labels['singular_name'] ),
955
				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'] )
956
			);
957
958
			if ( false === (boolean) $pods_cpt_ct['post_types'][ $post_type['name'] ]['public'] ) {
959
				$messages[ $post_type['name'] ][1]  = sprintf( __( '%s updated.', 'pods' ), $labels['singular_name'] );
960
				$messages[ $post_type['name'] ][6]  = sprintf( __( '%s published.', 'pods' ), $labels['singular_name'] );
961
				$messages[ $post_type['name'] ][8]  = sprintf( __( '%s submitted.', 'pods' ), $labels['singular_name'] );
962
				$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
963
					date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ) );
964
				$messages[ $post_type['name'] ][10] = sprintf( __( '%s draft updated.', 'pods' ), $labels['singular_name'] );
965
			}
966
		}
967
968
		return $messages;
969
	}
970
971
	/**
972
	 * @param        $args
973
	 * @param string $type
974
	 *
975
	 * @return array
976
	 */
977
	public static function object_label_fix( $args, $type = 'post_type' ) {
978
979
		if ( empty( $args ) || ! is_array( $args ) ) {
980
			$args = array();
981
		}
982
983
		if ( ! isset( $args['labels'] ) || ! is_array( $args['labels'] ) ) {
984
			$args['labels'] = array();
985
		}
986
987
		$label          = pods_v( 'name', $args['labels'], pods_v( 'label', $args, __( 'Items', 'pods' ), true ), true );
988
		$singular_label = pods_v( 'singular_name', $args['labels'], pods_v( 'label_singular', $args, __( 'Item', 'pods' ), true ), true );
989
990
		$labels = $args['labels'];
991
992
		$labels['name']          = $label;
993
		$labels['singular_name'] = $singular_label;
994
995
		if ( 'post_type' == $type ) {
996
			$labels['menu_name']             = pods_v( 'menu_name', $labels, $label, true );
997
			$labels['name_admin_bar']        = pods_v( 'name_admin_bar', $labels, $singular_label, true );
998
			$labels['add_new']               = pods_v( 'add_new', $labels, __( 'Add New', 'pods' ), true );
999
			$labels['add_new_item']          = pods_v( 'add_new_item', $labels, sprintf( __( 'Add New %s', 'pods' ), $singular_label ), true );
1000
			$labels['new_item']              = pods_v( 'new_item', $labels, sprintf( __( 'New %s', 'pods' ), $singular_label ), true );
1001
			$labels['edit']                  = pods_v( 'edit', $labels, __( 'Edit', 'pods' ), true );
1002
			$labels['edit_item']             = pods_v( 'edit_item', $labels, sprintf( __( 'Edit %s', 'pods' ), $singular_label ), true );
1003
			$labels['view']                  = pods_v( 'view', $labels, sprintf( __( 'View %s', 'pods' ), $singular_label ), true );
1004
			$labels['view_item']             = pods_v( 'view_item', $labels, sprintf( __( 'View %s', 'pods' ), $singular_label ), true );
1005
			$labels['view_items']            = pods_v( 'view_items', $labels, sprintf( __( 'View %s', 'pods' ), $label ), true );
1006
			$labels['all_items']             = pods_v( 'all_items', $labels, sprintf( __( 'All %s', 'pods' ), $label ), true );
1007
			$labels['search_items']          = pods_v( 'search_items', $labels, sprintf( __( 'Search %s', 'pods' ), $label ), true );
1008
			$labels['not_found']             = pods_v( 'not_found', $labels, sprintf( __( 'No %s Found', 'pods' ), $label ), true );
1009
			$labels['not_found_in_trash']    = pods_v( 'not_found_in_trash', $labels, sprintf( __( 'No %s Found in Trash', 'pods' ), $label ), true );
1010
			$labels['parent']                = pods_v( 'parent', $labels, sprintf( __( 'Parent %s', 'pods' ), $singular_label ), true );
1011
			$labels['parent_item_colon']     = pods_v( 'parent_item_colon', $labels, sprintf( __( 'Parent %s:', 'pods' ), $singular_label ), true );
1012
			$labels['featured_image']        = pods_v( 'featured_image', $labels, __( 'Featured Image', 'pods' ), true );
1013
			$labels['set_featured_image']    = pods_v( 'set_featured_image', $labels, __( 'Set featured image', 'pods' ), true );
1014
			$labels['remove_featured_image'] = pods_v( 'remove_featured_image', $labels, __( 'Remove featured image', 'pods' ), true );
1015
			$labels['use_featured_image']    = pods_v( 'use_featured_image', $labels, __( 'Use as featured image', 'pods' ), true );
1016
			$labels['archives']              = pods_v( 'archives', $labels, sprintf( __( '%s Archives', 'pods' ), $singular_label ), true );
1017
			$labels['attributes']            = pods_v( 'attributes', $labels, sprintf( __( '%s Attributes', 'pods' ), $singular_label ), true );
1018
			$labels['insert_into_item']      = pods_v( 'insert_into_item', $labels, sprintf( __( 'Insert into %s', 'pods' ), $singular_label ), true );
1019
			$labels['uploaded_to_this_item'] = pods_v( 'uploaded_to_this_item', $labels, sprintf( __( 'Uploaded to this %s', 'pods' ), $singular_label ), true );
1020
			$labels['filter_items_list']     = pods_v( 'filter_items_list', $labels, sprintf( __( 'Filter %s lists', 'pods' ), $label ), true );
1021
			$labels['items_list_navigation'] = pods_v( 'items_list_navigation', $labels, sprintf( __( '%s navigation', 'pods' ), $label ), true );
1022
			$labels['items_list']            = pods_v( 'items_list', $labels, sprintf( __( '%s list', 'pods' ), $label ), true );
1023
		} elseif ( 'taxonomy' == $type ) {
1024
			$labels['menu_name']                  = pods_v( 'menu_name', $labels, $label, true );
1025
			$labels['search_items']               = pods_v( 'search_items', $labels, sprintf( __( 'Search %s', 'pods' ), $label ), true );
1026
			$labels['popular_items']              = pods_v( 'popular_items', $labels, sprintf( __( 'Popular %s', 'pods' ), $label ), true );
1027
			$labels['all_items']                  = pods_v( 'all_items', $labels, sprintf( __( 'All %s', 'pods' ), $label ), true );
1028
			$labels['parent_item']                = pods_v( 'parent_item', $labels, sprintf( __( 'Parent %s', 'pods' ), $singular_label ), true );
1029
			$labels['parent_item_colon']          = pods_v( 'parent_item_colon', $labels, sprintf( __( 'Parent %s :', 'pods' ), $singular_label ), true );
1030
			$labels['edit_item']                  = pods_v( 'edit_item', $labels, sprintf( __( 'Edit %s', 'pods' ), $singular_label ), true );
1031
			$labels['view_item']                  = pods_v( 'view_item', $labels, sprintf( __( 'View %s', 'pods' ), $singular_label ), true );
1032
			$labels['update_item']                = pods_v( 'update_item', $labels, sprintf( __( 'Update %s', 'pods' ), $singular_label ), true );
1033
			$labels['add_new_item']               = pods_v( 'add_new_item', $labels, sprintf( __( 'Add New %s', 'pods' ), $singular_label ), true );
1034
			$labels['new_item_name']              = pods_v( 'new_item_name', $labels, sprintf( __( 'New %s Name', 'pods' ), $singular_label ), true );
1035
			$labels['separate_items_with_commas'] = pods_v( 'separate_items_with_commas', $labels, sprintf( __( 'Separate %s with commas', 'pods' ), $label ), true );
1036
			$labels['add_or_remove_items']        = pods_v( 'add_or_remove_items', $labels, sprintf( __( 'Add or remove %s', 'pods' ), $label ), true );
1037
			$labels['choose_from_most_used']      = pods_v( 'choose_from_most_used', $labels, sprintf( __( 'Choose from the most used %s', 'pods' ), $label ), true );
1038
			$labels['not_found']                  = pods_v( 'not_found', $labels, sprintf( __( 'No %s found.', 'pods' ), $label ), true );
1039
			$labels['no_terms']                   = pods_v( 'no_terms', $labels, sprintf( __( 'No %s', 'pods' ), $label ), true );
1040
			$labels['items_list_navigation']      = pods_v( 'items_list_navigation', $labels, sprintf( __( '%s navigation', 'pods' ), $label ), true );
1041
			$labels['items_list']                 = pods_v( 'items_list', $labels, sprintf( __( '%s list', 'pods' ), $label ), true );
1042
		}
1043
1044
		$args['labels'] = $labels;
1045
1046
		return $args;
1047
	}
1048
1049
	/**
1050
	 * Activate and Install
1051
	 */
1052
	public function activate_install() {
1053
1054
		register_activation_hook( PODS_DIR . 'init.php', array( $this, 'activate' ) );
1055
		register_deactivation_hook( PODS_DIR . 'init.php', array( $this, 'deactivate' ) );
1056
1057
		add_action( 'wpmu_new_blog', array( $this, 'new_blog' ), 10, 6 );
1058
1059
		if ( empty( self::$version ) || version_compare( self::$version, PODS_VERSION, '<' ) || version_compare( self::$version, PODS_DB_VERSION, '<=' ) || self::$upgrade_needed ) {
1060
			$this->setup();
1061
		} elseif ( self::$version !== PODS_VERSION ) {
1062
			delete_option( 'pods_framework_version' );
1063
			add_option( 'pods_framework_version', PODS_VERSION, '', 'yes' );
1064
1065
			self::$version = PODS_VERSION;
1066
1067
			pods_api()->cache_flush_pods();
1068
		}
1069
1070
	}
1071
1072
	/**
1073
	 *
1074
	 */
1075
	public function activate() {
1076
1077
		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...
1078
1079
		if ( function_exists( 'is_multisite' ) && is_multisite() && isset( $_GET['networkwide'] ) && 1 == $_GET['networkwide'] ) {
1080
			$_blog_ids = $wpdb->get_col( "SELECT `blog_id` FROM `{$wpdb->blogs}`" );
1081
1082
			foreach ( $_blog_ids as $_blog_id ) {
1083
				$this->setup( $_blog_id );
1084
			}
1085
		} else {
1086
			$this->setup();
1087
		}
1088
	}
1089
1090
	/**
1091
	 *
1092
	 */
1093
	public function deactivate() {
1094
1095
		pods_api()->cache_flush_pods();
1096
1097
	}
1098
1099
	/**
1100
	 *
1101
	 */
1102
	public function needs_upgrade( $current = null, $last = null ) {
1103
1104
		if ( null === $current ) {
1105
			$current = self::$version;
1106
		}
1107
1108
		if ( null === $last ) {
1109
			$last = self::$version_last;
1110
		}
1111
1112
		$upgrade_needed = false;
1113
1114
		if ( ! empty( $current ) ) {
1115
			foreach ( self::$upgrades as $old_version => $new_version ) {
1116
				/*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...
1117
					continue;*/
1118
1119
				if ( version_compare( $last, $old_version, '>=' ) && version_compare( $last, $new_version, '<' ) && version_compare( $current, $new_version, '>=' ) && 1 != self::$upgraded ) {
1120
					$upgrade_needed = true;
1121
1122
					break;
1123
				}
1124
			}
1125
		}
1126
1127
		return $upgrade_needed;
1128
	}
1129
1130
	/**
1131
	 * @param $_blog_id
1132
	 * @param $user_id
1133
	 * @param $domain
1134
	 * @param $path
1135
	 * @param $site_id
1136
	 * @param $meta
1137
	 */
1138
	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...
1139
1140
		if ( function_exists( 'is_multisite' ) && is_multisite() && is_plugin_active_for_network( basename( PODS_DIR ) . '/init.php' ) ) {
1141
			$this->setup( $_blog_id );
1142
		}
1143
	}
1144
1145
	/**
1146
	 * @param null $_blog_id
1147
	 */
1148
	public function setup( $_blog_id = null ) {
1149
1150
		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...
1151
1152
		// Switch DB table prefixes
1153 View Code Duplication
		if ( null !== $_blog_id && $_blog_id != $wpdb->blogid ) {
1154
			switch_to_blog( pods_absint( $_blog_id ) );
1155
		} else {
1156
			$_blog_id = null;
1157
		}
1158
1159
		// Setup DB tables
1160
		$pods_version      = get_option( 'pods_framework_version' );
1161
		$pods_version_last = get_option( 'pods_framework_version_last' );
1162
1163
		// Install Pods
1164
		if ( empty( $pods_version ) ) {
1165
			pods_upgrade()->install( $_blog_id );
1166
1167
			$old_version = get_option( 'pods_version' );
1168
1169
			if ( ! empty( $old_version ) ) {
1170
				if ( false === strpos( $old_version, '.' ) ) {
1171
					$old_version = pods_version_to_point( $old_version );
1172
				}
1173
1174
				delete_option( 'pods_framework_version_last' );
1175
				add_option( 'pods_framework_version_last', $pods_version, '', 'yes' );
1176
1177
				self::$version_last = $old_version;
1178
			}
1179
		} // Upgrade Wizard needed
1180
		elseif ( $this->needs_upgrade( $pods_version, $pods_version_last ) ) {
1181
			// Do not do anything
1182
			return;
1183
		} // Update Pods and run any required DB updates
1184
		elseif ( version_compare( $pods_version, PODS_VERSION, '<=' ) ) {
1185
			if ( false !== apply_filters( 'pods_update_run', null, PODS_VERSION, $pods_version, $_blog_id ) && ! isset( $_GET['pods_bypass_update'] ) ) {
1186
				do_action( 'pods_update', PODS_VERSION, $pods_version, $_blog_id );
1187
1188
				// Update 2.0 alpha / beta sites
1189
				if ( version_compare( '2.0.0-a-1', $pods_version, '<=' ) && version_compare( $pods_version, '2.0.0-b-15', '<=' ) ) {
1190
					include( PODS_DIR . 'sql/update-2.0-beta.php' );
1191
				}
1192
1193
				if ( version_compare( $pods_version, PODS_DB_VERSION, '<=' ) ) {
1194
					include( PODS_DIR . 'sql/update.php' );
1195
				}
1196
1197
				do_action( 'pods_update_post', PODS_VERSION, $pods_version, $_blog_id );
1198
			}
1199
1200
			delete_option( 'pods_framework_version_last' );
1201
			add_option( 'pods_framework_version_last', $pods_version, '', 'yes' );
1202
1203
			self::$version_last = $pods_version;
1204
		}
1205
1206
		delete_option( 'pods_framework_version' );
1207
		add_option( 'pods_framework_version', PODS_VERSION, '', 'yes' );
1208
1209
		delete_option( 'pods_framework_db_version' );
1210
		add_option( 'pods_framework_db_version', PODS_DB_VERSION, '', 'yes' );
1211
1212
		self::$version = PODS_VERSION;
1213
		self::$db_version = PODS_DB_VERSION;
1214
1215
		pods_api()->cache_flush_pods();
1216
1217
		// Restore DB table prefix (if switched)
1218
		if ( null !== $_blog_id ) {
1219
			restore_current_blog();
1220
		}
1221
1222
	}
1223
1224
	/**
1225
	 * @param null $_blog_id
1226
	 */
1227
	public function reset( $_blog_id = null ) {
1228
1229
		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...
1230
1231
		// Switch DB table prefixes
1232 View Code Duplication
		if ( null !== $_blog_id && $_blog_id != $wpdb->blogid ) {
1233
			switch_to_blog( pods_absint( $_blog_id ) );
1234
		} else {
1235
			$_blog_id = null;
1236
		}
1237
1238
		$api = pods_api();
1239
1240
		$pods = $api->load_pods( array( 'names_ids' => true, 'table_info' => false ) );
1241
1242
		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...
1243
			$api->delete_pod( array( 'id' => $pod_id ) );
1244
		}
1245
1246
		$templates = $api->load_templates();
1247
1248
		foreach ( $templates as $template ) {
1249
			$api->delete_template( array( 'id' => $template['id'] ) );
1250
		}
1251
1252
		$pages = $api->load_pages();
1253
1254
		foreach ( $pages as $page ) {
1255
			$api->delete_page( array( 'id' => $page['id'] ) );
1256
		}
1257
1258
		$helpers = $api->load_helpers();
1259
1260
		foreach ( $helpers as $helper ) {
1261
			$api->delete_helper( array( 'id' => $helper['id'] ) );
1262
		}
1263
1264
		$tables = $wpdb->get_results( "SHOW TABLES LIKE '{$wpdb->prefix}pods%'", ARRAY_N );
1265
1266
		if ( ! empty( $tables ) ) {
1267
			foreach ( $tables as $table ) {
1268
				$table = $table[0];
1269
1270
				pods_query( "DROP TABLE `{$table}`", false );
1271
			}
1272
		}
1273
1274
		// Remove any orphans
1275
		$wpdb->query( "
1276
                DELETE `p`, `pm`
1277
                FROM `{$wpdb->posts}` AS `p`
1278
                LEFT JOIN `{$wpdb->postmeta}` AS `pm`
1279
                    ON `pm`.`post_id` = `p`.`ID`
1280
                WHERE
1281
                    `p`.`post_type` LIKE '_pods_%'
1282
            " );
1283
1284
		delete_option( 'pods_framework_version' );
1285
		delete_option( 'pods_framework_db_version' );
1286
		delete_option( 'pods_framework_upgrade_2_0' );
1287
		delete_option( 'pods_framework_upgraded_1_x' );
1288
1289
		// @todo Make sure all entries are being cleaned and do something about the pods_framework_upgrade_{version} dynamic entries created by PodsUpgrade
1290
		delete_option( 'pods_framework_upgrade_2_0_0' );
1291
		delete_option( 'pods_framework_upgrade_2_0_sister_ids' );
1292
		delete_option( 'pods_framework_version_last' );
1293
1294
		delete_option( 'pods_component_settings' );
1295
1296
		$api->cache_flush_pods();
1297
1298
		pods_transient_clear( 'pods_flush_rewrites' );
1299
1300
		self::$version = '';
1301
1302
		// Restore DB table prefix (if switched)
1303
		if ( null !== $_blog_id ) {
1304
			restore_current_blog();
1305
		}
1306
	}
1307
1308
	public function run() {
1309
1310
		static $ran;
1311
1312
		if ( ! empty( $ran ) ) {
1313
			return;
1314
		}
1315
1316
		$ran = true;
1317
1318
		$this->load_i18n();
1319
1320
		if ( ! did_action( 'plugins_loaded' ) ) {
1321
			add_action( 'plugins_loaded', array( $this, 'load_components' ), 11 );
1322
		} else {
1323
			$this->load_components();
1324
		}
1325
1326
		if ( ! did_action( 'setup_theme' ) ) {
1327
			add_action( 'setup_theme', array( $this, 'load_meta' ), 14 );
1328
		} else {
1329
			$this->load_meta();
1330
		}
1331
1332
		if ( ! did_action( 'init' ) ) {
1333
			add_action( 'init', array( $this, 'core' ), 11 );
1334
			add_action( 'init', array( $this, 'add_rest_support' ), 12 );
1335
			add_action( 'init', array( $this, 'setup_content_types' ), 11 );
1336
1337
			if ( is_admin() ) {
1338
				add_action( 'init', array( $this, 'admin_init' ), 12 );
1339
			}
1340
		} else {
1341
			$this->core();
1342
			$this->add_rest_support();
1343
			$this->setup_content_types();
1344
1345
			if ( is_admin() ) {
1346
				$this->admin_init();
1347
			}
1348
		}
1349
1350
		add_action( 'wp_enqueue_scripts', array( $this, 'register_assets' ), 15 );
1351
		add_action( 'admin_enqueue_scripts', array( $this, 'register_assets' ), 15 );
1352
		add_action( 'login_enqueue_scripts', array( $this, 'register_assets' ), 15 );
1353
1354
		add_filter( 'post_updated_messages', array( $this, 'setup_updated_messages' ), 10, 1 );
1355
		add_action( 'delete_attachment', array( $this, 'delete_attachment' ) );
1356
1357
		// Register widgets
1358
		add_action( 'widgets_init', array( $this, 'register_widgets' ) );
1359
1360
		// Show admin bar links
1361
		add_action( 'admin_bar_menu', array( $this, 'admin_bar_links' ), 81 );
1362
1363
	}
1364
1365
	/**
1366
	 * Delete Attachments from relationships
1367
	 *
1368
	 * @param int $_ID
1369
	 */
1370
	public function delete_attachment( $_ID ) {
1371
1372
		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...
1373
1374
		$_ID = (int) $_ID;
1375
1376
		do_action( 'pods_delete_attachment', $_ID );
1377
1378
		$file_types = "'" . implode( "', '", PodsForm::file_field_types() ) . "'";
1379
1380
		if ( ! pods_tableless() ) {
1381
			$sql = "
1382
                DELETE `rel`
1383
                FROM `@wp_podsrel` AS `rel`
1384
                LEFT JOIN `{$wpdb->posts}` AS `p`
1385
                    ON
1386
                        `p`.`post_type` = '_pods_field'
1387
                        AND ( `p`.`ID` = `rel`.`field_id` OR `p`.`ID` = `rel`.`related_field_id` )
1388
                LEFT JOIN `{$wpdb->postmeta}` AS `pm`
1389
                    ON
1390
                        `pm`.`post_id` = `p`.`ID`
1391
                        AND `pm`.`meta_key` = 'type'
1392
                        AND `pm`.`meta_value` IN ( {$file_types} )
1393
                WHERE
1394
                    `p`.`ID` IS NOT NULL
1395
                    AND `pm`.`meta_id` IS NOT NULL
1396
                    AND `rel`.`item_id` = {$_ID}";
1397
1398
			pods_query( $sql, false );
1399
		}
1400
1401
		// Post Meta
1402 View Code Duplication
		if ( ! empty( PodsMeta::$post_types ) ) {
1403
			$sql = "
1404
                DELETE `rel`
1405
                FROM `@wp_postmeta` AS `rel`
1406
                LEFT JOIN `{$wpdb->posts}` AS `p`
1407
                    ON
1408
                        `p`.`post_type` = '_pods_field'
1409
                LEFT JOIN `{$wpdb->postmeta}` AS `pm`
1410
                    ON
1411
                        `pm`.`post_id` = `p`.`ID`
1412
                        AND `pm`.`meta_key` = 'type'
1413
                        AND `pm`.`meta_value` IN ( {$file_types} )
1414
                WHERE
1415
                    `p`.`ID` IS NOT NULL
1416
                    AND `pm`.`meta_id` IS NOT NULL
1417
                    AND `rel`.`meta_key` = `p`.`post_name`
1418
                    AND `rel`.`meta_value` = '{$_ID}'";
1419
1420
			pods_query( $sql, false );
1421
		}
1422
1423
		// User Meta
1424 View Code Duplication
		if ( ! empty( PodsMeta::$user ) ) {
1425
			$sql = "
1426
                DELETE `rel`
1427
                FROM `@wp_usermeta` AS `rel`
1428
                LEFT JOIN `{$wpdb->posts}` AS `p`
1429
                    ON
1430
                        `p`.`post_type` = '_pods_field'
1431
                LEFT JOIN `{$wpdb->postmeta}` AS `pm`
1432
                    ON
1433
                        `pm`.`post_id` = `p`.`ID`
1434
                        AND `pm`.`meta_key` = 'type'
1435
                        AND `pm`.`meta_value` IN ( {$file_types} )
1436
                WHERE
1437
                    `p`.`ID` IS NOT NULL
1438
                    AND `pm`.`meta_id` IS NOT NULL
1439
                    AND `rel`.`meta_key` = `p`.`post_name`
1440
                    AND `rel`.`meta_value` = '{$_ID}'";
1441
1442
			pods_query( $sql, false );
1443
		}
1444
1445
		// Comment Meta
1446 View Code Duplication
		if ( ! empty( PodsMeta::$comment ) ) {
1447
			$sql = "
1448
                DELETE `rel`
1449
                FROM `@wp_commentmeta` AS `rel`
1450
                LEFT JOIN `{$wpdb->posts}` AS `p`
1451
                    ON
1452
                        `p`.`post_type` = '_pods_field'
1453
                LEFT JOIN `{$wpdb->postmeta}` AS `pm`
1454
                    ON
1455
                        `pm`.`post_id` = `p`.`ID`
1456
                        AND `pm`.`meta_key` = 'type'
1457
                        AND `pm`.`meta_value` IN ( {$file_types} )
1458
                WHERE
1459
                    `p`.`ID` IS NOT NULL
1460
                    AND `pm`.`meta_id` IS NOT NULL
1461
                    AND `rel`.`meta_key` = `p`.`post_name`
1462
                    AND `rel`.`meta_value` = '{$_ID}'";
1463
1464
			pods_query( $sql, false );
1465
		}
1466
	}
1467
1468
	/**
1469
	 * Register widgets for Pods
1470
	 */
1471
	public function register_widgets() {
1472
1473
		$widgets = array(
1474
			'PodsWidgetSingle',
1475
			'PodsWidgetList',
1476
			'PodsWidgetField',
1477
			'PodsWidgetForm',
1478
			'PodsWidgetView'
1479
		);
1480
1481
		foreach ( $widgets as $widget ) {
1482
			if ( ! file_exists( PODS_DIR . 'classes/widgets/' . $widget . '.php' ) ) {
1483
				continue;
1484
			}
1485
1486
			require_once PODS_DIR . 'classes/widgets/' . $widget . '.php';
1487
1488
			register_widget( $widget );
1489
		}
1490
	}
1491
1492
	/**
1493
	 * Add Admin Bar links
1494
	 */
1495
	public function admin_bar_links() {
1496
1497
		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...
1498
1499
		if ( ! is_user_logged_in() || ! is_admin_bar_showing() ) {
1500
			return;
1501
		}
1502
1503
		$all_pods = pods_api()->load_pods( array( 'type' => 'pod', 'fields' => false, 'table_info' => false ) );
1504
1505
		// Add New item links for all pods
1506
		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...
1507
			if ( 0 == $pod['options']['show_in_menu'] ) {
1508
				continue;
1509
			}
1510
1511
			if ( ! pods_is_admin( array( 'pods', 'pods_content', 'pods_add_' . $pod['name'] ) ) ) {
1512
				continue;
1513
			}
1514
1515
			$singular_label = pods_var_raw( 'label_singular', $pod['options'], pods_var_raw( 'label', $pod, ucwords( str_replace( '_', ' ', $pod['name'] ) ), null, true ), null, true );
1516
1517
			$wp_admin_bar->add_node( array(
1518
				'id'     => 'new-pod-' . $pod['name'],
1519
				'title'  => $singular_label,
1520
				'parent' => 'new-content',
1521
				'href'   => admin_url( 'admin.php?page=pods-manage-' . $pod['name'] . '&action=add' )
1522
			) );
1523
		}
1524
1525
		// Add edit link if we're on a pods page
1526
		if ( is_object( $pods ) && ! is_wp_error( $pods ) && ! empty( $pods->id ) && isset( $pods->pod_data ) && ! empty( $pods->pod_data ) && 'pod' == $pods->pod_data['type'] ) {
1527
			$pod = $pods->pod_data;
1528
1529
			if ( pods_is_admin( array( 'pods', 'pods_content', 'pods_edit_' . $pod['name'] ) ) ) {
1530
				$singular_label = pods_var_raw( 'label_singular', $pod['options'], pods_var_raw( 'label', $pod, ucwords( str_replace( '_', ' ', $pod['name'] ) ), null, true ), null, true );
1531
1532
				$wp_admin_bar->add_node( array(
1533
					'title' => sprintf( __( 'Edit %s', 'pods' ), $singular_label ),
1534
					'id'    => 'edit-pod',
1535
					'href'  => admin_url( 'admin.php?page=pods-manage-' . $pod['name'] . '&action=edit&id=' . $pods->id() )
1536
				) );
1537
			}
1538
		}
1539
1540
	}
1541
1542
	/**
1543
	 * Add REST API support to post type and taxonomy objects.
1544
	 *
1545
	 * @uses  "init"
1546
	 *
1547
	 * @since 2.5.6
1548
	 */
1549
	public function add_rest_support() {
1550
1551
		if ( empty( self::$version ) ) {
1552
			return;
1553
		}
1554
1555
		static $rest_support_added;
1556
1557
		if ( ! function_exists( 'register_rest_field' ) ) {
1558
			return;
1559
		}
1560
1561
		include_once( PODS_DIR . 'classes/PodsRESTFields.php' );
1562
		include_once( PODS_DIR . 'classes/PodsRESTHandlers.php' );
1563
1564
		$rest_bases = pods_transient_get( 'pods_rest_bases' );
1565
1566
		if ( empty( $rest_bases ) ) {
1567
	        $pods = pods_api()->load_pods( array( 'type' => array( 'post_type', 'taxonomy', 'user', 'media', 'comment' ), 'fields' => false, 'table_info' => false ) );
1568
1569
			$rest_bases = array();
1570
1571
			if ( ! empty( $pods ) && is_array( $pods ) ) {
1572
				foreach ( $pods as $pod ) {
1573
					$type = $pod['type'];
1574
1575
					if ( in_array( $type, array( 'post_type', 'taxonomy', 'user', 'media', 'comment' ) ) ) {
1576
						if ( $pod && PodsRESTHandlers::pod_extends_core_route( $pod ) ) {
1577
							$rest_bases[ $pod['name'] ] = array(
1578
								'type' => $type,
1579
								'base' => sanitize_title( pods_v( 'rest_base', $pod['options'], $pod['name'] ) ),
1580
							);
1581
						}
1582
					}
1583
				}
1584
			}
1585
1586
			if ( empty( $rest_bases ) ) {
1587
				$rest_bases = 'none';
1588
			}
1589
1590
			pods_transient_set( 'pods_rest_bases', $rest_bases );
1591
		}
1592
1593
		if ( empty( $rest_support_added ) && ! empty( $rest_bases ) && 'none' !== $rest_bases ) {
1594
			foreach ( $rest_bases as $pod_name => $pod_info ) {
1595
				$pod_type  = $pod_info['type'];
1596
				$rest_base = $pod_info['base'];
1597
1598
				if ( 'post_type' == $pod_type ) {
1599
					PodsRESTHandlers::post_type_rest_support( $pod_name, $rest_base );
1600
				} elseif ( 'taxonomy' == $pod_type ) {
1601
					PodsRESTHandlers::taxonomy_rest_support( $pod_name, $rest_base );
1602
				}
1603
1604
				new PodsRESTFields( $pod_name );
1605
			}
1606
1607
			$rest_support_added = true;
1608
		}
1609
1610
	}
1611
}
1612