Completed
Pull Request — 2.x (#3632)
by Scott Kingsley
07:17
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 3
Bugs 0 Features 0
Metric Value
cc 7
eloc 57
c 3
b 0
f 0
nc 12
nop 2
dl 0
loc 69
rs 6.9081

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', false, dirname( plugin_basename( PODS_DIR . 'init.php' ) ) . '/languages/' );
151
	}
152
153
	/**
154
	 * Load Pods Components
155
	 */
156
	public function load_components() {
157
158
		if ( empty( self::$version ) ) {
159
			return;
160
		}
161
162
		if ( ! defined( 'PODS_LIGHT' ) || ! PODS_LIGHT ) {
163
			self::$components = pods_components();
164
		}
165
166
	}
167
168
	/**
169
	 * Load Pods Meta
170
	 */
171
	public function load_meta() {
172
173
		self::$meta = pods_meta()->core();
174
	}
175
176
	/**
177
	 *
178
	 */
179
	public function load_i18n() {
180
181
		self::$i18n = pods_i18n();
182
	}
183
184
185
	/**
186
	 * Set up the Pods core
187
	 */
188
	public function core() {
189
190
		if ( empty( self::$version ) ) {
191
			return;
192
		}
193
194
		// Session start
195
		pods_session_start();
196
197
		add_shortcode( 'pods', 'pods_shortcode' );
198
		add_shortcode( 'pods-form', 'pods_shortcode_form' );
199
200
		$security_settings = array(
201
			'pods_disable_file_browser'     => 0,
202
			'pods_files_require_login'      => 1,
203
			'pods_files_require_login_cap'  => '',
204
			'pods_disable_file_upload'      => 0,
205
			'pods_upload_require_login'     => 1,
206
			'pods_upload_require_login_cap' => ''
207
		);
208
209
		foreach ( $security_settings as $security_setting => $setting ) {
210
			$setting = get_option( $security_setting );
211
			if ( ! empty( $setting ) ) {
212
				$security_settings[ $security_setting ] = $setting;
213
			}
214
		}
215
216
		foreach ( $security_settings as $security_setting => $setting ) {
217
			if ( 0 == $setting ) {
218
				$setting = false;
219
			} elseif ( 1 == $setting ) {
220
				$setting = true;
221
			}
222
223
			if ( in_array( $security_setting, array( 'pods_files_require_login', 'pods_upload_require_login' ) ) ) {
224
				if ( 0 < strlen( $security_settings[ $security_setting . '_cap' ] ) ) {
225
					$setting = $security_settings[ $security_setting . '_cap' ];
226
				}
227
			} elseif ( in_array( $security_setting, array(
228
				'pods_files_require_login_cap',
229
				'pods_upload_require_login_cap'
230
			) ) ) {
231
				continue;
232
			}
233
234
			if ( ! defined( strtoupper( $security_setting ) ) ) {
235
				define( strtoupper( $security_setting ), $setting );
236
			}
237
		}
238
239
		$this->register_pods();
240
241
		$avatar = PodsForm::field_loader( 'avatar' );
242
243
		if ( method_exists( $avatar, 'get_avatar' ) ) {
244
			add_filter( 'get_avatar', array( $avatar, 'get_avatar' ), 10, 4 );
245
		}
246
	}
247
248
	/**
249
	 * Register Scripts and Styles
250
	 */
251
	public function register_assets() {
252
253
		if ( ! wp_style_is( 'jquery-ui', 'registered' ) ) {
254
			wp_register_style( 'jquery-ui', PODS_URL . 'ui/css/smoothness/jquery-ui.custom.css', array(), '1.8.16' );
255
		}
256
257
		wp_register_script( 'pods-json', PODS_URL . 'ui/js/jquery.json.js', array( 'jquery' ), '2.3' );
258
259
		if ( ! wp_style_is( 'jquery-qtip2', 'registered' ) ) {
260
			wp_register_style( 'jquery-qtip2', PODS_URL . 'ui/css/jquery.qtip.min.css', array(), '2.2' );
261
		}
262
263
		if ( ! wp_script_is( 'jquery-qtip2', 'registered' ) ) {
264
			wp_register_script( 'jquery-qtip2', PODS_URL . 'ui/js/jquery.qtip.min.js', array( 'jquery' ), '2.2' );
265
		}
266
267
		wp_register_script( 'pods', PODS_URL . 'ui/js/jquery.pods.js', array(
268
			'jquery',
269
			'pods-i18n',
270
			'pods-json',
271
			'jquery-qtip2'
272
		), PODS_VERSION, true );
273
274
		wp_register_style( 'pods-form', PODS_URL . 'ui/css/pods-form.css', array(), PODS_VERSION );
275
276
		wp_register_style( 'pods-cleditor', PODS_URL . 'ui/css/jquery.cleditor.css', array(), '1.3.0' );
277
		wp_register_script( 'pods-cleditor', PODS_URL . 'ui/js/jquery.cleditor.min.js', array( 'jquery' ), '1.3.0' );
278
279
		wp_register_style( 'pods-codemirror', PODS_URL . 'ui/css/codemirror.css', array(), '4.8' );
280
		wp_register_script( 'pods-codemirror', PODS_URL . 'ui/js/codemirror.js', array(), '4.8', true );
281
		wp_register_script( 'pods-codemirror-loadmode', PODS_URL . 'ui/js/codemirror/addon/mode/loadmode.js', array( 'pods-codemirror' ), '4.8', true );
282
		wp_register_script( 'pods-codemirror-overlay', PODS_URL . 'ui/js/codemirror/addon/mode/overlay.js', array( 'pods-codemirror' ), '4.8', true );
283
		wp_register_script( 'pods-codemirror-hints', PODS_URL . 'ui/js/codemirror/addon/mode/show-hint.js', array( 'pods-codemirror' ), '4.8', true );
284
		wp_register_script( 'pods-codemirror-mode-xml', PODS_URL . 'ui/js/codemirror/mode/xml/xml.js', array( 'pods-codemirror' ), '4.8', true );
285
		wp_register_script( 'pods-codemirror-mode-html', PODS_URL . 'ui/js/codemirror/mode/htmlmixed/htmlmixed.js', array( 'pods-codemirror' ), '4.8', true );
286
		wp_register_script( 'pods-codemirror-mode-css', PODS_URL . 'ui/js/codemirror/mode/css/css.js', array( 'pods-codemirror' ), '4.8', true );
287
288
		if ( ! wp_style_is( 'jquery-ui-timepicker', 'registered' ) ) {
289
			wp_register_style( 'jquery-ui-timepicker', PODS_URL . 'ui/css/jquery.ui.timepicker.css', array(), '1.1.1' );
290
		}
291
292
		if ( ! wp_script_is( 'jquery-ui-timepicker', 'registered' ) ) {
293
			wp_register_script( 'jquery-ui-timepicker', PODS_URL . 'ui/js/jquery.ui.timepicker.min.js', array(
294
				'jquery',
295
				'jquery-ui-core',
296
				'jquery-ui-datepicker',
297
				'jquery-ui-slider'
298
			), '1.1.1' );
299
		}
300
301
		wp_register_style( 'pods-select2', PODS_URL . 'ui/js/select2/select2.css', array(), '3.3.1' );
302
		wp_register_script( 'pods-select2', PODS_URL . 'ui/js/select2/select2.min.js', array( 'jquery', 'pods-i18n' ), '3.3.1' );
303
304
		wp_register_script( 'pods-handlebars', PODS_URL . 'ui/js/handlebars.js', array(), '1.0.0.beta.6' );
305
306
		// Marionette dependencies for MV fields
307
		wp_register_script( 'marionette', PODS_URL . 'ui/js/marionette/backbone.marionette.js', array( 'backbone' ), '2.4.4', true );
308
		wp_register_script( 'backbone.babysitter', PODS_URL . 'ui/js/marionette/backbone.babysitter.min.js', array( 'backbone' ), '0.1.10', true );
309
		wp_register_script( 'backbone.radio', PODS_URL . 'ui/js/marionette/backbone.radio.min.js', array( 'backbone' ), '1.0.2', true );
310
		wp_register_script( 'marionette.radio.shim', PODS_URL . 'ui/js/marionette/marionette.radio.shim.js', array(
311
			'marionette',
312
			'backbone.radio'
313
		), '1.0.2', true );
314
		wp_register_script( 'marionette.state', PODS_URL. 'ui/js/marionette/marionette.state.js', array( 'marionette' ), '1.0.1', true );
315
316
		// MV stuff
317
		wp_register_script(
318
			'pods-mv-fields',
319
			PODS_URL . 'ui/fields-mv/js/pods-mv-fields.min.js',
320
			array(
321
				'jquery',
322
				'jquery-ui-core',
323
				'jquery-ui-sortable',
324
				'pods-i18n',
325
				'marionette',
326
				'media-views',
327
				'media-models'
328
			),
329
			PODS_VERSION,
330
			true
331
		);
332
		wp_register_style( 'pods-flex', PODS_URL . 'ui/css/pods-flex.css', array(), PODS_VERSION );
333
	}
334
335
	/**
336
	 * Register internal Post Types
337
	 */
