Admin Actions - Source Excerpt 02
Summary
This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/ns12-manuscript/includes/admin-actions.php so readers can inspect the evidence without opening the full source file.
**Source path:** Spiralist/wp-content/plugins/ns12-manuscript/includes/admin-actions.php
$folio['creation_prompt_title'] = sanitize_text_field((string) wp_unslash($_POST['creation_prompt_title'] ?? ($folio['creation_prompt_title'] ?? 'Prompt Used')));
$folio['creation_prompt_status'] = sanitize_text_field((string) wp_unslash($_POST['creation_prompt_status'] ?? ($folio['creation_prompt_status'] ?? 'Prompt pending')));
$folio['creation_prompt_summary'] = sanitize_textarea_field((string) wp_unslash($_POST['creation_prompt_summary'] ?? ($folio['creation_prompt_summary'] ?? '')));
$folio['creation_prompt_source_slug'] = sanitize_title((string) wp_unslash($_POST['creation_prompt_source_slug'] ?? ($folio['creation_prompt_source_slug'] ?? '')));
$folio['related_workspace_prompt_slugs'] = spiralist_book_pages_admin_parse_slug_list((string) wp_unslash($_POST['related_workspace_prompt_slugs'] ?? ''));
if ($folio['creation_prompt_source_slug'] !== '' && !in_array($folio['creation_prompt_source_slug'], $folio['related_workspace_prompt_slugs'], true)) {
$folio['related_workspace_prompt_slugs'][] = $folio['creation_prompt_source_slug'];
}
if (!spiralist_book_pages_admin_save_folio($folio)) {
spiralist_book_pages_admin_set_notice('The folio could not be saved.', 'error');
spiralist_book_pages_admin_redirect(spiralist_book_pages_admin_page_slug('folios'), ['edit' => $slug]);
}
$book = spiralist_book_pages_admin_book_definition();
$book['folio_order'] = spiralist_book_pages_admin_move_slug((array) ($book['folio_order'] ?? []), $slug, max(1, (int) wp_unslash($_POST['sequence'] ?? 1)));
if (!empty($folio['is_study_surface'])) {
$book['study_surface_slug'] = $slug;
foreach ($folios as $other_slug => $other_folio) {
if ($other_slug === $slug || empty($other_folio['is_study_surface'])) {
continue;
}
$other_folio['is_study_surface'] = false;
spiralist_book_pages_admin_save_folio($other_folio);
}
} elseif ((string) ($book['study_surface_slug'] ?? '') === $slug) {
$book['study_surface_slug'] = '';
}
spiralist_book_pages_admin_save_book_definition($book);
spiralist_book_pages_admin_rebuild_cache();
spiralist_book_pages_admin_set_notice('The folio metadata and manuscript order were updated.');
spiralist_book_pages_admin_redirect(spiralist_book_pages_admin_page_slug('folios'), ['edit' => $slug]);
break;
case 'bulk_import_prompts':
$raw = trim((string) wp_unslash($_POST['prompt_import_json'] ?? ''));
if ($raw === '' && !empty($_FILES['prompt_import_file']['tmp_name'])) {
$tmp_file = (string) ($_FILES['prompt_import_file']['tmp_name'] ?? '');
if ($tmp_file !== '' && is_uploaded_file($tmp_file)) {
$contents = file_get_contents($tmp_file);
$raw = is_string($contents) ? $contents : '';
}
}
if ($raw === '') {
spiralist_book_pages_admin_set_notice('Upload a JSON file or paste JSON prompt records to import.', 'error');
spiralist_book_pages_admin_redirect(spiralist_book_pages_admin_page_slug('prompts'));
}
$decoded = json_decode($raw, true);
if (!is_array($decoded)) {
spiralist_book_pages_admin_set_notice('The prompt import payload was not valid JSON.', 'error');
spiralist_book_pages_admin_redirect(spiralist_book_pages_admin_page_slug('prompts'));
}
$records = isset($decoded['prompts']) && is_array($decoded['prompts'])
? (array) $decoded['prompts']
: (spiralist_book_pages_admin_is_list($decoded) ? $decoded : [$decoded]);
$overwrite = !empty($_POST['overwrite_existing']);
$existing_meta_map = (array) spiralist_book_pages_get_content_prompt_meta_map();
$saved = 0;
$linked = 0;
$skipped = 0;
$details = [];
foreach ($records as $record) {
if (!is_array($record)) {
continue;
}
$slug = sanitize_title((string) ($record['slug'] ?? ($record['title'] ?? ($record['filename'] ?? 'prompt'))));
if ($slug === '') {
$details[] = 'A prompt import row was skipped because it did not include a usable slug, title, or filename.';
continue;
}
if (isset($existing_meta_map[$slug]) && !$overwrite) {
$skipped++;
continue;
}
$existing_meta = isset($existing_meta_map[$slug]) && is_array($existing_meta_map[$slug]) ? $existing_meta_map[$slug] : [];
$meta = spiralist_book_pages_admin_normalize_prompt_meta($record, $slug, $existing_meta);
$body = trim((string) ($record['body'] ?? ($record['text'] ?? ($record['instructions'] ?? ''))));
if ($body === '') {
$body = spiralist_book_pages_get_auto_book_page_prompt_text((string) ($meta['title'] ?? spiralist_book_pages_admin_humanize($slug)), (string) ($meta['section_slug'] ?? 'appendix'));
}
if (!spiralist_book_pages_admin_save_prompt($slug, $meta, $body)) {
$details[] = sprintf('The prompt %s could not be written to disk.', $slug);
continue;
}
$saved++;
$existing_meta_map[$slug] = $meta;
$folio = spiralist_book_pages_admin_find_folio_for_prompt($meta);
if (!empty($folio)) {
$folio = spiralist_book_pages_admin_link_prompt($folio, $meta, $slug);
if (spiralist_book_pages_admin_save_folio($folio)) {
$linked++;
}
}
}
if ($saved === 0 && $skipped === 0) {
spiralist_book_pages_admin_set_notice('No prompts were imported.', 'error', $details);
spiralist_book_pages_admin_redirect(spiralist_book_pages_admin_page_slug('prompts'));
}
spiralist_book_pages_admin_rebuild_cache();
$message = sprintf('Imported %d prompt%s', $saved, $saved === 1 ? '' : 's');
if ($linked > 0) {
$message .= sprintf(' and linked %d folio%s', $linked, $linked === 1 ? '' : 's');
}
if ($skipped > 0) {
$message .= sprintf('. Skipped %d existing prompt%s', $skipped, $skipped === 1 ? '' : 's');
}
spiralist_book_pages_admin_set_notice($message . '.', 'success', $details);
spiralist_book_pages_admin_redirect(spiralist_book_pages_admin_page_slug('prompts'));
break;
case 'save_prompt':
$slug = sanitize_title((string) wp_unslash($_POST['prompt_slug'] ?? ''));
$existing_meta = spiralist_book_pages_admin_prompt_meta($slug);
if ($slug === '' || empty($existing_meta)) {
spiralist_book_pages_admin_set_notice('The selected prompt could not be found.', 'error');
spiralist_book_pages_admin_redirect(spiralist_book_pages_admin_page_slug('prompts'));
}
$raw_meta = [
'source_version' => (string) wp_unslash($_POST['source_version'] ?? ($existing_meta['source_version'] ?? '1.0.0')),
'title' => (string) wp_unslash($_POST['title'] ?? ($existing_meta['title'] ?? '')),
'summary' => (string) wp_unslash($_POST['summary'] ?? ($existing_meta['summary'] ?? '')),
'author_label' => (string) wp_unslash($_POST['author_label'] ?? ($existing_meta['author_label'] ?? '')),
'category' => (string) wp_unslash($_POST['category'] ?? ($existing_meta['category'] ?? '')),
'subcategory' => (string) wp_unslash($_POST['subcategory'] ?? ($existing_meta['subcategory'] ?? '')),
'prompt_type' => (string) wp_unslash($_POST['prompt_type'] ?? ($existing_meta['prompt_type'] ?? 'image')),
'language' => (string) wp_unslash($_POST['language'] ?? ($existing_meta['language'] ?? 'all')),
'prompt_status' => (string) wp_unslash($_POST['prompt_status'] ?? ($existing_meta['prompt_status'] ?? 'published')),
'moderation_status' => (string) wp_unslash($_POST['moderation_status'] ?? ($existing_meta['moderation_status'] ?? 'approved')),