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.

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();
    }
} 

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);

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.


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);
            }
        }
    }
}

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()

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);
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.