Completed
Pull Request — 2.x (#3632)
by Phil
04:46
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 .=  '_term';
715
						$capability_type_plural =  $capability_type . 's';
716
						$tax_capabilities = array(
717
							// Singular
718
							'edit_term'   => 'edit_' . $capability_type,
719
							'delete_term' => 'delete_' . $capability_type,
720
							'assign_term' => 'assign_' . $capability_type,
721
							// Plural
722
							'manage_terms' => 'manage_' . $capability_type_plural,
723
							'edit_terms'   => 'edit_' . $capability_type_plural,
724
							'delete_terms' => 'delete_' . $capability_type_plural,
725
							'assign_terms' => 'assign_' . $capability_type_plural,
726
						);
727
					}
728
				}
729
730
				// Register Taxonomy
731
				$pods_taxonomies[ $taxonomy_name ] = array(
732
					'label'                 => $ct_label,
733
					'labels'                => $ct_labels,
734
					'public'                => (boolean) pods_var( 'public', $taxonomy, true ),
735
					'show_ui'               => (boolean) pods_var( 'show_ui', $taxonomy, (boolean) pods_var( 'public', $taxonomy, true ) ),
736
					'show_in_menu'          => (boolean) pods_var( 'show_in_menu', $taxonomy, (boolean) pods_var( 'public', $taxonomy, true ) ),
737
					'show_in_nav_menus'     => (boolean) pods_var( 'show_in_nav_menus', $taxonomy, (boolean) pods_var( 'public', $taxonomy, true ) ),
738
					'show_tagcloud'         => (boolean) pods_var( 'show_tagcloud', $taxonomy, (boolean) pods_var( 'show_ui', $taxonomy, (boolean) pods_var( 'public', $taxonomy, true ) ) ),
739
					'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 ) ) ) ),
740
					'show_in_quick_edit'    => (boolean) pods_var( 'show_in_quick_edit', $taxonomy, (boolean) pods_var( 'show_ui', $taxonomy, (boolean) pods_var( 'public', $taxonomy, true ) ) ),
741
					'hierarchical'          => (boolean) pods_var( 'hierarchical', $taxonomy, false ),
742
					//'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...
743
					'capabilities'          => $tax_capabilities,
744
					//'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...
745
					'update_count_callback' => pods_var( 'update_count_callback', $taxonomy, null, null, true ),
746
					'query_var'             => ( false !== (boolean) pods_var( 'query_var', $taxonomy, true ) ? pods_var( 'query_var_string', $taxonomy, $taxonomy_name, null, true ) : false ),
747
					'rewrite'               => $ct_rewrite,
748
					'show_admin_column'     => (boolean) pods_var( 'show_admin_column', $taxonomy, false ),
749
					'sort'                  => (boolean) pods_var( 'sort', $taxonomy, false ),
750
				);
751
752
				if ( is_array( $ct_rewrite ) && ! $pods_taxonomies[ $taxonomy_name ]['query_var'] ) {
753
					$pods_taxonomies[ $taxonomy_name ]['query_var'] = pods_var( 'query_var_string', $taxonomy, $taxonomy_name, null, true );
754
				};
755
756
				// Prevent reserved query_var issues
757
				if ( in_array( $pods_taxonomies[ $taxonomy_name ]['query_var'], $reserved_query_vars ) ) {
758
					$pods_taxonomies[ $taxonomy_name ]['query_var'] = 'taxonomy_' . $pods_taxonomies[ $taxonomy_name ]['query_var'];
759
				}
760
761
				// Integration for Single Value Taxonomy UI
762
				if ( function_exists( 'tax_single_value_meta_box' ) ) {
763
					$pods_taxonomies[ $taxonomy_name ]['single_value'] = (boolean) pods_var( 'single_value', $taxonomy, false );
764
					$pods_taxonomies[ $taxonomy_name ]['required']     = (boolean) pods_var( 'single_value_required', $taxonomy, false );
765
				}
766
767
				// Post Types
768
				$ct_post_types = array();
769
				$_post_types   = get_post_types();
770
				$_post_types   = array_merge_recursive( $_post_types, $pods_post_types );
771
				$ignore        = array( 'revision' );
772
773 View Code Duplication
				foreach ( $_post_types as $post_type => $options ) {
774
					if ( in_array( $post_type, $ignore ) ) {
775
						continue;
776
					}
777
778
					if ( false !== (boolean) pods_var( 'built_in_post_types_' . $post_type, $taxonomy, false ) ) {
779
						$ct_post_types[] = $post_type;
780
781
						if ( isset( $supported_taxonomies[ $post_type ] ) && ! in_array( $taxonomy_name, $supported_taxonomies[ $post_type ] ) ) {
782
							$supported_taxonomies[ $post_type ][] = $taxonomy_name;
783
						}
784
					}
785
				}
786
787
				if ( isset( $supported_post_types[ $taxonomy_name ] ) ) {
788
					$supported_post_types[ $taxonomy_name ] = array_merge( $supported_post_types[ $taxonomy_name ], $ct_post_types );
789
				} else {
790
					$supported_post_types[ $taxonomy_name ] = $ct_post_types;
791
				}
792
			}
793
794
			$pods_post_types = apply_filters( 'pods_wp_post_types', $pods_post_types );
795
			$pods_taxonomies = apply_filters( 'pods_wp_taxonomies', $pods_taxonomies );
796
797
			$supported_post_types = apply_filters( 'pods_wp_supported_post_types', $supported_post_types );
798
			$supported_taxonomies = apply_filters( 'pods_wp_supported_taxonomies', $supported_taxonomies );
