Changeset 3199369
- Timestamp:
- 11/29/2024 10:54:13 AM (16 months ago)
- Location:
- product-feeder
- Files:
-
- 13 added
- 5 edited
-
tags/4.1.0 (added)
-
tags/4.1.0/includes (added)
-
tags/4.1.0/includes/css (added)
-
tags/4.1.0/includes/css/product-feeder.css (added)
-
tags/4.1.0/includes/javascript (added)
-
tags/4.1.0/includes/javascript/product-feeder.js (added)
-
tags/4.1.0/includes/product-feeder.php (added)
-
tags/4.1.0/languages (added)
-
tags/4.1.0/languages/product-feeder-nl_NL.mo (added)
-
tags/4.1.0/languages/product-feeder-nl_NL.po (added)
-
tags/4.1.0/product-feeder.php (added)
-
tags/4.1.0/readme.txt (added)
-
tags/4.1.0/uninstall.php (added)
-
trunk/includes/product-feeder.php (modified) (14 diffs)
-
trunk/languages/product-feeder-nl_NL.mo (modified) (previous)
-
trunk/languages/product-feeder-nl_NL.po (modified) (2 diffs)
-
trunk/product-feeder.php (modified) (3 diffs)
-
trunk/readme.txt (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
product-feeder/trunk/includes/product-feeder.php
r3191409 r3199369 1 1 <?php 2 3 //TODO REMOVE 4 //https://developer.woocommerce.com/docs/hpos-extension-recipe-book/?_gl=1*1886zt6*_gcl_au*MTM0NTQzNjEwMS4xNzMyMjg0NTI5*_ga*MTEwNzU0OTg3NC4xNzMyMjcyMjU2*_ga_98K30SHWB2*MTczMjcyODkzMC4yLjAuMTczMjcyODkzMC4wLjAuMA.. 5 6 use Automattic\WooCommerce\Utilities\OrderUtil; 7 use Automattic\WooCommerce\Internal\DataStores\Orders\CustomOrdersTableController; 2 8 class Product_Feeder { 3 9 … … 10 16 //svn commit -m "Updated to version X" 11 17 18 private $Name = ''; 19 private $Version = 'UNKNOWN'; 12 20 private $WPMLActive = false; 21 private $IsHPOSEnabled = false; 13 22 private $AttributeValues = array(); 14 23 private $AttributeTaxonomies = NULL; 15 24 private $AttributeDisplayValues = array(); 16 25 17 public function __construct() { 26 public function __construct($PluginName) { 27 $this->Name = $PluginName; 28 add_action('before_woocommerce_init', function() { 29 //DECLARE HPOS COMPATIBLE 30 if (class_exists( \Automattic\WooCommerce\Utilities\FeaturesUtil::class)) { 31 \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', __FILE__, true ); 32 } 33 }); 18 34 if (!defined('ABSPATH')) exit; //PREVENT DIRECT ACCESS TO THE FILE 19 35 if (!function_exists('is_plugin_active')) require_once(ABSPATH.'wp-admin/includes/plugin.php'); 20 36 $this->WPMLActive = is_plugin_active('sitepress-multilingual-cms/sitepress.php'); 37 $Information = get_file_data(__DIR__."/../product-feeder.php", array('Version' => 'Version'), false); 38 if (isset($Information['Version'])) $this->Version = $Information['Version']; 21 39 } 22 40 23 41 public function Run() { 24 add_action('admin_enqueue_scripts', function () {25 if (is_admin()) wp_enqueue_style('product-feeder-style', plugins_url('css/product-feeder.css?time='.@filemtime(__DIR__ . "/../includes/css/product-feeder.css"), __FILE__));26 });27 add_action('admin_menu', function() { add_menu_page(__('Product Feeder', 'product-feeder'), __('Product Feeder', 'product-feeder'), 'manage_options', 'product-feeder-settings', array($this, 'GetSettingsPage' ), 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzIuNTQgMTczLjk5Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6IzJhMjg0YTt9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOTUuMyw0Mi43MWMwLDQuNTEtMy42Niw4LjE3LTguMTcsOC4xN3MtOC4xNy0zLjY2LTguMTctOC4xNywzLjY2LTguMTcsOC4xNy04LjE3LDguMTcsMy42Niw4LjE3LDguMTciLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMzUuNjMsMjMuNDZjMCwzLjc5LTMuMDcsNi44NS02Ljg1LDYuODVzLTYuODUtMy4wNy02Ljg1LTYuODUsMy4wNy02Ljg1LDYuODUtNi44NSw2Ljg1LDMuMDcsNi44NSw2Ljg1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTQ3Ljc2LDI2LjFjMCwyLjE4LTEuNzcsMy45NS0zLjk2LDMuOTVzLTMuOTUtMS43Ny0zLjk1LTMuOTUsMS43Ny0zLjk2LDMuOTUtMy45NiwzLjk2LDEuNzcsMy45NiwzLjk2Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTEyLjYzLDIwLjAzYzUuMzEsMy4zMiw2LjkyLDEwLjMxLDMuNiwxNS42Mi0zLjMyLDUuMzEtMTAuMzIsNi45Mi0xNS42MiwzLjYtNS4zMS0zLjMyLTYuOTItMTAuMzItMy42LTE1LjYyLDMuMzItNS4zMSwxMC4zMi02LjkyLDE1LjYyLTMuNTkiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMjEuMTMsNTEuNjdjMCw0LjUxLTMuNjYsOC4xNy04LjE3LDguMTdzLTguMTctMy42Ni04LjE3LTguMTcsMy42Ni04LjE3LDguMTctOC4xNyw4LjE3LDMuNjYsOC4xNyw4LjE3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTY0LjYzLDYwLjYzYzAsMy43OS0zLjA3LDYuODUtNi44NSw2Ljg1cy02Ljg1LTMuMDctNi44NS02Ljg1LDMuMDctNi44NSw2Ljg1LTYuODUsNi44NSwzLjA3LDYuODUsNi44NSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTE3Mi41NCw3MS43YzAsMi4xOC0xLjc3LDMuOTYtMy45NiwzLjk2cy0zLjk1LTEuNzctMy45NS0zLjk2LDEuNzctMy45NSwzLjk1LTMuOTUsMy45NiwxLjc3LDMuOTYsMy45NSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTE0OC4wMiw1Mi40NmMwLDYuMjYtNS4wOCwxMS4zMy0xMS4zMywxMS4zM3MtMTEuMzQtNS4wOC0xMS4zNC0xMS4zMyw1LjA4LTExLjM0LDExLjM0LTExLjM0LDExLjMzLDUuMDgsMTEuMzMsMTEuMzQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMzYuOTUsNzQuMDhjMCw0LjUxLTMuNjYsOC4xNy04LjE3LDguMTdzLTguMTctMy42Ni04LjE3LTguMTcsMy42Ni04LjE3LDguMTctOC4xNyw4LjE3LDMuNjYsOC4xNyw4LjE3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTY2LjQ3LDEwNy44MmMwLDMuNzktMy4wNyw2Ljg1LTYuODUsNi44NXMtNi44NS0zLjA3LTYuODUtNi44NSwzLjA3LTYuODUsNi44NS02Ljg1LDYuODUsMy4wNyw2Ljg1LDYuODUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xNjEuNDYsMTE5LjE1Yy0yLjExLjI2LTMuNDMsMi4zNy0zLjE2LDQuNDguMjYsMi4xMSwyLjM3LDMuNDMsNC40OCwzLjE2LDIuMTEtLjI2LDMuNDMtMi4zNywzLjE2LTQuNDgtLjI2LTIuMTEtMi4zNy0zLjQzLTQuNDgtMy4xNloiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xNTguNTYsODguNTdjMCw2LjI2LTUuMDgsMTEuMzQtMTEuMzQsMTEuMzRzLTExLjMzLTUuMDgtMTEuMzMtMTEuMzQsNS4wOC0xMS4zMywxMS4zMy0xMS4zMywxMS4zNCw1LjA4LDExLjM0LDExLjMzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTM2LjQyLDEwMS40OWMwLDQuNTEtMy42Niw4LjE3LTguMTcsOC4xN3MtOC4xNy0zLjY2LTguMTctOC4xNywzLjY2LTguMTcsOC4xNy04LjE3LDguMTcsMy42Niw4LjE3LDguMTciLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMzYuMDIsMTQwLjVjMy41MiwxLjM5LDUuMjUsNS4zNywzLjg2LDguODktMS4zOSwzLjUyLTUuMzcsNS4yNS04Ljg5LDMuODYtMy41Mi0xLjM5LTUuMjUtNS4zNy0zLjg2LTguODksMS4zOS0zLjUyLDUuMzctNS4yNSw4Ljg5LTMuODYiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMjguMjUsMTU3LjExYy0xLjg1LTEuMDUtNC4yMi0uMjYtNS4yNywxLjU4LTEuMDUsMS44NS0uMjYsNC4yMiwxLjU4LDUuMjcsMS44NSwxLjA1LDQuMjIuMjYsNS4yNy0xLjU4LDEuMDYtMS44NS4yNi00LjIyLTEuNTgtNS4yN1oiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xNDUuOTEsMTI0LjE2YzAsNi4yNi01LjA4LDExLjMzLTExLjMzLDExLjMzcy0xMS4zNC01LjA4LTExLjM0LTExLjMzLDUuMDgtMTEuMzQsMTEuMzQtMTEuMzQsMTEuMzMsNS4wOCwxMS4zMywxMS4zNCIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTExOS44MSwxMjMuMzdjMCw0LjUxLTMuNjYsOC4xNy04LjE3LDguMTdzLTguMTctMy42Ni04LjE3LTguMTcsMy42Ni04LjE3LDguMTctOC4xNyw4LjE3LDMuNjYsOC4xNyw4LjE3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOTIuODUsMTU3LjQxYzMuMjMsMS45Nyw0LjI2LDYuMTksMi4yOSw5LjQyLTEuOTcsMy4yMy02LjE5LDQuMjYtOS40MiwyLjI5LTMuMjMtMS45Ny00LjI2LTYuMTktMi4yOS05LjQyLDEuOTctMy4yMyw2LjE5LTQuMjYsOS40Mi0yLjI5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNzkuNDgsMTcwLjAzYzAsMi4xOC0xLjc3LDMuOTYtMy45NiwzLjk2cy0zLjk1LTEuNzctMy45NS0zLjk2LDEuNzctMy45NSwzLjk1LTMuOTUsMy45NiwxLjc3LDMuOTYsMy45NSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTEwOS4wNywxMzUuNjNjNS40OCwzLjAzLDcuNDcsOS45Miw0LjQ0LDE1LjQtMy4wMyw1LjQ4LTkuOTIsNy40Ny0xNS40LDQuNDQtNS40OC0zLjAyLTcuNDctOS45Mi00LjQ0LTE1LjQsMy4wMy01LjQ4LDkuOTItNy40NywxNS40LTQuNDQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im05Mi44LDEyNy41NWMyLjA2LDQuMDIuNDcsOC45NC0zLjU1LDExLTQuMDIsMi4wNi04Ljk0LjQ2LTExLTMuNTUtMi4wNi00LjAyLS40Ni04Ljk0LDMuNTUtMTEsNC4wMi0yLjA2LDguOTQtLjQ3LDExLDMuNTUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im01MC43NSwxNTAuNTJjMCwzLjc4LTMuMDcsNi44NS02Ljg1LDYuODVzLTYuODUtMy4wNy02Ljg1LTYuODUsMy4wNy02Ljg1LDYuODUtNi44NSw2Ljg1LDMuMDcsNi44NSw2Ljg1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMzIuODIsMTQ3Ljg5YzAsMi4xOC0xLjc3LDMuOTYtMy45NSwzLjk2cy0zLjk2LTEuNzctMy45Ni0zLjk2LDEuNzctMy45NSwzLjk2LTMuOTUsMy45NSwxLjc3LDMuOTUsMy45NSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTY3LjczLDEzMy4wOGM2LjE5Ljk1LDEwLjQ0LDYuNzMsOS40OSwxMi45Mi0uOTUsNi4xOS02LjczLDEwLjQ0LTEyLjkyLDkuNDktNi4xOS0uOTUtMTAuNDQtNi43My05LjQ5LTEyLjkyLjk1LTYuMTksNi43My0xMC40NCwxMi45Mi05LjQ5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNjcuODgsMTIyLjMyYzAsNC41MS0zLjY2LDguMTctOC4xNyw4LjE3cy04LjE3LTMuNjYtOC4xNy04LjE3LDMuNjYtOC4xNyw4LjE3LTguMTcsOC4xNywzLjY2LDguMTcsOC4xNyIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTIxLjc1LDExMy4zNWMwLDMuNzktMy4wNyw2Ljg1LTYuODUsNi44NXMtNi44NS0zLjA3LTYuODUtNi44NSwzLjA3LTYuODUsNi44NS02Ljg1LDYuODUsMy4wNyw2Ljg1LDYuODUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im02LjcyLDEwNS4xOGMxLjU4LTEuNTgsMS41OC0zLjk1LDAtNS41NC0xLjU4LTEuNTgtMy45NS0xLjU4LTUuNTQsMC0xLjU4LDEuNTgtMS41OCwzLjk1LDAsNS41NCwxLjU4LDEuMzIsMy45NiwxLjMyLDUuNTQsMFoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im00Ny4zMiwxMjEuNTNjMCw2LjI2LTUuMDgsMTEuMzQtMTEuMzQsMTEuMzRzLTExLjMzLTUuMDgtMTEuMzMtMTEuMzQsNS4wOC0xMS4zMywxMS4zMy0xMS4zMywxMS4zNCw1LjA4LDExLjM0LDExLjMzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNTIuMDYsOTkuOTFjMCw0LjUxLTMuNjYsOC4xNy04LjE3LDguMTdzLTguMTctMy42Ni04LjE3LTguMTcsMy42Ni04LjE3LDguMTctOC4xNyw4LjE3LDMuNjYsOC4xNyw4LjE3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTkuOSw2Ni4xN2MwLDMuNzgtMy4wNyw2Ljg1LTYuODUsNi44NXMtNi44NS0zLjA3LTYuODUtNi44NSwzLjA3LTYuODUsNi44NS02Ljg1LDYuODUsMy4wNyw2Ljg1LDYuODUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMS4yLDU0LjgzYzIuMTEtLjI2LDMuNDMtMi4zNywzLjE2LTQuNDgtLjI2LTIuMTEtMi4zNy0zLjQzLTQuNDgtMy4xNi0yLjExLjI2LTMuNDMsMi4zNy0zLjE2LDQuNDguNTMsMi4xMSwyLjM3LDMuNDMsNC40OCwzLjE2WiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTM2Ljc3LDg1LjQxYzAsNi4yNi01LjA4LDExLjMzLTExLjMzLDExLjMzcy0xMS4zNC01LjA4LTExLjM0LTExLjMzLDUuMDgtMTEuMzQsMTEuMzQtMTEuMzQsMTEuMzMsNS4wOCwxMS4zMywxMS4zNCIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTUyLjU5LDcyLjQ5YzAsNC41MS0zLjY2LDguMTctOC4xNyw4LjE3cy04LjE3LTMuNjYtOC4xNy04LjE3LDMuNjYtOC4xNyw4LjE3LTguMTcsOC4xNywzLjY2LDguMTcsOC4xNyIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTQyLjA0LDIwLjg4YzMuNDQsMS41OCw0Ljk1LDUuNjUsMy4zNyw5LjA5LTEuNTgsMy40NC01LjY0LDQuOTUtOS4wOSwzLjM4LTMuNDQtMS41OC00Ljk1LTUuNjUtMy4zOC05LjA5LDEuNTgtMy40NCw1LjY1LTQuOTUsOS4wOS0zLjM3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNDQuNDIsMTYuODdjMS44NSwxLjA1LDQuMjIuMjYsNS4yNy0xLjU4LDEuMDUtMS44NS4yNi00LjIyLTEuNTgtNS4yNy0xLjg1LTEuMDUtNC4yMi0uMjYtNS4yNywxLjU4LTEuMDYsMS44NS0uMjYsNC4yMiwxLjU4LDUuMjdaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNDkuNDMsNDkuODJjMCw2LjI2LTUuMDgsMTEuMzQtMTEuMzQsMTEuMzRzLTExLjMzLTUuMDgtMTEuMzMtMTEuMzQsNS4wOC0xMS4zMywxMS4zMy0xMS4zMywxMS4zNCw1LjA4LDExLjM0LDExLjMzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNjYuNzYsNDQuODFjMy4xOSwzLjE5LDMuMTksOC4zNiwwLDExLjU2LTMuMTksMy4xOS04LjM3LDMuMTktMTEuNTYsMC0zLjE5LTMuMTktMy4xOS04LjM3LDAtMTEuNTYsMy4xOS0zLjE5LDguMzYtMy4xOSwxMS41NiwwIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtODUuMDEsNC4wNWMzLjY4LjksNS45Myw0LjYsNS4wNCw4LjI4LS45LDMuNjgtNC42LDUuOTMtOC4yOCw1LjA0LTMuNjgtLjktNS45My00LjYtNS4wNC04LjI4LjktMy42OCw0LjYtNS45Myw4LjI4LTUuMDQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMDEuMSwzLjk2YzAsMi4xOC0xLjc3LDMuOTUtMy45NSwzLjk1cy0zLjk2LTEuNzctMy45Ni0zLjk1LDEuNzctMy45NiwzLjk2LTMuOTYsMy45NSwxLjc3LDMuOTUsMy45NiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTc0LjgzLDE4LjY4YzUuMzksMy4xOSw3LjE3LDEwLjE0LDMuOTksMTUuNTMtMy4xOCw1LjM5LTEwLjE0LDcuMTctMTUuNTIsMy45OS01LjM5LTMuMTktNy4xNy0xMC4xNC0zLjk5LTE1LjUzLDMuMTgtNS4zOSwxMC4xNC03LjE3LDE1LjUyLTMuOTkiLz48L3N2Zz4=', 99); });28 add_action('admin_init', array($this, 'GetSettings' ));29 42 add_action('init', function() { 43 $this->IsHPOSEnabled = OrderUtil::custom_orders_table_usage_is_enabled(); 30 44 load_plugin_textdomain('product-feeder', false, 'product-feeder/languages'); 45 add_action('add_meta_boxes', array($this, 'AddCustomOrderSidebarMetabox')); 31 46 foreach (wc_get_order_statuses() as $value => $label) { 32 47 $value = str_replace("wc-", "", $value); //REMOVE wc- from order-value … … 52 67 if (update_option('product-feeder-shipped-order-statuses', $DefaultShippedOrderStatuses) === false) wp_die(sprintf(__('Failed to set shipped statuses for orders to: %s', 'product-feeder'), implode(',', $DefaultShippedOrderStatuses))); 53 68 } 69 add_filter('is_protected_meta', array($this, 'ProtectCustomMetaFields'), 10, 2); 54 70 }); 71 add_action('admin_enqueue_scripts', function () { 72 if (is_admin()) { 73 wp_enqueue_script('product-feeder-script', plugins_url('javascript/product-feeder.js?time='.@filemtime(__DIR__ . "/javascript/product-feeder.js"), __FILE__)); 74 wp_localize_script('product-feeder-script', 'product_feeder_params', array('ajax_url' => admin_url('admin-ajax.php'), 'translations' => array('downloading' => array('start' => sprintf(__('Downloading: %s', 'product-feeder'), "[VAR][DOCUMENT]"), 'error' => sprintf(__('Downloading: %s failed. Error: %s', 'product-feeder'), '[VAR][DOCUMENT]', '[VAR][ERROR]'))))); 75 wp_enqueue_style('product-feeder-style', plugins_url('css/product-feeder.css?time='.@filemtime(__DIR__ . "/css/product-feeder.css"), __FILE__)); 76 } 77 }); 78 add_action('admin_menu', function() { add_menu_page(__('Product Feeder', 'product-feeder'), __('Product Feeder', 'product-feeder'), 'manage_options', 'product-feeder-settings', array($this, 'GetSettingsPage' ), 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNzIuNTQgMTczLjk5Ij48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6IzJhMjg0YTt9PC9zdHlsZT48L2RlZnM+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOTUuMyw0Mi43MWMwLDQuNTEtMy42Niw4LjE3LTguMTcsOC4xN3MtOC4xNy0zLjY2LTguMTctOC4xNywzLjY2LTguMTcsOC4xNy04LjE3LDguMTcsMy42Niw4LjE3LDguMTciLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMzUuNjMsMjMuNDZjMCwzLjc5LTMuMDcsNi44NS02Ljg1LDYuODVzLTYuODUtMy4wNy02Ljg1LTYuODUsMy4wNy02Ljg1LDYuODUtNi44NSw2Ljg1LDMuMDcsNi44NSw2Ljg1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTQ3Ljc2LDI2LjFjMCwyLjE4LTEuNzcsMy45NS0zLjk2LDMuOTVzLTMuOTUtMS43Ny0zLjk1LTMuOTUsMS43Ny0zLjk2LDMuOTUtMy45NiwzLjk2LDEuNzcsMy45NiwzLjk2Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTEyLjYzLDIwLjAzYzUuMzEsMy4zMiw2LjkyLDEwLjMxLDMuNiwxNS42Mi0zLjMyLDUuMzEtMTAuMzIsNi45Mi0xNS42MiwzLjYtNS4zMS0zLjMyLTYuOTItMTAuMzItMy42LTE1LjYyLDMuMzItNS4zMSwxMC4zMi02LjkyLDE1LjYyLTMuNTkiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMjEuMTMsNTEuNjdjMCw0LjUxLTMuNjYsOC4xNy04LjE3LDguMTdzLTguMTctMy42Ni04LjE3LTguMTcsMy42Ni04LjE3LDguMTctOC4xNyw4LjE3LDMuNjYsOC4xNyw4LjE3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTY0LjYzLDYwLjYzYzAsMy43OS0zLjA3LDYuODUtNi44NSw2Ljg1cy02Ljg1LTMuMDctNi44NS02Ljg1LDMuMDctNi44NSw2Ljg1LTYuODUsNi44NSwzLjA3LDYuODUsNi44NSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTE3Mi41NCw3MS43YzAsMi4xOC0xLjc3LDMuOTYtMy45NiwzLjk2cy0zLjk1LTEuNzctMy45NS0zLjk2LDEuNzctMy45NSwzLjk1LTMuOTUsMy45NiwxLjc3LDMuOTYsMy45NSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTE0OC4wMiw1Mi40NmMwLDYuMjYtNS4wOCwxMS4zMy0xMS4zMywxMS4zM3MtMTEuMzQtNS4wOC0xMS4zNC0xMS4zMyw1LjA4LTExLjM0LDExLjM0LTExLjM0LDExLjMzLDUuMDgsMTEuMzMsMTEuMzQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMzYuOTUsNzQuMDhjMCw0LjUxLTMuNjYsOC4xNy04LjE3LDguMTdzLTguMTctMy42Ni04LjE3LTguMTcsMy42Ni04LjE3LDguMTctOC4xNyw4LjE3LDMuNjYsOC4xNyw4LjE3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTY2LjQ3LDEwNy44MmMwLDMuNzktMy4wNyw2Ljg1LTYuODUsNi44NXMtNi44NS0zLjA3LTYuODUtNi44NSwzLjA3LTYuODUsNi44NS02Ljg1LDYuODUsMy4wNyw2Ljg1LDYuODUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xNjEuNDYsMTE5LjE1Yy0yLjExLjI2LTMuNDMsMi4zNy0zLjE2LDQuNDguMjYsMi4xMSwyLjM3LDMuNDMsNC40OCwzLjE2LDIuMTEtLjI2LDMuNDMtMi4zNywzLjE2LTQuNDgtLjI2LTIuMTEtMi4zNy0zLjQzLTQuNDgtMy4xNloiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xNTguNTYsODguNTdjMCw2LjI2LTUuMDgsMTEuMzQtMTEuMzQsMTEuMzRzLTExLjMzLTUuMDgtMTEuMzMtMTEuMzQsNS4wOC0xMS4zMywxMS4zMy0xMS4zMywxMS4zNCw1LjA4LDExLjM0LDExLjMzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTM2LjQyLDEwMS40OWMwLDQuNTEtMy42Niw4LjE3LTguMTcsOC4xN3MtOC4xNy0zLjY2LTguMTctOC4xNywzLjY2LTguMTcsOC4xNy04LjE3LDguMTcsMy42Niw4LjE3LDguMTciLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMzYuMDIsMTQwLjVjMy41MiwxLjM5LDUuMjUsNS4zNywzLjg2LDguODktMS4zOSwzLjUyLTUuMzcsNS4yNS04Ljg5LDMuODYtMy41Mi0xLjM5LTUuMjUtNS4zNy0zLjg2LTguODksMS4zOS0zLjUyLDUuMzctNS4yNSw4Ljg5LTMuODYiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMjguMjUsMTU3LjExYy0xLjg1LTEuMDUtNC4yMi0uMjYtNS4yNywxLjU4LTEuMDUsMS44NS0uMjYsNC4yMiwxLjU4LDUuMjcsMS44NSwxLjA1LDQuMjIuMjYsNS4yNy0xLjU4LDEuMDYtMS44NS4yNi00LjIyLTEuNTgtNS4yN1oiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xNDUuOTEsMTI0LjE2YzAsNi4yNi01LjA4LDExLjMzLTExLjMzLDExLjMzcy0xMS4zNC01LjA4LTExLjM0LTExLjMzLDUuMDgtMTEuMzQsMTEuMzQtMTEuMzQsMTEuMzMsNS4wOCwxMS4zMywxMS4zNCIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTExOS44MSwxMjMuMzdjMCw0LjUxLTMuNjYsOC4xNy04LjE3LDguMTdzLTguMTctMy42Ni04LjE3LTguMTcsMy42Ni04LjE3LDguMTctOC4xNyw4LjE3LDMuNjYsOC4xNyw4LjE3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtOTIuODUsMTU3LjQxYzMuMjMsMS45Nyw0LjI2LDYuMTksMi4yOSw5LjQyLTEuOTcsMy4yMy02LjE5LDQuMjYtOS40MiwyLjI5LTMuMjMtMS45Ny00LjI2LTYuMTktMi4yOS05LjQyLDEuOTctMy4yMyw2LjE5LTQuMjYsOS40Mi0yLjI5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNzkuNDgsMTcwLjAzYzAsMi4xOC0xLjc3LDMuOTYtMy45NiwzLjk2cy0zLjk1LTEuNzctMy45NS0zLjk2LDEuNzctMy45NSwzLjk1LTMuOTUsMy45NiwxLjc3LDMuOTYsMy45NSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTEwOS4wNywxMzUuNjNjNS40OCwzLjAzLDcuNDcsOS45Miw0LjQ0LDE1LjQtMy4wMyw1LjQ4LTkuOTIsNy40Ny0xNS40LDQuNDQtNS40OC0zLjAyLTcuNDctOS45Mi00LjQ0LTE1LjQsMy4wMy01LjQ4LDkuOTItNy40NywxNS40LTQuNDQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im05Mi44LDEyNy41NWMyLjA2LDQuMDIuNDcsOC45NC0zLjU1LDExLTQuMDIsMi4wNi04Ljk0LjQ2LTExLTMuNTUtMi4wNi00LjAyLS40Ni04Ljk0LDMuNTUtMTEsNC4wMi0yLjA2LDguOTQtLjQ3LDExLDMuNTUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im01MC43NSwxNTAuNTJjMCwzLjc4LTMuMDcsNi44NS02Ljg1LDYuODVzLTYuODUtMy4wNy02Ljg1LTYuODUsMy4wNy02Ljg1LDYuODUtNi44NSw2Ljg1LDMuMDcsNi44NSw2Ljg1Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMzIuODIsMTQ3Ljg5YzAsMi4xOC0xLjc3LDMuOTYtMy45NSwzLjk2cy0zLjk2LTEuNzctMy45Ni0zLjk2LDEuNzctMy45NSwzLjk2LTMuOTUsMy45NSwxLjc3LDMuOTUsMy45NSIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTY3LjczLDEzMy4wOGM2LjE5Ljk1LDEwLjQ0LDYuNzMsOS40OSwxMi45Mi0uOTUsNi4xOS02LjczLDEwLjQ0LTEyLjkyLDkuNDktNi4xOS0uOTUtMTAuNDQtNi43My05LjQ5LTEyLjkyLjk1LTYuMTksNi43My0xMC40NCwxMi45Mi05LjQ5Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNjcuODgsMTIyLjMyYzAsNC41MS0zLjY2LDguMTctOC4xNyw4LjE3cy04LjE3LTMuNjYtOC4xNy04LjE3LDMuNjYtOC4xNyw4LjE3LTguMTcsOC4xNywzLjY2LDguMTcsOC4xNyIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTIxLjc1LDExMy4zNWMwLDMuNzktMy4wNyw2Ljg1LTYuODUsNi44NXMtNi44NS0zLjA3LTYuODUtNi44NSwzLjA3LTYuODUsNi44NS02Ljg1LDYuODUsMy4wNyw2Ljg1LDYuODUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im02LjcyLDEwNS4xOGMxLjU4LTEuNTgsMS41OC0zLjk1LDAtNS41NC0xLjU4LTEuNTgtMy45NS0xLjU4LTUuNTQsMC0xLjU4LDEuNTgtMS41OCwzLjk1LDAsNS41NCwxLjU4LDEuMzIsMy45NiwxLjMyLDUuNTQsMFoiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im00Ny4zMiwxMjEuNTNjMCw2LjI2LTUuMDgsMTEuMzQtMTEuMzQsMTEuMzRzLTExLjMzLTUuMDgtMTEuMzMtMTEuMzQsNS4wOC0xMS4zMywxMS4zMy0xMS4zMywxMS4zNCw1LjA4LDExLjM0LDExLjMzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNTIuMDYsOTkuOTFjMCw0LjUxLTMuNjYsOC4xNy04LjE3LDguMTdzLTguMTctMy42Ni04LjE3LTguMTcsMy42Ni04LjE3LDguMTctOC4xNyw4LjE3LDMuNjYsOC4xNyw4LjE3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtMTkuOSw2Ni4xN2MwLDMuNzgtMy4wNyw2Ljg1LTYuODUsNi44NXMtNi44NS0zLjA3LTYuODUtNi44NSwzLjA3LTYuODUsNi44NS02Ljg1LDYuODUsMy4wNyw2Ljg1LDYuODUiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMS4yLDU0LjgzYzIuMTEtLjI2LDMuNDMtMi4zNywzLjE2LTQuNDgtLjI2LTIuMTEtMi4zNy0zLjQzLTQuNDgtMy4xNi0yLjExLjI2LTMuNDMsMi4zNy0zLjE2LDQuNDguNTMsMi4xMSwyLjM3LDMuNDMsNC40OCwzLjE2WiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTM2Ljc3LDg1LjQxYzAsNi4yNi01LjA4LDExLjMzLTExLjMzLDExLjMzcy0xMS4zNC01LjA4LTExLjM0LTExLjMzLDUuMDgtMTEuMzQsMTEuMzQtMTEuMzQsMTEuMzMsNS4wOCwxMS4zMywxMS4zNCIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTUyLjU5LDcyLjQ5YzAsNC41MS0zLjY2LDguMTctOC4xNyw4LjE3cy04LjE3LTMuNjYtOC4xNy04LjE3LDMuNjYtOC4xNyw4LjE3LTguMTcsOC4xNywzLjY2LDguMTcsOC4xNyIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTQyLjA0LDIwLjg4YzMuNDQsMS41OCw0Ljk1LDUuNjUsMy4zNyw5LjA5LTEuNTgsMy40NC01LjY0LDQuOTUtOS4wOSwzLjM4LTMuNDQtMS41OC00Ljk1LTUuNjUtMy4zOC05LjA5LDEuNTgtMy40NCw1LjY1LTQuOTUsOS4wOS0zLjM3Ii8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNDQuNDIsMTYuODdjMS44NSwxLjA1LDQuMjIuMjYsNS4yNy0xLjU4LDEuMDUtMS44NS4yNi00LjIyLTEuNTgtNS4yNy0xLjg1LTEuMDUtNC4yMi0uMjYtNS4yNywxLjU4LTEuMDYsMS44NS0uMjYsNC4yMiwxLjU4LDUuMjdaIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNDkuNDMsNDkuODJjMCw2LjI2LTUuMDgsMTEuMzQtMTEuMzQsMTEuMzRzLTExLjMzLTUuMDgtMTEuMzMtMTEuMzQsNS4wOC0xMS4zMywxMS4zMy0xMS4zMywxMS4zNCw1LjA4LDExLjM0LDExLjMzIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtNjYuNzYsNDQuODFjMy4xOSwzLjE5LDMuMTksOC4zNiwwLDExLjU2LTMuMTksMy4xOS04LjM3LDMuMTktMTEuNTYsMC0zLjE5LTMuMTktMy4xOS04LjM3LDAtMTEuNTYsMy4xOS0zLjE5LDguMzYtMy4xOSwxMS41NiwwIi8+PHBhdGggY2xhc3M9ImNscy0xIiBkPSJtODUuMDEsNC4wNWMzLjY4LjksNS45Myw0LjYsNS4wNCw4LjI4LS45LDMuNjgtNC42LDUuOTMtOC4yOCw1LjA0LTMuNjgtLjktNS45My00LjYtNS4wNC04LjI4LjktMy42OCw0LjYtNS45Myw4LjI4LTUuMDQiLz48cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Im0xMDEuMSwzLjk2YzAsMi4xOC0xLjc3LDMuOTUtMy45NSwzLjk1cy0zLjk2LTEuNzctMy45Ni0zLjk1LDEuNzctMy45NiwzLjk2LTMuOTYsMy45NSwxLjc3LDMuOTUsMy45NiIvPjxwYXRoIGNsYXNzPSJjbHMtMSIgZD0ibTc0LjgzLDE4LjY4YzUuMzksMy4xOSw3LjE3LDEwLjE0LDMuOTksMTUuNTMtMy4xOCw1LjM5LTEwLjE0LDcuMTctMTUuNTIsMy45OS01LjM5LTMuMTktNy4xNy0xMC4xNC0zLjk5LTE1LjUzLDMuMTgtNS4zOSwxMC4xNC03LjE3LDE1LjUyLTMuOTkiLz48L3N2Zz4=', 99); }); 79 add_action('admin_init', array($this, 'GetSettings')); 55 80 add_action('admin_notices', array($this, 'ShowNotices')); 56 81 add_action('rest_api_init', array($this, 'RegisterAPIRoutes')); 57 add_filter("plugin_action_links_".PRODUCT_FEEDER_PLUGIN_BASENAME, array($this, 'plugin_add_settings_link')); 82 add_action('wp_ajax_product_feeder_action', array($this, 'AJAXHandler')); 83 add_filter( "plugin_action_links_".$this->Name, array($this, 'plugin_add_settings_link')); 84 } 85 86 public function AJAXHandler() { 87 try { 88 if (is_admin()) { 89 if (isset($_POST['sub-action'])) { 90 if ($_POST['sub-action'] == 'download-order-document') $this->DownloadOrderDocument($_POST['OrderID'], $_POST['DocumentID']); 91 else throw new Exception('Unknown sub-action: '.$_POST['sub-action']); 92 } 93 else throw new Exception('Missing sub-action'); 94 } 95 else throw new Exception('Unauthorized'); 96 } 97 catch (Exception $e) { 98 $this->APIError($e->getMessage(), $e->getCode()); 99 } 100 } 101 102 public function AddCustomOrderSidebarMetabox() { 103 add_meta_box( 104 'product_feeder_order_documents_meta_box', // ID OF THE METABOX 105 __('Product Feeder', 'product-feeder'), // Titel van de metabox 106 array($this, 'DisplayCustomOrderSidebarMetabox'), 107 (class_exists('\Automattic\WooCommerce\Internal\DataStores\Orders\CustomOrdersTableController') && wc_get_container()->get( CustomOrdersTableController::class)->custom_orders_table_usage_is_enabled()) ? wc_get_page_screen_id('shop-order') : 'shop_order', 108 'side', 109 'high' 110 ); 111 } 112 113 public function DisplayCustomOrderSidebarMetabox($post) { 114 $order = ($post instanceof WP_Post) ? wc_get_order($post->ID) : $post; 115 if ($order instanceof WC_Order) { 116 $MarketplaceOrderID = $order->get_meta('product_feeder_order'); 117 $Marketplace = $order->get_meta('product_feeder_marketplace'); 118 $Documents = $order->get_meta('product_feeder_documents'); 119 if (!empty($MarketplaceOrderID) && !empty($Marketplace)) { 120 echo sprintf(__('Marketplace: %s', 'product-feeder'), "<b>".$Marketplace."</b>")."<br>"; 121 echo sprintf(__('ID: %s', 'product-feeder'), "<b>".$MarketplaceOrderID."</b>")."<br>"; 122 echo "<h4 style='margin-bottom: 0 !important;'>".sprintf(__('Documents (%d)', 'product-feeder'), (!empty($Documents) && is_array($Documents)) ? count($Documents) : 0)."</h4>"; 123 if (!empty($Documents) && is_array($Documents)) { 124 foreach ($Documents as $DocumentID => $Document) { 125 if (isset($Document['Name']) && isset($Document['MIME']) && isset($Document['BASE64']) && isset($Document['Size']) && isset($Document['Size']['Bytes']) && isset($Document['Size']['Readable'])) echo "<div style='margin-top: 5px;'><a href='#' class='product-feeder-download-order-document' data-order-id='".htmlentities($order->get_id())."' data-document-id='".htmlentities($DocumentID)."' data-document-name='".htmlentities($Document['Name'])."' data-document-size-bytes='".htmlentities($Document['Size']['Bytes'])."' data-document-size-readable='".htmlentities($Document['Size']['Readable'])."'>".esc_html($Document['Name']." (".$Document['Size']['Readable'].")")."</a></div>"; 126 } 127 } 128 else echo "<div style='margin-top: 5px !important; ?>'>".__('At this moment there are no documents available', 'product-feeder')."</div>"; 129 } 130 } 58 131 } 59 132 … … 217 290 218 291 public function RegisterAPIRoutes() { 292 $this->IsHPOSEnabled = OrderUtil::custom_orders_table_usage_is_enabled(); 219 293 register_rest_route( 'v1/product-feeder', '/connect', array( 220 294 'methods' => 'GET', … … 252 326 'permission_callback' => '__return_true', 253 327 )); 328 register_rest_route( 'v1/product-feeder', '/orders/(?P<OrderID>\d+)/document/(?P<DocumentID>.+)', array( 329 'methods' => array('POST'), 330 'callback' => array($this, 'StoreOrderDocument'), 331 'permission_callback' => '__return_true', 332 )); 254 333 } 255 334 256 335 private function APISuccess($Response = NULL) { 257 336 header("Content-type: application/json"); 258 if ($Response === NULL) wp_send_json(array("Status" => "Success", 'Version' => PRODUCT_FEEDER_PLUGIN_DATA['Version']));259 else if (is_array($Response)) wp_send_json(array_merge(array("Status" => "Success", 'Version' => PRODUCT_FEEDER_PLUGIN_DATA['Version']), $Response));337 if ($Response === NULL) wp_send_json(array("Status" => "Success", 'Version' => $this->Version)); 338 else if (is_array($Response)) wp_send_json(array_merge(array("Status" => "Success", 'Version' => $this->Version), $Response)); 260 339 else $this->APIError('Invalid API success response specified!'); 261 340 } … … 265 344 header("Content-type: application/json"); 266 345 if (preg_match("/(200|^4|^5)/", $Code)) http_response_code($Code); 267 wp_send_json(array("Status" => "Error", "Error" => $Error, 'Version' => PRODUCT_FEEDER_PLUGIN_DATA['Version']), $Code);346 wp_send_json(array("Status" => "Error", "Error" => $Error, 'Version' => $this->Version), $Code); 268 347 } 269 348 … … 340 419 $Order = $JSON['Order']; 341 420 if (isset($Order['Items']) && is_array($Order['Items']) && count($Order['Items']) > 0) { 342 global $wpdb; 343 $results_order_id = $wpdb->get_results($wpdb->prepare("SELECT post_id FROM `".$wpdb->postmeta."` WHERE meta_key='product_feeder_order' AND meta_value=%s", [$Order['ID']]), 'OBJECT'); 344 $results_marketplace = $wpdb->get_results($wpdb->prepare("SELECT post_id FROM `".$wpdb->postmeta."` WHERE meta_key='product_feeder_marketplace' AND meta_value=%s", [$JSON['Marketplace']['Name']]), 'OBJECT'); 345 if (isset($results_order_id[0]) && isset($results_order_id[0]->post_id) && isset($results_marketplace[0]) && isset($results_marketplace[0]->post_id) && $results_order_id[0]->post_id == $results_marketplace[0]->post_id) $this->APISuccess(array('OrderID' => $results_order_id[0]->post_id)); 421 if ($this->IsHPOSEnabled) { 422 //CHECK IF ORDER ALREADY EXISTS WITH HPOS 423 $orders = wc_get_orders( 424 array( 425 'meta_query' => array( 426 array( 427 'key' => 'product_feeder_order', 428 'value' => $Order['ID'], 429 'compare' => '=', 430 'type' => 'STRING' 431 ), 432 array( 433 'key' => 'product_feeder_marketplace', 434 'value' => $JSON['Marketplace']['Name'], 435 'compare' => '=', 436 'type' => 'STRING' 437 ), 438 ), 439 ) 440 ); 441 if (count($orders) == 1) $OrderID = $orders[0]->get_id(); 442 } 346 443 else { 444 global $wpdb; 445 //CHECK IF ORDER ALREADY EXISTS WITHOUT HPOS 446 $results_order_id = $wpdb->get_results($wpdb->prepare("SELECT post_id FROM `".$wpdb->postmeta."` WHERE meta_key='product_feeder_order' AND meta_value=%s", [$Order['ID']]), 'OBJECT'); 447 $results_marketplace = $wpdb->get_results($wpdb->prepare("SELECT post_id FROM `".$wpdb->postmeta."` WHERE meta_key='product_feeder_marketplace' AND meta_value=%s", [$JSON['Marketplace']['Name']]), 'OBJECT'); 448 if (isset($results_order_id[0]) && isset($results_order_id[0]->post_id) && isset($results_marketplace[0]) && isset($results_marketplace[0]->post_id) && $results_order_id[0]->post_id == $results_marketplace[0]->post_id) $OrderID = $results_order_id[0]->post_id; 449 } 450 if ($OrderID === NULL) { 451 //ORDER DOESN'T EXIST YET. CREATE IT 347 452 $ItemsToAddToOrder = array(); 348 453 $DefaultOrderStatus = get_option("product-feeder-default-order-status"); … … 398 503 $order->calculate_totals(); 399 504 $order->add_order_note(sprintf(__('Order %s from marketplace %s with a total price of %s is created by Product Feeder through channel %d - %s', 'product-feeder'), $Order['ID'], $JSON['Marketplace']['Name'], strip_tags(wc_price($JSON['Order']['Price']['Amount'], array('currency' => $JSON['Order']['Price']['Currency']))), $JSON['Channel']['ID'], $JSON['Channel']['Name'])); 400 $order-> add_meta_data('_wc_order_attribution_source_type', 'utm');401 $order-> add_meta_data('_wc_order_attribution_utm_source', $JSON['Marketplace']['Name'].' - Product Feeder');402 update_post_meta($OrderID,'product_feeder_order', $Order['ID']);403 update_post_meta($OrderID,'product_feeder_marketplace', $JSON['Marketplace']['Name']);505 $order->update_meta_data('_wc_order_attribution_source_type', 'utm'); 506 $order->update_meta_data('_wc_order_attribution_utm_source', $JSON['Marketplace']['Name'].' - Product Feeder'); 507 $order->update_meta_data('product_feeder_order', $Order['ID']); 508 $order->update_meta_data('product_feeder_marketplace', $JSON['Marketplace']['Name']); 404 509 $order->update_status($DefaultOrderStatus, '', true); 405 510 $order->save(); 406 $this->APISuccess(array('OrderID' => $OrderID));407 511 } 408 512 else throw new Exception('Failed to create order template'); … … 410 514 else $this->APIError($Errors); 411 515 } 516 if ($OrderID !== NULL) $this->APISuccess(array('OrderID' => $OrderID)); 517 else throw new Exception('Missing Order ID'); 412 518 } 413 519 else throw new Exception('Incomplete ordered items information'); … … 418 524 } 419 525 catch (Exception $e) { 420 if ($OrderID !== NULL) wp_delete_post($OrderID, true); 526 $order = wc_get_order($OrderID); 527 if ($order instanceof WC_Order) $order->delete(true); 421 528 $Message = $e->getMessage(); 422 529 if (is_array($Message)) $this->APIError(array('Reasons' => $Message)); … … 440 547 else if (is_array($AcceptedOrderStatuses) && in_array($WCStatus, $AcceptedOrderStatuses)) $OrderStatus = 'Accepted'; 441 548 else if (is_array($RejectedOrderStatuses) && in_array($WCStatus, $RejectedOrderStatuses)) $OrderStatus = 'Rejected'; 442 else if ( get_post_status($OrderID) === 'trash') $OrderStatus = 'Rejected';549 else if ($order->get_status() === 'trash') $OrderStatus = 'Rejected'; 443 550 foreach ($order->get_items() as $item) { 444 551 $OrderItems[] = array( … … 491 598 } 492 599 if ($OrderIsModified) { 493 $order->save(); //SAVE THE ORDER. OTHERWISE THE STOCK CHANGES NOTES ARE NOT SET PROPERLY600 $order->save(); //SAVE THE ORDER. OTHERWISE, THE STOCK CHANGES NOTES ARE NOT SET PROPERLY 494 601 wc_increase_stock_levels($OrderID); 495 602 foreach ($ItemIDsWithNoRemainingQuantity as $item_id) wc_delete_order_item($item_id); 496 $order = wc_get_order($OrderID); //REFRESH THE ORDER. OTHERWISE THE CALCULATE TOTALS DOESN'T WORK603 $order = wc_get_order($OrderID); //REFRESH THE ORDER. OTHERWISE, THE CALCULATE TOTALS DOESN'T WORK 497 604 $order->calculate_totals(); 498 605 $order->add_order_note(sprintf(__('Changed order %s from marketplace %s with a total price of %s is synchronized by Product Feeder through channel %d - %s', 'product-feeder'), $OrderID, $JSON['Marketplace']['Name'], strip_tags(wc_price($JSON['Order']['Price']['Amount'], array('currency' => $JSON['Order']['Price']['Currency']))), $JSON['Channel']['ID'], $JSON['Channel']['Name'])); … … 534 641 } 535 642 else $this->APISuccess(); //CUSTOMER HAS DELETED THE ORDER? 643 } 644 catch (Exception $e) { 645 $this->APIError($e->getMessage(), $e->getCode()); 646 } 647 } 648 649 public function StoreOrderDocument($Request, $Download = false) { 650 $this->ValidateAPIKey($Request); 651 try { 652 $OrderID = $Request->get_param('OrderID'); 653 $DocumentID = $Request->get_param('DocumentID'); 654 $order = wc_get_order($OrderID); 655 if ($order instanceof WC_Order) { 656 $body = $Request->get_body(); 657 $JSON = @json_decode($body, true); 658 $Documents = $order->get_meta('product_feeder_documents'); 659 if (empty($Documents)) $Documents = array(); 660 $Documents[$DocumentID] = $JSON['Document']; 661 $order->update_meta_data('product_feeder_documents', $Documents); 662 $order->save(); 663 $this->APISuccess(); 664 } 665 else throw new Exception('SOURCE ORDER NOT FOUND'); 666 } 667 catch (Exception $e) { 668 $this->APIError($e->getMessage(), $e->getCode()); 669 } 670 } 671 672 public function DownloadOrderDocument($OrderID, $DocumentID) { 673 try { 674 $order = wc_get_order($OrderID); 675 if ($order instanceof WC_Order) { 676 $Documents = $order->get_meta('product_feeder_documents'); 677 if (isset($Documents[$DocumentID])) { 678 $Document = $Documents[$DocumentID]; 679 $Document['Name'] = $OrderID.' - '.$Document['Name']; 680 $this->APISuccess(array('Document' => $Document)); 681 } 682 else throw new Exception('Document not found'); 683 } 684 else throw new Exception('Order not found'); 536 685 } 537 686 catch (Exception $e) { … … 938 1087 939 1088 public function prevent_customer_emails_from_being_sent($recipient, $order) { 940 $value = $this->GetPostMeta($order->get_id(), 'product_feeder_order'); 1089 $value = $order->get_meta('product_feeder_order'); 1090 if (empty($value)) $value = $this->GetPostMeta($order->get_id(), 'product_feeder_order'); 941 1091 return (empty($value)) ? $recipient : ''; 942 1092 } 943 1093 1094 public function ProtectCustomMetaFields($protected, $meta_key) { 1095 return in_array($meta_key, ['product_feeder_order', 'product_feeder_marketplace']) ? true : $protected; 1096 } 1097 944 1098 } -
product-feeder/trunk/languages/product-feeder-nl_NL.po
r3188562 r3199369 4 4 "Report-Msgid-Bugs-To: info@product-feeder.com\n" 5 5 "POT-Creation-Date: 2023-05-16 10:00+0200\n" 6 "PO-Revision-Date: 2024-11- 14 11:14+0100\n"6 "PO-Revision-Date: 2024-11-28 11:48+0100\n" 7 7 "Last-Translator: Product Feeder <info@product-feeder.com>\n" 8 8 "Language-Team: English (United States)\n" … … 159 159 msgid "Select the product statuses to be synchronized" 160 160 msgstr "Selecteer de product statussen op die moeten worden gesynchroniseerd" 161 162 msgid "At this moment there are no documents available" 163 msgstr "Op dit moment zijn er geen documenten beschikbaar" 164 165 msgid "Downloading: %s" 166 msgstr "Downloading: %s" 167 168 msgid "Downloading: %s failed. Error: %s" 169 msgstr "Downloaden van: %s is mislukt. Error: %s" 170 171 msgid "Marketplace: %s" 172 msgstr "Marketplace: %s" 173 174 msgid "ID: %s" 175 msgstr "ID: %s" 176 177 msgid "Documents (%d)" 178 msgstr "Documenten (%d)" -
product-feeder/trunk/product-feeder.php
r3191409 r3199369 5 5 * Plugin URI: https://product-feeder.com/nl/sources/wordpress-woocommerce 6 6 * Description: Connect with various marketplaces for automated synchronization of products, orders and returns! Try it now at https://product-feeder.com 7 * Version: 3.1.37 * Version: 4.1.0 8 8 * Author: Product Feeder 9 9 * Author URI: https://product-feeder.com … … 14 14 if (!defined('ABSPATH')) exit; //PREVENT DIRECT ACCESS TO THE FILE 15 15 register_activation_hook(__FILE__, 'product_feeder_plugin_activation'); 16 17 16 function product_feeder_plugin_activation() { 18 17 //Create and store API Token with a length of 30 characters … … 22 21 } 23 22 24 if (!function_exists('get_plugin_data')) require_once(ABSPATH.'wp-admin/includes/plugin.php');25 define('PRODUCT_FEEDER_PLUGIN_DATA', get_plugin_data( __FILE__));26 define('PRODUCT_FEEDER_PLUGIN_BASENAME', plugin_basename(__FILE__));27 28 23 require_once(__DIR__ . "/includes/product-feeder.php"); 29 $ProductFeeder = new Product_Feeder( );24 $ProductFeeder = new Product_Feeder(plugin_basename(__FILE__)); 30 25 $ProductFeeder->Run(); -
product-feeder/trunk/readme.txt
r3191409 r3199369 5 5 Requires at least: 6.0 6 6 Tested up to: 6.7 7 Stable tag: 3.1.37 Stable tag: 4.1.0 8 8 Requires PHP: 7.4 9 9 License: GPLv2 or later … … 180 180 = 3.1.3 = 181 181 * Updated meta-field selection 182 183 = 4.0.0 = 184 * Added HPOS compatability 185 186 = 4.1.0 = 187 * Added document synchronization
Note: See TracChangeset
for help on using the changeset viewer.