Magento 2의 카테고리 페이지에 맞춤 표준 URL 표시

Aug 16 2020

사용자 지정 범주 속성 (사용자 지정 표준 URL)을 범주 페이지에 추가하는 모듈을 만들었습니다. 속성은 관리자에 표시되며 값을 저장할 수 있습니다. _prepareLayout()기능을 확장 \Magento\Catalog\Block\Category\View했지만 작동하지 않는 것 같습니다. 내가 뭔가를 놓치고 있거나 더 나은 방법이 있습니까?

Example/CategoryCanonicalUrl/etc/module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Example_CategoryCanonicalUrl" setup_version="0.0.1">
    </module>
</config>

Example/CategoryCanonicalUrl/Setup/InstallData.php

<?php

namespace Example\CategoryCanonicalUrl\Setup;

use Magento\Catalog\Setup\CategorySetup;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;

class InstallData implements InstallDataInterface
{
    /**
     * @var CategorySetup
     */
    private $categorySetup; public function __construct( CategorySetup $categorySetup
    ) {
        $this->categorySetup = $categorySetup;
    }

    /**
     * @inheritDoc
     */
    public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
    {
        $setup->startSetup(); $this->categorySetup->addAttribute(
            \Magento\Catalog\Model\Category::ENTITY,
            'custom_canonical_url',
            [
                'type' => 'varchar',
                'label' => 'Custom Canonical URL',
                'required' => false,
                'visible' => 1,
                'visible_on_front' => 1,
                'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE,
                'group' => 'Search Engine Optimization',
            ]
        );

        $setup->endSetup();
    }
}

Example/CategoryCanonicalUrl/view/adminhtml/ui_component/category_form.xml

<?xml version="1.0"?>
<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <fieldset name="search_engine_optimization">
        <field name="custom_canonical_url" sortOrder="160" formElement="input">
            <settings>
                <dataType>string</dataType>
                <label translate="true">Custom Canonical URL</label>
                <scopeLabel>[STORE VIEW]</scopeLabel>
                <notice translate="true">URL without forward slash (/) e.g. example-category</notice>
            </settings>
        </field>
    </fieldset>
</form>

Example/CategoryCanonicalUrl/Block/Category/CanonicalUrl.php

<?php

namespace Example\CategoryCanonicalUrl\Block\Category;

class CanonicalUrl extends \Magento\Catalog\Block\Category\View
{
    /**
     * Core registry
     *
     * @var \Magento\Framework\Registry
     */
    protected $_coreRegistry = null;

    /**
     * Catalog layer
     *
     * @var \Magento\Catalog\Model\Layer
     */
    protected $_catalogLayer; /** * @var \Magento\Catalog\Helper\Category */ protected $_categoryHelper;

    /**
     * @param \Magento\Framework\View\Element\Template\Context $context * @param \Magento\Catalog\Model\Layer\Resolver $layerResolver
     * @param \Magento\Framework\Registry $registry * @param \Magento\Catalog\Helper\Category $categoryHelper
     * @param array $data */ public function __construct( \Magento\Framework\View\Element\Template\Context $context,
        \Magento\Catalog\Model\Layer\Resolver $layerResolver, \Magento\Framework\Registry $registry,
        \Magento\Catalog\Helper\Category $categoryHelper, array $data = []
    ) {
        $this->_categoryHelper = $categoryHelper;
        $this->_catalogLayer = $layerResolver->get();
        $this->_coreRegistry = $registry;
        parent::__construct($context, $data);
    }

    /**
     * @return $this */ protected function _prepareLayout() { parent::_prepareLayout(); $this->getLayout()->createBlock(\Magento\Catalog\Block\Breadcrumbs::class);

        $category = $this->getCurrentCategory();
        if ($category) { $title = $category->getMetaTitle(); if ($title) {
                $this->pageConfig->getTitle()->set($title);
            }
            $description = $category->getMetaDescription();
            if ($description) { $this->pageConfig->setDescription($description); } $keywords = $category->getMetaKeywords(); if ($keywords) {
                $this->pageConfig->setKeywords($keywords);
            }
            if ($this->_categoryHelper->canUseCanonicalTag()) { $customCanonicalUrl = trim($category->getCustomCanonicalUrl()); if ($customCanonicalUrl) {
                    $canonicalUrl = $customCanonicalUrl;
                } else {
                    $canonicalUrl = $category->getUrl();
                }

                $this->pageConfig->addRemotePageAsset( $canonicalUrl,
                    'canonical',
                    ['attributes' => ['rel' => 'canonical']]
                );
            }

            $pageMainTitle = $this->getLayout()->getBlock('page.main.title');
            if ($pageMainTitle) { $pageMainTitle->setPageTitle($this->getCurrentCategory()->getName()); } } return $this;
    }
}

