includes_not_hooked(); add_action( 'init', array( $this, 'includes' ) ); add_action( 'plugins_loaded', array( $this, 'includes_after_plugins_loaded' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_styles_scripts' ) ); add_action( 'plugin_action_links_' . MERCHANT_BASE, array( $this, 'action_links' ) ); add_filter( 'admin_body_class', array( $this, 'add_admin_body_class' ), 999 ); } /** * Include files after plugins loaded. * * Before init hook. */ public function includes_after_plugins_loaded() { require_once MERCHANT_DIR . 'admin/classes/class-merchant-admin-statistics-tracking.php'; } /** * No hooked includes. * These files are included without any WordPress hook. */ public function includes_not_hooked() { require_once MERCHANT_DIR . 'inc/classes/class-merchant-svg-icons.php'; require_once MERCHANT_DIR . 'admin/classes/class-merchant-admin-modules.php'; } /** * Include admin classes. */ public function includes() { // Notices. require_once MERCHANT_DIR . 'admin/notices/class-merchant-notice.php'; require_once MERCHANT_DIR . 'admin/notices/class-merchant-notice-review.php'; require_once MERCHANT_DIR . 'admin/notices/class-merchant-notice-upsell.php'; require_once MERCHANT_DIR . 'admin/notices/class-merchant-notice-campaign.php'; require_once MERCHANT_DIR . 'admin/notices/class-merchant-patcher-eol-notice.php'; // Admin classes. require_once MERCHANT_DIR . 'admin/classes/class-merchant-admin-menu.php'; // Field architecture. require_once MERCHANT_DIR . 'admin/classes/admin-options/interface-merchant-field.php'; require_once MERCHANT_DIR . 'admin/classes/admin-options/class-merchant-abstract-field.php'; require_once MERCHANT_DIR . 'admin/classes/admin-options/class-merchant-field-registry.php'; // Extracted SRP classes. require_once MERCHANT_DIR . 'admin/classes/admin-options/class-merchant-admin-assets.php'; require_once MERCHANT_DIR . 'admin/classes/admin-options/class-merchant-select2-choices.php'; require_once MERCHANT_DIR . 'admin/classes/admin-options/class-merchant-settings-saver.php'; require_once MERCHANT_DIR . 'admin/classes/admin-options/class-merchant-settings-renderer.php'; require_once MERCHANT_DIR . 'admin/classes/class-merchant-admin-options.php'; require_once MERCHANT_DIR . 'admin/classes/class-merchant-admin-ajax.php'; require_once MERCHANT_DIR . 'admin/classes/class-merchant-admin-utils.php'; require_once MERCHANT_DIR . 'admin/classes/class-merchant-admin-preview.php'; // Plugin installer. require_once MERCHANT_DIR . 'admin/classes/class-merchant-plugin-installer.php'; // White Label settings section. require_once MERCHANT_DIR . 'admin/classes/class-merchant-white-label-settings.php'; } /** * Enqueue admin styles and scripts. */ public function enqueue_styles_scripts() { $section = sanitize_text_field( wp_unslash( $_GET['section'] ?? '' ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended wp_register_script( 'merchant-select2', MERCHANT_URI . 'assets/vendor/select2/select2.full.min.js', array( 'jquery' ), '4.0.13', true ); wp_register_style( 'merchant-select2', MERCHANT_URI . 'assets/vendor/select2/select2.min.css', array(), '4.0.13' ); // Registering stays unconditional so other screens can enqueue the handles; the // enqueues below are for Merchant's own screens only. if ( $this->is_merchant_screen() ) { // For settings page only if ( $section === 'settings' ) { wp_enqueue_code_editor( array( 'type' => 'text/css' ) ); // No need to enqueue again for JS. It'll be handled by JS. wp_enqueue_script( 'merchant-settings', MERCHANT_URI . 'assets/js/admin/settings.min.js', array( 'jquery', 'code-editor' ), MERCHANT_VERSION, true ); } wp_enqueue_media(); wp_enqueue_style( 'merchant-admin', MERCHANT_URI . 'assets/css/admin/admin.min.css', array(), MERCHANT_VERSION ); if ( is_rtl() ) { wp_enqueue_style( 'merchant-admin-rtl', MERCHANT_URI . 'assets/css/admin/admin-rtl.min.css', array(), MERCHANT_VERSION ); } wp_enqueue_script( 'merchant-jquery-form', MERCHANT_URI . 'assets/vendor/jquery-form/jquery.form.min.js', array( 'jquery' ), '4.3.0', true ); wp_enqueue_script( 'merchant-pickr', MERCHANT_URI . 'assets/vendor/pickr/pickr.min.js', array( 'jquery' ), '1.8.2', true ); wp_enqueue_script( 'merchant-admin', MERCHANT_URI . 'assets/js/admin/admin.min.js', array( 'jquery', 'jquery-ui-sortable', 'jquery-ui-core', 'jquery-ui-accordion', 'wp-util' ), MERCHANT_VERSION, true ); $localized_data = array( 'nonce' => wp_create_nonce( 'merchant' ), 'ajax_url' => admin_url( 'admin-ajax.php' ), 'ai_prompt_copy_hint' => esc_html__( 'Click to copy', 'merchant' ), 'ai_prompt_copied_label' => esc_html__( 'Copied!', 'merchant' ), ); /** * Hook 'merchant_admin_localize_script' * * @since 1.9.6 */ $localized_data = apply_filters( 'merchant_admin_localize_script', $localized_data ); wp_localize_script( 'merchant-admin', 'merchant', $localized_data ); $module = ( ! empty( $_GET['module'] ) ) ? sanitize_text_field( wp_unslash( $_GET['module'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended if ( ! empty( $module ) ) { wp_enqueue_script( 'merchant-admin-preview', MERCHANT_URI . 'assets/js/admin/merchant-preview.min.js', array( 'jquery' ), MERCHANT_VERSION, true ); } } } /** * Add plugin settings link on the plugin page. */ public function action_links( $links ) { $page_url = add_query_arg( array( 'page' => 'merchant' ), admin_url( 'themes.php' ) ); $action_links = array( 'settings' => '' . esc_html__( 'Settings', 'merchant' ) . '', ); return array_merge( $action_links, $links ); } /** * Add admin body class. */ public function add_admin_body_class( $classes ) { if ( ! $this->is_merchant_screen() ) { return $classes; } $module = ( ! empty( $_GET['module'] ) ) ? sanitize_text_field( wp_unslash( $_GET['module'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended $section = ( ! empty( $_GET['section'] ) ) ? sanitize_text_field( wp_unslash( $_GET['section'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended if ( ! empty( $module ) ) { return $classes . ' merchant-admin-page-module'; } $section = $section ? 'merchant-admin-page__' . $section : 'merchant-admin-page__dashboard'; return $classes . ' merchant-admin-page ' . $section; } /** * Whether the screen being rendered is one of Merchant's own. * * Exact match, not a substring one: every Merchant screen arrives as * `page=merchant`, and a substring match leaked the admin bundle onto foreign * screens such as `page=merchant-delivery-calendar`, where it hid admin notices. * * @return bool */ private function is_merchant_screen() { // phpcs:ignore WordPress.Security.NonceVerification.Recommended $page = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; return 'merchant' === $page; } } Merchant_Admin_Loader::instance(); }