269 lines
6.7 KiB
PHP
269 lines
6.7 KiB
PHP
<?php
|
|
namespace AIOSEO\Plugin\Common\Standalone;
|
|
|
|
// Exit if accessed directly.
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* Class that holds our setup wizard.
|
|
*
|
|
* @since 4.0.0
|
|
*/
|
|
class SetupWizard {
|
|
/**
|
|
* Class constructor.
|
|
*
|
|
* @since 4.0.0
|
|
*/
|
|
public function __construct() {
|
|
if ( ! is_admin() || wp_doing_cron() || wp_doing_ajax() ) {
|
|
return;
|
|
}
|
|
|
|
add_action( 'admin_menu', [ $this, 'addDashboardPage' ] );
|
|
add_action( 'admin_head', [ $this, 'hideDashboardPageFromMenu' ] );
|
|
add_action( 'admin_init', [ $this, 'maybeLoadOnboardingWizard' ] );
|
|
add_action( 'admin_init', [ $this, 'redirect' ], 9999 );
|
|
}
|
|
|
|
/**
|
|
* Onboarding Wizard redirect.
|
|
*
|
|
* This function checks if a new install or update has just occurred. If so,
|
|
* then we redirect the user to the appropriate page.
|
|
*
|
|
* @since 4.0.0
|
|
*
|
|
* @return void
|
|
*/
|
|
public function redirect() {
|
|
// Check if we should consider redirection.
|
|
if ( ! aioseo()->core->cache->get( 'activation_redirect' ) ) {
|
|
return;
|
|
}
|
|
|
|
// If we are redirecting, clear the transient so it only happens once.
|
|
aioseo()->core->cache->delete( 'activation_redirect' );
|
|
|
|
// Check option to disable welcome redirect.
|
|
if ( get_option( 'aioseo_activation_redirect', false ) ) {
|
|
return;
|
|
}
|
|
|
|
// Only do this for single site installs.
|
|
if ( isset( $_GET['activate-multi'] ) || is_network_admin() ) { // phpcs:ignore HM.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Recommended
|
|
return;
|
|
}
|
|
|
|
wp_safe_redirect( admin_url( 'index.php?page=aioseo-setup-wizard' ) );
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* Adds a dashboard page for our setup wizard.
|
|
*
|
|
* @since 4.0.0
|
|
*
|
|
* @return void
|
|
*/
|
|
public function addDashboardPage() {
|
|
add_dashboard_page( '', '', aioseo()->admin->getPageRequiredCapability( 'aioseo-setup-wizard' ), 'aioseo-setup-wizard', '' );
|
|
}
|
|
|
|
/**
|
|
* Hide the dashboard page from the menu.
|
|
*
|
|
* @since 4.1.5
|
|
*
|
|
* @return void
|
|
*/
|
|
public function hideDashboardPageFromMenu() {
|
|
remove_submenu_page( 'index.php', 'aioseo-setup-wizard' );
|
|
}
|
|
|
|
/**
|
|
* Checks to see if we should load the setup wizard.
|
|
*
|
|
* @since 4.0.0
|
|
*
|
|
* @return void
|
|
*/
|
|
public function maybeLoadOnboardingWizard() {
|
|
// Don't load the interface if doing an ajax call.
|
|
if ( wp_doing_ajax() || wp_doing_cron() ) {
|
|
return;
|
|
}
|
|
|
|
// Check for wizard-specific parameter
|
|
// Allow plugins to disable the setup wizard
|
|
// Check if current user is allowed to save settings.
|
|
if (
|
|
// phpcs:disable HM.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Recommended
|
|
! isset( $_GET['page'] ) ||
|
|
'aioseo-setup-wizard' !== sanitize_text_field( wp_unslash( $_GET['page'] ) ) ||
|
|
// phpcs:enable
|
|
! current_user_can( aioseo()->admin->getPageRequiredCapability( 'aioseo-setup-wizard' ) )
|
|
) {
|
|
return;
|
|
}
|
|
|
|
set_current_screen();
|
|
|
|
// Remove an action in the Gutenberg plugin ( not core Gutenberg ) which throws an error.
|
|
remove_action( 'admin_print_styles', 'gutenberg_block_editor_admin_print_styles' );
|
|
|
|
// If we are redirecting, clear the transient so it only happens once.
|
|
aioseo()->core->cache->delete( 'activation_redirect' );
|
|
|
|
$this->loadOnboardingWizard();
|
|
}
|
|
|
|
/**
|
|
* Load the Onboarding Wizard template.
|
|
*
|
|
* @since 4.0.0
|
|
*
|
|
* @return void
|
|
*/
|
|
private function loadOnboardingWizard() {
|
|
$this->enqueueScripts();
|
|
$this->setupWizardHeader();
|
|
$this->setupWizardContent();
|
|
$this->setupWizardFooter();
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* Enqueue's scripts for the setup wizard.
|
|
*
|
|
* @since 4.0.0
|
|
*
|
|
* @return void
|
|
*/
|
|
public function enqueueScripts() {
|
|
// We don't want any plugin adding notices to our screens. Let's clear them out here.
|
|
remove_all_actions( 'admin_notices' );
|
|
remove_all_actions( 'network_admin_notices' );
|
|
remove_all_actions( 'all_admin_notices' );
|
|
|
|
aioseo()->core->assets->load( 'src/vue/standalone/setup-wizard/main.js', [], aioseo()->helpers->getVueData( 'setup-wizard' ) );
|
|
|
|
aioseo()->main->enqueueTranslations();
|
|
|
|
wp_enqueue_style( 'common' );
|
|
wp_enqueue_media();
|
|
}
|
|
|
|
/**
|
|
* Outputs the simplified header used for the Onboarding Wizard.
|
|
*
|
|
* @since 4.0.0
|
|
*
|
|
* @return void
|
|
*/
|
|
public function setupWizardHeader() {
|
|
?>
|
|
<!DOCTYPE html>
|
|
<html <?php language_attributes(); ?>>
|
|
<head>
|
|
<meta name="viewport" content="width=device-width"/>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
|
<title>
|
|
<?php
|
|
// Translators: 1 - The plugin name ("All in One SEO").
|
|
echo sprintf( esc_html__( '%1$s › Onboarding Wizard', 'all-in-one-seo-pack' ), esc_html( AIOSEO_PLUGIN_SHORT_NAME ) );
|
|
?>
|
|
</title>
|
|
</head>
|
|
<body class="aioseo-setup-wizard">
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Outputs the content of the current step.
|
|
*
|
|
* @since 4.0.0
|
|
*
|
|
* @return void
|
|
*/
|
|
public function setupWizardContent() {
|
|
echo '<div id="aioseo-app">';
|
|
aioseo()->templates->getTemplate( 'admin/settings-page.php' );
|
|
echo '</div>';
|
|
}
|
|
|
|
/**
|
|
* Outputs the simplified footer used for the Onboarding Wizard.
|
|
*
|
|
* @since 4.0.0
|
|
*
|
|
* @return void
|
|
*/
|
|
public function setupWizardFooter() {
|
|
?>
|
|
<?php
|
|
wp_print_scripts( 'aioseo-vendors' );
|
|
wp_print_scripts( 'aioseo-common' );
|
|
wp_print_scripts( 'aioseo-setup-wizard-script' );
|
|
do_action( 'admin_footer', '' ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
|
|
do_action( 'admin_print_footer_scripts' ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedHooknameFound
|
|
// do_action( 'customize_controls_print_footer_scripts' );
|
|
?>
|
|
</body>
|
|
</html>
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Check whether or not the Setup Wizard is completed.
|
|
*
|
|
* @since 4.2.0
|
|
*
|
|
* @return boolean Whether or not the Setup Wizard is completed.
|
|
*/
|
|
public function isCompleted() {
|
|
$wizard = (string) aioseo()->internalOptions->internal->wizard;
|
|
$wizard = json_decode( $wizard );
|
|
if ( ! $wizard ) {
|
|
return false;
|
|
}
|
|
|
|
$totalStageCount = count( $wizard->stages );
|
|
$currentStageCount = array_search( $wizard->currentStage, $wizard->stages, true );
|
|
|
|
// If not found, let's assume it's completed.
|
|
if ( false === $currentStageCount ) {
|
|
return true;
|
|
}
|
|
|
|
return $currentStageCount + 1 === $totalStageCount;
|
|
}
|
|
|
|
/**
|
|
* Get the next stage of the wizard.
|
|
*
|
|
* @since 4.6.2
|
|
*
|
|
* @return string The next stage or empty.
|
|
*/
|
|
public function getNextStage() {
|
|
$wizard = (string) aioseo()->internalOptions->internal->wizard;
|
|
$wizard = json_decode( $wizard );
|
|
if ( ! $wizard ) {
|
|
return '';
|
|
}
|
|
|
|
// Default to success.
|
|
$nextStage = 'success';
|
|
|
|
// Get the next stage of the wizard.
|
|
$currentStageIndex = array_search( $wizard->currentStage, $wizard->stages, true );
|
|
if ( ! empty( $wizard->stages[ $currentStageIndex + 1 ] ) ) {
|
|
$nextStage = $wizard->stages[ $currentStageIndex + 1 ];
|
|
}
|
|
|
|
return $nextStage;
|
|
}
|
|
}
|