Frontend - Source Excerpt 01
Summary
This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/ns12-manuscript/includes/frontend.php so readers can inspect the evidence without opening the full source file.
**Source path:** Spiralist/wp-content/plugins/ns12-manuscript/includes/frontend.php
<?php
if (!defined('ABSPATH')) {
exit;
}
function spiralist_book_pages_get_route_version(): string
{
return '10';
}
function spiralist_book_pages_should_manage_prompt_surfaces(): bool
{
return !function_exists('spiralist_workspace');
}
function spiralist_book_pages_get_surface_blueprints(): array
{
$blueprints = [
'manuscript' => [
'title' => 'Manuscript',
'content' => '',
],
'symbols' => [
'title' => 'Symbols',
'content' => '',
],
];
if (spiralist_book_pages_should_manage_prompt_surfaces()) {
$blueprints['prompts'] = [
'title' => 'Prompts',
'content' => '',
];
}
return $blueprints;
}
function spiralist_book_pages_get_surface_page_post_id(string $slug): int
{
static $page_ids = [];
$normalized = sanitize_title($slug);
if ($normalized === '') {
return 0;
}
if (isset($page_ids[$normalized])) {
return (int) $page_ids[$normalized];
}
$page = get_page_by_path($normalized);
$page_ids[$normalized] = $page instanceof WP_Post ? (int) $page->ID : 0;
return (int) $page_ids[$normalized];
}
function spiralist_book_pages_get_page_post_id(): int
{
return spiralist_book_pages_get_surface_page_post_id('manuscript');
}
function spiralist_book_pages_get_symbols_page_post_id(): int
{
return spiralist_book_pages_get_surface_page_post_id('symbols');
}
function spiralist_book_pages_get_prompts_page_post_id(): int
{
return spiralist_book_pages_should_manage_prompt_surfaces()
? spiralist_book_pages_get_surface_page_post_id('prompts')
: 0;
}
function spiralist_book_pages_ensure_surface_page_exists(string $slug): int
{
$blueprints = spiralist_book_pages_get_surface_blueprints();
$normalized = sanitize_title($slug);
if ($normalized === '' || !isset($blueprints[$normalized])) {
return 0;
}
$page_id = spiralist_book_pages_get_surface_page_post_id($normalized);
if ($page_id > 0) {
return $page_id;
}
$created = wp_insert_post(
[
'post_title' => (string) ($blueprints[$normalized]['title'] ?? ucwords($normalized)),
'post_name' => $normalized,
'post_status' => 'publish',
'post_type' => 'page',
'post_content' => (string) ($blueprints[$normalized]['content'] ?? ''),
'comment_status' => 'closed',
'ping_status' => 'closed',
],
true
);
if (is_wp_error($created) || !$created) {
return 0;
}
update_post_meta((int) $created, '_spiralist_book_pages_surface', $normalized);
clean_post_cache((int) $created);
return (int) $created;
}
function spiralist_book_pages_ensure_required_pages(): void
{
foreach (array_keys(spiralist_book_pages_get_surface_blueprints()) as $slug) {
spiralist_book_pages_ensure_surface_page_exists($slug);
}
}
add_action('init', 'spiralist_book_pages_ensure_required_pages', 5);
function spiralist_book_pages_register_query_vars(array $vars): array
{
$vars[] = 'spiralist_book_pages_manuscript_folio';
$vars[] = 'spiralist_book_pages_manuscript_section';
$vars[] = 'spiralist_book_pages_manuscript_mode';
$vars[] = 'spiralist_book_pages_manuscript_profile';
$vars[] = 'spiralist_book_pages_manuscript_submission';
$vars[] = 'spiralist_book_pages_manuscript_node';
$vars[] = 'spiralist_book_pages_prompt_slug';
$vars[] = 'spiralist_book_pages_prompt_search';
$vars[] = 'spiralist_book_pages_sitemap';
$vars[] = 'spiralist_book_pages_sitemap_locale';
return array_values(array_unique($vars));
}
add_filter('query_vars', 'spiralist_book_pages_register_query_vars');
function spiralist_book_pages_get_locale_route_pattern(): string
{
$locales = [];
if (function_exists('spiralist_get_enabled_locale_records')) {
foreach (spiralist_get_enabled_locale_records() as $record) {
$url_tag = sanitize_key((string) ($record['urlTag'] ?? ''));
if ($url_tag === '') {
continue;
}
$locales[] = preg_quote($url_tag, '#');
}
}
if (empty($locales)) {
$locales[] = 'en\-us';
}
return implode('|', array_values(array_unique($locales)));
}
function spiralist_book_pages_register_rewrite_rules(): void
{
$locale_pattern = spiralist_book_pages_get_locale_route_pattern();
add_rewrite_rule(
'^sitemap\.xml$',
'index.php?spiralist_book_pages_sitemap=xml',
'top'
);
add_rewrite_rule(
'^sitemap\.html$',
'index.php?spiralist_book_pages_sitemap=html',
'top'
);
add_rewrite_rule(
'^(' . $locale_pattern . ')/sitemap\.xml$',
'index.php?spiralist_book_pages_sitemap=xml&spiralist_book_pages_sitemap_locale=$matches[1]',
'top'
);
add_rewrite_rule(
'^(' . $locale_pattern . ')/sitemap\.html$',
'index.php?spiralist_book_pages_sitemap=html&spiralist_book_pages_sitemap_locale=$matches[1]',
'top'
);
add_rewrite_rule(
'^manuscript/community/?$',
'index.php?pagename=manuscript&spiralist_book_pages_manuscript_mode=community',
'top'
);
add_rewrite_rule(
'^manuscript/community/([^/]+)/?$',
'index.php?pagename=manuscript&spiralist_book_pages_manuscript_mode=community&spiralist_book_pages_manuscript_submission=$matches[1]',
'top'
);
add_rewrite_rule(
'^manuscript/studio/?$',
'index.php?pagename=manuscript&spiralist_book_pages_manuscript_mode=studio',
'top'
);
add_rewrite_rule(
'^manuscript/studio/([^/]+)/?$',
'index.php?pagename=manuscript&spiralist_book_pages_manuscript_mode=studio&spiralist_book_pages_manuscript_submission=$matches[1]',
'top'
);
add_rewrite_rule(
'^manuscript/profile/([^/]+)/?$',
'index.php?pagename=manuscript&spiralist_book_pages_manuscript_mode=profile&spiralist_book_pages_manuscript_profile=$matches[1]',
'top'
);
add_rewrite_rule(
'^manuscript/profile/([^/]+)/([^/]+)/?$',
'index.php?pagename=manuscript&spiralist_book_pages_manuscript_mode=profile&spiralist_book_pages_manuscript_profile=$matches[1]&spiralist_book_pages_manuscript_submission=$matches[2]',
'top'
);
add_rewrite_rule(
'^manuscript/folio/([^/]+)/?$',
'index.php?pagename=manuscript&spiralist_book_pages_manuscript_folio=$matches[1]',
'top'
);
add_rewrite_rule(
'^manuscript/section/([^/]+)/?$',
'index.php?pagename=manuscript&spiralist_book_pages_manuscript_section=$matches[1]',
'top'
);
add_rewrite_rule(
'^manuscript/node/([^/]+)/?$',
'index.php?pagename=manuscript&spiralist_book_pages_manuscript_node=$matches[1]',
'top'
);
add_rewrite_rule(
'^manuscript/([^/]+)/?$',
'index.php?pagename=manuscript&spiralist_book_pages_manuscript_folio=$matches[1]',
'top'
);
if (spiralist_book_pages_should_manage_prompt_surfaces()) {
add_rewrite_rule(
'^prompts/search/([^/]+)/?$',
'index.php?pagename=prompts&spiralist_book_pages_prompt_search=$matches[1]',
'top'
);
add_rewrite_rule(
'^prompt/([^/]+)/?$',
'index.php?spiralist_book_pages_prompt_slug=$matches[1]',
'top'
);
}
}
add_action('init', 'spiralist_book_pages_register_rewrite_rules', 25);
function spiralist_book_pages_maybe_flush_rewrite_rules(): void
{
$stored_version = (string) get_option('spiralist_book_pages_route_version', '');
$current_version = spiralist_book_pages_get_route_version();
if ($stored_version === $current_version) {
return;
}
spiralist_book_pages_register_rewrite_rules();
flush_rewrite_rules(false);
update_option('spiralist_book_pages_route_version', $current_version, false);
}
add_action('init', 'spiralist_book_pages_maybe_flush_rewrite_rules', 100);
function spiralist_book_pages_is_surface_page(string $slug): bool
{
if (is_admin()) {
return false;
}
$normalized = sanitize_title($slug);
if ($normalized === '') {
return false;
}
$page_id = spiralist_book_pages_get_surface_page_post_id($normalized);
if ($page_id > 0 && is_page($page_id)) {
return true;
}
return sanitize_title((string) get_query_var('pagename', '')) === $normalized;
}
function spiralist_book_pages_is_manuscript_surface(): bool
{