'', ], $atts, 'aiaas_publish'); if (!is_user_logged_in()) { $login_url = wp_login_url(self::current_url()); return '

'.esc_html(self::t('auth.login_required_portal','You must be logged in to access AI Authors Studio.')).'

'.esc_html(self::t('auth.login','Log in')).'

'; } $project_id = self::resolve_project_id_from_request($atts['project_id']); $current_plan_for_publish = strtoupper((string) self::get_user_plan()); $is_free_publish_user = ($current_plan_for_publish === 'FREE'); ob_start(); echo '
'; echo ''; // Publish view wrappers (needed for diagnostics/force-show), neutralized via publish-only CSS. echo '
'; echo '
'; echo ''; self::render_app_header(self::t('nav.publish','Publish')); self::render_frontend_nav('publish'); // (UI) Mode badge removed from Publish view (too noisy / confusing). self::render_notice_frontend(); // Page purpose banner (Publish) echo '
' . esc_html(self::t('page.publish.purpose','Setup and Export books with many options')) . '
'; if (method_exists(__CLASS__, 'render_free_upgrade_icon_row')) { self::render_free_upgrade_icon_row('publish'); } if (method_exists(__CLASS__, 'render_beginner_mode_banner')) { self::render_beginner_mode_banner('publish', (int) $project_id, 0); } // Export Pipeline v2 download (secure admin-post streaming) if (self::req('aiaas_export_file','', 'text') !== '') { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only download param; nonce is added to the admin-post URL. $file = rawurldecode(sanitize_text_field(wp_unslash(sanitize_text_field(wp_unslash(self::req('aiaas_export_file','', 'text')))))); $file = self::sanitize_export_filename($file); self::export_debug_log($project_id, 'Download request', ['file'=>$file,'raw'=> self::req('file','', 'text') ]); if ($file && $project_id) { $dl = wp_nonce_url( add_query_arg([ 'action' => 'aiaas_download_export', 'project_id' => (int)$project_id, 'file' => $file, ], admin_url('admin-post.php')), 'aiaas_download_export_' . $project_id . '_' . $file ); echo '
'; echo '

' . esc_html(self::t('publish.export_ready','Export ready.')) . ' ' . esc_html(self::t('publish.download_should_start','Your download should start automatically.')) . '

'; echo '

'.esc_html(self::t('publish.download_export','Download Export')).'

'; echo '

'.esc_html(self::t('publish.if_not_start','If it doesn\'t start, click the button above.')).'

'; echo '
'; if (self::req('aiaas_auto','', 'text') === '1') { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only UI hint. echo ''; } } } // Backward compatible: if an older build passed a direct URL. if (('' !== (string) self::req('aiaas_download','', 'text')) && !('' !== (string) self::req('aiaas_export_file','', 'text'))) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Read-only download param. $dl = rawurldecode(sanitize_text_field(wp_unslash(sanitize_text_field(wp_unslash(self::req('aiaas_download','', 'text')))))); $dl = esc_url($dl); if ($dl) { echo '
'; echo '

' . esc_html(self::t('publish.download_label','Download:')) . '

'; echo '

'.esc_html(self::t('publish.download_export','Download Export')).'

'; echo '
'; } } if (!$project_id) { echo '

'.esc_html(self::t('publish.select_project','Select a project to publish:')).'

'; $projects = self::query_projects(0); if (!$projects) { echo '

' . wp_kses_post(self::t('publish.no_projects_yet','No projects yet. Use [aiaas_projects] to create one first.')) . '

'; echo '
'; return ob_get_clean(); } echo ''; echo '

' . wp_kses_post(self::t('publish.lock_project_tip_html','Tip: Use [aiaas_publish project_id="123"] to lock an export page to one project.')) . '

'; echo '
'; return ob_get_clean(); } if ($project_id && !self::current_user_can_access_project($project_id)) { // If last project was deleted/archived, clear it and fall back to project overview. if (is_user_logged_in()) { delete_user_meta(get_current_user_id(), '_aiaas_last_project_id'); } $project_id = 0; } if (!$project_id) { echo '
'; echo '

'.esc_html(self::t('dashboard.select_project','Select a project to continue (or manage projects below).')).'

'; self::render_projects_overview_frontend(0); echo '
'; return ob_get_clean(); } if (!self::current_user_can_access_project($project_id)) { echo '

'.esc_html(self::t('common.project_not_found','Project not found or you do not have access.')).'

'; return ob_get_clean(); } // Remember last project for quick-return workflows. self::set_last_project_id($project_id); // Single project/workspace bar (selector + samples) self::render_project_bar_frontend($project_id, []); $project = get_post($project_id); $chapters = self::query_chapters($project_id); $publish_url = self::portal_url_with_context('publish', ['project_id' => (int) $project_id]); $word_count = 0; foreach ($chapters as $ch) { $word_count += str_word_count(wp_strip_all_tags((string)$ch->post_content)); } // Overview block removed (it could display stale project info on Publish). $uid_plan = (int) get_current_user_id(); $plan_tier = \AIAAS\Entitlements::get_user_plan_tier($uid_plan); $is_studio = in_array($plan_tier, ['studio','whitelabel'], true); $is_pro_plus = in_array($plan_tier, ['pro','studio','whitelabel'], true); // FREE baseline cleanup: Publish Readiness Checklist and Page Numbering sections removed. // Formatting & Layout (Publish) — removed in FREE baseline $formatting_block = ''; // Layout note: // Avoid relying on inline