Completed
Pull Request — 2.x (#4108)
by Scott Kingsley
05:31
created

PodsInit   D

Complexity

Total Complexity 244

Size/Duplication

Total Lines 1627
Duplicated Lines 6.76 %

Coupling/Cohesion

Components 2
Dependencies 6

Importance

Changes 0
Metric Value
dl 110
loc 1627
rs 4.4102
c 0
b 0
f 0
wmc 244
lcom 2
cbo 6

26 Methods

Rating   Name   Duplication   Size   Complexity  
A init() 0 8 2
B __construct() 0 31 5
A load_components() 0 11 4
A load_meta() 0 4 1
C core() 0 59 12
A plugins_loaded() 0 13 3
A load_i18n() 0 4 1
B register_assets() 0 78 6
B register_pods() 0 38 1
A admin_init() 0 4 1
F setup_content_types() 42 529 97
A flush_rewrite_rules() 0 15 2
C setup_updated_messages() 0 48 7
C object_label_fix() 0 71 7
B activate_install() 0 19 6
B activate() 0 14 6
A deactivate() 0 5 1
D needs_upgrade() 0 27 9
A new_blog() 0 6 4
C setup() 4 75 14
C reset() 4 80 10
B run() 0 56 7
B delete_attachment() 60 97 5
A register_widgets() 0 20 3
C admin_bar_links() 0 46 13
C add_rest_support() 0 62 17

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like PodsInit often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use PodsInit, and based on these observations, apply Extract Interface, too.

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