799
800
			foreach ( $pods_taxonomies as $taxonomy => $options ) {
801
				$ct_post_types = null;
802
803
				if ( isset( $supported_post_types[ $taxonomy ] ) && ! empty( $supported_post_types[ $taxonomy ] ) ) {
804
					$ct_post_types = $supported_post_types[ $taxonomy ];
805
				}
806
807
				$pods_cpt_ct['taxonomies'][ $taxonomy ] = array(
808
					'post_types' => $ct_post_types,
809
					'options'    => $options
810
				);
811
			}
812
813
			foreach ( $pods_post_types as $post_type => $options ) {
814
				if ( isset( $supported_taxonomies[ $post_type ] ) && ! empty( $supported_taxonomies[ $post_type ] ) ) {
815
					$options['taxonomies'] = $supported_taxonomies[ $post_type ];
816
				}
817
818
				$pods_cpt_ct['post_types'][ $post_type ] = $options;
819
			}
820
821
			pods_transient_set( 'pods_wp_cpt_ct', $pods_cpt_ct );
822
		}
823
824
		foreach ( $pods_cpt_ct['taxonomies'] as $taxonomy => $options ) {
825
			if ( isset( self::$content_types_registered['taxonomies'] ) && in_array( $taxonomy, self::$content_types_registered['taxonomies'] ) ) {
826
				continue;
827
			}
828
829
			$ct_post_types = $options['post_types'];
830
			$options       = $options['options'];
831
832
			$options = apply_filters( 'pods_register_taxonomy_' . $taxonomy, $options, $taxonomy );
833
			$options = apply_filters( 'pods_register_taxonomy', $options, $taxonomy );
834
835
			$options = self::object_label_fix( $options, 'taxonomy' );
836
837
			/**
838
			 * Hide tagcloud compatibility
839
			 * @todo check https://core.trac.wordpress.org/ticket/36964
840
			 * @see wp-admin/edit-tags.php L389
841
			 */
842
			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...
843
				$options['labels']['popular_items'] = null;
844
			}
845
846
			// Max length for taxonomies are 32 characters
847
			$taxonomy = substr( $taxonomy, 0, 32 );
848
849
			// i18n compatibility for plugins that override it
850 View Code Duplication
			if ( is_array( $options['rewrite'] ) && isset( $options['rewrite']['slug'] ) && ! empty( $options['rewrite']['slug'] ) ) {
851
				$options['rewrite']['slug'] = _x( $options['rewrite']['slug'], 'URL taxonomy slug', 'pods' );
852
			}
853
854 View Code Duplication
			if ( 1 == pods_var( 'pods_debug_register', 'get', 0 ) && pods_is_admin( array( 'pods' ) ) ) {
855
				pods_debug( array( $taxonomy, $ct_post_types, $options ) );
856
			}
857
858
			register_taxonomy( $taxonomy, $ct_post_types, $options );
859
860
			if ( ! isset( self::$content_types_registered['taxonomies'] ) ) {
861
				self::$content_types_registered['taxonomies'] = array();
862
			}
863
864
			self::$content_types_registered['taxonomies'][] = $taxonomy;
865
		}
866
867
		foreach ( $pods_cpt_ct['post_types'] as $post_type => $options ) {
868
			if ( isset( self::$content_types_registered['post_types'] ) && in_array( $post_type, self::$content_types_registered['post_types'] ) ) {
869
				continue;
870
			}
871
872
			$options = apply_filters( 'pods_register_post_type_' . $post_type, $options, $post_type );
873
			$options = apply_filters( 'pods_register_post_type', $options, $post_type );
874
875
			$options = self::object_label_fix( $options, 'post_type' );
876
877
			// Max length for post types are 20 characters
878
			$post_type = substr( $post_type, 0, 20 );
879
880
			// i18n compatibility for plugins that override it
881 View Code Duplication
			if ( is_array( $options['rewrite'] ) && isset( $options['rewrite']['slug'] ) && ! empty( $options['rewrite']['slug'] ) ) {
882
				$options['rewrite']['slug'] = _x( $options['rewrite']['slug'], 'URL slug', 'pods' );
883
			}
884
885 View Code Duplication
			if ( 1 == pods_var( 'pods_debug_register', 'get', 0 ) && pods_is_admin( array( 'pods' ) ) ) {
886
				pods_debug( array( $post_type, $options ) );
887
			}
888
889
			register_post_type( $post_type, $options );
890
891
			if ( ! isset( self::$content_types_registered['post_types'] ) ) {
892
				self::$content_types_registered['post_types'] = array();
893
			}
894
895
			self::$content_types_registered['post_types'][] = $post_type;
896
		}
897
898
	}
899
900
	/**
901
	 * Check if we need to flush WordPress rewrite rules
902
	 * This gets run during 'init' action late in the game to give other plugins time to register their rewrite rules
903
	 */
904
	public function flush_rewrite_rules() {
905
906
		$flush = (int) pods_transient_get( 'pods_flush_rewrites' );
907
908
		if ( 1 === $flush ) {
909
			/**
910
			 * @var $wp_rewrite WP_Rewrite
911
			 */
912
			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...
913
			$wp_rewrite->flush_rules();
914
			$wp_rewrite->init();
915
916
			pods_transient_set( 'pods_flush_rewrites', 0 );
917
		}
918
	}
919
920
	/**
921
	 * Update Post Type messages
922
	 *
923
	 * @param array $messages
924
	 *
925
	 * @return array
926
	 * @since 2.0.2
927
	 */
