/wp-content/plugins/black-studio-tinymce-widget/includes/class-admin.php
PHP | 441 lines | 183 code | 31 blank | 227 comment | 21 complexity | f1504bcc966bd335371bab3bf863c0e2 MD5 | raw file
- <?php
- // Exit if accessed directly
- if ( ! defined( 'ABSPATH' ) ) {
- exit;
- }
- /**
- * Class that provides admin functionalities
- *
- * @package Black_Studio_TinyMCE_Widget
- * @since 2.0.0
- */
- if ( ! class_exists( 'Black_Studio_TinyMCE_Admin' ) ) {
- final class Black_Studio_TinyMCE_Admin {
- /**
- * The single instance of the class
- *
- * @var object
- * @since 2.0.0
- */
- protected static $_instance = null;
- /**
- * Array containing the plugin links
- *
- * @var array
- * @since 2.0.0
- */
- protected $links;
- /**
- * Return the single class instance
- *
- * @return object
- * @since 2.0.0
- */
- public static function instance() {
- if ( is_null( self::$_instance ) ) {
- self::$_instance = new self();
- }
- return self::$_instance;
- }
- /**
- * Class constructor
- *
- * @uses add_action()
- * @uses add_filter()
- * @uses get_option()
- * @uses get_bloginfo()
- *
- * @global object $wp_embed
- * @return void
- * @since 2.0.0
- */
- protected function __construct() {
- // Register action and filter hooks
- add_action( 'plugins_loaded', array( $this, 'load_textdomain' ) );
- add_action( 'admin_init', array( $this, 'admin_init' ), 20 );
- }
- /**
- * Prevent the class from being cloned
- *
- * @return void
- * @since 2.0.0
- */
- protected function __clone() {
- _doing_it_wrong( __FUNCTION__, __( 'Cheatin’ uh?' ), '2.0' );
- }
- /**
- * Load language files
- *
- * @uses load_plugin_textdomain()
- *
- * @return void
- * @since 2.0.0
- */
- public function load_textdomain() {
- load_plugin_textdomain( 'black-studio-tinymce-widget', false, dirname( dirname( plugin_basename( __FILE__ ) ) ) . '/languages/' );
- }
- /**
- * Checks if the plugin admin code should be loaded
- *
- * @uses apply_filters()
- *
- * @global string $pagenow
- * @return void
- * @since 2.0.0
- */
- public function enabled() {
- global $pagenow;
- $enabled_pages = apply_filters( 'black_studio_tinymce_enable_pages', array( 'widgets.php', 'customize.php', 'admin-ajax.php' ) );
- return apply_filters( 'black_studio_tinymce_enable', in_array( $pagenow, $enabled_pages ) );
- }
- /**
- * Add actions and filters (only in widgets admin page)
- *
- * @uses add_action()
- * @uses add_filter()
- * @uses do_action()
- *
- * @return void
- * @since 2.0.0
- */
- public function admin_init() {
- $this->init_links();
- add_action( 'plugin_row_meta', array( $this, 'plugin_row_meta' ), 10, 2 );
- if ( $this->enabled() ) {
- add_action( 'admin_head', array( $this, 'enqueue_media' ) );
- add_action( 'admin_print_scripts', array( $this, 'admin_print_scripts' ) );
- add_action( 'admin_print_styles', array( $this, 'admin_print_styles' ) );
- add_action( 'admin_print_footer_scripts', array( $this, 'admin_print_footer_scripts' ) );
- add_action( 'black_studio_tinymce_before_editor', array( $this, 'display_links' ) ); // consider donating if you remove links
- add_action( 'black_studio_tinymce_editor', array( $this, 'editor' ), 10, 4 );
- add_action( 'black_studio_tinymce_after_editor', array( $this, 'fix_the_editor_content_filter' ) );
- add_action( 'wp_tiny_mce_init', array( $this, 'wp_tiny_mce_init' ) );
- add_filter( 'wp_editor_settings', array( $this, 'editor_settings' ), 5, 2 );
- add_filter( 'tiny_mce_before_init', array( $this, 'tinymce_fix_rtl' ), 10 );
- add_filter( 'tiny_mce_before_init', array( $this, 'tinymce_fullscreen' ), 10, 2 );
- add_filter( 'quicktags_settings', array( $this, 'quicktags_fullscreen' ), 10, 2 );
- do_action( 'black_studio_tinymce_load' );
- }
- }
- /**
- * Instantiate tinyMCE editor
- *
- * @uses add_thickbox()
- * @uses wp_enqueue_media()
- *
- * @return void
- * @since 2.0.0
- */
- public function enqueue_media() {
- // Add support for thickbox media dialog
- add_thickbox();
- // New media modal dialog (WP 3.5+)
- if ( function_exists( 'wp_enqueue_media' ) ) {
- wp_enqueue_media();
- }
- }
- /**
- * Enqueue styles
- *
- * @uses wp_enqueue_style()
- * @uses Black_Studio_TinyMCE_Plugin::enqueue_style()
- *
- * @return void
- * @since 2.0.0
- */
- public function admin_print_styles() {
- wp_enqueue_style( 'wp-jquery-ui-dialog' );
- wp_enqueue_style( 'editor-buttons' );
- $this->enqueue_style();
- }
- /**
- * Helper function to enqueue style
- *
- * @uses apply_filters()
- * @uses wp_enqueue_style()
- * @uses plugins_url()
- * @uses SCRIPT_DEBUG
- *
- * @return void
- * @since 2.0.0
- */
- public function enqueue_style() {
- $style = apply_filters( 'black-studio-tinymce-widget-style', 'black-studio-tinymce-widget' );
- $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
- wp_enqueue_style(
- $style,
- plugins_url( 'css/' . $style . $suffix. '.css', dirname( __FILE__ ) ),
- array(),
- bstw()->get_version()
- );
- }
- /**
- * Enqueue header scripts
- *
- * @uses wp_enqueue_script()
- * @uses do_action()
- *
- * @return void
- * @since 2.0.0
- */
- public function admin_print_scripts() {
- wp_enqueue_script( 'media-upload' );
- wp_enqueue_script( 'wplink' );
- wp_enqueue_script( 'wpdialogs-popup' );
- $this->enqueue_script();
- $this->localize_script();
- do_action( 'wp_enqueue_editor', array( 'tinymce' => true ) );
- }
- /**
- * Helper function to enqueue script
- *
- * @uses apply_filters()
- * @uses wp_enqueue_script()
- * @uses plugins_url()
- * @uses SCRIPT_DEBUG
- *
- * @return void
- * @since 2.0.0
- */
- public function enqueue_script() {
- $script = apply_filters( 'black-studio-tinymce-widget-script', 'black-studio-tinymce-widget' );
- $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
- wp_enqueue_script(
- $script,
- plugins_url( 'js/' . $script . $suffix . '.js', dirname( __FILE__ ) ),
- array( 'jquery', 'editor', 'quicktags' ),
- bstw()->get_version(),
- true
- );
- }
- /**
- * Helper function to enqueue localized script
- *
- * @uses apply_filters()
- * @uses wp_localize_script()
- *
- * @return void
- * @since 2.0.0
- */
- public function localize_script() {
- $container_selectors = apply_filters( 'black_studio_tinymce_container_selectors', array( 'div.widget', 'div.widget-inside' ) );
- $activate_events = apply_filters( 'black_studio_tinymce_activate_events', array() );
- $deactivate_events = apply_filters( 'black_studio_tinymce_deactivate_events', array() );
- $data = array(
- 'container_selectors' => implode( ', ', $container_selectors ),
- 'activate_events' => $activate_events,
- 'deactivate_events' => $deactivate_events,
- /* translators: error message shown when a duplicated widget ID is detected */
- 'error_duplicate_id' => __( 'ERROR: Duplicate widget ID detected. To avoid content loss, please create a new widget with the same content and then delete this one.', 'black-studio-tinymce-widget' )
- );
- wp_localize_script( apply_filters( 'black-studio-tinymce-widget-script', 'black-studio-tinymce-widget' ), 'bstw_data', $data );
- }
- /**
- * Enqueue footer scripts
- *
- * @return void
- * @since 2.0.0
- */
- public function admin_print_footer_scripts() {
- $this->editor( '', 'black-studio-tinymce-widget', 'black-studio-tinymce-widget' );
- }
- /**
- * Output the visual editor
- *
- * @uses wp_editor()
- *
- * @param string $text
- * @param string $editor_id
- * @param string $name
- * @param string $type
- * @return void
- * @since 2.0.0
- */
- public function editor( $text, $editor_id, $name = '', $type = 'visual' ) {
- wp_editor( $text, $editor_id, array( 'textarea_name' => $name, 'default_editor' => $type == 'visual' ? 'tmce' : 'html' ) );
- }
- /**
- * Remove editor content filters for multiple editor instances
- * Workaround for WordPress Core bug #28403 https://core.trac.wordpress.org/ticket/28403
- *
- * @uses remove_filter
- *
- * @return void
- * @since 2.1.7
- */
- function fix_the_editor_content_filter() {
- remove_filter( 'the_editor_content', 'wp_htmledit_pre' );
- remove_filter( 'the_editor_content', 'wp_richedit_pre' );
- }
- /**
- * Setup editor instance for event handling
- *
- * @return void
- * @since 2.2.1
- */
- function wp_tiny_mce_init() {
- $script = 'black-studio-tinymce-widget-setup';
- $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
- echo "\t\t" . '<script type="text/javascript" src="' . plugins_url( 'js/' . $script . $suffix . '.js', dirname( __FILE__ ) ) . '"></script>' . "\n"; // xss ok
- }
- /**
- * Set editor settings
- *
- * @param mixed[] $settings
- * @param string $editor_id
- * @return mixed[]
- * @since 2.0.0
- */
- public function editor_settings( $settings, $editor_id ) {
- if ( strstr( $editor_id, 'black-studio-tinymce' ) ) {
- $settings['tinymce'] = array(
- 'wp_skip_init' => 'widget-black-studio-tinymce-__i__-text' == $editor_id,
- 'add_unload_trigger' => false,
- 'wp_autoresize_on' => false,
- );
- $settings['editor_height'] = 350;
- $settings['dfw'] = true;
- $settings['editor_class'] = 'black-studio-tinymce';
- }
- return $settings;
- }
- /**
- * Initialize plugin links
- *
- * @return void
- * @since 2.0.0
- */
- public function init_links() {
- $this->links = array(
- /* translators: text used for plugin home link */
- 'https://wordpress.org/plugins/black-studio-tinymce-widget/' => __( 'Home', 'black-studio-tinymce-widget' ),
- /* translators: text used for support faq link */
- 'https://wordpress.org/plugins/black-studio-tinymce-widget/faq/' => __( 'FAQ', 'black-studio-tinymce-widget' ),
- /* translators: text used for support forum link */
- 'https://wordpress.org/support/plugin/black-studio-tinymce-widget' => __( 'Support', 'black-studio-tinymce-widget' ),
- /* translators: text used for reviews link */
- 'https://wordpress.org/support/view/plugin-reviews/black-studio-tinymce-widget' => __( 'Rate', 'black-studio-tinymce-widget' ),
- /* translators: text used for follow on twitter link */
- 'https://twitter.com/blackstudioita' => __( 'Follow', 'black-studio-tinymce-widget' ),
- /* translators: text used for donation link */
- 'http://www.blackstudio.it/en/wordpress-plugins/black-studio-tinymce-widget/' => __( 'Donate', 'black-studio-tinymce-widget' ),
- );
- }
- /**
- * Display plugin links
- *
- * @return void
- * @since 2.0.0
- */
- public function display_links() {
- echo "\t<div class='bstw-links'>\n";
- echo "\t\t<span class='bstw-links-list'>\n";
- $counter = count( $this->links ) - 1;
- foreach ( $this->links as $url => $label ) {
- $separator = ( $counter-- > 0 ? ' | ' : '' );
- echo "\t\t\t<a href='" . esc_url( $url ) . "' target='_blank'>" . esc_html( $label ) . "</a>$separator\n"; // xss ok
- }
- echo "\t\t</span>\n";
- /* translators: text used for the icon that shows the plugin links */
- echo "\t\t<a class='bstw-links-icon icon16 icon-plugins' href='#' title='" . esc_attr( __( 'About Black Studio TinyMCE Widget plugin', 'black-studio-tinymce-widget' ) ) . "'></a>\n";
- echo "\t</div>\n";
- }
- /**
- * Show row meta on the plugin screen
- *
- * @uses esc_html()
- * @uses esc_url()
- *
- * @param string[] $links
- * @param string $file
- * @return string[]
- * @since 2.0.0
- */
- public function plugin_row_meta( $links, $file ) {
- if ( $file == bstw()->get_basename() ) {
- foreach ( $this->links as $url => $label ) {
- $links[ $label ] = '<a href="' . esc_url( $url ) . '" target="_blank">' . esc_html( $label ) . '</a>';
- }
- }
- return $links;
- }
- /**
- * Fix for rtl languages
- *
- * @param mixed[] $settings
- * @return mixed[]
- * @since 2.1.0
- */
- public function tinymce_fix_rtl( $settings ) {
- // This fix has to be applied to all editor instances (not just BSTW ones)
- if ( is_rtl() && isset( $settings['plugins'] ) && ',directionality' == $settings['plugins'] ) {
- unset( $settings['plugins'] );
- }
- return $settings;
- }
- /**
- * Apply TinyMCE default fullscreen
- *
- * @param mixed[] $settings
- * @param string $editor_id
- * @return mixed[]
- * @since 2.1.2
- */
- public function tinymce_fullscreen( $settings, $editor_id ) {
- if ( strstr( $editor_id, 'black-studio-tinymce' ) ) {
- for ( $i = 1; $i <= 4; $i++ ) {
- $toolbar = 'toolbar' . $i;
- if ( isset( $settings[ $toolbar ] ) ) {
- $settings[ $toolbar ] = str_replace( 'wp_fullscreen', 'wp_fullscreen,fullscreen', $settings[ $toolbar ] );
- }
- }
- }
- return $settings;
- }
- /**
- * Disable Quicktags default fullscreen
- *
- * @param mixed[] $settings
- * @param string $editor_id
- * @return mixed[]
- * @since 2.1.2
- */
- public function quicktags_fullscreen( $settings, $editor_id ) {
- if ( strstr( $editor_id, 'black-studio-tinymce' ) ) {
- $settings['buttons'] = str_replace( ',fullscreen', '', $settings['buttons'] );
- }
- return $settings;
- }
- } // END class Black_Studio_TinyMCE_Admin
- } // END class_exists check