338
	public function register_pods() {
339
340
		$args = array(
341
			'label'           => 'Pods',
342
			'labels'          => array( 'singular_name' => 'Pod' ),
343
			'public'          => false,
344
			'can_export'      => false,
345
			'query_var'       => false,
346
			'rewrite'         => false,
347
			'capability_type' => 'pods_pod',
348
			'has_archive'     => false,
349
			'hierarchical'    => false,
350
			'supports'        => array( 'title', 'author' ),
351
			'menu_icon'       => 'dashicons-pods'
352
		);
353
354
		$args = self::object_label_fix( $args, 'post_type' );
355
356
		register_post_type( '_pods_pod', apply_filters( 'pods_internal_register_post_type_pod', $args ) );
357
358
		$args = array(
359
			'label'           => 'Pod Fields',
360
			'labels'          => array( 'singular_name' => 'Pod Field' ),
361
			'public'          => false,
362
			'can_export'      => false,
363
			'query_var'       => false,
364
			'rewrite'         => false,
365
			'capability_type' => 'pods_pod',
366
			'has_archive'     => false,
367
			'hierarchical'    => true,
368
			'supports'        => array( 'title', 'editor', 'author' ),
369
			'menu_icon'       => 'dashicons-pods'
370
		);
371
372
		$args = self::object_label_fix( $args, 'post_type' );
373
374
		register_post_type( '_pods_field', apply_filters( 'pods_internal_register_post_type_field', $args ) );
375
	}
376
377
	/**
378
	 * Include Admin
379
	 */
380
	public function admin_init() {
381
382
		self::$admin = pods_admin();
383
	}
384
385
	/**
386
	 * Register Post Types and Taxonomies
387
	 */
