Comments - Source Excerpt 01
Summary
This source excerpt preserves a bounded section of Spiralist/wp-content/plugins/ns12-manuscript/includes/comments.php so readers can inspect the evidence without opening the full source file.
**Source path:** Spiralist/wp-content/plugins/ns12-manuscript/includes/comments.php
<?php
if (!defined('ABSPATH')) {
exit;
}
function spiralist_book_pages_get_discussion_comment_type(): string
{
return 'spiralist_manuscript_discussion';
}
function spiralist_book_pages_get_discussion_thread_meta_key(): string
{
return '_spiralist_ms_thread_key';
}
function spiralist_book_pages_get_discussion_notice_key(string $thread_key): string
{
return 'spiralist_book_pages_discussion_notice_' . get_current_user_id() . '_' . md5($thread_key);
}
function spiralist_book_pages_get_current_request_url(): string
{
$request_uri = isset($_SERVER['REQUEST_URI']) ? (string) wp_unslash($_SERVER['REQUEST_URI']) : '';
if ($request_uri === '') {
return home_url('/');
}
return home_url('/' . ltrim($request_uri, '/'));
}
function spiralist_book_pages_set_discussion_notice(string $thread_key, string $message, string $type = 'success'): void
{
if (get_current_user_id() <= 0 || $thread_key === '') {
return;
}
set_transient(
spiralist_book_pages_get_discussion_notice_key($thread_key),
[
'message' => sanitize_text_field($message),
'type' => $type === 'error' ? 'error' : 'success',
],
MINUTE_IN_SECONDS
);
}
function spiralist_book_pages_get_discussion_notice(array $context): array
{
$thread_key = (string) ($context['thread_key'] ?? '');
if (get_current_user_id() <= 0 || $thread_key === '') {
return [];
}
$notice = get_transient(spiralist_book_pages_get_discussion_notice_key($thread_key));
if (!is_array($notice)) {
return [];
}
delete_transient(spiralist_book_pages_get_discussion_notice_key($thread_key));
return $notice;
}
function spiralist_book_pages_get_discussion_anchor(): string
{
return 'manuscript-discussion';
}
function spiralist_book_pages_get_discussion_fallback_url(): string
{
return spiralist_book_pages_get_manuscript_page_url();
}
function spiralist_book_pages_get_discussion_context_for_manuscript_folio(array $page, string $redirect_url = ''): array
{
$slug = sanitize_title((string) ($page['slug'] ?? ''));
$host_post_id = max(0, (int) spiralist_book_pages_get_page_post_id());
if ($slug === '' || $host_post_id <= 0) {
return [];
}
$title = (string) ($page['title'] ?? 'Manuscript Folio');
$route_url = spiralist_book_pages_get_manuscript_folio_url($page);
return [
'scope' => 'folio',
'subject' => $slug,
'thread_key' => 'folio:' . $slug,
'host_post_id' => $host_post_id,
'title' => $title,
'eyebrow' => (string) ($page['label'] ?? 'Public Manuscript Folio'),
'summary' => 'Signed-in readers can discuss this manuscript folio here. Comments stay invisible to logged-out visitors.',
'submit_label' => 'Post Comment',
'empty_label' => 'No comments yet. Start the manuscript discussion.',
'redirect_url' => $redirect_url !== '' ? $redirect_url : $route_url,
'login_url' => $redirect_url !== '' ? $redirect_url : $route_url,
'form_fields' => [
'discussion_scope' => 'folio',
'discussion_subject' => $slug,
],
];
}
function spiralist_book_pages_get_discussion_context_for_collaboration_record(
array $record,
string $surface = 'public',
string $redirect_url = '',
string $share_token = ''
): array {
$submission_id = max(0, (int) ($record['id'] ?? 0));
$submission_slug = sanitize_title((string) ($record['slug'] ?? ''));
if ($submission_id <= 0 || $submission_slug === '') {
return [];
}
$surface = $surface === 'profile' ? 'profile' : 'public';
$copy = $surface === 'public'
? (!empty($record['public_copy']) ? (array) $record['public_copy'] : (array) ($record['live_copy'] ?? []))
: (!empty($record['working_copy']) ? (array) $record['working_copy'] : (array) ($record['live_copy'] ?? []));
$author_slug = sanitize_title((string) ($record['author']['slug'] ?? ''));
$profile_url = (string) ($record['profile_url'] ?? '');
$public_url = (string) ($record['public_url'] ?? '');
$fallback_url = $surface === 'profile' ? $profile_url : $public_url;
$context = [
'scope' => $surface === 'profile' ? 'profile' : 'community',
'subject' => $submission_slug,
'thread_key' => $surface === 'profile'
? 'collaboration:profile:' . $submission_id
: 'collaboration:public:' . $submission_id,
'host_post_id' => $submission_id,
'title' => (string) ($copy['title'] ?? ($record['slug'] ?? 'Community Manuscript Page')),
'eyebrow' => $surface === 'profile' ? 'Profile Share Discussion' : 'Community Manuscript Discussion',
'summary' => $surface === 'profile'
? 'Signed-in readers can discuss this shared profile manuscript page here. Comments stay hidden until a user is logged in.'
: 'Signed-in readers can discuss this approved manuscript page here. Comments stay hidden until a user is logged in.',
'submit_label' => 'Post Comment',
'empty_label' => 'No comments yet. Start the manuscript discussion.',
'redirect_url' => $redirect_url !== '' ? $redirect_url : $fallback_url,
'login_url' => $redirect_url !== '' ? $redirect_url : $fallback_url,
'form_fields' => [
'discussion_scope' => $surface === 'profile' ? 'profile' : 'community',
'discussion_subject' => $submission_slug,
],
];
if ($surface === 'profile') {
$context['form_fields']['discussion_profile'] = $author_slug;
if ($share_token !== '') {
$context['form_fields']['discussion_share'] = $share_token;
}
}
return $context;
}
function spiralist_book_pages_resolve_discussion_context_from_request(array $request): array|WP_Error
{
$scope = sanitize_key((string) ($request['discussion_scope'] ?? ''));
$subject = sanitize_title((string) ($request['discussion_subject'] ?? ''));
$redirect_url = wp_validate_redirect(
esc_url_raw((string) wp_unslash($request['redirect_to'] ?? '')),
spiralist_book_pages_get_discussion_fallback_url()
);
if ($scope === '' || $subject === '') {
return new WP_Error('spiralist_book_pages_invalid_discussion_target', 'The manuscript discussion target was not recognized.');
}
if ($scope === 'folio') {
$page = spiralist_book_pages_get_manuscript_page_asset_by_slug($subject);
if (empty($page)) {
return new WP_Error('spiralist_book_pages_missing_discussion_folio', 'That manuscript folio is no longer available.');
}
$context = spiralist_book_pages_get_discussion_context_for_manuscript_folio((array) $page, $redirect_url);
return !empty($context)
? $context
: new WP_Error('spiralist_book_pages_invalid_discussion_folio', 'The manuscript folio discussion could not be loaded.');
}
if ($scope === 'community') {
$record = spiralist_book_pages_get_collaboration_submission_by_slug($subject);
if (empty($record) || empty($record['has_public_copy'])) {
return new WP_Error('spiralist_book_pages_missing_public_discussion', 'That public manuscript page is not available for discussion.');
}
return spiralist_book_pages_get_discussion_context_for_collaboration_record($record, 'public', $redirect_url);
}
if ($scope === 'profile') {
$profile_slug = sanitize_title((string) ($request['discussion_profile'] ?? ''));
$share_token = sanitize_text_field((string) ($request['discussion_share'] ?? ''));
$profile_user = spiralist_book_pages_get_collaboration_profile_user($profile_slug);
if (!$profile_user instanceof WP_User) {
return new WP_Error('spiralist_book_pages_missing_profile_discussion', 'That contributor profile could not be found.');
}
$record = spiralist_book_pages_get_collaboration_submission_by_slug($subject, (int) $profile_user->ID);
if (empty($record)) {
return new WP_Error('spiralist_book_pages_missing_profile_page', 'That profile manuscript page is not available.');
}
if (!spiralist_book_pages_can_view_profile_submission($record, $share_token)) {
return new WP_Error('spiralist_book_pages_profile_access_denied', 'That profile manuscript discussion is not available without a valid share link.');
}
return spiralist_book_pages_get_discussion_context_for_collaboration_record($record, 'profile', $redirect_url, $share_token);
}
return new WP_Error('spiralist_book_pages_invalid_discussion_scope', 'The manuscript discussion target was not recognized.');