Magento 2'de kategori sayfasında özel kanonik URL görüntüle
Bir kategori sayfasına özel bir kategori özelliği (özel kanonik URL) eklemek için bir modül oluşturdum. Öznitelik yöneticide görüntülenir ve değeri kaydedebilirim. _prepareLayout()
İşlevini genişlettim \Magento\Catalog\Block\Category\View
ama çalışmıyor gibi görünüyor. Bir şeyi özlüyorum yoksa bunu yapmanın daha iyi bir yolu var mı?
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__
);
Yanıtlar
Şimdi aşağıdaki değişiklikleri yaparak bunu çalıştırıyorum.
Oluşturuldu 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>
Aşağıdakileri şuraya eklendi: Example/CategoryCanonicalUrl/etc/module.xml
<sequence>
<module name="Magento_Catalog"/>
</sequence>
Düzeltilmiş için de ben başlamıştı olarak hatayı.parent::__construct($context, $data);
parent::__construct($context, $layerResolver, $registry, $categoryHelper, $data);
Example/CategoryCanonicalUrl/Block/Category/CanonicalUrl.php
Type Error occurred when creating object
Kaldırılan parent::_prepareLayout();
dan protected function _prepareLayout()
içinde Example/CategoryCanonicalUrl/Block/Category/CanonicalUrl.php
ben kurallı bağlantı etiketleri çoğaltılamaz başlamıştı olarak.
Example/CategoryCanonicalUrl/Block/Category/CanonicalUrl.php
Örneğin example-category
, Custom Canonical URL
yönetici alanındaki giriş yoluyla eklendiğinde , tam kanonik URL için mağaza yöneticisi eklendi .
<?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;
}
}