388
	public function setup_content_types( $force = false ) {
389
390
		if ( empty( self::$version ) ) {
391
			return;
392
		}
393
394
		$post_types = PodsMeta::$post_types;
395
		$taxonomies = PodsMeta::$taxonomies;
396
397
		$existing_post_types = get_post_types();
398
		$existing_taxonomies = get_taxonomies();
399
400
		$pods_cpt_ct = pods_transient_get( 'pods_wp_cpt_ct' );
401
402
		$cpt_positions = array();
403
404
		if ( empty( $pods_cpt_ct ) && ( ! empty( $post_types ) || ! empty( $taxonomies ) ) ) {
405
			$force = true;
406
		} elseif ( ! empty( $pods_cpt_ct ) && empty( $pods_cpt_ct['post_types'] ) && ! empty( $post_types ) ) {
407
			$force = true;
408
		} elseif ( ! empty( $pods_cpt_ct ) && empty( $pods_cpt_ct['taxonomies'] ) && ! empty( $taxonomies ) ) {
409
			$force = true;
410
		}
411
412
		if ( false === $pods_cpt_ct || $force ) {
413
			/**
414
			 * @var WP_Query
415
			 */
416
			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...
417
418
			$reserved_query_vars = array(
419
				'post_type',
420
				'taxonomy',
421
				'output'
422
			);
423
424
			if ( is_object( $wp_query ) ) {
425
				$reserved_query_vars = array_merge( $reserved_query_vars, array_keys( $wp_query->fill_query_vars( array() ) ) );
426
			}
427
428
			$pods_cpt_ct = array(
429
				'post_types' => array(),
430
				'taxonomies' => array()
431
			);
432
433
			$pods_post_types      = $pods_taxonomies = array();
434
			$supported_post_types = $supported_taxonomies = array();
435
436
			foreach ( $post_types as $post_type ) {
437
				// Post Type exists already
438 View Code Duplication
				if ( isset( $pods_cpt_ct['post_types'][ $post_type['name'] ] ) ) {
439
					continue;
440
				} elseif ( ! empty( $post_type['object'] ) && isset( $existing_post_types[ $post_type['object'] ] ) ) {
441
					continue;
442
				} elseif ( ! $force && isset( $existing_post_types[ $post_type['name'] ] ) ) {
443
					continue;
444
				}
445
446
				$post_type['options']['name'] = $post_type['name'];
447
				$post_type                    = array_merge( $post_type, (array) $post_type['options'] );
448
449
				$post_type_name = pods_v_sanitized( 'name', $post_type );
450
451
				// Labels
452
				$cpt_label    = esc_html( pods_v( 'label', $post_type, ucwords( str_replace( '_', ' ', pods_v( 'name', $post_type ) ) ), true ) );
453
				$cpt_singular = esc_html( pods_v( 'label_singular', $post_type, ucwords( str_replace( '_', ' ', pods_v( 'label', $post_type, $post_type_name, null, true ) ) ), true ) );
454
455
				$cpt_labels                          = array();
456
				$cpt_labels['name']                  = $cpt_label;
457
				$cpt_labels['singular_name']         = $cpt_singular;
458
				$cpt_labels['menu_name']             = pods_v( 'menu_name', $post_type, '', true );
459
				$cpt_labels['name_admin_bar']        = pods_v( 'name_admin_bar', $post_type, '', true );
460
				$cpt_labels['add_new']               = pods_v( 'label_add_new', $post_type, '', true );
461
				$cpt_labels['add_new_item']          = pods_v( 'label_add_new_item', $post_type, '', true );
462
				$cpt_labels['new_item']              = pods_v( 'label_new_item', $post_type, '', true );
463
				$cpt_labels['edit']                  = pods_v( 'label_edit', $post_type, '', true );
464
				$cpt_labels['edit_item']             = pods_v( 'label_edit_item', $post_type, '', true );
465
				$cpt_labels['view']                  = pods_v( 'label_view', $post_type, '', true );
466
				$cpt_labels['view_item']             = pods_v( 'label_view_item', $post_type, '', true );
467
				$cpt_labels['all_items']             = pods_v( 'label_all_items', $post_type, '', true );
468
				$cpt_labels['search_items']          = pods_v( 'label_search_items', $post_type, '', true );
469
				$cpt_labels['not_found']             = pods_v( 'label_not_found', $post_type, '', true );
470
				$cpt_labels['not_found_in_trash']    = pods_v( 'label_not_found_in_trash', $post_type, '', true );
471
				$cpt_labels['parent']                = pods_v( 'label_parent', $post_type, '', true );
472
				$cpt_labels['parent_item_colon']     = pods_v( 'label_parent_item_colon', $post_type, '', true );
473
				$cpt_labels['archives']              = pods_v( 'label_archives', $post_type, '', true );
474
				$cpt_labels['insert_into_item']      = pods_v( 'label_insert_into_item', $post_type, '', true );
475
				$cpt_labels['uploaded_to_this_item'] = pods_v( 'label_uploaded_to_this_item', $post_type, '', true );
476
				$cpt_labels['featured_image']        = pods_v( 'label_featured_image', $post_type, '', true );
477
				$cpt_labels['set_featured_image']    = pods_v( 'label_set_featured_image', $post_type, '', true );
478
				$cpt_labels['remove_featured_image'] = pods_v( 'label_remove_featured_image', $post_type, '', true );
479
				$cpt_labels['use_featured_image']    = pods_v( 'label_use_featured_image', $post_type, '', true );
480
				$cpt_labels['filter_items_list']     = pods_v( 'label_filter_items_list', $post_type, '', true );
481
				$cpt_labels['items_list_navigation'] = pods_v( 'label_items_list_navigation', $post_type, '', true );
482
				$cpt_labels['items_list']            = pods_v( 'label_items_list', $post_type, '', true );
483
484
				// Supported
485
				$cpt_supported = array(
486
					'title'           => (boolean) pods_v( 'supports_title', $post_type, false ),
487
					'editor'          => (boolean) pods_v( 'supports_editor', $post_type, false ),
488
					'author'          => (boolean) pods_v( 'supports_author', $post_type, false ),
489
					'thumbnail'       => (boolean) pods_v( 'supports_thumbnail', $post_type, false ),
490
					'excerpt'         => (boolean) pods_v( 'supports_excerpt', $post_type, false ),
491
					'trackbacks'      => (boolean) pods_v( 'supports_trackbacks', $post_type, false ),
492
					'custom-fields'   => (boolean) pods_v( 'supports_custom_fields', $post_type, false ),
493
					'comments'        => (boolean) pods_v( 'supports_comments', $post_type, false ),
494
					'revisions'       => (boolean) pods_v( 'supports_revisions', $post_type, false ),
495
					'page-attributes' => (boolean) pods_v( 'supports_page_attributes', $post_type, false ),
496
					'post-formats'    => (boolean) pods_v( 'supports_post_formats', $post_type, false )
497
				);
498
499
				// Custom Supported
500
				$cpt_supported_custom = pods_v_sanitized( 'supports_custom', $post_type, '' );
501
502
				if ( ! empty( $cpt_supported_custom ) ) {
503
					$cpt_supported_custom = explode( ',', $cpt_supported_custom );
504
					$cpt_supported_custom = array_filter( array_unique( $cpt_supported_custom ) );
505
506
					foreach ( $cpt_supported_custom as $cpt_support ) {
507
						$cpt_supported[ $cpt_support ] = true;
508
					}
509
				}
510
511
				// Genesis Support
512
				if ( function_exists( 'genesis' ) ) {
513
					$cpt_supported['genesis-seo']             = (boolean) pods_var( 'supports_genesis_seo', $post_type, false );
514
					$cpt_supported['genesis-layouts']         = (boolean) pods_var( 'supports_genesis_layouts', $post_type, false );
515
					$cpt_supported['genesis-simple-sidebars'] = (boolean) pods_var( 'supports_genesis_simple_sidebars', $post_type, false );
516
				}
517
518
				// YARPP Support
519
				if ( defined( 'YARPP_VERSION' ) ) {
520
					$cpt_supported['yarpp_support'] = (boolean) pods_var( 'supports_yarpp_support', $post_type, false );
521
				}
522
523
				// Jetpack Support
524
				if ( class_exists( 'Jetpack' ) ) {
525
					$cpt_supported['supports_jetpack_publicize'] = (boolean) pods_var( 'supports_jetpack_publicize', $post_type, false );
526
					$cpt_supported['supports_jetpack_markdown']  = (boolean) pods_var( 'supports_jetpack_markdown', $post_type, false );
527
				}
528
529
				// WP needs something, if this was empty and none were enabled, it would show title+editor pre 3.5 :(
530
				$cpt_supports = array();
531
532
				if ( ! pods_version_check( 'wp', '3.5' ) ) {
533
					$cpt_supports = array( '_bug_fix_pre_35' );
534
				}
535
536
				foreach ( $cpt_supported as $cpt_support => $supported ) {
537
					if ( true === $supported ) {
538
						$cpt_supports[] = $cpt_support;
539
					}
540
				}
541
542
				if ( empty( $cpt_supports ) && pods_version_check( 'wp', '3.5' ) ) {
543
					$cpt_supports = false;
544
				}
545
546
				// Rewrite
547
				$cpt_rewrite       = (boolean) pods_var( 'rewrite', $post_type, true );
548
				$cpt_rewrite_array = array(
549
					'slug'       => pods_var( 'rewrite_custom_slug', $post_type, str_replace( '_', '-', $post_type_name ), null, true ),
550
					'with_front' => (boolean) pods_var( 'rewrite_with_front', $post_type, true ),
551
					'feeds'      => (boolean) pods_var( 'rewrite_feeds', $post_type, (boolean) pods_var( 'has_archive', $post_type, false ) ),
552
					'pages'      => (boolean) pods_var( 'rewrite_pages', $post_type, true )
553
				);
554
555
				if ( false !== $cpt_rewrite ) {
556
					$cpt_rewrite = $cpt_rewrite_array;
557
				}
558
559
				$capability_type = pods_var( 'capability_type', $post_type, 'post' );
560
561
				if ( 'custom' == $capability_type ) {
562
					$capability_type = pods_var( 'capability_type_custom', $post_type, 'post' );
563
				}
564
565
				$show_in_menu = (boolean) pods_var( 'show_in_menu', $post_type, true );
566
567
				if ( $show_in_menu && 0 < strlen( pods_var_raw( 'menu_location_custom', $post_type ) ) ) {
568
					$show_in_menu = pods_var_raw( 'menu_location_custom', $post_type );
569
				}
570
571
				$menu_icon = pods_var( 'menu_icon', $post_type, null, null, true );
572
573
				if ( ! empty( $menu_icon ) ) {
574
					$menu_icon = pods_evaluate_tags( $menu_icon );
575
				}
576
577
				// Register Post Type
578
				$pods_post_types[ $post_type_name ] = array(
579
					'label'               => $cpt_label,
580
					'labels'              => $cpt_labels,
581
					'description'         => esc_html( pods_var_raw( 'description', $post_type ) ),
582
					'public'              => (boolean) pods_var( 'public', $post_type, true ),
583
					'publicly_queryable'  => (boolean) pods_var( 'publicly_queryable', $post_type, (boolean) pods_var( 'public', $post_type, true ) ),
584
					'exclude_from_search' => (boolean) pods_var( 'exclude_from_search', $post_type, ( (boolean) pods_var( 'public', $post_type, true ) ? false : true ) ),
585
					'show_ui'             => (boolean) pods_var( 'show_ui', $post_type, (boolean) pods_var( 'public', $post_type, true ) ),
586
					'show_in_menu'        => $show_in_menu,
587
					'show_in_nav_menus'   => (boolean) pods_var( 'show_in_nav_menus', $post_type, (boolean) pods_var( 'public', $post_type, true ) ),
588
					'show_in_admin_bar'   => (boolean) pods_var( 'show_in_admin_bar', $post_type, (boolean) pods_var( 'show_in_menu', $post_type, true ) ),
589
					'menu_position'       => (int) pods_var( 'menu_position', $post_type, 0, null, true ),
590
					'menu_icon'           => $menu_icon,
591
					'capability_type'     => $capability_type,
592
					//'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...
593
					'map_meta_cap'        => (boolean) pods_var( 'capability_type_extra', $post_type, true ),
594
					'hierarchical'        => (boolean) pods_var( 'hierarchical', $post_type, false ),
595
					'supports'            => $cpt_supports,
596
					//'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...
597
					//'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...
598
					'has_archive'         => pods_v( 'has_archive_slug', $post_type, (boolean) pods_v( 'has_archive', $post_type, false ), true ),
599
					'rewrite'             => $cpt_rewrite,
600
					'query_var'           => ( false !== (boolean) pods_var( 'query_var', $post_type, true ) ? pods_var( 'query_var_string', $post_type, $post_type_name, null, true ) : false ),
601
					'can_export'          => (boolean) pods_var( 'can_export', $post_type, true )
602
				);
603
604
				// YARPP doesn't use 'supports' array option (yet)
605
				if ( ! empty( $cpt_supports['yarpp_support'] ) ) {
606
					$pods_post_types[ $post_type_name ]['yarpp_support'] = true;
607
				}
608
609
				// Prevent reserved query_var issues
610
				if ( in_array( $pods_post_types[ $post_type_name ]['query_var'], $reserved_query_vars ) ) {
611
					$pods_post_types[ $post_type_name ]['query_var'] = 'post_type_' . $pods_post_types[ $post_type_name ]['query_var'];
612
				}
613
614
				if ( 25 == $pods_post_types[ $post_type_name ]['menu_position'] ) {
615
					$pods_post_types[ $post_type_name ]['menu_position'] ++;
616
				}
617
618
				if ( $pods_post_types[ $post_type_name ]['menu_position'] < 1 || in_array( $pods_post_types[ $post_type_name ]['menu_position'], $cpt_positions ) ) {
619
					unset( $pods_post_types[ $post_type_name ]['menu_position'] );
620
				} else {
621
					$cpt_positions[] = $pods_post_types[ $post_type_name ]['menu_position'];
622
623
					// This would be nice if WP supported floats in menu_position
624
					// $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...
625
				}
626
627
				// Taxonomies
628
				$cpt_taxonomies = array();
629
				$_taxonomies    = get_taxonomies();
630
				$_taxonomies    = array_merge_recursive( $_taxonomies, $pods_taxonomies );
631
				$ignore         = array( 'nav_menu', 'link_category', 'post_format' );
632
633 View Code Duplication
				foreach ( $_taxonomies as $taxonomy => $label ) {
634
					if ( in_array( $taxonomy, $ignore ) ) {
635
						continue;
636
					}
637
638
					if ( false !== (boolean) pods_var( 'built_in_taxonomies_' . $taxonomy, $post_type, false ) ) {
639
						$cpt_taxonomies[] = $taxonomy;
640
641
						if ( isset( $supported_post_types[ $taxonomy ] ) && ! in_array( $post_type_name, $supported_post_types[ $taxonomy ] ) ) {
642
							$supported_post_types[ $taxonomy ][] = $post_type_name;
643
						}
644
					}
645
				}
646
647
				if ( isset( $supported_taxonomies[ $post_type_name ] ) ) {
648
					$supported_taxonomies[ $post_type_name ] = array_merge( (array) $supported_taxonomies[ $post_type_name ], $cpt_taxonomies );
649
				} else {
650
					$supported_taxonomies[ $post_type_name ] = $cpt_taxonomies;
651
				}
652
			}
653
654
			foreach ( $taxonomies as $taxonomy ) {
655
				// Taxonomy Type exists already
656 View Code Duplication
				if ( isset( $pods_cpt_ct['taxonomies'][ $taxonomy['name'] ] ) ) {
657
					continue;
658
				} elseif ( ! empty( $taxonomy['object'] ) && isset( $existing_taxonomies[ $taxonomy['object'] ] ) ) {
659
					continue;
660
				} elseif ( ! $force && isset( $existing_taxonomies[ $taxonomy['name'] ] ) ) {
661
					continue;
662
				}
663
664
				$taxonomy['options']['name'] = $taxonomy['name'];
665
				$taxonomy                    = array_merge( $taxonomy, (array) $taxonomy['options'] );
666
667
				$taxonomy_name = pods_var( 'name', $taxonomy );
668
669
				// Labels
670
				$ct_label    = esc_html( pods_v( 'label', $taxonomy, ucwords( str_replace( '_', ' ', pods_v( 'name', $taxonomy ) ) ), true ) );
671
				$ct_singular = esc_html( pods_v( 'label_singular', $taxonomy, ucwords( str_replace( '_', ' ', pods_v( 'label', $taxonomy, pods_v( 'name', $taxonomy ), null, true ) ) ), true ) );
672
673
				$ct_labels                               = array();
674
				$ct_labels['name']                       = $ct_label;
675
				$ct_labels['singular_name']              = $ct_singular;
676
				$ct_labels['menu_name']                  = pods_v( 'menu_name', $taxonomy, '', true );
677
				$ct_labels['search_items']               = pods_v( 'label_search_items', $taxonomy, '', true );
678
				$ct_labels['popular_items']              = pods_v( 'label_popular_items', $taxonomy, '', true );
679
				$ct_labels['all_items']                  = pods_v( 'label_all_items', $taxonomy, '', true );
680
				$ct_labels['parent_item']                = pods_v( 'label_parent_item', $taxonomy, '', true );
681
				$ct_labels['parent_item_colon']          = pods_v( 'label_parent_item_colon', $taxonomy, '', true );
682
				$ct_labels['edit_item']                  = pods_v( 'label_edit_item', $taxonomy, '', true );
683
				$ct_labels['update_item']                = pods_v( 'label_update_item', $taxonomy, '', true );
684
				$ct_labels['view_item']                  = pods_v( 'label_view_item', $taxonomy, '', true );
685
				$ct_labels['add_new_item']               = pods_v( 'label_add_new_item', $taxonomy, '', true );
686
				$ct_labels['new_item_name']              = pods_v( 'label_new_item_name', $taxonomy, '', true );
687
				$ct_labels['separate_items_with_commas'] = pods_v( 'label_separate_items_with_commas', $taxonomy, '', true );
688
				$ct_labels['add_or_remove_items']        = pods_v( 'label_add_or_remove_items', $taxonomy, '', true );
689
				$ct_labels['choose_from_most_used']      = pods_v( 'label_choose_from_the_most_used', $taxonomy, '', true );
690
				$ct_labels['not_found']                  = pods_v( 'label_not_found', $taxonomy, '', true );
691
				$ct_labels['no_terms']                   = pods_v( 'label_no_terms', $taxonomy, '', true );
692
				$ct_labels['items_list']                 = pods_v( 'label_items_list', $taxonomy, '', true );
693
				$ct_labels['items_list_navigation']      = pods_v( 'label_items_list_navigation', $taxonomy, '', true );
694
695
				// Rewrite
696
				$ct_rewrite       = (boolean) pods_var( 'rewrite', $taxonomy, true );
697
				$ct_rewrite_array = array(
698
					'slug'         => pods_var( 'rewrite_custom_slug', $taxonomy, str_replace( '_', '-', $taxonomy_name ), null, true ),
699
					'with_front'   => (boolean) pods_var( 'rewrite_with_front', $taxonomy, true ),
700
					'hierarchical' => (boolean) pods_var( 'rewrite_hierarchical', $taxonomy, (boolean) pods_var( 'hierarchical', $taxonomy, false ) )
701
				);
702
703
				if ( false !== $ct_rewrite ) {
704
					$ct_rewrite = $ct_rewrite_array;
705
				}
706
707
				/**
708
				 * Default tax capabilities
709
				 * @see https://codex.wordpress.org/Function_Reference/register_taxonomy
710
				 */
711
				$capability_type = pods_var( 'capability_type', $taxonomy, 'default' );
712
				$tax_capabilities = array();
713
714
				if ( 'custom' == $capability_type ) {
715
					$capability_type = pods_var( 'capability_type_custom', $taxonomy, 'default' );
716
					if ( ! empty( $capability_type ) && 'default' != $capability_type ) {
717
						$capability_type .=  '_terms';
718
						$tax_capabilities = array(
719
							'manage_terms' => 'manage_' . $capability_type,
720
							'edit_terms'   => 'edit_' . $capability_type,
721
							'delete_terms' => 'delete_' . $capability_type,
722
							'assign_terms' => 'assign_' . $capability_type,
723
						);
724
					}
725
				}
726
727
				// Register Taxonomy
728
				$pods_taxonomies[ $taxonomy_name ] = array(
729
					'label'                 => $ct_label,
730
					'labels'                => $ct_labels,
731
					'public'                => (boolean) pods_var( 'public', $taxonomy, true ),
732
					'show_ui'               => (boolean) pods_var( 'show_ui', $taxonomy, (boolean) pods_var( 'public', $taxonomy, true ) ),
733
					'show_in_nav_menus'     => (boolean) pods_var( 'show_in_nav_menus', $taxonomy, (boolean) pods_var( 'public', $taxonomy, true ) ),
734
					'show_tagcloud'         => (boolean) pods_var( 'show_tagcloud', $taxonomy, (boolean) pods_var( 'show_ui', $taxonomy, (boolean) pods_var( 'public', $taxonomy, true ) ) ),
735
					'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 ) ) ) ),
736
					'show_in_quick_edit'    => (boolean) pods_var( 'show_in_quick_edit', $taxonomy, (boolean) pods_var( 'show_ui', $taxonomy, (boolean) pods_var( 'public', $taxonomy, true ) ) ),
737
					'hierarchical'          => (boolean) pods_var( 'hierarchical', $taxonomy, false ),
738
					//'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...
739
					'capabilities'          => $tax_capabilities,
740
					//'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...
741
					'update_count_callback' => pods_var( 'update_count_callback', $taxonomy, null, null, true ),
742
					'query_var'             => ( false !== (boolean) pods_var( 'query_var', $taxonomy, true ) ? pods_var( 'query_var_string', $taxonomy, $taxonomy_name, null, true ) : false ),
743
					'rewrite'               => $ct_rewrite,
744
					'show_admin_column'     => (boolean) pods_var( 'show_admin_column', $taxonomy, false ),
745
					'sort'                  => (boolean) pods_var( 'sort', $taxonomy, false ),
746
				);
747
748
				if ( is_array( $ct_rewrite ) && ! $pods_taxonomies[ $taxonomy_name ]['query_var'] ) {
749
					$pods_taxonomies[ $taxonomy_name ]['query_var'] = pods_var( 'query_var_string', $taxonomy, $taxonomy_name, null, true );
750
				};
751
752
				// Prevent reserved query_var issues
753
				if ( in_array( $pods_taxonomies[ $taxonomy_name ]['query_var'], $reserved_query_vars ) ) {
754
					$pods_taxonomies[ $taxonomy_name ]['query_var'] = 'taxonomy_' . $pods_taxonomies[ $taxonomy_name ]['query_var'];
755
				}
756
757
				// Integration for Single Value Taxonomy UI
758
				if ( function_exists( 'tax_single_value_meta_box' ) ) {
759
					$pods_taxonomies[ $taxonomy_name ]['single_value'] = (boolean) pods_var( 'single_value', $taxonomy, false );
760
					$pods_taxonomies[ $taxonomy_name ]['required']     = (boolean) pods_var( 'single_value_required', $taxonomy, false );
761
				}
762
763
				// Post Types
764
				$ct_post_types = array();
765
				$_post_types   = get_post_types();
766
				$_post_types   = array_merge_recursive( $_post_types, $pods_post_types );
767
				$ignore        = array( 'revision' );
768
769 View Code Duplication
				foreach ( $_post_types as $post_type => $options ) {
770
					if ( in_array( $post_type, $ignore ) ) {
771
						continue;
772
					}
773
774
					if ( false !== (boolean) pods_var( 'built_in_post_types_' . $post_type, $taxonomy, false ) ) {
775
						$ct_post_types[] = $post_type;
776
777
						if ( isset( $supported_taxonomies[ $post_type ] ) && ! in_array( $taxonomy_name, $supported_taxonomies[ $post_type ] ) ) {
778
							$supported_taxonomies[ $post_type ][] = $taxonomy_name;
779
						}
780
					}
781
				}
782
783
				if ( isset( $supported_post_types[ $taxonomy_name ] ) ) {
784
					$supported_post_types[ $taxonomy_name ] = array_merge( $supported_post_types[ $taxonomy_name ], $ct_post_types );
785
				} else {
786
					$supported_post_types[ $taxonomy_name ] = $ct_post_types;
787
				}
788
			}
789
790
			$pods_post_types = apply_filters( 'pods_wp_post_types', $pods_post_types );
791
			$pods_taxonomies = apply_filters( 'pods_wp_taxonomies', $pods_taxonomies );
792
793
			$supported_post_types = apply_filters( 'pods_wp_supported_post_types', $supported_post_types );
794
			$supported_taxonomies = apply_filters( 'pods_wp_supported_taxonomies', $supported_taxonomies );
795
796
			foreach ( $pods_taxonomies as $taxonomy => $options ) {
797
				$ct_post_types = null;
798
799
				if ( isset( $supported_post_types[ $taxonomy ] ) && ! empty( $supported_post_types[ $taxonomy ] ) ) {
800
					$ct_post_types = $supported_post_types[ $taxonomy ];
801
				}
802
803
				$pods_cpt_ct['taxonomies'][ $taxonomy ] = array(
804
					'post_types' => $ct_post_types,
805
					'options'    => $options
806
				);
807
			}
808
809
			foreach ( $pods_post_types as $post_type => $options ) {
810
				if ( isset( $supported_taxonomies[ $post_type ] ) && ! empty( $supported_taxonomies[ $post_type ] ) ) {
811
					$options['taxonomies'] = $supported_taxonomies[ $post_type ];
812
				}
813
814
				$pods_cpt_ct['post_types'][ $post_type ] = $options;
815
			}
816
817
			pods_transient_set( 'pods_wp_cpt_ct', $pods_cpt_ct );
818
		}
819
820
		foreach ( $pods_cpt_ct['taxonomies'] as $taxonomy => $options ) {
821
			if ( isset( self::$content_types_registered['taxonomies'] ) && in_array( $taxonomy, self::$content_types_registered['taxonomies'] ) ) {
822
				continue;
823
			}
824
825
			$ct_post_types = $options['post_types'];
826
			$options       = $options['options'];
827
828
			$options = apply_filters( 'pods_register_taxonomy_' . $taxonomy, $options, $taxonomy );
829
			$options = apply_filters( 'pods_register_taxonomy', $options, $taxonomy );
830
831
			$options = self::object_label_fix( $options, 'taxonomy' );
832
833
			/** 
834
			 * Hide tagcloud compatibility
835
			 * @todo check https://core.trac.wordpress.org/ticket/36964
836
			 * @see wp-admin/edit-tags.php L389
837
			 */
838
			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...
839
				$options['labels']['popular_items'] = null;
840
			}
841
842
			// Max length for taxonomies are 32 characters
843
			$taxonomy = substr( $taxonomy, 0, 32 );
844
845
			// i18n compatibility for plugins that override it
846 View Code Duplication
			if ( is_array( $options['rewrite'] ) && isset( $options['rewrite']['slug'] ) && ! empty( $options['rewrite']['slug'] ) ) {
847
				$options['rewrite']['slug'] = _x( $options['rewrite']['slug'], 'URL taxonomy slug', 'pods' );
848
			}
849
850 View Code Duplication
			if ( 1 == pods_var( 'pods_debug_register', 'get', 0 ) && pods_is_admin( array( 'pods' ) ) ) {
851
				pods_debug( array( $taxonomy, $ct_post_types, $options ) );
852
			}
853
854
			register_taxonomy( $taxonomy, $ct_post_types, $options );
855
856
			if ( ! isset( self::$content_types_registered['taxonomies'] ) ) {
857
				self::$content_types_registered['taxonomies'] = array();
858
			}
859
860
			self::$content_types_registered['taxonomies'][] = $taxonomy;
861
		}
