ヤミRoot VoidGate
User / IP
:
216.73.216.137
Host / Server
:
173.201.252.198 / gabrieltopman.com
System
:
Linux p3plzcpnl482572.prod.phx3.secureserver.net 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
Command
|
Upload
|
Mass Deface
|
Create
:
/
home
/
l1ltxx5gqn9k
/
public_html
/
wp-content
/
themes
/
neve
/
inc
/
admin
/
dashboard
/
Viewing: main.php
<?php /** * Main class of the Neve Dashboard * * @package neve */ namespace Neve\Admin\Dashboard; use Neve\Core\Settings\Config; use Neve\Core\Theme_Info; use Neve\Core\Tracker; /** * Class Main * * @package Neve\Admin\Dashboard */ class Main { use Theme_Info; /** * Changelog Handler. * * @var Changelog_Handler */ private $cl_handler; /** * Plugin Helper instance. * * @var Plugin_Helper */ private $plugin_helper; /** * Current theme args. * * @var array */ private $theme_args = []; /** * Main constructor. */ public function __construct() { $this->plugin_helper = new Plugin_Helper(); $this->cl_handler = new Changelog_Handler(); } /** * Run WordPress attached to actions. */ public function init() { add_action( 'init', [ $this, 'setup_config' ] ); add_action( 'admin_menu', [ $this, 'register' ] ); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue' ] ); add_action( 'init', array( $this, 'register_settings' ) ); add_action( 'init', array( $this, 'register_about_page' ), 1 ); add_action( 'admin_notices', array( $this, 'render_custom_layout_header' ) ); } /** * Add the about page with respect to the white label settings. * * @return void */ public function register_about_page() { $theme = wp_get_theme(); $filtered_name = apply_filters( 'ti_wl_theme_name', $theme->__get( 'Name' ) ); $slug = $theme->__get( 'stylesheet' ); if ( empty( $slug ) || empty( $filtered_name ) ) { return; } // We check if the name is different from the filtered name, // if it is, the whitelabel is in use and we should not add the about page. // this check allows for child themes to use the about page. if ( $filtered_name !== $theme->__get( 'Name' ) ) { return; } add_filter( 'neve_about_us_metadata', function () use ( $filtered_name ) { return [ // Top-level page in the dashboard sidebar 'location' => 'neve-welcome', // Logo to display on the page 'logo' => get_template_directory_uri() . '/assets/img/dashboard/logo.svg', // Condition to show or hide the upgrade menu in the sidebar 'has_upgrade_menu' => ! defined( 'NEVE_PRO_VERSION' ), // Add predefined product pages to the about page. 'product_pages' => [ 'otter-page' ], // Upgrade menu item link & text 'upgrade_link' => tsdk_translate_link( tsdk_utmify( esc_url( 'https://themeisle.com/themes/neve/upgrade/' ), 'aboutfilter', 'nevedashboard' ), 'query' ), 'upgrade_text' => __( 'Upgrade', 'neve' ) . ' ' . $filtered_name, ]; } ); add_filter( 'themeisle_sdk_blackfriday_data', array( $this, 'add_black_friday_data' ) ); } /** * Register Logger Setting */ public function register_settings() { register_setting( 'neve_settings', 'neve_logger_flag', [ 'type' => 'string', 'show_in_rest' => true, 'default' => '', ] ); register_setting( 'neve_settings', Config::OPTION_LOCAL_GOOGLE_FONTS_HOSTING, [ 'type' => 'boolean', 'show_in_rest' => true, 'default' => false, ] ); } /** * Setup the class props based on current theme. */ public function setup_config() { $theme = wp_get_theme(); $this->theme_args['name'] = apply_filters( 'ti_wl_theme_name', $theme->__get( 'Name' ) ); $this->theme_args['template'] = $theme->get( 'Template' ); $this->theme_args['version'] = $theme->__get( 'Version' ); $this->theme_args['description'] = apply_filters( 'ti_wl_theme_description', $theme->__get( 'Description' ) ); $this->theme_args['slug'] = $theme->__get( 'stylesheet' ); } /** * Register theme options page. * * @return void */ public function register() { $theme = $this->theme_args; if ( empty( $theme['name'] ) || empty( $theme['slug'] ) ) { return; } $theme_page = ! empty( $theme['template'] ) ? $theme['template'] . '-welcome' : $theme['slug'] . '-welcome'; $icon = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI3LjQuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCAzMiAzMiIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMzIgMzI7IiB4bWw6c3BhY2U9InByZXNlcnZlIj4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCS5zdDB7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7ZmlsbDojRkZGRkZGO30KPC9zdHlsZT4KPHBhdGggY2xhc3M9InN0MCIgZD0iTTAsMS42QzAsMC43LDAuNywwLDEuNiwwaDI4LjhDMzEuMywwLDMyLDAuNywzMiwxLjZWMzBjMCwwLjktMC43LDEuNi0xLjYsMS42SDEuNkMwLjcsMzEuNSwwLDMwLjgsMCwzMFYxLjZ6CgkgTTEzLDE1Ljh2Ny41SDkuMVY4YzAtMC4xLDAtMC4xLDAuMS0wLjJjMCwwLDAuMSwwLDAuMiwwLjFsOS42LDcuOFY4LjJoMy44djE1LjJjMCwwLjEsMCwwLjEtMC4xLDAuMmMwLDAtMC4xLDAtMC4yLTAuMUwxMywxNS44egoJIE0yMi44LDI1LjdIOS4xVjI3aDEzLjdWMjUuN3oiLz4KPC9zdmc+Cg=='; if ( $theme['name'] !== 'Neve' ) { $icon = 'dashicons-admin-appearance'; } $neve_icon = apply_filters( 'neve_menu_icon', $icon ); $priority = apply_filters( 'neve_menu_priority', 59 ); // The position of the menu item, 60 is the position of the Appearance menu. $capability = 'manage_options'; // Place a theme page in the Appearance menu, for older versions of Neve Pro or TPC. to maintain backwards compatibility. if ( ( defined( 'NEVE_PRO_VERSION' ) && version_compare( NEVE_PRO_VERSION, '2.6.1', '<=' ) ) || ( defined( 'TIOB_VERSION' ) && version_compare( TIOB_VERSION, '1.1.38', '<=' ) ) ) { add_theme_page( /* translators: %s - Theme name */ sprintf( __( '%s Options', 'neve' ), wp_kses_post( $theme['name'] ) ), /* translators: %s - Theme name */ sprintf( __( '%s Options', 'neve' ), wp_kses_post( $theme['name'] ) ), $capability, 'admin.php?page=neve-welcome' ); } add_menu_page( // phpcs:ignore WPThemeReview.PluginTerritory.NoAddAdminPages.add_menu_pages_add_menu_page wp_kses_post( $theme['name'] ), wp_kses_post( $theme['name'] ), $capability, $theme_page, [ $this, 'render' ], $neve_icon, // The URL to the icon to be used for this menu $priority ); // Add Dashboard submenu. Same slug as parent to allow renaming the automatic submenu that is added. add_submenu_page( // phpcs:ignore WPThemeReview.PluginTerritory.NoAddAdminPages.add_menu_pages_add_submenu_page $theme_page, __( 'Dashboard', 'neve' ), __( 'Dashboard', 'neve' ), $capability, $theme_page, [ $this, 'render' ] ); do_action( 'neve_register_submenu_page', $theme_page, $capability ); $this->copy_customizer_page( $theme_page ); } /** * Copy the customizer page to the dashboard. * * @param string $theme_page The theme page slug. * * @return void */ private function copy_customizer_page( $theme_page ) { global $submenu; if ( ! isset( $submenu['themes.php'] ) ) { return; } $themes_menu = $submenu['themes.php']; if ( empty( $themes_menu ) ) { return; } $customize_pos = array_search( 'customize', array_column( $themes_menu, 1 ) ); if ( false === $customize_pos ) { return; } $themes_page_keys = array_keys( $themes_menu ); if ( ! isset( $themes_page_keys[ $customize_pos ] ) ) { return; } $customizer_menu_item = array_splice( $themes_menu, $customize_pos, 1 ); $customizer_menu_item = reset( $customizer_menu_item ); if ( empty( $customizer_menu_item ) ) { return; } add_submenu_page( // phpcs:ignore WPThemeReview.PluginTerritory.NoAddAdminPages.add_menu_pages_add_submenu_page $theme_page, $customizer_menu_item[0], $customizer_menu_item[0], 'manage_options', 'customize.php' ); } /** * Render the application stub. * * @return void */ public function render() { echo '<div id="neve-dashboard"></div>'; } /** * Load css and scripts for the about page */ public function enqueue() { $screen = get_current_screen(); if ( ! isset( $screen->id ) ) { return; } $theme = $this->theme_args; $theme_page = ! empty( $theme['template'] ) ? $theme['template'] . '-welcome' : $theme['slug'] . '-welcome'; if ( $screen->id !== 'toplevel_page_' . $theme_page ) { return; } $build_path = get_template_directory_uri() . '/assets/apps/dashboard/build/'; $dependencies = ( include get_template_directory() . '/assets/apps/dashboard/build/dashboard.asset.php' ); $dash_data = apply_filters( 'neve_dashboard_page_data', $this->get_localization() ); $this->register_survey( $dash_data ); wp_register_style( 'neve-dash-style', $build_path . 'style-dashboard.css', [ 'wp-components', 'neve-components' ], $dependencies['version'] ); wp_style_add_data( 'neve-dash-style', 'rtl', 'replace' ); wp_enqueue_style( 'neve-dash-style' ); wp_register_script( 'neve-dash-script', $build_path . 'dashboard.js', array_merge( $dependencies['dependencies'], [ 'updates' ] ), $dependencies['version'], true ); wp_localize_script( 'neve-dash-script', 'neveDash', $dash_data ); wp_enqueue_script( 'neve-dash-script' ); if ( function_exists( 'wp_set_script_translations' ) ) { wp_set_script_translations( 'neve-dash-script', 'neve' ); } do_action( 'themeisle_internal_page', 'neve', 'dashboard' ); } /** * Get localization data for the dashboard script. * * @return array */ private function get_localization() { $old_about_config = apply_filters( 'ti_about_config_filter', [ 'useful_plugins' => true ] ); $theme_name = apply_filters( 'ti_wl_theme_name', $this->theme_args['name'] ); $plugin_name = apply_filters( 'ti_wl_plugin_name', 'Neve Pro' ); $plugin_name_addon = apply_filters( 'ti_wl_plugin_name', 'Neve Pro Addon' ); $data = [ 'nonce' => wp_create_nonce( 'wp_rest' ), 'version' => 'v' . NEVE_VERSION, 'assets' => get_template_directory_uri() . '/assets/img/dashboard/', 'hasOldPro' => (bool) ( defined( 'NEVE_PRO_VERSION' ) && version_compare( NEVE_PRO_VERSION, '1.1.11', '<' ) ), 'isRTL' => is_rtl(), 'isValidLicense' => $this->has_valid_addons(), 'notifications' => $this->get_notifications(), 'customizerShortcuts' => $this->get_customizer_shortcuts(), 'plugins' => $this->get_recommended_plugins(), 'modules' => $this->get_modules(), 'featureData' => $this->get_free_pro_features(), 'showFeedbackNotice' => $this->should_show_feedback_notice(), 'allfeaturesNeveProURL' => tsdk_translate_link( tsdk_utmify( 'https://themeisle.com/themes/neve/upgrade/', 'seeallfeatures', 'freevspropage' ), 'query' ), 'startSitesgetNeveProURL' => tsdk_translate_link( tsdk_utmify( 'https://themeisle.com/themes/neve/upgrade/', 'welcomestartersitescard', 'nevedashboard' ), 'query' ), 'customLayoutsNeveProURL' => tsdk_translate_link( tsdk_utmify( 'https://themeisle.com/themes/neve/upgrade/', 'customlayoutscard', 'nevedashboard' ), 'query' ), 'upgradeURL' => apply_filters( 'neve_upgrade_link_from_child_theme_filter', tsdk_translate_link( tsdk_utmify( 'https://themeisle.com/themes/neve/upgrade/', 'getpronow', 'freevspropage' ) ) ), 'upgradeURLModules' => apply_filters( 'neve_upgrade_link_from_child_theme_filter', tsdk_translate_link( tsdk_utmify( 'https://themeisle.com/themes/neve/upgrade/', 'getpronow', 'welcomepage' ) ) ), 'upgradeWhiteLabelURL' => apply_filters( 'neve_upgrade_link_from_child_theme_filter', tsdk_translate_link( tsdk_utmify( 'https://themeisle.com/themes/neve/upgrade/', 'whitelabel', 'settingspage' ) ) ), 'supportURL' => esc_url( 'https://wordpress.org/support/theme/neve/' ), 'docsURL' => esc_url( 'https://docs.themeisle.com/article/946-neve-doc' ), 'codexURL' => esc_url( 'https://codex.nevewp.com/' ), 'strings' => [ 'proTabTitle' => wp_kses_post( $plugin_name ), /* translators: %s - Theme name */ 'header' => wp_kses_post( $theme_name ), /* translators: %s - Theme name */ 'starterSitesCardDescription' => sprintf( __( '%s now comes with a sites library with various designs to pick from. Visit our collection of demos that are constantly being added.', 'neve' ), wp_kses_post( $theme_name ) ), 'starterSitesCardUpsellMessage' => esc_html__( 'Upgrade to the Pro version and get instant access to all Premium Starter Sites — including Expert Sites — and much more.', 'neve' ), /* translators: %s - Theme name */ 'starterSitesTabDescription' => sprintf( __( 'With %s, you can choose from multiple unique demos, specially designed for you, that can be installed with a single click. You just need to choose your favorite, and we will take care of everything else.', 'neve' ), wp_kses_post( $theme_name ) ), /* translators: 1 - Theme name, 2 - Cloud Templates & Patterns Collection */ 'starterSitesUnavailableActive' => sprintf( __( 'In order to be able to import any starter sites for %1$s you would need to have the %2$s plugin active.', 'neve' ), wp_kses_post( $theme_name ), '<strong>Starter Sites & Templates by Neve</strong>' ), /* translators: %s - Theme name */ 'starterSitesUnavailableUpdate' => sprintf( __( 'In order to be able to import any starter sites for %1$s you would need to have the %2$s plugin updated to the latest version.', 'neve' ), wp_kses_post( $theme_name ), '<strong>Starter Sites & Templates by Neve</strong>' ), /* translators: %s - Theme name */ 'supportCardDescription' => sprintf( __( 'We want to make sure you have the best experience using %1$s, and that is why we have gathered all the necessary information here for you. We hope you will enjoy using %1$s as much as we enjoy creating great products.', 'neve' ), wp_kses_post( $theme_name ) ), /* translators: %s - Theme name */ 'docsCardDescription' => sprintf( __( 'Need more details? Please check our full documentation for detailed information on how to use %s.', 'neve' ), wp_kses_post( $theme_name ) ), /* translators: %s - "Neve Pro Addon" */ 'licenseCardHeading' => sprintf( __( '%s license', 'neve' ), wp_kses_post( $plugin_name_addon ) ), /* translators: %s - "Neve Pro Addon" */ 'updateOldPro' => sprintf( __( 'Please update %s to the latest version and then refresh this page to have access to the options.', 'neve' ), wp_kses_post( $plugin_name_addon ) ), /* translators: %1$s - Author link - Themeisle */ 'licenseCardDescription' => sprintf( // translators: store name (Themeisle) __( 'Enter your license from %1$s purchase history in order to get plugin updates', 'neve' ) . '.', '<a class="text-blue-600 hover:text-blue-700 hover:underline inline-flex gap-1 items-center" target="_blank" rel="external noreferrer noopener" href="' . tsdk_translate_link( 'https://store.themeisle.com/', 'query' ) . '">Themeisle<span class="sr-only">' . esc_html__( '(opens in a new tab)', 'neve' ) . '</span><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-external-link shrink-0"><path d="M15 3h6v6"></path><path d="M10 14 21 3"></path><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path></svg></a>' ), ], 'changelog' => $this->cl_handler->get_changelog( get_template_directory() . '/CHANGELOG.md' ), 'onboarding' => [], 'hasFileSystem' => WP_Filesystem(), 'hidePluginsTab' => apply_filters( 'neve_hide_useful_plugins', ! array_key_exists( 'useful_plugins', $old_about_config ) ), 'tpcPath' => defined( 'TIOB_PATH' ) ? TIOB_PATH . 'template-patterns-collection.php' : 'template-patterns-collection/template-patterns-collection.php', 'tpcAdminURL' => admin_url( 'admin.php?page=tiob-starter-sites' ), 'tpcOnboardingURL' => admin_url( 'admin.php?page=neve-onboarding' ), 'customizerURL' => admin_url( 'customize.php' ), 'pluginsURL' => esc_url( admin_url( 'plugins.php' ) ), 'getPluginStateBaseURL' => esc_url( rest_url( '/nv/v1/dashboard/plugin-state/' ) ), 'canInstallPlugins' => current_user_can( 'install_plugins' ), 'canActivatePlugins' => current_user_can( 'activate_plugins' ), 'rootUrl' => get_site_url(), 'sparksActive' => defined( 'SPARKS_WC_VERSION' ) ? 'yes' : 'no', 'api' => esc_url( rest_url( '/nv/v1/dashboard/' ) ), 'availableModules' => $this->get_available_modules(), 'orbitFox' => array( 'isInstalled' => file_exists( WP_PLUGIN_DIR . '/themeisle-companion/themeisle-companion.php' ), 'isActive' => class_exists( 'Orbit_Fox' ), 'activationUrl' => $this->plugin_helper->get_plugin_action_link( 'themeisle-companion' ), 'data' => class_exists( 'Orbit_Fox' ) ? get_option( 'obfx_data' ) : array(), ), ]; if ( defined( 'NEVE_PRO_PATH' ) ) { $installed_plugins = get_plugins(); $is_otter_installed = array_key_exists( 'otter-pro/otter-pro.php', $installed_plugins ); $is_sparks_installed = array_key_exists( 'sparks-for-woocommerce/sparks-for-woocommerce.php', $installed_plugins ); $data['changelogPro'] = $this->cl_handler->get_changelog( NEVE_PRO_PATH . '/CHANGELOG.md' ); $data['isOtterProInstalled'] = $is_otter_installed; $data['otterProInstall'] = $is_otter_installed ? esc_url( wp_nonce_url( admin_url( 'plugins.php?action=activate&plugin=otter-pro%2Fotter-pro.php&plugin_status=all&paged=1&s' ), 'activate-plugin_otter-pro/otter-pro.php' ) ) : esc_url( wp_nonce_url( admin_url( 'admin-post.php?action=install_otter_pro' ), 'install_otter_pro' ) ); $data['sparksInstallActivateEndpoint'] = $is_sparks_installed ? esc_url( wp_nonce_url( admin_url( 'plugins.php?action=activate&plugin=sparks-for-woocommerce%2Fsparks-for-woocommerce.php&plugin_status=all&paged=1&s' ), 'activate-plugin_sparks-for-woocommerce/sparks-for-woocommerce.php' ) ) : esc_url( wp_nonce_url( admin_url( 'admin-post.php?action=install_sparks' ), 'install_sparks' ) ); $data['moduleObserver'] = array( 'customLayouts' => array( 'labelSubMenu' => __( 'Custom Layouts', 'neve' ), 'linkSubMenu' => 'edit.php?post_type=neve_custom_layouts', ), ); } if ( isset( $_GET['onboarding'] ) && $_GET['onboarding'] === 'yes' ) { $data['isOnboarding'] = true; } $language = get_user_locale(); $available_languages = [ 'de_DE' => 'de', 'de_DE_formal' => 'de', ]; $lang_code = isset( $available_languages[ $language ] ) ? 'de' : 'en'; $data['lang'] = $lang_code; // Launch Progress checks $launch_progress_data = $this->get_launch_progress_checks(); $data['showLaunchProgress'] = $launch_progress_data['showLaunchProgress']; $data['launchProgress'] = [ 'autoDetected' => $launch_progress_data['autoDetected'], 'savedProgress' => $launch_progress_data['savedProgress'], ]; $screen = get_current_screen(); if ( ! isset( $screen->id ) ) { return $data; } $theme = $this->theme_args; $theme_page = ! empty( $theme['template'] ) ? $theme['template'] . '-welcome' : $theme['slug'] . '-welcome'; // Check if front page exists $page_on_front = get_option( 'page_on_front' ); $homepage_url = $page_on_front ? admin_url( 'post.php?post=' . $page_on_front . '&action=edit' ) : admin_url( 'edit.php?post_type=page' ); // Launch Progress step URLs $data['launchProgressUrls'] = [ 'upgradeURL' => apply_filters( 'neve_upgrade_link_from_child_theme_filter', tsdk_translate_link( tsdk_utmify( 'https://themeisle.com/themes/neve/upgrade/', 'getpronow', 'launchprogress' ) ) ), 'starterSites' => admin_url( 'admin.php?page=' . $theme_page . '#starter-sites' ), 'siteIdentity' => add_query_arg( [ 'autofocus[section]' => 'title_tagline' ], admin_url( 'customize.php' ) ), 'logo' => add_query_arg( [ 'autofocus[control]' => 'custom_logo' ], admin_url( 'customize.php' ) ), 'colors' => add_query_arg( [ 'autofocus[section]' => 'neve_colors_background_section' ], admin_url( 'customize.php' ) ), 'favicon' => add_query_arg( [ 'autofocus[control]' => 'site_icon' ], admin_url( 'customize.php' ) ), 'homepage' => $homepage_url, 'pages' => admin_url( 'edit.php?post_type=page' ), 'menus' => admin_url( 'nav-menus.php' ), 'footer' => add_query_arg( [ 'autofocus[panel]' => 'hfg_footer' ], admin_url( 'customize.php' ) ), 'permalinks' => admin_url( 'options-permalink.php' ), 'plugins' => admin_url( 'plugin-install.php?s=seo&tab=search' ), 'speedTest' => 'https://pagespeed.web.dev/analysis?url=' . urlencode( get_site_url() ), 'privacyPolicy' => admin_url( 'options-privacy.php' ), ]; return $data; } /** * Get the notifications for plugin and theme updates. * * @return array */ public function get_notifications() { $notifications = []; $slug = 'neve'; $themes_update = get_site_transient( 'update_themes' ); $plugin_folder = defined( 'NEVE_PRO_BASEFILE' ) ? basename( dirname( NEVE_PRO_BASEFILE ) ) : null; $plugin_path = $plugin_folder ? $plugin_folder . '/neve-pro-addon.php' : null; if ( isset( $themes_update->response[ $slug ] ) ) { $update = $themes_update->response[ $slug ]; $notifications['neve'] = [ // translators: s - theme name (Neve). 'text' => sprintf( __( 'New theme update for %1$s! Please update to %2$s.', 'neve' ), wp_kses_post( $this->theme_args['name'] ), wp_kses_post( $update['new_version'] ) ), 'update' => [ 'type' => 'theme', 'slug' => $slug, ], 'cta' => __( 'Update Now', 'neve' ), 'type' => ( $plugin_path && is_plugin_active( $plugin_path ) ) ? 'warning' : null, ]; } if ( $plugin_path ) { $plugins_update = get_site_transient( 'update_plugins' ); if ( is_plugin_active( $plugin_path ) && isset( $plugins_update->response[ $plugin_path ] ) ) { $update = $plugins_update->response[ $plugin_path ]; $notifications['neve-pro-addon'] = [ 'text' => sprintf( // translators: s - Pro plugin name (Neve Pro) __( 'New plugin update for %1$s! Please update to %2$s.', 'neve' ), wp_kses_post( apply_filters( 'ti_wl_plugin_name', 'Neve Pro' ) ), wp_kses_post( $update->new_version ) ), 'update' => [ 'type' => 'plugin', 'slug' => 'neve-pro-addon', 'path' => $plugin_path, ], 'cta' => __( 'Update Now', 'neve' ), 'type' => 'warning', ]; } } if ( $this->show_branding_notice() ) { $notifications['branding-discount'] = [ 'text' => sprintf( // translators: s - Discount Code __( 'From 3.3.0 we decided to remove the copyright component from the free version. You can continue using it if you rollback to 3.2.x or you can upgrade to pro, using a one time 50%% discount: %s', 'neve' ), wp_kses_post( '<code>NEVEBRANDING50</code>' ) ), 'url' => tsdk_translate_link( tsdk_utmify( 'https://themeisle.com/themes/neve/upgrade/', 'copyrightnotice', 'nevedashboard' ), 'query' ), 'targetBlank' => true, 'cta' => __( 'Upgrade', 'neve' ), ]; } if ( count( $notifications ) === 1 && is_plugin_active( $plugin_path ) ) { foreach ( $notifications as $key => $notification ) { /* translators: 1 - Theme Name (Neve), 2 - Plugin Name (Neve Pro) */ $notifications[ $key ]['text'] = sprintf( __( 'We recommend that both %1$s and %2$s are updated to the latest version to ensure optimal intercompatibility.', 'neve' ), wp_kses_post( $this->theme_args['name'] ), apply_filters( 'ti_wl_plugin_name', 'Neve Pro' ) ); } } $notifications = apply_filters( 'neve_dashboard_notifications', $notifications ); return $notifications; } /** * Should branding notice be shown. * * @return bool */ private function show_branding_notice() { if ( $this->has_valid_addons() ) { return false; } return time() < strtotime( '2022-07-06' ); } /** * Get the Customizer Shortcut Links. * * @return array */ private function get_customizer_shortcuts() { return [ [ 'text' => __( 'Upload Logo', 'neve' ), 'description' => __( 'Recommended size: 200x50px', 'neve' ), 'link' => add_query_arg( [ 'autofocus[control]' => 'custom_logo' ], admin_url( 'customize.php' ) ), ], [ 'text' => __( 'Set Colors', 'neve' ), 'description' => __( 'Brand colors & site palette', 'neve' ), 'link' => add_query_arg( [ 'autofocus[section]' => 'neve_colors_background_section' ], admin_url( 'customize.php' ) ), ], [ 'text' => __( 'Customize Fonts', 'neve' ), 'description' => __( 'Typography & text styles', 'neve' ), 'link' => add_query_arg( [ 'autofocus[control]' => 'neve_headings_font_family' ], admin_url( 'customize.php' ) ), ], [ 'text' => __( 'Layout Options', 'neve' ), 'description' => __( 'Content structure & spacing', 'neve' ), 'link' => add_query_arg( [ 'autofocus[panel]' => 'neve_layout' ], admin_url( 'customize.php' ) ), ], [ 'text' => __( 'Header Options', 'neve' ), 'description' => __( 'Navigation & branding setup', 'neve' ), 'link' => add_query_arg( [ 'autofocus[panel]' => 'hfg_header' ], admin_url( 'customize.php' ) ), ], [ 'text' => __( 'Blog Layouts', 'neve' ), 'description' => __( 'Post display & formatting', 'neve' ), 'link' => add_query_arg( [ 'autofocus[section]' => 'neve_blog_archive_layout' ], admin_url( 'customize.php' ) ), ], [ 'text' => __( 'Footer Options', 'neve' ), 'description' => __( 'PRO', 'neve' ) . ': ' . __( 'Custom footer layouts', 'neve' ), 'link' => add_query_arg( [ 'autofocus[panel]' => 'hfg_footer' ], admin_url( 'customize.php' ) ), ], [ 'text' => __( 'Content / Sidebar', 'neve' ), 'description' => __( 'Widget areas & layout', 'neve' ), 'link' => add_query_arg( [ 'autofocus[section]' => 'neve_sidebar' ], admin_url( 'customize.php' ) ), ], ]; } /** * Get launch progress checks. * * @return array{ * showLaunchProgress: bool, * autoDetected: array{ * hasLogo: bool, * hasFavicon: bool, * hasCustomPermalink: bool, * hasSeoPlugin: bool, * hasPrivacyPage: bool * }, * savedProgress: array<string, array<int, bool>> * } */ private function get_launch_progress_checks() { // Check if we should show the Launch Progress tab $show_launch_progress = get_option( \Neve\Core\Admin::$launch_progress_option ); if ( false === $show_launch_progress ) { $install_time = get_option( 'neve_install' ); if ( ! empty( $install_time ) ) { $one_week_ago = time() - WEEK_IN_SECONDS; $show_launch_progress = ( intval( $install_time ) > $one_week_ago ) ? 'yes' : 'no'; update_option( \Neve\Core\Admin::$launch_progress_option, $show_launch_progress, false ); } else { $show_launch_progress = 'no'; } } $has_logo = (bool) get_theme_mod( 'custom_logo' ); $has_favicon = (bool) get_site_icon_url(); $permalink_structure = get_option( 'permalink_structure' ); // Check if SEO plugin is active (Yoast, RankMath, or AIOSEO) $has_seo_plugin = ( class_exists( 'WPSEO_Options' ) || // Yoast SEO class_exists( 'RankMath' ) || // RankMath function_exists( 'aioseo' ) // All in One SEO ); // Check if privacy policy page exists $privacy_page_id = (int) get_option( 'wp_page_for_privacy_policy' ); $has_privacy_page = $privacy_page_id > 0 && get_post_status( $privacy_page_id ) === 'publish'; // Get saved progress from option $saved_progress = get_option( 'neve_launch_progress', [] ); return [ 'showLaunchProgress' => ( $show_launch_progress === 'yes' ), 'autoDetected' => [ 'hasLogo' => $has_logo, 'hasFavicon' => $has_favicon, 'hasCustomPermalink' => ! empty( $permalink_structure ), 'hasSeoPlugin' => $has_seo_plugin, 'hasPrivacyPage' => $has_privacy_page, ], 'savedProgress' => $saved_progress, ]; } /** * Get doc link. * * @param string $utm_term utm term to use for doc link. * @param string $url url to doc. * @return string */ private function get_doc_link( $utm_term, $url ) { return tsdk_utmify( $url, $utm_term, 'freevspropage' ); } /** * Get the pro features for the free v pro table. * * @return array */ private function get_free_pro_features() { return [ [ 'section' => __( 'Website Essentials', 'neve' ), 'items' => [ [ 'title' => __( 'Advanced Header Features', 'neve' ), 'description' => __( 'Full header settings control with sticky/transparent header, page-specific settings & mobile layouts.', 'neve' ), ], [ 'title' => __( 'Design Components', 'neve' ), 'description' => __( 'Social icons, payment icons, divider, footer copyright editor and 15+ header components.', 'neve' ), ], [ 'title' => __( 'Custom Layouts', 'neve' ), 'description' => __( 'Add custom blocks or content using hooks for headers, footers, 404 pages, and more.', 'neve' ), ], ], ], [ 'section' => __( 'Page Builder Features', 'neve' ), 'items' => [ [ 'title' => __( 'Elementor Add-ons', 'neve' ), 'description' => __( 'Add engaging elements, protect content, and create dynamic layouts with our advanced toolkit.', 'neve' ), ], [ 'title' => 'Otter Blocks PRO', 'description' => __( 'Advanced Gutenberg blocks with animations & visibility controls.', 'neve' ), ], ], ], [ 'section' => __( 'Content & Blog Features', 'neve' ), 'items' => [ [ 'title' => __( 'Advanced Blog Features', 'neve' ), 'description' => __( 'Multiple layouts, reading time estimates, social sharing & related posts.', 'neve' ), ], [ 'title' => __( 'Starter Sites', 'neve' ), 'description' => __( 'Access a growing library of beautiful, ready-to-use templates for every niche and industry.', 'neve' ), ], [ 'title' => __( 'Content Restriction', 'neve' ), 'description' => __( 'Restrict content access by user, role, or password—ideal for membership sites.', 'neve' ), ], [ 'title' => __( 'Multilingual Support', 'neve' ), 'description' => __( 'Seamlessly integrate with WPML, Weglot, and Polylang for enhanced multilingual capabilities.', 'neve' ), ], ], ], [ 'section' => __( 'Store Features', 'neve' ), 'items' => [ [ 'title' => __( 'Product Experience', 'neve' ), 'description' => __( 'Quick view popup, features video & wishlist functionality.', 'neve' ), ], [ 'title' => __( 'Shopping Enhancement', 'neve' ), 'description' => __( 'Product comparison, advance product review & variation swatches.', 'neve' ), ], [ 'title' => __( 'Sales Features', 'neve' ), 'description' => __( 'Custom thank you pages & announcement bars.', 'neve' ), ], ], ], [ 'section' => __( 'Professional Features', 'neve' ), 'items' => [ [ 'title' => __( 'Priority Support', 'neve' ), 'description' => __( 'Get fast and reliable assistance directly from our expert team.', 'neve' ), ], [ 'title' => __( 'White Label', 'neve' ), 'description' => __( 'Remove Neve branding and rebrand it as your own for client websites.', 'neve' ), ], ], ], ]; } /** * Get modules. * * @return array[] */ private function get_modules() { $plugins = array( 'hfg_module' => array( 'nicename' => __( 'Header Booster', 'neve' ), 'description' => __( 'Create unique sticky & transparent headers that adapt to scroll. Perfect for modern, immersive websites.', 'neve' ), 'documentation' => array( 'url' => 'https://docs.themeisle.com/article/1057-header-booster-documentation?utm_source=wpadmin&utm_medium=welcomepage&utm_campaign=headerbooster&utm_content=neve', ), ), 'woocommerce_booster' => array( 'nicename' => __( 'WooCommerce Booster', 'neve' ), 'description' => __( 'Transform your store with quick-view popups, wishlist features, and optimized checkout flow. Boost sales instantly.', 'neve' ), 'byline' => __( 'Boost conversion rates up to 15%', 'neve' ), 'condition' => class_exists( 'WooCommerce' ), ), 'easy_digital_downloads' => array( 'nicename' => __( 'Easy Digital Downloads Booster', 'neve' ), 'description' => __( 'Enhance your Easy Digital Downloads store with additional customization settings.', 'neve' ), 'condition' => class_exists( 'Easy_Digital_Downloads' ), ), 'blog_pro' => array( 'nicename' => __( 'Blog Booster', 'neve' ), 'description' => __( 'Advanced layouts, reading time estimates, and social sharing to keep readers engaged longer.', 'neve' ), 'documentation' => array( 'url' => 'https://docs.themeisle.com/article/1059-blog-booster-documentation?utm_source=wpadmin&utm_medium=welcomepage&utm_campaign=blogbooster&utm_content=neve', ), ), 'post_type_enhancements' => array( 'nicename' => __( 'Post types enhancements', 'neve' ), 'description' => __( 'Extend Neve\'s powerful features to custom post types. Create unique layouts for portfolios, testimonials, and more.', 'neve' ), 'documentation' => array( 'url' => 'https://docs.themeisle.com/article/1505-neve-post-type-enhancements-module?utm_source=wpadmin&utm_medium=welcomepage&utm_campaign=postenhancements&utm_content=neve', ), ), 'performance_features' => array( 'nicename' => __( 'Performance', 'neve' ), 'description' => __( 'Optimize core vitals, enable lazy loading, and minify resources for lightning-fast load times.', 'neve' ), 'documentation' => array( 'url' => 'https://docs.themeisle.com/article/1366-performance-module-documentation?utm_source=wpadmin&utm_medium=welcomepage&utm_campaign=performancemodule&utm_content=neve', ), ), 'block_editor_booster' => array( 'nicename' => __( 'Block Editor Booster', 'neve' ), 'description' => __( 'Advanced Gutenberg blocks designed specifically for Neve. Build faster with pre-styled patterns.', 'neve' ), 'documentation' => array( 'url' => 'https://docs.themeisle.com/article/1473-neve-block-editor-booster-module?utm_source=wpadmin&utm_medium=welcomepage&utm_campaign=blockeditorbooster&utm_content=neve', ), ), 'white_label' => array( 'nicename' => __( 'White Label', 'neve' ), 'description' => __( 'Rebrand Neve as your own. Change theme name, author, and links to match your agency identity.', 'neve' ), 'documentation' => array( 'url' => 'https://docs.themeisle.com/article/1061-white-label-module-documentation?utm_source=wpadmin&utm_medium=welcomepage&utm_campaign=whitelabel&utm_content=neve', ), ), 'custom_layouts' => array( 'nicename' => __( 'Custom Layouts', 'neve' ), 'description' => __( 'Create conditional headers, footers, and content blocks. Perfect for custom landing pages and marketing campaigns.', 'neve' ), 'documentation' => array( 'url' => 'https://docs.themeisle.com/article/1062-custom-layouts-module?utm_source=wpadmin&utm_medium=welcomepage&utm_campaign=customlayouts&utm_content=neve', ), ), 'elementor_booster' => array( 'nicename' => __( 'Elementor Booster', 'neve' ), 'description' => __( 'Leverage the true flexibility of Elementor with powerful addons and templates that you can import with just one click.', 'neve' ), 'condition' => defined( 'ELEMENTOR_VERSION' ), ), 'lifterlms_booster' => array( 'nicename' => __( 'LifterLMS Booster', 'neve' ), 'description' => __( 'Enhanced course layouts, student dashboards, and learning features for your online education platform.', 'neve' ), 'condition' => class_exists( 'LifterLMS' ), ), 'typekit_fonts' => array( 'nicename' => __( 'Typekit Fonts', 'neve' ), 'description' => __( 'Access premium Adobe fonts directly in your theme. Add professional typography to any element.', 'neve' ), 'documentation' => array( 'url' => 'https://docs.themeisle.com/article/1085-typekit-fonts-documentation?utm_source=wpadmin&utm_medium=welcomepage&utm_campaign=typekitfonts&utm_content=neve', ), ), 'custom_sidebars' => array( 'nicename' => __( 'Custom Sidebars', 'neve' ), 'description' => __( 'Create unique sidebar layouts for different sections. Show relevant content based on user context.', 'neve' ), 'documentation' => array( 'url' => 'https://docs.themeisle.com/article/1770-custom-sidebars-module-documentation?utm_source=wpadmin&utm_medium=welcomepage&utm_campaign=customsidebars&utm_content=neve', ), ), 'access_restriction' => array( 'nicename' => __( 'Content restriction', 'neve' ), 'description' => __( 'Create members-only content areas. Control access by user roles, logged-in status, or custom rules.', 'neve' ), 'documentation' => array( 'url' => 'https://docs.themeisle.com/article/1863-content-restriction-module-documentation?utm_source=wpadmin&utm_medium=welcomepage&utm_campaign=contentrestriction&utm_content=neve', ), ), 'dashboard_customizer' => array( 'nicename' => __( 'WP Dashboard Customizer', 'neve' ), 'description' => __( 'Create or modify the WordPress dashboard. Customize the admin pages, admin menu, and admin bar.', 'neve' ), 'documentation' => array( 'url' => 'https://docs.themeisle.com/article/2408-wp-dashboard-customizer-module-documentation?utm_source=wpadmin&utm_medium=welcomepage&utm_campaign=dashboardcustomizer&utm_content=neve', ), ), ); return array_filter( $plugins, function ( $module ) { return ! isset( $module['condition'] ) || $module['condition'] === true; } ); } /** * Get the recommended plugins. * * @return array */ private function get_recommended_plugins() { $plugins = [ 'otter-blocks' => [ 'title' => 'Otter Blocks', 'description' => __( 'Advanced blocks for modern WordPress editing', 'neve' ), ], 'templates-patterns-collection' => [ 'title' => __( 'Starter Sites', 'neve' ), 'description' => __( 'Import ready-made websites with a single click', 'neve' ), ], 'wp-full-stripe-free' => [ 'title' => 'WP Full Pay', 'description' => __( 'Simple ecommerce solution with Stripe integration', 'neve' ), ], 'optimole-wp' => [ 'title' => 'Optimole', 'description' => __( 'Smart image optimization and CDN', 'neve' ), ], 'wp-cloudflare-page-cache' => [ 'title' => 'Super Page Cache', 'description' => __( 'Lightning-fast caching made simple', 'neve' ), 'hide' => defined( 'SPC_PRO_PATH' ), ], 'feedzy-rss-feeds' => [ 'title' => 'Feedzy', 'description' => __( 'RSS feeds aggregator and content curator', 'neve' ), ], ]; if ( is_php_version_compatible( '8.1' ) ) { $plugins['hyve-lite'] = [ 'title' => 'Hyve', 'description' => __( 'AI chatbot for your website', 'neve' ), ]; } foreach ( $plugins as $slug => $args ) { if ( isset( $args['hide'] ) && $args['hide'] === true ) { unset( $plugins[ $slug ] ); continue; } $action = $this->plugin_helper->get_plugin_state( $slug ); $plugins[ $slug ] = array_merge( [ 'cta' => $action, 'path' => $this->plugin_helper->get_plugin_path( $slug ), 'activate' => $this->plugin_helper->get_plugin_action_link( $slug ), 'deactivate' => $this->plugin_helper->get_plugin_action_link( $slug, 'deactivate' ), 'network' => $this->plugin_helper->get_is_network_wide( $slug ), 'version' => $this->plugin_helper->get_plugin_version( $slug, '0.0.0' ), ], $args ); } return $plugins; } /** * Check if feedback notice should be shown after 14 days since activation. * * @return bool */ private function should_show_feedback_notice() { $activated_time = get_option( 'neve_install' ); if ( ! empty( $activated_time ) ) { if ( time() - intval( $activated_time ) > 14 * DAY_IN_SECONDS ) { return true; } } return false; } /** * Get data of external plugins that are not hosted on wp.org. * * @return array */ private function get_external_plugins_data() { $plugins = array( 'wp-landing-kit' => array( 'banner' => NEVE_ASSETS_URL . 'img/dashboard/wp-landing.jpg', 'name' => 'WP Landing Kit', 'description' => 'Turn WordPress into a landing page powerhouse with Landing Kit. Map domains to pages or any other published resource.', 'author' => 'Themeisle', 'cta' => 'external', 'url' => tsdk_utmify( 'https://wplandingkit.com/', 'recommendedplugins', 'nevedashboard' ), 'premium' => true, ), ); return $plugins; } /** * Get available modules. * * @return array<mixed> */ private function get_available_modules() { $modules = array( 'login-customizer' => array( 'title' => __( 'Login Customizer', 'neve' ), 'description' => __( 'Customize your WordPress login page with branding and styling options.', 'neve' ), ), 'custom-fonts' => array( 'title' => __( 'Custom Fonts/Scripts', 'neve' ), 'description' => __( 'Add custom fonts and scripts to your website easily.', 'neve' ), ), 'policy-notice' => array( 'title' => __( 'Cookie Notice', 'neve' ), 'description' => __( 'Display a customizable cookie consent notice for GDPR compliance.', 'neve' ), ), 'post-duplicator' => array( 'title' => __( 'Duplicate Page', 'neve' ), 'description' => __( 'Quickly duplicate posts, pages, and custom post types.', 'neve' ), ), ); return apply_filters( 'neve_available_modules', $modules ); } /** * Renders the custom layout header section in the admin dashboard for Custom Layouts * * @access public * @return void */ public function render_custom_layout_header() { $screen = get_current_screen(); if ( ! $screen || ! ( $screen->id === 'edit-neve_custom_layouts' || $screen->id === 'neve_page_neve-custom-layout-upsell' ) ) { return; } $is_white_label_active = apply_filters( 'neve_is_theme_whitelabeled', false ) || apply_filters( 'neve_is_plugin_whitelabeled', false ); $this->render_neve_header(); ?> <style> /* Hide default page header. */ .wrap :is(h1.wp-heading-inline, .page-title-action) { display: none; } .cl-header-container { margin: 0 auto; padding: 20px; border: 1px solid #ddd; border-radius: 8px; background-color: white; margin-top: 40px; margin-right: 20px; } .cl-header-row { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; } .cl-header-row h2 { font-size: 24px; margin: 0; color: #333; } .cl-header-row .cl-header-actions { display: flex; gap: 10px; } .cl-header-row .cl-header-actions .cl-btn-action { display: flex; align-items: center; gap: 8px; line-height: 1; } .cl-header-row .cl-description { margin-top: 10px; font-size: 14px; color: #555; line-height: 1.6; } /* Hide text on small screens but keep it accessible to screen readers */ @media (max-width: 500px) { .cl-header-btn-text { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; border: 0 !important; clip: rect(0 0 0 0); overflow: hidden; white-space: nowrap; /* Prevent text wrapping inside the clipped area */ } } </style> <div class="cl-header-container"> <div class="cl-header-row"> <h2><?php esc_html_e( 'Custom Layouts', 'neve' ); ?></h2> <div class="cl-header-actions"> <button id="cl-open-modal" class="cl-btn-action button button-primary"> <span class="dashicons dashicons-plus-alt2" aria-hidden="true"></span> <span class="cl-header-btn-text"> <?php esc_html_e( 'Add New Layout', 'neve' ); ?> </span> </button> <?php if ( ! $is_white_label_active ) : ?> <a href="https://docs.themeisle.com/article/1062-custom-layouts-module" target="_blank" class="button cl-btn-action"> <span class="dashicons dashicons-welcome-learn-more" aria-hidden="true"></span> <span class="cl-header-btn-text"> <?php esc_html_e( 'View Tutorial', 'neve' ); ?> </span> </a> <?php endif; ?> </div> </div> <p class="cl-description"> <?php esc_html_e( 'Design unique website sections without touching code. Create custom headers, footers, and content areas that match your vision.', 'neve' ); ?> </p> </div> <script> function openModal( event ) { event.preventDefault(); document.dispatchEvent( new window.CustomEvent( 'nv-open-cl-modal', { detail: {} } ) ); } document.querySelector('#cl-open-modal')?.addEventListener('click', openModal); </script> <?php do_action( 'neve_render_after_header_custom_layouts' ); } /** * Renders the header section with Neve information and help actions. * * @access public * @return void */ public function render_neve_header() { if ( apply_filters( 'neve_is_theme_whitelabeled', false ) || apply_filters( 'neve_is_plugin_whitelabeled', false ) ) { return; } $is_using_pro = defined( 'NEVE_PRO_VERSION' ) && 'valid' === apply_filters( 'product_neve_license_status', false ); $neve_dashboard_url = add_query_arg( array( 'page' => 'neve-welcome', ), admin_url( 'admin.php' ) ); $neve_dashboard_changelog_url = $neve_dashboard_url . '#changelog'; ?> <style> .nv-admin-header { display: flex; align-items: center; justify-content: space-between; background-color: #fff; padding: 10px 20px; margin-top: 40px; margin-right: 20px; border-radius: 8px; border: 1px solid #ddd; gap: 10px; flex-wrap: wrap; } @media (max-width: 450px) { .nv-admin-header { justify-content: center; width: fit-content; } } @media (min-width: 451px) { .nv-admin-header-left { flex-grow: 1; } } .nv-admin-header-left { display: flex; align-items: center; gap: 12px; } .nv-admin-header-left img { width: 1.75rem; height: 1.75rem; border-radius: 0.125rem; } .nv-admin-header-left .nv-admin-title { font-size: 0.875rem; font-weight: 600; color: rgb(17, 24, 39); } .nv-admin-header-left .nv-admin-badge { font-size: 0.875rem; font-weight: 500; background-color: rgb(243, 244, 246); padding: 0.125rem 0.365rem; border-radius: 0.25rem; vertical-align: middle; text-transform: uppercase; color: rgb(55, 65, 81); } .nv-admin-header-left .nv-admin-version { color: rgb(107, 114, 128); vertical-align: middle; font-weight: 500; } .nv-admin-header-right { display: flex; align-items: center; gap: 30px; } .nv-admin-header-right a { color: rgb(75, 85, 99); text-decoration: none; font-size: 0.875rem; display: inline-flex; align-items: center; gap: 0.5rem; } .nv-admin-header-right a:hover { color: #0073aa; } .nv-admin-header-separator { width: 1px; height: 1rem; background-color: rgb(229, 231, 235); } </style> <div class="nv-admin-header"> <div class="nv-admin-header-left"> <a href="<?php echo esc_url_raw( $neve_dashboard_url ); ?>"> <img src="<?php echo esc_url_raw( get_template_directory_uri() . '/assets/img/dashboard/logo.svg' ); ?>" alt="<?php esc_attr_e( 'Neve Logo', 'neve' ); ?>" /> </a> <span class="nv-admin-title"><?php esc_html_e( 'Neve', 'neve' ); ?></span> <span class="nv-admin-badge"><?php echo $is_using_pro ? esc_html__( 'PRO', 'neve' ) : esc_html__( 'Free', 'neve' ); ?></span> <span class="nv-admin-version"><?php echo esc_html( sprintf( 'v%s', NEVE_VERSION ) ); ?></span> </div> <div class="nv-admin-header-right"> <a href="https://docs.themeisle.com/article/946-neve-doc" target="_blank"> <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 7v14"/><path d="M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z"/></svg> <?php esc_html_e( 'Documentation', 'neve' ); ?> </a> <span class="nv-admin-header-separator"></span> <a href="<?php echo esc_url_raw( $neve_dashboard_changelog_url ); ?>" target="_blank"> <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"/><path d="M14 2v4a2 2 0 0 0 2 2h4"/><path d="M10 9H8"/><path d="M16 13H8"/><path d="M16 17H8"/></svg> <?php esc_html_e( 'Changelog', 'neve' ); ?> </a> </div> </div> <?php } /** * Register the survey. * * @param array $dash_data The dashboard data. * * @return void */ public function register_survey( $dash_data ) { add_filter( 'themeisle-sdk/survey/neve', function( $data, $page_slug ) use ( $dash_data ) { $install_days_number = intval( ( time() - get_option( 'neve_install', time() ) ) / DAY_IN_SECONDS ); $data = array( 'environmentId' => 'clr0ply35522h8up0bay2de4y', 'attributes' => array( 'plan' => isset( $dash_data['license'], $dash_data['license']['tier'] ) ? $dash_data['license']['tier'] : 0, 'license_status' => isset( $dash_data['license'], $dash_data['license']['valid'] ) ? $dash_data['license']['valid'] : 'invalid', 'install_days_number' => $install_days_number, 'free_version' => $dash_data['version'], ), ); if ( isset( $dash_data['license'], $dash_data['license']['key'] ) ) { $data['attributes']['license_key'] = apply_filters( 'themeisle_sdk_secret_masking', $dash_data['license']['key'] ); } if ( defined( 'NEVE_PRO_VERSION' ) ) { $data['attributes']['pro_version'] = NEVE_PRO_VERSION; } return $data; }, 10, 2 ); } /** * Get the Black Friday config settings. * * @param array $default Optional. The default values. * * @return array The data. */ public static function get_black_friday_data( $default = array() ) { $config = $default; // translators: %1$s - HTML tag, %2$s - discount, %3$s - HTML tag, %4$s - product name. $message_template = __( 'Our biggest sale of the year: %1$sup to %2$s OFF%3$s on %4$s. Don\'t miss this limited-time offer.', 'neve' ); $product_label = __( 'Neve', 'neve' ); $discount = '70%'; $plan = apply_filters( 'product_neve_license_plan', 0 ); $is_pro = 0 < $plan; if ( $is_pro ) { // translators: %1$s - HTML tag, %2$s - discount, %3$s - HTML tag, %4$s - product name. $message_template = __( 'Get %1$sup to %2$s off%3$s when you upgrade your %4$s plan or renew early.', 'neve' ); $product_label = __( 'Neve Pro', 'neve' ); $discount = '30%'; } $product_label = sprintf( '<strong>%s</strong>', $product_label ); $url_params = array( 'utm_term' => $is_pro ? 'plan-' . $plan : 'free', 'lkey' => apply_filters( 'product_neve_license_key', false ), ); $config['message'] = sprintf( $message_template, '<strong>', $discount, '</strong>', $product_label ); $config['sale_url'] = add_query_arg( $url_params, tsdk_translate_link( tsdk_utmify( 'https://themeisle.link/neve-bf', 'bfcm', 'neve' ) ) ); return $config; } /** * Add the Black Friday data. * * @param array $configs An array of configurations. * * @return array The configurations. */ public function add_black_friday_data( $configs ) { $configs['neve'] = self::get_black_friday_data( $configs['default'] ); return $configs; } }
Coded With 💗 by
0x6ick