
Recently I discovered all the product positions after being assigned to a category were defaulted to 1. I needed to change this number to anything other than 1.
I found that Magento currently defaults this number to 1 in their resource model under the function _saveCategories. The entire class would be Mage_Catalog_Model_Resource_Product.
$data[] = array(
    'category_id' => (int)$categoryId,
    'product_id'  => (int)$object->getId(),
    'position'    => 1
);In order to solve this problem, I decided to do a quick rewrite of this resource model. You should rewrite this class in your modules config file like so.
<models>
     <module_name>
         <class>Module_Name_Model</class>
     </module_name>
     <catalog_resource>
         <rewrite>
             <product>Module_Name_Model_Catalog_Resource_Product</product>
         </rewrite>
     </catalog_resource>
</models>Then create the file Module_Name_Model_Catalog_Resource_Product and extend Mage_Catalog_Model_Resource_Product
class Module_Name_Model_Catalog_Resource_Product extends Mage_Catalog_Model_Resource_Product {
    /**
     * Save product category relations
     *
     * @param Varien_Object $object
     * @return Mage_Catalog_Model_Resource_Product
     */
    protected function _saveCategories(Varien_Object $object)
    {
        /**
         * If category ids data is not declared we haven't do manipulations
         */
        if (!$object->hasCategoryIds()) {
            return $this;
        }
        $categoryIds = $object->getCategoryIds();
        $oldCategoryIds = $this->getCategoryIds($object);
        $object->setIsChangedCategories(false);
        $insert = array_diff($categoryIds, $oldCategoryIds);
        $delete = array_diff($oldCategoryIds, $categoryIds);
        $write = $this->_getWriteAdapter();
        if (!empty($insert)) {
            $data = array();
            foreach ($insert as $categoryId) {
                if (empty($categoryId)) {
                    continue;
                }
                $data[] = array(
                    'category_id' => (int)$categoryId,
                    'product_id'  => (int)$object->getId(),
                    'position'    => 9999
                );
            }
            if ($data) {
                $write->insertMultiple($this->_productCategoryTable, $data);
            }
        }
        if (!empty($delete)) {
            foreach ($delete as $categoryId) {
                $where = array(
                    'product_id = ?'  => (int)$object->getId(),
                    'category_id = ?' => (int)$categoryId,
                );
                $write->delete($this->_productCategoryTable, $where);
            }
        }
        if (!empty($insert) || !empty($delete)) {
            $object->setAffectedCategoryIds(array_merge($insert, $delete));
            $object->setIsChangedCategories(true);
        }
        return $this;
    }
}Show us some ❤️
If you found this article useful and informative, please share it with others who may benefit from it. Also, feel free to leave a comment below with your thoughts or any questions you may have.