928
	public function setup_updated_messages( $messages ) {
929
930
		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...
931
932
		$post_types          = PodsMeta::$post_types;
933
		$existing_post_types = get_post_types();
934
935
		$pods_cpt_ct = pods_transient_get( 'pods_wp_cpt_ct' );
936
937
		if ( empty( $pods_cpt_ct ) || empty( $post_types ) ) {
938
			return $messages;
939
		}
940
941
		foreach ( $post_types as $post_type ) {
942
			if ( ! isset( $pods_cpt_ct['post_types'][ $post_type['name'] ] ) ) {
943
				continue;
944
			}
945
946
			$labels = self::object_label_fix( $pods_cpt_ct['post_types'][ $post_type['name'] ], 'post_type' );
947
			$labels = $labels['labels'];
948
949
			$messages[ $post_type['name'] ] = array(
950
				1  => sprintf( __( '%s updated. <a href="%s">%s</a>', 'pods' ), $labels['singular_name'], esc_url( get_permalink( $post_ID ) ), $labels['view_item'] ),
951
				2  => __( 'Custom field updated.', 'pods' ),
952
				3  => __( 'Custom field deleted.', 'pods' ),
953
				4  => sprintf( __( '%s updated.', 'pods' ), $labels['singular_name'] ),
954
				/* translators: %s: date and time of the revision */
955
				5  => isset( $_GET['revision'] ) ? sprintf( __( '%s restored to revision from %s', 'pods' ), $labels['singular_name'], wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
956
				6  => sprintf( __( '%s published. <a href="%s">%s</a>', 'pods' ), $labels['singular_name'], esc_url( get_permalink( $post_ID ) ), $labels['view_item'] ),
957
				7  => sprintf( __( '%s saved.', 'pods' ), $labels['singular_name'] ),
958
				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'] ),
959
				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
960
					date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink( $post_ID ) ), $labels['singular_name'] ),
961
				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'] )
962
			);
963
964
			if ( false === (boolean) $pods_cpt_ct['post_types'][ $post_type['name'] ]['public'] ) {
965
				$messages[ $post_type['name'] ][1]  = sprintf( __( '%s updated.', 'pods' ), $labels['singular_name'] );
966
				$messages[ $post_type['name'] ][6]  = sprintf( __( '%s published.', 'pods' ), $labels['singular_name'] );
967
				$messages[ $post_type['name'] ][8]  = sprintf( __( '%s submitted.', 'pods' ), $labels['singular_name'] );
968
				$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
969
					date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ) );
970
				$messages[ $post_type['name'] ][10] = sprintf( __( '%s draft updated.', 'pods' ), $labels['singular_name'] );
971
			}
972
		}
973
974
		return $messages;
975
	}
976
977
	/**
978
	 * @param        $args
979
	 * @param string $type
980
	 *
981
	 * @return array
982
	 */
