diff --git a/wagtail/admin/filters.py b/wagtail/admin/filters.py
index 9f00956789..c9d1e5b555 100644
--- a/wagtail/admin/filters.py
+++ b/wagtail/admin/filters.py
@@ -223,7 +223,7 @@ class PopularTagsFilter(django_filters.MultipleChoiceFilter):
 
     def filter(self, qs, value):
         filtered = super().filter(qs, value)
-        if not self.use_subquery:
+        if not self.use_subquery or not value:
             return filtered
 
         # Workaround for https://github.com/wagtail/wagtail/issues/6616
diff --git a/wagtail/images/tests/test_admin_views.py b/wagtail/images/tests/test_admin_views.py
index 4211a9a284..2614fc2fc8 100644
--- a/wagtail/images/tests/test_admin_views.py
+++ b/wagtail/images/tests/test_admin_views.py
@@ -7,6 +7,7 @@ from django.conf import settings
 from django.contrib.auth.models import Group, Permission
 from django.contrib.contenttypes.models import ContentType
 from django.core.files.uploadedfile import SimpleUploadedFile, TemporaryUploadedFile
+from django.db.models.lookups import In
 from django.template.defaultfilters import filesizeformat
 from django.template.loader import render_to_string
 from django.test import RequestFactory, TestCase, TransactionTestCase, override_settings
@@ -22,6 +23,7 @@ from willow.registry import registry
 from wagtail.admin.admin_url_finder import AdminURLFinder
 from wagtail.images import get_image_model
 from wagtail.images.utils import generate_signature
+from wagtail.images.views.images import ImagesFilterSet
 from wagtail.models import (
     Collection,
     GroupCollectionPermission,
@@ -47,7 +49,7 @@ urlquote_safechars = RFC3986_SUBDELIMS + "/~:@"
 
 class TestImageIndexView(WagtailTestUtils, TestCase):
     def setUp(self):
-        self.login()
+        self.user = self.login()
         self.kitten_image = Image.objects.create(
             title="a cute kitten",
             file=get_test_image_file(size=(1, 1)),
@@ -374,6 +376,28 @@ class TestImageIndexView(WagtailTestUtils, TestCase):
             # the prefetched objects cache.
             self.get()
 
+    def test_empty_tag_filter_does_not_perform_id_filtering(self):
+        image_one_tag = Image.objects.create(
+            title="Test image with one tag",
+            file=get_test_image_file(),
+        )
+        image_one_tag.tags.add("one")
+
+        request = RequestFactory().get(reverse("wagtailimages:index"))
+        request.user = self.user
+        filterset = ImagesFilterSet(
+            data={}, queryset=Image.objects.all(), request=request, is_searching=True
+        )
+
+        # Filtering on tags during a search would normally apply a `pk__in` filter, but this should not happen
+        # when the tag filter is empty.
+        in_clauses = [
+            clause
+            for clause in filterset.qs.query.where.children
+            if isinstance(clause, In)
+        ]
+        self.assertEqual(len(in_clauses), 0)
+
 
 class TestImageIndexViewSearch(WagtailTestUtils, TransactionTestCase):
     fixtures = ["test_empty.json"]