862
863
		foreach ( $pods_cpt_ct['post_types'] as $post_type => $options ) {
864
			if ( isset( self::$content_types_registered['post_types'] ) && in_array( $post_type, self::$content_types_registered['post_types'] ) ) {
865
				continue;
866
			}
867
868
			$options = apply_filters( 'pods_register_post_type_' . $post_type, $options, $post_type );
869
			$options = apply_filters( 'pods_register_post_type', $options, $post_type );
870
871
			$options = self::object_label_fix( $options, 'post_type' );
872
873
			// Max length for post types are 20 characters
874
			$post_type = substr( $post_type, 0, 20 );
875
876
			// i18n compatibility for plugins that override it
877 View Code Duplication
			if ( is_array( $options['rewrite'] ) && isset( $options['rewrite']['slug'] ) && ! empty( $options['rewrite']['slug'] ) ) {
878
				$options['rewrite']['slug'] = _x( $options['rewrite']['slug'], 'URL slug', 'pods' );
879
			}
880
881 View Code Duplication
			if ( 1 == pods_var( 'pods_debug_register', 'get', 0 ) && pods_is_admin( array( 'pods' ) ) ) {
882
				pods_debug( array( $post_type, $options ) );
883
			}
884
885
			register_post_type( $post_type, $options );
886
887
			if ( ! isset( self::$content_types_registered['post_types'] ) ) {
888
				self::$content_types_registered['post_types'] = array();
889
			}
890
891
			self::$content_types_registered['post_types'][] = $post_type;
892
		}
