Skip to content
wiki.fftac.org

Comments - Source Excerpt 01

Back to Comments

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.');