Example/CategoryCanonicalUrl/registration.php

<?php \Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE, 'Example_CategoryCanonicalUrl',
    __DIR__
);

답변

user3417608 Aug 17 2020 at 21:13

이제 다음과 같이 변경하여 작동합니다.

만들어진 Example/CategoryCanonicalUrl/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">
    <preference for="Magento\Catalog\Block\Category\View" type="Example\CategoryCanonicalUrl\Block\Category\CanonicalUrl"/>
</config>

아래에 추가 Example/CategoryCanonicalUrl/etc/module.xml

        <sequence>
            <module name="Magento_Catalog"/>
        </sequence>

조정 에 에 내가 점점되면서 오류가 발생했습니다.parent::__construct($context, $data);parent::__construct($context, $layerResolver, $registry, $categoryHelper, $data);Example/CategoryCanonicalUrl/Block/Category/CanonicalUrl.phpType Error occurred when creating object

제거 parent::_prepareLayout();에서 protected function _prepareLayout()Example/CategoryCanonicalUrl/Block/Category/CanonicalUrl.php나는 정식 링크 태그를 중복지고 있었다한다.

Example/CategoryCanonicalUrl/Block/Category/CanonicalUrl.php예를 들어 관리 영역 example-categoryCustom Canonical URL입력을 통해 추가되는 경우 전체 표준 URL 에 대해 매장 관리자를 추가했습니다 .

<?php

namespace Example\CategoryCanonicalUrl\Block\Category;

use Magento\Store\Model\Store;

class CanonicalUrl extends \Magento\Catalog\Block\Category\View
{
    /**
     * Core registry
     *
     * @var \Magento\Framework\Registry
     */
    protected $_coreRegistry = null;

    /**
     * Catalog layer
     *
     * @var \Magento\Catalog\Model\Layer
     */
    protected $_catalogLayer; /** * @var \Magento\Catalog\Helper\Category */ protected $_categoryHelper;

    /**
     * Store manager
     *
     * @var \Magento\Store\Model\StoreManagerInterface
     */
    protected $_storeManager; /** * @param \Magento\Framework\View\Element\Template\Context $context
     * @param \Magento\Catalog\Model\Layer\Resolver $layerResolver * @param \Magento\Framework\Registry $registry
     * @param \Magento\Catalog\Helper\Category $categoryHelper * @param \Magento\Store\Model\StoreManagerInterface $storeManager
     * @param array $data */ public function __construct( \Magento\Framework\View\Element\Template\Context $context,
        \Magento\Catalog\Model\Layer\Resolver $layerResolver, \Magento\Framework\Registry $registry,
        \Magento\Catalog\Helper\Category $categoryHelper, \Magento\Store\Model\StoreManagerInterface $storeManager,
        array $data = [] ) { $this->_categoryHelper = $categoryHelper; $this->_catalogLayer = $layerResolver->get(); $this->_coreRegistry = $registry; $this->_storeManager = $storeManager; parent::__construct($context, $layerResolver, $registry, $categoryHelper, $data);
    }

    /**
     * @return $this */ protected function _prepareLayout() { $this->getLayout()->createBlock(\Magento\Catalog\Block\Breadcrumbs::class);

        $category = $this->getCurrentCategory();
        if ($category) { $title = $category->getMetaTitle(); if ($title) {
                $this->pageConfig->getTitle()->set($title);
            }
            $description = $category->getMetaDescription();
            if ($description) { $this->pageConfig->setDescription($description); } $keywords = $category->getMetaKeywords(); if ($keywords) {
                $this->pageConfig->setKeywords($keywords);
            }
            if ($this->_categoryHelper->canUseCanonicalTag()) { $customCanonicalUrl = trim($category->getCustomCanonicalUrl()); if ($customCanonicalUrl) {
                    $canonicalUrl = $this->_storeManager->getStore()->getBaseUrl() . $customCanonicalUrl; } else { $canonicalUrl = $category->getUrl(); } $this->pageConfig->addRemotePageAsset(
                    $canonicalUrl, 'canonical', ['attributes' => ['rel' => 'canonical']] ); } $pageMainTitle = $this->getLayout()->getBlock('page.main.title'); if ($pageMainTitle) {
                $pageMainTitle->setPageTitle($this->getCurrentCategory()->getName());
            }
        }

        return $this;
    }
}