Completed
Pull Request — 2.x (#3632)
by Scott Kingsley
09:21 queued 03:41
created

PodsInit::object_label_fix()   C

Complexity

Conditions 7
Paths 12

Size

Total Lines 69
Code Lines 57

Duplication

Lines 0
Ratio 0 %

Importance

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

How to fix   Long Method   

Long Method

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

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

Commonly applied refactorings include:

1
<?php
2
/**
3
 * @package Pods
4
 */
5
class PodsInit {
6
7
	/**
8
	 * @var PodsInit
9
	 */
10
	static $instance = null;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $instance.

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

Please refer to the PHP core documentation on constructors.

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

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

Loading history...
106
107
		self::$version      = get_option( 'pods_framework_version' );
108
		self::$version_last = get_option( 'pods_framework_version_last' );
109
		self::$db_version   = get_option( 'pods_framework_db_version' );
110
		self::$upgraded     = (int) get_option( 'pods_framework_upgraded_1_x' );
111
112
		if ( empty( self::$version_last ) && 0 < strlen( get_option( 'pods_version' ) ) ) {
113
			$old_version = get_option( 'pods_version' );
114
115
			if ( ! empty( $old_version ) ) {
116
				if ( false === strpos( $old_version, '.' ) ) {
117
					$old_version = pods_version_to_point( $old_version );
118
				}
119
120
				update_option( 'pods_framework_version_last', $old_version );
121
122
				self::$version_last = $old_version;
123
			}
124
		}
125
126
		self::$upgrade_needed = $this->needs_upgrade();
127
128
		add_action( 'plugins_loaded', array( $this, 'plugins_loaded' ) );
129
		add_action( 'plugins_loaded', array( $this, 'activate_install' ), 9 );
130
131
		add_action( 'wp_loaded', array( $this, 'flush_rewrite_rules' ) );
132
133
		$this->run();
134
135
	}
136
137
	/**
138
	 * Load the plugin textdomain and set default constants
139
	 */
140
	public function plugins_loaded() {
141
142
		if ( ! defined( 'PODS_LIGHT' ) ) {
143
			define( 'PODS_LIGHT', false );
144
		}
145
146
		if ( ! defined( 'PODS_TABLELESS' ) ) {
147
			define( 'PODS_TABLELESS', false );
148
		}
149
150
		load_plugin_textdomain( 'pods' );
151
152
	}
153
154
	/**
155
	 * Load Pods Components
156
	 */
157
	public function load_components() {
158
159
		if ( empty( self::$version ) ) {
160
			return;
161
		}
162
163
		if ( ! defined( 'PODS_LIGHT' ) || ! PODS_LIGHT ) {
164
			self::$components = pods_components();
165
		}
166
167
	}
168
169
	/**
170
	 * Load Pods Meta
171
	 */
172
	public function load_meta() {
173
174
		self::$meta = pods_meta()->core();
175
	}
176
177
	/**
178
	 *
179
	 */
180
	public function load_i18n() {
181
182
		self::$i18n = pods_i18n();
183
	}
184
185
186
	/**
187
	 * Set up the Pods core
188
	 */
189
	public function core() {
190
191
		if ( empty( self::$version ) ) {
192
			return;
193
		}
194
195
		// Session start
196
		pods_session_start();
197
198
		add_shortcode( 'pods', 'pods_shortcode' );
199
		add_shortcode( 'pods-form', 'pods_shortcode_form' );
200
201
		$security_settings = array(
202
			'pods_disable_file_browser'     => 0,
203
			'pods_files_require_login'      => 1,
204
			'pods_files_require_login_cap'  => '',
205
			'pods_disable_file_upload'      => 0,
206
			'pods_upload_require_login'     => 1,
207
			'pods_upload_require_login_cap' => ''
208
		);
209
210
		foreach ( $security_settings as $security_setting => $setting ) {
211
			$setting = get_option( $security_setting );
212
			if ( ! empty( $setting ) ) {
213
				$security_settings[ $security_setting ] = $setting;
214
			}
215
		}
216
217
		foreach ( $security_settings as $security_setting => $setting ) {
218
			if ( 0 == $setting ) {
219
				$setting = false;
220
			} elseif ( 1 == $setting ) {
221
				$setting = true;
222
			}
223
224
			if ( in_array( $security_setting, array( 'pods_files_require_login', 'pods_upload_require_login' ) ) ) {
225
				if ( 0 < strlen( $security_settings[ $security_setting . '_cap' ] ) ) {
226
					$setting = $security_settings[ $security_setting . '_cap' ];
227
				}
228
			} elseif ( in_array( $security_setting, array(
229
				'pods_files_require_login_cap',
230
				'pods_upload_require_login_cap'
231
			) ) ) {
232
				continue;
233
			}
234
235
			if ( ! defined( strtoupper( $security_setting ) ) ) {
236
				define( strtoupper( $security_setting ), $setting );
237
			}
238
		}
239
240
		$this->register_pods();
241
242
		$avatar = PodsForm::field_loader( 'avatar' );
243
244
		if ( method_exists( $avatar, 'get_avatar' ) ) {
245
			add_filter( 'get_avatar', array( $avatar, 'get_avatar' ), 10, 4 );
246
		}
247
	}
248
249
	/**
250
	 * Register Scripts and Styles
251
	 */
252
	public function register_assets() {
253
254
		if ( ! wp_style_is( 'jquery-ui', 'registered' ) ) {
255
			wp_register_style( 'jquery-ui', PODS_URL . 'ui/css/smoothness/jquery-ui.custom.css', array(), '1.8.16' );
256
		}
257
258
		wp_register_script( 'pods-json', PODS_URL . 'ui/js/jquery.json.js', array( 'jquery' ), '2.3' );
259
260
		if ( ! wp_style_is( 'jquery-qtip2', 'registered' ) ) {
261
			wp_register_style( 'jquery-qtip2', PODS_URL . 'ui/css/jquery.qtip.min.css', array(), '2.2' );
262
		}
263
264
		if ( ! wp_script_is( 'jquery-qtip2', 'registered' ) ) {
265
			wp_register_script( 'jquery-qtip2', PODS_URL . 'ui/js/jquery.qtip.min.js', array( 'jquery' ), '2.2' );
266
		}
267
268
		wp_register_script( 'pods', PODS_URL . 'ui/js/jquery.pods.js', array(
269
			'jquery',
270
			'pods-i18n',
271
			'pods-json',
272
			'jquery-qtip2'
273
		), PODS_VERSION, true );
274
275
		wp_register_style( 'pods-form', PODS_URL . 'ui/css/pods-form.css', array(), PODS_VERSION );
276
277
		wp_register_style( 'pods-cleditor', PODS_URL . 'ui/css/jquery.cleditor.css', array(), '1.3.0' );
278
		wp_register_script( 'pods-cleditor', PODS_URL . 'ui/js/jquery.cleditor.min.js', array( 'jquery' ), '1.3.0' );
279
280
		wp_register_style( 'pods-codemirror', PODS_URL . 'ui/css/codemirror.css', array(), '4.8' );
281
		wp_register_script( 'pods-codemirror', PODS_URL . 'ui/js/codemirror.js', array(), '4.8', true );
282
		wp_register_script( 'pods-codemirror-loadmode', PODS_URL . 'ui/js/codemirror/addon/mode/loadmode.js', array( 'pods-codemirror' ), '4.8', true );
283
		wp_register_script( 'pods-codemirror-overlay', PODS_URL . 'ui/js/codemirror/addon/mode/overlay.js', array( 'pods-codemirror' ), '4.8', true );
284
		wp_register_script( 'pods-codemirror-hints', PODS_URL . 'ui/js/codemirror/addon/mode/show-hint.js', array( 'pods-codemirror' ), '4.8', true );
285
		wp_register_script( 'pods-codemirror-mode-xml', PODS_URL . 'ui/js/codemirror/mode/xml/xml.js', array( 'pods-codemirror' ), '4.8', true );
286
		wp_register_script( 'pods-codemirror-mode-html', PODS_URL . 'ui/js/codemirror/mode/htmlmixed/htmlmixed.js', array( 'pods-codemirror' ), '4.8', true );
287
		wp_register_script( 'pods-codemirror-mode-css', PODS_URL . 'ui/js/codemirror/mode/css/css.js', array( 'pods-codemirror' ), '4.8', true );
288
289
		if ( ! wp_style_is( 'jquery-ui-timepicker', 'registered' ) ) {
290
			wp_register_style( 'jquery-ui-timepicker', PODS_URL . 'ui/css/jquery.ui.timepicker.css', array(), '1.1.1' );
291
		}
292
293
		if ( ! wp_script_is( 'jquery-ui-timepicker', 'registered' ) ) {
294
			wp_register_script( 'jquery-ui-timepicker', PODS_URL . 'ui/js/jquery.ui.timepicker.min.js', array(
295
				'jquery',
296
				'jquery-ui-core',
297
				'jquery-ui-datepicker',
298
				'jquery-ui-slider'
299
			), '1.1.1' );
300
		}
301
302
		wp_register_style( 'pods-select2', PODS_URL . 'ui/js/select2/select2.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['all_items']             = pods_v( 'label_all_items', $post_type, '', true );
463
				$cpt_labels['search_items']          = pods_v( 'label_search_items', $post_type, '', true );
464
				$cpt_labels['not_found']             = pods_v( 'label_not_found', $post_type, '', true );
465
				$cpt_labels['not_found_in_trash']    = pods_v( 'label_not_found_in_trash', $post_type, '', true );
466
				$cpt_labels['parent']                = pods_v( 'label_parent', $post_type, '', true );
467
				$cpt_labels['parent_item_colon']     = pods_v( 'label_parent_item_colon', $post_type, '', true );
468
				$cpt_labels['archives']              = pods_v( 'label_archives', $post_type, '', true );
469
				$cpt_labels['insert_into_item']      = pods_v( 'label_insert_into_item', $post_type, '', true );
470
				$cpt_labels['uploaded_to_this_item'] = pods_v( 'label_uploaded_to_this_item', $post_type, '', true );
471
				$cpt_labels['featured_image']        = pods_v( 'label_featured_image', $post_type, '', true );
472
				$cpt_labels['set_featured_image']    = pods_v( 'label_set_featured_image', $post_type, '', true );
473
				$cpt_labels['remove_featured_image'] = pods_v( 'label_remove_featured_image', $post_type, '', true );
474
				$cpt_labels['use_featured_image']    = pods_v( 'label_use_featured_image', $post_type, '', true );
475
				$cpt_labels['filter_items_list']     = pods_v( 'label_filter_items_list', $post_type, '', true );
476
				$cpt_labels['items_list_navigation'] = pods_v( 'label_items_list_navigation', $post_type, '', true );
477
				$cpt_labels['items_list']            = pods_v( 'label_items_list', $post_type, '', true );
478
479
				// Supported
480
				$cpt_supported = array(
481
					'title'           => (boolean) pods_v( 'supports_title', $post_type, false ),
482
					'editor'          => (boolean) pods_v( 'supports_editor', $post_type, false ),
483
					'author'          => (boolean) pods_v( 'supports_author', $post_type, false ),
484
					'thumbnail'       => (boolean) pods_v( 'supports_thumbnail', $post_type, false ),
485
					'excerpt'         => (boolean) pods_v( 'supports_excerpt', $post_type, false ),
486
					'trackbacks'      => (boolean) pods_v( 'supports_trackbacks', $post_type, false ),
487
					'custom-fields'   => (boolean) pods_v( 'supports_custom_fields', $post_type, false ),
488
					'comments'        => (boolean) pods_v( 'supports_comments', $post_type, false ),
489
					'revisions'       => (boolean) pods_v( 'supports_revisions', $post_type, false ),
490
					'page-attributes' => (boolean) pods_v( 'supports_page_attributes', $post_type, false ),
491
					'post-formats'    => (boolean) pods_v( 'supports_post_formats', $post_type, false )
492
				);
493
494
				// Custom Supported
495
				$cpt_supported_custom = pods_v_sanitized( 'supports_custom', $post_type, '' );
496
497
				if ( ! empty( $cpt_supported_custom ) ) {
498
					$cpt_supported_custom = explode( ',', $cpt_supported_custom );
499
					$cpt_supported_custom = array_filter( array_unique( $cpt_supported_custom ) );
500
501
					foreach ( $cpt_supported_custom as $cpt_support ) {
502
						$cpt_supported[ $cpt_support ] = true;
503
					}
504
				}
505
506
				// Genesis Support
507
				if ( function_exists( 'genesis' ) ) {
508
					$cpt_supported['genesis-seo']             = (boolean) pods_var( 'supports_genesis_seo', $post_type, false );
509
					$cpt_supported['genesis-layouts']         = (boolean) pods_var( 'supports_genesis_layouts', $post_type, false );
510
					$cpt_supported['genesis-simple-sidebars'] = (boolean) pods_var( 'supports_genesis_simple_sidebars', $post_type, false );
511
				}
512
513
				// YARPP Support
514
				if ( defined( 'YARPP_VERSION' ) ) {
515
					$cpt_supported['yarpp_support'] = (boolean) pods_var( 'supports_yarpp_support', $post_type, false );
516
				}
517
518
				// Jetpack Support
519
				if ( class_exists( 'Jetpack' ) ) {
520
					$cpt_supported['supports_jetpack_publicize'] = (boolean) pods_var( 'supports_jetpack_publicize', $post_type, false );
521
					$cpt_supported['supports_jetpack_markdown']  = (boolean) pods_var( 'supports_jetpack_markdown', $post_type, false );
522
				}
523
524
				// WP needs something, if this was empty and none were enabled, it would show title+editor pre 3.5 :(
525
				$cpt_supports = array();
526
527
				if ( ! pods_version_check( 'wp', '3.5' ) ) {
528
					$cpt_supports = array( '_bug_fix_pre_35' );
529
				}
530
531
				foreach ( $cpt_supported as $cpt_support => $supported ) {
532
					if ( true === $supported ) {
533
						$cpt_supports[] = $cpt_support;
534
					}
535
				}
536
537
				if ( empty( $cpt_supports ) && pods_version_check( 'wp', '3.5' ) ) {
538
					$cpt_supports = false;
539
				}
540
541
				// Rewrite
542
				$cpt_rewrite       = (boolean) pods_var( 'rewrite', $post_type, true );
543
				$cpt_rewrite_array = array(
544
					'slug'       => pods_var( 'rewrite_custom_slug', $post_type, str_replace( '_', '-', $post_type_name ), null, true ),
545
					'with_front' => (boolean) pods_var( 'rewrite_with_front', $post_type, true ),
546
					'feeds'      => (boolean) pods_var( 'rewrite_feeds', $post_type, (boolean) pods_var( 'has_archive', $post_type, false ) ),
547
					'pages'      => (boolean) pods_var( 'rewrite_pages', $post_type, true )
548
				);
549
550
				if ( false !== $cpt_rewrite ) {
551
					$cpt_rewrite = $cpt_rewrite_array;
552
				}
553
554
				$capability_type = pods_var( 'capability_type', $post_type, 'post' );
555
556
				if ( 'custom' == $capability_type ) {
557
					$capability_type = pods_var( 'capability_type_custom', $post_type, 'post' );
558
				}
559
560
				$show_in_menu = (boolean) pods_var( 'show_in_menu', $post_type, true );
561
562
				if ( $show_in_menu && 0 < strlen( pods_var_raw( 'menu_location_custom', $post_type ) ) ) {
563
					$show_in_menu = pods_var_raw( 'menu_location_custom', $post_type );
564
				}
565
566
				$menu_icon = pods_var( 'menu_icon', $post_type, null, null, true );
567
568
				if ( ! empty( $menu_icon ) ) {
569
					$menu_icon = pods_evaluate_tags( $menu_icon );
570
				}
571
572
				// Register Post Type
573
				$pods_post_types[ $post_type_name ] = array(
574
					'label'               => $cpt_label,
575
					'labels'              => $cpt_labels,
576
					'description'         => esc_html( pods_var_raw( 'description', $post_type ) ),
577
					'public'              => (boolean) pods_var( 'public', $post_type, true ),
578
					'publicly_queryable'  => (boolean) pods_var( 'publicly_queryable', $post_type, (boolean) pods_var( 'public', $post_type, true ) ),
579
					'exclude_from_search' => (boolean) pods_var( 'exclude_from_search', $post_type, ( (boolean) pods_var( 'public', $post_type, true ) ? false : true ) ),
580
					'show_ui'             => (boolean) pods_var( 'show_ui', $post_type, (boolean) pods_var( 'public', $post_type, true ) ),
581
					'show_in_menu'        => $show_in_menu,
582
					'show_in_nav_menus'   => (boolean) pods_var( 'show_in_nav_menus', $post_type, (boolean) pods_var( 'public', $post_type, true ) ),
583
					'show_in_admin_bar'   => (boolean) pods_var( 'show_in_admin_bar', $post_type, (boolean) pods_var( 'show_in_menu', $post_type, true ) ),
584
					'menu_position'       => (int) pods_var( 'menu_position', $post_type, 0, null, true ),
585
					'menu_icon'           => $menu_icon,
586
					'capability_type'     => $capability_type,
587
					//'capabilities' => $cpt_capabilities,
0 ignored issues
show
Unused Code Comprehensibility introduced by
67% of this comment could be valid code. Did you maybe forget this after debugging?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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