Completed
Push — develop ( da7e54...51af65 )
by Aristeides
03:36
created

Kirki_Init::customize_controls_enqueue_scripts()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 0
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * Initializes Kirki
4
 *
5
 * @package     Kirki
6
 * @category    Core
7
 * @author      Aristeides Stathopoulos
8
 * @copyright   Copyright (c) 2017, Aristeides Stathopoulos
9
 * @license     http://opensource.org/licenses/https://opensource.org/licenses/MIT
10
 * @since       1.0
11
 */
12
13
/**
14
 * Initialize Kirki
15
 */
16
class Kirki_Init {
17
18
	/**
19
	 * Control types.
20
	 *
21
	 * @access private
22
	 * @since 3.0.0
23
	 * @var array
24
	 */
25
	private $control_types = array();
26
27
	/**
28
	 * The class constructor.
29
	 */
30
	public function __construct() {
31
		$this->set_url();
32
		add_action( 'after_setup_theme', array( $this, 'set_url' ) );
33
		add_action( 'wp_loaded', array( $this, 'add_to_customizer' ), 1 );
34
		add_filter( 'kirki/control_types', array( $this, 'default_control_types' ) );
35
		add_action( 'after_setup_theme', array( $this, 'acf_pro_compatibility' ) );
36
37
		add_action( 'customize_controls_enqueue_scripts', array( $this, 'customize_controls_enqueue_scripts' ), 999 );
38
39
		new Kirki_Custom_Build();
40
	}
41
42
	/**
43
	 * Properly set the Kirki URL for assets.
44
	 * Determines if Kirki is installed as a plugin, in a child theme, or a parent theme
45
	 * and then does some calculations to get the proper URL for its CSS & JS assets.
46
	 */
47
	public function set_url() {
48
49
		Kirki::$path = wp_normalize_path( dirname( KIRKI_PLUGIN_FILE ) );
50
51
		// Works in most cases.
52
		// Serves as a fallback in case all other checks fail.
53
		if ( defined( 'WP_CONTENT_DIR' ) ) {
54
			$content_dir = wp_normalize_path( WP_CONTENT_DIR );
55
			if ( false !== strpos( Kirki::$path, $content_dir ) ) {
56
				$relative_path = str_replace( $content_dir, '', Kirki::$path );
57
				Kirki::$url = content_url( $relative_path );
58
			}
59
		}
60
61
		// If Kirki is installed as a plugin, use that for the URL.
62
		if ( $this->is_plugin() ) {
63
			Kirki::$url = plugin_dir_url( KIRKI_PLUGIN_FILE );
64
		}
65
66
		// Get the path to the theme.
67
		$theme_path = wp_normalize_path( get_template_directory() );
68
69
		// Is Kirki included in the theme?
70
		if ( false !== strpos( Kirki::$path, $theme_path ) ) {
71
			Kirki::$url = get_template_directory_uri() . str_replace( $theme_path, '', Kirki::$path );
72
		}
73
74
		// Is there a child-theme?
75
		$child_theme_path = wp_normalize_path( get_stylesheet_directory_uri() );
76
		if ( $child_theme_path !== $theme_path ) {
77
			// Is Kirki included in a child theme?
78
			if ( false !== strpos( Kirki::$path, $child_theme_path ) ) {
79
				Kirki::$url = get_template_directory_uri() . str_replace( $child_theme_path, '', Kirki::$path );
80
			}
81
		}
82
83
		// Apply the kirki/config filter.
84
		$config = apply_filters( 'kirki/config', array() );
85
		if ( isset( $config['url_path'] ) ) {
86
			Kirki::$url = $config['url_path'];
87
		}
88
89
		// Escapes the URL.
90
		Kirki::$url = esc_url_raw( Kirki::$url );
91
		// Make sure the right protocol is used.
92
		Kirki::$url = set_url_scheme( Kirki::$url );
93
	}
94
95
	/**
96
	 * Add the default Kirki control types.
97
	 *
98
	 * @access public
99
	 * @since 3.0.0
100
	 * @param array $control_types The control types array.
101
	 * @return array
102
	 */
103
	public function default_control_types( $control_types = array() ) {
104
105
		$this->control_types = array(
106
			'checkbox'              => 'WP_Customize_Control',
107
			'kirki-background'      => 'Kirki_Control_Background',
108
			'kirki-code'            => 'Kirki_Control_Code',
109
			'kirki-color'           => 'Kirki_Control_Color',
110
			'kirki-color-palette'   => 'Kirki_Control_Color_Palette',
111
			'kirki-custom'          => 'Kirki_Control_Custom',
112
			'kirki-date'            => 'Kirki_Control_Date',
113
			'kirki-dashicons'       => 'Kirki_Control_Dashicons',
114
			'kirki-dimension'       => 'Kirki_Control_Dimension',
115
			'kirki-dimensions'      => 'Kirki_Control_Dimensions',
116
			'kirki-editor'          => 'Kirki_Control_Editor',
117
			'kirki-fontawesome'     => 'Kirki_Control_FontAwesome',
118
			'kirki-gradient'        => 'Kirki_Control_Gradient',
119
			'kirki-image'           => 'Kirki_Control_Image',
120
			'kirki-multicolor'      => 'Kirki_Control_Multicolor',
121
			'kirki-multicheck'      => 'Kirki_Control_MultiCheck',
122
			'kirki-number'          => 'Kirki_Control_Number',
123
			'kirki-palette'         => 'Kirki_Control_Palette',
124
			'kirki-preset'          => 'Kirki_Control_Preset',
125
			'kirki-radio'           => 'Kirki_Control_Radio',
126
			'kirki-radio-buttonset' => 'Kirki_Control_Radio_ButtonSet',
127
			'kirki-radio-image'     => 'Kirki_Control_Radio_Image',
128
			'repeater'              => 'Kirki_Control_Repeater',
129
			'kirki-select'          => 'Kirki_Control_Select',
130
			'kirki-slider'          => 'Kirki_Control_Slider',
131
			'kirki-sortable'        => 'Kirki_Control_Sortable',
132
			'kirki-spacing'         => 'Kirki_Control_Dimensions',
133
			'kirki-switch'          => 'Kirki_Control_Switch',
134
			'kirki-generic'         => 'Kirki_Control_Generic',
135
			'kirki-toggle'          => 'Kirki_Control_Toggle',
136
			'kirki-typography'      => 'Kirki_Control_Typography',
137
			'image'                 => 'Kirki_Control_Image',
138
			'cropped_image'         => 'WP_Customize_Cropped_Image_Control',
139
			'upload'                => 'WP_Customize_Upload_Control',
140
		);
141
		return array_merge( $control_types, $this->control_types );
142
143
	}
144
145
	/**
146
	 * Helper function that adds the fields, sections and panels to the customizer.
147
	 *
148
	 * @return void
149
	 */
150
	public function add_to_customizer() {
151
		$this->fields_from_filters();
152
		add_action( 'customize_register', array( $this, 'register_control_types' ) );
153
		add_action( 'customize_register', array( $this, 'add_panels' ), 97 );
154
		add_action( 'customize_register', array( $this, 'add_sections' ), 98 );
155
		add_action( 'customize_register', array( $this, 'add_fields' ), 99 );
156
		/* Kirki_Modules_Loading::get_instance(); */
157
	}
158
159
	/**
160
	 * Register control types
161
	 *
162
	 * @return  void
163
	 */
164
	public function register_control_types() {
165
		global $wp_customize;
166
167
		$section_types = apply_filters( 'kirki/section_types', array() );
168
		foreach ( $section_types as $section_type ) {
169
			$wp_customize->register_section_type( $section_type );
170
		}
171
		if ( empty( $this->control_types ) ) {
172
			$this->control_types = $this->default_control_types();
173
		}
174
		$do_not_register_control_types = apply_filters( 'kirki/control_types/exclude', array(
175
			'Kirki_Control_Repeater',
176
		) );
177
		foreach ( $this->control_types as $control_type ) {
178
			if ( 0 === strpos( $control_type, 'Kirki' ) && ! in_array( $control_type, $do_not_register_control_types, true ) && class_exists( $control_type ) ) {
179
				$wp_customize->register_control_type( $control_type );
180
			}
181
		}
182
	}
183
184
	/**
185
	 * Register our panels to the WordPress Customizer.
186
	 *
187
	 * @access public
188
	 */
189
	public function add_panels() {
190
		if ( ! empty( Kirki::$panels ) ) {
191
			foreach ( Kirki::$panels as $panel_args ) {
192
				// Extra checks for nested panels.
193
				if ( isset( $panel_args['panel'] ) ) {
194
					if ( isset( Kirki::$panels[ $panel_args['panel'] ] ) ) {
195
						// Set the type to nested.
196
						$panel_args['type'] = 'kirki-nested';
197
					}
198
				}
199
200
				new Kirki_Panel( $panel_args );
201
			}
202
		}
203
	}
204
205
	/**
206
	 * Register our sections to the WordPress Customizer.
207
	 *
208
	 * @var	object	The WordPress Customizer object
209
	 * @return  void
210
	 */
211
	public function add_sections() {
212
		if ( ! empty( Kirki::$sections ) ) {
213
			foreach ( Kirki::$sections as $section_args ) {
214
				// Extra checks for nested sections.
215
				if ( isset( $section_args['section'] ) ) {
216
					if ( isset( Kirki::$sections[ $section_args['section'] ] ) ) {
217
						// Set the type to nested.
218
						$section_args['type'] = 'kirki-nested';
219
						// We need to check if the parent section is nested inside a panel.
220
						$parent_section = Kirki::$sections[ $section_args['section'] ];
221
						if ( isset( $parent_section['panel'] ) ) {
222
							$section_args['panel'] = $parent_section['panel'];
223
						}
224
					}
225
				}
226
				new Kirki_Section( $section_args );
227
			}
228
		}
229
	}
230
231
	/**
232
	 * Create the settings and controls from the $fields array and register them.
233
	 *
234
	 * @var	object	The WordPress Customizer object
235
	 * @return  void
236
	 */
237
	public function add_fields() {
238
239
		global $wp_customize;
240
		foreach ( Kirki::$fields as $args ) {
241
242
			// Create the settings.
243
			new Kirki_Settings( $args );
244
245
			// Check if we're on the customizer.
246
			// If we are, then we will create the controls, add the scripts needed for the customizer
247
			// and any other tweaks that this field may require.
248
			if ( $wp_customize ) {
249
250
				// Create the control.
251
				new Kirki_Control( $args );
252
253
			}
254
		}
255
	}
256
257
	/**
258
	 * Build the variables.
259
	 *
260
	 * @return array 	('variable-name' => value)
261
	 */
262
	public static function get_variables() {
263
264
		$variables = array();
265
266
		// Loop through all fields.
267
		foreach ( Kirki::$fields as $field ) {
268
269
			// Check if we have variables for this field.
270
			if ( isset( $field['variables'] ) && $field['variables'] && ! empty( $field['variables'] ) ) {
271
272
				// Loop through the array of variables.
273
				foreach ( $field['variables'] as $field_variable ) {
274
275
					// Is the variable ['name'] defined? If yes, then we can proceed.
276
					if ( isset( $field_variable['name'] ) ) {
277
278
						// Sanitize the variable name.
279
						$variable_name = esc_attr( $field_variable['name'] );
280
281
						// Do we have a callback function defined? If not then set $variable_callback to false.
282
						$variable_callback = ( isset( $field_variable['callback'] ) && is_callable( $field_variable['callback'] ) ) ? $field_variable['callback'] : false;
283
284
						// If we have a variable_callback defined then get the value of the option
285
						// and run it through the callback function.
286
						// If no callback is defined (false) then just get the value.
287
						if ( $variable_callback ) {
288
							$variables[ $variable_name ] = call_user_func( $field_variable['callback'], Kirki::get_option( $field['settings'] ) );
289
						} else {
290
							$variables[ $variable_name ] = Kirki::get_option( $field['settings'] );
291
						}
292
					}
293
				}
294
			}
295
		}
296
297
		// Pass the variables through a filter ('kirki/variable') and return the array of variables.
298
		return apply_filters( 'kirki/variable', $variables );
299
300
	}
301
302
	/**
303
	 * Process fields added using the 'kirki/fields' and 'kirki/controls' filter.
304
	 * These filters are no longer used, this is simply for backwards-compatibility.
305
	 */
306
	public function fields_from_filters() {
307
308
		$fields = apply_filters( 'kirki/controls', array() );
309
		$fields = apply_filters( 'kirki/fields', $fields );
310
311
		if ( ! empty( $fields ) ) {
312
			foreach ( $fields as $field ) {
313
				Kirki::add_field( 'global', $field );
314
			}
315
		}
316
317
	}
318
319
	/**
320
	 * Changes select2 version in ACF.
321
	 * Fixes a plugin conflict that was causing select fields to crash
322
	 * because of a version mismatch between ACF's and Kirki's select2 scripts.
323
	 * Props @hellor0bot
324
	 *
325
	 * @see https://github.com/aristath/kirki/issues/1302
326
	 * @access public
327
	 * @since 3.0.0
328
	 */
329
	public function acf_pro_compatibility() {
330
		if ( is_customize_preview() ) {
331
			add_filter( 'acf/settings/enqueue_select2', '__return_false', 99 );
332
		}
333
	}
334
335
	/**
336
	 * Enqueues extra scripts on customize_controls_enqueue_scripts.
337
	 *
338
	 * @access public
339
	 * @since 3.0.0
340
	 */
341
	public function customize_controls_enqueue_scripts() {
342
		wp_enqueue_script( 'kirki', trailingslashit( Kirki::$url ) . 'assets/js/customizer.js', array( 'jquery', 'customize-base') );
0 ignored issues
show
introduced by
No space before closing parenthesis of array is bad style
Loading history...
343
	}
344
345
	/**
346
	 * Determine if Kirki is installed as a plugin.
347
	 *
348
	 * @static
349
	 * @access public
350
	 * @since 3.0.0
351
	 * @return bool
352
	 */
353
	public static function is_plugin() {
354
355
		$is_plugin = false;
356
		if ( ! function_exists( 'get_plugins' ) ) {
357
			require_once ABSPATH . 'wp-admin/includes/plugin.php';
358
		}
359
360
		// Get all plugins.
361
		$plugins = get_plugins();
362
		$_plugin = '';
363
		foreach ( $plugins as $plugin => $args ) {
364
			if ( ! $is_plugin && isset( $args['Name'] ) && ( 'Kirki' === $args['Name'] || 'Kirki Toolkit' === $args['Name'] ) ) {
365
				$is_plugin = true;
366
				$_plugin   = $plugin;
367
			}
368
		}
369
370
		// No need to proceed any further if Kirki wasn't found in the list of plugins.
371
		if ( ! $is_plugin ) {
372
			return false;
373
		}
374
375
		// Extra logic in case the plugin is installed but not activated.
376
		if ( is_customize_preview() ) {
377
378
			// Make sure the is_plugins_loaded function is loaded.
379
			if ( ! function_exists( 'is_plugin_active' ) ) {
380
				include_once ABSPATH . 'wp-admin/includes/plugin.php';
381
			}
382
383
			if ( $_plugin && ! is_plugin_active( $_plugin ) ) {
384
				return false;
385
			}
386
		}
387
		return $is_plugin;
388
	}
389
}
390