Isso pode realmente não responder à pergunta, mas as chances são de que, se estiver faltando a reescrita do URL, você poderá obter seu produto de uma coleção de produtos. E adicionar informações de reescrita de URL não é automático, como você pode ver \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewrite
.
A maneira como eu consegui forçar a adição de reescritas de URL é criando um plugin no create()
método de \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory
. E logo que o seu código (ou código do núcleo do Magento) usa essa fábrica para instanciating uma coleção de produtos (e que deveria como das melhores práticas), este forças de plug-in do \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewrite
para true
.
Em seguida, as reescritas de URL dos produtos são adicionadas com êxito aos produtos sem a necessidade de fazer um loop neles e recarregá-los. Assim, corrige a desvantagem que o @Raphael falou.
Aqui está a definição XML do plug-in (no seu di.xml
arquivo):
<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>
E o código do plugin:
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;
}
}