_WP_Editors::editor_settings()public staticWP 3.3.0

Method of the class: _WP_Editors{}

Return

null. Nothing (null).

Usage

$result = _WP_Editors::editor_settings( $editor_id, $set );
$editor_id(string) (required)
Unique editor identifier, e.g. 'content'.
$set(array) (required)
Array of editor arguments.

Changelog

Since 3.3.0 Introduced.

_WP_Editors::editor_settings() code WP 6.5.2

public static function editor_settings( $editor_id, $set ) {
	if ( empty( self::$first_init ) ) {
		if ( is_admin() ) {
			add_action( 'admin_print_footer_scripts', array( __CLASS__, 'editor_js' ), 50 );
			add_action( 'admin_print_footer_scripts', array( __CLASS__, 'force_uncompressed_tinymce' ), 1 );
			add_action( 'admin_print_footer_scripts', array( __CLASS__, 'enqueue_scripts' ), 1 );
		} else {
			add_action( 'wp_print_footer_scripts', array( __CLASS__, 'editor_js' ), 50 );
			add_action( 'wp_print_footer_scripts', array( __CLASS__, 'force_uncompressed_tinymce' ), 1 );
			add_action( 'wp_print_footer_scripts', array( __CLASS__, 'enqueue_scripts' ), 1 );
		}
	}

	if ( self::$this_quicktags ) {

		$qt_init = array(
			'id'      => $editor_id,
			'buttons' => '',
		);

		if ( is_array( $set['quicktags'] ) ) {
			$qt_init = array_merge( $qt_init, $set['quicktags'] );
		}

		if ( empty( $qt_init['buttons'] ) ) {
			$qt_init['buttons'] = 'strong,em,link,block,del,ins,img,ul,ol,li,code,more,close';
		}

		if ( $set['_content_editor_dfw'] ) {
			$qt_init['buttons'] .= ',dfw';
		}

		/**
		 * Filters the Quicktags settings.
		 *
		 * @since 3.3.0
		 *
		 * @param array  $qt_init   Quicktags settings.
		 * @param string $editor_id Unique editor identifier, e.g. 'content'.
		 */
		$qt_init = apply_filters( 'quicktags_settings', $qt_init, $editor_id );

		self::$qt_settings[ $editor_id ] = $qt_init;

		self::$qt_buttons = array_merge( self::$qt_buttons, explode( ',', $qt_init['buttons'] ) );
	}

	if ( self::$this_tinymce ) {

		if ( empty( self::$first_init ) ) {
			$baseurl     = self::get_baseurl();
			$mce_locale  = self::get_mce_locale();
			$ext_plugins = '';

			if ( $set['teeny'] ) {

				/**
				 * Filters the list of teenyMCE plugins.
				 *
				 * @since 2.7.0
				 * @since 3.3.0 The `$editor_id` parameter was added.
				 *
				 * @param array  $plugins   An array of teenyMCE plugins.
				 * @param string $editor_id Unique editor identifier, e.g. 'content'.
				 */
				$plugins = apply_filters(
					'teeny_mce_plugins',
					array(
						'colorpicker',
						'lists',
						'fullscreen',
						'image',
						'wordpress',
						'wpeditimage',
						'wplink',
					),
					$editor_id
				);
			} else {

				/**
				 * Filters the list of TinyMCE external plugins.
				 *
				 * The filter takes an associative array of external plugins for
				 * TinyMCE in the form 'plugin_name' => 'url'.
				 *
				 * The url should be absolute, and should include the js filename
				 * to be loaded. For example:
				 * 'myplugin' => 'http://mysite.com/wp-content/plugins/myfolder/mce_plugin.js'.
				 *
				 * If the external plugin adds a button, it should be added with
				 * one of the 'mce_buttons' filters.
				 *
				 * @since 2.5.0
				 * @since 5.3.0 The `$editor_id` parameter was added.
				 *
				 * @param array  $external_plugins An array of external TinyMCE plugins.
				 * @param string $editor_id        Unique editor identifier, e.g. 'content'. Accepts 'classic-block'
				 *                                 when called from block editor's Classic block.
				 */
				$mce_external_plugins = apply_filters( 'mce_external_plugins', array(), $editor_id );

				$plugins = array(
					'charmap',
					'colorpicker',
					'hr',
					'lists',
					'media',
					'paste',
					'tabfocus',
					'textcolor',
					'fullscreen',
					'wordpress',
					'wpautoresize',
					'wpeditimage',
					'wpemoji',
					'wpgallery',
					'wplink',
					'wpdialogs',
					'wptextpattern',
					'wpview',
				);

				if ( ! self::$has_medialib ) {
					$plugins[] = 'image';
				}

				/**
				 * Filters the list of default TinyMCE plugins.
				 *
				 * The filter specifies which of the default plugins included
				 * in WordPress should be added to the TinyMCE instance.
				 *
				 * @since 3.3.0
				 * @since 5.3.0 The `$editor_id` parameter was added.
				 *
				 * @param array  $plugins   An array of default TinyMCE plugins.
				 * @param string $editor_id Unique editor identifier, e.g. 'content'. Accepts 'classic-block'
				 *                          when called from block editor's Classic block.
				 */
				$plugins = array_unique( apply_filters( 'tiny_mce_plugins', $plugins, $editor_id ) );

				$key = array_search( 'spellchecker', $plugins, true );
				if ( false !== $key ) {
					/*
					 * Remove 'spellchecker' from the internal plugins if added with 'tiny_mce_plugins' filter to prevent errors.
					 * It can be added with 'mce_external_plugins'.
					 */
					unset( $plugins[ $key ] );
				}

				if ( ! empty( $mce_external_plugins ) ) {

					/**
					 * Filters the translations loaded for external TinyMCE 3.x plugins.
					 *
					 * The filter takes an associative array ('plugin_name' => 'path')
					 * where 'path' is the include path to the file.
					 *
					 * The language file should follow the same format as wp_mce_translation(),
					 * and should define a variable ($strings) that holds all translated strings.
					 *
					 * @since 2.5.0
					 * @since 5.3.0 The `$editor_id` parameter was added.
					 *
					 * @param array  $translations Translations for external TinyMCE plugins.
					 * @param string $editor_id    Unique editor identifier, e.g. 'content'.
					 */
					$mce_external_languages = apply_filters( 'mce_external_languages', array(), $editor_id );

					$loaded_langs = array();
					$strings      = '';

					if ( ! empty( $mce_external_languages ) ) {
						foreach ( $mce_external_languages as $name => $path ) {
							if ( @is_file( $path ) && @is_readable( $path ) ) {
								include_once $path;
								$ext_plugins   .= $strings . "\n";
								$loaded_langs[] = $name;
							}
						}
					}

					foreach ( $mce_external_plugins as $name => $url ) {
						if ( in_array( $name, $plugins, true ) ) {
							unset( $mce_external_plugins[ $name ] );
							continue;
						}

						$url                           = set_url_scheme( $url );
						$mce_external_plugins[ $name ] = $url;
						$plugurl                       = dirname( $url );
						$strings                       = '';

						// Try to load langs/[locale].js and langs/[locale]_dlg.js.
						if ( ! in_array( $name, $loaded_langs, true ) ) {
							$path = str_replace( content_url(), '', $plugurl );
							$path = realpath( WP_CONTENT_DIR . $path . '/langs/' );

							if ( ! $path ) {
								continue;
							}

							$path = trailingslashit( $path );

							if ( @is_file( $path . $mce_locale . '.js' ) ) {
								$strings .= @file_get_contents( $path . $mce_locale . '.js' ) . "\n";
							}

							if ( @is_file( $path . $mce_locale . '_dlg.js' ) ) {
								$strings .= @file_get_contents( $path . $mce_locale . '_dlg.js' ) . "\n";
							}

							if ( 'en' !== $mce_locale && empty( $strings ) ) {
								if ( @is_file( $path . 'en.js' ) ) {
									$str1     = @file_get_contents( $path . 'en.js' );
									$strings .= preg_replace( '/([\'"])en\./', '$1' . $mce_locale . '.', $str1, 1 ) . "\n";
								}

								if ( @is_file( $path . 'en_dlg.js' ) ) {
									$str2     = @file_get_contents( $path . 'en_dlg.js' );
									$strings .= preg_replace( '/([\'"])en\./', '$1' . $mce_locale . '.', $str2, 1 ) . "\n";
								}
							}

							if ( ! empty( $strings ) ) {
								$ext_plugins .= "\n" . $strings . "\n";
							}
						}

						$ext_plugins .= 'tinyMCEPreInit.load_ext("' . $plugurl . '", "' . $mce_locale . '");' . "\n";
					}
				}
			}

			self::$plugins     = $plugins;
			self::$ext_plugins = $ext_plugins;

			$settings            = self::default_settings();
			$settings['plugins'] = implode( ',', $plugins );

			if ( ! empty( $mce_external_plugins ) ) {
				$settings['external_plugins'] = wp_json_encode( $mce_external_plugins );
			}

			/** This filter is documented in wp-admin/includes/media.php */
			if ( apply_filters( 'disable_captions', '' ) ) {
				$settings['wpeditimage_disable_captions'] = true;
			}

			$mce_css = $settings['content_css'];

			/*
			 * The `editor-style.css` added by the theme is generally intended for the editor instance on the Edit Post screen.
			 * Plugins that use wp_editor() on the front-end can decide whether to add the theme stylesheet
			 * by using `get_editor_stylesheets()` and the `mce_css` or `tiny_mce_before_init` filters, see below.
			 */
			if ( is_admin() ) {
				$editor_styles = get_editor_stylesheets();

				if ( ! empty( $editor_styles ) ) {
					// Force urlencoding of commas.
					foreach ( $editor_styles as $key => $url ) {
						if ( str_contains( $url, ',' ) ) {
							$editor_styles[ $key ] = str_replace( ',', '%2C', $url );
						}
					}

					$mce_css .= ',' . implode( ',', $editor_styles );
				}
			}

			/**
			 * Filters the comma-delimited list of stylesheets to load in TinyMCE.
			 *
			 * @since 2.1.0
			 *
			 * @param string $stylesheets Comma-delimited list of stylesheets.
			 */
			$mce_css = trim( apply_filters( 'mce_css', $mce_css ), ' ,' );

			if ( ! empty( $mce_css ) ) {
				$settings['content_css'] = $mce_css;
			} else {
				unset( $settings['content_css'] );
			}

			self::$first_init = $settings;
		}

		if ( $set['teeny'] ) {
			$mce_buttons = array(
				'bold',
				'italic',
				'underline',
				'blockquote',
				'strikethrough',
				'bullist',
				'numlist',
				'alignleft',
				'aligncenter',
				'alignright',
				'undo',
				'redo',
				'link',
				'fullscreen',
			);

			/**
			 * Filters the list of teenyMCE buttons (Text tab).
			 *
			 * @since 2.7.0
			 * @since 3.3.0 The `$editor_id` parameter was added.
			 *
			 * @param array  $mce_buttons An array of teenyMCE buttons.
			 * @param string $editor_id   Unique editor identifier, e.g. 'content'.
			 */
			$mce_buttons   = apply_filters( 'teeny_mce_buttons', $mce_buttons, $editor_id );
			$mce_buttons_2 = array();
			$mce_buttons_3 = array();
			$mce_buttons_4 = array();
		} else {
			$mce_buttons = array(
				'formatselect',
				'bold',
				'italic',
				'bullist',
				'numlist',
				'blockquote',
				'alignleft',
				'aligncenter',
				'alignright',
				'link',
				'wp_more',
				'spellchecker',
			);

			if ( ! wp_is_mobile() ) {
				if ( $set['_content_editor_dfw'] ) {
					$mce_buttons[] = 'wp_adv';
					$mce_buttons[] = 'dfw';
				} else {
					$mce_buttons[] = 'fullscreen';
					$mce_buttons[] = 'wp_adv';
				}
			} else {
				$mce_buttons[] = 'wp_adv';
			}

			/**
			 * Filters the first-row list of TinyMCE buttons (Visual tab).
			 *
			 * @since 2.0.0
			 * @since 3.3.0 The `$editor_id` parameter was added.
			 *
			 * @param array  $mce_buttons First-row list of buttons.
			 * @param string $editor_id   Unique editor identifier, e.g. 'content'. Accepts 'classic-block'
			 *                            when called from block editor's Classic block.
			 */
			$mce_buttons = apply_filters( 'mce_buttons', $mce_buttons, $editor_id );

			$mce_buttons_2 = array(
				'strikethrough',
				'hr',
				'forecolor',
				'pastetext',
				'removeformat',
				'charmap',
				'outdent',
				'indent',
				'undo',
				'redo',
			);

			if ( ! wp_is_mobile() ) {
				$mce_buttons_2[] = 'wp_help';
			}

			/**
			 * Filters the second-row list of TinyMCE buttons (Visual tab).
			 *
			 * @since 2.0.0
			 * @since 3.3.0 The `$editor_id` parameter was added.
			 *
			 * @param array  $mce_buttons_2 Second-row list of buttons.
			 * @param string $editor_id     Unique editor identifier, e.g. 'content'. Accepts 'classic-block'
			 *                              when called from block editor's Classic block.
			 */
			$mce_buttons_2 = apply_filters( 'mce_buttons_2', $mce_buttons_2, $editor_id );

			/**
			 * Filters the third-row list of TinyMCE buttons (Visual tab).
			 *
			 * @since 2.0.0
			 * @since 3.3.0 The `$editor_id` parameter was added.
			 *
			 * @param array  $mce_buttons_3 Third-row list of buttons.
			 * @param string $editor_id     Unique editor identifier, e.g. 'content'. Accepts 'classic-block'
			 *                              when called from block editor's Classic block.
			 */
			$mce_buttons_3 = apply_filters( 'mce_buttons_3', array(), $editor_id );

			/**
			 * Filters the fourth-row list of TinyMCE buttons (Visual tab).
			 *
			 * @since 2.5.0
			 * @since 3.3.0 The `$editor_id` parameter was added.
			 *
			 * @param array  $mce_buttons_4 Fourth-row list of buttons.
			 * @param string $editor_id     Unique editor identifier, e.g. 'content'. Accepts 'classic-block'
			 *                              when called from block editor's Classic block.
			 */
			$mce_buttons_4 = apply_filters( 'mce_buttons_4', array(), $editor_id );
		}

		$body_class = $editor_id;

		$post = get_post();
		if ( $post ) {
			$body_class .= ' post-type-' . sanitize_html_class( $post->post_type ) . ' post-status-' . sanitize_html_class( $post->post_status );

			if ( post_type_supports( $post->post_type, 'post-formats' ) ) {
				$post_format = get_post_format( $post );
				if ( $post_format && ! is_wp_error( $post_format ) ) {
					$body_class .= ' post-format-' . sanitize_html_class( $post_format );
				} else {
					$body_class .= ' post-format-standard';
				}
			}

			$page_template = get_page_template_slug( $post );

			if ( false !== $page_template ) {
				$page_template = empty( $page_template ) ? 'default' : str_replace( '.', '-', basename( $page_template, '.php' ) );
				$body_class   .= ' page-template-' . sanitize_html_class( $page_template );
			}
		}

		$body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_user_locale() ) ) );

		if ( ! empty( $set['tinymce']['body_class'] ) ) {
			$body_class .= ' ' . $set['tinymce']['body_class'];
			unset( $set['tinymce']['body_class'] );
		}

		$mce_init = array(
			'selector'          => "#$editor_id",
			'wpautop'           => (bool) $set['wpautop'],
			'indent'            => ! $set['wpautop'],
			'toolbar1'          => implode( ',', $mce_buttons ),
			'toolbar2'          => implode( ',', $mce_buttons_2 ),
			'toolbar3'          => implode( ',', $mce_buttons_3 ),
			'toolbar4'          => implode( ',', $mce_buttons_4 ),
			'tabfocus_elements' => $set['tabfocus_elements'],
			'body_class'        => $body_class,
		);

		// Merge with the first part of the init array.
		$mce_init = array_merge( self::$first_init, $mce_init );

		if ( is_array( $set['tinymce'] ) ) {
			$mce_init = array_merge( $mce_init, $set['tinymce'] );
		}

		/*
		 * For people who really REALLY know what they're doing with TinyMCE
		 * You can modify $mceInit to add, remove, change elements of the config
		 * before tinyMCE.init. Setting "valid_elements", "invalid_elements"
		 * and "extended_valid_elements" can be done through this filter. Best
		 * is to use the default cleanup by not specifying valid_elements,
		 * as TinyMCE checks against the full set of HTML 5.0 elements and attributes.
		 */
		if ( $set['teeny'] ) {

			/**
			 * Filters the teenyMCE config before init.
			 *
			 * @since 2.7.0
			 * @since 3.3.0 The `$editor_id` parameter was added.
			 *
			 * @param array  $mce_init  An array with teenyMCE config.
			 * @param string $editor_id Unique editor identifier, e.g. 'content'.
			 */
			$mce_init = apply_filters( 'teeny_mce_before_init', $mce_init, $editor_id );
		} else {

			/**
			 * Filters the TinyMCE config before init.
			 *
			 * @since 2.5.0
			 * @since 3.3.0 The `$editor_id` parameter was added.
			 *
			 * @param array  $mce_init  An array with TinyMCE config.
			 * @param string $editor_id Unique editor identifier, e.g. 'content'. Accepts 'classic-block'
			 *                          when called from block editor's Classic block.
			 */
			$mce_init = apply_filters( 'tiny_mce_before_init', $mce_init, $editor_id );
		}

		if ( empty( $mce_init['toolbar3'] ) && ! empty( $mce_init['toolbar4'] ) ) {
			$mce_init['toolbar3'] = $mce_init['toolbar4'];
			$mce_init['toolbar4'] = '';
		}

		self::$mce_settings[ $editor_id ] = $mce_init;
	} // End if self::$this_tinymce.
}