oont-contents/plugins/astra-addon/admin/core/class-astra-addon-admin-loader.php
2025-02-08 15:10:23 +01:00

498 lines
20 KiB
PHP

<?php
/**
* Astra Admin Loader
*
* @package Astra
* @since 4.0.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}
/**
* Astra_Addon_Admin_Loader
*
* @since 4.0.0
*/
class Astra_Addon_Admin_Loader {
/**
* Instance
*
* @var object Class object.
* @since 4.0.0
*/
private static $instance;
/**
* Option name
*
* @var string $option_name DB option name.
* @since 4.0.0
*/
private static $option_name = 'astra_admin_settings';
/**
* Admin settings dataset
*
* @var array $astra_admin_settings Settings array.
* @since 4.0.0
*/
private static $astra_admin_settings = array();
/**
* Plugin slug
*
* @since 1.0
* @var array $plugin_slug
*/
public static $plugin_slug = 'astra';
/**
* Initiator
*
* @since 4.0.0
* @return object initialized object of class.
*/
public static function get_instance() {
if ( ! isset( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Constructor
*
* @since 4.0.0
*/
public function __construct() {
self::$astra_admin_settings = get_option( self::$option_name, array() );
define( 'ASTRA_ADDON_ADMIN_DIR', ASTRA_EXT_DIR . 'admin/core/' );
define( 'ASTRA_ADDON_ADMIN_URL', ASTRA_EXT_URI . 'admin/core/' );
$this->includes();
add_filter( 'astra_menu_priority', array( $this, 'update_admin_menu_position' ) );
add_filter( 'astra_dashboard_rest_options', array( $this, 'update_addon_options_defaults' ) );
add_filter( 'astra_admin_settings_datatypes', array( $this, 'update_addon_options_datatypes' ) );
add_action( 'after_setup_theme', array( $this, 'init_admin_settings' ), 99 );
add_action( 'admin_init', array( $this, 'settings_admin_scripts' ) );
// Let WooCommerce know, Astra Pro is compatible with HPOS & New Product Editor.
add_action( 'before_woocommerce_init', array( $this, 'declare_woo_compatibility' ) );
}
/**
* Update Astra's menu priority to show after Dashboard menu.
*
* @param int $menu_priority priority for admin menu.
* @since 4.0.0
*/
public function update_admin_menu_position( $menu_priority ) {
return 2.1;
}
/**
* Update datatypes for further AJAX move.
*
* @param array $defaults Defaults for admin app.
*
* @since 4.0.0
*/
public function update_addon_options_datatypes( $defaults ) {
$defaults['enable_beta'] = 'string';
$defaults['enable_file_generation'] = 'string';
return $defaults;
}
/**
* Update defaults on REST call.
*
* @param array $defaults Defaults for admin app.
*
* @since 4.0.0
*/
public function update_addon_options_defaults( $defaults ) {
$white_label_markup_instance = Astra_Ext_White_Label_Markup::get_instance();
$defaults['pro_addons'] = Astra_Ext_Extension::get_enabled_addons();
$defaults['enable_file_generation'] = get_option( '_astra_file_generation', 'disable' );
$defaults['show_self_branding'] = Astra_Ext_White_Label_Markup::show_branding();
$defaults['enable_beta_update'] = Astra_Admin_Helper::get_admin_settings_option( '_astra_beta_updates', true, 'disable' );
$defaults['plugin_description'] = $white_label_markup_instance->astra_pro_whitelabel_description();
$defaults['plugin_name'] = $white_label_markup_instance->astra_pro_whitelabel_name();
$defaults['theme_screenshot_url'] = $white_label_markup_instance::get_whitelabel_string( 'astra', 'screenshot', false );
$defaults['theme_description'] = $white_label_markup_instance::get_whitelabel_string( 'astra', 'description', false );
$defaults['theme_name'] = $white_label_markup_instance::get_whitelabel_string( 'astra', 'name', false );
$defaults['agency_license_link'] = $white_label_markup_instance::get_whitelabel_string( 'astra-agency', 'licence', false );
$defaults['agency_author_url'] = $white_label_markup_instance->astra_pro_whitelabel_author_url();
$defaults['agency_author_name'] = $white_label_markup_instance->astra_pro_whitelabel_author();
$defaults['theme_icon_url'] = $white_label_markup_instance::get_whitelabel_string( 'astra', 'icon', false );
$defaults['st_plugin_name'] = $white_label_markup_instance::get_whitelabel_string( 'astra-sites', 'name', false );
$defaults['st_plugin_description'] = $white_label_markup_instance::get_whitelabel_string( 'astra-sites', 'description', false );
return $defaults;
}
/**
* Include required classes.
*
* @since 4.0.0
*/
public function init_admin_settings() {
self::$plugin_slug = is_callable( 'Astra_Menu::get_theme_page_slug' ) ? Astra_Menu::get_theme_page_slug() : 'astra';
}
/**
* Include required classes.
*
* @since 4.0.0
*/
public function includes() {
if ( is_admin() ) {
/* Ajax init */
require_once ASTRA_ADDON_ADMIN_DIR . 'includes/class-astra-addon-admin-ajax.php';
}
}
/**
* Get Changelogs from API.
*
* @since 4.0.0
* @return array $changelog_data Changelog Data.
*/
public static function astra_get_addon_changelog_feed_data() {
$changelog_data = array();
$posts = json_decode( wp_remote_retrieve_body( wp_remote_get( 'https://wpastra.com/wp-json/wp/v2/changelog?product=98&per_page=3' ) ) ); // Astra Pro.
if ( isset( $posts ) && is_array( $posts ) ) {
foreach ( $posts as $post ) {
$changelog_data[] = array(
'title' => $post->title->rendered,
'date' => gmdate( 'l F j, Y', strtotime( $post->date ) ),
'description' => $post->content->rendered,
'link' => $post->link,
);
}
}
return $changelog_data;
}
/**
* Get Theme Rollback versions.
*
* @param string $product astra-theme|astra-addon.
* @return array
* @since 4.0.0
*/
public static function astra_get_rollback_versions( $product = 'astra-theme' ) {
$rollback_versions_options = array();
if ( ASTRA_ADDON_BSF_PACKAGE ) {
$rollback_versions = Astra_Rollback_version::get_theme_all_versions();
if ( 'astra-addon' === $product ) {
$product_id = is_callable( 'bsf_extract_product_id' ) ? bsf_extract_product_id( ASTRA_EXT_DIR ) : '';
$product_details = get_brainstorm_product( $product_id );
$installed_version = isset( $product_details['version'] ) ? $product_details['version'] : '';
$product_versions = BSF_Rollback_Version::bsf_get_product_versions( $product_id ); // Get Remote versions
// Show versions above than latest install version of the product.
$rollback_versions = BSF_Rollback_Version::sort_product_versions( $product_versions, $installed_version );
}
foreach ( $rollback_versions as $version ) {
$version = array(
'label' => $version,
'value' => $version,
);
$rollback_versions_options[] = $version;
}
}
return $rollback_versions_options;
}
/**
* Returns an value,
* based on the settings database option for the admin settings page.
*
* @param string $key The sub-option key.
* @param mixed $default Option default value if option is not available.
* @return mixed Return the option value based on provided key
* @since 4.0.0
*/
public static function get_admin_settings_option( $key, $default = false ) {
$value = isset( self::$astra_admin_settings[ $key ] ) ? self::$astra_admin_settings[ $key ] : $default;
return $value;
}
/**
* Update an value of a key,
* from the settings database option for the admin settings page.
*
* @param string $key The option key.
* @param mixed $value The value to update.
* @return mixed Return the option value based on provided key
* @since 4.0.0
*/
public static function update_admin_settings_option( $key, $value ) {
$astra_admin_updated_settings = get_option( self::$option_name, array() );
$astra_admin_updated_settings[ $key ] = $value;
update_option( self::$option_name, $astra_admin_updated_settings );
}
/**
* Initialize after Astra gets loaded.
*
* @since 4.0.0
*/
public function settings_admin_scripts() {
// Enqueue admin scripts.
if ( ! empty( $_GET['page'] ) && ( self::$plugin_slug === sanitize_text_field( $_GET['page'] ) || false !== strpos( sanitize_text_field( $_GET['page'] ), self::$plugin_slug . '_' ) ) ) { //phpcs:ignore
add_action( 'admin_enqueue_scripts', array( $this, 'styles_scripts' ) );
}
}
/**
* Enqueues the needed CSS/JS for the builder's admin settings page.
*
* @since 4.0.0
*/
public function styles_scripts() {
if ( is_customize_preview() ) {
return;
}
$handle = 'astra-addon-admin-dashboard-app';
$build_path = ASTRA_ADDON_ADMIN_DIR . 'assets/build/';
$build_url = ASTRA_ADDON_ADMIN_URL . 'assets/build/';
$script_asset_path = $build_path . 'dashboard-app.asset.php';
$script_info = file_exists( $script_asset_path ) ? include $script_asset_path : array(
'dependencies' => array(),
'version' => ASTRA_EXT_VER,
);
$script_dep = $script_info['dependencies'];
wp_register_script(
$handle,
$build_url . 'dashboard-app.js',
$script_dep,
$script_info['version'],
true
);
wp_register_style(
$handle,
ASTRA_ADDON_ADMIN_URL . 'assets/css/admin-custom.css',
array(),
ASTRA_EXT_VER
);
wp_enqueue_script( $handle );
wp_set_script_translations( $handle, 'astra-addon' );
wp_enqueue_style( $handle );
wp_style_add_data( $handle, 'rtl', 'replace' );
$product_id = ASTRA_ADDON_BSF_PACKAGE && is_callable( 'bsf_extract_product_id' ) ? bsf_extract_product_id( ASTRA_EXT_DIR ) : '';
$white_label_markup_instance = Astra_Ext_White_Label_Markup::get_instance();
$rollback_version = isset( self::astra_get_rollback_versions( 'astra-addon' )[0] ) ? self::astra_get_rollback_versions( 'astra-addon' )[0] : ''; // phpcs:ignore PHPCompatibility.Syntax.NewFunctionArrayDereferencing.Found
$localize = array(
'theme_versions' => self::astra_get_rollback_versions(),
'addon_versions' => self::astra_get_rollback_versions( 'astra-addon' ),
'addon_rollback_nonce_url' => esc_url( add_query_arg( 'version_no', $rollback_version, wp_nonce_url( admin_url( 'index.php?action=bsf_rollback&product_id=' . $product_id ), 'bsf_rollback' ) ) ),
'addon_rollback_nonce_placeholder_url' => esc_url( wp_nonce_url( admin_url( 'index.php?action=bsf_rollback&version_no=VERSION&product_id=' . $product_id ), 'bsf_rollback' ) ),
'astra_pro_changelog_data' => self::astra_get_addon_changelog_feed_data(),
'addon_name' => astra_get_addon_name(),
'rollback_theme_name' => 'astra',
'rollback_plugin_name' => 'astra-addon',
'theme_rollback_url' => esc_url( admin_url() . 'index.php?action=astra-rollback&version_no=VERSION&_wpnonce=' . wp_create_nonce( 'astra_rollback' ) ),
'addon_rollback_url' => esc_url( admin_url() . 'index.php?action=bsf_rollback&version_no=VERSION&product_id=astra-addon&_wpnonce=' . wp_create_nonce( 'bsf_rollback' ) ),
'license_status' => ASTRA_ADDON_BSF_PACKAGE ? BSF_License_Manager::bsf_is_active_license( $product_id ) : false,
'product' => 'astra-addon',
'bsf_graupi_nonce' => wp_create_nonce( 'bsf_license_activation_deactivation_nonce' ),
'update_nonce' => wp_create_nonce( 'astra_addon_update_admin_setting' ),
'enable_beta' => Astra_Admin_Helper::get_admin_settings_option( '_astra_beta_updates', true, 'disable' ),
'enable_file_generation' => get_option( '_astra_file_generation', 'disable' ),
'pro_extensions' => Astra_Ext_Extension::get_enabled_addons(),
'show_self_branding' => Astra_Ext_White_Label_Markup::show_branding(),
'plugin_description' => $white_label_markup_instance->astra_pro_whitelabel_description(),
'plugin_name' => $white_label_markup_instance->astra_pro_whitelabel_name(),
'theme_screenshot_url' => $white_label_markup_instance::get_whitelabel_string( 'astra', 'screenshot', false ),
'theme_description' => $white_label_markup_instance::get_whitelabel_string( 'astra', 'description', false ),
'theme_name' => $white_label_markup_instance::get_whitelabel_string( 'astra', 'name', false ),
'agency_license_link' => $white_label_markup_instance::get_whitelabel_string( 'astra-agency', 'licence', false ),
'agency_author_url' => $white_label_markup_instance->astra_pro_whitelabel_author_url(),
'agency_author_name' => $white_label_markup_instance->astra_pro_whitelabel_author(),
'theme_icon_url' => $white_label_markup_instance::get_whitelabel_string( 'astra', 'icon', false ),
'st_plugin_name' => $white_label_markup_instance::get_whitelabel_string( 'astra-sites', 'name', false ),
'st_plugin_description' => $white_label_markup_instance::get_whitelabel_string( 'astra-sites', 'description', false ),
'rest_api' => get_rest_url( '', 'astra/v1/admin/settings' ),
'is_bsf_package' => ASTRA_ADDON_BSF_PACKAGE,
);
wp_localize_script( $handle, 'astra_addon_admin', apply_filters( 'astra_addon_react_admin_localize', $localize ) );
}
/**
* Get default/active tab for CPT admin tables.
*
* @since 4.0.0
* @param string $default default tab attr.
* @return string $current_tab
*/
public static function get_active_tab( $default = '' ) {
$current_tab = $default;
if ( ! empty( $_REQUEST['layout_type'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
$current_tab = sanitize_text_field( $_REQUEST['layout_type'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
}
return $current_tab;
}
/**
* HTML Template for Admin Top Header preview.
*
* @param string $title Title.
* @param bool $tabs Show tabs true/false.
* @param string $button_url Button redirection URL.
* @param string $kb_docs_url Button redirection URL.
*
* @since 4.0.0
*/
public static function admin_dashboard_header( $title, $tabs, $button_url, $kb_docs_url ) {
?>
<div class="-ml-5 ast-admin-top-bar-root -mb-11.5 [2.875rem] sm:mb-0">
<div class="bg-white border-b border-slate-200 px-5">
<div class="max-w-3xl mx-auto lg:max-w-full">
<div class="relative flex flex-wrap flex-col sm:flex-row justify-between items-start sm:items-center h-full min-h-24 sm:min-h-15 pt-14 pb-2 sm:pb-0 sm:pt-0">
<div class="flex gap-6">
<a href="" target="_blank" rel="noopener">
<img src="<?php echo esc_url( apply_filters( 'astra_admin_menu_icon', ASTRA_THEME_URI . 'inc/assets/images/astra-logo.svg' ) ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound ?>" class="lg:block h-[2.6rem] w-auto ast-theme-icon" alt="Workflow" >
</a>
<div class="flex items-center">
<h5 class="text-lg sm:text-xl leading-6 font-semibold mr-3 pl-6 border-l border-slate-200"><?php echo esc_html( $title ); ?></h5>
<a href="<?php echo esc_url( admin_url( $button_url ) ); ?>" class="text-xs text-astra font-medium leading-4 px-3 py-2 rounded-[0.1875rem] border border-astra bg-[#F6F7F7]">Add New</a>
</div>
</div>
<div class="flex justify-end items-center font-inter">
<?php if ( ! astra_is_white_labelled() ) { ?>
<div class="text-xs sm:text-sm font-medium sm:leading-[0.875rem] text-slate-600 pr-4 sm:pr-8 border-r border-slate-200">
<a href="<?php echo esc_url( $kb_docs_url ); ?>" target="_blank"><?php esc_html_e( 'Knowledge Base', 'astra-addon' ); ?></a>
</div>
<?php } ?>
<div class="flex items-center text-[0.625rem] sm:text-sm font-medium leading-[1.375rem] text-slate-400 mr-1 sm:mr-3 divide-x divide-slate-200 gap-3 pl-1 sm:pl-3">
<div class="flex items-center">
<span><?php echo esc_html( ASTRA_THEME_VERSION ); ?></span>
<span class="ml-1 sm:ml-2 text-[0.625rem] leading-[1rem] border border-slate-400 font-medium rounded-[0.1875rem] relative inline-flex flex-shrink-0 py-[0rem] px-1.5"> <?php esc_html_e( 'CORE', 'astra-addon' ); ?> </span>
</div>
<div class="flex items-center pl-3">
<span><?php echo esc_html( ASTRA_EXT_VER ); ?></span>
<span class="ml-1 sm:ml-2 text-[0.625rem] leading-[1rem] text-white font-medium border border-slate-800 bg-slate-800 rounded-[0.1875rem] relative inline-flex flex-shrink-0 py-[0rem] px-1.5"> <?php esc_html_e( 'PRO', 'astra-addon' ); ?> </span>
</div>
<?php
if ( ASTRA_ADDON_BSF_PACKAGE ) {
$highlight_class = BSF_License_Manager::bsf_is_active_license( bsf_extract_product_id( ASTRA_EXT_DIR ) ) ? 'text-[#4AB866]' : '';
$license_status_text = BSF_License_Manager::bsf_is_active_license( bsf_extract_product_id( ASTRA_EXT_DIR ) ) ? '<span class="pl-3 ' . esc_attr( $highlight_class ) . '">' . __( 'License activated', 'astra-addon' ) . '</span>' : '<a href="' . esc_url( admin_url( 'admin.php?page=astra&path=settings' ) ) . '" class="hover:text-astra text-slate-400 ml-3">' . __( 'License not activated', 'astra-addon' ) . '</a>';
echo wp_kses_post( $license_status_text );
}
?>
</div>
<?php
if ( Astra_Ext_White_Label_Markup::show_branding() ) {
?>
<a href="<?php echo esc_url( 'https://wpastra.com/changelog/?utm_source=wp&utm_medium=dashboard' ); ?>" target="_blank" class="w-8 sm:w-10 h-8 sm:h-10 flex items-center justify-center cursor-pointer rounded-full border border-slate-200">
<?php echo ( class_exists( 'Astra_Builder_UI_Controller' ) ) ? wp_kses( Astra_Builder_UI_Controller::fetch_svg_icon( 'horn', false ), Astra_Addon_Kses::astra_addon_svg_kses_protocols() ) : ''; ?>
</a>
<?php
}
?>
</div>
</div>
</div>
</div>
<?php
if ( $tabs ) {
$current_type = '';
$active_class = ' text-astra border-astra';
$current_tab = self::get_active_tab();
if ( ! empty( $_REQUEST['layout_type'] ) && 'all' !== $current_tab ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended
$current_type = sanitize_text_field( $_REQUEST['layout_type'] ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended
$active_class = '';
}
$url_args = array(
'post_type' => ASTRA_ADVANCED_HOOKS_POST_TYPE,
'layout_type' => $current_tab,
);
$custom_layout_types = array(
'header' => __( 'Header', 'astra-addon' ),
'footer' => __( 'Footer', 'astra-addon' ),
'hooks' => __( 'Hooks', 'astra-addon' ),
'404-page' => __( '404 Page', 'astra-addon' ),
'content' => __( 'Page Content', 'astra-addon' ),
'template' => __( 'Custom Template', 'astra-addon' ),
);
$baseurl = add_query_arg( $url_args, admin_url( 'edit.php' ) );
$all_layouts_url = add_query_arg( 'layout_type', 'all', admin_url( 'edit.php?post_type=' . ASTRA_ADVANCED_HOOKS_POST_TYPE ) );
?>
<div class="bg-white border-b border-slate-200 flex flex-wrap items-center -mb-0.5">
<a class="text-sm font-medium ml-2 px-5 py-4 border-b-2 border-white <?php echo esc_attr( $active_class ); ?>" href="<?php echo esc_url( $all_layouts_url ); ?>">
<?php
echo esc_html__( 'All', 'astra-addon' );
?>
</a>
<?php
foreach ( $custom_layout_types as $type => $title ) {
$type_url = esc_url( add_query_arg( 'layout_type', $type, $baseurl ) );
$active_class = ( $current_type === $type ) ? ' text-astra border-astra' : 'text-slate-600 border-white';
?>
<a class="text-sm font-medium px-5 py-4 border-b-2 <?php echo esc_attr( $active_class ); ?>" href="<?php echo esc_url( $type_url ); ?>">
<?php echo esc_attr( $title ); ?>
</a>
<?php
}
?>
</div>
<?php } ?>
</div>
<?php
}
/**
* Declare Woo HPOS & New Product Editor Compatibility.
*
* @since 4.5.1
* @return void
*/
public function declare_woo_compatibility() {
if ( class_exists( '\Automattic\WooCommerce\Utilities\FeaturesUtil' ) ) {
\Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', ASTRA_EXT_FILE, true );
\Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'product_block_editor', ASTRA_EXT_FILE, true );
}
}
}
Astra_Addon_Admin_Loader::get_instance();