diff -Nuar a/vendor/magento/module-catalog-inventory/Model/ResourceModel/StockStatusFilter.php b/vendor/magento/module-catalog-inventory/Model/ResourceModel/StockStatusFilter.php
new file mode 100644
index 00000000000..e9497a1d448
--- /dev/null
+++ b/vendor/magento/module-catalog-inventory/Model/ResourceModel/StockStatusFilter.php
@@ -0,0 +1,74 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\CatalogInventory\Model\ResourceModel;
+
+use Magento\CatalogInventory\Api\Data\StockStatusInterface;
+use Magento\CatalogInventory\Api\StockConfigurationInterface;
+use Magento\CatalogInventory\Model\Stock;
+use Magento\Framework\App\ResourceConnection;
+use Magento\Framework\DB\Select;
+
+/**
+ * Generic in-stock status filter
+ */
+class StockStatusFilter implements StockStatusFilterInterface
+{
+    private const TABLE_NAME = 'cataloginventory_stock_status';
+    /**
+     * @var ResourceConnection
+     */
+    private $resource;
+
+    /**
+     * @var StockConfigurationInterface
+     */
+    private $stockConfiguration;
+
+    /**
+     * @param ResourceConnection $resource
+     * @param StockConfigurationInterface $stockConfiguration
+     */
+    public function __construct(
+        ResourceConnection $resource,
+        StockConfigurationInterface $stockConfiguration
+    ) {
+        $this->resource = $resource;
+        $this->stockConfiguration = $stockConfiguration;
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public function execute(
+        Select $select,
+        string $productTableAlias,
+        string $stockStatusTableAlias = self::TABLE_ALIAS,
+        ?int $websiteId = null
+    ): Select {
+        $stockStatusTable = $this->resource->getTableName(self::TABLE_NAME);
+        $joinCondition = [
+            "{$stockStatusTableAlias}.product_id = {$productTableAlias}.entity_id",
+            $select->getConnection()->quoteInto(
+                "{$stockStatusTableAlias}.website_id = ?",
+                $this->stockConfiguration->getDefaultScopeId()
+            ),
+            $select->getConnection()->quoteInto(
+                "{$stockStatusTableAlias}.stock_id = ?",
+                Stock::DEFAULT_STOCK_ID
+            )
+        ];
+        $select->join(
+            [$stockStatusTableAlias => $stockStatusTable],
+            implode(' AND ', $joinCondition),
+            []
+        );
+        $select->where("{$stockStatusTableAlias}.stock_status = ?", StockStatusInterface::STATUS_IN_STOCK);
+
+        return $select;
+    }
+}
diff -Nuar a/vendor/magento/module-catalog-inventory/Model/ResourceModel/StockStatusFilterInterface.php b/vendor/magento/module-catalog-inventory/Model/ResourceModel/StockStatusFilterInterface.php
new file mode 100644
index 00000000000..26eb4b0fa38
--- /dev/null
+++ b/vendor/magento/module-catalog-inventory/Model/ResourceModel/StockStatusFilterInterface.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\CatalogInventory\Model\ResourceModel;
+
+use Magento\Framework\DB\Select;
+
+/**
+ * In stock status filter interface.
+ */
+interface StockStatusFilterInterface
+{
+    public const TABLE_ALIAS = 'stock_status';
+
+    /**
+     * Add in-stock status constraint to the select.
+     *
+     * @param Select $select
+     * @param string $productTableAliasAlias
+     * @param string $stockStatusTableAlias
+     * @param int|null $websiteId
+     * @return Select
+     */
+    public function execute(
+        Select $select,
+        string $productTableAliasAlias,
+        string $stockStatusTableAlias = self::TABLE_ALIAS,
+        ?int $websiteId = null
+    ): Select;
+}
diff -Nuar a/vendor/magento/module-catalog-inventory/etc/di.xml b/vendor/magento/module-catalog-inventory/etc/di.xml
index 78a0c2b7343..ee710f95ce8 100644
--- a/vendor/magento/module-catalog-inventory/etc/di.xml
+++ b/vendor/magento/module-catalog-inventory/etc/di.xml
@@ -32,6 +32,7 @@
     <preference for="Magento\CatalogInventory\Model\Spi\StockStateProviderInterface" type="Magento\CatalogInventory\Model\StockStateProvider" />

     <preference for="Magento\CatalogInventory\Model\ResourceModel\QtyCounterInterface" type="Magento\CatalogInventory\Model\ResourceModel\Stock" />
+    <preference for="Magento\CatalogInventory\Model\ResourceModel\StockStatusFilterInterface" type="Magento\CatalogInventory\Model\ResourceModel\StockStatusFilter" />
     <type name="Magento\Catalog\Model\Product\Attribute\Repository">
         <plugin name="filterCustomAttribute" type="Magento\CatalogInventory\Model\Plugin\FilterCustomAttribute" />
     </type>
diff -Nuar a/vendor/magento/module-wishlist/Model/Adminhtml/ResourceModel/Item/Product/CollectionBuilder.php b/vendor/magento/module-wishlist/Model/Adminhtml/ResourceModel/Item/Product/CollectionBuilder.php
new file mode 100644
index 00000000000..aa54c17c243
--- /dev/null
+++ b/vendor/magento/module-wishlist/Model/Adminhtml/ResourceModel/Item/Product/CollectionBuilder.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\Wishlist\Model\Adminhtml\ResourceModel\Item\Product;
+
+use Magento\Catalog\Model\ResourceModel\Product\Collection;
+use Magento\Wishlist\Model\ResourceModel\Item\Collection as WishlistItemCollection;
+use Magento\Wishlist\Model\ResourceModel\Item\Product\CollectionBuilderInterface;
+
+/**
+ * Wishlist items products collection builder for adminhtml area
+ */
+class CollectionBuilder implements CollectionBuilderInterface
+{
+    /**
+     * @inheritDoc
+     */
+    public function build(WishlistItemCollection $wishlistItemCollection, Collection $productCollection): Collection
+    {
+        return $productCollection;
+    }
+}
diff -Nuar a/vendor/magento/module-wishlist/Model/ResourceModel/Item/Collection.php b/vendor/magento/module-wishlist/Model/ResourceModel/Item/Collection.php
index 92592e8417c..0fda2ef3134 100644
--- a/vendor/magento/module-wishlist/Model/ResourceModel/Item/Collection.php
+++ b/vendor/magento/module-wishlist/Model/ResourceModel/Item/Collection.php
@@ -7,10 +7,11 @@ namespace Magento\Wishlist\Model\ResourceModel\Item;

 use Magento\Catalog\Api\Data\ProductInterface;
 use Magento\Catalog\Model\Indexer\Category\Product\TableMaintainer;
-use Magento\CatalogInventory\Model\Stock;
+use Magento\CatalogInventory\Model\ResourceModel\StockStatusFilterInterface;
 use Magento\Framework\App\ObjectManager;
 use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Sales\Model\ConfigInterface;
+use Magento\Wishlist\Model\ResourceModel\Item\Product\CollectionBuilderInterface;

 /**
  * Wishlist item collection
@@ -157,6 +158,21 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
      * @var ConfigInterface
      */
     private $salesConfig;
+    /**
+     * @var CollectionBuilderInterface
+     */
+    private $productCollectionBuilder;
+    /**
+     * @var StockStatusFilterInterface
+     */
+    private $stockStatusFilter;
+
+    /**
+     * Whether product table is joined in select
+     *
+     * @var bool
+     */
+    private $isProductTableJoined = false;

     /**
      * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory
@@ -176,10 +192,11 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
      * @param \Magento\Catalog\Model\Entity\AttributeFactory $catalogAttrFactory
      * @param \Magento\Wishlist\Model\ResourceModel\Item $resource
      * @param \Magento\Framework\App\State $appState
-     * @param \Magento\Framework\DB\Adapter\AdapterInterface $connection
+     * @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection
      * @param TableMaintainer|null $tableMaintainer
-     * @param  ConfigInterface|null $salesConfig
-     *
+     * @param ConfigInterface|null $salesConfig
+     * @param CollectionBuilderInterface|null $productCollectionBuilder
+     * @param StockStatusFilterInterface|null $stockStatusFilter
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
@@ -202,7 +219,9 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
         \Magento\Framework\App\State $appState,
         \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
         TableMaintainer $tableMaintainer = null,
-        ConfigInterface $salesConfig = null
+        ConfigInterface $salesConfig = null,
+        ?CollectionBuilderInterface $productCollectionBuilder = null,
+        ?StockStatusFilterInterface $stockStatusFilter = null
     ) {
         $this->stockConfiguration = $stockConfiguration;
         $this->_adminhtmlSales = $adminhtmlSales;
@@ -219,6 +238,10 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
         parent::__construct($entityFactory, $logger, $fetchStrategy, $eventManager, $connection, $resource);
         $this->tableMaintainer = $tableMaintainer ?: ObjectManager::getInstance()->get(TableMaintainer::class);
         $this->salesConfig = $salesConfig ?: ObjectManager::getInstance()->get(ConfigInterface::class);
+        $this->productCollectionBuilder = $productCollectionBuilder
+            ?: ObjectManager::getInstance()->get(CollectionBuilderInterface::class);
+        $this->stockStatusFilter = $stockStatusFilter
+            ?: ObjectManager::getInstance()->get(StockStatusFilterInterface::class);
     }

     /**
@@ -309,12 +332,10 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
             $productCollection->setVisibility($this->_productVisibility->getVisibleInSiteIds());
         }

-        $productCollection->addPriceData()
-            ->addTaxPercents()
-            ->addIdFilter($this->_productIds)
-            ->addAttributeToSelect($this->_wishlistConfig->getProductAttributes())
-            ->addOptionsToResult()
-            ->addUrlRewrite();
+        $productCollection->addIdFilter($this->_productIds)
+            ->addAttributeToSelect($this->_wishlistConfig->getProductAttributes());
+
+        $productCollection = $this->productCollectionBuilder->build($this, $productCollection);

         if ($this->_productSalable) {
             $productCollection = $this->_adminhtmlSales->applySalableProductTypesFilter($productCollection);
@@ -362,15 +383,8 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
         $connection = $this->getConnection();

         if ($this->_productInStock && !$this->stockConfiguration->isShowOutOfStock()) {
-            $inStockConditions = [
-                "stockItem.product_id =  {$mainTableName}.product_id",
-                $connection->quoteInto('stockItem.stock_status = ?', Stock::STOCK_IN_STOCK),
-            ];
-            $this->getSelect()->join(
-                ['stockItem' => $this->getTable('cataloginventory_stock_status')],
-                join(' AND ', $inStockConditions),
-                []
-            );
+            $this->joinProductTable();
+            $this->stockStatusFilter->execute($this->getSelect(), 'product_entity', 'stockItem');
         }

         if ($this->_productVisible) {
@@ -576,10 +590,12 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab
             $storeId = $this->_storeManager->getStore(\Magento\Store\Model\Store::ADMIN_CODE)->getId();

             $entityMetadata = $this->getMetadataPool()->getMetadata(ProductInterface::class);
+            $linkField = $entityMetadata->getLinkField();
+            $this->joinProductTable();

             $this->getSelect()->join(
                 ['product_name_table' => $attribute->getBackendTable()],
-                'product_name_table.' . $entityMetadata->getLinkField() . ' = main_table.product_id' .
+                'product_name_table.' . $linkField . ' = product_entity.' . $linkField .
                 ' AND product_name_table.store_id = ' .
                 $storeId .
                 ' AND product_name_table.attribute_id = ' .
@@ -589,6 +605,7 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab

             $this->_isProductNameJoined = true;
         }
+
         return $this;
     }

@@ -661,4 +678,21 @@ class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\Ab

         return $this;
     }
+
+    /**
+     * Join product table to select if not already joined
+     *
+     * @return void
+     */
+    private function joinProductTable(): void
+    {
+        if (!$this->isProductTableJoined) {
+            $this->getSelect()->join(
+                ['product_entity' => $this->getTable('catalog_product_entity')],
+                'product_entity.entity_id = main_table.product_id',
+                []
+            );
+            $this->isProductTableJoined = true;
+        }
+    }
 }
