Magento 2 - 产品列表下方的额外类别描述
Magento 2 - Extra category description below product listing
我需要在产品列表上方和下方显示类别描述。
上面的描述应该是简短的,但下面的描述是出于 SEO 目的的长描述。我不想在顶部显示很长的描述,因为它会将产品推得太低。
有没有已知的方法可以在 Magento 2 中实现此目的?
示例:https://marketplace.magento.com/magetoday-module-secondcatdescription.html
不幸的是,此模块似乎已损坏,无法正常工作。
我多年来一直在使用 WooCommerce (WordPress),并通过这些网站上的 explode() 轻松实现了这一点。我将类别描述分成两部分,第一部分显示在产品列表上方,第二部分显示在产品列表下方。这是非常有效的,因为我不必为新的输入字段、数据库更改等而烦恼。不过我不知道如何在 Magento 中执行此操作。
我会在类别中添加一个额外的字段并将其拆分。但是你有一个单独的数据库字段等
另一种方法是在类别页面上两次调用描述并使用 php 过滤它。
首先你应该决定哪种方式更适合你。
在我的例子中,我为 short_description 添加了更多字段,将摘录和缩略图添加到类别中 - 如果您有兴趣,请告诉我。
首先,您需要创建一个类别属性,然后您可以在产品列表页面中拉取内容。
创建一个基本模块并在您的模块中添加以下文件。
1.创建类别属性。
在数据库中创建 bottom_description
属性。
app/code/MilanDev/BottomDescription/Setup/InstallData.php
<?php
namespace MilanDev\BottomDescription\Setup;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface;
class InstallData implements InstallDataInterface
{
private $eavSetupFactory;
/**
* Constructor
*
* @param \Magento\Eav\Setup\EavSetupFactory $eavSetupFactory
*/
public function __construct(EavSetupFactory $eavSetupFactory)
{
$this->eavSetupFactory = $eavSetupFactory;
}
/**
* {@inheritdoc}
*/
public function install(
ModuleDataSetupInterface $setup,
ModuleContextInterface $context
) {
$eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
$eavSetup->addAttribute(
\Magento\Catalog\Model\Category::ENTITY,
'bottom_description',
[
'type' => 'text',
'label' => 'Description',
'input' => 'textarea',
'required' => false,
'sort_order' => 4,
'global' => ScopedAttributeInterface::SCOPE_STORE,
'wysiwyg_enabled' => true,
'is_html_allowed_on_front' => true,
'group' => 'General Information',
]
);
}
}
在后端显示属性(在任何类别的 Description
字段下)。
app/code/MilanDev/BottomDescription/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="content">
<field name="bottom_description" template="ui/form/field" sortOrder="60" formElement="wysiwyg">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="wysiwygConfigData" xsi:type="array">
<item name="height" xsi:type="string">100px</item>
<item name="add_variables" xsi:type="boolean">false</item>
<item name="add_widgets" xsi:type="boolean">false</item>
<item name="add_images" xsi:type="boolean">true</item>
<item name="add_directives" xsi:type="boolean">true</item>
</item>
<item name="source" xsi:type="string">category</item>
</item>
</argument>
<settings>
<label translate="true">Bottom Description</label>
<dataScope>bottom_description</dataScope>
</settings>
<formElements>
<wysiwyg class="Magento\Catalog\Ui\Component\Category\Form\Element\Wysiwyg">
<settings>
<rows>8</rows>
<wysiwyg>true</wysiwyg>
</settings>
</wysiwyg>
</formElements>
</field>
</fieldset>
</form>
2。在产品listing页面拉取内容
获取模板文件中的内容。
app/code/MilanDev/BottomDescription/view/frontend/templates/product/list/bottom_description.phtml
<?php if ($_bottomDescription = $block->getCurrentCategory()->getBottomDescription()): ?>
<div class="category-bottom-description">
<?= /* @escapeNotVerified */ $this->helper('Magento\Catalog\Helper\Output')->categoryAttribute($block->getCurrentCategory(), $_bottomDescription, 'bottom_description') ?>
</div>
<?php endif; ?>
在产品列表页面中将内容显示到底部。
app/code/MilanDev/BottomDescription/view/frontend/layout/catalog_category_view.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="2columns-left" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="content">
<block class="Magento\Catalog\Block\Category\View" name="bottom.description" template="MilanDev_BottomDescription::product/list/bottom_description.phtml" after="-"/>
</referenceContainer>
</body>
</page>
这应该有效,或者您可以查看 details here。
我需要在产品列表上方和下方显示类别描述。
上面的描述应该是简短的,但下面的描述是出于 SEO 目的的长描述。我不想在顶部显示很长的描述,因为它会将产品推得太低。
有没有已知的方法可以在 Magento 2 中实现此目的?
示例:https://marketplace.magento.com/magetoday-module-secondcatdescription.html 不幸的是,此模块似乎已损坏,无法正常工作。
我多年来一直在使用 WooCommerce (WordPress),并通过这些网站上的 explode() 轻松实现了这一点。我将类别描述分成两部分,第一部分显示在产品列表上方,第二部分显示在产品列表下方。这是非常有效的,因为我不必为新的输入字段、数据库更改等而烦恼。不过我不知道如何在 Magento 中执行此操作。
我会在类别中添加一个额外的字段并将其拆分。但是你有一个单独的数据库字段等
另一种方法是在类别页面上两次调用描述并使用 php 过滤它。
首先你应该决定哪种方式更适合你。
在我的例子中,我为 short_description 添加了更多字段,将摘录和缩略图添加到类别中 - 如果您有兴趣,请告诉我。
首先,您需要创建一个类别属性,然后您可以在产品列表页面中拉取内容。
创建一个基本模块并在您的模块中添加以下文件。
1.创建类别属性。
在数据库中创建 bottom_description
属性。
app/code/MilanDev/BottomDescription/Setup/InstallData.php
<?php
namespace MilanDev\BottomDescription\Setup;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Eav\Setup\EavSetup;
use Magento\Eav\Setup\EavSetupFactory;
use Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface;
class InstallData implements InstallDataInterface
{
private $eavSetupFactory;
/**
* Constructor
*
* @param \Magento\Eav\Setup\EavSetupFactory $eavSetupFactory
*/
public function __construct(EavSetupFactory $eavSetupFactory)
{
$this->eavSetupFactory = $eavSetupFactory;
}
/**
* {@inheritdoc}
*/
public function install(
ModuleDataSetupInterface $setup,
ModuleContextInterface $context
) {
$eavSetup = $this->eavSetupFactory->create(['setup' => $setup]);
$eavSetup->addAttribute(
\Magento\Catalog\Model\Category::ENTITY,
'bottom_description',
[
'type' => 'text',
'label' => 'Description',
'input' => 'textarea',
'required' => false,
'sort_order' => 4,
'global' => ScopedAttributeInterface::SCOPE_STORE,
'wysiwyg_enabled' => true,
'is_html_allowed_on_front' => true,
'group' => 'General Information',
]
);
}
}
在后端显示属性(在任何类别的 Description
字段下)。
app/code/MilanDev/BottomDescription/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="content">
<field name="bottom_description" template="ui/form/field" sortOrder="60" formElement="wysiwyg">
<argument name="data" xsi:type="array">
<item name="config" xsi:type="array">
<item name="wysiwygConfigData" xsi:type="array">
<item name="height" xsi:type="string">100px</item>
<item name="add_variables" xsi:type="boolean">false</item>
<item name="add_widgets" xsi:type="boolean">false</item>
<item name="add_images" xsi:type="boolean">true</item>
<item name="add_directives" xsi:type="boolean">true</item>
</item>
<item name="source" xsi:type="string">category</item>
</item>
</argument>
<settings>
<label translate="true">Bottom Description</label>
<dataScope>bottom_description</dataScope>
</settings>
<formElements>
<wysiwyg class="Magento\Catalog\Ui\Component\Category\Form\Element\Wysiwyg">
<settings>
<rows>8</rows>
<wysiwyg>true</wysiwyg>
</settings>
</wysiwyg>
</formElements>
</field>
</fieldset>
</form>
2。在产品listing页面拉取内容
获取模板文件中的内容。
app/code/MilanDev/BottomDescription/view/frontend/templates/product/list/bottom_description.phtml
<?php if ($_bottomDescription = $block->getCurrentCategory()->getBottomDescription()): ?>
<div class="category-bottom-description">
<?= /* @escapeNotVerified */ $this->helper('Magento\Catalog\Helper\Output')->categoryAttribute($block->getCurrentCategory(), $_bottomDescription, 'bottom_description') ?>
</div>
<?php endif; ?>
在产品列表页面中将内容显示到底部。
app/code/MilanDev/BottomDescription/view/frontend/layout/catalog_category_view.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="2columns-left" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="content">
<block class="Magento\Catalog\Block\Category\View" name="bottom.description" template="MilanDev_BottomDescription::product/list/bottom_description.phtml" after="-"/>
</referenceContainer>
</body>
</page>
这应该有效,或者您可以查看 details here。