How to Assign Product Categories in Purple Programmatically

I am new to purple. Basically, I want to assign several products to several categories. I followed this post and I executed the following code that works fine:

$collection = Mage::getModel('catalog/product')->getCollection();//my coustom collection $categorys_ids = array(1,2,3,4,5);//Array of ids etc if ($categorys_ids != NULL && $collection->getData()!= NULL) { foreach ($collection as $product) { $categories_pd = $product->getCategoryIds(); $product->setCategoryIds(array_merge($product->getCategoryIds(),array($categorys_ids))); $product->save(); } } 

Now the main problem is that when I assign a category identifier to products, it takes a lot of time. I have 200 products, and it takes up to two minutes or so, which is a lot.

I was wondering if there is a way to assign categories to an array of products instead of assigning products to categories or something that can be optimized and done in less time.

+6
source share
3 answers

Here's how you can assign multiple products to a category and merge with existing products.
An example for one category, but you can turn it into a loop to make it work more.

 $categoryId = 6; $category = Mage::getModel('catalog/category')->setStoreId(Mage_Core_Model_App::ADMIN_STORE_ID)->load($categoryId); //get the current products $products = $category->getProductsPosition(); //now attach the other products. $newProductIds = array(1,2,3,4,5); foreach ($newProductIds as $id){ $products[$id] = 1;//you can put any other position number instead of 1. } //attach all the products to the category $category->setPostedProducts($products); //save the category. $category->save(); 

If you want an even faster way to do this, you can do direct inserts in the catalog_category_product table.
Just make sure you flip when you're done.

+8
source

Here's how I did it using some quick array management functions from newer versions of PHP:

 <?php require_once '../../app/Mage.php'; Mage::app(); Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID)); $storeCode = Mage::app()->getStore()->getStoreId(); function addProductsToCategoryId($mergeProductIds, $categoryId, $storeCode) { // load the $category by $categoryId $category = Mage::getModel('catalog/category')->setStoreId($storeCode)->load($categoryId); // build a flipped array of two merged arrays (1) array keys from flipped $mergeProductIds, (2) array keys from product_id keyed array in $category $categoryProductIds = array_flip(array_merge(array_keys(array_flip($mergeProductIds)),array_keys($category->getProductsPosition()))); // combine array_keys from resulting merge with a matched index array filled with '0' // THIS resets position of product within category, change this logic if desired $categoryProductIds = array_combine(array_keys($categoryProductIds), array_fill(0, count($categoryProductIds), '0')); $category->setPostedProducts($categoryProductIds); $category->save(); // optional // return $categoryProductIds; } // optional array of category IDs to test against for nin (not in) or in a find_in_set array test // in the optional example line below, nin (not in) is used $categoryIds = array(5,8,9,10,11,12,45,46); $collectionIds = Mage::getModel('catalog/product')->getCollection() ->setStoreId($storeCode) // optional inclusion of join for category_id ->joinField('category_id', 'catalog/category_product', 'category_id', 'product_id = entity_id', null, 'left') // optional logic to only gather ids that are, or are not in a given categoryIds array, nin (not in) is shown in example // ->addAttributeToFilter('category_id', array('nin' => array('finset' => $categoryIds))) // optional line to test whether product is associated to ANY category ->addAttributeToFilter('category_id', array('null' => true)) // example qualifiers to affect gathered IDs ->addAttributeToFilter('sku', array('like' => 'MH%')) ->addAttributeToFilter('sku', array('nlike' => '%E')) ->addAttributeToFilter('sku', array('nlike' => '%E#')) ->addAttributeToFilter('sku', array('nlike' => '%Euro')) ->addAttributeToFilter('sku', array('nlike' => '%Euro#')) ->getAllIds() ; // if using a return value, you can set the results of this to a variable // to perform further operations against the resulting data addProductsToCategoryId($collectionIds, 8, $storeCode); 

Please note: by default, my method does NOT save the position for products within the categories that you installed. IT WILL will return all positions by default to "0".

It works great. After this, re-scanning is required, adding fast mass. The code is a bit complicated, so explaining the code in direct contextual comments was more reasonable to me in this case.

I included a lot of additional options in it, but all of them are marked as such and fully explained.

0
source

The following code worked for me:

 include '../../app/Mage.php'; Mage::app('admin'); Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID); $product_id = Mage::getModel("catalog/product")->getIdBySku($sku); $product = Mage::getModel('catalog/product')->load($product_id); $product->setCategoryIds($category_id); $product->save(); 
0
source

Source: https://habr.com/ru/post/971699/


All Articles