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

PodsInit::init()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 4
c 0
b 0
f 0
nc 2
nop 0
dl 0
loc 8
rs 9.4285
1
<?php
2
/**
3
 * @package Pods
4
 */
5
class PodsInit {
6
7
	/**
8
	 * @var PodsInit
9
	 */
10
	static $instance = null;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $instance.

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

class A {
    var $property;
}

the property is implicitly global.

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

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

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

Please refer to the PHP core documentation on constructors.

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

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

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