在庫切れの商品はまだフロントエンド、検索などに表示されます-Magento 2.1.0


12

magento 2.1.0のインストールに問題があるようです。在庫切れの商品を検索ページとカテゴリページから非表示にすることを拒否します。キャッシュをクリアし、インデックスを再作成しましたが、うまくいきませんでした。

何かアドバイスはありますか?

私の製品の在庫は0ですが、前に在庫があり、注文するとこのエラーが発生します。

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

ありがとう

後で編集:

私もこの情報を知っています:

管理者で設定>ストア>構成>カタログ>在庫>在庫オプション>在庫切れの商品を表示してNO

これは実際にはMagentoの機能です。[在庫切れの商品の表示]を[いいえ]に設定すると、カテゴリリストページと検索結果ページで非表示になるだけです。製品ページは実際にまだ利用可能です。CE 1.9.1以降、構成設定の[Display out of stock products]の下に、製品は引き続き直接製品URLで表示されるというメッセージさえあります。そして、これは実際に良いことです。このようにして、あなたの製品が在庫切れになったとき、検索エンジンは多くの404ページを登録しません。そのままにしておいても害はありません。顧客はとにかくそれらを注文することはできません。ストアで製品をまったく利用できないようにする場合は、その製品を無効としてマークするか、表示を個別に非表示に設定するか、管理製品の編集ページの[Webサイト]タブからWebサイトとの関連付けを削除する必要があります。ソース:在庫切れの商品はまだフロントエンドに表示されます


私も同じ問題に直面しています。バックエンド構成を変更した後でも、私はまだこれに直面しています。解決策を見つけた場合はお知らせください。
sabarivenkatesankrish 2017年

まだこの問題が発生していますか?カスタムテーマを使用していますか?それが問題の根本かもしれないと思う。
Fred

回答:



2

「0以下の数量を許可してお客様に通知する」に設定された「バックオーダー」が原因で、まったく同じ問題(Magento v2.1.9)に直面していました。

[管理]> [ストア]> [構成]> [カタログ]> [在庫]> [在庫オプション]に移動し、[在庫切れの商品]の表示を[いいえ]に設定します


[管理]> [ストア]> [構成]> [カタログ]> [在庫]> [商品在庫オプション]に移動し、バックオーダーを「バックオーダーなし」に設定します

注:カタログ全体を処理するため、変更には時間がかかる場合があります。

ここに画像の説明を入力してください


0

アップグレードcommand.I号にはいから変更する次のオプションを使用してソートそれをコマンドや実行するクエリが、無luck.Iを試した後、私は私の側には、それが起こっ2.2.3.Onに同じ問題を持っているStores => Configuration => Catalog=> Catalog =>Disable Add to cart button for Guests From Yes to No.Hopeこの意志のヘルプ誰かを。ありがとう ここに画像の説明を入力してください


デフォルトでは、そのようなオプションはありません。
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

解決策を見つけました!

フィルターをカタログに入れます:数量:0.0000-0.0000!

次に、すべてを選択し、アクション>属性の更新>詳細な在庫>在庫状況([変更]をクリック)>在庫なしを選択>保存してからインデックスを再作成すると、製品が削除されます:)


そして、構成可能な製品については?
フランクガルニエ2017年

-3

名前空間vendor \ module \ Helper;

クラスDataは\ 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;
}

}

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.