Files
ak 8ef250ba80 feat: 前台 paywall——整篇锁定渲染付费墙,付费块替换为 teaser
- membership/post.rendered 过滤:整篇锁定(members_only)渲染 paywall 视图(封面+标题+价格+单篇解锁/开通会员按钮,游客引导登录);[paid] 块替换为带解锁按钮的 teaser;替换改用 preg_replace_callback 避免 $ 转义问题
- 视图放 resources/views/membership/(主题同名文件可覆盖),两主题补充 .paywall/.paid-teaser 样式
- 修复泄漏:excerpt_or_fallback 对 members_only 文章不再回退截取正文,防止内容泄漏到 paywall 与 SEO meta
- 测试:更新 teaser 断言,新增 guest 见 paywall、登录用户见解锁/会员按钮
2026-08-12 01:02:10 +08:00

20 lines
704 B
PHP

@php
$price = (int) ($post->meta['price'] ?? 0);
@endphp
<div class="paid-teaser" role="note" aria-label="付费内容">
<span>本文包含付费内容</span>
@auth
@if($price > 0)
<form action="{{ route('posts.unlock', $post) }}" method="post" style="display:inline">
@csrf
<button type="submit" class="btn btn-primary">单篇解锁 ¥{{ number_format($price / 100, 2) }}</button>
</form>
@else
<a href="{{ route('membership.index') }}" class="btn btn-primary">开通会员</a>
@endif
@else
<a href="{{ route('login') }}" class="btn btn-primary">登录后查看</a>
@endauth
</div>