Skip to content
wiki.fftac.org

Comments - Source Excerpt 02

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

}

function spiralist_book_pages_get_discussion_comments(array $context): array
{
    $host_post_id = max(0, (int) ($context['host_post_id'] ?? 0));
    $thread_key = (string) ($context['thread_key'] ?? '');

    if ($host_post_id <= 0 || $thread_key === '') {
        return [];
    }

    return get_comments(
        [
            'post_id' => $host_post_id,
            'status' => 'approve',
            'type' => spiralist_book_pages_get_discussion_comment_type(),
            'orderby' => 'comment_date_gmt',
            'order' => 'ASC',
            'number' => 200,
            'meta_query' => [
                [
                    'key' => spiralist_book_pages_get_discussion_thread_meta_key(),
                    'value' => $thread_key,
                ],
            ],
        ]
    );
}

function spiralist_book_pages_render_discussion_panel(array $context = []): void
{
    $thread_key = (string) ($context['thread_key'] ?? '');
    $redirect_url = (string) ($context['redirect_url'] ?? '');
    if ($thread_key === '' || $redirect_url === '') {
        return;
    }

    $anchor = spiralist_book_pages_get_discussion_anchor();
    $comments = is_user_logged_in() ? spiralist_book_pages_get_discussion_comments($context) : [];
    $notice = spiralist_book_pages_get_discussion_notice($context);
    $comment_count = count($comments);
    $login_target = (string) ($context['login_url'] ?? $redirect_url);
    $login_url = wp_login_url($login_target . '#' . $anchor);
    $current_user = wp_get_current_user();
    ?>
    <section class="spiralist-manuscript-discussion" id="<?php echo esc_attr($anchor); ?>" aria-labelledby="<?php echo esc_attr($anchor); ?>-title">
        <div class="spiralist-manuscript-discussion__header">
            <div>
                <p class="spiralist-section-tag"><?php echo esc_html((string) ($context['eyebrow'] ?? 'Logged-In Discussion')); ?></p>
                <h2 class="spiralist-card-title" id="<?php echo esc_attr($anchor); ?>-title"><?php echo esc_html((string) ($context['title'] ?? 'Manuscript Discussion')); ?></h2>
                <p class="spiralist-muted"><?php echo esc_html((string) ($context['summary'] ?? 'Comments on this manuscript surface are only visible to signed-in users.')); ?></p>
            </div>
            <?php if (is_user_logged_in()) : ?>
                <span class="spiralist-manuscript-discussion__count">
                    <?php echo esc_html(sprintf('%d comment%s', $comment_count, $comment_count === 1 ? '' : 's')); ?>
                </span>
            <?php endif; ?>
        </div>

        <?php if (!empty($notice['message'])) : ?>
            <div class="spiralist-manuscript-discussion__notice spiralist-manuscript-discussion__notice--<?php echo esc_attr((string) ($notice['type'] ?? 'success') === 'error' ? 'error' : 'success'); ?>">
                <p><?php echo esc_html((string) $notice['message']); ?></p>
            </div>
        <?php endif; ?>

        <?php if (!is_user_logged_in()) : ?>
            <div class="spiralist-manuscript-discussion__gate">
                <p>Sign in to view and join this manuscript discussion.</p>
                <a class="spiralist-button spiralist-button--secondary" href="<?php echo esc_url($login_url); ?>">Sign In To Comment</a>
            </div>
        <?php else : ?>
            <div class="spiralist-manuscript-discussion__composer">
                <div class="spiralist-manuscript-discussion__identity">
                    <?php echo get_avatar($current_user->ID, 52); ?>
                    <div>
                        <strong><?php echo esc_html((string) ($current_user->display_name ?: $current_user->user_login)); ?></strong>
                        <span>Comments on manuscript surfaces are visible only while readers are signed in.</span>
                    </div>
                </div>

                <form class="spiralist-manuscript-discussion__form" method="post" action="<?php echo esc_url(admin_url('admin-post.php')); ?>">
                    <input type="hidden" name="action" value="spiralist_book_pages_frontend_comment_action" />
                    <input type="hidden" name="redirect_to" value="<?php echo esc_url($redirect_url); ?>" />
                    <?php foreach ((array) ($context['form_fields'] ?? []) as $field_name => $field_value) : ?>
                        <input type="hidden" name="<?php echo esc_attr((string) $field_name); ?>" value="<?php echo esc_attr((string) $field_value); ?>" />
                    <?php endforeach; ?>
                    <?php wp_nonce_field('spiralist_book_pages_frontend_comment'); ?>
                    <label>
                        <span class="screen-reader-text">Add a manuscript comment</span>
                        <textarea name="comment_content" rows="4" maxlength="5000" placeholder="Add your comment about this manuscript page..." required></textarea>
                    </label>
                    <div class="spiralist-manuscript-discussion__form-actions">
                        <button class="spiralist-button spiralist-button--primary" type="submit"><?php echo esc_html((string) ($context['submit_label'] ?? 'Post Comment')); ?></button>
                    </div>
                </form>
            </div>

            <?php if (empty($comments)) : ?>
                <div class="spiralist-manuscript-discussion__empty">
                    <p><?php echo esc_html((string) ($context['empty_label'] ?? 'No comments yet.')); ?></p>
                </div>
            <?php else : ?>
                <div class="spiralist-manuscript-discussion__list">
                    <?php foreach ($comments as $comment) : ?>
                        <?php
                        $comment_author = get_comment_author($comment);
                        $comment_date = get_comment_date('F j, Y g:i a', $comment);
                        ?>
                        <article class="spiralist-manuscript-discussion__item">
                            <div class="spiralist-manuscript-discussion__avatar">
                                <?php echo get_avatar((int) $comment->user_id, 48); ?>
                            </div>
                            <div class="spiralist-manuscript-discussion__body">
                                <div class="spiralist-manuscript-discussion__meta">
                                    <strong><?php echo esc_html($comment_author !== '' ? $comment_author : 'Reader'); ?></strong>
                                    <span><?php echo esc_html($comment_date); ?></span>
                                </div>
                                <div class="spiralist-manuscript-discussion__content">
                                    <?php echo wp_kses_post(wpautop((string) $comment->comment_content)); ?>
                                </div>
                            </div>
                        </article>
                    <?php endforeach; ?>
                </div>
            <?php endif; ?>
        <?php endif; ?>
    </section>
    <?php
}

