diff --git a/src/Taxonomies/TermRepository.php b/src/Taxonomies/TermRepository.php index a0666211..118c17a4 100644 --- a/src/Taxonomies/TermRepository.php +++ b/src/Taxonomies/TermRepository.php @@ -5,9 +5,11 @@ use Statamic\Contracts\Taxonomies\Term as TermContract; use Statamic\Facades\Blink; use Statamic\Facades\Collection; +use Statamic\Facades\Entry; use Statamic\Facades\Taxonomy; use Statamic\Stache\Repositories\TermRepository as StacheRepository; use Statamic\Support\Str; +use Statamic\Taxonomies\LocalizedTerm; class TermRepository extends StacheRepository { @@ -131,4 +133,28 @@ protected function ensureAssociations() parent::ensureAssociations(); } + + public function entriesCount(TermContract $term, ?string $status = null): int + { + if (config('statamic.eloquent-driver.entries.driver', 'file') !== 'eloquent') { + return parent::entriesCount($term, $status); + } + + $query = Entry::query() + ->whereTaxonomy($term->taxonomyHandle().'::'.$term->inDefaultLocale()->slug()); + + if ($term instanceof LocalizedTerm) { + $query->where('site', $term->locale()); + } + + if ($collection = $term->collection()) { + $query->where('collection', $collection->handle()); + } + + if ($status) { + $query->whereStatus($status); + } + + return $query->count(); + } } diff --git a/tests/Terms/TermTest.php b/tests/Terms/TermTest.php index b1e5ac8d..f9737c15 100644 --- a/tests/Terms/TermTest.php +++ b/tests/Terms/TermTest.php @@ -84,6 +84,63 @@ public function it_gets_entry_count_for_term() $this->assertEquals(2, TermFacade::entriesCount($term)); } + #[Test] + public function it_gets_entry_count_for_term_filtered_by_status() + { + Taxonomy::make('test')->title('test')->save(); + + $term = tap(TermFacade::make('test-term')->taxonomy('test')->data([]))->save(); + + $collection = Collection::make('blog')->routes('blog/{slug}')->taxonomies(['test'])->save(); + + (new Entry)->id(1)->collection($collection)->data(['title' => 'Post 1', 'test' => ['test-term']])->slug('alfa')->published(true)->save(); + (new Entry)->id(2)->collection($collection)->data(['title' => 'Post 2', 'test' => ['test-term']])->slug('bravo')->published(false)->save(); + (new Entry)->id(3)->collection($collection)->data(['title' => 'Post 3', 'test' => ['test-term']])->slug('charlie')->published(false)->save(); + + $this->assertEquals(1, TermFacade::entriesCount($term, 'published')); + $this->assertEquals(2, TermFacade::entriesCount($term, 'draft')); + } + + #[Test] + public function it_gets_entry_count_for_term_scoped_to_collection() + { + Taxonomy::make('test')->title('test')->save(); + + $term = tap(TermFacade::make('test-term')->taxonomy('test')->data([]))->save(); + + $blog = Collection::make('blog')->routes('blog/{slug}')->taxonomies(['test'])->save(); + $news = Collection::make('news')->routes('news/{slug}')->taxonomies(['test'])->save(); + + (new Entry)->id(1)->collection($blog)->data(['title' => 'Blog 1', 'test' => ['test-term']])->slug('alfa')->save(); + (new Entry)->id(2)->collection($blog)->data(['title' => 'Blog 2', 'test' => ['test-term']])->slug('bravo')->save(); + (new Entry)->id(3)->collection($news)->data(['title' => 'News 1', 'test' => ['test-term']])->slug('charlie')->save(); + + $this->assertEquals(2, TermFacade::entriesCount(TermFacade::find('test::test-term')->collection($blog))); + $this->assertEquals(1, TermFacade::entriesCount(TermFacade::find('test::test-term')->collection($news))); + } + + #[Test] + public function it_gets_entry_count_for_term_filtered_by_site() + { + $this->setSites([ + 'en' => ['url' => '/', 'locale' => 'en_US', 'name' => 'English'], + 'fr' => ['url' => '/fr/', 'locale' => 'fr_FR', 'name' => 'French'], + ]); + + Taxonomy::make('test')->title('test')->sites(['en', 'fr'])->save(); + + $term = tap(TermFacade::make('test-term')->taxonomy('test')->data([]))->save(); + + $collection = Collection::make('blog')->routes('blog/{slug}')->taxonomies(['test'])->sites(['en', 'fr'])->save(); + + (new Entry)->id(1)->collection($collection)->locale('en')->data(['title' => 'Post 1', 'test' => ['test-term']])->slug('alfa')->save(); + (new Entry)->id(2)->collection($collection)->locale('en')->data(['title' => 'Post 2', 'test' => ['test-term']])->slug('bravo')->save(); + (new Entry)->id(3)->collection($collection)->locale('fr')->data(['title' => 'Post 3', 'test' => ['test-term']])->slug('charlie')->save(); + + $this->assertEquals(2, TermFacade::entriesCount($term->in('en'))); + $this->assertEquals(1, TermFacade::entriesCount($term->in('fr'))); + } + #[Test] public function it_build_stache_associations_when_taxonomy_driver_is_not_eloquent() {