Files

413 lines
16 KiB
PHP

<?php
/**
* WP ADMIN assets will be enqueued here.
*
* @package monsterinsights
*/
/**
* Class MonsterInsights_Admin_Assets
* This class is responsible for load CSS and JS in admin panel.
*/
class MonsterInsights_Admin_Assets {
/**
* MonsterInsights handles.
*/
private $own_handles = array(
'monsterinsights-vue-script',
'monsterinsights-vue-frontend',
'monsterinsights-vue-reports',
'monsterinsights-vue-widget',
);
/**
* Store manifest.json file content.
*
* @var array
*/
private static $manifest_data;
/**
* Class constructor.
*/
public function __construct() {
add_filter( 'script_loader_tag', array( $this, 'script_loader_tag' ), 99999, 3 );
add_action( 'admin_enqueue_scripts', array( $this, 'admin_styles' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ) );
$this->get_manifest_data();
}
/**
* Update script tag.
* The vue code needs type=module.
*/
public function script_loader_tag( $tag, $handle, $src ) {
if ( ! in_array( $handle, $this->own_handles ) ) {
return $tag;
}
// Change the script tag by adding type="module" and return it.
return sprintf(
'<script type="module" src="%1$s" id="%2$s-js"></script>%3$s',
$src,
$handle,
PHP_EOL
);
}
/**
* Loads styles for all MonsterInsights-based Administration Screens.
*
* @return null Return early if not on the proper screen.
*/
public function admin_styles() {
$suffix = (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG) ? '' : '.min';
// Load Common admin styles.
wp_register_style('monsterinsights-admin-common-style', plugins_url('assets/css/admin-common' . $suffix . '.css', MONSTERINSIGHTS_PLUGIN_FILE), array(), monsterinsights_get_asset_version());
wp_enqueue_style('monsterinsights-admin-common-style');
// Get current screen.
$screen = get_current_screen();
// Bail if we're not on a MonsterInsights screen.
if (empty($screen->id) || strpos($screen->id, 'monsterinsights') === false) {
return;
}
// For the settings page, load the Vue app styles.
if (monsterinsights_is_settings_page()) {
if (!defined('MONSTERINSIGHTS_LOCAL_JS_URL')) {
$this->enqueue_script_specific_css( 'src/modules/settings/settings.js' );
}
// Don't load other styles on the settings page.
return;
}
if (monsterinsights_is_reports_page()) {
if (!defined('MONSTERINSIGHTS_LOCAL_JS_URL')) {
$this->enqueue_script_specific_css( 'src/modules/reports/reports.js' );
}
return;
}
// Tooltips
wp_enqueue_script('jquery-ui-tooltip');
}
/**
* Loads scripts for all MonsterInsights-based Administration Screens.
*
* @return null Return early if not on the proper screen.
*/
public function admin_scripts() {
// Our Common Admin JS.
$suffix = (defined('SCRIPT_DEBUG') && SCRIPT_DEBUG) ? '' : '.min';
wp_enqueue_script('monsterinsights-admin-common-script', plugins_url('assets/js/admin-common' . $suffix . '.js', MONSTERINSIGHTS_PLUGIN_FILE), array('jquery'), monsterinsights_get_asset_version(), true);
wp_localize_script(
'monsterinsights-admin-common-script',
'monsterinsights_admin_common',
array(
'ajax' => admin_url('admin-ajax.php'),
'dismiss_notice_nonce' => wp_create_nonce('monsterinsights-dismiss-notice'),
)
);
// Get current screen.
$screen = get_current_screen();
// Bail if we're not on a MonsterInsights screen.
if (empty($screen->id) || strpos($screen->id, 'monsterinsights') === false) {
return;
}
$version_path = monsterinsights_is_pro_version() ? 'pro' : 'lite';
// For the settings page, load the Vue app.
if (monsterinsights_is_settings_page()) {
$app_js_url = self::get_js_url( 'src/modules/settings/settings.js' );
wp_register_script('monsterinsights-vue-script', $app_js_url, array(), monsterinsights_get_asset_version(), true);
wp_enqueue_script('monsterinsights-vue-script');
$plugins = get_plugins();
$install_amp_url = false;
if (monsterinsights_can_install_plugins()) {
$amp_key = 'amp/amp.php';
if (array_key_exists($amp_key, $plugins)) {
$install_amp_url = wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=' . $amp_key), 'activate-plugin_' . $amp_key);
} else {
$install_amp_url = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=amp'), 'install-plugin_amp');
}
}
$install_woocommerce_url = false;
if (monsterinsights_can_install_plugins()) {
$woo_key = 'woocommerce/woocommerce.php';
if (array_key_exists($woo_key, $plugins)) {
$install_woocommerce_url = wp_nonce_url(self_admin_url('plugins.php?action=activate&plugin=' . $woo_key), 'activate-plugin_' . $woo_key);
} else {
$install_woocommerce_url = wp_nonce_url(self_admin_url('update.php?action=install-plugin&plugin=woocommerce'), 'install-plugin_woocommerce');
}
}
$prepared_dimensions = array();
if (class_exists('MonsterInsights_Admin_Custom_Dimensions')) {
$dimensions = new MonsterInsights_Admin_Custom_Dimensions();
$dimensions = $dimensions->custom_dimensions();
$prepared_dimensions = array();
foreach ($dimensions as $dimension_type => $dimension) {
$dimension['type'] = $dimension_type;
$prepared_dimensions[] = $dimension;
}
}
$is_authed = (MonsterInsights()->auth->is_authed() || MonsterInsights()->auth->is_network_authed());
wp_localize_script(
'monsterinsights-vue-script',
'monsterinsights',
array(
'ajax' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('mi-admin-nonce'),
'network' => is_network_admin(),
'translations' => wp_get_jed_locale_data(monsterinsights_is_pro_version() ? 'ga-premium' : 'google-analytics-for-wordpress'),
'assets' => plugins_url($version_path . '/assets/vue', MONSTERINSIGHTS_PLUGIN_FILE),
'roles' => monsterinsights_get_roles(),
'roles_manage_options' => monsterinsights_get_manage_options_roles(),
'shareasale_id' => monsterinsights_get_shareasale_id(),
'shareasale_url' => monsterinsights_get_shareasale_url(monsterinsights_get_shareasale_id(), ''),
'addons_url' => is_multisite() ? network_admin_url('admin.php?page=monsterinsights_network#/addons') : admin_url('admin.php?page=monsterinsights_settings#/addons'),
'seo_settings_page_url' => is_multisite() ? network_admin_url('admin.php?page=monsterinsights_network#/seo') : admin_url('admin.php?page=monsterinsights_settings#/seo'),
'aioseo_dashboard_url' => is_multisite() ? network_admin_url('admin.php?page=aioseo') : admin_url('admin.php?page=aioseo'),
'wp_plugins_page_url' => is_multisite() ? network_admin_url('plugins.php') : admin_url('plugins.php'),
'email_summary_url' => admin_url('admin.php?monsterinsights_email_preview&monsterinsights_email_template=summary'),
'install_amp_url' => $install_amp_url,
'install_woo_url' => $install_woocommerce_url,
'dimensions' => $prepared_dimensions,
'wizard_url' => is_network_admin() ? network_admin_url('index.php?page=monsterinsights-onboarding') : admin_url('index.php?page=monsterinsights-onboarding'),
'install_plugins' => monsterinsights_can_install_plugins(),
'unfiltered_html' => current_user_can('unfiltered_html'),
'activate_nonce' => wp_create_nonce('monsterinsights-activate'),
'deactivate_nonce' => wp_create_nonce('monsterinsights-deactivate'),
'install_nonce' => wp_create_nonce('monsterinsights-install'),
// Used to add notices for future deprecations.
'versions' => monsterinsights_get_php_wp_version_warning_data(),
'plugin_version' => MONSTERINSIGHTS_VERSION,
'is_admin' => true,
'admin_email' => get_option('admin_email'),
'site_url' => get_site_url(),
'reports_url' => add_query_arg('page', 'monsterinsights_reports', admin_url('admin.php')),
'ecommerce_report_url' => add_query_arg('page', 'monsterinsights_reports#/ecommerce', admin_url('admin.php')),
'ecommerce_settings_tab_url' => add_query_arg('page', 'monsterinsights_settings#/ecommerce', admin_url('admin.php')),
'first_run_notice' => apply_filters('monsterinsights_settings_first_time_notice_hide', monsterinsights_get_option('monsterinsights_first_run_notice')),
'getting_started_url' => is_network_admin() ? network_admin_url('admin.php?page=monsterinsights_network#/about') : admin_url('admin.php?page=monsterinsights_settings#/about/getting-started'),
'authed' => $is_authed,
'new_pretty_link_url' => admin_url('post-new.php?post_type=pretty-link'),
'wpmailsmtp_admin_url' => admin_url('admin.php?page=wp-mail-smtp'),
'load_headline_analyzer_settings' => monsterinsights_load_gutenberg_app() ? 'true' : 'false',
'exit_url' => add_query_arg('page', 'monsterinsights_settings', admin_url('admin.php')),
'timezone' => date('e'),
'funnelkit_stripe_woo_page_url' => admin_url( 'admin.php?page=wc-settings&tab=fkwcs_api_settings' ),
'funnelkit_stripe_woo_nonce' => wp_create_nonce('monsterinsights-funnelkit-stripe-woo-nonce'),
)
);
// Don't load other scripts on the settings page.
return;
}
if (monsterinsights_is_reports_page()) {
$app_js_url = self::get_js_url( 'src/modules/reports/reports.js' );
wp_register_script('monsterinsights-vue-reports', $app_js_url, array(), monsterinsights_get_asset_version(), true);
wp_enqueue_script('monsterinsights-vue-reports');
// We do not have a current auth.
$auth = MonsterInsights()->auth;
$site_auth = $auth->get_viewname();
$ms_auth = is_multisite() && $auth->get_network_viewname();
wp_localize_script(
'monsterinsights-vue-reports',
'monsterinsights',
array(
'ajax' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('mi-admin-nonce'),
'network' => is_network_admin(),
'translations' => wp_get_jed_locale_data(monsterinsights_is_pro_version() ? 'ga-premium' : 'google-analytics-for-wordpress'),
'assets' => plugins_url($version_path . '/assets/vue', MONSTERINSIGHTS_PLUGIN_FILE),
'pro_assets' => plugins_url($version_path . '/assets', MONSTERINSIGHTS_PLUGIN_FILE),
'shareasale_id' => monsterinsights_get_shareasale_id(),
'shareasale_url' => monsterinsights_get_shareasale_url(monsterinsights_get_shareasale_id(), ''),
'addons_url' => is_multisite() ? network_admin_url('admin.php?page=monsterinsights_network#/addons') : admin_url('admin.php?page=monsterinsights_settings#/addons'),
'timezone' => date('e'), // phpcs:ignore
'authed' => $site_auth || $ms_auth,
'settings_url' => add_query_arg('page', 'monsterinsights_settings', admin_url('admin.php')),
// Used to add notices for future deprecations.
'versions' => monsterinsights_get_php_wp_version_warning_data(),
'plugin_version' => MONSTERINSIGHTS_VERSION,
'is_admin' => true,
'admin_email' => get_option('admin_email'),
'site_url' => get_site_url(),
'wizard_url' => is_network_admin() ? network_admin_url('index.php?page=monsterinsights-onboarding') : admin_url('index.php?page=monsterinsights-onboarding'),
'install_nonce' => wp_create_nonce('monsterinsights-install'),
'activate_nonce' => wp_create_nonce('monsterinsights-activate'),
'deactivate_nonce' => wp_create_nonce('monsterinsights-deactivate'),
'update_settings' => current_user_can('monsterinsights_save_settings'),
'migrated' => monsterinsights_get_option('gadwp_migrated', 0),
'yearinreview' => monsterinsights_yearinreview_dates(),
'reports_url' => add_query_arg('page', 'monsterinsights_reports', admin_url('admin.php')),
)
);
return;
}
// ublock notice
add_action('admin_print_footer_scripts', array( $this, 'monsterinsights_settings_ublock_error_js' ), 9999999);
}
/**
* Need to identify why this function is using.
*/
public function monsterinsights_settings_ublock_error_js() {
echo "<script type='text/javascript'>\n";
echo "jQuery( document ).ready( function( $ ) {
if ( window.uorigindetected == null){
$('#monsterinsights-ublock-origin-error').show();
$('.monsterinsights-nav-tabs').hide();
$('.monsterinsights-nav-container').hide();
$('#monsterinsights-addon-heading').hide();
$('#monsterinsights-addons').hide();
$('#monsterinsights-reports').hide();
}
});";
echo "\n</script>";
}
/**
* Load CSS from manifest.json
*/
public static function enqueue_script_specific_css( $js_file_path ) {
if ( defined( 'MONSTERINSIGHTS_LOCAL_JS_URL' ) ) {
return;
}
$version_path = monsterinsights_is_pro_version() ? 'pro' : 'lite';
$plugin_path = plugin_dir_path( MONSTERINSIGHTS_PLUGIN_FILE );
if ( ! isset( self::$manifest_data[ $js_file_path ] ) ) {
return;
}
$js_imports = self::$manifest_data[ $js_file_path ]['imports'];
$css_file_path = $plugin_path . $version_path . '/assets/vue/';
// Add JS own CSS file.
if ( isset( self::$manifest_data[ $js_file_path ]['css'] ) ) {
self::add_js_own_css_files( self::$manifest_data[ $js_file_path ]['css'], $version_path );
}
// Loop through all imported js file of entry file.
foreach( $js_imports as $js_filename ) {
// Check imported file available in manifest.json
if ( ! isset( self::$manifest_data[ $js_filename ] ) ) {
continue;
}
// Check imported js file has it's own css.
if ( ! isset( self::$manifest_data[ $js_filename ]['css'] ) ) {
continue;
}
$js_file_css = self::$manifest_data[ $js_filename ]['css'];
// css must be array.
if ( ! is_array( $js_file_css ) ) {
continue;
}
// Loop to css files of a imported js file.
foreach ( $js_file_css as $css_hash_name ) {
if ( file_exists( $css_file_path . $css_hash_name ) ) {
wp_enqueue_style(
'monsterinsights-style-' . basename( $css_hash_name ),
plugins_url( $version_path . '/assets/vue/' . $css_hash_name, MONSTERINSIGHTS_PLUGIN_FILE ),
array(),
monsterinsights_get_asset_version()
);
}
}
}
}
/**
* Add JS it's own CSS build file.
*/
private static function add_js_own_css_files( $css_files, $version_path ) {
foreach ( $css_files as $css_filename ) {
wp_enqueue_style(
'monsterinsights-style-' . basename( $css_filename ),
plugins_url( $version_path . '/assets/vue/' . $css_filename, MONSTERINSIGHTS_PLUGIN_FILE ),
array(),
monsterinsights_get_asset_version()
);
}
}
/**
* Get JS build file URL of a entry file.
*
* @return string
*/
public static function get_js_url( $path ) {
if ( ! $path ) {
return;
}
if ( defined( 'MONSTERINSIGHTS_LOCAL_JS_URL' ) && MONSTERINSIGHTS_LOCAL_JS_URL ) {
return MONSTERINSIGHTS_LOCAL_JS_URL . $path;
}
// If the file is not available on manifest.
if ( ! isset( self::$manifest_data[ $path ] ) ) {
return;
}
$js_file = self::$manifest_data[ $path ]['file'];
$version_path = monsterinsights_is_pro_version() ? 'pro' : 'lite';
return plugins_url( $version_path . '/assets/vue/' . $js_file, MONSTERINSIGHTS_PLUGIN_FILE );
}
/**
* Fetch manifest.json data and store it to array for future use.
*
* @return void
*/
private function get_manifest_data() {
$version_path = monsterinsights_is_pro_version() ? 'pro' : 'lite';
$plugin_path = plugin_dir_path( MONSTERINSIGHTS_PLUGIN_FILE );
$manifest_path = $plugin_path . $version_path . '/assets/vue/manifest.json';
// Return if manifest.json not exists.
if ( ! file_exists( $manifest_path ) ) {
return;
}
self::$manifest_data = json_decode( file_get_contents( $manifest_path ), true );
}
}
new MonsterInsights_Admin_Assets();