Magento2 - Obtener URL de categoría por ID

11

Estoy tratando de obtener la clave de URL de cualquier categoría dada con la ID. Tengo esto;

$categoryId = 3;
$_objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$object_manager = $_objectManager->create('Magento\Catalog\Model\Category')->load($categoryId);
print_r($object_manager->getData());

Y esto funciona (en print_r está la clave de URL que necesito), pero la categoría # 3 es la categoría de nivel superior. Cada vez que intento cualquier subcategoría (por ejemplo, ID 5) obtengo una matriz en blanco. Estoy perdido por las palabras, no puedo entenderlo.

En Magento 1.x solía hacer esto: Mage::getModel('catalog/category')->load($catID)->getUrl()y funcionó.

TL; DR: este código funciona, cambie la ID a una ID de categoría (correcta) y cambie getData()a getUrl()la URL completa de la categoría, o getName()para el nombre de la categoría.

Alex Timmer
fuente

Respuestas:

28

Para obtener la url de la categoría, debe usar la \Magento\Catalog\Model\Categoryfunción de esta getUrl()manera:

$category->getUrl()

Además, puede obtener url por CategoryRepositoryInterface

nameSpace ['Your_nameSpace'] 
use Magento\Catalog\Api\CategoryRepositoryInterface;
class ['Your_Class_name']
    protected $_storeManager;
    protected $categoryRepository;
    public function __construct(
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        \Magento\Catalog\Model\CategoryRepository $categoryRepository,
    ) {
        .........
        $this->_storeManager = $storeManager;
        $this->categoryRepository = $categoryRepository;
    }

     public  function getCategory()
    {
            $category = $this->categoryRepository->get($categoryId, $this->_storeManager->getStore()->getId());

        return $category->getUrl();
    }
} 
Amit Bera
fuente
Gracias :) Cambiar getData a getUrl fue la decisión correcta.
Alex Timmer
Trabajando bien, Up votó por ti
Pushpendra Singh
Buena respuesta, muy útil. +1
Shoaib Munir
12

Siempre trate de usar el repositorio. Debe inyectar de la siguiente manera:

/ **
 * @var \ Magento \ Catalog \ Helper \ Category
 * /
protegido $ categoryHelper;

/ **
 * @var \ Magento \ Catalog \ Model \ CategoryRepository
 * /
protegido $ categoryRepository;


función pública __construct (
    \ Magento \ Catálogo \ Helper \ Category $ categoryHelper,
    \ Magento \ Catalog \ Model \ CategoryRepository $ categoryRepository,

) {
    $ this-> categoryHelper = $ categoryHelper;
    $ this-> categoryRepository = $ categoryRepository;
}

Por categoría url

$ categoryId = 3;
$ categoryObj = $ this-> categoryRepository-> get ($ categoryId);
echo $ this-> categoryHelper-> getCategoryUrl ($ categoryObj);
Sohel Rana
fuente
Increíble gracias. Intentaba recorrer las ID con el CategoryModel que estaba recargando los mismos datos a través de iteraciones. ¡Me salvaste después de un montón de rascarse la cabeza!
domdambrogia
6

Puedes probar el siguiente código.

$categoryId = 5;
$_objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$object_manager = $_objectManager->create('Magento\Catalog\Model\Category')->load($categoryId);
echo "<pre>";
print_r($object_manager->getData());

Antes de usar una identificación de categoría, debe confirmar que existe una identificación de categoría en admin o devolverá una matriz vacía.

Hazme saber si tienes alguna pregunta.

Suresh Chikani
fuente
Uh sí, ese es el código exacto que escribí en el OP. Pero tienes razón, probé algunas identificaciones que pensé que existían, pero no.
Alex Timmer
1

Descubrí que cuando necesito URL de categoría de diferentes dominios (por vista de tienda), tenía que crear un nuevo objeto Url por vista de tienda.

use Magento\Catalog\Model\Category;
use Magento\Catalog\Model\ResourceModel\Category\CollectionFactory;
use Magento\Framework\UrlFactory;

class CacheWarmer
{
    /** @var CollectionFactory */
    protected $categoryCollectionFactory;

    /** @var \Magento\Store\Model\StoreManagerInterface */
    protected $storeManager;

    /** @var UrlFactory */
    protected $urlFactory;

    public function __construct(
        CollectionFactory $categoryCollectionFactory,
        \Magento\Store\Model\StoreManagerInterface $storeManager,
        UrlFactory $urlFactory
    )
    {
        $this->categoryCollectionFactory = $categoryCollectionFactory;
        $this->storeManager = $storeManager;
        $this->urlFactory = $urlFactory;
    }

    /**
     * @throws \Magento\Framework\Exception\LocalizedException
     */
    public function execute()
    {
        $stores = $this->storeManager->getStores();

        foreach ($stores as $store) {

            $this->storeManager->setCurrentStore($store);

            $collection = $this->categoryCollectionFactory->create();
            $collection->addUrlRewriteToResult();
            $collection->addIsActiveFilter();

            $urlCreator = $this->urlFactory->create();

            /** @var Category $category */
            foreach ($collection as $category) {

                $requestPath = $category->getRequestPath();
                if (!$requestPath) {
                    continue;
                }

                $url = $urlCreator->getDirectUrl($category->getRequestPath());

                $result = @file_get_contents($url);
            }
        }
    }
}
Patrick van Bergen
fuente
0

Esto funciona bien en mi bloque personalizado (usando el repositorio de categorías y DI):

/**
 * Constructor
 */
public function __construct(
  \Magento\Catalog\Model\CategoryRepository $categoryRepository,
  // ...
) 
{
  $this->_categoryRepository = $categoryRepository;
  // ...
}


/**
 * Return the category object by its id.
 * 
 * @param categoryId (Integer)
 */
public function getCategory($categoryId)
{
  return $this->getCategoryRepository()->get($categoryId);
}


/**
 * Category repository object
 */
protected $_categoryRepository;

Finalmente, dentro de un archivo de plantilla solo uso:

$this->getCategory(3)->getUrl()
Andrea
fuente
0

@andrea Actualiza el método getCategory. O bien funciona bien.

/**
 * Return the category object by its id.
 * 
 * @param categoryId (Integer)
 */
public function getCategory($categoryId)
{
  return $this->_categoryRepository->get($categoryId);
}
Biswajit Paul
fuente