この機能を追加する必要があり、作成する前にそのようなプラグインが存在するかどうかを知りたいです。
5 に答える
CSV にないファイルを無効にするプラグインを作成しました。何か問題が発生した場合に備えて、アイテムを実際に削除するのではなく、アイテムを無効にすることを好みます(データベースが消去されません)。
プラグイン ファイルを作成する
magmi/plugins/extra/general/itemdisabler/magmi_itemdisabler_plugin.php
ファイルに次を貼り付けて保存します。
プラグイン コード:
<?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's items.
$this->log('All items present in datasource. No items to disable.', "info");
}
}
}
次に、Magmi にログインし、プラグインを有効にしてインポートを実行します。このプラグインは、インポートが完了した後に実行されます。データソースを開き、すべての SKU をログに記録してから、それらを Magento データベースと比較します。データソースで見つからない sku は無効になります。このプラグインはもう少し最適化することができますが、現在はそのまま動作します。
手抜きで削除するより、積極的に削除したほうがいいと思います。変換アダプターを適応させて列を解析し (「削除済み」など)、_isDeleted
プロパティを に設定するのは簡単true
です。これにより、製品は保存時に削除されます。
参考文献Mage_Core_Model_Abstract
とVarien_Object
。
製品のリストが非常に多く、この無効化機能を実行しようとすると、問題が発生する可能性があることに言及したいと思います。私はmagmiにあまり詳しくありませんが、cliを使用するとエラーが表示されるように見えるので、無効化が機能していないことに気付いた場合はテストしてみてください. それは私にとってはうまくいかなかったので、PHPのメモリ制限に絞り込みました。ini_set('memory_limit','512M'); を含めるようにスクリプトを変更する必要がありました。disableItems 関数で。
だから、私は今このように見えます....
public function disableItems()
{
ini_set('max_execution_time', 0);
set_time_limit(0);
ini_set('memory_limit','512M');
umask(0);
これに問題がある場合は、誰でも役立つことを願っています。また、必要な限り実行するように設定する必要がありました。構成ファイルでこれを設定するのが最善かもしれませんが、特に共有ホストを使用している場合は、これが迅速な解決策です。
組み込みの製品削除機能を試してみましたが、期待どおりには機能しませんでした。古い製品は削除されますが、再度追加すると記事番号が増加するため、数回インポートした後、記事番号は 1xxxxx になります。
CSV からインポートされた製品のみがあり、「常に」そこにある製品がない場合、magmi の前に実際に php スクリプトを使用してすべての製品を削除します。
<?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();
?>
それが役立つことを願っています。