function spiralist_book_pages_handle_frontend_comment_action(): void
{
    if (!is_user_logged_in()) {
        auth_redirect();
    }

    check_admin_referer('spiralist_book_pages_frontend_comment');

    $context = spiralist_book_pages_resolve_discussion_context_from_request($_POST);
    $fallback_url = spiralist_book_pages_get_discussion_fallback_url();

    if (is_wp_error($context)) {
        wp_safe_redirect($fallback_url . '#' . spiralist_book_pages_get_discussion_anchor());
        exit;
    }

    $thread_key = (string) ($context['thread_key'] ?? '');
    $redirect_url = (string) ($context['redirect_url'] ?? $fallback_url);
    $host_post_id = max(0, (int) ($context['host_post_id'] ?? 0));
    $content = (string) wp_unslash($_POST['comment_content'] ?? '');
    $plain_content = trim(preg_replace('/\s+/', ' ', wp_strip_all_tags($content)));

    if ($thread_key === '' || $host_post_id <= 0) {
        wp_safe_redirect($fallback_url . '#' . spiralist_book_pages_get_discussion_anchor());
        exit;
    }

    if ($plain_content === '') {
        spiralist_book_pages_set_discussion_notice($thread_key, 'Write a comment before posting.', 'error');
        wp_safe_redirect($redirect_url . '#' . spiralist_book_pages_get_discussion_anchor());
        exit;
    }

    $content_length = function_exists('mb_strlen') ? mb_strlen($plain_content) : strlen($plain_content);
    if ($content_length > 5000) {
        spiralist_book_pages_set_discussion_notice($thread_key, 'Comments must stay under 5000 characters.', 'error');
        wp_safe_redirect($redirect_url . '#' . spiralist_book_pages_get_discussion_anchor());
        exit;
    }

    $user = wp_get_current_user();
    $comment_id = wp_insert_comment(
        [