Completed
Pull Request — trunk (#541)
by Justin
08:25
created

CMB2_hookup::universal_hooks()   C

Complexity

Conditions 7
Paths 12

Size

Total Lines 26
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 56
Metric Value
dl 0
loc 26
rs 6.7273
ccs 0
cts 20
cp 0
cc 7
eloc 16
nc 12
nop 0
crap 56
1
<?php
2
/**
3
 * Handles hooking CMB2 forms/metaboxes into the post/attachement/user screens
4
 * and handles hooking in and saving those fields.
5
 *
6
 * @since  2.0.0
7
 *
8
 * @category  WordPress_Plugin
9
 * @package   CMB2
10
 * @author    WebDevStudios
11
 * @license   GPL-2.0+
12
 * @link      http://webdevstudios.com
13
 */
14
class CMB2_hookup extends CMB2_Hookup_Base {
0 ignored issues
show
Coding Style Compatibility introduced by
PSR1 recommends that each class must be in a namespace of at least one level to avoid collisions.

You can fix this by adding a namespace to your class:

namespace YourVendor;

class YourClass { }

When choosing a vendor namespace, try to pick something that is not too generic to avoid conflicts with other libraries.

Loading history...
15
16
	/**
17
	 * Array of all hooks done (to be run once)
18
	 * @var   array
19
	 * @since 2.0.0
20
	 */
21
	protected static $hooks_completed = array();
22
23
	/**
24
	 * Only allow JS registration once
25
	 * @var   bool
26
	 * @since 2.0.7
27
	 */
28
	protected static $js_registration_done = false;
29
30
	/**
31
	 * Only allow CSS registration once
32
	 * @var   bool
33
	 * @since 2.0.7
34
	 */
35
	protected static $css_registration_done = false;
36
37
	/**
38
	 * CMB taxonomies array for term meta
39
	 * @var   array
40
	 * @since 2.2.0
41
	 */
42
	protected $taxonomies = array();
43
44
	/**
45
	 * Constructor
46
	 * @since 2.0.0
47
	 * @param CMB2 $cmb The CMB2 object to hookup
48
	 */
49
	public function __construct( CMB2 $cmb ) {
50
		$this->cmb = $cmb;
51
		$this->object_type = $this->cmb->mb_object_type();
52
	}
53
54
	public function universal_hooks() {
55
		// Handle oembed Ajax
56
		$this->once( 'wp_ajax_cmb2_oembed_handler', array( cmb2_ajax(), 'oembed_handler' ) );
57
		$this->once( 'wp_ajax_nopriv_cmb2_oembed_handler', array( cmb2_ajax(), 'oembed_handler' ) );
58
59
		foreach ( get_class_methods( 'CMB2_Show_Filters' ) as $filter ) {
60
			add_filter( 'cmb2_show_on', array( 'CMB2_Show_Filters', $filter ), 10, 3 );
61
		}
62
63
		if ( is_admin() ) {
64
			// register our scripts and styles for cmb
65
			$this->once( 'admin_enqueue_scripts', array( __CLASS__, 'register_scripts' ), 8 );
66
67
			switch ( $this->object_type ) {
68
				case 'post':
69
					return $this->post_hooks();
70
				case 'comment':
71
					return $this->comment_hooks();
72
				case 'user':
73
					return $this->user_hooks();
74
				case 'term':
75
					return $this->term_hooks();
76
			}
77
78
		}
79
	}
80
81
	public function post_hooks() {
82
		add_action( 'add_meta_boxes', array( $this, 'add_metaboxes' ) );
83
		add_action( 'add_attachment', array( $this, 'save_post' ) );
84
		add_action( 'edit_attachment', array( $this, 'save_post' ) );
85
		add_action( 'save_post', array( $this, 'save_post' ), 10, 2 );
86
87
		$this->once( 'admin_enqueue_scripts', array( $this, 'do_scripts' ) );
88
	}
89
90
	public function comment_hooks() {
91
		add_action( 'add_meta_boxes_comment', array( $this, 'add_metaboxes' ) );
92
		add_action( 'edit_comment', array( $this, 'save_comment' ) );
93
94
		$this->once( 'admin_enqueue_scripts', array( $this, 'do_scripts' ) );
95
	}
96
97
	public function user_hooks() {
98
		$priority = $this->cmb->prop( 'priority' );
99
100
		if ( ! is_numeric( $priority ) ) {
101
			switch ( $priority ) {
102
103
				case 'high':
104
					$priority = 5;
105
					break;
106
107
				case 'low':
108
					$priority = 20;
109
					break;
110
111
				default:
112
					$priority = 10;
113
					break;
114
			}
115
		}
116
117
		add_action( 'show_user_profile', array( $this, 'user_metabox' ), $priority );
118
		add_action( 'edit_user_profile', array( $this, 'user_metabox' ), $priority );
119
		add_action( 'user_new_form', array( $this, 'user_new_metabox' ), $priority );
120
121
		add_action( 'personal_options_update', array( $this, 'save_user' ) );
122
		add_action( 'edit_user_profile_update', array( $this, 'save_user' ) );
123
		add_action( 'user_register', array( $this, 'save_user' ) );
124
	}
125
126
	public function term_hooks() {
127
		if ( ! function_exists( 'get_term_meta' ) ) {
128
			wp_die( __( 'Term Metadata is a WordPress > 4.4 feature. Please upgrade your WordPress install.', 'cmb2' ) );
129
		}
130
131
		if ( ! $this->cmb->prop( 'taxonomies' ) ) {
132
			wp_die( __( 'Term metaboxes configuration requires a \'taxonomies\' parameter', 'cmb2' ) );
133
		}
134
135
		$this->taxonomies = (array) $this->cmb->prop( 'taxonomies' );
136
		$show_on_term_add = $this->cmb->prop( 'new_term_section' );
137
138
		foreach ( $this->taxonomies as $taxonomy ) {
139
			// Display our form data
140
			add_action( "{$taxonomy}_edit_form", array( $this, 'term_metabox' ), 8, 2 );
141
142
			$show_on_add = is_array( $show_on_term_add )
143
				? in_array( $taxonomy, $show_on_term_add )
144
				: (bool) $show_on_term_add;
145
146
			$show_on_add = apply_filters( "cmb2_show_on_term_add_form_{$this->cmb->cmb_id}", $show_on_add, $this->cmb );
147
148
			// Display form in add-new section (unless specified not to)
149
			if ( $show_on_add ) {
150
				add_action( "{$taxonomy}_add_form_fields", array( $this, 'term_metabox' ), 8, 2 );
151
			}
152
153
		}
154
155
		add_action( 'created_term', array( $this, 'save_term' ), 10, 3 );
156
		add_action( 'edited_terms', array( $this, 'save_term' ), 10, 2 );
157
158
		add_action( 'delete_term', array( $this, 'delete_term' ), 10, 3 );
159
	}
160
161
	/**
162
	 * Registers styles for CMB2
163
	 * @since 2.0.7
164
	 */
165 1
	protected static function register_styles() {
166 1
		if ( self::$css_registration_done ) {
167
			return;
168
		}
169
170
		// Only use minified files if SCRIPT_DEBUG is off
171 1
		$min   = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
172 1
		$front = is_admin() ? '' : '-front';
173 1
		$rtl = is_rtl() ? '-rtl' : '';
174
175
		// Filter required styles and register stylesheet
176 1
		$styles = apply_filters( 'cmb2_style_dependencies', array() );
177 1
		wp_register_style( 'cmb2-styles', cmb2_utils()->url( "css/cmb2{$front}{$rtl}{$min}.css" ), $styles );
178
179 1
		self::$css_registration_done = true;
180 1
	}
181
182
	/**
183
	 * Registers scripts for CMB2
184
	 * @since  2.0.7
185
	 */
186 1
	protected static function register_js() {
187 1
		if ( self::$js_registration_done ) {
188
			return;
189
		}
190
191 1
		$hook = is_admin() ? 'admin_footer' : 'wp_footer';
192 1
		add_action( $hook, array( 'CMB2_JS', 'enqueue' ), 8 );
193
194 1
		self::$js_registration_done = true;
195 1
	}
196
197
	/**
198
	 * Registers scripts and styles for CMB2
199
	 * @since  1.0.0
200
	 */
201
	public static function register_scripts() {
202
		self::register_styles();
203
		self::register_js();
204
	}
205
206
	/**
207
	 * Enqueues scripts and styles for CMB2
208
	 * @since  1.0.0
209
	 */
210
	public function do_scripts( $hook ) {
211
		// only enqueue our scripts/styles on the proper pages
212
		if ( in_array( $hook, array( 'post.php', 'post-new.php', 'page-new.php', 'page.php', 'comment.php' ), true ) ) {
213
			if ( $this->cmb->prop( 'cmb_styles' ) ) {
214
				self::enqueue_cmb_css();
215
			}
216
			if ( $this->cmb->prop( 'enqueue_js' ) ) {
217
				self::enqueue_cmb_js();
218
			}
219
		}
220
	}
221
222
	/**
223
	 * Add metaboxes (to 'post' or 'comment' object types)
224
	 * @since 1.0.0
225
	 */
226
	public function add_metaboxes() {
227
228
		if ( ! $this->show_on() ) {
229
			return;
230
		}
231
232
		foreach ( $this->cmb->prop( 'object_types' ) as $post_type ) {
233
			/**
234
			 * To keep from registering an actual post-screen metabox,
235
			 * omit the 'title' attribute from the metabox registration array.
236
			 *
237
			 * (WordPress will not display metaboxes without titles anyway)
238
			 *
239
			 * This is a good solution if you want to output your metaboxes
240
			 * Somewhere else in the post-screen
241
			 */
242
			if ( $this->cmb->prop( 'title' ) ) {
243
244
				if ( $this->cmb->prop( 'closed' ) ) {
245
					add_filter( "postbox_classes_{$post_type}_{$this->cmb->cmb_id}", array( $this, 'close_metabox_class' ) );
246
				}
247
248
				add_meta_box( $this->cmb->cmb_id, $this->cmb->prop( 'title' ), array( $this, 'metabox_callback' ), $post_type, $this->cmb->prop( 'context' ), $this->cmb->prop( 'priority' ) );
249
			}
250
		}
251
	}
252
253
	/**
254
	 * Add 'closed' class to metabox
255
	 * @since  2.0.0
256
	 * @param  array  $classes Array of classes
257
	 * @return array           Modified array of classes
258
	 */
259
	public function close_metabox_class( $classes ) {
260
		$classes[] = 'closed';
261
		return $classes;
262
	}
263
264
	/**
265
	 * Display metaboxes for a post or comment object
266
	 * @since  1.0.0
267
	 */
268
	public function metabox_callback() {
269
		$object_id = 'comment' == $this->object_type ? get_comment_ID() : get_the_ID();
270
		$this->cmb->show_form( $object_id, $this->object_type );
271
	}
272
273
	/**
274
	 * Display metaboxes for new user page
275
	 * @since  1.0.0
276
	 */
277
	public function user_new_metabox( $section ) {
0 ignored issues
show
Coding Style introduced by
user_new_metabox uses the super-global variable $_REQUEST which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
278
		if ( $section == $this->cmb->prop( 'new_user_section' ) ) {
279
			$object_id = $this->cmb->object_id();
280
			$this->cmb->object_id( isset( $_REQUEST['user_id'] ) ? $_REQUEST['user_id'] : $object_id );
281
			$this->user_metabox();
282
		}
283
	}
284
285
	/**
286
	 * Display metaboxes for a user object
287
	 * @since  1.0.0
288
	 */
289
	public function user_metabox() {
290
		$this->show_form_for_type( 'user' );
291
	}
292
293
	/**
294
	 * Display metaboxes for a taxonomy term object
295
	 * @since  2.2.0
296
	 */
297
	public function term_metabox() {
298
		$this->show_form_for_type( 'term' );
299
	}
300
301
	/**
302
	 * Display metaboxes for an object type
303
	 * @since  2.2.0
304
	 * @param  string $type Object type
305
	 * @return void
306
	 */
307
	public function show_form_for_type( $type ) {
308
		if ( $type != $this->cmb->mb_object_type() ) {
309
			return;
310
		}
311
312
		if ( ! $this->show_on() ) {
313
			return;
314
		}
315
316
		if ( $this->cmb->prop( 'cmb_styles' ) ) {
317
			self::enqueue_cmb_css();
318
		}
319
		if ( $this->cmb->prop( 'enqueue_js' ) ) {
320
			self::enqueue_cmb_js();
321
		}
322
323
		$this->cmb->show_form( 0, $type );
324
	}
325
326
	/**
327
	 * Determines if metabox should be shown in current context
328
	 * @since  2.0.0
329
	 * @return bool Whether metabox should be added/shown
330
	 */
331
	public function show_on() {
332
		// If metabox is requesting to be conditionally shown
333
		$show = $this->cmb->should_show();
334
335
		/**
336
		 * Filter to determine if metabox should show. Default is true
337
		 *
338
		 * @param array  $show          Default is true, show the metabox
339
		 * @param mixed  $meta_box_args Array of the metabox arguments
340
		 * @param mixed  $cmb           The CMB2 instance
341
		 */
342
		$show = (bool) apply_filters( 'cmb2_show_on', $show, $this->cmb->meta_box, $this->cmb );
343
344
		return $show;
345
	}
346
347
	/**
348
	 * Save data from post metabox
349
	 * @since  1.0.0
350
	 * @param  int    $post_id Post ID
351
	 * @param  mixed  $post    Post object
352
	 * @return null
353
	 */
354
	public function save_post( $post_id, $post = false ) {
0 ignored issues
show
Coding Style introduced by
save_post uses the super-global variable $_POST which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
355
356
		$post_type = $post ? $post->post_type : get_post_type( $post_id );
357
358
		$do_not_pass_go = (
359
			! $this->can_save( $post_type )
360
			// check user editing permissions
361
			|| ( 'page' == $post_type && ! current_user_can( 'edit_page', $post_id ) )
362
			|| ! current_user_can( 'edit_post', $post_id )
363
		);
364
365
		if ( $do_not_pass_go ) {
366
			// do not collect $200
367
			return;
368
		}
369
370
		// take a trip to reading railroad – if you pass go collect $200
371
		$this->cmb->save_fields( $post_id, 'post', $_POST );
372
	}
373
374
	/**
375
	 * Save data from comment metabox
376
	 * @since  2.0.9
377
	 * @param  int    $comment_id Comment ID
378
	 * @return null
379
	 */
380
	public function save_comment( $comment_id ) {
0 ignored issues
show
Coding Style introduced by
save_comment uses the super-global variable $_POST which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
381
382
		$can_edit = current_user_can( 'moderate_comments', $comment_id );
383
384
		if ( $this->can_save( get_comment_type( $comment_id ) ) && $can_edit ) {
385
			$this->cmb->save_fields( $comment_id, 'comment', $_POST );
386
		}
387
	}
388
389
	/**
390
	 * Save data from user fields
391
	 * @since  1.0.x
392
	 * @param  int   $user_id  User ID
393
	 * @return null
394
	 */
395
	public function save_user( $user_id ) {
0 ignored issues
show
Coding Style introduced by
save_user uses the super-global variable $_POST which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
396
		// check permissions
397
		if ( $this->can_save( 'user' ) ) {
398
			$this->cmb->save_fields( $user_id, 'user', $_POST );
399
		}
400
	}
401
402
	/**
403
	 * Save data from term fields
404
	 * @since  1.0.x
405
	 * @param  int    $term_id  Term ID
406
	 * @param  int    $tt_id    Term Taxonomy ID
407
	 * @param  string $taxonomy Taxonomy
408
	 * @return null
409
	 */
410
	public function save_term( $term_id, $tt_id, $taxonomy = '' ) {
0 ignored issues
show
Coding Style introduced by
save_term uses the super-global variable $_POST which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
411
		$taxonomy = $taxonomy ? $taxonomy : $tt_id;
412
413
		// check permissions
414
		if ( $this->taxonomy_can_save( $taxonomy ) && $this->can_save( 'term' ) ) {
415
			$this->cmb->save_fields( $term_id, 'term', $_POST );
416
		}
417
	}
418
419
	/**
420
	 * Delete term meta when a term is deleted.
421
	 * @since  1.0.x
422
	 * @param  int    $term_id  Term ID
423
	 * @param  int    $tt_id    Term Taxonomy ID
424
	 * @param  string $taxonomy Taxonomy
425
	 * @return null
426
	 */
427
	public function delete_term( $term_id, $tt_id, $taxonomy = '' ) {
428
		if ( $this->taxonomy_can_save( $taxonomy ) ) {
429
430
			foreach ( $this->cmb->prop( 'fields' ) as $field ) {
431
				$data_to_delete[ $field['id'] ] = '';
0 ignored issues
show
Coding Style Comprehensibility introduced by
$data_to_delete was never initialized. Although not strictly required by PHP, it is generally a good practice to add $data_to_delete = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
432
			}
433
434
			$this->cmb->save_fields( $term_id, 'term', $data_to_delete );
0 ignored issues
show
Bug introduced by
The variable $data_to_delete does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
435
		}
436
	}
437
438
	/**
439
	 * Determines if the current object is able to be saved
440
	 * @since  2.0.9
441
	 * @param  string  $type Current post_type or comment_type
442
	 * @return bool          Whether object can be saved
443
	 */
444
	public function can_save( $type = '' ) {
0 ignored issues
show
Coding Style introduced by
can_save uses the super-global variable $_POST which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
445
		return (
446
			$this->cmb->prop( 'save_fields' )
447
			// check nonce
448
			&& isset( $_POST[ $this->cmb->nonce() ] )
449
			&& wp_verify_nonce( $_POST[ $this->cmb->nonce() ], $this->cmb->nonce() )
450
			// check if autosave
451
			&& ! ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
452
			// get the metabox types & compare it to this type
453
			&& ( $type && in_array( $type, $this->cmb->prop( 'object_types' ) ) )
454
		);
455
	}
456
457
	/**
458
	 * Determine if taxonomy of term being modified is cmb2-editable.
459
	 * @since  2.2.0
460
	 * @param  string $taxonomy Taxonomy of term being modified.
461
	 * @return bool             Whether taxonomy is editable.
462
	 */
463
	public function taxonomy_can_save( $taxonomy ) {
464
		$taxonomy = $taxonomy ? $taxonomy : $tt_id;
0 ignored issues
show
Bug introduced by
The variable $tt_id does not exist. Did you forget to declare it?

This check marks access to variables or properties that have not been declared yet. While PHP has no explicit notion of declaring a variable, accessing it before a value is assigned to it is most likely a bug.

Loading history...
465
466
		if ( empty( $this->taxonomies ) || ! in_array( $taxonomy, $this->taxonomies ) ) {
467
			return false;
468
		}
469
470
		$taxonomy_object = get_taxonomy( $taxonomy );
471
		// Can the user edit this term?
472
		if ( ! isset( $taxonomy_object->cap ) || ! current_user_can( $taxonomy_object->cap->edit_terms ) ) {
473
			return false;
474
		}
475
476
		return true;
477
	}
478
479
	/**
480
	 * Includes CMB2 styles
481
	 * @since  2.0.0
482
	 */
483 1
	public static function enqueue_cmb_css() {
484 1
		if ( ! apply_filters( 'cmb2_enqueue_css', true ) ) {
485
			return false;
486
		}
487
488 1
		self::register_styles();
489 1
		return wp_enqueue_style( 'cmb2-styles' );
490
	}
491
492
	/**
493
	 * Includes CMB2 JS
494
	 * @since  2.0.0
495
	 */
496 1
	public static function enqueue_cmb_js() {
497 1
		if ( ! apply_filters( 'cmb2_enqueue_js', true ) ) {
498
			return false;
499
		}
500
501 1
		self::register_js();
502 1
		return true;
503
	}
504
505
}
506