'4.1.0',
'4.0.2' => '4.0.0',
'3.9.4' => '3.9.2',
'3.9.1' => '3.9.0',
'3.8.5' => '3.6.11',
'3.8.4' => '3.6.10',
'3.8.2' => '3.6.3',
'3.7.4' => '3.6.2',
'3.7.3' => '3.6.0',
'3.6.9' => '3.5.8',
'3.6.7' => '3.5.5',
'3.6.4' => '3.5.0',
'3.4.8' => '3.4.2',
'3.4.2' => '3.4.0',
'3.3.3' => '3.3.2',
'3.3.2' => '3.3.1',
'3.3.1' => '3.3.0',
'3.2.0' => '3.1.0',
'3.0.3' => '3.0.0',
);
/**
* Constructor
*/
public function __construct() {
if ( ! is_admin() ) {
return;
}
self::get_starter_templates_slug();
add_action( 'after_setup_theme', __CLASS__ . '::init_admin_settings', 99 );
}
/**
* Admin settings init
*/
public static function init_admin_settings() {
add_action( 'admin_enqueue_scripts', __CLASS__ . '::register_scripts' );
add_action( 'customize_controls_enqueue_scripts', __CLASS__ . '::customizer_scripts' );
add_action( 'astra_notice_before_markup_astra-sites-on-active', __CLASS__ . '::load_astra_admin_script' );
add_action( 'admin_init', __CLASS__ . '::register_notices' );
add_action( 'astra_notice_before_markup', __CLASS__ . '::notice_assets' );
add_action( 'admin_init', __CLASS__ . '::minimum_addon_version_notice' );
add_action( 'admin_init', __CLASS__ . '::minimum_addon_supported_version_notice' );
if ( astra_showcase_upgrade_notices() ) {
add_action( 'admin_init', __CLASS__ . '::upgrade_to_pro_wc_notice' );
add_action( 'wp_nav_menu_item_custom_fields', __CLASS__ . '::add_custom_fields', 10, 4 );
}
}
/**
* Add custom megamenu fields data to the menu.
*
* @param int $id menu item id.
* @param object $item A single menu item.
* @param int $depth menu item depth.
* @param array $args menu item arguments.
* @return void
*
* @since 3.9.4
*/
public static function add_custom_fields( $id, $item, $depth, $args ) {
?>
admin_url( 'admin-ajax.php' ),
'astraSitesLink' => admin_url( 'themes.php?page=starter-templates' ),
'recommendedPluiginActivatingText' => __( 'Activating', 'astra' ) . '…',
'recommendedPluiginDeactivatingText' => __( 'Deactivating', 'astra' ) . '…',
'recommendedPluiginActivateText' => __( 'Activate', 'astra' ),
'recommendedPluiginDeactivateText' => __( 'Deactivate', 'astra' ),
'recommendedPluiginSettingsText' => __( 'Settings', 'astra' ),
'astraPluginManagerNonce' => wp_create_nonce( 'astra_plugin_manager_nonce' ),
);
wp_localize_script( 'astra-admin-settings', 'astra', apply_filters( 'astra_theme_js_localize', $localize ) );
// Script.
wp_enqueue_script( 'astra-admin-settings' );
}
/**
* Ask Theme Rating
*
* @since 1.4.0
*/
public static function register_notices() {
// Return if white labeled.
/** @psalm-suppress RedundantCondition */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
if ( astra_is_white_labelled() || ! ASTRA_THEME_ORG_VERSION || false === apply_filters( 'astra_showcase_starter_templates_notice', true ) || ! Astra_Menu::is_promoting_starter_templates() ) {
/** @psalm-suppress RedundantCondition */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
return;
}
/** @psalm-suppress PossiblyInvalidArgument */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
$current_slug = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
/** @psalm-suppress PossiblyInvalidArgument */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
// Force Astra welcome notice on theme activation.
if ( current_user_can( 'install_plugins' ) && ! defined( 'ASTRA_SITES_NAME' ) && '1' == get_option( 'fresh_site' ) && ! in_array( $current_slug, array( 'astra-advanced-hook', 'astra_adv_header' ), true ) ) {
// Do not display admin welcome banner notice on theme upload page.
/** @psalm-suppress InvalidGlobal */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
global $pagenow;
/** @psalm-suppress InvalidGlobal */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
if ( isset( $pagenow ) && 'update.php' === $pagenow ) {
return;
}
$image_path = ASTRA_THEME_URI . 'inc/assets/images/astra-banner.png';
$gb_image_path = ASTRA_THEME_URI . 'inc/assets/images/gb-logo.svg';
$ele_image_path = ASTRA_THEME_URI . 'inc/assets/images/ele-logo.svg';
$bb_image_path = ASTRA_THEME_URI . 'inc/assets/images/bb-logo.jpg';
$ai_image_path = ASTRA_THEME_URI . 'inc/assets/images/ai-logo.svg';
$ast_sites_notice_btn = self::astra_sites_notice_button();
$ast_sites_notice_btn['button_text'] = __( 'Let’s Get Started with Starter Templates', 'astra' );
if ( file_exists( WP_PLUGIN_DIR . '/astra-sites/astra-sites.php' ) && is_plugin_inactive( 'astra-sites/astra-sites.php' ) && is_plugin_inactive( 'astra-pro-sites/astra-pro-sites.php' ) ) {
$ast_sites_notice_btn['class'] .= ' button button-primary';
} elseif ( ! file_exists( WP_PLUGIN_DIR . '/astra-sites/astra-sites.php' ) && is_plugin_inactive( 'astra-pro-sites/astra-pro-sites.php' ) ) {
$ast_sites_notice_btn['class'] .= ' button button-primary';
// Astra Premium Sites - Active.
} else {
$ast_sites_notice_btn['class'] = ' button button-primary astra-notice-close';
}
$astra_sites_notice_args = array(
'id' => 'astra-sites-on-active',
'type' => 'info',
'message' => sprintf(
'
%1$s
%2$s
%3$s
%13$s
',
__( 'Thank you for choosing the Astra theme!', 'astra' ),
__( 'Build Your Dream Site in Minutes With AI 🚀', 'astra' ),
__( 'Say goodbye to the days of spending weeks designing and building your website. With Astra and our Starter Templates plugin, you can now create professional-grade websites in minutes.', 'astra' ),
esc_attr( $ast_sites_notice_btn['class'] ),
'href="' . astra_get_prop( $ast_sites_notice_btn, 'link', '' ) . '"',
'data-slug="' . astra_get_prop( $ast_sites_notice_btn, 'data_slug', '' ) . '"',
'data-init="' . astra_get_prop( $ast_sites_notice_btn, 'data_init', '' ) . '"',
'data-settings-link-text="' . astra_get_prop( $ast_sites_notice_btn, 'data_settings_link_text', '' ) . '"',
'data-settings-link="' . astra_get_prop( $ast_sites_notice_btn, 'data_settings_link', '' ) . '"',
'data-activating-text="' . astra_get_prop( $ast_sites_notice_btn, 'activating_text', '' ) . '"',
esc_html( $ast_sites_notice_btn['button_text'] ),
$image_path,
__( 'I want to build this website from scratch', 'astra' ),
__( '280+ Templates', 'astra' ),
$gb_image_path,
$ele_image_path,
$bb_image_path,
$ai_image_path,
),
'priority' => 5,
'display-with-other-notices' => false,
'show_if' => class_exists( 'Astra_Ext_White_Label_Markup' ) ? Astra_Ext_White_Label_Markup::show_branding() : true,
);
Astra_Notices::add_notice(
$astra_sites_notice_args
);
}
}
/**
* Upgrade to Pro notice for Astra on WooCommerce pages.
*
* @since 3.9.4
*/
public static function upgrade_to_pro_wc_notice() {
/** @psalm-suppress PossiblyInvalidArgument */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
$current_slug = isset( $_GET['page'] ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
/** @psalm-suppress PossiblyInvalidArgument */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
if ( '' !== $current_slug && function_exists( 'WC' ) && in_array( $current_slug, array( 'wc-admin', 'wc-reports', 'wc-status', 'wc-addons', 'wc-settings' ), true ) ) {
$image_path = ASTRA_THEME_URI . 'inc/assets/images/astra-logo.svg';
$astra_sites_notice_args = array(
'id' => 'astra-upgrade-pro-wc',
'type' => 'info',
'message' => sprintf(
'
',
$image_path,
__( 'Astra Works Seamlessly with WooCommerce!', 'astra' ),
__( 'Use every tool at your disposal to optimize your online store for conversion. All the advantages you need to make more profit!', 'astra' ),
esc_attr( 'button button-primary' ),
'href="' . astra_get_pro_url( 'https://wpastra.com/pricing/', 'dashboard', 'free-theme', 'woocommerce' ) . '" target="_blank"',
__( 'Upgrade Now', 'astra' )
),
'priority' => 5,
'show_if' => is_admin() ? true : false,
'display-with-other-notices' => false,
);
Astra_Notices::add_notice(
$astra_sites_notice_args
);
}
}
/**
* Display notice for minimun version for Astra addon.
*
* @since 2.0.0
*/
public static function minimum_addon_version_notice() {
if ( ! defined( 'ASTRA_EXT_VER' ) ) {
return;
}
if ( version_compare( ASTRA_EXT_VER, ASTRA_EXT_MIN_VER ) < 0 ) {
$message = sprintf(
/* translators: %1$1s: Theme Name, %2$2s: Minimum Required version of the addon */
__( 'Please update the %1$1s to version %2$2s or higher. Ignore if already updated.', 'astra' ),
astra_get_addon_name(),
ASTRA_EXT_MIN_VER
);
$min_version = get_user_meta( get_current_user_id(), 'ast-minimum-addon-version-notice-min-ver', true );
if ( ! $min_version ) {
update_user_meta( get_current_user_id(), 'ast-minimum-addon-version-notice-min-ver', ASTRA_EXT_MIN_VER );
}
if ( version_compare( $min_version, ASTRA_EXT_MIN_VER, '!=' ) ) {
delete_user_meta( get_current_user_id(), 'ast-minimum-addon-version-notice' );
update_user_meta( get_current_user_id(), 'ast-minimum-addon-version-notice-min-ver', ASTRA_EXT_MIN_VER );
}
$notice_args = array(
'id' => 'ast-minimum-addon-version-notice',
'type' => 'warning',
'message' => $message,
'show_if' => true,
'repeat-notice-after' => false,
'priority' => 18,
'display-with-other-notices' => true,
);
Astra_Notices::add_notice( $notice_args );
}
}
/**
* Get minimum supported version for Astra addon.
* This function will be used to inform the user about incompatible version of Astra addon.
*
* @param string $input_version Input version of the addon.
*
* @since 4.3.0
*/
public static function get_astra_addon_min_supported_version( $input_version ) {
if ( defined( 'ASTRA_EXT_VER' ) && version_compare( ASTRA_EXT_VER, ASTRA_EXT_MIN_VER ) < 0 ) {
return ASTRA_EXT_MIN_VER;
}
$supported_version = '';
// First, check if the exact version is supported
if ( isset( self::$astra_addon_supported_version_map[ $input_version ] ) ) {
$supported_version = self::$astra_addon_supported_version_map[ $input_version ];
} else {
foreach ( self::$astra_addon_supported_version_map as $index => $supported ) {
/** @psalm-suppress TypeDoesNotContainType */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
if ( '' !== $supported_version || version_compare( $input_version, $index ) > 0 ) {
/** @psalm-suppress TypeDoesNotContainType */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
$supported_version = $supported;
break;
}
}
}
return $supported_version;
}
/**
* This constant will be used to inform the user about incompatible version of Astra addon.
*
* @since 4.3.0
*/
public static function minimum_addon_supported_version_notice() {
if ( ! defined( 'ASTRA_EXT_VER' ) ) {
return;
}
// ASTRA_EXT_MIN_VER < ASTRA_EXT_VER && ASTRA_EXT_VER < 4.0.0.
if ( version_compare( ASTRA_EXT_VER, ASTRA_EXT_MIN_VER ) >= 0 || version_compare( '4.0.0', ASTRA_EXT_VER ) < 0 ) {
return;
}
$astra_addon_supported_version = self::get_astra_addon_min_supported_version( ASTRA_EXT_VER );
$message = sprintf(
/* translators: %1$s: Plugin Name, %2$s: Theme name, %3$s: Supported required version of the addon */
'Your current version of %1$s plugin is incompatible with %2$s theme. Please update to at least version %3$s for optimal functionality.',
astra_get_addon_name(),
astra_get_theme_name(),
$astra_addon_supported_version
);
$ext_min_supported_version = get_user_meta( get_current_user_id(), 'ast-addon-supported-version-notice', true );
if ( ! $ext_min_supported_version ) {
update_user_meta( get_current_user_id(), 'ast-addon-supported-version-notice', $astra_addon_supported_version );
}
if ( version_compare( $ext_min_supported_version, $astra_addon_supported_version, '!=' ) ) {
delete_user_meta( get_current_user_id(), 'ast-addon-minimum-supported-version-notice' );
update_user_meta( get_current_user_id(), 'ast-addon-supported-version-notice', $astra_addon_supported_version );
}
$notice_args = array(
'id' => 'ast-addon-minimum-supported-version-notice',
'type' => 'warning',
'message' => $message,
'show_if' => true,
'repeat-notice-after' => false,
'priority' => 20,
'display-with-other-notices' => false,
);
Astra_Notices::add_notice( $notice_args );
}
/**
* Enqueue Astra Notices CSS.
*
* @since 2.0.0
*
* @return void
*/
public static function notice_assets() {
if ( is_rtl() ) {
wp_enqueue_style( 'astra-custom-notices-rtl', ASTRA_THEME_URI . 'inc/assets/css/astra-notices-rtl.css', array(), ASTRA_THEME_VERSION );
} else {
wp_enqueue_style( 'astra-custom-notices', ASTRA_THEME_URI . 'inc/assets/css/astra-notices.css', array(), ASTRA_THEME_VERSION );
}
}
/**
* Render button for Astra Site notices
*
* @since 1.6.5
* @return array $ast_sites_notice_btn Rendered button
*/
public static function astra_sites_notice_button() {
$ast_sites_notice_btn = array();
// Any of the Starter Templtes plugin - Active.
if ( is_plugin_active( 'astra-pro-sites/astra-pro-sites.php' ) || is_plugin_active( 'astra-sites/astra-sites.php' ) ) {
$ast_sites_notice_btn['class'] = 'active';
$ast_sites_notice_btn['link'] = admin_url( 'themes.php?page=' . self::$starter_templates_slug );
return $ast_sites_notice_btn;
}
// Starter Templates PRO Plugin - Installed but Inactive.
if ( file_exists( WP_PLUGIN_DIR . '/astra-pro-sites/astra-pro-sites.php' ) && is_plugin_inactive( 'astra-pro-sites/astra-pro-sites.php' ) ) {
$ast_sites_notice_btn['class'] = 'astra-activate-recommended-plugin';
$ast_sites_notice_btn['data_slug'] = 'astra-pro-sites';
$ast_sites_notice_btn['data_init'] = '/astra-pro-sites/astra-pro-sites.php';
$ast_sites_notice_btn['data_settings_link'] = admin_url( 'themes.php?page=' . self::$starter_templates_slug );
$ast_sites_notice_btn['data_settings_link_text'] = __( 'See Library »', 'astra' );
$ast_sites_notice_btn['activating_text'] = __( 'Activating Importer Plugin ', 'astra' ) . '…';
return $ast_sites_notice_btn;
}
// Starter Templates FREE Plugin - Installed but Inactive.
if ( file_exists( WP_PLUGIN_DIR . '/astra-sites/astra-sites.php' ) && is_plugin_inactive( 'astra-sites/astra-sites.php' ) ) {
$ast_sites_notice_btn['class'] = 'astra-activate-recommended-plugin';
$ast_sites_notice_btn['data_slug'] = 'astra-sites';
$ast_sites_notice_btn['data_init'] = '/astra-sites/astra-sites.php';
$ast_sites_notice_btn['data_settings_link'] = admin_url( 'themes.php?page=' . self::$starter_templates_slug );
$ast_sites_notice_btn['data_settings_link_text'] = __( 'See Library »', 'astra' );
$ast_sites_notice_btn['activating_text'] = __( 'Activating Importer Plugin ', 'astra' ) . '…';
return $ast_sites_notice_btn;
}
// Any of the Starter Templates plugin not available.
if ( ! file_exists( WP_PLUGIN_DIR . '/astra-sites/astra-sites.php' ) || ! file_exists( WP_PLUGIN_DIR . '/astra-pro-sites/astra-pro-sites.php' ) ) {
$ast_sites_notice_btn['class'] = 'astra-install-recommended-plugin';
$ast_sites_notice_btn['data_slug'] = 'astra-sites';
$ast_sites_notice_btn['data_init'] = '/astra-sites/astra-sites.php';
$ast_sites_notice_btn['data_settings_link'] = admin_url( 'themes.php?page=' . self::$starter_templates_slug );
$ast_sites_notice_btn['data_settings_link_text'] = __( 'See Library »', 'astra' );
$ast_sites_notice_btn['detail_link_class'] = 'plugin-detail thickbox open-plugin-details-modal astra-starter-sites-detail-link';
$ast_sites_notice_btn['detail_link'] = network_admin_url( 'plugin-install.php?tab=plugin-information&plugin=astra-sites&TB_iframe=true&width=772&height=400' );
$ast_sites_notice_btn['detail_link_text'] = __( 'Details »', 'astra' );
return $ast_sites_notice_btn;
}
$ast_sites_notice_btn['class'] = 'active';
$ast_sites_notice_btn['link'] = admin_url( 'themes.php?page=' . self::$starter_templates_slug );
return $ast_sites_notice_btn;
}
/**
* Check if installed Starter Sites plugin is new.
*
* @since 2.3.2
*/
public static function get_starter_templates_slug() {
if ( defined( 'ASTRA_PRO_SITES_VER' ) && version_compare( ASTRA_PRO_SITES_VER, '2.0.0', '>=' ) ) {
self::$starter_templates_slug = 'starter-templates';
}
if ( defined( 'ASTRA_SITES_VER' ) && version_compare( ASTRA_SITES_VER, '2.0.0', '>=' ) ) {
self::$starter_templates_slug = 'starter-templates';
}
}
/**
* Load the scripts and styles in the customizer controls.
*
* @since 1.2.1
*/
public static function customizer_scripts() {
$color_palettes = wp_json_encode( astra_color_palette() );
wp_add_inline_script( 'wp-color-picker', 'jQuery.wp.wpColorPicker.prototype.options.palettes = ' . $color_palettes . ';' );
}
/**
* Register admin scripts.
*
* @param String $hook Screen name where the hook is fired.
* @return void
*/
public static function register_scripts( $hook ) {
if ( in_array( $hook, array( 'post.php', 'post-new.php' ) ) ) {
$post_types = get_post_types( array( 'public' => true ) );
$screen = get_current_screen();
$post_type = $screen->id;
// Check if block editor is enabled or not.
if ( null !== $post_type && is_callable( 'use_block_editor_for_post_type' ) && use_block_editor_for_post_type( $post_type ) && in_array( $post_type, (array) $post_types ) ) {
echo '';
/**
* Register admin script for missing Layout option from nested Column Blocks inside Group/Cover blocks.
*
* @see https://github.com/WordPress/gutenberg/issues/33374 & https://gist.github.com/Luehrsen/c4aad3b33435058c19ea80f5f1c268e8 - Remove this once the issue is fixed.
*
* @since 3.7.9
*/
wp_enqueue_script( 'astra-column-block-comp-js', ASTRA_THEME_URI . 'inc/assets/js/column-block-compatibility.js', array( 'wp-util', 'wp-hooks', 'wp-blocks' ), ASTRA_THEME_VERSION, false );
}
}
}
/**
* Get and return page URL
*
* @param string $menu_slug Menu name.
* @since 1.0
* @return string page url
*/
public static function get_page_url( $menu_slug ) {
$parent_page = 'themes.php';
/** @psalm-suppress InvalidLiteralArgument */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
if ( strpos( $parent_page, '?' ) !== false ) {
/** @psalm-suppress InvalidLiteralArgument */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort
$query_var = '&page=' . Astra_Menu::get_theme_page_slug();
} else {
$query_var = '?page=' . Astra_Menu::get_theme_page_slug();
}
$parent_page_url = admin_url( $parent_page . $query_var );
$url = $parent_page_url . '&action=' . $menu_slug;
return esc_url( $url );
}
}
new Astra_Admin_Settings();
}