यह वास्तव में सवाल का जवाब नहीं दे सकता है लेकिन संभावना है कि, यदि आप URL को फिर से लिख रहे हैं, तो आप अपने उत्पाद को उत्पाद संग्रह से निकाल सकते हैं। और URL rewrite जानकारी जोड़ना स्वचालित नहीं है जैसा कि आप देख सकते हैं\Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewrite
।
जिस तरह से मैंने URL रीराइट करने के लिए मजबूर किया है वह create()
विधि के तरीके पर एक प्लगइन बनाकर है \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory
। और जैसे ही आपका कोड (या मैगेंटो का कोर कोड) इस कारखाने का उपयोग उत्पाद संग्रह (और यह सर्वोत्तम प्रथाओं के रूप में करना चाहिए) के लिए करता है, यह प्लगइन बल देता \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewrite
हैtrue
।
फिर, उन उत्पादों के URL रीराइट को सफलतापूर्वक उन पर लूप की आवश्यकता के बिना उत्पादों में जोड़ा जाता है और उन्हें फिर से लोड किया जाता है। यह इस प्रकार उस नकारात्मक पहलू को ठीक करता है जिसके बारे में @ राफेल ने बात की थी।
यहाँ प्लगइन XML परिभाषा (आपकी di.xml
फ़ाइल में) है:
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Catalog\Model\ResourceModel\Product\CollectionFactory">
<plugin name="your_plugin_unique_nane" type="Your\Plugin\Namespace\Plugin" />
</type>
</config>
और प्लगइन कोड:
namespace Your\Plugin\Namespace;
use Magento\Catalog\Model\ResourceModel\Product\Collection;
use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory as CoreCollectionFactory;
class Plugin
{
/**
* @param CoreCollectionFactory $subject
* @param Collection $collection
* @return Collection
*/
public function afterCreate(CoreCollectionFactory $subject, Collection $collection)
{
$collection->addUrlRewrite();
return $collection;
}
}