diff -Nuar a/vendor/magento/module-wishlist/Model/ResourceModel/Item/Product/CollectionBuilder.php b/vendor/magento/module-wishlist/Model/ResourceModel/Item/Product/CollectionBuilder.php
new file mode 100644
index 00000000000..05255d1fe39
--- /dev/null
+++ b/vendor/magento/module-wishlist/Model/ResourceModel/Item/Product/CollectionBuilder.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\Wishlist\Model\ResourceModel\Item\Product;
+
+use Magento\Catalog\Model\ResourceModel\Product\Collection;
+use Magento\Wishlist\Model\ResourceModel\Item\Collection as WishlistItemCollection;
+
+/**
+ * Wishlist items products collection builder
+ */
+class CollectionBuilder implements CollectionBuilderInterface
+{
+    /**
+     * @inheritDoc
+     */
+    public function build(WishlistItemCollection $wishlistItemCollection, Collection $productCollection): Collection
+    {
+        return $productCollection->addPriceData()
+            ->addTaxPercents()
+            ->addOptionsToResult()
+            ->addUrlRewrite();
+    }
+}
diff -Nuar a/vendor/magento/module-wishlist/Model/ResourceModel/Item/Product/CollectionBuilderInterface.php b/vendor/magento/module-wishlist/Model/ResourceModel/Item/Product/CollectionBuilderInterface.php
new file mode 100644
index 00000000000..1984d92e08a
--- /dev/null
+++ b/vendor/magento/module-wishlist/Model/ResourceModel/Item/Product/CollectionBuilderInterface.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\Wishlist\Model\ResourceModel\Item\Product;
+
+use Magento\Catalog\Model\ResourceModel\Product\Collection;
+use Magento\Wishlist\Model\ResourceModel\Item\Collection as WishlistItemCollection;
+
+/**
+ * Wishlist items products collection builder
+ */
+interface CollectionBuilderInterface
+{
+    /**
+     * Modify product collection
+     *
+     * @param WishlistItemCollection $wishlistItemCollection
+     * @param Collection $productCollection
+     * @return Collection
+     */
+    public function build(WishlistItemCollection $wishlistItemCollection, Collection $productCollection): Collection;
+}
diff -Nuar a/vendor/magento/module-wishlist/Model/Wishlist.php b/vendor/magento/module-wishlist/Model/Wishlist.php
index 9b7ff5177af..d0b72ca1d5a 100644
--- a/vendor/magento/module-wishlist/Model/Wishlist.php
+++ b/vendor/magento/module-wishlist/Model/Wishlist.php
@@ -12,9 +12,8 @@ use InvalidArgumentException;
 use Magento\Catalog\Api\ProductRepositoryInterface;
 use Magento\Catalog\Model\Product;
 use Magento\Catalog\Model\ProductFactory;
