Comments - Source Excerpt 02
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(
[