893
894
	}
895
896
	/**
897
	 * Check if we need to flush WordPress rewrite rules
898
	 * This gets run during 'init' action late in the game to give other plugins time to register their rewrite rules
899
	 */
900
	public function flush_rewrite_rules() {
901
902
		$flush = (int) pods_transient_get( 'pods_flush_rewrites' );
903
904
		if ( 1 === $flush ) {
905
			/**
906
			 * @var $wp_rewrite WP_Rewrite
907
			 */
908
			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...
909
			$wp_rewrite->flush_rules();
910
			$wp_rewrite->init();
911
912
			pods_transient_set( 'pods_flush_rewrites', 0 );
913
		}
914
	}
915
916
	/**
917
	 * Update Post Type messages
918
	 *
919
	 * @param array $messages
920
	 *
921
	 * @return array
922
	 * @since 2.0.2
923
	 */
924
	public function setup_updated_messages( $messages ) {
925
926
		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...
927
928
		$post_types          = PodsMeta::$post_types;
929
		$existing_post_types = get_post_types();
930
931
		$pods_cpt_ct = pods_transient_get( 'pods_wp_cpt_ct' );
932
933
		if ( empty( $pods_cpt_ct ) || empty( $post_types ) ) {
934
			return $messages;
935
		}
936
937
		foreach ( $post_types as $post_type ) {
938
			if ( ! isset( $pods_cpt_ct['post_types'][ $post_type['name'] ] ) ) {
939
				continue;
940
			}
941
942
			$labels = self::object_label_fix( $pods_cpt_ct['post_types'][ $post_type['name'] ], 'post_type' );
943
			$labels = $labels['labels'];
944
945
			$messages[ $post_type['name'] ] = array(
946
				1  => sprintf( __( '%s updated. <a href="%s">%s</a>', 'pods' ), $labels['singular_name'], esc_url( get_permalink( $post_ID ) ), $labels['view_item'] ),
947
				2  => __( 'Custom field updated.', 'pods' ),
948
				3  => __( 'Custom field deleted.', 'pods' ),
949
				4  => sprintf( __( '%s updated.', 'pods' ), $labels['singular_name'] ),
950
				/* translators: %s: date and time of the revision */
951
				5  => isset( $_GET['revision'] ) ? sprintf( __( '%s restored to revision from %s', 'pods' ), $labels['singular_name'], wp_post_revision_title( (int) $_GET['revision'], false ) ) : false,
952
				6  => sprintf( __( '%s published. <a href="%s">%s</a>', 'pods' ), $labels['singular_name'], esc_url( get_permalink( $post_ID ) ), $labels['view_item'] ),
953
				7  => sprintf( __( '%s saved.', 'pods' ), $labels['singular_name'] ),
954
				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'] ),
955
				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
956
					date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink( $post_ID ) ), $labels['singular_name'] ),
957
				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'] )
958
			);
959
960
			if ( false === (boolean) $pods_cpt_ct['post_types'][ $post_type['name'] ]['public'] ) {
961
				$messages[ $post_type['name'] ][1]  = sprintf( __( '%s updated.', 'pods' ), $labels['singular_name'] );
962
				$messages[ $post_type['name'] ][6]  = sprintf( __( '%s published.', 'pods' ), $labels['singular_name'] );
963
				$messages[ $post_type['name'] ][8]  = sprintf( __( '%s submitted.', 'pods' ), $labels['singular_name'] );
964
				$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
965
					date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ) );
966
				$messages[ $post_type['name'] ][10] = sprintf( __( '%s draft updated.', 'pods' ), $labels['singular_name'] );
967
			}
968
		}
969
970
		return $messages;
971
	}
972
973
	/**
974
	 * @param        $args
975
	 * @param string $type
976
	 *
977
	 * @return array
978
	 */
