6

I want to remove the trailing category in magento 2

http://magento2.dev/accessories/tops-women.html
http://magento2.dev/accessories/tops-women/jackets-women.html

instead I want

http://magento2.dev/tops-women.html
http://magento2.dev/jackets-women.html
7

We can configure it by URL Rewrites

  1. Go to Magento 2 Admin -> Marketing -> SEO & Search -> URL Rewrites

  2. Find the path by searching Request path column.

  3. Remove the cache php bin/magento cache:clean.

  4. Refresh the front-end, click the main menu category then you can see the configured path.

Example i have modified.

Request path men/tops-men/tees-men.htm

Modified path tees-men.htm

Or

You Can Build category URL path by

\vendor\magento\module-catalog-url-rewrite\Model\CategoryUrlPathGenerator.php 

Modify getUrlPath($category) by Magento Plug-in feature.

Hope this helps.

  • Using this I have to do it one by one. and when creating new category it again create nested url. any solution that do it directly when create new category or update category – Arun Karnawat Jul 21 '16 at 7:37
  • Have a look at the modified answer. – Krishna ijjada Jul 21 '16 at 9:22
  • thank that was helpful – Arun Karnawat Jul 21 '16 at 9:34
3

Sort and sweet solution for this is:

Just go to the file: \vendor\magento\module-catalog-url-rewrite\Model\CategoryUrlPathGenerator.php or Just override that file

In the getUrlPath() function just comment this code

/*if ($this->isNeedToGenerateUrlPathForParent($category)) {
        $parentPath = $this->getUrlPath(
            $this->categoryRepository->get($category->getParentId(), $category->getStoreId())
        );
        $parentPath ="";
        //$path = $parentPath === '' ? $path : $parentPath . '/' . $path;
        $path = $parentPath === '' ? $path : $path;
    }*/

And open the database find the table url_rewrite just backup it and truncate that table.

then, go to your admin > products > categories choose any one category and save that.

then check your frontend.

Your problem will be solve.

  • It is not a good idea to make changes right in the core code. I recommend you to use a plugins instead. – Siarhey Uchukhlebau Apr 7 '17 at 12:40
  • Brother, you can override that file. – Rajan Soni Apr 7 '17 at 12:46
  • Sure, but you should edit your answer and add necessary info about that: how to overwrite whole class or how to create the around-plugin. – Siarhey Uchukhlebau Apr 7 '17 at 12:50
  • Ya, I edit my answer and I mention in bold to override that file bro. – Rajan Soni Apr 7 '17 at 12:58
  • You can down-vote many times, but it won't add mind for you – Siarhey Uchukhlebau Apr 7 '17 at 13:36
2

As pointed out by @Rajan Soni, you need to override the native Magento class :

  • vendor\magento\module-catalog-url-rewrite\Model\CategoryUrlPathGenerator.php

To do so, you need to use an existing module, or to create to a new dedicated one. You will need 4 files, located in your new module Vendor_Module directory :

  • app/code/Vendor/Module/
  • app/code/Vendor/Module/registration.php
  • app/code/Vendor/Module/etc/module.xml
  • app/code/Vendor/Module/etc/di.xml
  • app/code/Vendor/Module/Model/CategoryUrlPathGenerator.php

app/code/Vendor/Module/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="Vendor_Module" setup_version="1.0.0">
        <sequence></sequence>
    </module>
</config>

app/code/Vendor/Module/registration.php

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

app/code/Vendor/Module/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\CatalogUrlRewrite\Model\CategoryUrlPathGenerator" type="Vendor\Module\Model\CategoryUrlPathGenerator" />
</config>

app/code/Vendor/Module/Model/CategoryUrlPathGenerator.php

<?php

namespace Vendor\Module\Model;

use Magento\Catalog\Model\Category;
use Magento\CatalogUrlRewrite\Model\CategoryUrlPathGenerator as Magento_CategoryUrlPathGenerator;

class CategoryUrlPathGenerator extends Magento_CategoryUrlPathGenerator {

    public function getUrlPath($category) {
        if(in_array($category->getParentId(), [Category::ROOT_CATEGORY_ID, Category::TREE_ROOT_ID])) {
            return '';
        }
        $path = $category->getUrlPath();
        if($path !== null && !$category->dataHasChangedFor('url_key') && !$category->dataHasChangedFor('parent_id')) {
            return $path;
        }
        $path = $category->getUrlKey();
        if($path === false) {
            return $category->getUrlPath();
        }
        return $path;
    }
}

Then as usual, you will probably need to refresh some stuff :

  • bin/magento module:enable Vendor_Module;
  • bin/magento cache:clean;
  • bin/magento setup:di:compile;
  • bin/magento setup:upgrade;
  • bin/magento setup:static-content:deploy -f;

As noticed above, you could also need to refresh "url_rewrite" table, and save / reindex categories.

PS : @Siarhey Uchukhlebau suggested to implement a fix with the plugin way, which I agree would be probably better than the "preference" solution provided, especially if you already had an extension which override this same class.

// I am pretty new to M2, so any suggestion about my post would be appreciated !

See ya

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.