diff --git a/app/Models/Post.php b/app/Models/Post.php index 674dea6..bc9cee7 100644 --- a/app/Models/Post.php +++ b/app/Models/Post.php @@ -126,6 +126,11 @@ class Post extends Model implements HasMedia return $this->excerpt; } + // 会员专享文章不落入内容摘要,避免泄漏到 paywall/SEO meta + if (! empty(($this->meta ?? [])['members_only'])) { + return ''; + } + $text = strip_tags($this->content); // 付费块不进入摘要,避免付费内容泄漏到列表页/SEO meta $text = preg_replace('/\[paid\].*?\[\/paid\]/s', '', $text); diff --git a/plugins/neatstudio.membership/src/ServiceProvider.php b/plugins/neatstudio.membership/src/ServiceProvider.php index 88caffe..c3f75ea 100644 --- a/plugins/neatstudio.membership/src/ServiceProvider.php +++ b/plugins/neatstudio.membership/src/ServiceProvider.php @@ -53,21 +53,21 @@ class ServiceProvider extends PluginServiceProvider } }, 10); - // 付费文章:[paid]...[/paid] 对无权限访客隐藏 + // 付费文章:[paid]...[/paid] 对无权限访客隐藏为 teaser;整篇锁定渲染 paywall $manager->addFilter('post.rendered', function (string $html, \App\Models\Post $post) { $service = app(Services\MembershipService::class); $user = auth()->user(); if (preg_match('/\[paid\](.*?)\[\/paid\]/s', $html) && ! $service->canReadPaidContent($user, $post)) { - $html = preg_replace( + $html = preg_replace_callback( '/\[paid\](.*?)\[\/paid\]/s', - '
', + fn () => view('membership.paid-teaser', ['post' => $post])->render(), $html ); } if (! $service->canReadPost($user, $post)) { - return ''; + return view('membership.paywall', ['post' => $post])->render(); } return $html; diff --git a/resources/views/membership/paid-teaser.blade.php b/resources/views/membership/paid-teaser.blade.php new file mode 100644 index 0000000..2a75455 --- /dev/null +++ b/resources/views/membership/paid-teaser.blade.php @@ -0,0 +1,19 @@ +@php + $price = (int) ($post->meta['price'] ?? 0); +@endphp + + diff --git a/resources/views/membership/paywall.blade.php b/resources/views/membership/paywall.blade.php new file mode 100644 index 0000000..a0bc9ef --- /dev/null +++ b/resources/views/membership/paywall.blade.php @@ -0,0 +1,52 @@ +@php + $service = app(\Plugins\Neatstudio\Membership\Services\MembershipService::class); + $user = auth()->user(); + $isMember = $user && $service->isMember($user); + $price = (int) ($post->meta['price'] ?? 0); + $plansExist = \Plugins\Neatstudio\Membership\Models\MembershipPlan::query()->where('active', true)->exists(); +@endphp + +{{ $post->excerpt_or_fallback }}
+ @endif + + @if($price > 0) +单篇解锁 ¥{{ number_format($price / 100, 2) }}
+ @endif + ++ @if($isMember) + 你是会员,本文可直接阅读。 + @else + 本文为{{ $price > 0 ? '付费内容' : '会员专享内容' }},解锁或开通会员后可阅读全文。 + @endif +
+ + +