Is there a plugin for Magmi that removes products that are not in the CSV file?

I need to add this function, and I want to know if such a plugin exists before it is written.

+4
source share
5 answers

I created a plugin that disconnects files not in CSV. I prefer to disable items rather than deleting them in case something goes wrong (it will not destroy my database).

  • Create the plugin file magmi/plugins/extra/general/itemdisabler/magmi_itemdisabler_plugin.php

  • In the file, paste the following and save:

Plugin code:

 <?php class Magmi_ItemdisablerPlugin extends Magmi_ItemProcessor { protected $datasource_skus = array(); public function getPluginInfo() { return array("name"=>"Magmi Magento Item Disabler", "author"=>"Axel Norvell (axelnorvell.com)", "version"=>"1.0.6"); } public function afterImport() { $this->log("Running Item Disabler Plugin","info"); $this->disableItems(); return true; } public function getPluginParams($params) { return array(); } public function isRunnable() { return array(true,""); } public function initialize($params) { } public function processItemAfterId(&$item,$params=null) { if(isset($item['sku'])) { $this->datasource_skus[] = $item['sku']; } } public function disableItems() { if(count($this->datasource_skus) <= 0) { $this->log('No items were found in datasource. Item Disabler will not run.', "info"); return false; /* Nothing to disable */ } //Setup tables $ea = $prefix!=""?$prefix."eav_attribute":"eav_attribute"; $eet = $prefix!=""?$prefix."eav_entity_type":"eav_entity_type"; $cpe = $prefix!=""?$prefix."catalog_product_entity":"catalog_product_entity"; $cpei = $prefix!=""?$prefix."catalog_product_entity_int":"catalog_product_entity_int"; //Get "status" attribute_id $status_attr_id = " SELECT ea.attribute_id FROM $ea ea LEFT JOIN $eet eet ON ea.entity_type_id = eet.entity_type_id WHERE ea.attribute_code = 'status' AND eet.entity_type_code = 'catalog_product'"; $result = $this->selectAll($status_attr_id); if (count($result) == 1) { $attribute_id = $result[0]['attribute_id']; } unset($result); //Get all active items $sql = "SELECT e.sku, e.entity_id FROM $cpei i INNER JOIN $cpe e ON e.entity_id = i.entity_id WHERE attribute_id=? AND i.value = 1"; $all_magento_items = $this->selectAll($sql, array($attribute_id)); //Setup the magento_skus array for easy processing. $magento_skus = array(); foreach($all_magento_items as $item) { $this->log("{$item['sku']} found in Mage", "info"); $magento_skus[$item['sku']] = $item['entity_id']; } //process the array, move anything thats in the datasource. foreach($this->datasource_skus as $sku) { if(isset($magento_skus[$sku])) { unset($magento_skus[$sku]); } } if(!empty($magento_skus)) { foreach($magento_skus as $sku => $id) { $this->log("Disabling Item Id $id with SKU: $sku", "info"); $this->update(" UPDATE $cpei i INNER JOIN $cpe e ON e.entity_id = i.entity_id SET VALUE = '2' WHERE attribute_id = ? AND i.value = 1 AND e.sku=?", array($attribute_id, $sku)); } } else { //If the Datasource contains all Magento items. $this->log('All items present in datasource. No items to disable.', "info"); } } } 

Then log into Magmi, enable the plugin, and start the import. This plugin will be executed after the import is completed. It opens a data source, registers all SKUs, then compares them with the Magento database. Any skus that are not found in the data source are disabled. This plugin can be optimized a little better, but it works as it is now.

+5
source

I would think that it is much better to delete in the affirmative, rather than delete without omission. It is incorrect to adapt the conversion adapter for column analysis (for example, "remote") and set the _isDeleted property to true . This will remove the product while saving.

Ref Mage_Core_Model_Abstract and Varien_Object .

+2
source

I tried it with the built-in product deleter, but it did not work as expected. It removes old products, but when it adds them again, it increases the article number, so after several import operations you have the article number 1xxxxx.

If I only have products imported from CSV and no products that are β€œalways”, I actually use the php script before magmi to remove all products:

  <?php $mysqli = new mysqli("localhost", "dbuser", "dbpassword", "db"); /* check connection */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } $query = " SET FOREIGN_KEY_CHECKS = 0; TRUNCATE TABLE `catalog_product_bundle_price_index`; TRUNCATE TABLE `catalog_product_bundle_selection`; TRUNCATE TABLE `catalog_product_bundle_selection_price`; TRUNCATE TABLE `catalog_product_bundle_option_value`; TRUNCATE TABLE `catalog_product_bundle_option`; TRUNCATE TABLE `catalog_product_entity_datetime`; TRUNCATE TABLE `catalog_product_entity_decimal`; TRUNCATE TABLE `catalog_product_entity_gallery`; TRUNCATE TABLE `catalog_product_entity_group_price`; TRUNCATE TABLE `catalog_product_entity_int`; TRUNCATE TABLE `catalog_product_entity_media_gallery`; TRUNCATE TABLE `catalog_product_entity_media_gallery_value`; TRUNCATE TABLE `catalog_product_entity_text`; TRUNCATE TABLE `catalog_product_entity_tier_price`; TRUNCATE TABLE `catalog_product_entity_varchar`; TRUNCATE TABLE `catalog_product_flat_1`; TRUNCATE TABLE `catalog_product_link`; TRUNCATE TABLE `catalog_product_link_attribute_decimal`; TRUNCATE TABLE `catalog_product_link_attribute_int`; TRUNCATE TABLE `catalog_product_link_attribute_varchar`; TRUNCATE TABLE `catalog_product_option`; TRUNCATE TABLE `catalog_product_option_price`; TRUNCATE TABLE `catalog_product_option_title`; TRUNCATE TABLE `catalog_product_option_type_price`; TRUNCATE TABLE `catalog_product_option_type_title`; TRUNCATE TABLE `catalog_product_option_type_value`; TRUNCATE TABLE `catalog_product_super_attribute_label`; TRUNCATE TABLE `catalog_product_super_attribute_pricing`; TRUNCATE TABLE `catalog_product_super_attribute`; TRUNCATE TABLE `catalog_product_super_link`; TRUNCATE TABLE `catalog_product_enabled_index`; TRUNCATE TABLE `catalog_product_website`; TRUNCATE TABLE `catalog_category_product_index`; TRUNCATE TABLE `catalog_product_index_price`; TRUNCATE TABLE `catalog_product_index_eav`; TRUNCATE TABLE `catalog_category_product`; TRUNCATE TABLE `catalog_product_index_eav_idx`; TRUNCATE TABLE `catalog_product_entity`; TRUNCATE TABLE `catalog_product_relation`; TRUNCATE TABLE `catalog_product_index_price_idx`; TRUNCATE TABLE `catalog_product_index_website`; TRUNCATE TABLE `cataloginventory_stock_item`; TRUNCATE TABLE `cataloginventory_stock_status`; TRUNCATE TABLE `core_url_rewrite`; SET FOREIGN_KEY_CHECKS = 1; "; $results = mysqli_multi_query($mysqli,$query); $mysqli->close(); ?> 

Hope this helps.

0
source

I thought I wanted to mention that people can run into problems if they have a really large list of products and try to run this disabler. I am not very familiar with magmi, but it seems that when using cli there are more errors, so try testing with this if you notice that the arrangement does not work. This did not work for me and I narrowed it down to php memory limits. I had to modify the script to include ini_set ('memory_limit', '512M'); in the disableItems function.

So mine now looks like this ....

 public function disableItems() { ini_set('max_execution_time', 0); set_time_limit(0); ini_set('memory_limit','512M'); umask(0); 

I hope this helps someone if they have problems with this. I also had to make me work while it was required, and that was it. It is best to set this in your configuration files, but this is a quick resolution, especially if you use a shared host.

0
source

Here's the Magmi plugin that does exactly what you are looking for imo: http://www.emvee-solutions.com/blog/magmi-delete-disable-products-missing-csv-source/

0
source

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


All Articles