983
	public static function object_label_fix( $args, $type = 'post_type' ) {
984
985
		if ( empty( $args ) || ! is_array( $args ) ) {
986
			$args = array();
987
		}
988
989
		if ( ! isset( $args['labels'] ) || ! is_array( $args['labels'] ) ) {
990
			$args['labels'] = array();
991
		}
992
993
		$label          = pods_v( 'name', $args['labels'], pods_v( 'label', $args, __( 'Items', 'pods' ), true ), true );
994
		$singular_label = pods_v( 'singular_name', $args['labels'], pods_v( 'label_singular', $args, __( 'Item', 'pods' ), true ), true );
995
996
		$labels = $args['labels'];
997
998
		$labels['name']          = $label;
999
		$labels['singular_name'] = $singular_label;
1000
1001
		if ( 'post_type' == $type ) {
1002
			$labels['menu_name']             = pods_v( 'menu_name', $labels, $label, true );
1003
			$labels['name_admin_bar']        = pods_v( 'name_admin_bar', $labels, $singular_label, true );
1004
			$labels['add_new']               = pods_v( 'add_new', $labels, __( 'Add New', 'pods' ), true );
1005
			$labels['add_new_item']          = pods_v( 'add_new_item', $labels, sprintf( __( 'Add New %s', 'pods' ), $singular_label ), true );
1006
			$labels['new_item']              = pods_v( 'new_item', $labels, sprintf( __( 'New %s', 'pods' ), $singular_label ), true );
1007
			$labels['edit']                  = pods_v( 'edit', $labels, __( 'Edit', 'pods' ), true );
1008
			$labels['edit_item']             = pods_v( 'edit_item', $labels, sprintf( __( 'Edit %s', 'pods' ), $singular_label ), true );
1009
			$labels['view']                  = pods_v( 'view', $labels, sprintf( __( 'View %s', 'pods' ), $singular_label ), true );
1010
			$labels['view_item']             = pods_v( 'view_item', $labels, sprintf( __( 'View %s', 'pods' ), $singular_label ), true );
1011
			$labels['view_items']            = pods_v( 'view_items', $labels, sprintf( __( 'View %s', 'pods' ), $label ), true );
1012
			$labels['all_items']             = pods_v( 'all_items', $labels, sprintf( __( 'All %s', 'pods' ), $label ), true );
1013
			$labels['search_items']          = pods_v( 'search_items', $labels, sprintf( __( 'Search %s', 'pods' ), $label ), true );
1014
			$labels['not_found']             = pods_v( 'not_found', $labels, sprintf( __( 'No %s Found', 'pods' ), $label ), true );
1015
			$labels['not_found_in_trash']    = pods_v( 'not_found_in_trash', $labels, sprintf( __( 'No %s Found in Trash', 'pods' ), $label ), true );
1016
			$labels['parent']                = pods_v( 'parent', $labels, sprintf( __( 'Parent %s', 'pods' ), $singular_label ), true );
1017
			$labels['parent_item_colon']     = pods_v( 'parent_item_colon', $labels, sprintf( __( 'Parent %s:', 'pods' ), $singular_label ), true );
1018
			$labels['featured_image']        = pods_v( 'featured_image', $labels, __( 'Featured Image', 'pods' ), true );
1019
			$labels['set_featured_image']    = pods_v( 'set_featured_image', $labels, __( 'Set featured image', 'pods' ), true );
1020
			$labels['remove_featured_image'] = pods_v( 'remove_featured_image', $labels, __( 'Remove featured image', 'pods' ), true );
1021
			$labels['use_featured_image']    = pods_v( 'use_featured_image', $labels, __( 'Use as featured image', 'pods' ), true );
1022
			$labels['archives']              = pods_v( 'archives', $labels, sprintf( __( '%s Archives', 'pods' ), $singular_label ), true );
1023
			$labels['attributes']            = pods_v( 'attributes', $labels, sprintf( __( '%s Attributes', 'pods' ), $singular_label ), true );
1024
			$labels['insert_into_item']      = pods_v( 'insert_into_item', $labels, sprintf( __( 'Insert into %s', 'pods' ), $singular_label ), true );
1025
			$labels['uploaded_to_this_item'] = pods_v( 'uploaded_to_this_item', $labels, sprintf( __( 'Uploaded to this %s', 'pods' ), $singular_label ), true );
1026
			$labels['filter_items_list']     = pods_v( 'filter_items_list', $labels, sprintf( __( 'Filter %s lists', 'pods' ), $label ), true );
1027
			$labels['items_list_navigation'] = pods_v( 'items_list_navigation', $labels, sprintf( __( '%s navigation', 'pods' ), $label ), true );
1028
			$labels['items_list']            = pods_v( 'items_list', $labels, sprintf( __( '%s list', 'pods' ), $label ), true );
1029
		} elseif ( 'taxonomy' == $type ) {
1030
			$labels['menu_name']                  = pods_v( 'menu_name', $labels, $label, true );
1031
			$labels['search_items']               = pods_v( 'search_items', $labels, sprintf( __( 'Search %s', 'pods' ), $label ), true );
1032
			$labels['popular_items']              = pods_v( 'popular_items', $labels, sprintf( __( 'Popular %s', 'pods' ), $label ), true );
1033
			$labels['all_items']                  = pods_v( 'all_items', $labels, sprintf( __( 'All %s', 'pods' ), $label ), true );
1034
			$labels['parent_item']                = pods_v( 'parent_item', $labels, sprintf( __( 'Parent %s', 'pods' ), $singular_label ), true );
1035
			$labels['parent_item_colon']          = pods_v( 'parent_item_colon', $labels, sprintf( __( 'Parent %s :', 'pods' ), $singular_label ), true );
1036
			$labels['edit_item']                  = pods_v( 'edit_item', $labels, sprintf( __( 'Edit %s', 'pods' ), $singular_label ), true );
1037
			$labels['view_item']                  = pods_v( 'view_item', $labels, sprintf( __( 'View %s', 'pods' ), $singular_label ), true );
1038
			$labels['update_item']                = pods_v( 'update_item', $labels, sprintf( __( 'Update %s', 'pods' ), $singular_label ), true );
1039
			$labels['add_new_item']               = pods_v( 'add_new_item', $labels, sprintf( __( 'Add New %s', 'pods' ), $singular_label ), true );
1040
			$labels['new_item_name']              = pods_v( 'new_item_name', $labels, sprintf( __( 'New %s Name', 'pods' ), $singular_label ), true );
1041
			$labels['separate_items_with_commas'] = pods_v( 'separate_items_with_commas', $labels, sprintf( __( 'Separate %s with commas', 'pods' ), $label ), true );
1042
			$labels['add_or_remove_items']        = pods_v( 'add_or_remove_items', $labels, sprintf( __( 'Add or remove %s', 'pods' ), $label ), true );
1043
			$labels['choose_from_most_used']      = pods_v( 'choose_from_most_used', $labels, sprintf( __( 'Choose from the most used %s', 'pods' ), $label ), true );
1044
			$labels['not_found']                  = pods_v( 'not_found', $labels, sprintf( __( 'No %s found.', 'pods' ), $label ), true );
1045
			$labels['no_terms']                   = pods_v( 'no_terms', $labels, sprintf( __( 'No %s', 'pods' ), $label ), true );
1046
			$labels['items_list_navigation']      = pods_v( 'items_list_navigation', $labels, sprintf( __( '%s navigation', 'pods' ), $label ), true );
1047
			$labels['items_list']                 = pods_v( 'items_list', $labels, sprintf( __( '%s list', 'pods' ), $label ), true );
1048
		}
1049
1050
		$args['labels'] = $labels;
1051
1052
		return $args;
1053
	}
1054
1055
	/**
1056
	 * Activate and Install
1057
	 */