979
	public static function object_label_fix( $args, $type = 'post_type' ) {
980
981
		if ( empty( $args ) || ! is_array( $args ) ) {
982
			$args = array();
983
		}
984
985
		if ( ! isset( $args['labels'] ) || ! is_array( $args['labels'] ) ) {
986
			$args['labels'] = array();
987
		}
988
989
		$label          = pods_v( 'name', $args['labels'], pods_v( 'label', $args, __( 'Items', 'pods' ), true ), true );
990
		$singular_label = pods_v( 'singular_name', $args['labels'], pods_v( 'label_singular', $args, __( 'Item', 'pods' ), true ), true );
991
992
		$labels = $args['labels'];
993
994
		$labels['name']          = $label;
995
		$labels['singular_name'] = $singular_label;
996
997
		if ( 'post_type' == $type ) {
998
			$labels['menu_name']             = pods_v( 'menu_name', $labels, $label, true );
999
			$labels['name_admin_bar']        = pods_v( 'name_admin_bar', $labels, $singular_label, true );
1000
			$labels['add_new']               = pods_v( 'add_new', $labels, __( 'Add New', 'pods' ), true );
1001
			$labels['add_new_item']          = pods_v( 'add_new_item', $labels, sprintf( __( 'Add New %s', 'pods' ), $singular_label ), true );
1002
			$labels['new_item']              = pods_v( 'new_item', $labels, sprintf( __( 'New %s', 'pods' ), $singular_label ), true );
1003
			$labels['edit']                  = pods_v( 'edit', $labels, __( 'Edit', 'pods' ), true );
1004
			$labels['edit_item']             = pods_v( 'edit_item', $labels, sprintf( __( 'Edit %s', 'pods' ), $singular_label ), true );
1005
			$labels['view']                  = pods_v( 'view', $labels, sprintf( __( 'View %s', 'pods' ), $singular_label ), true );
1006
			$labels['view_item']             = pods_v( 'view_item', $labels, sprintf( __( 'View %s', 'pods' ), $singular_label ), true );
1007
			$labels['all_items']             = pods_v( 'all_items', $labels, sprintf( __( 'All %s', 'pods' ), $label ), true );
1008
			$labels['search_items']          = pods_v( 'search_items', $labels, sprintf( __( 'Search %s', 'pods' ), $label ), true );
1009
			$labels['not_found']             = pods_v( 'not_found', $labels, sprintf( __( 'No %s Found', 'pods' ), $label ), true );
1010
			$labels['not_found_in_trash']    = pods_v( 'not_found_in_trash', $labels, sprintf( __( 'No %s Found in Trash', 'pods' ), $label ), true );
1011
			$labels['parent']                = pods_v( 'parent', $labels, sprintf( __( 'Parent %s', 'pods' ), $singular_label ), true );
1012
			$labels['parent_item_colon']     = pods_v( 'parent_item_colon', $labels, sprintf( __( 'Parent %s:', 'pods' ), $singular_label ), true );
1013
			$labels['featured_image']        = pods_v( 'featured_image', $labels, __( 'Featured Image', 'pods' ), true );
1014
			$labels['set_featured_image']    = pods_v( 'set_featured_image', $labels, __( 'Set featured image', 'pods' ), true );
1015
			$labels['remove_featured_image'] = pods_v( 'remove_featured_image', $labels, __( 'Remove featured image', 'pods' ), true );
1016
			$labels['use_featured_image']    = pods_v( 'use_featured_image', $labels, __( 'Use as featured image', 'pods' ), true );
1017
			$labels['archives']              = pods_v( 'archives', $labels, sprintf( __( '%s Archives', 'pods' ), $singular_label ), true );
1018
			$labels['insert_into_item']      = pods_v( 'insert_into_item', $labels, sprintf( __( 'Insert into %s', 'pods' ), $singular_label ), true );
1019
			$labels['uploaded_to_this_item'] = pods_v( 'uploaded_to_this_item', $labels, sprintf( __( 'Uploaded to this %s', 'pods' ), $singular_label ), true );
1020
			$labels['filter_items_list']     = pods_v( 'filter_items_list', $labels, sprintf( __( 'Filter %s lists', 'pods' ), $label ), true );
1021
			$labels['items_list_navigation'] = pods_v( 'items_list_navigation', $labels, sprintf( __( '%s navigation', 'pods' ), $label ), true );
1022
			$labels['items_list']            = pods_v( 'items_list', $labels, sprintf( __( '%s list', 'pods' ), $label ), true );
1023
		} elseif ( 'taxonomy' == $type ) {
1024
			$labels['menu_name']                  = pods_v( 'menu_name', $labels, $label, true );
1025
			$labels['search_items']               = pods_v( 'search_items', $labels, sprintf( __( 'Search %s', 'pods' ), $label ), true );
1026
			$labels['popular_items']              = pods_v( 'popular_items', $labels, sprintf( __( 'Popular %s', 'pods' ), $label ), true );
1027
			$labels['all_items']                  = pods_v( 'all_items', $labels, sprintf( __( 'All %s', 'pods' ), $label ), true );
1028
			$labels['parent_item']                = pods_v( 'parent_item', $labels, sprintf( __( 'Parent %s', 'pods' ), $singular_label ), true );
1029
			$labels['parent_item_colon']          = pods_v( 'parent_item_colon', $labels, sprintf( __( 'Parent %s :', 'pods' ), $singular_label ), true );
1030
			$labels['edit_item']                  = pods_v( 'edit_item', $labels, sprintf( __( 'Edit %s', 'pods' ), $singular_label ), true );
1031
			$labels['view_item']                  = pods_v( 'view_item', $labels, sprintf( __( 'View %s', 'pods' ), $singular_label ), true );
1032
			$labels['update_item']                = pods_v( 'update_item', $labels, sprintf( __( 'Update %s', 'pods' ), $singular_label ), true );
1033
			$labels['add_new_item']               = pods_v( 'add_new_item', $labels, sprintf( __( 'Add New %s', 'pods' ), $singular_label ), true );
1034
			$labels['new_item_name']              = pods_v( 'new_item_name', $labels, sprintf( __( 'New %s Name', 'pods' ), $singular_label ), true );
1035
			$labels['separate_items_with_commas'] = pods_v( 'separate_items_with_commas', $labels, sprintf( __( 'Separate %s with commas', 'pods' ), $label ), true );
1036
			$labels['add_or_remove_items']        = pods_v( 'add_or_remove_items', $labels, sprintf( __( 'Add or remove %s', 'pods' ), $label ), true );
1037
			$labels['choose_from_most_used']      = pods_v( 'choose_from_most_used', $labels, sprintf( __( 'Choose from the most used %s', 'pods' ), $label ), true );
1038
			$labels['not_found']                  = pods_v( 'not_found', $labels, sprintf( __( 'No %s found.', 'pods' ), $label ), true );
1039
			$labels['no_terms']                   = pods_v( 'no_terms', $labels, sprintf( __( 'No %s', 'pods' ), $label ), true );
1040
			$labels['items_list_navigation']      = pods_v( 'items_list_navigation', $labels, sprintf( __( '%s navigation', 'pods' ), $label ), true );
1041
			$labels['items_list']                 = pods_v( 'items_list', $labels, sprintf( __( '%s list', 'pods' ), $label ), true );
1042
		}
1043
1044
		$args['labels'] = $labels;
1045
1046
		return $args;
1047
	}
1048
1049
	/**
1050
	 * Activate and Install
1051
	 */
1052
	public function activate_install() {
1053
1054
		register_activation_hook( PODS_DIR . 'init.php', array( $this, 'activate' ) );
1055
		register_deactivation_hook( PODS_DIR . 'init.php', array( $this, 'deactivate' ) );
1056
1057
		add_action( 'wpmu_new_blog', array( $this, 'new_blog' ), 10, 6 );
1058
1059
		if ( empty( self::$version ) || version_compare( self::$version, PODS_VERSION, '<' ) || version_compare( self::$version, PODS_DB_VERSION, '<=' ) || self::$upgrade_needed ) {
1060
			$this->setup();
1061
		} elseif ( self::$version !== PODS_VERSION ) {
1062
			delete_option( 'pods_framework_version' );
1063
			add_option( 'pods_framework_version', PODS_VERSION, '', 'yes' );
1064
1065
			self::$version = PODS_VERSION;
1066
1067
			pods_api()->cache_flush_pods();
1068
		}
1069
1070
	}
1071
1072
	/**
1073
	 *
1074
	 */
1075
	public function activate() {
1076
1077
		global $wpdb;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
1078
1079
		if ( function_exists( 'is_multisite' ) && is_multisite() && isset( $_GET['networkwide'] ) && 1 == $_GET['networkwide'] ) {
1080
			$_blog_ids = $wpdb->get_col( "SELECT `blog_id` FROM `{$wpdb->blogs}`" );
1081
1082
			foreach ( $_blog_ids as $_blog_id ) {
1083
				$this->setup( $_blog_id );
1084
			}
1085
		} else {
1086
			$this->setup();
1087
		}
1088
	}
1089
1090
	/**
1091
	 *
1092
	 */
1093
	public function deactivate() {
1094
1095
		pods_api()->cache_flush_pods();
1096
1097
	}
1098
1099
	/**
1100
	 *
1101
	 */
1102
	public function needs_upgrade( $current = null, $last = null ) {
1103
1104
		if ( null === $current ) {
1105
			$current = self::$version;
1106
		}
1107
1108
		if ( null === $last ) {
1109
			$last = self::$version_last;
1110
		}
1111
1112
		$upgrade_needed = false;
1113
1114
		if ( ! empty( $current ) ) {
1115
			foreach ( self::$upgrades as $old_version => $new_version ) {
1116
				/*if ( '2.1.0' == $new_version && ( is_developer() ) )
0 ignored issues
show
Unused Code Comprehensibility introduced by
50% of this comment could be valid code. Did you maybe forget this after debugging?

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

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

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

Loading history...
1117
					continue;*/
1118
1119
				if ( version_compare( $last, $old_version, '>=' ) && version_compare( $last, $new_version, '<' ) && version_compare( $current, $new_version, '>=' ) && 1 != self::$upgraded ) {
1120
					$upgrade_needed = true;
1121
1122
					break;
1123
				}
1124
			}
1125
		}
1126
1127
		return $upgrade_needed;
1128
	}
1129
1130
	/**
1131
	 * @param $_blog_id
1132
	 * @param $user_id
1133
	 * @param $domain
1134
	 * @param $path
1135
	 * @param $site_id
1136
	 * @param $meta
1137
	 */
1138
	public function new_blog( $_blog_id, $user_id, $domain, $path, $site_id, $meta ) {
0 ignored issues
show
Unused Code introduced by
The parameter $user_id is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $domain is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $path is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $site_id is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $meta is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
1139
1140
		if ( function_exists( 'is_multisite' ) && is_multisite() && is_plugin_active_for_network( basename( PODS_DIR ) . '/init.php' ) ) {
1141
			$this->setup( $_blog_id );
1142
		}
1143
	}
1144
1145
	/**
1146
	 * @param null $_blog_id
1147
	 */
