I need to change the template for subcategories(like able to assign any category) and list.phtml is fine. But need to change template for random categories.

Any one have solution for this?

  • What do you mean by template? Do you need different layout or different theme? – Sukumar Gorai Jun 25 at 8:18
  • different layout – Shiwani Jun 25 at 8:55
  • @SukumarGorai Do you have solution for this? – Shiwani Jun 25 at 11:30
  • If you want to use different list.phtml then you can try the solution of HoangHieu. If any issue let me know here. – Sukumar Gorai Jun 25 at 12:26
  • Go to Manage category in Admin
  • In Design tab you will find Theme dropdown
  • Select your theme from there and this will apply to that category

I have three options for you if you are a developer.

Option 1. You can use xml layout such as named catalog_category_view_id_[Cat Id].xml to change list.phtml template.

Option 2. Add new category attribute using setup upgrade

            'type' => 'varchar',
            'label' => 'Category custom template',
            'input' => 'select',
            'sort_order' => 600,
            'source' => 'Namespace\CategoryCustom\Model\Category\Attribute\Source\Templates',
            'visible' => true,
            'required' => false,
            'user_defined' => true,
            'default' => null,
            'global' => \Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface::SCOPE_STORE,
            'group' => 'Design',
            'backend' => ''

Namespace\CategoryCustom\Model\Category\Attribute\Source\Templates extends \Magento\Eav\Model\Entity\Attribute\Source\AbstractSource

public function getAllOptions()
    if ($this->_options === null) {
        $this->_options = [
            ['label' => __('None'), 'value' => ''],
            ['label' => __('Custom Template'), 'value' => 'category_custom_template_file'],
    return $this->_options;


<fieldset name="display_settings">
    <field name="custom_product_list_template">
        <argument name="data" xsi:type="array">
            <item name="options" xsi:type="object">Namespace\CategoryCustom\Model\Category\Attribute\Source\Templates</item>
            <item name="config" xsi:type="array">
                <item name="sortOrder" xsi:type="number">210</item>
                <item name="dataType" xsi:type="string">string</item>
                <item name="formElement" xsi:type="string">select</item>
                <item name="label" translate="true" xsi:type="string">Ground Custom Template</item>

Add event observer to add layout update to events.xml

<event name="layout_load_before">
        <observer name="add_product_list_template" instance="Namespace\CategoryCustom\Observer\ProcessProduclistTemplate"/>

Observer class \Namespace\CategoryCustom\Observer\ProcessProduclistTemplate

public function execute(\Magento\Framework\Event\Observer $observer)
    if($observer->getFullActionName() == 'catalog_category_view'){
        $currentCategory = $this->_coreRegistry->registry('current_category');
        if(is_object($currentCategory) && $currentCategory->getId()){
            $handle = $currentCategory->getData('custom_product_list_template') ?: '';
    return $this;

After that custom you layout in category_custom_template_file.xml

Option 3. Create new static block -> assign it to category and change the config of the category from (Display CMS and Product -> CMS).

  • I don't want to add catalog_category_view_id_[Cat Id].xml Id wise. – Shiwani Jun 25 at 9:40
  • Let use option 2 and 3 – HoangHieu Jun 25 at 9:45

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.