当在magento 2中更改产品的Url键时,如何不替换?

问题描述

当我尝试重写产品的URL密钥时,是否有一种方法可以防止magento 2用select *,right(remind,charindex (',',reverse(remind))-1) from t t1 cross apply (select stuff(col,charindex(',857',col),len(col),'') as remind) t2 替换/

enter image description here

解决方法

我需要完全一样。我通过为 \Magento\Catalog\Model\Product\Url

中的 formatUrlKey() 方法创建一个环绕插件来完成它

[编辑] 最好的方法是只启用您想要的字符,因此我们仍然删除特殊字符和空格。我添加的代码只允许 / 和 _

只需创建一个文件: app/code/YourVendorName/YourModule/Plugin/FormatUrlKeyPlugin.php

<?php

declare(strict_types=1);

namespace YourVendorName\YourModule\Plugin;

/**
 * Class FormatUrlKeyPlugin
 * @package YourVendorName\YourModule\Plugin
 */
class FormatUrlKeyPlugin
{

    /**
     * FormatUrlKeyPlugin constructor.
     * @param Translit $translit
     */
    public function __construct(\Magento\Framework\Filter\Translit $translit)
    {
        $this->translit = $translit;
    }

    /**
     * Prevent Magento from replacing slashes in url_key
     *
     * @param \Magento\Catalog\Model\Product\Url $subject
     * @param callable $proceed
     * @param $str
     * @return mixed
     */
    public function aroundFormatUrlKey(\Magento\Catalog\Model\Product\Url $subject,callable $proceed,$str)
    {
        $str = preg_replace('#[^0-9a-z_/]+#i','-',$this->translit->filter($str));
        $str = strtolower($str);
        $str = trim($str,'-');
        return $str;
    }
}

并将插件添加到 di.xml(如果您的模块中没有它,请创建一个新插件) app/code/YourVendorName/YourModule/etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Catalog\Model\Product\Url">
        <plugin name="FormatUrlKeyPlugin" type="YourVendorName\YourModule\Plugin\FormatUrlKeyPlugin" sortOrder="1" disabled="false"/>
    </type>
</config>