:::: MENU ::::

Magento: Filtrar colección de productos

4.67 avg. rating (86% score) - 3 votes

Colección con todos los productos en Magento

Con la siguiente colección podemos obtener todos los productos de nuestra tienda Magento:

  $collection = Mage::getModel('catalog/product')->getCollection();

Colección de productos filtrada por atributo simple en Magento

Si queremos filtrar la colección por un atributo simple (de texto, no dropdown o multiselect), como el nombre de un producto, el SKU, marca o similares, podemos utilizar:

  $collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('sku')
    ->addAttributeToSelect('name')
    ->addAttributeToFilter('name', array('like' => '%' . $nombre . '%'));

Las funciones de filtrado, pueden ser otras como: eq, neq, like, nlike, gt, lt, gteq, lteq.

También podemos pasar arrays a la función de filtrado para las funciones in o nin, según el siguiente modelo:

  $collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('sku')
    ->addAttributeToSelect('name')
    ->addAttributeToFilter('id', array('in' => array(1,4,98));

Colección de productos según atributo Dropdown o Multiselect en Magento

Según indicábamos en el tutotial Filtrar productos por fabricante en Magento en el caso de atributos dropdown o multiselect, no podemos utilizar los valores textuales para consultar la base de datos, sino que tenemos que pasar el identificador de la opción.

Dicho identificador se puede obtener, por ejemplo si tenemos un atributo marca o fabricante, de la siguiente forma:

$marca = Mage::getResourceModel('catalog/product')
                  ->getAttribute('manufacturer')
                  ->getSource()
                  ->getOptionId('Ray ban');

Una vez tenemos el identificador de la opción u opciones, podemos utilizarlo en el filtro de la colección de la forma habitual:

  $collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('sku')
    ->addAttributeToSelect('name')
    ->addAttributeToFilter('manufacturer', array('eq' => $marca);

Colección de productos según varios atributos en Magento

Podemos complicarlo un poco más y querer obtener la colección de productos que tengan dos o más caracteristicas (AND). En el ejemplo siguiente obtenemos la lista de productos con el SKU y nombre similares a los inidicados (ambas condiciones deben cumplirse)

$collection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('sku')
    ->addAttributeToSelect('name')
    ->addAttributeToFilter('sku', array('like' => '%2822%'))
    ->addAttributeToFilter('name', array('like' => '%Ray Ban%'));

También podemos tener el caso de necesitar una u otra condición (OR). En ese caso y repitiendo el ejemplo anterior, tendríamos que escribir los filtros de la siguiente forma:

   $collection = Mage::getModel('catalog/product')->getCollection()
      ->addAttributeToSelect('name')
      ->addAttributeToSort('name', 'ASC')
      ->addAttributeToFilter('sku', array(array('like' => '%2823%'), array('eq' => '2822-8')));

Y si necesitamos una condición OR, pero con diferentes atributos:

   $collection = Mage::getModel('catalog/product')->getCollection()
      ->addAttributeToSelect('name')
      ->addAttributeToFilter(array(array('attribute' => 'sku', 'like' => '%2823%'),
                                   array('attribute' => 'name', 'like' => '%0RB3268%')));

Lista de productos de un tipo en Magento

Si queremos obtener la colección de todos los productos simples, configurables, agrupados, etc. de nuestra tienda Magento, podemos hacerlo de la siguiente forma:

   $collection = Mage::getModel('catalog/product')->getCollection()
      ->addAttributeToSelect('name')
      ->addAttributeToFilter('type_id', array('eq' => 'configurable'));

Colección de productos habilitados en Magento

Para filtrar la colección de productos y obtener únicamente aquellos productos activos en la tienda (habilitados), tendremos que añadir el siguiente filtro:

   $collection = Mage::getModel('catalog/product')->getCollection()
      ->addAttributeToSelect('name')
      ->addFieldToFilter('status', Mage_Catalog_Model_Product_Status::STATUS_ENABLED);



5 Comments

  • Responder Andres |

    Como puedo obtener por ejemplo solo 300 productos de esa colección, para hacer un update del inventario, y despues obtener los siguientes 300 productos para seguir con el update?

    • Responder Daniel Navarro Murillo |

      Para limitar los resultados de la colección, puedes utilizar dos parámetros más:

      $collection->setPageSize(300);
      $collection->setCurPage(1);

      El primero limita los resultados a 300 productos. El segundo indica la página que quieres obtener:

      setCurPage(1) te devuelve los productos del 0 al 299
      setCurPage(2) te devuelve los productos del 300 al 599
      etc.

  • Responder Alejandro Perez |

    $collection = Mage::getModel(‘catalog/product’)->getCollection()
    ->addAttributeToSelect(‘name’)
    ->addFieldToFilter(‘status’, Mage_Catalog_Model_Product_Status::STATUS_ENABLED);

    Esto me sirvio pero a medias, tengo un modulo que es para posicionar los productos en el grid de manera drag and drop (modulo neklo) pero solo toma en cuenta el valor del status establecido en «Todas las vistas de tienda» y no toma en cuenta si el valor cambia a nivel Store.
    Como lo podria solucionar? necesito que tambien tome en cuenta el valor del estado del producto establecido en las diferentes tiendas de mi magento.

  • Responder Milagros |

    Hola como estas, debo hacer lo siguiente,
    colocar como elemento filtrante por pais el stock en tienda superior a 0 es decir que se muestre como filtro si tiene stock o no en una categoria o busqueda

    quera saber si sabias de alguna extension gratuita que haga esto o si sabes como se podria hacer esto?

Hey! Qué opinas sobre el artículo?