1058
	public function activate_install() {
1059
1060
		register_activation_hook( PODS_DIR . 'init.php', array( $this, 'activate' ) );
1061
		register_deactivation_hook( PODS_DIR . 'init.php', array( $this, 'deactivate' ) );
1062
1063
		add_action( 'wpmu_new_blog', array( $this, 'new_blog' ), 10, 6 );
1064
1065
		if ( empty( self::$version ) || version_compare( self::$version, PODS_VERSION, '<' ) || version_compare( self::$version, PODS_DB_VERSION, '<=' ) || self::$upgrade_needed ) {
1066
			$this->setup();
1067
		} elseif ( self::$version !== PODS_VERSION ) {
1068
			delete_option( 'pods_framework_version' );
1069
			add_option( 'pods_framework_version', PODS_VERSION, '', 'yes' );
1070
1071
			self::$version = PODS_VERSION;
1072
1073
			pods_api()->cache_flush_pods();
1074
		}
1075
1076
	}
1077
1078
	/**
1079
	 *
1080
	 */
1081
	public function activate() {
1082
1083
		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...
1084
1085
		if ( function_exists( 'is_multisite' ) && is_multisite() && isset( $_GET['networkwide'] ) && 1 == $_GET['networkwide'] ) {
1086
			$_blog_ids = $wpdb->get_col( "SELECT `blog_id` FROM `{$wpdb->blogs}`" );
1087
1088
			foreach ( $_blog_ids as $_blog_id ) {
1089
				$this->setup( $_blog_id );
1090
			}
1091
		} else {
1092
			$this->setup();
1093
		}
1094
	}
1095
1096
	/**
1097
	 *
1098
	 */
1099
	public function deactivate() {
1100
1101
		pods_api()->cache_flush_pods();
1102
1103
	}
1104
1105
	/**
1106
	 *
1107
	 */
1108
	public function needs_upgrade( $current = null, $last = null ) {
1109
1110
		if ( null === $current ) {
1111
			$current = self::$version;
1112
		}
1113
1114
		if ( null === $last ) {
1115
			$last = self::$version_last;
1116
		}
1117
1118
		$upgrade_needed = false;
1119
1120
		if ( ! empty( $current ) ) {
1121
			foreach ( self::$upgrades as $old_version => $new_version ) {
1122
				/*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...
1123
					continue;*/
1124
1125
				if ( version_compare( $last, $old_version, '>=' ) && version_compare( $last, $new_version, '<' ) && version_compare( $current, $new_version, '>=' ) && 1 != self::$upgraded ) {
1126
					$upgrade_needed = true;
1127
1128
					break;
1129
				}
1130
			}
1131
		}
1132
1133
		return $upgrade_needed;
1134
	}
1135
1136
	/**
1137
	 * @param $_blog_id
1138
	 * @param $user_id
1139
	 * @param $domain
1140
	 * @param $path
1141
	 * @param $site_id
1142
	 * @param $meta
1143
	 */
1144
	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...
1145
1146
		if ( function_exists( 'is_multisite' ) && is_multisite() && is_plugin_active_for_network( basename( PODS_DIR ) . '/init.php' ) ) {
1147
			$this->setup( $_blog_id );
1148
		}
1149
	}
1150
1151
	/**
1152
	 * @param null $_blog_id
1153
	 */
1154
	public function setup( $_blog_id = null ) {
1155
1156
		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...
1157
1158
		// Switch DB table prefixes
1159 View Code Duplication
		if ( null !== $_blog_id && $_blog_id != $wpdb->blogid ) {
1160
			switch_to_blog( pods_absint( $_blog_id ) );
1161
		} else {
1162
			$_blog_id = null;
1163
		}
1164
1165
		// Setup DB tables
1166
		$pods_version      = get_option( 'pods_framework_version' );
1167
		$pods_version_last = get_option( 'pods_framework_version_last' );
1168
1169
		// Install Pods
1170
		if ( empty( $pods_version ) ) {
1171
			pods_upgrade()->install( $_blog_id );
1172
1173
			$old_version = get_option( 'pods_version' );
1174
1175
			if ( ! empty( $old_version ) ) {
1176
				if ( false === strpos( $old_version, '.' ) ) {
1177
					$old_version = pods_version_to_point( $old_version );
1178
				}
1179
1180
				delete_option( 'pods_framework_version_last' );
1181
				add_option( 'pods_framework_version_last', $pods_version, '', 'yes' );
1182
1183
				self::$version_last = $old_version;
1184
			}
1185
		} // Upgrade Wizard needed
1186
		elseif ( $this->needs_upgrade( $pods_version, $pods_version_last ) ) {
1187
			// Do not do anything
1188
			return;
1189
		} // Update Pods and run any required DB updates
1190
		elseif ( version_compare( $pods_version, PODS_VERSION, '<=' ) ) {
1191
			if ( false !== apply_filters( 'pods_update_run', null, PODS_VERSION, $pods_version, $_blog_id ) && ! isset( $_GET['pods_bypass_update'] ) ) {
1192
				do_action( 'pods_update', PODS_VERSION, $pods_version, $_blog_id );
1193
1194
				// Update 2.0 alpha / beta sites
1195
				if ( version_compare( '2.0.0-a-1', $pods_version, '<=' ) && version_compare( $pods_version, '2.0.0-b-15', '<=' ) ) {
1196
					include( PODS_DIR . 'sql/update-2.0-beta.php' );
1197
				}
1198
1199
				if ( version_compare( $pods_version, PODS_DB_VERSION, '<=' ) ) {
1200
					include( PODS_DIR . 'sql/update.php' );
1201
				}
1202
1203
				do_action( 'pods_update_post', PODS_VERSION, $pods_version, $_blog_id );
1204
			}
1205
1206
			delete_option( 'pods_framework_version_last' );
1207
			add_option( 'pods_framework_version_last', $pods_version, '', 'yes' );
1208
1209
			self::$version_last = $pods_version;
1210
		}
1211
1212
		delete_option( 'pods_framework_version' );
1213
		add_option( 'pods_framework_version', PODS_VERSION, '', 'yes' );
1214
1215
		delete_option( 'pods_framework_db_version' );
1216
		add_option( 'pods_framework_db_version', PODS_DB_VERSION, '', 'yes' );
1217
1218
		self::$version = PODS_VERSION;
1219
		self::$db_version = PODS_DB_VERSION;
1220
1221
		pods_api()->cache_flush_pods();
1222
1223
		// Restore DB table prefix (if switched)
1224
		if ( null !== $_blog_id ) {
1225
			restore_current_blog();
1226
		}
1227
1228
	}
