Điều này có thể không thực sự trả lời câu hỏi nhưng rất có thể, nếu bạn thiếu viết lại URL, bạn có thể đưa sản phẩm của mình ra khỏi bộ sưu tập sản phẩm. Và việc thêm thông tin viết lại URL không tự động như bạn có thể thấy \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewrite
.
Cách tôi quản lý buộc phải thêm URL viết lại là bằng cách tạo một plugin theo create()
phương pháp \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory
. Và ngay sau khi mã của bạn (hoặc mã cốt lõi của Magento) sử dụng nhà máy này để cung cấp bộ sưu tập sản phẩm (và theo thông lệ tốt nhất), plugin này buộc \Magento\Catalog\Model\ResourceModel\Product\Collection::$_addUrlRewrite
phải thực hiện true
.
Sau đó, viết lại URL sản phẩm được thêm thành công vào các sản phẩm mà không cần phải lặp lại chúng và tải lại chúng. Do đó, nó khắc phục nhược điểm hoàn hảo mà @Raphael đã nói đến.
Đây là định nghĩa XML của plugin (trong di.xml
tệp của bạn ):
<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>
Và mã 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;
}
}