public function upgrade_130() { global $wpdb; $db_version = ShoppSettings::dbversion(); if ($db_version < 1201) { // 1.3 schema changes $this->upschema(); // All existing sessions must be cleared and restarted, 1.3 & 1.3.6 sessions are not compatible with any prior version of Shopp ShoppShopping()->reset(); $sessions_table = ShoppDatabaseObject::tablename('shopping'); sDB::query("DELETE FROM {$sessions_table}"); // Remove all the temporary PHP native session data from the options table sDB::query("DELETE FROM from {$wpdb->options} WHERE option_name LIKE '__php_session_*'"); } if ($db_version < 1200) { $meta_table = ShoppDatabaseObject::tablename('meta'); sDB::query("UPDATE {$meta_table} SET value='on' WHERE name='theme_templates' AND (value != '' AND value != 'off')"); sDB::query("DELETE FROM {$meta_table} WHERE type='image' AND value LIKE '%O:10:\"ShoppError\"%'"); // clean up garbage from legacy bug sDB::query("DELETE FROM {$meta_table} WHERE CONCAT('', name *1) = name AND context = 'category' AND type = 'meta'"); // clean up bad category meta // Update purchase gateway values to match new prefixed class names $gateways = array('PayPalStandard' => 'ShoppPayPalStandard', '_2Checkout' => 'Shopp2Checkout', 'OfflinePayment' => 'ShoppOfflinePayment', 'TestMode' => 'ShoppTestMode', 'FreeOrder' => 'ShoppFreeOrder'); foreach ($gateways as $name => $classname) { sDB::query("UPDATE {$purchase_table} SET gateway='{$classname}' WHERE gateway='{$name}'"); } $activegateways = explode(',', shopp_setting('active_gateways')); foreach ($activegateways as &$setting) { if (false === strpos($setting, 'Shopp')) { $setting = str_replace(array_keys($gateways), $gateways, $setting); } } shopp_set_setting('active_gateways', join(',', $activegateways)); } if ($db_version < 1200 && shopp_setting_enabled('tax_inclusive')) { $price_table = ShoppDatabaseObject::tablename('price'); $taxrates = shopp_setting('taxrates'); $baseop = shopp_setting('base_operations'); $taxtaxes = array(); // Capture taxonomy condition tax rates $basetaxes = array(); // Capture base of operations rate(s) foreach ($taxrates as $rate) { if (!($baseop['country'] == $rate['country'] || ShoppTax::ALL == $rate['country'])) { continue; } if (!empty($rate['zone']) && $baseop['zone'] != $rate['zone']) { continue; } if (!empty($rate['rules']) && $rate['logic'] == 'any') { // Capture taxonomy conditional rates foreach ($rate['rules'] as $raterule) { if ('product-category' == $raterule['p']) { $taxname = ProductCategory::$taxon . '::' . $raterule['v']; } elseif ('product-tags' == $raterule['p']) { $taxname = ProductTag::$taxon . '::' . $raterule['v']; } $taxtaxes[$taxname] = Shopp::floatval($rate['rate']) / 100; } } else { $basetaxes[] = Shopp::floatval($rate['rate']) / 100; } } // Find products by in each taxonomy termno $done = array(); // Capture each set into the "done" list foreach ($taxtaxes as $taxterm => $taxrate) { list($taxonomy, $name) = explode('::', $taxterm); $Collection = new ProductCollection(); $Collection->load(array('ids' => true, 'taxquery' => array(array('taxonomy' => $taxonomy, 'field' => 'name', 'terms' => $name)))); $query = "UPDATE {$price_table} SET price=price+(price*{$taxrate}) WHERE tax='on' AND product IN (" . join(',', $Collection->products) . ")"; sDB::query($query); $done = array_merge($done, $Collection->products); } // Update the rest of the prices (skipping those we've already done) with the tax rate that matches the base of operations $taxrate = array_sum($basetaxes); // Merge all the base taxes into a single rate $done = empty($done) ? '' : " AND product NOT IN (" . join(',', $done) . ")"; $query = "UPDATE {$price_table} SET price=price+(price*{$taxrate}) WHERE tax='on'{$done}"; sDB::query($query); } }