1229
1230
	/**
1231
	 * @param null $_blog_id
1232
	 */
1233
	public function reset( $_blog_id = null ) {
1234
1235
		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...
1236
1237
		// Switch DB table prefixes
1238 View Code Duplication
		if ( null !== $_blog_id && $_blog_id != $wpdb->blogid ) {
1239
			switch_to_blog( pods_absint( $_blog_id ) );
1240
		} else {
1241
			$_blog_id = null;
1242
		}
1243
1244
		$api = pods_api();
1245
1246
		$pods = $api->load_pods( array( 'names_ids' => true, 'table_info' => false ) );
1247
1248
		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...
1249
			$api->delete_pod( array( 'id' => $pod_id ) );
1250
		}
1251
1252
		$templates = $api->load_templates();
1253
1254
		foreach ( $templates as $template ) {
1255
			$api->delete_template( array( 'id' => $template['id'] ) );
1256
		}
1257
1258
		$pages = $api->load_pages();
1259
1260
		foreach ( $pages as $page ) {
1261
			$api->delete_page( array( 'id' => $page['id'] ) );
1262
		}
1263
1264
		$helpers = $api->load_helpers();
1265
1266
		foreach ( $helpers as $helper ) {
1267
			$api->delete_helper( array( 'id' => $helper['id'] ) );
1268
		}
1269
1270
		$tables = $wpdb->get_results( "SHOW TABLES LIKE '{$wpdb->prefix}pods%'", ARRAY_N );
1271
1272
		if ( ! empty( $tables ) ) {
1273
			foreach ( $tables as $table ) {
1274
				$table = $table[0];
1275
1276
				pods_query( "DROP TABLE `{$table}`", false );
1277
			}
1278
		}
1279
1280
		// Remove any orphans
1281
		$wpdb->query( "
1282
                DELETE `p`, `pm`
1283
                FROM `{$wpdb->posts}` AS `p`
1284
                LEFT JOIN `{$wpdb->postmeta}` AS `pm`
1285
                    ON `pm`.`post_id` = `p`.`ID`
1286
                WHERE
1287
                    `p`.`post_type` LIKE '_pods_%'
1288
            " );
1289
1290
		delete_option( 'pods_framework_version' );
1291
		delete_option( 'pods_framework_db_version' );
1292
		delete_option( 'pods_framework_upgrade_2_0' );
1293
		delete_option( 'pods_framework_upgraded_1_x' );
1294
1295
		// @todo Make sure all entries are being cleaned and do something about the pods_framework_upgrade_{version} dynamic entries created by PodsUpgrade
1296
		delete_option( 'pods_framework_upgrade_2_0_0' );
1297
		delete_option( 'pods_framework_upgrade_2_0_sister_ids' );
1298
		delete_option( 'pods_framework_version_last' );
1299
1300
		delete_option( 'pods_component_settings' );
1301
1302
		$api->cache_flush_pods();
1303
1304
		pods_transient_clear( 'pods_flush_rewrites' );
1305
1306
		self::$version = '';
1307
1308
		// Restore DB table prefix (if switched)
1309
		if ( null !== $_blog_id ) {
1310
			restore_current_blog();
1311
		}
1312
	}
1313
1314
	public function run() {
1315
1316
		static $ran;
1317
1318
		if ( ! empty( $ran ) ) {
1319
			return;
1320
		}
1321
1322
		$ran = true;
1323
1324
		$this->load_i18n();
1325
1326
		if ( ! did_action( 'plugins_loaded' ) ) {
1327
			add_action( 'plugins_loaded', array( $this, 'load_components' ), 11 );
1328
		} else {
1329
			$this->load_components();
1330
		}
1331
1332
		if ( ! did_action( 'setup_theme' ) ) {
1333
			add_action( 'setup_theme', array( $this, 'load_meta' ), 14 );
1334
		} else {
1335
			$this->load_meta();
1336
		}
1337
1338
		if ( ! did_action( 'init' ) ) {
1339
			add_action( 'init', array( $this, 'core' ), 11 );
1340
			add_action( 'init', array( $this, 'add_rest_support' ), 12 );
1341
			add_action( 'init', array( $this, 'setup_content_types' ), 11 );
1342
1343
			if ( is_admin() ) {
1344
				add_action( 'init', array( $this, 'admin_init' ), 12 );
1345
			}
1346
		} else {
1347
			$this->core();
1348
			$this->add_rest_support();
1349
			$this->setup_content_types();
1350
1351
			if ( is_admin() ) {
1352
				$this->admin_init();
1353
			}
1354
		}
1355
1356
		add_action( 'wp_enqueue_scripts', array( $this, 'register_assets' ), 15 );
1357
		add_action( 'admin_enqueue_scripts', array( $this, 'register_assets' ), 15 );
1358
		add_action( 'login_enqueue_scripts', array( $this, 'register_assets' ), 15 );
1359
1360
		add_filter( 'post_updated_messages', array( $this, 'setup_updated_messages' ), 10, 1 );
1361
		add_action( 'delete_attachment', array( $this, 'delete_attachment' ) );
1362
1363
		// Register widgets
1364
		add_action( 'widgets_init', array( $this, 'register_widgets' ) );
1365
1366
		// Show admin bar links
1367
		add_action( 'admin_bar_menu', array( $this, 'admin_bar_links' ), 81 );
1368
1369
	}
