/** * Enqueue admin scripts * @return void */ public function on_admin_scripts() { $post = get_post(); $type = empty($post->post_type) ? '' : $post->post_type; if ($this->disabled_entity($type)) { return; } /** * Dequeue autosave for prevent alert from wp.autosave.server.postChanged() after run post_edit in wpglobus.admin.js * @see wp-includes\js\autosave.js */ wp_dequeue_script('autosave'); $pagenow = WPGlobus_WP::pagenow(); $config = WPGlobus::Config(); /** * Get array of enabled pages for loading js */ $enabled_pages = $this->enabled_pages; /** * Init $post_content */ $post_content = ''; /** * Init $post_title */ $post_title = ''; /** * Init $post_excerpt */ $post_excerpt = ''; /** * Init $page_action */ $page_action = ''; /** * Init $page */ $page = ''; /** * Init array data depending on the context for localize script */ $data = array('default_language' => $config->default_language, 'language' => $config->language, 'enabled_languages' => $config->enabled_languages, 'open_languages' => $config->open_languages, 'en_language_name' => $config->en_language_name, 'locale_tag_start' => self::LOCALE_TAG_START, 'locale_tag_end' => self::LOCALE_TAG_END); if (!in_array($pagenow, $enabled_pages)) { $page = WPGlobus_WP::plugin_page(); } if ('' == $page) { /** * Now get $pagenow */ $page = isset($pagenow) ? $pagenow : ''; if ('post.php' == $page || 'post-new.php' == $page) { $page_action = 'post-edit'; /** * We use $post_content, $post_title at edit post page */ /** * Set $post_content for default language * because we have text with all languages and delimiters in $post->post_content * next we send $post_content to js with localize script * @see post_edit() in admin.globus.js */ $post_content = WPGlobus_Core::text_filter($post->post_content, $config->default_language); /** * Set $post_title for default language */ $post_title = WPGlobus_Core::text_filter($post->post_title, $config->default_language); } } if (self::LANGUAGE_EDIT_PAGE === $page) { /** * Using the same 'select2-js' ID as Redux Plugin does, to avoid duplicate enqueueing */ if (!wp_script_is('select2-js')) { wp_enqueue_script('select2-js', WPGlobus::$PLUGIN_DIR_URL . 'lib/select2.min.js', array('jquery'), '3.5.2', true); } } if (in_array($page, $enabled_pages)) { /** * Init $tabs_suffix */ $tabs_suffix = array(); if (in_array($page, array('post.php', 'post-new.php', 'edit-tags.php', 'term.php'))) { /** * Make suffixes for tabs */ foreach ($config->enabled_languages as $language) { if ($language == $config->default_language) { $tabs_suffix[] = 'default'; } else { $tabs_suffix[] = $language; } } } $i18n = array(); $i18n['cannot_disable_language'] = __('You cannot disable the main language.', 'wpglobus'); if ('post.php' == $page || 'post-new.php' == $page) { /** * Add template for standard excerpt meta box */ $data['template'] = ''; foreach (WPGlobus::Config()->enabled_languages as $language) { $return = $language == WPGlobus::Config()->default_language ? WPGlobus::RETURN_IN_DEFAULT_LANGUAGE : WPGlobus::RETURN_EMPTY; $classes = in_array($language, WPGlobus::Config()->open_languages) ? 'wpglobus-excerpt wpglobus-translatable' : 'wpglobus-excerpt wpglobus-translatable hidden'; $data['template'] .= '<textarea data-language="' . $language . '" placeholder="' . WPGlobus::Config()->en_language_name[$language] . '" class="' . $classes . '" rows="1" cols="40" name="excerpt-' . $language . '" id="excerpt-' . $language . '">'; $data['template'] .= WPGlobus_Core::text_filter($post->post_excerpt, $language, $return); $data['template'] .= '</textarea>'; if (defined('WPSEO_VERSION')) { /** * @todo This is the only place with WPSEO not in its own class. */ $blogname = get_option('blogname'); $blogdesc = get_option('blogdescription'); $data['blogname'][$language] = WPGlobus_Core::text_filter($blogname, $language, WPGlobus::RETURN_IN_DEFAULT_LANGUAGE); $data['blogdescription'][$language] = WPGlobus_Core::text_filter($blogdesc, $language, WPGlobus::RETURN_IN_DEFAULT_LANGUAGE); } } $data['modify_excerpt'] = true; if (isset($this->vendors_scripts['WOOCOMMERCE']) && $this->vendors_scripts['WOOCOMMERCE'] && 'product' == $post->post_type) { $data['modify_excerpt'] = false; } $data['tagsdiv'] = array(); $data['tag'] = array(); $tags = $this->_get_taxonomies($post->post_type, 'non-hierarchical'); if (!empty($tags)) { foreach ($tags as $tag) { $data['tagsdiv'][] = 'tagsdiv-' . $tag; $data['tag'][$tag] = self::_get_terms($tag); } } /** * Check for support 'title' */ $data['support']['title'] = true; if (!post_type_supports($post->post_type, 'title')) { $data['support']['title'] = false; } /** * Check for support 'editor' */ $data['support']['editor'] = true; if (!post_type_supports($post->post_type, 'editor')) { $data['support']['editor'] = false; } if (!empty($post)) { $data['post_type'] = $post->post_type; $opts = (array) get_option(WPGlobus::Config()->option_post_meta_settings); if (empty($opts)) { $data['post_meta_settings'] = ''; } else { $data['post_meta_settings'] = $opts; } } $data['customFieldsEnabled'] = true; /** * Filter to enable/disable multilingual custom fields on post.php|post-new.php page. * Returning boolean. * @since 1.6.5 * * @param boolean $data[ 'customFieldsEnabled' ] Enabled by default. * @param WP_Post Object $post Current post. */ $data['customFieldsEnabled'] = apply_filters('wpglobus_custom_fields_enabled', $data['customFieldsEnabled'], $post); if ($data['customFieldsEnabled']) { $data['customFieldsEnabled'] = 'true'; } else { $data['customFieldsEnabled'] = 'false'; } } else { if ('nav-menus.php' === $page) { $page_action = 'menu-edit'; $menu_items = array(); $post_titles = array(); /** @global wpdb $wpdb */ global $wpdb; $_query = new WP_Query(array('post_type' => 'nav_menu_item', 'nopaging' => true)); /** * Array of menu items. * * @var WP_Post[] $items */ $items = $_query->posts; unset($_query); foreach ($items as $item) { $item->post_title = trim($item->post_title); if (empty($item->post_title)) { $item_type = get_post_meta($item->ID, '_menu_item_type', true); $item_object = get_post_meta($item->ID, '_menu_item_object', true); $item_object_id = get_post_meta($item->ID, '_menu_item_object_id', true); $_raw_title = ''; if ('post_type' === $item_type) { $_raw_title = get_post_field('post_title', $item_object_id); } elseif ('taxonomy' === $item_type) { /** * Here we need the raw term. Temporary need to disable our filter. */ remove_filter('get_term', array('WPGlobus_Filters', 'filter__get_term'), 0); $term = get_term_by('id', $item_object_id, $item_object); add_filter('get_term', array('WPGlobus_Filters', 'filter__get_term'), 0); $_raw_title = $term->name; } $_raw_title = trim($_raw_title); if (!empty($_raw_title)) { $item->post_title = $_raw_title; // Save the raw title in the menu. $wpdb->query($wpdb->prepare("UPDATE {$wpdb->posts} SET post_title = '%s' WHERE ID = %d", $_raw_title, $item->ID)); } } // Empty post_title. /** * Add raw data for Navigation Label */ $menu_items[$item->ID]['input.edit-menu-item-title']['source'] = $item->post_title; /** * Add raw data for Title Attribute */ $menu_items[$item->ID]['input.edit-menu-item-attr-title']['source'] = $item->post_excerpt; $menu_items[$item->ID]['item-title'] = WPGlobus_Core::text_filter($item->post_title, $config->default_language); $post_titles[$item->post_title] = $menu_items[$item->ID]['item-title']; foreach (self::Config()->enabled_languages as $language) { $return = $language == self::Config()->default_language ? WPGlobus::RETURN_IN_DEFAULT_LANGUAGE : WPGlobus::RETURN_EMPTY; /** * Navigation Label */ $menu_items[$item->ID][$language]['input.edit-menu-item-title']['caption'] = WPGlobus_Core::text_filter($item->post_title, $language, $return); /** * Title Attribute */ $menu_items[$item->ID][$language]['input.edit-menu-item-attr-title']['caption'] = WPGlobus_Core::text_filter($item->post_excerpt, $language, $return); /** * Navigation Label classes */ $menu_items[$item->ID][$language]['input.edit-menu-item-title']['class'] = 'widefat wpglobus-menu-item wpglobus-item-title wpglobus-translatable'; /** * Title Attribute classes */ $menu_items[$item->ID][$language]['input.edit-menu-item-attr-title']['class'] = 'widefat wpglobus-menu-item wpglobus-item-attr wpglobus-translatable'; } } $data['items'] = $menu_items; $data['post_titles'] = $post_titles; $i18n['save_nav_menu'] = __('*) Available after the menu is saved.', 'wpglobus'); } else { if ('edit-tags.php' == $page || 'term.php' == $page) { global $tag; $data['taxonomy'] = empty($_GET['taxonomy']) ? false : $_GET['taxonomy']; $data['tag_id'] = empty($_GET['tag_ID']) ? false : $_GET['tag_ID']; $data['has_items'] = true; if ($data['tag_id']) { /** * For example url: edit-tags.php?action=edit&taxonomy=category&tag_ID=4&post_type=post */ $page_action = 'taxonomy-edit'; } else { /** * For example url: edit-tags.php?taxonomy=category * edit-tags.php?taxonomy=product_cat&post_type=product */ if (!empty($_GET['taxonomy'])) { $terms = get_terms($_GET['taxonomy'], array('hide_empty' => false)); if (is_wp_error($terms) or empty($terms)) { $data['has_items'] = false; } } $page_action = 'taxonomy-quick-edit'; } if ($data['tag_id']) { foreach ($config->enabled_languages as $language) { $lang = $language == $config->default_language ? 'default' : $language; if ('default' == $lang) { $data['i18n'][$lang]['name'] = WPGlobus_Core::text_filter($tag->name, $language, WPGlobus::RETURN_IN_DEFAULT_LANGUAGE); $data['i18n'][$lang]['description'] = WPGlobus_Core::text_filter($tag->description, $language, WPGlobus::RETURN_IN_DEFAULT_LANGUAGE); } else { $data['i18n'][$lang]['name'] = WPGlobus_Core::text_filter($tag->name, $language, WPGlobus::RETURN_EMPTY); $data['i18n'][$lang]['description'] = WPGlobus_Core::text_filter($tag->description, $language, WPGlobus::RETURN_EMPTY); } } } else { /** * Get template for quick edit taxonomy name at edit-tags.php page */ $data['template'] = $this->_get_quickedit_template(); } } else { if ('edit.php' == $page) { $page_action = 'edit.php'; $post_type = 'post'; if (!empty($_GET['post_type'])) { $post_type = $_GET['post_type']; } global $posts; $data['has_items'] = empty($posts) ? false : true; /** * Get template for quick edit post title at edit.php page */ $data['template'] = $this->_get_quickedit_template(); $tags = $this->_get_taxonomies($post_type, 'non-hierarchical'); if (!empty($tags)) { foreach ($tags as $tag) { $terms = self::_get_terms($tag); if (!empty($terms)) { $data['tags'][] = $tag; $data['names'][$tag] = 'tax_input[' . $tag . ']'; $data['tag'][$tag] = $terms; $data['value'][$tag] = ''; // just init $data['value'][$tag]['post_id'] = ''; // just init } } } } else { if ('options-general.php' == $page) { $page_action = 'options-general.php'; } else { if ('widgets.php' == $page) { $page_action = 'widgets.php'; } else { if ('customize.php' == $page) { if (version_compare(WPGLOBUS_VERSION, '1.4.0-beta1', '<')) { $html = sprintf(__('You are customizing %s'), '<strong class="theme-name site-title"><span id="wpglobus-customize-info">' . esc_html(WPGlobus_Core::text_filter(get_option('blogname'), WPGlobus::Config()->default_language)) . '</span></strong>'); } else { // @since 1.4.0 class panel-title site-title $html = sprintf(__('You are customizing %s'), '<strong class="panel-title site-title"><span id="wpglobus-customize-info">' . esc_html(WPGlobus_Core::text_filter(get_option('blogname'), WPGlobus::Config()->default_language)) . '</span></strong>'); } $page_action = 'customize.php'; $page_data_key = 'customize'; $page_data_values = array('info' => array('element' => '#customize-info .preview-notice', 'html' => $html), 'addElements' => array('wpglobus_blogname' => array('origin' => 'blogname', 'origin_element' => '#customize-control-blogname input', 'origin_parent' => '#customize-control-blogname', 'element' => '#customize-control-wpglobus_blogname input', 'value' => WPGlobus_Core::text_filter(get_option('blogname'), WPGlobus::Config()->language, WPGlobus::RETURN_EMPTY)), 'wpglobus_blogdescription' => array('origin' => 'blogdescription', 'origin_element' => '#customize-control-blogdescription input', 'origin_parent' => '#customize-control-blogdescription', 'element' => '#customize-control-wpglobus_blogdescription input', 'value' => WPGlobus_Core::text_filter(get_option('blogdescription'), WPGlobus::Config()->language, WPGlobus::RETURN_EMPTY)))); } else { if (in_array($page, array('wpglobus_options', self::LANGUAGE_EDIT_PAGE))) { $page_action = 'wpglobus_options'; } else { if (in_array($page, array(self::PAGE_WPGLOBUS_CLEAN))) { $page_action = 'wpglobus_clean'; } else { if (in_array($page, array(self::PAGE_WPGLOBUS_ADMIN_CENTRAL))) { /** * @since 1.6.6 */ $page_action = 'wpglobusAdminCentral'; } else { $page_action = $page; } } } } } } } } } } wp_register_script('wpglobus-admin', self::$PLUGIN_DIR_URL . "includes/js/wpglobus-admin" . self::$_SCRIPT_SUFFIX . ".js", array('jquery', 'jquery-ui-dialog', 'jquery-ui-tabs'), WPGLOBUS_VERSION, true); wp_enqueue_script('wpglobus-admin'); /** * We need to send the HTML breaks and not \r\n to the JS, * because we do element.text(...), and \r\n are being removed by TinyMCE * See other places with the same bookmark. * @bookmark EDITOR_LINE_BREAKS * added 24.05.2015 * @todo what's next with wpautop? @see 'wpautop()' in https://make.wordpress.org/core/2015/05/14/dev-chat-summary-may-13/ */ if (has_filter('the_content', 'wpautop')) { $post_content_autop = wpautop($post_content); } else { $post_content_autop = $post_content; } /** * Filter for data to send to JS. * Returning array. * @since 1.5.5 * * @param array $data An array with data. * @param string $page_action Page. */ $data = apply_filters('wpglobus_localize_data', $data, $page_action); wp_localize_script('wpglobus-admin', 'WPGlobusAdmin', array('version' => WPGLOBUS_VERSION, 'page' => $page_action, 'content' => $post_content_autop, 'title' => $post_title, 'excerpt' => $post_excerpt, 'ajaxurl' => admin_url('admin-ajax.php'), 'parentClass' => __CLASS__, 'process_ajax' => __CLASS__ . '_process_ajax', 'flag_url' => $config->flags_url, 'tabs' => $tabs_suffix, 'i18n' => $i18n, 'data' => $data)); if (empty($page_data_key)) { $page_data_key = 'page_custom_data'; } if (empty($page_data_values)) { $page_data_values = null; } /** * Add multisite property * @since 1.6.0 */ $is_multisite = 'false'; if (is_multisite()) { $is_multisite = 'true'; } /** * Filter for custom data to send to JS. * Returning array or null. * @since 1.2.9 * * @param array $page_data_values An array with custom data or null. * @param string $page_data_key Data key. @since 1.3.0 * @param string $page_action Page. @since 1.5.0 */ $page_data_values = apply_filters('wpglobus_localize_custom_data', $page_data_values, $page_data_key, $page_action); wp_localize_script('wpglobus-admin', 'WPGlobusCoreData', array_merge(array('version' => WPGLOBUS_VERSION, 'default_language' => $config->default_language, 'language' => $config->language, 'enabled_languages' => $config->enabled_languages, 'open_languages' => $config->open_languages, 'en_language_name' => $config->en_language_name, 'locale_tag_start' => self::LOCALE_TAG_START, 'locale_tag_end' => self::LOCALE_TAG_END, 'page' => $page_action, 'multisite' => $is_multisite, 'pluginInstallLocation' => array('single' => 'plugin-install.php?tab=search&s=WPGlobus&source=WPGlobus', 'multisite' => 'network/plugin-install.php?tab=search&s=WPGlobus&source=WPGlobus')), array($page_data_key => $page_data_values))); /** * Enqueue js for ACF support */ if (($this->vendors_scripts['ACF'] || $this->vendors_scripts['ACFPRO']) && in_array($page, array('post.php', 'post-new.php'))) { /** * Filter to disable translation of selected ACF and ACF Pro fields. * @since 1.5.0 * * To exclude field in ACF plugin you need to use the field name from Field Group ( usually wp-admin/edit.php?post_type=acf ). * To exclude field in ACF Pro plugin you need to use id, see Wrapper Attributes section on field's edit page. * * @param array $disabled_fields Default is empty array. * @param boolean $is_acf_pro Type of ACF plugin. * * @return array */ $disabled_fields = apply_filters('wpglobus_disabled_acf_fields', array(), $this->vendors_scripts['ACFPRO']); wp_register_script('wpglobus-acf', self::$PLUGIN_DIR_URL . "includes/js/wpglobus-vendor-acf" . self::$_SCRIPT_SUFFIX . ".js", array('jquery', 'wpglobus-admin'), WPGLOBUS_VERSION, true); wp_enqueue_script('wpglobus-acf'); wp_localize_script('wpglobus-acf', 'WPGlobusAcf', array('wpglobus_version' => WPGLOBUS_VERSION, 'pro' => $this->vendors_scripts['ACFPRO'] ? true : false, 'disabledFields' => $disabled_fields)); } if ('widgets.php' == $page) { $disabled_widgets_mask = array('rss-url'); /** * Filter to disable making multilingual element on widgets.php page. * @since 1.5.3 * * @param array $disabled_widgets_mask Array of disabled masks. * * @return array */ $disabled_widgets_mask = apply_filters('wpglobus_disabled_widgets_mask', $disabled_widgets_mask); wp_register_script('wpglobus-widgets', self::$PLUGIN_DIR_URL . "includes/js/wpglobus-widgets" . self::$_SCRIPT_SUFFIX . ".js", array('jquery', 'underscore', 'wpglobus-admin'), WPGLOBUS_VERSION, true); wp_enqueue_script('wpglobus-widgets'); wp_localize_script('wpglobus-widgets', 'WPGlobusWidgets', array('wpglobus_version' => WPGLOBUS_VERSION, 'disabledMask' => $disabled_widgets_mask)); } } // endif $enabled_pages }