-use Magento\CatalogInventory\Api\Data\StockItemInterface;
+use Magento\CatalogInventory\Api\StockConfigurationInterface;
 use Magento\CatalogInventory\Api\StockRegistryInterface;
-use Magento\CatalogInventory\Model\Configuration;
 use Magento\Framework\App\Config\ScopeConfigInterface;
 use Magento\Framework\App\ObjectManager;
 use Magento\Framework\DataObject;
@@ -27,7 +26,6 @@ use Magento\Framework\Model\Context;
 use Magento\Framework\Registry;
 use Magento\Framework\Serialize\Serializer\Json;
 use Magento\Framework\Stdlib\DateTime;
-use Magento\Store\Model\ScopeInterface;
 use Magento\Store\Model\Store;
 use Magento\Store\Model\StoreManagerInterface;
 use Magento\Wishlist\Helper\Data;
@@ -150,14 +148,9 @@ class Wishlist extends AbstractModel implements IdentityInterface
     private $serializer;

     /**
-     * @var ScopeConfigInterface
+     * @var StockConfigurationInterface
      */
-    private $scopeConfig;
-
-    /**
-     * @var StockRegistryInterface|null
-     */
-    private $stockRegistry;
+    private $stockConfiguration;

     /**
      * Constructor
@@ -181,7 +174,9 @@ class Wishlist extends AbstractModel implements IdentityInterface
      * @param Json|null $serializer
      * @param StockRegistryInterface|null $stockRegistry
      * @param ScopeConfigInterface|null $scopeConfig
+     * @param StockConfigurationInterface|null $stockConfiguration
      * @SuppressWarnings(PHPMD.ExcessiveParameterList)
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
      */
     public function __construct(
         Context $context,
@@ -202,7 +197,8 @@ class Wishlist extends AbstractModel implements IdentityInterface
         array $data = [],
         Json $serializer = null,
         StockRegistryInterface $stockRegistry = null,
-        ScopeConfigInterface $scopeConfig = null
+        ScopeConfigInterface $scopeConfig = null,
+        ?StockConfigurationInterface $stockConfiguration = null
     ) {
         $this->_useCurrentWebsite = $useCurrentWebsite;
         $this->_catalogProduct = $catalogProduct;
@@ -217,8 +213,8 @@ class Wishlist extends AbstractModel implements IdentityInterface
         $this->serializer = $serializer ?: ObjectManager::getInstance()->get(Json::class);
         parent::__construct($context, $registry, $resource, $resourceCollection, $data);
         $this->productRepository = $productRepository;
-        $this->scopeConfig = $scopeConfig ?: ObjectManager::getInstance()->get(ScopeConfigInterface::class);
-        $this->stockRegistry = $stockRegistry ?: ObjectManager::getInstance()->get(StockRegistryInterface::class);
+        $this->stockConfiguration = $stockConfiguration
+            ?: ObjectManager::getInstance()->get(StockConfigurationInterface::class);
     }

     /**
@@ -379,7 +375,7 @@ class Wishlist extends AbstractModel implements IdentityInterface
                 $this
             )->addStoreFilter(
                 $this->getSharedStoreIds()
-            )->setVisibilityFilter();
+            )->setVisibilityFilter($this->_useCurrentWebsite);
         }

         return $this->_itemCollection;
@@ -457,7 +453,7 @@ class Wishlist extends AbstractModel implements IdentityInterface
             throw new LocalizedException(__('Cannot specify product.'));
         }

-        if ($this->isInStock($productId)) {
+        if (!$this->stockConfiguration->isShowOutOfStock($storeId) && !$product->getIsSalable()) {
             throw new LocalizedException(__('Cannot add product without stock to wishlist.'));
         }

@@ -650,24 +646,6 @@ class Wishlist extends AbstractModel implements IdentityInterface
     }

     /**
-     * Retrieve if product has stock or config is set for showing out of stock products
-     *
-     * @param int $productId
-     * @return bool
-     */
-    private function isInStock($productId)
-    {
-        /** @var StockItemInterface $stockItem */
-        $stockItem = $this->stockRegistry->getStockItem($productId);
-        $showOutOfStock = $this->scopeConfig->isSetFlag(
-            Configuration::XML_PATH_SHOW_OUT_OF_STOCK,
-            ScopeInterface::SCOPE_STORE
-        );
-        $isInStock = $stockItem ? $stockItem->getIsInStock() : false;
-        return !$isInStock && !$showOutOfStock;
-    }
-
-    /**
      * Check customer is owner this wishlist
      *
      * @param int $customerId
diff -Nuar a/vendor/magento/module-wishlist/etc/adminhtml/di.xml b/vendor/magento/module-wishlist/etc/adminhtml/di.xml
index 124b8c17c3f..be4d1966a46 100644
--- a/vendor/magento/module-wishlist/etc/adminhtml/di.xml
+++ b/vendor/magento/module-wishlist/etc/adminhtml/di.xml
@@ -24,4 +24,6 @@
     <type name="Magento\Catalog\Model\ResourceModel\Product">
         <plugin name="cleanups_wishlist_item_after_product_delete" type="Magento\Wishlist\Plugin\Model\ResourceModel\Product" />
     </type>
+    <preference for="Magento\Wishlist\Model\ResourceModel\Item\Product\CollectionBuilderInterface"
+                type="Magento\Wishlist\Model\Adminhtml\ResourceModel\Item\Product\CollectionBuilder"/>
 </config>
diff -Nuar a/vendor/magento/module-wishlist/etc/di.xml b/vendor/magento/module-wishlist/etc/di.xml
index c0230a5326f..924bdfa3eb5 100644
--- a/vendor/magento/module-wishlist/etc/di.xml
+++ b/vendor/magento/module-wishlist/etc/di.xml
@@ -78,4 +78,6 @@
             </argument>
         </arguments>
     </type>
+    <preference for="Magento\Wishlist\Model\ResourceModel\Item\Product\CollectionBuilderInterface"
+                type="Magento\Wishlist\Model\ResourceModel\Item\Product\CollectionBuilder"/>
 </config>
