This is actually a feature of Magento.
Setting Display out of stock products to No only hides them from the category list pages and the search results page.
The product page is actually still available.
Starting with CE 1.9.1 there is even a message under the config setting Display out of stock products saying Products will still be shown by direct product ...
Solution 1 This moves out of stock products to the end of the list on page, not all over the pagination:
1.Add event observer:
isSaleable() is just an alias of isSalable() :
* Alias for isSalable()
* @return bool
public function isSaleable()
The isSalable() method looks complex but it simply checks for the availability of the product via the isAvailable() method:
* Check is product available for sale
* @return bool
You can easily do this by visiting your Advanced Inventory Tab of your product.
Just set Manage Stock option to No
If your store contain all digital products then you can set below option by default, so you don't need to set for individual product
Stores > Configuration > Catalog > Inventory > Product Stock Options
Manage Stock to No
In our case the issue was related to a migration from Magento 1 to Magento 2 via migration data tool. The problem is that default value for the attribute 'links_exist' is 0 in Magento 1. However in Magento 2 default value for 'links_exist' is null.
Because of that following validation fails
To show out of stock products go to System > Configuration > Catalog > Inventory and set Display Out of Stock Products to yes.
Now we'll need to rewrite the class Mage_Catalog_Block_Product_View_Type_Configurable which you can do in your own module. Specifically the method getJsonConfig.
You can use this code which give stock in faster way using product id
Out is an array
[item_id] => 1868
[product_id] => ...
This one adds to Sohel Rana's answer. Tested on 2.3.3 for configurable products
For any of the product out of stock:
In your di.xml
<preference for="Magento\ConfigurableProduct\Pricing\Render\FinalPriceBox" type="<Vendor>\<Module>\Pricing\Render\FinalPriceBox" />
And in \\Pricing\Render\FinalPriceBox.php
These all are methods which checked the product availability with different parameters .
isInStock() - Its just check the product is in stock or not. And for this its check the product attribute value of Stock Status, if it is set as In Stock then it will return true.
isAvailable() - Its check the product availability according to product status, stock ...
You need to create your custom module using below code
Let say module name Custom_Outofstock
So create folder in app/code
Create registration.php file at app/code/Custom/Outofstock/registration.php
Add below code to it:
After doing R&D found a solution to get all the out of stock products
The "Display Out of Stock Products" option set to No will hide products that are completely out of stock. If you want these to be displayed, but also want filters to hide options where the simple product for that option is out of stock, there is a simple solution.
Rather than fiddle about with how the product collection is retrieved and/or displayed, it is ...
By default in product collection join the cataloginventory_stock_status table so "stock_status_index.stock_status = 1" added into the query.
To get the only out of stock products, first we need to remove cataloginventory_stock_status join and than filter again.
$productCollection = $objectManager->create('Magento\Catalog\Model\ResourceModel\Product\...
Not sure if this is applicable, but I'm on Magento 2.1.9 and there is an
issue with configurable products showing price of $0.00 when child products are out of stock on Github.
The hack, Albeit a core hack, is the only available remedy it seems.
I added the code & commented below, into
By default magento filters only in stock products in collection. We have to set the in stock filter as false.
$productCollection = $_objectManager->create('Magento\Catalog\Model\ResourceModel\Product\CollectionFactory');
$collection = $productCollection->create()->setFlag('has_stock_status_filter', false)->load();
To do above things, you need to do this things.
<plugin name="Vendor_Extension_Stock_Helper" type="Vendor\Extension\Plugin\Helper\Stock" sortOrder="10" disabled="false" />
Create the Helper File with arround plugin.
$firstProductId = Mage::getSingleton('catalog/product')->getIdBySku('mysku');
$inStock = Mage::getModel('cataloginventory/stock_item')->getCollection()->addFieldToFilter('product_id', $firstProductId)->getFirstItem()
This should do the trick.
Although, not sure how efficient it would be but can confirm this is magento way.
let's say that $collection is your product collection that you build like this:
$collection = Mage::getModel('catalog/product')->getCollection()
->...additional filters here...;
now do this to your collection.
This joins the collection with the stock status table.
$website = Mage::app()->getWebsite();
Yes it does.
Check this out.
Magento has in-built setting for turning on "Backordering". It is located at
System >> Configuration >> Catalog >> Inventory but this will work only on new products.
For all existing products you still have to turn it on in admin products grid(Catalog >> Manage Products) by selecting products and then ...
You need to modify some logic for that. So create a new module and add following code.
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
The above one is a known issue for Magento and can be solved partially by installing the below extension.
Reference for the Issue can be found at Magento Issue 10454
Sorry if solution isn't very clean. I just copied from one of the modules which has been written many years ago...
I confirmed that the issue was in fact that some fields were not being updated that needed to be. These fields ended up being qty and stock_status in the table cataloginventory_stock_status. I found a couple ways to fix this. You can update each item in the script using the assign function that the Mage_CatalogInventory_Model_Stock_Status has. Simply place ...
So lets start with the obvious issue you have: The blank spaces.
The issue, as you already know, is that your collection contains the count of products that are not to be displayed (as per your code conditional filtering)
Hence the toolbar object contains the wrong count now, as per your actual product display.
That is just but one issue that would arise. ...