1148
	public function setup( $_blog_id = null ) {
1149
1150
		global $wpdb;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
1151
1152
		// Switch DB table prefixes
1153 View Code Duplication
		if ( null !== $_blog_id && $_blog_id != $wpdb->blogid ) {
1154
			switch_to_blog( pods_absint( $_blog_id ) );
1155
		} else {
1156
			$_blog_id = null;
1157
		}
1158
1159
		// Setup DB tables
1160
		$pods_version      = get_option( 'pods_framework_version' );
1161
		$pods_version_last = get_option( 'pods_framework_version_last' );
1162
1163
		// Install Pods
1164
		if ( empty( $pods_version ) ) {
1165
			pods_upgrade()->install( $_blog_id );
1166
1167
			$old_version = get_option( 'pods_version' );
1168
1169
			if ( ! empty( $old_version ) ) {
1170
				if ( false === strpos( $old_version, '.' ) ) {
1171
					$old_version = pods_version_to_point( $old_version );
1172
				}
1173
1174
				delete_option( 'pods_framework_version_last' );
1175
				add_option( 'pods_framework_version_last', $pods_version, '', 'yes' );
1176
1177
				self::$version_last = $old_version;
1178
			}
1179
		} // Upgrade Wizard needed
1180
		elseif ( $this->needs_upgrade( $pods_version, $pods_version_last ) ) {
1181
			// Do not do anything
1182
			return;
1183
		} // Update Pods and run any required DB updates
1184
		elseif ( version_compare( $pods_version, PODS_VERSION, '<=' ) ) {
1185
			if ( false !== apply_filters( 'pods_update_run', null, PODS_VERSION, $pods_version, $_blog_id ) && ! isset( $_GET['pods_bypass_update'] ) ) {
1186
				do_action( 'pods_update', PODS_VERSION, $pods_version, $_blog_id );
1187
1188
				// Update 2.0 alpha / beta sites
1189
				if ( version_compare( '2.0.0-a-1', $pods_version, '<=' ) && version_compare( $pods_version, '2.0.0-b-15', '<=' ) ) {
1190
					include( PODS_DIR . 'sql/update-2.0-beta.php' );
1191
				}
1192
1193
				if ( version_compare( $pods_version, PODS_DB_VERSION, '<=' ) ) {
1194
					include( PODS_DIR . 'sql/update.php' );
1195
				}
1196
1197
				do_action( 'pods_update_post', PODS_VERSION, $pods_version, $_blog_id );
1198
			}
1199
1200
			delete_option( 'pods_framework_version_last' );
1201
			add_option( 'pods_framework_version_last', $pods_version, '', 'yes' );
1202
1203
			self::$version_last = $pods_version;
1204
		}
1205
1206
		delete_option( 'pods_framework_version' );
1207
		add_option( 'pods_framework_version', PODS_VERSION, '', 'yes' );
1208
1209
		delete_option( 'pods_framework_db_version' );
1210
		add_option( 'pods_framework_db_version', PODS_DB_VERSION, '', 'yes' );
1211
1212
		self::$version = PODS_VERSION;
1213
		self::$db_version = PODS_DB_VERSION;
1214
1215
		pods_api()->cache_flush_pods();
1216
1217
		// Restore DB table prefix (if switched)
1218
		if ( null !== $_blog_id ) {
1219
			restore_current_blog();
1220
		}
1221
1222
	}
1223
1224
	/**
1225
	 * @param null $_blog_id
1226
	 */
