Plugin Directory

Changeset 3199369


Ignore:
Timestamp:
11/29/2024 10:54:13 AM (16 months ago)
Author:
productfeeder
Message:

Updated to version 4.1.0

Location:
product-feeder
Files:
13 added
5 edited

Legend:

Unmodified
Added
Removed
  • product-feeder/trunk/includes/product-feeder.php

    r3191409 r3199369  
    11<?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;
    28    class Product_Feeder {
    39
     
    1016        //svn commit -m "Updated to version X"
    1117
     18        private $Name = '';
     19        private $Version = 'UNKNOWN';
    1220        private $WPMLActive = false;
     21        private $IsHPOSEnabled = false;
    1322        private $AttributeValues = array();
    1423        private $AttributeTaxonomies = NULL;
    1524        private $AttributeDisplayValues = array();
    1625
    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            });
    1834            if (!defined('ABSPATH')) exit; //PREVENT DIRECT ACCESS TO THE FILE
    1935            if (!function_exists('is_plugin_active')) require_once(ABSPATH.'wp-admin/includes/plugin.php');
    2036            $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'];
    2139        }
    2240
    2341        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' ));
    2942            add_action('init', function() {
     43                $this->IsHPOSEnabled = OrderUtil::custom_orders_table_usage_is_enabled();
    3044                load_plugin_textdomain('product-feeder', false, 'product-feeder/languages');
     45                add_action('add_meta_boxes', array($this, 'AddCustomOrderSidebarMetabox'));
    3146                foreach (wc_get_order_statuses() as $value => $label) {
    3247                    $value = str_replace("wc-", "", $value); //REMOVE wc- from order-value
     
    5267                    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)));
    5368                }
     69                add_filter('is_protected_meta', array($this, 'ProtectCustomMetaFields'), 10, 2);
    5470            });
     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'));
    5580            add_action('admin_notices', array($this, 'ShowNotices'));
    5681            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            }
    58131        }
    59132
     
    217290
    218291        public function RegisterAPIRoutes() {
     292            $this->IsHPOSEnabled = OrderUtil::custom_orders_table_usage_is_enabled();
    219293            register_rest_route( 'v1/product-feeder', '/connect', array(
    220294                'methods' => 'GET',
     
    252326                'permission_callback' => '__return_true',
    253327            ));
     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            ));
    254333        }
    255334
    256335        private function APISuccess($Response = NULL) {
    257336            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));
    260339            else $this->APIError('Invalid API success response specified!');
    261340        }
     
    265344            header("Content-type: application/json");
    266345            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);
    268347        }
    269348
     
    340419                        $Order = $JSON['Order'];
    341420                        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                            }
    346443                            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
    347452                                $ItemsToAddToOrder = array();
    348453                                $DefaultOrderStatus = get_option("product-feeder-default-order-status");
     
    398503                                        $order->calculate_totals();
    399504                                        $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']);
    404509                                        $order->update_status($DefaultOrderStatus, '', true);
    405510                                        $order->save();
    406                                         $this->APISuccess(array('OrderID' => $OrderID));
    407511                                    }
    408512                                    else throw new Exception('Failed to create order template');
     
    410514                                else $this->APIError($Errors);
    411515                            }
     516                            if ($OrderID !== NULL) $this->APISuccess(array('OrderID' => $OrderID));
     517                            else throw new Exception('Missing Order ID');
    412518                        }
    413519                        else throw new Exception('Incomplete ordered items information');
     
    418524            }
    419525            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);
    421528                $Message = $e->getMessage();
    422529                if (is_array($Message)) $this->APIError(array('Reasons' => $Message));
     
    440547                    else if (is_array($AcceptedOrderStatuses) && in_array($WCStatus, $AcceptedOrderStatuses)) $OrderStatus = 'Accepted';
    441548                    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';
    443550                    foreach ($order->get_items() as $item) {
    444551                        $OrderItems[] = array(
     
    491598                            }
    492599                            if ($OrderIsModified) {
    493                                 $order->save(); //SAVE THE ORDER. OTHERWISE THE STOCK CHANGES NOTES ARE NOT SET PROPERLY
     600                                $order->save(); //SAVE THE ORDER. OTHERWISE, THE STOCK CHANGES NOTES ARE NOT SET PROPERLY
    494601                                wc_increase_stock_levels($OrderID);
    495602                                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 WORK
     603                                $order = wc_get_order($OrderID); //REFRESH THE ORDER. OTHERWISE, THE CALCULATE TOTALS DOESN'T WORK
    497604                                $order->calculate_totals();
    498605                                $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']));
     
    534641                }
    535642                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');
    536685            }
    537686            catch (Exception $e) {
     
    9381087
    9391088        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');
    9411091            return (empty($value)) ? $recipient : '';
    9421092        }
    9431093
     1094        public function ProtectCustomMetaFields($protected, $meta_key) {
     1095            return in_array($meta_key, ['product_feeder_order', 'product_feeder_marketplace']) ? true : $protected;
     1096        }
     1097
    9441098    }
  • product-feeder/trunk/languages/product-feeder-nl_NL.po

    r3188562 r3199369  
    44"Report-Msgid-Bugs-To: info@product-feeder.com\n"
    55"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"
    77"Last-Translator: Product Feeder <info@product-feeder.com>\n"
    88"Language-Team: English (United States)\n"
     
    159159msgid "Select the product statuses to be synchronized"
    160160msgstr "Selecteer de product statussen op die moeten worden gesynchroniseerd"
     161
     162msgid "At this moment there are no documents available"
     163msgstr "Op dit moment zijn er geen documenten beschikbaar"
     164
     165msgid "Downloading: %s"
     166msgstr "Downloading: %s"
     167
     168msgid "Downloading: %s failed. Error: %s"
     169msgstr "Downloaden van: %s is mislukt. Error: %s"
     170
     171msgid "Marketplace: %s"
     172msgstr "Marketplace: %s"
     173
     174msgid "ID: %s"
     175msgstr "ID: %s"
     176
     177msgid "Documents (%d)"
     178msgstr "Documenten (%d)"
  • product-feeder/trunk/product-feeder.php

    r3191409 r3199369  
    55    * Plugin URI:       https://product-feeder.com/nl/sources/wordpress-woocommerce
    66    * 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.3
     7    * Version:          4.1.0
    88    * Author:           Product Feeder
    99    * Author URI:       https://product-feeder.com
     
    1414    if (!defined('ABSPATH')) exit; //PREVENT DIRECT ACCESS TO THE FILE
    1515    register_activation_hook(__FILE__, 'product_feeder_plugin_activation');
    16 
    1716    function product_feeder_plugin_activation() {
    1817        //Create and store API Token with a length of 30 characters
     
    2221    }
    2322
    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 
    2823    require_once(__DIR__ . "/includes/product-feeder.php");
    29     $ProductFeeder = new Product_Feeder();
     24    $ProductFeeder = new Product_Feeder(plugin_basename(__FILE__));
    3025    $ProductFeeder->Run();
  • product-feeder/trunk/readme.txt

    r3191409 r3199369  
    55Requires at least: 6.0
    66Tested up to: 6.7
    7 Stable tag: 3.1.3
     7Stable tag: 4.1.0
    88Requires PHP: 7.4
    99License: GPLv2 or later
     
    180180= 3.1.3 =
    181181* 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.