Es posible que esto realmente no responda a la pregunta, pero es probable que, si falta la reescritura de URL, es posible que obtenga su producto de una colección de productos. Y agregar información de reescritura de URL no es automático como puede ver en \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewrite
.
La forma en que logré forzar la adición de reescrituras de URL es mediante la creación de un complemento en el create()
método de \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory
. Y tan pronto como su código (o el código central de Magento) use esta fábrica para crear una instancia de una colección de productos (y debería hacerlo a partir de las mejores prácticas), este complemento obliga a \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewrite
hacerlo true
.
Luego, las reescrituras de URL de productos se agregan con éxito a los productos sin la necesidad de hacer un bucle en ellas y volver a cargarlas. Por lo tanto, corrige la desventaja de la que habló @Raphael.
Aquí está la definición XML del complemento (en su di.xml
archivo):
<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>
Y el código del complemento:
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;
}
}