Les produits en rupture de stock apparaissent toujours dans le frontend, la recherche et autres - Magento 2.1.0


12

Je constate que mon installation de magento 2.1.0 a un problème! Refuse de cacher les produits hors stock des pages de recherche et de catégorie! J'ai vidé le cache, j'ai réindexé, mais pas de chance!

Pouvez-vous me donner des conseils?

Mes produits sont en stock 0, mais devant ils apparaissent en stock, et lorsque vous les commandez, cela vous donne cette erreur:

We don't have as many "Item's name" as you requested.

Merci

Modification ultérieure:

Je connais également ces informations:

Définir dans admin> Magasins> configuration> Catalogue> Inventaire> Options de stock> Afficher les produits en rupture de stock sur NO

C'est en fait une fonctionnalité de Magento. Définir Afficher les produits en rupture de stock sur Non les masque uniquement dans les pages de liste de catégories et la page de résultats de recherche. La page du produit est en fait toujours disponible. À partir de CE 1.9.1, il y a même un message sous le paramètre de configuration Afficher les produits en rupture de stock disant que les produits seront toujours affichés par les URL directes des produits. Et c'est en fait une bonne chose. De cette façon, les moteurs de recherche n'enregistrent pas beaucoup de 404 pages lorsque vos produits sont en rupture de stock. Je ne vois pas le mal de le laisser comme ça. Le client ne peut en aucun cas les commander. Si vous souhaitez qu'un produit ne soit pas du tout disponible dans votre magasin, vous devez le marquer comme désactivé ou définir sa visibilité sur Non visible individuellement ou supprimer son association aux sites Web à partir de l'onglet Sites Web de la page de modification du produit d'administration. La source:Les produits en rupture de stock apparaissent toujours dans le frontend


Je suis également confronté au même problème. Même après avoir changé la configuration du backend, je suis toujours confronté à cela. Si vous avez trouvé la solution, faites-le moi savoir.
sabarivenkatesankrish

Êtes-vous toujours confronté à ce problème? Utilisez-vous un thème personnalisé? Je pense que cela pourrait probablement être à l'origine du problème.
Fred Orosko Dias

Réponses:


7

Accédez à admin> Boutiques> configuration> Catalogue> Inventaire> Options d'achat d'actions

Définir l' affichage des produits en rupture de stock sur NO

entrez la description de l'image ici


3
Déjà fait ça! Toujours pas de changement!
edgetwism

2

J'étais confronté exactement au même problème (Magento v2.1.9) en raison de "Backorders", qui était réglé sur "Allow Qty Below 0 and Notify Customer"

Accédez à admin> Boutiques> configuration> Catalogue> Inventaire> Options d'achat d'actions Définissez Affichage "Produits en rupture de stock" sur NON


Accédez à admin> Magasins> configuration> Catalogue> Inventaire> Options de stock de produits Définissez les commandes en souffrance sur "Pas de commandes en attente"

Remarque: La modification peut prendre un certain temps en raison du traitement de l'ensemble du catalogue.

entrez la description de l'image ici


0

J'ai le même problème sur 2.2.3. De mon côté, cela s'est produit après la commande de mise à niveau.J'ai essayé des commandes et exécuté des requêtes mais pas de chance.Je le trie en utilisant l'option suivante de Oui à Non. Stores => Configuration => Catalog=> Catalog =>Disable Add to cart button for Guests From Yes to NoJ'espère que cela aidera quelqu'un .Merci entrez la description de l'image ici


Par défaut, cette option n'existe pas.
Priyank

-1
namespace vendor\module\Block\Product;

class ListProduct extends \Magento\Catalog\Block\Product\ListProduct{

    protected function _getProductCollection(){
        $collection = parent::_getProductCollection();
        $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
        $productIds = $objectManager->create('\vendor\module\Helper\Data')->getIdsToLastStock($collection->getAllIds());
        $orderString = array('CASE e.entity_id');
        foreach($productIds as $i => $productId) {
            $orderString[] = 'WHEN '.$productId.' THEN '.$i;
        }
        $orderString[] = 'END';
        $orderString = implode(' ', $orderString);
        $collection->addAttributeToFilter('entity_id', array('in' => $productIds));
        $collection->getSelect()->order(new \Zend_Db_Expr($orderString));
        return $collection;
    }

}

-3

J'ai trouvé la solution!

Mettez un filtre dans le catalogue: Quantité: 0.0000 - 0.0000!

Ensuite, sélectionnez tout, action> mettre à jour les attributs> inventaire avancé> Disponibilité des stocks (cliquez sur changer)> Sélectionner en rupture de stock> enregistrer puis réindexer et les produits sont partis :)


Et pour les produits configurables?
Franck Garnier

-3

fournisseur d'espace de noms \ module \ Helper;

classe Data étend \ Magento \ Framework \ App \ Helper \ AbstractHelper {

protected $_stockItemRepository;
protected $_scopeConfig;
protected $_storeScope;

public function __construct(\Magento\CatalogInventory\Model\Stock\StockItemRepository $_stockItemRepository, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig)
{
    $this->_stockItemRepository = $_stockItemRepository;
    $this->_scopeConfig = $scopeConfig;
    $this->_storeScope = \Magento\Store\Model\ScopeInterface::SCOPE_STORE;
}


public function getIdsToLastStock($ids){
    if($this->_scopeConfig->getValue('module/vendor_module/active',$this->_storeScope)==1) {
        $products = array();
        $productIds = array();
        foreach ($ids as $id) {
            try {
                $stockItem = $this->_stockItemRepository->get($id);
                $products[] = array('id' => $id, 'stock' => $this->checkIfAvailableInStock($stockItem));
            } catch (\Exception $ex) {
                $products[] = array('id' => $id, 'stock' => 0);
            }
        }

        if (count($products) > 0) {
            foreach ($products as $id => $value) {
                $names[$id] = $value['stock'];
            }
            $keys = array_keys($products);
            array_multisort(
                $names, SORT_ASC, SORT_NUMERIC, $products, $keys
            );
            $result = array_combine($keys, $products);
            foreach ($result as $product) {
                $productIds[] = intval($product['id']);
            }
            return $productIds;
        } else {
            return $ids;
        }
    }
    return $ids;
}


private function checkIfAvailableInStock($item){
    if($item->getIsInStock()){
        if($item->getQty()>0)
            return 0;
    }
    return 1;
}

}

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.