1370
1371
	/**
1372
	 * Delete Attachments from relationships
1373
	 *
1374
	 * @param int $_ID
1375
	 */
1376
	public function delete_attachment( $_ID ) {
1377
1378
		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...
1379
1380
		$_ID = (int) $_ID;
1381
1382
		do_action( 'pods_delete_attachment', $_ID );
1383
1384
		$file_types = "'" . implode( "', '", PodsForm::file_field_types() ) . "'";
1385
1386
		if ( ! pods_tableless() ) {
1387
			$sql = "
1388
                DELETE `rel`
1389
                FROM `@wp_podsrel` AS `rel`
1390
                LEFT JOIN `{$wpdb->posts}` AS `p`
1391
                    ON
1392
                        `p`.`post_type` = '_pods_field'
1393
                        AND ( `p`.`ID` = `rel`.`field_id` OR `p`.`ID` = `rel`.`related_field_id` )
1394
                LEFT JOIN `{$wpdb->postmeta}` AS `pm`
1395
                    ON
1396
                        `pm`.`post_id` = `p`.`ID`
1397
                        AND `pm`.`meta_key` = 'type'
1398
                        AND `pm`.`meta_value` IN ( {$file_types} )
1399
                WHERE
1400
                    `p`.`ID` IS NOT NULL
1401
                    AND `pm`.`meta_id` IS NOT NULL
1402
                    AND `rel`.`item_id` = {$_ID}";
1403
1404
			pods_query( $sql, false );
1405
		}
1406
1407
		// Post Meta
1408 View Code Duplication
		if ( ! empty( PodsMeta::$post_types ) ) {
1409
			$sql = "
1410
                DELETE `rel`
1411
                FROM `@wp_postmeta` AS `rel`
1412
                LEFT JOIN `{$wpdb->posts}` AS `p`
1413
                    ON
1414
                        `p`.`post_type` = '_pods_field'
1415
                LEFT JOIN `{$wpdb->postmeta}` AS `pm`
1416
                    ON
1417
                        `pm`.`post_id` = `p`.`ID`
1418
                        AND `pm`.`meta_key` = 'type'
1419
                        AND `pm`.`meta_value` IN ( {$file_types} )
1420
                WHERE
1421
                    `p`.`ID` IS NOT NULL
1422
                    AND `pm`.`meta_id` IS NOT NULL
1423
                    AND `rel`.`meta_key` = `p`.`post_name`
1424
                    AND `rel`.`meta_value` = '{$_ID}'";
1425
1426
			pods_query( $sql, false );
1427
		}
1428
1429
		// User Meta
1430 View Code Duplication
		if ( ! empty( PodsMeta::$user ) ) {
1431
			$sql = "
1432
                DELETE `rel`
1433
                FROM `@wp_usermeta` AS `rel`
1434
                LEFT JOIN `{$wpdb->posts}` AS `p`
1435
                    ON
1436
                        `p`.`post_type` = '_pods_field'
1437
                LEFT JOIN `{$wpdb->postmeta}` AS `pm`
1438
                    ON
1439
                        `pm`.`post_id` = `p`.`ID`
1440
                        AND `pm`.`meta_key` = 'type'
1441
                        AND `pm`.`meta_value` IN ( {$file_types} )
1442
                WHERE
1443
                    `p`.`ID` IS NOT NULL
1444
                    AND `pm`.`meta_id` IS NOT NULL
1445
                    AND `rel`.`meta_key` = `p`.`post_name`
1446
                    AND `rel`.`meta_value` = '{$_ID}'";
1447
1448
			pods_query( $sql, false );
1449
		}
1450
1451
		// Comment Meta
1452 View Code Duplication
		if ( ! empty( PodsMeta::$comment ) ) {
1453
			$sql = "
1454
                DELETE `rel`
1455
                FROM `@wp_commentmeta` AS `rel`
1456
                LEFT JOIN `{$wpdb->posts}` AS `p`
1457
                    ON
1458
                        `p`.`post_type` = '_pods_field'
1459
                LEFT JOIN `{$wpdb->postmeta}` AS `pm`
1460
                    ON
1461
                        `pm`.`post_id` = `p`.`ID`
1462
                        AND `pm`.`meta_key` = 'type'
1463
                        AND `pm`.`meta_value` IN ( {$file_types} )
1464
                WHERE
1465
                    `p`.`ID` IS NOT NULL
1466
                    AND `pm`.`meta_id` IS NOT NULL
1467
                    AND `rel`.`meta_key` = `p`.`post_name`
1468
                    AND `rel`.`meta_value` = '{$_ID}'";
1469
1470
			pods_query( $sql, false );
1471
		}
1472
	}
1473
1474
	/**
1475
	 * Register widgets for Pods
1476
	 */
1477
	public function register_widgets() {
1478
1479
		$widgets = array(
1480
			'PodsWidgetSingle',
1481
			'PodsWidgetList',
1482
			'PodsWidgetField',
1483
			'PodsWidgetForm',
1484
			'PodsWidgetView'
1485
		);
1486
1487
		foreach ( $widgets as $widget ) {
1488
			if ( ! file_exists( PODS_DIR . 'classes/widgets/' . $widget . '.php' ) ) {
1489
				continue;
1490
			}
1491
1492
			require_once PODS_DIR . 'classes/widgets/' . $widget . '.php';
1493
1494
			register_widget( $widget );
1495
		}
1496
	}