1227
	public function reset( $_blog_id = null ) {
1228
1229
		global $wpdb;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
1230
1231
		// Switch DB table prefixes
1232 View Code Duplication
		if ( null !== $_blog_id && $_blog_id != $wpdb->blogid ) {
1233
			switch_to_blog( pods_absint( $_blog_id ) );
1234
		} else {
1235
			$_blog_id = null;
1236
		}
1237
1238
		$api = pods_api();
1239
1240
		$pods = $api->load_pods( array( 'names_ids' => true, 'table_info' => false ) );
1241
1242
		foreach ( $pods as $pod_id => $pod_label ) {
0 ignored issues
show
Bug introduced by
The expression $pods of type array|object|integer|double|string|null|boolean is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
1243
			$api->delete_pod( array( 'id' => $pod_id ) );
1244
		}
1245
1246
		$templates = $api->load_templates();
1247
1248
		foreach ( $templates as $template ) {
1249
			$api->delete_template( array( 'id' => $template['id'] ) );
1250
		}
1251
1252
		$pages = $api->load_pages();
1253
1254
		foreach ( $pages as $page ) {
1255
			$api->delete_page( array( 'id' => $page['id'] ) );
1256
		}
1257
1258
		$helpers = $api->load_helpers();
1259
1260
		foreach ( $helpers as $helper ) {
1261
			$api->delete_helper( array( 'id' => $helper['id'] ) );
1262
		}
1263
1264
		$tables = $wpdb->get_results( "SHOW TABLES LIKE '{$wpdb->prefix}pods%'", ARRAY_N );
1265
1266
		if ( ! empty( $tables ) ) {
1267
			foreach ( $tables as $table ) {
1268
				$table = $table[0];
1269
1270
				pods_query( "DROP TABLE `{$table}`", false );
1271
			}
1272
		}
1273
1274
		// Remove any orphans
1275
		$wpdb->query( "
1276
                DELETE `p`, `pm`
1277
                FROM `{$wpdb->posts}` AS `p`
1278
                LEFT JOIN `{$wpdb->postmeta}` AS `pm`
1279
                    ON `pm`.`post_id` = `p`.`ID`
1280
                WHERE
1281
                    `p`.`post_type` LIKE '_pods_%'
1282
            " );
1283
1284
		delete_option( 'pods_framework_version' );
1285
		delete_option( 'pods_framework_db_version' );
1286
		delete_option( 'pods_framework_upgrade_2_0' );
1287
		delete_option( 'pods_framework_upgraded_1_x' );
1288
1289
		// @todo Make sure all entries are being cleaned and do something about the pods_framework_upgrade_{version} dynamic entries created by PodsUpgrade
1290
		delete_option( 'pods_framework_upgrade_2_0_0' );
1291
		delete_option( 'pods_framework_upgrade_2_0_sister_ids' );
1292
		delete_option( 'pods_framework_version_last' );
1293
1294
		delete_option( 'pods_component_settings' );
1295
1296
		$api->cache_flush_pods();
1297
1298
		pods_transient_clear( 'pods_flush_rewrites' );
1299
1300
		self::$version = '';
1301
1302
		// Restore DB table prefix (if switched)
1303
		if ( null !== $_blog_id ) {
1304
			restore_current_blog();
1305
		}
1306
	}
1307
1308
	public function run() {
1309
1310
		static $ran;
1311
1312
		if ( ! empty( $ran ) ) {
1313
			return;
1314
		}
1315
1316
		$ran = true;
1317
1318
		$this->load_i18n();
1319
1320
		if ( ! did_action( 'plugins_loaded' ) ) {
1321
			add_action( 'plugins_loaded', array( $this, 'load_components' ), 11 );
1322
		} else {
1323
			$this->load_components();
1324
		}
1325
1326
		if ( ! did_action( 'setup_theme' ) ) {
1327
			add_action( 'setup_theme', array( $this, 'load_meta' ), 14 );
1328
		} else {
1329
			$this->load_meta();
1330
		}
1331
1332
		if ( ! did_action( 'init' ) ) {
1333
			add_action( 'init', array( $this, 'core' ), 11 );
1334
			add_action( 'init', array( $this, 'add_rest_support' ), 12 );
1335
			add_action( 'init', array( $this, 'setup_content_types' ), 11 );
1336
1337
			if ( is_admin() ) {
1338
				add_action( 'init', array( $this, 'admin_init' ), 12 );
1339
			}
1340
		} else {
1341
			$this->core();
1342
			$this->add_rest_support();
1343
			$this->setup_content_types();
1344
1345
			if ( is_admin() ) {
1346
				$this->admin_init();
1347
			}
1348
		}
1349
1350
		add_action( 'wp_enqueue_scripts', array( $this, 'register_assets' ), 15 );
1351
		add_action( 'admin_enqueue_scripts', array( $this, 'register_assets' ), 15 );
1352
		add_action( 'login_enqueue_scripts', array( $this, 'register_assets' ), 15 );
1353
1354
		add_filter( 'post_updated_messages', array( $this, 'setup_updated_messages' ), 10, 1 );
1355
		add_action( 'delete_attachment', array( $this, 'delete_attachment' ) );
1356
1357
		// Register widgets
1358
		add_action( 'widgets_init', array( $this, 'register_widgets' ) );
1359
1360
		// Show admin bar links
1361
		add_action( 'admin_bar_menu', array( $this, 'admin_bar_links' ), 81 );
1362
1363
	}
1364
1365
	/**
1366
	 * Delete Attachments from relationships
1367
	 *
1368
	 * @param int $_ID
1369
	 */
1370
	public function delete_attachment( $_ID ) {
1371
1372
		global $wpdb;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
1373
1374
		$_ID = (int) $_ID;
1375
1376
		do_action( 'pods_delete_attachment', $_ID );
1377
1378
		$file_types = "'" . implode( "', '", PodsForm::file_field_types() ) . "'";
1379
1380
		if ( ! pods_tableless() ) {
1381
			$sql = "
1382
                DELETE `rel`
1383
                FROM `@wp_podsrel` AS `rel`
1384
                LEFT JOIN `{$wpdb->posts}` AS `p`
1385
                    ON
1386
                        `p`.`post_type` = '_pods_field'
1387
                        AND ( `p`.`ID` = `rel`.`field_id` OR `p`.`ID` = `rel`.`related_field_id` )
1388
                LEFT JOIN `{$wpdb->postmeta}` AS `pm`
1389
                    ON
1390
                        `pm`.`post_id` = `p`.`ID`
1391
                        AND `pm`.`meta_key` = 'type'
1392
                        AND `pm`.`meta_value` IN ( {$file_types} )
1393
                WHERE
1394
                    `p`.`ID` IS NOT NULL
1395
                    AND `pm`.`meta_id` IS NOT NULL
1396
                    AND `rel`.`item_id` = {$_ID}";
1397
1398
			pods_query( $sql, false );
1399
		}
1400
1401
		// Post Meta
1402 View Code Duplication
		if ( ! empty( PodsMeta::$post_types ) ) {
1403
			$sql = "
1404
                DELETE `rel`
1405
                FROM `@wp_postmeta` AS `rel`
1406
                LEFT JOIN `{$wpdb->posts}` AS `p`
1407
                    ON
1408
                        `p`.`post_type` = '_pods_field'
1409
                LEFT JOIN `{$wpdb->postmeta}` AS `pm`
1410
                    ON
1411
                        `pm`.`post_id` = `p`.`ID`
1412
                        AND `pm`.`meta_key` = 'type'
1413
                        AND `pm`.`meta_value` IN ( {$file_types} )
1414
                WHERE
1415
                    `p`.`ID` IS NOT NULL
1416
                    AND `pm`.`meta_id` IS NOT NULL
1417
                    AND `rel`.`meta_key` = `p`.`post_name`
1418
                    AND `rel`.`meta_value` = '{$_ID}'";
1419
1420
			pods_query( $sql, false );
1421
		}
1422
1423
		// User Meta
1424 View Code Duplication
		if ( ! empty( PodsMeta::$user ) ) {
1425
			$sql = "
1426
                DELETE `rel`
1427
                FROM `@wp_usermeta` AS `rel`
1428
                LEFT JOIN `{$wpdb->posts}` AS `p`
1429
                    ON
1430
                        `p`.`post_type` = '_pods_field'
1431
                LEFT JOIN `{$wpdb->postmeta}` AS `pm`
1432
                    ON
1433
                        `pm`.`post_id` = `p`.`ID`
1434
                        AND `pm`.`meta_key` = 'type'
1435
                        AND `pm`.`meta_value` IN ( {$file_types} )
1436
                WHERE
1437
                    `p`.`ID` IS NOT NULL
1438
                    AND `pm`.`meta_id` IS NOT NULL
1439
                    AND `rel`.`meta_key` = `p`.`post_name`
1440
                    AND `rel`.`meta_value` = '{$_ID}'";
1441
1442
			pods_query( $sql, false );
1443
		}
1444
1445
		// Comment Meta
1446 View Code Duplication
		if ( ! empty( PodsMeta::$comment ) ) {
1447
			$sql = "
1448
                DELETE `rel`
1449
                FROM `@wp_commentmeta` AS `rel`
1450
                LEFT JOIN `{$wpdb->posts}` AS `p`
1451
                    ON
1452
                        `p`.`post_type` = '_pods_field'
1453
                LEFT JOIN `{$wpdb->postmeta}` AS `pm`
1454
                    ON
1455
                        `pm`.`post_id` = `p`.`ID`
1456
                        AND `pm`.`meta_key` = 'type'
1457
                        AND `pm`.`meta_value` IN ( {$file_types} )
1458
                WHERE
1459
                    `p`.`ID` IS NOT NULL
1460
                    AND `pm`.`meta_id` IS NOT NULL
1461
                    AND `rel`.`meta_key` = `p`.`post_name`
1462
                    AND `rel`.`meta_value` = '{$_ID}'";
1463
1464
			pods_query( $sql, false );
1465
		}
1466
	}
1467
1468
	/**
1469
	 * Register widgets for Pods
1470
	 */
1471
	public function register_widgets() {
1472
1473
		$widgets = array(
1474
			'PodsWidgetSingle',
1475
			'PodsWidgetList',
1476
			'PodsWidgetField',
1477
			'PodsWidgetForm',
1478
			'PodsWidgetView'
1479
		);
1480
1481
		foreach ( $widgets as $widget ) {
1482
			if ( ! file_exists( PODS_DIR . 'classes/widgets/' . $widget . '.php' ) ) {
1483
				continue;
1484
			}
1485
1486
			require_once PODS_DIR . 'classes/widgets/' . $widget . '.php';
1487
1488
			register_widget( $widget );
1489
		}
1490
	}
1491
1492
	/**
1493
	 * Add Admin Bar links
1494
	 */
1495
	public function admin_bar_links() {
1496
1497
		global $wp_admin_bar, $pods;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
1498
1499
		if ( ! is_user_logged_in() || ! is_admin_bar_showing() ) {
1500
			return;
1501
		}
1502
1503
		$all_pods = pods_api()->load_pods( array( 'type' => 'pod', 'fields' => false, 'table_info' => false ) );
1504
1505
		// Add New item links for all pods
1506
		foreach ( $all_pods as $pod ) {
0 ignored issues
show
Bug introduced by
The expression $all_pods of type array|object|integer|double|string|null|boolean is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
1507
			if ( 0 == $pod['options']['show_in_menu'] ) {
1508
				continue;
1509
			}
1510
1511
			if ( ! pods_is_admin( array( 'pods', 'pods_content', 'pods_add_' . $pod['name'] ) ) ) {
1512
				continue;
1513
			}
1514
1515
			$singular_label = pods_var_raw( 'label_singular', $pod['options'], pods_var_raw( 'label', $pod, ucwords( str_replace( '_', ' ', $pod['name'] ) ), null, true ), null, true );
1516
1517
			$wp_admin_bar->add_node( array(
1518
				'id'     => 'new-pod-' . $pod['name'],
1519
				'title'  => $singular_label,
1520
				'parent' => 'new-content',
1521
				'href'   => admin_url( 'admin.php?page=pods-manage-' . $pod['name'] . '&action=add' )
1522
			) );
1523
		}
1524
1525
		// Add edit link if we're on a pods page
1526
		if ( is_object( $pods ) && ! is_wp_error( $pods ) && ! empty( $pods->id ) && isset( $pods->pod_data ) && ! empty( $pods->pod_data ) && 'pod' == $pods->pod_data['type'] ) {
1527
			$pod = $pods->pod_data;
1528
1529
			if ( pods_is_admin( array( 'pods', 'pods_content', 'pods_edit_' . $pod['name'] ) ) ) {
1530
				$singular_label = pods_var_raw( 'label_singular', $pod['options'], pods_var_raw( 'label', $pod, ucwords( str_replace( '_', ' ', $pod['name'] ) ), null, true ), null, true );
1531
1532
				$wp_admin_bar->add_node( array(
1533
					'title' => sprintf( __( 'Edit %s', 'pods' ), $singular_label ),
1534
					'id'    => 'edit-pod',
1535
					'href'  => admin_url( 'admin.php?page=pods-manage-' . $pod['name'] . '&action=edit&id=' . $pods->id() )
1536
				) );
1537
			}
1538
		}
1539
1540
	}
1541
1542
	/**
1543
	 * Add REST API support to post type and taxonomy objects.
1544
	 *
1545
	 * @uses  "init"
1546
	 *
1547
	 * @since 2.5.6
1548
	 */
1549
	public function add_rest_support() {
1550
1551
		if ( empty( self::$version ) ) {
1552
			return;
1553
		}
1554
1555
		static $rest_support_added;
1556
1557
		if ( ! function_exists( 'register_rest_field' ) ) {
1558
			return;
1559
		}
1560
1561
		include_once( PODS_DIR . 'classes/PodsRESTFields.php' );
1562
		include_once( PODS_DIR . 'classes/PodsRESTHandlers.php' );
1563
1564
		$rest_bases = pods_transient_get( 'pods_rest_bases' );
1565
1566
		if ( empty( $rest_bases ) ) {
1567
	        $pods = pods_api()->load_pods( array( 'type' => array( 'post_type', 'taxonomy', 'user', 'media', 'comment' ), 'fields' => false, 'table_info' => false ) );
1568
1569
			$rest_bases = array();
1570
1571
			if ( ! empty( $pods ) && is_array( $pods ) ) {
1572
				foreach ( $pods as $pod ) {
1573
					$type = $pod['type'];
1574
1575
					if ( in_array( $type, array( 'post_type', 'taxonomy', 'user', 'media', 'comment' ) ) ) {
1576
						if ( $pod && PodsRESTHandlers::pod_extends_core_route( $pod ) ) {
1577
							$rest_bases[ $pod['name'] ] = array(
1578
								'type' => $type,
1579
								'base' => sanitize_title( pods_v( 'rest_base', $pod['options'], $pod['name'] ) ),
1580
							);
1581
						}
1582
					}
1583
				}
1584
			}
1585
1586
			if ( empty( $rest_bases ) ) {
1587
				$rest_bases = 'none';
1588
			}
1589
1590
			pods_transient_set( 'pods_rest_bases', $rest_bases );
1591
		}
1592
1593
		if ( empty( $rest_support_added ) && ! empty( $rest_bases ) && 'none' !== $rest_bases ) {
1594
			foreach ( $rest_bases as $pod_name => $pod_info ) {
1595
				$pod_type  = $pod_info['type'];
1596
				$rest_base = $pod_info['base'];
1597
1598
				if ( 'post_type' == $pod_type ) {
1599
					PodsRESTHandlers::post_type_rest_support( $pod_name, $rest_base );
1600
				} elseif ( 'taxonomy' == $pod_type ) {
1601
					PodsRESTHandlers::taxonomy_rest_support( $pod_name, $rest_base );
1602
				}
1603
1604
				new PodsRESTFields( $pod_name );
1605
			}
1606
1607
			$rest_support_added = true;
1608
		}
1609
1610
	}
1611
}
1612