1,'optimized_at'=>'','posts_analyzed'=>0,'terms_analyzed'=>0,'site_type'=>'organization','site_name'=>get_bloginfo('name'),'alternate_name'=>'','logo_id'=>0,'logo_url'=>'','social'=>[],'analysis'=>'1','breadcrumbs'=>'1','weekly_audit'=>'0','include_query_parameters'=>'0','complete'=>'0'];} public static function data(){return wp_parse_args((array)get_option(self::OPTION,[]),self::defaults());} public static function menu(){add_submenu_page('360-seo-dashboard','First-time configuration','Setup Wizard','manage_options','360-seo-setup',[__CLASS__,'render']);} public static function assets($hook){if($hook!=='360-seo_page_360-seo-setup')return;wp_enqueue_media();wp_enqueue_style('360-seo-admin-css',AI_SEO_CRO_URL.'assets/css/admin.css',[],AI_SEO_CRO_VERSION);wp_enqueue_script('360-seo-setup',AI_SEO_CRO_URL.'assets/js/setup-wizard.js',[],AI_SEO_CRO_VERSION,true);} private static function url($step){return admin_url('admin.php?page=360-seo-setup&step='.(int)$step);} public static function save(){if(!current_user_can('manage_options'))wp_die('Unauthorized');check_admin_referer('ai_seo_cro_setup');$step=max(1,min(5,absint($_POST['step']??1)));$d=self::data();if($step===1)self::optimize($d);elseif($step===2)self::representation($d);elseif($step===3)self::social($d);elseif($step===4)self::preferences($d);else{$d['complete']='1';$d['step']=5;}update_option(self::OPTION,$d,false);wp_safe_redirect(self::url(min(5,$step+1)));exit;} private static function optimize(&$d){$total=0;foreach(get_post_types(['public'=>true],'names') as $type){$c=wp_count_posts($type);$total+=(int)($c->publish??0);}$terms=0;foreach(get_taxonomies(['public'=>true],'names') as $tax){$n=wp_count_terms(['taxonomy'=>$tax,'hide_empty'=>false]);if(!is_wp_error($n))$terms+=(int)$n;}$d['optimized_at']=current_time('mysql');$d['posts_analyzed']=$total;$d['terms_analyzed']=$terms;$d['step']=2;} private static function representation(&$d){check_admin_referer('ai_seo_cro_setup');$type=sanitize_key($_POST['site_type']??'organization');$d['site_type']=in_array($type,['organization','person'],true)?$type:'organization';$d['site_name']=sanitize_text_field(wp_unslash($_POST['site_name']??''));$d['alternate_name']=sanitize_text_field(wp_unslash($_POST['alternate_name']??''));$d['logo_id']=absint($_POST['logo_id']??0);$d['logo_url']=esc_url_raw(wp_unslash($_POST['logo_url']??''));$d['step']=3;} private static function social(&$d){check_admin_referer('ai_seo_cro_setup');$d['social']=[];foreach(['facebook','x','instagram','linkedin','youtube','pinterest','tiktok','wikipedia'] as $network){$url=esc_url_raw(wp_unslash($_POST['social'][$network]??''));if($url)$d['social'][$network]=$url;}$d['step']=4;} private static function preferences(&$d){check_admin_referer('ai_seo_cro_setup');$d['include_query_parameters']=empty($_POST['include_query_parameters'])?'0':'1';$d['analysis']=empty($_POST['analysis'])?'0':'1';$d['breadcrumbs']=empty($_POST['breadcrumbs'])?'0':'1';$d['weekly_audit']=empty($_POST['weekly_audit'])?'0':'1';$seo=(array)get_option(AI_SEO_CRO_SEO_Manager::OPTION,[]);$seo['enabled']=$d['analysis'];$seo['breadcrumbs']=$d['breadcrumbs'];update_option(AI_SEO_CRO_SEO_Manager::OPTION,$seo,false);$d['step']=5;} // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only step navigation; all saves verify a nonce. public static function render(){if(!current_user_can('manage_options'))return;$d=self::data();$step=max(1,min(5,absint($_GET['step']??$d['step'])));echo '
Guided configuration

First-time configuration

Follow these five steps to help search engines understand your site.

';self::progress($step);echo '
';call_user_func([__CLASS__,'step_'.$step],$d);echo '
';} private static function progress($step){echo '
    ';foreach(['SEO optimization','Site representation','Social profiles','Preferences','Finish'] as $i=>$label)echo '
  1. '.absint($i+1).''.esc_html($label).'
  2. ';echo '
';} private static function start($step){echo '
';wp_nonce_field('ai_seo_cro_setup');echo '';} private static function end($label='Continue',$back_step=0){echo '
';if($back_step>0)echo ' Back';submit_button($label,'primary','submit',false);echo '
';} private static function step_1($d){echo '

SEO data optimization

Scan the site and build an SEO index without changing content or public settings.

';if($d['optimized_at'])echo '
Site analyzed successfully'.esc_html(number_format_i18n($d['posts_analyzed'])).' items and '.esc_html(number_format_i18n($d['terms_analyzed'])).' terms indexed.
';self::start(1);self::end($d['optimized_at']?'Continue':'Start optimization');} private static function step_2($d){echo '

Site representation

Tell search engines whether this website represents an organization or a person.

';self::start(2);echo '
Site logoUsed in organization schema and search appearance.
'.($d['logo_url']?'':'').'

Recommended: square image, at least 112 × 112px.

';self::end('Continue',1);} private static function step_3($d){echo '

Social profiles

Add official profiles for organization schema and social discovery.

';self::start(3);foreach(['facebook','x','instagram','linkedin','youtube','pinterest','tiktok','wikipedia'] as $network)echo '';self::end('Continue',2);} private static function step_4($d){echo '

Personal preferences

Choose which SEO tools should be active.

';self::start(4);foreach(['analysis'=>'SEO controls and assessments','breadcrumbs'=>'Breadcrumb schema','include_query_parameters'=>'Include URLs with query parameters in scans'] as $key=>$label)echo '';echo '

Scheduled remote audits are off by default. Enable them and review the data sent in Site Audit service settings.

';echo '

Query URLs are excluded by default, including testing variants. Enable to crawl query variants as separate pages, subject to existing crawl exclusions. This default applies to manual and scheduled scans. Existing reports stay unchanged; run a new scan.

';self::end('Continue',3);} private static function step_5($d){$complete=$d['complete']==='1';echo '

'.($complete?'Configuration complete':'Finish configuration').'

Your essential SEO settings are ready. You can revisit this wizard at any time.

';if($complete){echo '

Setup is complete.

Go to dashboard SEO settings

';return;}self::start(5);self::end('Finish configuration',4);} } AI_SEO_CRO_Setup_Wizard::init();