1497
1498
	/**
1499
	 * Add Admin Bar links
1500
	 */
1501
	public function admin_bar_links() {
1502
1503
		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...
1504
1505
		if ( ! is_user_logged_in() || ! is_admin_bar_showing() ) {
1506
			return;
1507
		}
1508
1509
		$all_pods = pods_api()->load_pods( array( 'type' => 'pod', 'fields' => false, 'table_info' => false ) );
1510
1511
		// Add New item links for all pods
1512
		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...
1513
			if ( 0 == $pod['options']['show_in_menu'] ) {
1514
				continue;
1515
			}
1516
1517
			if ( ! pods_is_admin( array( 'pods', 'pods_content', 'pods_add_' . $pod['name'] ) ) ) {
1518
				continue;
1519
			}
1520
1521
			$singular_label = pods_var_raw( 'label_singular', $pod['options'], pods_var_raw( 'label', $pod, ucwords( str_replace( '_', ' ', $pod['name'] ) ), null, true ), null, true );
1522
1523
			$wp_admin_bar->add_node( array(
1524
				'id'     => 'new-pod-' . $pod['name'],
1525
				'title'  => $singular_label,
1526
				'parent' => 'new-content',
1527
				'href'   => admin_url( 'admin.php?page=pods-manage-' . $pod['name'] . '&action=add' )
1528
			) );
1529
		}
1530
1531
		// Add edit link if we're on a pods page
1532
		if ( is_object( $pods ) && ! is_wp_error( $pods ) && ! empty( $pods->id ) && isset( $pods->pod_data ) && ! empty( $pods->pod_data ) && 'pod' == $pods->pod_data['type'] ) {
1533
			$pod = $pods->pod_data;
1534
1535
			if ( pods_is_admin( array( 'pods', 'pods_content', 'pods_edit_' . $pod['name'] ) ) ) {
1536
				$singular_label = pods_var_raw( 'label_singular', $pod['options'], pods_var_raw( 'label', $pod, ucwords( str_replace( '_', ' ', $pod['name'] ) ), null, true ), null, true );
1537
1538
				$wp_admin_bar->add_node( array(
1539
					'title' => sprintf( __( 'Edit %s', 'pods' ), $singular_label ),
1540
					'id'    => 'edit-pod',
1541
					'href'  => admin_url( 'admin.php?page=pods-manage-' . $pod['name'] . '&action=edit&id=' . $pods->id() )
1542
				) );
1543
			}
1544
		}
1545
1546
	}
1547
1548
	/**
1549
	 * Add REST API support to post type and taxonomy objects.
1550
	 *
1551
	 * @uses  "init"
1552
	 *
1553
	 * @since 2.5.6
1554
	 */
1555
	public function add_rest_support() {
1556
1557
		if ( empty( self::$version ) ) {
1558
			return;
1559
		}
1560
1561
		static $rest_support_added;
1562
1563
		if ( ! function_exists( 'register_rest_field' ) ) {
1564
			return;
1565
		}
1566
1567
		include_once( PODS_DIR . 'classes/PodsRESTFields.php' );
1568
		include_once( PODS_DIR . 'classes/PodsRESTHandlers.php' );
1569
1570
		$rest_bases = pods_transient_get( 'pods_rest_bases' );
1571
1572
		if ( empty( $rest_bases ) ) {
1573
	        $pods = pods_api()->load_pods( array( 'type' => array( 'post_type', 'taxonomy', 'user', 'media', 'comment' ), 'fields' => false, 'table_info' => false ) );
1574
1575
			$rest_bases = array();
1576
1577
			if ( ! empty( $pods ) && is_array( $pods ) ) {
1578
				foreach ( $pods as $pod ) {
1579
					$type = $pod['type'];
1580
1581
					if ( in_array( $type, array( 'post_type', 'taxonomy', 'user', 'media', 'comment' ) ) ) {
1582
						if ( $pod && PodsRESTHandlers::pod_extends_core_route( $pod ) ) {
1583
							$rest_bases[ $pod['name'] ] = array(
1584
								'type' => $type,
1585
								'base' => sanitize_title( pods_v( 'rest_base', $pod['options'], $pod['name'] ) ),
1586
							);
1587
						}
1588
					}
1589
				}
1590
			}
1591
1592
			if ( empty( $rest_bases ) ) {
1593
				$rest_bases = 'none';
1594
			}
1595
1596
			pods_transient_set( 'pods_rest_bases', $rest_bases );
1597
		}
1598
1599
		if ( empty( $rest_support_added ) && ! empty( $rest_bases ) && 'none' !== $rest_bases ) {
1600
			foreach ( $rest_bases as $pod_name => $pod_info ) {
1601
				$pod_type  = $pod_info['type'];
1602
				$rest_base = $pod_info['base'];
1603
1604
				if ( 'post_type' == $pod_type ) {
1605
					PodsRESTHandlers::post_type_rest_support( $pod_name, $rest_base );
1606
				} elseif ( 'taxonomy' == $pod_type ) {
1607
					PodsRESTHandlers::taxonomy_rest_support( $pod_name, $rest_base );
1608
				}
1609
1610
				new PodsRESTFields( $pod_name );
1611
			}
1612
1613
			$rest_support_added = true;
1614
		}
1615
1616
	}
1617
}
1618