diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 00000000000..f44a9c08503
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,21 @@
+*.min.js
+
+/assets/js/accounting/**
+/assets/js/flexslider/**
+/assets/js/jquery-blockui/**
+/assets/js/jquery-cookie/**
+/assets/js/jquery-flot/**
+/assets/js/jquery-payment/**
+/assets/js/jquery-qrcode/**
+/assets/js/jquery-serializejson/**
+/assets/js/jquery-tiptip/**
+/assets/js/jquery-ui-touch-punch/**
+/assets/js/js-cookie/**
+/assets/js/photoswipe/**
+/assets/js/prettyPhoto/**
+/assets/js/round/**
+/assets/js/select2/**
+/assets/js/selectWoo/**
+/assets/js/stupidtable/**
+/assets/js/zeroclipboard/**
+/assets/js/zoom/**
\ No newline at end of file
diff --git a/.eslintrc b/.eslintrc
new file mode 100644
index 00000000000..fa832ed3d28
--- /dev/null
+++ b/.eslintrc
@@ -0,0 +1,18 @@
+{
+ "root": true,
+ "env": {
+ "browser": true,
+ "node": true
+ },
+ "globals": {
+ "wp": true,
+ "wpApiSettings": true,
+ "wcSettings": true
+ },
+ "rules": {
+ "camelcase": 0,
+ "indent": 0,
+ "max-len": [ 2, { "code": 140 } ],
+ "no-console": 1
+ }
+}
diff --git a/.travis.yml b/.travis.yml
index 38f5033cad8..37bb210a689 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -13,6 +13,8 @@ php:
- 5.6
- 7.0
- 7.1
+ - 7.2
+ - 7.3
env:
- WP_VERSION=latest WP_MULTISITE=0
@@ -26,16 +28,28 @@ matrix:
dist: precise
- php: 5.2
dist: precise
- - php: 7.2
- env: WP_VERSION=latest WP_MULTISITE=0 RUN_PHPCS=1 RUN_E2E=1
- - php: 7.1
+ - name: "Coding standard check"
+ php: 7.2
+ env: WP_VERSION=latest WP_MULTISITE=0 RUN_PHPCS=1
+ - name: "e2e tests"
+ php: 7.2
+ env: WP_VERSION=latest WP_MULTISITE=0 RUN_E2E=1
+ - name: "Unit tests code coverage"
+ php: 7.1
env: WP_VERSION=latest WP_MULTISITE=0 RUN_CODE_COVERAGE=1
allow_failures:
- - env: WP_VERSION=latest WP_MULTISITE=0 RUN_CODE_COVERAGE=1
+ - php: 7.1
+ env: WP_VERSION=latest WP_MULTISITE=0 RUN_CODE_COVERAGE=1
before_script:
- - phpenv config-rm xdebug.ini
- - export PATH="$HOME/.composer/vendor/bin:$PATH"
+ - |
+ # Remove Xdebug for a huge performance increase:
+ if [ -f ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/xdebug.ini ]; then
+ phpenv config-rm xdebug.ini
+ else
+ echo "xdebug.ini does not exist"
+ fi
+ - export PATH="$HOME/.config/composer/vendor/bin:$PATH"
- bash tests/bin/install.sh woocommerce_test root '' localhost $WP_VERSION
- bash tests/bin/travis.sh before
diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index a32dcdbe7d2..d4eebaded6a 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,5 +1,219 @@
== Changelog ==
+= 3.5.3 - 2018-12-20 =
+* Fix - Fix orders list in the admin after a change introduced in WordPress 5.0.2. #22273
+
+= 3.5.2 - 2018-11-29 =
+* Enhancement - Added compatibility for Twenty Nineteen theme. #21970
+* Update - Prepare WooCommerce for PHP 7.3. #22009
+* Tweak - Updates the signature field type to "password" in PayPal settings for increased security. #21715
+* Tweak - Change the filter name in the /myaccount/lost-password-confirmation.php template to differentiate between other filter with same name and different message. #21829
+* Tweak - Reintroduce Preview button by popular demand with the understanding that the Preview will only work on some product fields. It was removed from pubished products in 3.5.0 to prevent confusion. #21838
+* Tweak - Add tool to systems status tools for running the DB update routine. #21923
+* Tweak - Revert default behavior for `woocommerce_formatted_address_force_country_display` filter to maintain backwards compatibility. #21865
+* Tweak - Update products block notice for WP 5.0. #21930
+* Tweak - Use wp_kses_post instead of esc_html for sanitizing product titles to allow minimal HTML in product titles. #21936
+* Tweak - Use dedicated woocommerce_add_order_again_cart_item to filter cart item data when ordering again. Prevents issues with applying woocommerce_add_cart_item out of context. #21947
+* Tweak - Remove postal code for Angola, São Tomé and Príncipe since they don't use postal codes and update locale info. #21984 #21985 #21987
+* Fix - Metadata with array key of 0 can save properly. #21641
+* Fix - Prevent deleting the default product category via REST API. #21696
+* Fix - Fix 'Table does not exist' messages on System Status Report in multisite. #21706
+* Fix - Add dynamic SSL check to dashboard SSL notice to prevent misdiagnosing that sites aren't set up with SSL. #21738
+* Fix - Don't show escaped HTML in admin order item details for fees. #21769
+* Fix - Don't include draft variable products in on sale product results. #21778
+* Fix - Add woocommerce_hold_stock_minutes check back to stock check in cart/checkout. #21797 #22050
+* Fix - Fix potential undefined index notice on checkout fields when comparing the sort order. #21801
+* Fix - Throw an error when trying to set a variation as the parent of a variation in the CSV importer. #21810
+* Fix - Make "account erasure request" text translatable. #21812
+* Fix - Display notices on Order Pay page. #21821
+* Fix - Fix tax rate uploading by file path. #21831
+* Fix - Make wc_download_log_permission_id constraint creation work better on multisites and multiple sites using the same DB. #21836 #21940
+* Fix - Don't render undecoded HTML entities in variations dimensions. #21844
+* Fix - Do not check for stock when not managing stock or have backorders enabled when paying through the order-pay page. #21849
+* Fix - Apply priority field sorting on additional filters to make it apply on the edit address pages as well. #21856
+* Fix - Fix export and edit of attribute labels with html encoded special characters in product CSV exporter. #21864
+* Fix - Prevent fatal error when rendering plaintext customer invoice email. #21879
+* Fix - Prevent fatal error when delivering webhooks using v3 API. #21921
+* Fix - Prevent undefined variable notice in wc_increase_stock_levels. #21928
+* Fix - Fix overescaping image output on product widget. #21929
+* Fix - Croatian Kuna symbol should be lowercase. #21934
+* Fix - Fixed an error when deleting logged entries when using the 'WC_Log_Handler_DB' handler. #21949
+* Fix - Update ShipStation plugin info so install works through setup wizard. #21953
+* Fix - Use dynamic DB table name in product list table shipping class query. #21954
+* Fix - Log file date/time should be in UTC and not site timezone as per the +00:00:00 string appended to it. #21981
+* Fix - Set customer's country to selling country when only selling to one country and default customer location is 'none'. #21995
+* Fix - Change new account email copy to be compatible with auto-generated accounts. #21999
+* Fix - Correct Aria-Labelledby attribute for quantity selectors. #22000
+* Fix - Show notices on lost password page. #22001
+* Fix - Fix authentication errors when using the REST API with 3rd-party authentication. #22013
+* Fix - Fix issues where potentially not all active plugins were included on the system status report. #22057
+* Fix - Make PDT validation use the same rounding as the IPN validation to prevent erroneous totals mismatch. #21729
+
+= 3.5.1 - 2018-10-31 =
+* Fix - Use CRUD method to get product images to fix custom tables missing images. #21608
+* Fix - Use HTML entity for times sign when outputting dimensions to fix RTL support. #21633
+* Fix - Fix India address format to look nice in the shipping calculator. #21647
+* Fix - Don't default gallery variation images to gallery thumbnail size if flexslider is disabled. #21655
+* Fix - Revert show shipping behavior change to prevent missing shipping line on Cart page. #21658
+* Fix - Removed non-existing WC_Product_Simple->set_date_created_gmt method. #21675
+* Fix - Use correct comment_type when fetching recent reviews for widget. #21689
+* Fix - Do not include strong tags as part of translation string on subscriptions disconnect message. #21690
+* Fix - Make it possible to send webhooks with the v3 API. #21745
+* Fix - Fix get_cart_from_session infinite loop when filters used. #21749
+* Fix - Use array instead of string to define class for address line 2 input on checkout. #21757
+* Fix - Make checkout fields priority work correctly again. #21763
+* Tweak - Remove mentions of deprecated live shipping rates from setup wizard. #21645
+* Tweak- Update product block editor hook for WP 5.0. #21703
+* Tweak - Merged similar strings to reduce number of translateable strings. #21704
+* Tweak - Remove hated "Over to you" text from emails. #21709
+* Tweak - Revert problematiic customer as post author change. #21740
+
+= 3.5.0 - 2018-10-17 =
+* Feature - REST API v3. #20111
+* Feature - Option has been added on the inventory tab of the edit product page to set a low stock threshold for individual products. #20260
+* Feature - Add ability to export products by category to the CSV exporter. #20870
+* Feature - Ability to define custom product placeholder images that will resize to correct store aspect ratio. #20644
+* Enhancement - Excluded children categories from WP_Query in product shortcode if cat_operator=AND. #20207
+* Enhancement - Add anchor tag example to email template preview. #20246
+* Enhancement - Introduce is_paypal_supported_currency check in setup wizard. #20244
+* Enhancement - Payment method table reordering accessibility. #19844
+* Enhancement - Log errors from transaction emails with logger. #20203
+* Enhancement - Improved shipping calculator experience. Shows destination country and added context to calculate shipping link. #20345
+* Enhancement - On the fly image generation for frontend, if image sizes are missing. #20011
+* Enhancement - SelectWoo enabled product categories dropdown widget. #20617
+* Enhancement - Make it easier to read and act upon the outdated template notice. #20732
+* Enhancement - Styled date, time, etc. inputs in admin to match styling of other inputs. #21013
+* Enhancement - Show update notices on the System Status page for WordPress.org hosted Official WooCommerce extensions. #21073
+* Enhancement - Better wording for transactional emails. #21288
+* Fix - Check billing email is posted before using in WC_Cart::check_customer_coupons. #20180
+* Fix - Shipping postcode formatting when only posting a billing address. #20330
+* Fix - Correctly show/hide save card checkbox on tokenization form. #20506
+* Fix - orderby and order parameters in WC_Customer_Download_Log_Data_Store::get_download_logs() were ignored. #20931
+* Fix - Unslash city name to prevent double escape in tax settings. #21205
+* Fix - Updated phone validation logic. #21188
+* Fix - Fix weight and dimensions cache of variable products if childs doesn't have any of those params. #21244
+* Fix - Correctly replace images in the woocommerce_uploads folder with the placeholder image. #20848
+* Fix - Show parent variable product in shipping class admin screen when variation has shipping class. #21278
+* Fix - Correctly excluded administrators from "Customer list" report. #21304
+* Fix - Update quick edit logic to show/hide Stock qty and Backorders fields. #21301
+* Fix - Fix Layered Nav Widget where special HTML entities did not display correctly in the "Any %s" string. #21312
+* Fix - Set the is_checkout javascript parameter on any page that uses the checkout filter or shortcode. #21328
+* Fix - Fix cron_interval property support in WP_Background_Process. #21353
+* Fix - CSS Changes to make text fields line up on the shipping settings page. #21247
+* Fix - Add extra null check to fix an issue with select payment fields using disabed select as placeholders. #21391
+* Fix - Don't modify attributes orderby when sorting by name. #21408
+* Fix - Allow saving a stock quantity of 0 using quick edit. #21447
+* Fix - Change the query used to save session data to the database to protect against deadlocks. #21455
+* Fix - Make sure default category tooltip is rendered when the image column is deactivated. #21410
+* Fix - Fix warning when using logger instance in woocommerce_logging_class filter. #21448
+* Fix - Use uppercase "ID" when sorting product queries by ID. #21461
+* Fix - Consistently escape the gateway ID in the checkout payment method template. #21439
+* Fix - Avoid treating HTTP 301 and 302 codes as failures for webhooks. #21491
+* Fix - Add address_1 to shipping packages info in WC_Cart:: get_shipping_packages to make it work correctly in address formatting functions. #21493
+* Fix - Don't fire two of the same action when saving shipping settings. #21494
+* Fix - Remove double condition for address line 2 in `WC_Countries::get_default_address_fields`. #20629
+* Fix - Correctly handle shorthand values for memory_limit in php.ini. #21557
+* Fix - Product shortcode numeric term slug matching. #21560
+* Fix - Remove the erasure tools links from the descriptions of the erasure settings for users without the manage_privacy_options capability. #21565
+* Fix - Don't double urldecode posted variation attributes. #21570
+* Fix - Don't double-sanitize cart images. #21574
+* Fix - Check if ID exists and is not empty before set Product's download ID in API. #21588
+* Fix - Ensure wp_list_pluck() gets a array and not possibly null in WC_Product_Data_Store_CPT::update_attributes. #21591
+* Fix - Trim CSV header rows to prevent leading/trailing whitespace issues. #21614
+* Fix - Show draft products in previews on unsupported themes. #21619
+* Fix/Tweak - Fire `woocommerce_grant_product_download_access` hook after the download has its ID set. #20905
+* Fix/Tweak/Performance - Change wp_woocommerce_sessions primary key to session_id. #21245
+* Tweak - Show empty terms in admin product category filter dropdown. #20324
+* Tweak - Don't force default token gateway active by default. #20125
+* Tweak - Move notice output to hooked in functions. #19794
+* Tweak - Apply order bulk actions in chronological order. #20338
+* Tweak - Updated Emogrifier to 2.0. #20547
+* Tweak - Avoid using wp.template (eval) in add-to-cart-variation.js. #19496
+* Tweak - Hide Preview button when creating new products, as most fields aren't set up for it. #20650
+* Tweak - For guests, store all address fields to the session whilst placing an order. #20665
+* Tweak - Removed 'ajax_add_to_cart' class from 'Read more' button. #20690
+* Tweak - Removed unnecessary checkout form change trigger on load of the checkout page. #20655
+* Tweak - Add image size filters to wc_get_product_attachment_props(). #20722
+* Tweak - Only display the current site's tables for a multisite install when viewing the system status. #20731
+* Tweak - include the file path and line number where a fatal error occurred in the fatal errors log. #20787
+* Tweak - Cast tax rate to float so that it can be treated as number further on in the code. #20910
+* Tweak - Send webhooks using Action Scheduler. #20030
+* Tweak - Update customer's ip address on successful payment. #21038
+* Tweak - Changed wc_clean to checking for valid utf8 for line items and password. #20993
+* Tweak - Add to cart notice actions (View cart/Continue shopping) now have tabindex 1 for improved accessibility. #21108
+* Tweak - Remove icanhazip from geolocation services. #21198
+* Tweak - Remove unnecessary aria-required attributes from product reviews template. #21211
+* Tweak - Added hidden label for screen readers on checkout address line 2 input. #21193
+* Tweak - Remove empty space in mini-cart template. #21261
+* Tweak - Tax display in cart now depends on whether customer is tax exempt. #21292
+* Tweak - Change sort dropdown option "Sort by newness" to "Sort by latest". #21311
+* Tweak - Sanitize endpoint slugs upon saving. #21355
+* Tweak - Ignore converting float meta value for registered post meta. #21333
+* Tweak - Remove 'order_again' query string to avoid multiple re-orders. #21444
+* Tweak - Remove Netherlands Antilles from the North America continent definitions. #21449
+* Tweak - Display label and meta on the same line in order emails to match frontend Order Details styling. #21456
+* Tweak - Use wp_get_upload_dir for geolite DB path. #21550
+* Performance/Tweak - Use post_author for the order customer instead of '_customer_user' meta data. #17895
+* Performance - Exclude frontend include from REST API calls. #20000
+* Performance - Improve performance of the query to delete version transients by removing unneeded "ORDER BY". #21274
+* Dev - REST API - Allows oAuth1.0a authentication under SSL.
+* Dev - REST API - Fix position param for images. #20497
+* Dev - REST API - Handle children products deletion regardless of type. #20670
+* Dev - Added woocommerce_increase_coupon_usage_count and woocommerce_decrease_coupon_usage_count action hooks to increase extensibility of Coupons. #19981
+* Dev - Add endpoints to account menu items filter. #19980
+* Dev - Added qty param to `wc_add_to_cart_message` filter. #19817
+* Dev - Added `woocommerce_search_products_ids` filter. #20160
+* Dev - Introduced `woocommerce_cart_calculate_shipping_address` field to allow manipulation of cart shipping calculator data. #20046
+* Dev - Introduced `woocommerce_shipping_calculator_enable_country` filter. #20046
+* Dev - Pass product id to backorder notification. #20416
+* Dev - Added woocommerce_cart_shipping_total filter to control shipping display. #20591
+* Dev - Refactor "Order again" handling to separate logic better. #20606
+* Dev - Added 'woocommerce_products_admin_list_table_filters' filter to make it easier to customize the products list table filters. #20634
+* Dev - Added `woocommerce_shipping_method_add_rate_args` and `woocommerce_shipping_method_add_rate` filters. #20633
+* Dev - Added `woocommerce_coupon_validate_user_usage_limit` filter. #20630
+* Dev - Add hooks needed for product custom tables feature plugin. #20520
+* Dev - Added new filter to 'Item in quotes' translation for messages. #20714
+* Dev - Add 'woocommerce_shutdown_error' hook triggered on request termination with an error. #20787
+* Dev - New filter 'woocommerce_admin_meta_boxes_variations_count' to customize the shown count of variations. #21067
+* Dev - Added ability to query products that have a field set in wc_get_products/WC_Product_Query using the wildcard symbol '*'. #21162
+* Dev - Added a JavaScript events before and after the order total recalculation on the Edit Order page. #21181
+* Dev - Check for `needs_payment` instead of `has_status( 'pending' )` in PayPal PDT handler for custom order status support. #21200
+* Dev - Added form action hooks for edit account and login templates. #21248
+* Dev - Add action for when system tools are run. #21270
+* Dev - Add - woocommerce_restock_refunded_items filter to control default state of the restock option when refunding items on an order. #21314
+* Dev - Add an extensible/swappable job queue via WC_Action_Queue and WC_Queue_Interface. #20030
+* Dev - Use WC_Action_Queue for schedule and delivery of webhooks. #20030
+* Dev - Include Action Scheduler v2.1.0 and use it for the default job queue. #21424 / #20030
+* Dev - Save reviews under the 'review' comment type. #21305
+* Localization - Updated IT provinces. #20286
+* Localization - Eircode validation. #20330
+* Localization - Disable postcode requirement for Bahrain. #21103
+* Localization - Make postcode field optional and hidden for Nigeria and label State. #21056
+* Localization - Make Romania state selection mandatory. #21180
+* Localization - Make city field optional and hidden for Singapore addresses. #21016
+
+= 3.4.6 - 2018-10-11 =
+* Fix - Security issues
+* Fix - Allow percent coupons with sale restrictions to apply to carts with sale items in them. #21241
+* Fix - Prevent multiple slashing of variation's SKU. #21019
+
+= 3.4.5 - 2018-08-29 =
+* Fix - Tweak sanitization when resetting password cookie. #20901
+* Fix - Use `+` instead of `array_merge` when appending parent to tax class to fix issues with numeric tax class names. #20916
+* Fix - Correct translation for North Khorasan. #20972
+* Fix - Unify scroll-to notices for all browsers. #20992
+* Fix - Prevent multiple slashing of variation's SKU. #21019
+* Fix - Variation image in fullscreen now shows correct caption for the respective image. #21022
+* Fix - Vertically center admin order action buttons. #21053
+* Fix - Correct context for shipping packages translation. #21065
+* Fix - Add permission checks for installing Jetpack on the setup wizard. #21072
+* Fix - Use refund currency instead of store default currency when displaying refund amount in the edit order screen. #21106
+* Fix - Fix a typo in REST API customer schema. #21171
+* Fix - Use entire sentence for checkout address_2 placeholder string. #21186
+* Fix - Only suppress comments number on unsupported theme shop page. #21191
+* Fix - Don't allow users without manage_product_terms permissions to create categories using the product importer. #21192
+* Fix - Correct sale coupon restriction logic. #21219
+
= 3.4.4 - 2018-07-25 =
* Fix - Only wordwrap plain email content. #20723
* Fix - Better escaping on product quick edit. #20740
diff --git a/assets/css/admin-rtl.css b/assets/css/admin-rtl.css
index 0ea0d2ebfbc..4d4b1c458ea 100644
--- a/assets/css/admin-rtl.css
+++ b/assets/css/admin-rtl.css
@@ -1,2 +1,2 @@
.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;margin:0 0 -4px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left;padding:0}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin:0;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected],.select2-results__option[data-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none;margin:5px 5px 0 0}.select2-container--default .select2-selection--multiple .select2-selection__rendered li:before{content:'';display:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid #000 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[data-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected],.select2-container--default .select2-results__option--highlighted[data-selected]{background-color:#0073aa;color:#fff}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single:focus{border:1px solid #0073aa}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #0073aa}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:0 0;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #0073aa}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #0073aa}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected],.select2-container--classic .select2-results__option--highlighted[data-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#0073aa}
-@charset "UTF-8";@-webkit-keyframes spin{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@keyframes spin{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;right:50%;margin-right:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.wc_addons_wrap{max-width:1200px}.wc_addons_wrap h1.search-form-title{clear:right;padding:0}.wc_addons_wrap form.search-form{clear:both;display:block;position:relative;margin-top:1em;margin-bottom:1em}.wc_addons_wrap form.search-form input{border:1px solid #ddd;box-shadow:none;height:53px;padding-right:50px;width:100%;margin:0}.wc_addons_wrap form.search-form button{background:0 0;border:none;cursor:pointer;height:53px;position:absolute;width:53px}.wc_addons_wrap .update-plugins .update-count{background-color:#d54e21;border-radius:10px;color:#fff;display:inline-block;font-size:9px;font-weight:600;line-height:17px;margin:1px 2px 0 0;padding:0 6px;vertical-align:text-top}.wc_addons_wrap .addons-featured{margin:0}.wc_addons_wrap ul.subsubsub.subsubsub{margin:-2px 0 12px}.wc_addons_wrap .subsubsub li::after{content:'|'}.wc_addons_wrap .subsubsub li:last-child::after{content:''}.wc_addons_wrap .addons-banner-block-item-icon,.wc_addons_wrap .addons-column-block-item-icon{-webkit-box-align:center;align-items:center;display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center}.wc_addons_wrap .addons-banner-block,.wc_addons_wrap .addons-wcs-banner-block{background:#fff;border:1px solid #ddd;margin:0 0 1em 0;padding:2em 2em 1em}.wc_addons_wrap .addons-banner-block img{height:62px}.wc_addons_wrap .addons-banner-block p{margin:0 0 20px}.wc_addons_wrap .addons-banner-block-items{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;flex-wrap:wrap;justify-content:space-around;margin:0 -10px 0 -10px}.wc_addons_wrap .addons-banner-block-item{border:1px solid #e6e6e6;border-radius:3px;-webkit-box-flex:1;flex:1;margin:1em;min-width:200px;width:30%}.wc_addons_wrap .addons-banner-block-item-icon{background:#f7f7f7;height:143px}.wc_addons_wrap .addons-banner-block-item-content{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;height:184px;-webkit-box-pack:justify;justify-content:space-between;padding:24px}.wc_addons_wrap .addons-banner-block-item-content h3{margin-top:0}.wc_addons_wrap .addons-banner-block-item-content p{margin:0 0 auto}.wc_addons_wrap .addons-wcs-banner-block{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center}.wc_addons_wrap .addons-wcs-banner-block-image{background:#f7f7f7;border:1px solid #e6e6e6;margin-left:2em;padding:4em}.wc_addons_wrap .addons-wcs-banner-block-image .addons-img{max-height:86px;max-width:97px}.wc_addons_wrap .addons-shipping-methods .addons-wcs-banner-block{margin-right:0;margin-left:0;margin-top:1em}.wc_addons_wrap .addons-wcs-banner-block-content{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;justify-content:space-around;align-self:stretch;padding:1em 0}.wc_addons_wrap .addons-wcs-banner-block-content h1{padding-bottom:0}.wc_addons_wrap .addons-wcs-banner-block-content p{margin-bottom:0}.wc_addons_wrap .addons-wcs-banner-block-content .wcs-service-logo{max-width:40px}.wc_addons_wrap .addons-column-section{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;flex-wrap:wrap;justify-content:space-around}.wc_addons_wrap .addons-column{-webkit-box-flex:1;flex:1;width:50%;padding:0 .5em}.wc_addons_wrap .addons-column:nth-child(2){margin-left:0}.wc_addons_wrap .addons-column-block,.wc_addons_wrap .addons-small-dark-block,.wc_addons_wrap .addons-small-light-block{box-sizing:border-box;border:1px solid #ddd;margin:0 0 1em;padding:20px}.wc_addons_wrap .addons-column-block img{max-height:50px;max-width:50px}.wc_addons_wrap .addons-column-block,.wc_addons_wrap .addons-small-light-block{background:#fff}.wc_addons_wrap .addons-column-block-left{float:right}.wc_addons_wrap .addons-column-block-right{float:left}.wc_addons_wrap .addons-column-block-item{border-top:2px solid #f9f9f9;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;flex-wrap:wrap;-webkit-box-pack:justify;justify-content:space-between;margin:0 -20px;padding:20px}.wc_addons_wrap .addons-column-block-item-icon{background:#f7f7f7;border:1px solid #e6e6e6;height:100px;margin:0 0 10px 10px;width:100px}.wc_addons_wrap .addons-column-block-item-content{display:-webkit-box;display:flex;-webkit-box-flex:1;flex:1;flex-wrap:wrap;height:20%;-webkit-box-pack:justify;justify-content:space-between;min-width:200px}.wc_addons_wrap .addons-column-block-item-content h2{float:right;margin-top:8px}.wc_addons_wrap .addons-column-block-item-content a{float:left}.wc_addons_wrap .addons-column-block-item-content p{float:right}.wc_addons_wrap .addons-banner-block-item,.wc_addons_wrap .addons-column-block-item{display:none}.wc_addons_wrap .addons-banner-block-item:nth-child(-n+3){display:block}.wc_addons_wrap .addons-column-block-item:nth-of-type(-n+3){display:-webkit-box;display:flex}.wc_addons_wrap .addons-small-dark-block{background-color:#54687d;text-align:center}.wc_addons_wrap .addons-small-dark-items{display:-webkit-box;display:flex;flex-wrap:wrap;justify-content:space-around}.wc_addons_wrap .addons-small-dark-item{margin:0 0 20px}.wc_addons_wrap .addons-small-dark-block h1{color:#fff}.wc_addons_wrap .addons-small-dark-block p{color:#fafafa}.wc_addons_wrap .addons-small-dark-item-icon img{height:30px}.wc_addons_wrap .addons-small-dark-item a{margin:28px auto 0}.wc_addons_wrap .addons-small-light-block{display:-webkit-box;display:flex;flex-wrap:wrap}.wc_addons_wrap .addons-small-light-block h1{margin-top:-12px}.wc_addons_wrap .addons-small-light-block p{margin-top:0}.wc_addons_wrap .addons-small-light-block img{height:225px;margin:0 -20px 0 0}.wc_addons_wrap .addons-small-light-block-content{display:-webkit-box;display:flex;-webkit-box-flex:1;flex:1 1 100px;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;justify-content:space-around}.wc_addons_wrap .addons-small-light-block-buttons{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between}.wc_addons_wrap .addons-small-light-block-content a{width:48%}.wc_addons_wrap .addons-button{border-radius:3px;cursor:pointer;display:block;height:37px;line-height:37px;text-align:center;text-decoration:none;width:124px}.wc_addons_wrap .addons-button-solid{background-color:#955a89;color:#fff}.wc_addons_wrap .addons-button-solid:hover{color:#fff;opacity:.8}.wc_addons_wrap .addons-button-outline-green{border:1px solid #73ae39;color:#73ae39}.wc_addons_wrap .addons-button-outline-green:hover{color:#73ae39;opacity:.8}.wc_addons_wrap .addons-button-outline-white{border:1px solid #fff;color:#fff}.wc_addons_wrap .addons-button-outline-white:hover{color:#fff;opacity:.8}.wc_addons_wrap .addons-button-installed{background:#e6e6e6;color:#3c3c3c}.wc_addons_wrap .addons-button-installed:hover{color:#3c3c3c;opacity:.8}@media only screen and (max-width:400px){.wc_addons_wrap .addons-featured{margin:-1% -5%}.wc_addons_wrap .addons-button{width:100%}.wc_addons_wrap .addons-small-dark-item{width:100%}.wc_addons_wrap .addons-column-block-item-icon{background:0 0;border:none;height:75px;margin:0 0 10px 10px;width:75px}}.wc_addons_wrap .products{overflow:hidden;display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row;flex-wrap:wrap;margin:0 -.5em}.wc_addons_wrap .products li{float:right;border:1px solid #ddd;margin:0 .5em 1em!important;padding:0;vertical-align:top;width:25%;min-width:280px;min-height:220px;-webkit-box-flex:1;flex:1;overflow:hidden;background:#f5f5f5;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),inset 0 -1px 0 rgba(0,0,0,.1)}.wc_addons_wrap .products li a{text-decoration:none;color:inherit;display:block;height:100%}.wc_addons_wrap .products li a .product-img-wrap{background:#fff;display:block}.wc_addons_wrap .products li a img{max-width:258px;max-height:24px;padding:17px 20px;display:block;margin:0;background:#fff;border-left:260px solid #fff}.wc_addons_wrap .products li a img.extension-thumb+h3{display:none}.wc_addons_wrap .products li a .price{display:none}.wc_addons_wrap .products li a h2,.wc_addons_wrap .products li a h3{margin:0!important;padding:20px!important;background:#fff}.wc_addons_wrap .products li a p{padding:20px!important;margin:0!important;border-top:1px solid #f1f1f1}.wc_addons_wrap .products li a:focus,.wc_addons_wrap .products li a:hover{background-color:#fff}.wc_addons_wrap .storefront{background:url(../images/storefront-bg.jpg) bottom right #f6f6f6;border:1px solid #ddd;margin-top:1em;padding:20px;overflow:hidden;zoom:1}.wc_addons_wrap .storefront img{width:278px;height:auto;float:right;margin:0 0 0 20px;box-shadow:0 1px 6px rgba(0,0,0,.1)}.wc_addons_wrap .storefront p{max-width:750px}.woocommerce-BlankState a.button-primary,.woocommerce-BlankState button.button-primary,.woocommerce-message a.button-primary,.woocommerce-message button.button-primary{background:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;color:#fff;text-shadow:0 -1px 1px #a36597,-1px 0 1px #a36597,0 1px 1px #a36597,1px 0 1px #a36597;display:inline-block}.woocommerce-BlankState a.button-primary:active,.woocommerce-BlankState a.button-primary:focus,.woocommerce-BlankState a.button-primary:hover,.woocommerce-BlankState button.button-primary:active,.woocommerce-BlankState button.button-primary:focus,.woocommerce-BlankState button.button-primary:hover,.woocommerce-message a.button-primary:active,.woocommerce-message a.button-primary:focus,.woocommerce-message a.button-primary:hover,.woocommerce-message button.button-primary:active,.woocommerce-message button.button-primary:focus,.woocommerce-message button.button-primary:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-message{position:relative;border-right-color:#cc99c2!important;overflow:hidden}.woocommerce-message a.docs,.woocommerce-message a.skip{text-decoration:none!important}.woocommerce-message a.woocommerce-message-close{position:static;float:left;padding:0 28px 10px 15px;margin-top:-10px;font-size:13px;line-height:1.23076923;text-decoration:none}.woocommerce-message a.woocommerce-message-close::before{position:relative;top:18px;right:-20px;-webkit-transition:all .1s ease-in-out;transition:all .1s ease-in-out}.woocommerce-message .twitter-share-button{margin-top:-3px;margin-right:3px;vertical-align:middle}#variable_product_options #message,#variable_product_options .notice{margin:10px}.clear{clear:both}.wrap.woocommerce div.error,.wrap.woocommerce div.updated{margin-top:10px}mark.amount{background:transparent none;color:inherit}.simplify-commerce-banner{overflow:hidden}.simplify-commerce-banner img{float:left;padding:15px 0;margin-right:1em;width:200px}.woocommerce-help-tip{color:#666;display:inline-block;font-size:1.1em;font-style:normal;height:16px;line-height:16px;position:relative;vertical-align:middle;width:16px}.woocommerce-help-tip::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";cursor:help}h2 .woocommerce-help-tip{margin-top:-5px;margin-right:.25em}table.wc_status_table{margin-bottom:1em}table.wc_status_table h2{font-size:14px;margin:0}table.wc_status_table tr:nth-child(2n) td,table.wc_status_table tr:nth-child(2n) th{background:#fcfcfc}table.wc_status_table th{font-weight:700;padding:9px}table.wc_status_table td:first-child{width:33%}table.wc_status_table td.help{width:1em}table.wc_status_table td,table.wc_status_table th{font-size:1.1em;font-weight:400}table.wc_status_table td.run-tool,table.wc_status_table th.run-tool{text-align:left}table.wc_status_table td strong.name,table.wc_status_table th strong.name{display:block;margin-bottom:.5em}table.wc_status_table td mark,table.wc_status_table th mark{background:transparent none}table.wc_status_table td mark.yes,table.wc_status_table th mark.yes{color:#7ad03a}table.wc_status_table td mark.no,table.wc_status_table th mark.no{color:#999}table.wc_status_table td .red,table.wc_status_table td mark.error,table.wc_status_table th .red,table.wc_status_table th mark.error{color:#a00}table.wc_status_table td ul,table.wc_status_table th ul{margin:0}table.wc_status_table .help_tip{cursor:help}table.wc_status_table--tools td,table.wc_status_table--tools th{padding:2em}.taxonomy-product_cat .column-thumb .woocommerce-help-tip{font-size:1.5em;margin:0 -34px 0 0;padding:0 2px 5px;display:block;position:absolute}#debug-report{display:none;margin:10px 0;padding:0;position:relative}#debug-report textarea{font-family:monospace;width:100%;margin:0;height:300px;padding:20px;border-radius:0;resize:none;font-size:12px;line-height:20px;outline:0}.wp-list-table.logs .log-level{display:inline;padding:.2em .6em .3em;font-size:80%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.2em}.wp-list-table.logs .log-level:empty{display:none}.wp-list-table.logs .log-level--alert,.wp-list-table.logs .log-level--emergency{background-color:#ff4136}.wp-list-table.logs .log-level--critical,.wp-list-table.logs .log-level--error{background-color:#ff851b}.wp-list-table.logs .log-level--notice,.wp-list-table.logs .log-level--warning{color:#222;background-color:#ffdc00}.wp-list-table.logs .log-level--info{background-color:#0074d9}.wp-list-table.logs .log-level--debug{background-color:#3d9970}@media screen and (min-width:783px){.wp-list-table.logs .column-timestamp{width:18%}.wp-list-table.logs .column-level{width:14%}.wp-list-table.logs .column-source{width:15%}}#log-viewer-select{padding:10px 0 8px;line-height:28px}#log-viewer-select h2 a{vertical-align:middle}#log-viewer{background:#fff;border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.04);padding:5px 20px}#log-viewer pre{font-family:monospace;white-space:pre-wrap;word-wrap:break-word}.inline-edit-product.quick-edit-row .inline-edit-col-center,.inline-edit-product.quick-edit-row .inline-edit-col-right{float:left!important}#woocommerce-fields.inline-edit-col{clear:right}#woocommerce-fields.inline-edit-col label.featured,#woocommerce-fields.inline-edit-col label.manage_stock{margin-right:10px}#woocommerce-fields.inline-edit-col label.stock_status_field{clear:both;float:right}#woocommerce-fields.inline-edit-col .dimensions div{display:block;margin:.2em 0}#woocommerce-fields.inline-edit-col .dimensions div span.title{display:block;float:right;width:5em}#woocommerce-fields.inline-edit-col .dimensions div span.input-text-wrap{display:block;margin-right:5em}#woocommerce-fields.inline-edit-col .text{box-sizing:border-box;width:99%;float:right;margin:1px 1px 1px 1%}#woocommerce-fields.inline-edit-col .height,#woocommerce-fields.inline-edit-col .length,#woocommerce-fields.inline-edit-col .width{width:32.33%}#woocommerce-fields.inline-edit-col .height{margin-left:0}#woocommerce-fields-bulk.inline-edit-col label{clear:right}#woocommerce-fields-bulk.inline-edit-col .inline-edit-group label{clear:none;width:49%;margin:.2em 0}#woocommerce-fields-bulk.inline-edit-col .inline-edit-group.dimensions label{width:75%;max-width:75%}#woocommerce-fields-bulk.inline-edit-col .length,#woocommerce-fields-bulk.inline-edit-col .regular_price,#woocommerce-fields-bulk.inline-edit-col .sale_price,#woocommerce-fields-bulk.inline-edit-col .stock,#woocommerce-fields-bulk.inline-edit-col .weight{box-sizing:border-box;width:100%;margin-right:4.4em}#woocommerce-fields-bulk.inline-edit-col .height,#woocommerce-fields-bulk.inline-edit-col .length,#woocommerce-fields-bulk.inline-edit-col .width{box-sizing:border-box;width:25%}.column-coupon_code{line-height:2.25em}.column-coupon_code,ul.wc_coupon_list{margin:0;overflow:hidden;zoom:1;clear:both}ul.wc_coupon_list{padding-bottom:5px}ul.wc_coupon_list li{margin:0}ul.wc_coupon_list li.code{display:inline-block;position:relative;padding:0 .5em;background-color:#fff;border:1px solid #aaa;box-shadow:0 1px 0 #dfdfdf;border-radius:4px;margin-left:5px;margin-top:5px}ul.wc_coupon_list li.code.editable{padding-left:2em}ul.wc_coupon_list li.code .tips{cursor:pointer}ul.wc_coupon_list li.code .tips span{color:#888}ul.wc_coupon_list li.code .tips span:hover{color:#000}ul.wc_coupon_list li.code .remove-coupon{text-decoration:none;color:#888;position:absolute;top:7px;left:20px;left:7px}ul.wc_coupon_list li.code .remove-coupon::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}ul.wc_coupon_list li.code .remove-coupon:hover::before{color:#a00}ul.wc_coupon_list_block{margin:0;padding-bottom:2px}ul.wc_coupon_list_block li{border-top:1px solid #fff;border-bottom:1px solid #ccc;line-height:2.5em;margin:0;padding:.5em 0}ul.wc_coupon_list_block li:first-child{border-top:0;padding-top:0}ul.wc_coupon_list_block li:last-child{border-bottom:0;padding-bottom:0}.button.wc-reload{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;padding:0;height:28px;width:28px!important;display:inline-block}.button.wc-reload::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";line-height:28px}#woocommerce-order-data .handlediv,#woocommerce-order-data .hndle{display:none}#woocommerce-order-data .inside{display:block!important}#order_data{padding:23px 24px 12px}#order_data h2{margin:0;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif;font-size:21px;font-weight:400;line-height:1.2;text-shadow:-1px 1px 1px #fff;padding:0}#order_data h3{font-size:14px}#order_data h3,#order_data h4{color:#333;margin:1.33em 0 0}#order_data p{color:#777}#order_data p.order_number{margin:0;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif;font-weight:400;line-height:1.6em;font-size:16px}#order_data .order_data_column_container{clear:both}#order_data .order_data_column{width:32%;padding:0 0 0 2%;float:right}#order_data .order_data_column>h3 span{display:block}#order_data .order_data_column:last-child{padding-left:0}#order_data .order_data_column p{padding:0!important}#order_data .order_data_column .address strong{display:block}#order_data .order_data_column .form-field{float:right;clear:right;width:48%;padding:0;margin:9px 0 0}#order_data .order_data_column .form-field label{display:block;padding:0 0 3px}#order_data .order_data_column .form-field input,#order_data .order_data_column .form-field textarea{width:100%}#order_data .order_data_column .form-field select{width:100%}#order_data .order_data_column .form-field .select2-container{width:100%!important}#order_data .order_data_column .form-field .date-picker{width:50%}#order_data .order_data_column .form-field .hour,#order_data .order_data_column .form-field .minute{width:3.5em}#order_data .order_data_column .form-field small{display:block;margin:5px 0 0;color:#999}#order_data .order_data_column ._billing_address_2_field,#order_data .order_data_column ._billing_last_name_field,#order_data .order_data_column ._billing_phone_field,#order_data .order_data_column ._billing_postcode_field,#order_data .order_data_column ._billing_state_field,#order_data .order_data_column ._shipping_address_2_field,#order_data .order_data_column ._shipping_last_name_field,#order_data .order_data_column ._shipping_postcode_field,#order_data .order_data_column ._shipping_state_field,#order_data .order_data_column .form-field.last{float:left;clear:left}#order_data .order_data_column ._billing_company_field,#order_data .order_data_column ._shipping_company_field,#order_data .order_data_column ._transaction_id_field,#order_data .order_data_column .form-field-wide{width:100%;clear:both}#order_data .order_data_column ._billing_company_field .wc-category-search,#order_data .order_data_column ._billing_company_field .wc-customer-search,#order_data .order_data_column ._billing_company_field .wc-enhanced-select,#order_data .order_data_column ._billing_company_field input,#order_data .order_data_column ._billing_company_field select,#order_data .order_data_column ._billing_company_field textarea,#order_data .order_data_column ._shipping_company_field .wc-category-search,#order_data .order_data_column ._shipping_company_field .wc-customer-search,#order_data .order_data_column ._shipping_company_field .wc-enhanced-select,#order_data .order_data_column ._shipping_company_field input,#order_data .order_data_column ._shipping_company_field select,#order_data .order_data_column ._shipping_company_field textarea,#order_data .order_data_column ._transaction_id_field .wc-category-search,#order_data .order_data_column ._transaction_id_field .wc-customer-search,#order_data .order_data_column ._transaction_id_field .wc-enhanced-select,#order_data .order_data_column ._transaction_id_field input,#order_data .order_data_column ._transaction_id_field select,#order_data .order_data_column ._transaction_id_field textarea,#order_data .order_data_column .form-field-wide .wc-category-search,#order_data .order_data_column .form-field-wide .wc-customer-search,#order_data .order_data_column .form-field-wide .wc-enhanced-select,#order_data .order_data_column .form-field-wide input,#order_data .order_data_column .form-field-wide select,#order_data .order_data_column .form-field-wide textarea{width:100%}#order_data .order_data_column p.none_set{color:#999}#order_data .order_data_column div.edit_address{display:none;zoom:1;padding-left:1px}#order_data .order_data_column .wc-customer-user label a,#order_data .order_data_column .wc-order-status label a{float:left;margin-right:8px}#order_data .order_data_column a.edit_address{width:14px;height:0;padding:14px 0 0;margin:0 6px 0 0;overflow:hidden;position:relative;color:#999;border:0;float:left}#order_data .order_data_column a.edit_address:focus,#order_data .order_data_column a.edit_address:hover{color:#000}#order_data .order_data_column a.edit_address::after{font-family:WooCommerce;position:absolute;top:0;right:0;text-align:center;vertical-align:top;line-height:14px;font-size:14px;font-weight:400}#order_data .order_data_column a.edit_address::after{font-family:Dashicons;content:'\f464'}#order_data .order_data_column .billing-same-as-shipping,#order_data .order_data_column .load_customer_billing,#order_data .order_data_column .load_customer_shipping{font-size:13px;display:inline-block;font-weight:400}#order_data .order_data_column .load_customer_shipping{margin-left:.3em}.order_actions{margin:0;overflow:hidden;zoom:1}.order_actions li{border-top:1px solid #fff;border-bottom:1px solid #ddd;padding:6px 0;margin:0;line-height:1.6em;float:right;width:50%;text-align:center}.order_actions li a{float:none;text-align:center;text-decoration:underline}.order_actions li.wide{width:auto;float:none;clear:both;padding:6px;text-align:right;overflow:hidden}.order_actions li #delete-action{line-height:25px;vertical-align:middle;text-align:right;float:right}.order_actions li .save_order{float:left}.order_actions li#actions{overflow:hidden}.order_actions li#actions .button{width:24px;box-sizing:border-box;float:left}.order_actions li#actions select{width:225px;box-sizing:border-box;float:right}#woocommerce-order-items .inside{margin:0;padding:0;background:#fefefe}#woocommerce-order-items .wc-order-data-row{border-bottom:1px solid #dfdfdf;padding:1.5em 2em;background:#f8f8f8;line-height:2em;text-align:left}#woocommerce-order-items .wc-order-data-row::after,#woocommerce-order-items .wc-order-data-row::before{content:' ';display:table}#woocommerce-order-items .wc-order-data-row::after{clear:both}#woocommerce-order-items .wc-order-data-row p{margin:0;line-height:2em}#woocommerce-order-items .wc-order-data-row .wc-used-coupons{text-align:right}#woocommerce-order-items .wc-order-data-row .wc-used-coupons .tips{display:inline-block}#woocommerce-order-items .wc-used-coupons{float:right;width:50%}#woocommerce-order-items .wc-order-totals{float:left;width:50%;margin:0;padding:0;text-align:left}#woocommerce-order-items .wc-order-totals .amount{font-weight:700}#woocommerce-order-items .wc-order-totals .label{vertical-align:top}#woocommerce-order-items .wc-order-totals .total{font-size:1em!important;width:10em;margin:0 .5em 0 0;box-sizing:border-box}#woocommerce-order-items .wc-order-totals .total input[type=text]{width:96%;float:left}#woocommerce-order-items .wc-order-totals .refunded-total{color:#a00}#woocommerce-order-items .refund-actions{margin-top:5px;padding-top:12px;border-top:1px solid #dfdfdf}#woocommerce-order-items .refund-actions .button{float:left;margin-right:4px}#woocommerce-order-items .refund-actions .cancel-action{float:right;margin-right:0}#woocommerce-order-items .add_meta{margin-right:0!important}#woocommerce-order-items h3 small{color:#999}#woocommerce-order-items .amount{white-space:nowrap}#woocommerce-order-items .add-items .description{margin-left:10px}#woocommerce-order-items .add-items .button{float:right;margin-left:.25em}#woocommerce-order-items .add-items .button-primary{float:none;margin-left:0}#woocommerce-order-items .inside{display:block!important}#woocommerce-order-items .handlediv,#woocommerce-order-items .hndle{display:none}#woocommerce-order-items .woocommerce_order_items_wrapper{margin:0;overflow-x:auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items{width:100%;background:#fff}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th{text-align:right;padding:1em;font-weight:400;color:#999;background:#f8f8f8;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th.sortable{cursor:pointer}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th:last-child{padding-left:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th:first-child{padding-right:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th .wc-arrow{float:left;position:relative;margin-left:-1em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td{padding:1.5em 1em 1em;text-align:right;line-height:1.5em;vertical-align:top;border-bottom:1px solid #f8f8f8}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td textarea{width:100%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td select{width:50%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td textarea{font-size:14px;padding:4px;color:#555}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th:last-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td:last-child{padding-left:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td:first-child{padding-right:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr:last-child td{border-bottom:1px solid #dfdfdf}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr:first-child td{border-top:8px solid #f8f8f8}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody#order_line_items tr:first-child td{border-top:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb{text-align:right;width:38px;padding-bottom:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail{width:38px;height:38px;border:2px solid #e8e8e8;background:#f8f8f8;color:#ccc;position:relative;font-size:21px;display:block;text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";width:38px;line-height:38px;display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail img{width:100%;height:100%;margin:0;padding:0;position:relative}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.name .wc-order-item-sku,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.name .wc-order-item-variation{display:block;margin-top:.5em;font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item{min-width:200px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .center,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .variation-id{text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class{text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class label{white-space:nowrap;color:#999;font-size:.833em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class label input{display:inline}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class input{width:70px;vertical-align:middle;text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class select{width:85px;height:26px;vertical-align:middle;font-size:1em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input{display:inline-block;background:#fff;border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);margin:1px 0;min-width:80px;overflow:hidden;line-height:1em;text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input{width:100%;box-sizing:border-box}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input label{font-size:.75em;padding:4px 6px 0;color:#555;display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input input{width:100%;box-sizing:border-box;border:0;box-shadow:none;margin:0;padding:0 6px 4px;color:#555;background:0 0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input input::-webkit-input-placeholder{color:#ddd}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child{border-bottom:1px dashed #ddd;background:#fff}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child label{color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child input{color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .view{white-space:nowrap}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .edit{text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class small.times{font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes{margin:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes label{display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-discount{display:block;margin-top:.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class small.times{margin-left:.25em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity{text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity input{text-align:center;width:50px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items span.subtotal{opacity:.5}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.tax_class,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.tax_class{text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .calculated{border-color:#ae8ca2;border-style:dotted}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta{width:100%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta{margin:.5em 0 0;font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr th,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr th{border:0;padding:0 0 .5em 4px;line-height:1.5em;width:20%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td{padding:0 0 .5em 4px;border:0;line-height:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td input{width:100%;margin:0;position:relative;border-bottom:0;box-shadow:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td textarea{width:100%;height:4em;margin:0;box-shadow:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td input:focus+textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td input:focus+textarea{border-top-color:#999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td p,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td p{margin:0 0 .5em;line-height:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td p:last-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td p:last-child{margin:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .refund_by{border-bottom:1px dotted #999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.fee .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.fee .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.refund .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.refund .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .shipping_method,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .shipping_method_name{width:100%;margin:0 0 .5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax{white-space:nowrap}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;float:left;font-size:14px;visibility:hidden;margin:3px 0 0 -18px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax::before,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax:hover::before,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax:hover::before{color:#a00}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax:hover .delete-order-tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax:hover .delete-order-tax{visibility:visible}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items small.refunded{display:block;color:#a00;white-space:nowrap;margin-top:.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items small.refunded::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";position:relative;top:auto;right:auto;margin:-1px 0 0 4px;vertical-align:middle;line-height:1em}#woocommerce-order-items .wc-order-edit-line-item{padding-right:0}#woocommerce-order-items .wc-order-edit-line-item-actions{width:44px;text-align:left;padding-right:0;vertical-align:middle}#woocommerce-order-items .wc-order-edit-line-item-actions a{color:#ccc;display:inline-block;cursor:pointer;padding:0 0 .5em;margin:0 12px 0 0;vertical-align:middle;text-decoration:none;line-height:16px;width:16px;overflow:hidden}#woocommerce-order-items .wc-order-edit-line-item-actions a::before{margin:0;padding:0;font-size:16px;width:16px;height:16px}#woocommerce-order-items .wc-order-edit-line-item-actions a:hover::before{color:#999}#woocommerce-order-items .wc-order-edit-line-item-actions a:first-child{margin-right:0}#woocommerce-order-items .wc-order-edit-line-item-actions .edit-order-item::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";position:relative}#woocommerce-order-items .wc-order-edit-line-item-actions .delete-order-item::before,#woocommerce-order-items .wc-order-edit-line-item-actions .delete_refund::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";position:relative}#woocommerce-order-items .wc-order-edit-line-item-actions .delete-order-item:hover::before,#woocommerce-order-items .wc-order-edit-line-item-actions .delete_refund:hover::before{color:#a00}#woocommerce-order-items tbody tr .wc-order-edit-line-item-actions{visibility:hidden}#woocommerce-order-items tbody tr:hover .wc-order-edit-line-item-actions{visibility:visible}#woocommerce-order-items .wc-order-totals .wc-order-edit-line-item-actions{width:1.5em;visibility:visible!important}#woocommerce-order-items .wc-order-totals .wc-order-edit-line-item-actions a{padding:0}#woocommerce-order-downloads .buttons{float:right;padding:0;margin:0;vertical-align:top}#woocommerce-order-downloads .buttons .add_item_id,#woocommerce-order-downloads .buttons .select2-container{width:400px!important;margin-left:9px;vertical-align:top;float:right}#woocommerce-order-downloads .buttons button{margin:2px 0 0}#woocommerce-order-downloads h3 small{color:#999}#poststuff #woocommerce-order-actions .inside{margin:0;padding:0}#poststuff #woocommerce-order-actions .inside ul.order_actions li{padding:6px 10px;box-sizing:border-box}#poststuff #woocommerce-order-actions .inside ul.order_actions li:last-child{border-bottom:0}#poststuff #woocommerce-order-notes .inside{margin:0;padding:0}#poststuff #woocommerce-order-notes .inside ul.order_notes li{padding:0 10px}#woocommerce_customers p.search-box{margin:6px 0 4px;float:right}#woocommerce_customers .tablenav{float:left;clear:none}.widefat.customers td{vertical-align:middle;padding:4px 7px}.widefat .column-order_title{width:15%}.widefat .column-order_title time{display:block;color:#999;margin:3px 0}.widefat .column-orders,.widefat .column-paying,.widefat .column-spent{text-align:center;width:8%}.widefat .column-last_order{width:11%}.widefat .column-wc_actions{width:110px}.widefat .column-wc_actions a.button{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;display:inline-block;margin:2px 0 2px 4px;padding:0!important;height:2em!important;width:2em;overflow:hidden;vertical-align:middle}.widefat .column-wc_actions a.button::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;line-height:1.85}.widefat .column-wc_actions a.button img{display:block;width:12px;height:auto}.widefat .column-wc_actions a.edit::after{content:'\f464'}.widefat .column-wc_actions a.link::after{font-family:WooCommerce;content:'\e00d'}.widefat .column-wc_actions a.view::after{content:'\f177'}.widefat .column-wc_actions a.refresh::after{font-family:WooCommerce;content:'\e031'}.widefat .column-wc_actions a.processing::after{font-family:WooCommerce;content:'\e00f'}.widefat .column-wc_actions a.complete::after{content:'\f147'}.widefat small.meta{display:block;color:#999;font-size:inherit;margin:3px 0}.post-type-shop_order .tablenav .one-page .displaying-num{display:none}.post-type-shop_order .wp-list-table{margin-top:1em}.post-type-shop_order .wp-list-table tfoot th,.post-type-shop_order .wp-list-table thead th{padding:.75em 1em}.post-type-shop_order .wp-list-table tfoot th.sortable a,.post-type-shop_order .wp-list-table tfoot th.sorted a,.post-type-shop_order .wp-list-table thead th.sortable a,.post-type-shop_order .wp-list-table thead th.sorted a{padding:0}.post-type-shop_order .wp-list-table tfoot th:first-child,.post-type-shop_order .wp-list-table thead th:first-child{padding-right:2em}.post-type-shop_order .wp-list-table tfoot th:last-child,.post-type-shop_order .wp-list-table thead th:last-child{padding-left:2em}.post-type-shop_order .wp-list-table tbody td,.post-type-shop_order .wp-list-table tbody th{padding:1em;line-height:26px}.post-type-shop_order .wp-list-table tbody td:first-child{padding-right:2em}.post-type-shop_order .wp-list-table tbody td:last-child{padding-left:2em}.post-type-shop_order .wp-list-table tbody tr{border-top:1px solid #f5f5f5}.post-type-shop_order .wp-list-table tbody tr:hover:not(.status-trash):not(.no-link) td{cursor:pointer}.post-type-shop_order .wp-list-table .no-link{cursor:default!important}.post-type-shop_order .wp-list-table td,.post-type-shop_order .wp-list-table th{width:12ch;vertical-align:middle}.post-type-shop_order .wp-list-table td p,.post-type-shop_order .wp-list-table th p{margin:0}.post-type-shop_order .wp-list-table .check-column{width:1px;white-space:nowrap;padding:1em 1em 1em 1em!important;vertical-align:middle}.post-type-shop_order .wp-list-table .check-column input{vertical-align:text-top;margin:1px 0}.post-type-shop_order .wp-list-table .column-order_number{width:20ch}.post-type-shop_order .wp-list-table .column-order_total{width:8ch;text-align:left}.post-type-shop_order .wp-list-table .column-order_total a span{float:left}.post-type-shop_order .wp-list-table .column-order_date,.post-type-shop_order .wp-list-table .column-order_status{width:10ch}.post-type-shop_order .wp-list-table .column-order_status{width:14ch}.post-type-shop_order .wp-list-table .column-billing_address,.post-type-shop_order .wp-list-table .column-shipping_address{width:20ch;line-height:1.5em}.post-type-shop_order .wp-list-table .column-billing_address .description,.post-type-shop_order .wp-list-table .column-shipping_address .description{display:block;color:#999}.post-type-shop_order .wp-list-table .column-wc_actions{text-align:left}.post-type-shop_order .wp-list-table .column-wc_actions a.button{text-indent:9999px;margin:2px 4px 2px 0}.post-type-shop_order .wp-list-table .order-preview{float:left;width:16px;padding:20px 4px 4px 4px;height:0;overflow:hidden;position:relative;border:2px solid transparent;border-radius:4px}.post-type-shop_order .wp-list-table .order-preview::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";line-height:16px;font-size:14px;vertical-align:middle;top:4px}.post-type-shop_order .wp-list-table .order-preview:hover{border:2px solid #00a0d2}.post-type-shop_order .wp-list-table .order-preview.disabled::before{content:'';background:url(../images/wpspin.gif) no-repeat center top}.order-status{display:-webkit-inline-box;display:inline-flex;line-height:2.5em;color:#777;background:#e5e5e5;border-radius:4px;border-bottom:1px solid rgba(0,0,0,.05);margin:-.25em 0;cursor:inherit!important;white-space:nowrap;max-width:100%}.order-status.status-completed{background:#c8d7e1;color:#2e4453}.order-status.status-on-hold{background:#f8dda7;color:#94660c}.order-status.status-failed{background:#eba3a3;color:#761919}.order-status.status-processing{background:#c6e1c6;color:#5b841b}.order-status.status-trash{background:#eba3a3;color:#761919}.order-status>span{margin:0 1em;overflow:hidden;text-overflow:ellipsis}.wc-order-preview .order-status{float:left;margin-left:54px}.wc-order-preview article{padding:0!important}.wc-order-preview .modal-close{border-radius:0}.wc-order-preview .wc-order-preview-table{width:100%;margin:0}.wc-order-preview .wc-order-preview-table td,.wc-order-preview .wc-order-preview-table th{padding:1em 1.5em;text-align:right;border:0;border-bottom:1px solid #eee;margin:0;background:0 0;box-shadow:none;text-align:left;vertical-align:top}.wc-order-preview .wc-order-preview-table td:first-child,.wc-order-preview .wc-order-preview-table th:first-child{text-align:right}.wc-order-preview .wc-order-preview-table th{border-color:#ccc}.wc-order-preview .wc-order-preview-table tr:last-child td{border:0}.wc-order-preview .wc-order-preview-table .wc-order-item-sku{margin-top:.5em}.wc-order-preview .wc-order-preview-table .wc-order-item-meta{margin-top:.5em}.wc-order-preview .wc-order-preview-table .wc-order-item-meta td,.wc-order-preview .wc-order-preview-table .wc-order-item-meta th{padding:0;border:0;text-align:right;vertical-align:top}.wc-order-preview .wc-order-preview-table .wc-order-item-meta td:last-child{padding-right:.5em}.wc-order-preview .wc-order-preview-addresses{overflow:hidden;padding-bottom:1.5em}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note{width:50%;float:right;padding:1.5em 1.5em 0;box-sizing:border-box;word-wrap:break-word}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address h2,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note h2{margin-top:0}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address strong,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note strong{display:block;margin-top:1.5em}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address strong:first-child,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note strong:first-child{margin-top:0}.wc-order-preview footer .wc-action-button-group{display:inline-block;float:right}.wc-order-preview footer .button.button-large{margin-right:10px;padding:0 10px!important;line-height:28px;height:auto;display:inline-block}.wc-order-preview .wc-action-button-group label{display:none}.wc-action-button-group{vertical-align:middle;line-height:26px;text-align:right}.wc-action-button-group label{margin-left:6px;cursor:default;font-weight:700;line-height:28px}.wc-action-button-group .wc-action-button-group__items{display:-webkit-inline-box;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row wrap;align-content:flex-start;-webkit-box-pack:start;justify-content:flex-start}.wc-action-button-group .wc-action-button{margin:0 -1px 0 0!important;border:1px solid #ccc;padding:0 10px!important;border-radius:0!important;float:none;line-height:28px;height:auto;z-index:1;position:relative;overflow:hidden;text-overflow:ellipsis;-webkit-box-flex:1;flex:1 0 auto;box-sizing:border-box;text-align:center;white-space:nowrap}.wc-action-button-group .wc-action-button:focus,.wc-action-button-group .wc-action-button:hover{border:1px solid #999;z-index:2}.wc-action-button-group .wc-action-button:first-child{margin-right:0!important;border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}.wc-action-button-group .wc-action-button:last-child{border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}@media screen and (max-width:782px){.wc-order-preview footer .wc-action-button-group .wc-action-button-group__items{display:-webkit-box;display:flex}.wc-order-preview footer .wc-action-button-group{float:none;display:block;margin-bottom:4px}.wc-order-preview footer .button.button-large{width:100%;float:none;text-align:center;margin:0;display:block}.post-type-shop_order .wp-list-table td.check-column{width:1em}.post-type-shop_order .wp-list-table td.column-order_number{padding-right:0;padding-bottom:.5em}.post-type-shop_order .wp-list-table td.column-order_date,.post-type-shop_order .wp-list-table td.column-order_status{display:inline-block!important;padding:0 1em 1em 1em!important}.post-type-shop_order .wp-list-table td.column-order_date:before,.post-type-shop_order .wp-list-table td.column-order_status:before{display:none!important}.post-type-shop_order .wp-list-table td.column-order_date{padding-right:0!important}.post-type-shop_order .wp-list-table td.column-order_status{float:left}}.column-customer_message .note-on{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto;color:#999}.column-customer_message .note-on::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";line-height:16px}.column-order_notes .note-on{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto;color:#999}.column-order_notes .note-on::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";line-height:16px}.attributes-table td,.attributes-table th{width:15%;vertical-align:top}.attributes-table .attribute-terms{width:32%}.attributes-table .attribute-actions{width:2em}.attributes-table .attribute-actions .configure-terms{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;padding:0!important;height:2em!important;width:2em}.attributes-table .attribute-actions .configure-terms::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";font-family:Dashicons;line-height:1.85}ul.order_notes{padding:2px 0 0}ul.order_notes li .note_content{padding:10px;background:#efefef;position:relative}ul.order_notes li .note_content p{margin:0;padding:0;word-wrap:break-word}ul.order_notes li p.meta{padding:10px;color:#999;margin:0;font-size:11px}ul.order_notes li p.meta .exact-date{border-bottom:1px dotted #999}ul.order_notes li a.delete_note{color:#a00}ul.order_notes li .note_content::after{content:'';display:block;position:absolute;bottom:-10px;right:20px;width:0;height:0;border-width:10px 0 0 10px;border-style:solid;border-color:#efefef transparent}ul.order_notes li.system-note .note_content{background:#d7cad2}ul.order_notes li.system-note .note_content::after{border-color:#d7cad2 transparent}ul.order_notes li.customer-note .note_content{background:#a7cedc}ul.order_notes li.customer-note .note_content::after{border-color:#a7cedc transparent}.add_note{border-top:1px solid #ddd;padding:10px 10px 0}.add_note h4{margin-top:5px!important}.add_note #add_order_note{width:100%;height:50px}table.wp-list-table .column-thumb{width:52px;text-align:center;white-space:nowrap}table.wp-list-table .column-handle{width:17px;display:none}table.wp-list-table tbody td.column-handle{cursor:move;width:17px;text-align:center;vertical-align:text-top}table.wp-list-table tbody td.column-handle::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;height:100%;margin:4px 0 0 0}table.wp-list-table .column-name{width:22%}table.wp-list-table .column-product_cat,table.wp-list-table .column-product_tag{width:11%!important}table.wp-list-table .column-featured,table.wp-list-table .column-product_type{width:48px;text-align:right!important}table.wp-list-table .column-customer_message,table.wp-list-table .column-order_notes{width:48px;text-align:center}table.wp-list-table .column-customer_message img,table.wp-list-table .column-order_notes img{margin:0 auto;padding-top:0!important}table.wp-list-table .manage-column.column-featured img,table.wp-list-table .manage-column.column-product_type img{padding-right:2px}table.wp-list-table .column-price .woocommerce-price-suffix{display:none}table.wp-list-table img{margin:1px 2px}table.wp-list-table .row-actions{color:#999}table.wp-list-table td.column-thumb img{margin:0;width:auto;height:auto;max-width:40px;max-height:40px;vertical-align:middle}table.wp-list-table span.na{color:#999}table.wp-list-table .column-sku{width:10%}table.wp-list-table .column-price{width:10ch}table.wp-list-table .column-is_in_stock{text-align:right!important;width:12ch}table.wp-list-table span.wc-featured,table.wp-list-table span.wc-image{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto}table.wp-list-table span.wc-featured::before,table.wp-list-table span.wc-image::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}table.wp-list-table span.wc-featured::before{content:'\f155'}table.wp-list-table span.wc-featured.not-featured::before{content:'\f154'}table.wp-list-table td.column-featured span.wc-featured{font-size:1.6em;cursor:pointer}table.wp-list-table mark.instock,table.wp-list-table mark.onbackorder,table.wp-list-table mark.outofstock{font-weight:700;background:transparent none;line-height:1}table.wp-list-table mark.instock{color:#7ad03a}table.wp-list-table mark.outofstock{color:#a44}table.wp-list-table mark.onbackorder{color:#eaa600}table.wp-list-table .notes_head,table.wp-list-table .order-notes_head,table.wp-list-table .status_head{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto}table.wp-list-table .notes_head::after,table.wp-list-table .order-notes_head::after,table.wp-list-table .status_head::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}table.wp-list-table .order-notes_head::after{content:'\e028'}table.wp-list-table .notes_head::after{content:'\e026'}table.wp-list-table .status_head::after{content:'\e011'}table.wp-list-table .column-order_items{width:12%}table.wp-list-table .column-order_items table.order_items{width:100%;margin:3px 0 0;padding:0;display:none}table.wp-list-table .column-order_items table.order_items td{border:0;margin:0;padding:0 0 3px}table.wp-list-table .column-order_items table.order_items td.qty{color:#999;padding-left:6px;text-align:right}mark.notice{background:#fff;color:#a00;margin:0 10px 0 0}a.export_rates,a.import_rates{float:left;margin-right:9px;margin-top:-2px;margin-bottom:0}#rates-search{float:left}#rates-search input.wc-tax-rates-search-field{padding:4px 8px;font-size:1.2em}#rates-pagination{float:left;margin-left:.5em}#rates-pagination .tablenav{margin:0}.wc_input_table_wrapper{overflow-x:auto;display:block}table.wc_input_table,table.wc_tax_rates{width:100%}table.wc_input_table td,table.wc_input_table th,table.wc_tax_rates td,table.wc_tax_rates th{display:table-cell!important}table.wc_input_table span.tips,table.wc_tax_rates span.tips{color:#2ea2cc}table.wc_input_table th,table.wc_tax_rates th{white-space:nowrap;padding:10px}table.wc_input_table td,table.wc_tax_rates td{padding:0;border-left:1px solid #dfdfdf;border-bottom:1px solid #dfdfdf;border-top:0;background:#fff;cursor:default}table.wc_input_table td input[type=number],table.wc_input_table td input[type=text],table.wc_tax_rates td input[type=number],table.wc_tax_rates td input[type=text]{width:100%!important;min-width:100px;padding:8px 10px;margin:0;border:0;outline:0;background:transparent none}table.wc_input_table td input[type=number]:focus,table.wc_input_table td input[type=text]:focus,table.wc_tax_rates td input[type=number]:focus,table.wc_tax_rates td input[type=text]:focus{outline:0;box-shadow:none}table.wc_input_table td.apply_to_shipping,table.wc_input_table td.compound,table.wc_tax_rates td.apply_to_shipping,table.wc_tax_rates td.compound{padding:5px 7px;vertical-align:middle}table.wc_input_table td.apply_to_shipping input,table.wc_input_table td.compound input,table.wc_tax_rates td.apply_to_shipping input,table.wc_tax_rates td.compound input{width:auto;padding:0}table.wc_input_table td:last-child,table.wc_tax_rates td:last-child{border-left:0}table.wc_input_table tr.current td,table.wc_tax_rates tr.current td{background-color:#fefbcc}table.wc_input_table .cost,table.wc_input_table .item_cost,table.wc_tax_rates .cost,table.wc_tax_rates .item_cost{text-align:left}table.wc_input_table .cost input,table.wc_input_table .item_cost input,table.wc_tax_rates .cost input,table.wc_tax_rates .item_cost input{text-align:left}table.wc_input_table th.sort,table.wc_tax_rates th.sort{width:17px;padding:0 4px}table.wc_input_table td.sort,table.wc_tax_rates td.sort{padding:0 4px}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort{cursor:move;font-size:15px;background:#f9f9f9;text-align:center;vertical-align:middle}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort::before,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:right;height:100%}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort:hover::before,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort:hover::before{color:#333}table.wc_input_table .button,table.wc_tax_rates .button{float:right;margin-left:5px}table.wc_input_table .export,table.wc_input_table .import,table.wc_tax_rates .export,table.wc_tax_rates .import{float:left;margin-left:0;margin-right:5px}table.wc_input_table span.tips,table.wc_tax_rates span.tips{padding:0 3px}table.wc_input_table .pagination,table.wc_tax_rates .pagination{float:left}table.wc_input_table .pagination .button,table.wc_tax_rates .pagination .button{margin-right:5px;margin-left:0}table.wc_input_table .pagination .current,table.wc_tax_rates .pagination .current{background:#bbb;text-shadow:none}table.wc_input_table tr:last-child td,table.wc_tax_rates tr:last-child td{border-bottom:0}table.wc_emails,table.wc_gateways,table.wc_shipping{position:relative}table.wc_emails td,table.wc_emails th,table.wc_gateways td,table.wc_gateways th,table.wc_shipping td,table.wc_shipping th{display:table-cell!important;padding:1em!important;vertical-align:top;line-height:1.75em}table.wc_emails.wc_emails td,table.wc_gateways.wc_emails td,table.wc_shipping.wc_emails td{vertical-align:middle}table.wc_emails tr:nth-child(odd) td,table.wc_gateways tr:nth-child(odd) td,table.wc_shipping tr:nth-child(odd) td{background:#f9f9f9}table.wc_emails td.name,table.wc_gateways td.name,table.wc_shipping td.name{font-weight:700}table.wc_emails .settings,table.wc_gateways .settings,table.wc_shipping .settings{text-align:left}table.wc_emails .default,table.wc_emails .radio,table.wc_emails .status,table.wc_gateways .default,table.wc_gateways .radio,table.wc_gateways .status,table.wc_shipping .default,table.wc_shipping .radio,table.wc_shipping .status{text-align:center}table.wc_emails .default .tips,table.wc_emails .radio .tips,table.wc_emails .status .tips,table.wc_gateways .default .tips,table.wc_gateways .radio .tips,table.wc_gateways .status .tips,table.wc_shipping .default .tips,table.wc_shipping .radio .tips,table.wc_shipping .status .tips{margin:0 auto}table.wc_emails .default input,table.wc_emails .radio input,table.wc_emails .status input,table.wc_gateways .default input,table.wc_gateways .radio input,table.wc_gateways .status input,table.wc_shipping .default input,table.wc_shipping .radio input,table.wc_shipping .status input{margin:0}table.wc_emails td.sort,table.wc_gateways td.sort,table.wc_shipping td.sort{font-size:15px;text-align:center}table.wc_emails td.sort .wc-item-reorder-nav,table.wc_gateways td.sort .wc-item-reorder-nav,table.wc_shipping td.sort .wc-item-reorder-nav{white-space:nowrap;width:72px}table.wc_emails td.sort .wc-item-reorder-nav:before,table.wc_gateways td.sort .wc-item-reorder-nav:before,table.wc_shipping td.sort .wc-item-reorder-nav:before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:24px;float:right;height:100%;line-height:24px;cursor:move}table.wc_emails td.sort .wc-item-reorder-nav button,table.wc_gateways td.sort .wc-item-reorder-nav button,table.wc_shipping td.sort .wc-item-reorder-nav button{position:relative;overflow:hidden;float:right;display:block;width:24px;height:24px;margin:0;background:0 0;border:none;box-shadow:none;color:#82878c;text-indent:-9999px;cursor:pointer;outline:0}table.wc_emails td.sort .wc-item-reorder-nav button:before,table.wc_gateways td.sort .wc-item-reorder-nav button:before,table.wc_shipping td.sort .wc-item-reorder-nav button:before{display:inline-block;position:absolute;top:0;left:0;width:100%;height:100%;font:normal 20px/23px dashicons;text-align:center;text-indent:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}table.wc_emails td.sort .wc-item-reorder-nav button:focus,table.wc_emails td.sort .wc-item-reorder-nav button:hover,table.wc_gateways td.sort .wc-item-reorder-nav button:focus,table.wc_gateways td.sort .wc-item-reorder-nav button:hover,table.wc_shipping td.sort .wc-item-reorder-nav button:focus,table.wc_shipping td.sort .wc-item-reorder-nav button:hover{color:#191e23}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-down:before,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-down:before,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-down:before{content:"\f347"}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-up:before,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-up:before,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-up:before{content:"\f343"}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-disabled,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-disabled,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-disabled{color:#d5d5d5!important;cursor:default;pointer-events:none}table.wc_emails .wc-payment-gateway-method-name,table.wc_gateways .wc-payment-gateway-method-name,table.wc_shipping .wc-payment-gateway-method-name{font-weight:400}table.wc_emails .wc-email-settings-table-name,table.wc_gateways .wc-email-settings-table-name,table.wc_shipping .wc-email-settings-table-name{font-weight:700}table.wc_emails .wc-email-settings-table-name span,table.wc_gateways .wc-email-settings-table-name span,table.wc_shipping .wc-email-settings-table-name span{font-weight:400;color:#999;margin:0 4px 0 0!important}table.wc_emails .wc-payment-gateway-method-toggle-disabled,table.wc_emails .wc-payment-gateway-method-toggle-enabled,table.wc_gateways .wc-payment-gateway-method-toggle-disabled,table.wc_gateways .wc-payment-gateway-method-toggle-enabled,table.wc_shipping .wc-payment-gateway-method-toggle-disabled,table.wc_shipping .wc-payment-gateway-method-toggle-enabled{padding-top:1px;display:block;outline:0;box-shadow:none}table.wc_emails .wc-email-settings-table-status,table.wc_gateways .wc-email-settings-table-status,table.wc_shipping .wc-email-settings-table-status{text-align:center;width:1em}table.wc_emails .wc-email-settings-table-status .tips,table.wc_gateways .wc-email-settings-table-status .tips,table.wc_shipping .wc-email-settings-table-status .tips{margin:0 auto}.wc-shipping-zone-settings th{padding:24px 0 24px 24px}.wc-shipping-zone-settings td.forminp input,.wc-shipping-zone-settings td.forminp textarea{padding:8px;width:448px;max-width:100%!important}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select{width:448px;max-width:100%!important}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices{padding:8px 8px 4px;border-color:#ddd;min-height:0;line-height:1}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices input{padding:0}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices li{margin:0 0 4px 4px}.wc-shipping-zone-settings .wc-shipping-zone-postcodes-toggle{margin:.5em 0 0;font-size:.9em;text-decoration:underline;display:block}.wc-shipping-zone-settings .wc-shipping-zone-postcodes-toggle+.wc-shipping-zone-postcodes{display:none}.wc-shipping-zone-settings .wc-shipping-zone-postcodes textarea{margin:10px 0}.wc-shipping-zone-settings .wc-shipping-zone-postcodes .description{font-size:.9em;color:#999}.wc-shipping-zone-settings+p.submit{margin-top:0}table tr table.wc-shipping-zone-methods tr .row-actions,table tr:hover table.wc-shipping-zone-methods tr .row-actions{position:relative}table tr table.wc-shipping-zone-methods tr:hover .row-actions,table tr:hover table.wc-shipping-zone-methods tr:hover .row-actions{position:static}.wc-shipping-zones-heading .page-title-action{display:inline-block}table.wc-shipping-classes td,table.wc-shipping-classes th,table.wc-shipping-zone-methods td,table.wc-shipping-zone-methods th,table.wc-shipping-zones td,table.wc-shipping-zones th{vertical-align:top;line-height:24px;padding:1em!important;font-size:14px;background:#fff;display:table-cell!important}table.wc-shipping-classes td li,table.wc-shipping-classes th li,table.wc-shipping-zone-methods td li,table.wc-shipping-zone-methods th li,table.wc-shipping-zones td li,table.wc-shipping-zones th li{line-height:24px;font-size:14px}table.wc-shipping-classes td .woocommerce-help-tip,table.wc-shipping-classes th .woocommerce-help-tip,table.wc-shipping-zone-methods td .woocommerce-help-tip,table.wc-shipping-zone-methods th .woocommerce-help-tip,table.wc-shipping-zones td .woocommerce-help-tip,table.wc-shipping-zones th .woocommerce-help-tip{margin:0!important}table.wc-shipping-classes thead th,table.wc-shipping-zone-methods thead th,table.wc-shipping-zones thead th{vertical-align:middle}table.wc-shipping-classes thead .wc-shipping-zone-sort,table.wc-shipping-zone-methods thead .wc-shipping-zone-sort,table.wc-shipping-zones thead .wc-shipping-zone-sort{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state,table.wc-shipping-classes td.wc-shipping-zones-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zones-blank-state{background:#f7f1f6!important;overflow:hidden;position:relative;padding:7.5em 7.5%!important;border-bottom:2px solid #eee2ec}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-classes td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state{padding:2em!important}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-classes td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p{margin-bottom:0}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li,table.wc-shipping-classes td.wc-shipping-zone-method-blank-state p,table.wc-shipping-classes td.wc-shipping-zones-blank-state li,table.wc-shipping-classes td.wc-shipping-zones-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state p,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zones-blank-state li,table.wc-shipping-zones td.wc-shipping-zones-blank-state p{color:#a46497;font-size:1.5em;line-height:1.5em;margin:0 0 1em;position:relative;z-index:1;text-shadow:-1px 1px 1px #fff}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-classes td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-classes td.wc-shipping-zones-blank-state li.main,table.wc-shipping-classes td.wc-shipping-zones-blank-state p.main,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li.main,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state p.main,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-zones td.wc-shipping-zones-blank-state li.main,table.wc-shipping-zones td.wc-shipping-zones-blank-state p.main{font-size:2em}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li,table.wc-shipping-classes td.wc-shipping-zones-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zones td.wc-shipping-zones-blank-state li{margin-right:1em;list-style:circle inside}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-classes td.wc-shipping-zones-blank-state::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state::before,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-zones td.wc-shipping-zones-blank-state::before{content:'\e01b';font-family:WooCommerce;text-align:center;line-height:1;color:#eee2ec;display:block;width:1em;font-size:40em;top:50%;left:-3.75%;margin-top:-.1875em;position:absolute}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-classes td.wc-shipping-zones-blank-state .button-primary,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state .button-primary,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-zones td.wc-shipping-zones-blank-state .button-primary{background-color:#804877;border-color:#804877;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 0 rgba(0,0,0,.15);margin:0;opacity:1;text-shadow:0 -1px 1px #8a4f7f,-1px 0 1px #8a4f7f,0 1px 1px #8a4f7f,1px 0 1px #8a4f7f;font-size:1.5em;padding:.75em 1em;height:auto;position:relative;z-index:1}table.wc-shipping-classes .wc-shipping-zone-method-rows tr:nth-child(even) td,table.wc-shipping-zone-methods .wc-shipping-zone-method-rows tr:nth-child(even) td,table.wc-shipping-zones .wc-shipping-zone-method-rows tr:nth-child(even) td{background:#f9f9f9}table.wc-shipping-classes .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-classes tr.odd td,table.wc-shipping-zone-methods .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-zone-methods tr.odd td,table.wc-shipping-zones .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-zones tr.odd td{background:#f9f9f9}table.wc-shipping-classes tbody.wc-shipping-zone-rows td,table.wc-shipping-zone-methods tbody.wc-shipping-zone-rows td,table.wc-shipping-zones tbody.wc-shipping-zone-rows td{border-top:2px solid #f9f9f9}table.wc-shipping-classes tbody.wc-shipping-zone-rows tr:first-child td,table.wc-shipping-zone-methods tbody.wc-shipping-zone-rows tr:first-child td,table.wc-shipping-zones tbody.wc-shipping-zone-rows tr:first-child td{border-top:0}table.wc-shipping-classes tr.wc-shipping-zone-worldwide td,table.wc-shipping-zone-methods tr.wc-shipping-zone-worldwide td,table.wc-shipping-zones tr.wc-shipping-zone-worldwide td{background:#f9f9f9;border-top:2px solid #e1e1e1}table.wc-shipping-classes p,table.wc-shipping-classes ul,table.wc-shipping-zone-methods p,table.wc-shipping-zone-methods ul,table.wc-shipping-zones p,table.wc-shipping-zones ul{margin:0}table.wc-shipping-classes td.wc-shipping-zone-method-sort,table.wc-shipping-classes td.wc-shipping-zone-sort,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort,table.wc-shipping-zone-methods td.wc-shipping-zone-sort,table.wc-shipping-zones td.wc-shipping-zone-method-sort,table.wc-shipping-zones td.wc-shipping-zone-sort{cursor:move;font-size:15px;text-align:center}table.wc-shipping-classes td.wc-shipping-zone-method-sort::before,table.wc-shipping-classes td.wc-shipping-zone-sort::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort::before,table.wc-shipping-zone-methods td.wc-shipping-zone-sort::before,table.wc-shipping-zones td.wc-shipping-zone-method-sort::before,table.wc-shipping-zones td.wc-shipping-zone-sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:right;height:100%;line-height:24px}table.wc-shipping-classes td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-classes td.wc-shipping-zone-sort:hover::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-zone-methods td.wc-shipping-zone-sort:hover::before,table.wc-shipping-zones td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-zones td.wc-shipping-zone-sort:hover::before{color:#333}table.wc-shipping-classes td.wc-shipping-zone-worldwide,table.wc-shipping-zone-methods td.wc-shipping-zone-worldwide,table.wc-shipping-zones td.wc-shipping-zone-worldwide{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-worldwide::before,table.wc-shipping-zone-methods td.wc-shipping-zone-worldwide::before,table.wc-shipping-zones td.wc-shipping-zone-worldwide::before{content:'\f319';font-family:dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:right;height:100%;line-height:24px}table.wc-shipping-classes .wc-shipping-zone-methods,table.wc-shipping-classes .wc-shipping-zone-name,table.wc-shipping-zone-methods .wc-shipping-zone-methods,table.wc-shipping-zone-methods .wc-shipping-zone-name,table.wc-shipping-zones .wc-shipping-zone-methods,table.wc-shipping-zones .wc-shipping-zone-name{width:25%}table.wc-shipping-classes .wc-shipping-class-description input,table.wc-shipping-classes .wc-shipping-class-description select,table.wc-shipping-classes .wc-shipping-class-description textarea,table.wc-shipping-classes .wc-shipping-class-name input,table.wc-shipping-classes .wc-shipping-class-name select,table.wc-shipping-classes .wc-shipping-class-name textarea,table.wc-shipping-classes .wc-shipping-class-slug input,table.wc-shipping-classes .wc-shipping-class-slug select,table.wc-shipping-classes .wc-shipping-class-slug textarea,table.wc-shipping-classes .wc-shipping-zone-name input,table.wc-shipping-classes .wc-shipping-zone-name select,table.wc-shipping-classes .wc-shipping-zone-name textarea,table.wc-shipping-classes .wc-shipping-zone-region input,table.wc-shipping-classes .wc-shipping-zone-region select,table.wc-shipping-classes .wc-shipping-zone-region textarea,table.wc-shipping-zone-methods .wc-shipping-class-description input,table.wc-shipping-zone-methods .wc-shipping-class-description select,table.wc-shipping-zone-methods .wc-shipping-class-description textarea,table.wc-shipping-zone-methods .wc-shipping-class-name input,table.wc-shipping-zone-methods .wc-shipping-class-name select,table.wc-shipping-zone-methods .wc-shipping-class-name textarea,table.wc-shipping-zone-methods .wc-shipping-class-slug input,table.wc-shipping-zone-methods .wc-shipping-class-slug select,table.wc-shipping-zone-methods .wc-shipping-class-slug textarea,table.wc-shipping-zone-methods .wc-shipping-zone-name input,table.wc-shipping-zone-methods .wc-shipping-zone-name select,table.wc-shipping-zone-methods .wc-shipping-zone-name textarea,table.wc-shipping-zone-methods .wc-shipping-zone-region input,table.wc-shipping-zone-methods .wc-shipping-zone-region select,table.wc-shipping-zone-methods .wc-shipping-zone-region textarea,table.wc-shipping-zones .wc-shipping-class-description input,table.wc-shipping-zones .wc-shipping-class-description select,table.wc-shipping-zones .wc-shipping-class-description textarea,table.wc-shipping-zones .wc-shipping-class-name input,table.wc-shipping-zones .wc-shipping-class-name select,table.wc-shipping-zones .wc-shipping-class-name textarea,table.wc-shipping-zones .wc-shipping-class-slug input,table.wc-shipping-zones .wc-shipping-class-slug select,table.wc-shipping-zones .wc-shipping-class-slug textarea,table.wc-shipping-zones .wc-shipping-zone-name input,table.wc-shipping-zones .wc-shipping-zone-name select,table.wc-shipping-zones .wc-shipping-zone-name textarea,table.wc-shipping-zones .wc-shipping-zone-region input,table.wc-shipping-zones .wc-shipping-zone-region select,table.wc-shipping-zones .wc-shipping-zone-region textarea{width:100%}table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-zone-delete{color:#a00}table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-zone-delete:hover{color:red}table.wc-shipping-classes .wc-shipping-class-count,table.wc-shipping-zone-methods .wc-shipping-class-count,table.wc-shipping-zones .wc-shipping-class-count{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-methods,table.wc-shipping-zone-methods td.wc-shipping-zone-methods,table.wc-shipping-zones td.wc-shipping-zone-methods{color:#555}table.wc-shipping-classes td.wc-shipping-zone-methods .method_disabled,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .method_disabled,table.wc-shipping-zones td.wc-shipping-zone-methods .method_disabled{text-decoration:line-through}table.wc-shipping-classes td.wc-shipping-zone-methods ul,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul,table.wc-shipping-zones td.wc-shipping-zone-methods ul{position:relative;padding-left:32px}table.wc-shipping-classes td.wc-shipping-zone-methods ul li,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li,table.wc-shipping-zones td.wc-shipping-zone-methods ul li{color:#555;display:inline;margin:0}table.wc-shipping-classes td.wc-shipping-zone-methods ul li::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li::before,table.wc-shipping-zones td.wc-shipping-zone-methods ul li::before{content:', '}table.wc-shipping-classes td.wc-shipping-zone-methods ul li:first-child::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li:first-child::before,table.wc-shipping-zones td.wc-shipping-zone-methods ul li:first-child::before{content:''}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method{display:block;width:24px;padding:24px 0 0;height:0;overflow:hidden;cursor:pointer}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method::before,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";font-family:Dashicons;content:'\f502';color:#999;vertical-align:middle;line-height:24px;font-size:16px;margin:0}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method.disabled,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method.disabled,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method.disabled{cursor:not-allowed}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method.disabled::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method.disabled::before,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method.disabled::before{color:#ccc}table.wc-shipping-classes .wc-shipping-zone-method-title,table.wc-shipping-zone-methods .wc-shipping-zone-method-title,table.wc-shipping-zones .wc-shipping-zone-method-title{width:25%}table.wc-shipping-classes .wc-shipping-zone-method-title .wc-shipping-zone-method-delete,table.wc-shipping-zone-methods .wc-shipping-zone-method-title .wc-shipping-zone-method-delete,table.wc-shipping-zones .wc-shipping-zone-method-title .wc-shipping-zone-method-delete{color:red}table.wc-shipping-classes .wc-shipping-zone-method-enabled,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled,table.wc-shipping-zones .wc-shipping-zone-method-enabled{text-align:center}table.wc-shipping-classes .wc-shipping-zone-method-enabled a,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled a,table.wc-shipping-zones .wc-shipping-zone-method-enabled a{display:inline-block}table.wc-shipping-classes .wc-shipping-zone-method-enabled .woocommerce-input-toggle,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled .woocommerce-input-toggle,table.wc-shipping-zones .wc-shipping-zone-method-enabled .woocommerce-input-toggle{margin-top:3px}table.wc-shipping-classes .wc-shipping-zone-method-type,table.wc-shipping-zone-methods .wc-shipping-zone-method-type,table.wc-shipping-zones .wc-shipping-zone-method-type{display:block}table.wc-shipping-classes tfoot input,table.wc-shipping-classes tfoot select,table.wc-shipping-zone-methods tfoot input,table.wc-shipping-zone-methods tfoot select,table.wc-shipping-zones tfoot input,table.wc-shipping-zones tfoot select{vertical-align:middle!important}table.wc-shipping-classes tfoot .button-secondary,table.wc-shipping-zone-methods tfoot .button-secondary,table.wc-shipping-zones tfoot .button-secondary{float:left}table.wc-shipping-classes .editing .wc-shipping-zone-edit,table.wc-shipping-classes .editing .wc-shipping-zone-view,table.wc-shipping-zone-methods .editing .wc-shipping-zone-edit,table.wc-shipping-zone-methods .editing .wc-shipping-zone-view,table.wc-shipping-zones .editing .wc-shipping-zone-edit,table.wc-shipping-zones .editing .wc-shipping-zone-view{display:none}.woocommerce-input-toggle{height:16px;width:32px;border:2px solid #935687;background-color:#935687;display:inline-block;text-indent:-9999px;border-radius:10em;position:relative;margin-top:-1px;vertical-align:text-top}.woocommerce-input-toggle:before{content:"";display:block;width:16px;height:16px;background:#fff;position:absolute;top:0;left:0;border-radius:100%}.woocommerce-input-toggle.woocommerce-input-toggle--disabled{border-color:#999;background-color:#999}.woocommerce-input-toggle.woocommerce-input-toggle--disabled:before{left:auto;right:0}.woocommerce-input-toggle.woocommerce-input-toggle--loading{opacity:.5}.wc-modal-shipping-method-settings{background:#f8f8f8;padding:1em!important}.wc-modal-shipping-method-settings form .form-table{width:100%;background:#fff;margin:0 0 1.5em}.wc-modal-shipping-method-settings form .form-table tr th{width:30%;position:relative}.wc-modal-shipping-method-settings form .form-table tr th .woocommerce-help-tip{float:left;margin:-8px 0 0 -.5em;vertical-align:middle;left:0;top:50%;position:absolute}.wc-modal-shipping-method-settings form .form-table tr td input,.wc-modal-shipping-method-settings form .form-table tr td select,.wc-modal-shipping-method-settings form .form-table tr td textarea{width:50%;min-width:250px}.wc-modal-shipping-method-settings form .form-table tr td input[type=checkbox]{width:auto;min-width:16px}.wc-modal-shipping-method-settings form .form-table tr td,.wc-modal-shipping-method-settings form .form-table tr th{vertical-align:middle;margin:0;line-height:24px;padding:1em;border-bottom:1px solid #f8f8f8}.wc-modal-shipping-method-settings form .form-table:last-of-type{margin-bottom:0}.wc-backbone-modal .wc-shipping-zone-method-selector p{margin-top:0}.wc-backbone-modal .wc-shipping-zone-method-selector .wc-shipping-zone-method-description{margin:.75em 1px 0;line-height:1.5em;color:#999;font-style:italic}.wc-backbone-modal .wc-shipping-zone-method-selector select{width:100%;cursor:pointer}img.help_tip{margin:0 9px 0 0;vertical-align:middle}.postbox img.help_tip{margin-top:0}.postbox .woocommerce-help-tip{margin:0 9px 0 0}.status-disabled,.status-enabled,.status-manual{font-size:1.4em;display:block;text-indent:-9999px;position:relative;height:1em;width:1em}.status-manual::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#999}.status-enabled::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#a46497}.status-disabled::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}.woocommerce h2.woo-nav-tab-wrapper{margin-bottom:1em}.woocommerce nav.woo-nav-tab-wrapper{margin:1.5em 0 1em}.woocommerce .subsubsub{margin:-8px 0 0}.woocommerce .wc-admin-breadcrumb{margin-right:.5em}.woocommerce .wc-admin-breadcrumb a{color:#a46497}.woocommerce #template div{margin:0}.woocommerce #template div p .button{float:left;margin-right:10px;margin-top:-4px}.woocommerce #template div .editor textarea{margin-bottom:8px}.woocommerce textarea[disabled=disabled]{background:#dfdfdf!important}.woocommerce table.form-table{margin:0;position:relative;table-layout:fixed}.woocommerce table.form-table .forminp-radio ul{margin:0}.woocommerce table.form-table .forminp-radio ul li{line-height:1.4em}.woocommerce table.form-table input[type=email],.woocommerce table.form-table input[type=number],.woocommerce table.form-table input[type=text]{height:auto}.woocommerce table.form-table textarea.input-text{height:100%;min-width:150px;display:block}.woocommerce table.form-table input.regular-input,.woocommerce table.form-table input[type=date],.woocommerce table.form-table input[type=datetime-local],.woocommerce table.form-table input[type=datetime],.woocommerce table.form-table input[type=email],.woocommerce table.form-table input[type=number],.woocommerce table.form-table input[type=password],.woocommerce table.form-table input[type=tel],.woocommerce table.form-table input[type=text],.woocommerce table.form-table input[type=time],.woocommerce table.form-table input[type=url],.woocommerce table.form-table input[type=week],.woocommerce table.form-table textarea{width:400px;margin:0;padding:6px;box-sizing:border-box;vertical-align:top}.woocommerce table.form-table input[type=date],.woocommerce table.form-table input[type=datetime-local],.woocommerce table.form-table input[type=tel],.woocommerce table.form-table input[type=time],.woocommerce table.form-table input[type=week]{width:200px}.woocommerce table.form-table select{width:400px;margin:0;box-sizing:border-box;height:32px;line-height:32px;vertical-align:top}.woocommerce table.form-table input[size]{width:auto!important}.woocommerce table.form-table table input.regular-input,.woocommerce table.form-table table input[type=email],.woocommerce table.form-table table input[type=number],.woocommerce table.form-table table input[type=text],.woocommerce table.form-table table select,.woocommerce table.form-table table textarea{width:auto}.woocommerce table.form-table textarea.wide-input{width:100%}.woocommerce table.form-table .woocommerce-help-tip,.woocommerce table.form-table img.help_tip{padding:0;margin:-4px 5px 0 0;vertical-align:middle;cursor:help;line-height:1}.woocommerce table.form-table span.help_tip{cursor:help;color:#2ea2cc}.woocommerce table.form-table th{position:relative;padding-left:24px}.woocommerce table.form-table th label{position:relative;display:block}.woocommerce table.form-table th label .woocommerce-help-tip,.woocommerce table.form-table th label img.help_tip{margin:-8px 0 0 -24px;position:absolute;left:0;top:50%}.woocommerce table.form-table th label+.woocommerce-help-tip{margin:0;position:absolute;left:0;top:20px}.woocommerce table.form-table woocommerce-help-tip .select2-container{vertical-align:top;margin-bottom:3px}.woocommerce table.form-table table.widefat th{padding-left:inherit}.woocommerce table.form-table .wp-list-table .woocommerce-help-tip{float:none}.woocommerce table.form-table fieldset{margin-top:4px}.woocommerce table.form-table fieldset .woocommerce-help-tip,.woocommerce table.form-table fieldset img.help_tip{margin:-3px 5px 0 0}.woocommerce table.form-table fieldset p.description{margin-bottom:8px}.woocommerce table.form-table fieldset:first-child{margin-top:0}.woocommerce table.form-table .iris-picker{z-index:100;display:none;position:absolute;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.2)}.woocommerce table.form-table .iris-picker .ui-slider{border:0!important;margin:0!important;width:auto!important;height:auto!important;background:none transparent!important}.woocommerce table.form-table .iris-picker .ui-slider .ui-slider-handle{margin-bottom:0!important}.woocommerce table.form-table .iris-error{background-color:#ffafaf}.woocommerce table.form-table .colorpickpreview{padding:7px 0;line-height:1em;display:inline-block;width:26px;border:1px solid #ddd;font-size:14px}.woocommerce table.form-table .image_width_settings{vertical-align:middle}.woocommerce table.form-table .image_width_settings label{margin-right:10px}.woocommerce table.form-table .image_width_settings input{width:auto}.woocommerce table.form-table .wc_emails_wrapper,.woocommerce table.form-table .wc_payment_gateways_wrapper{padding:0 0 10px 15px}.woocommerce #tabs-wrap table a.remove{margin-right:4px}.woocommerce #tabs-wrap table p{margin:0 0 4px!important;overflow:hidden;zoom:1}.woocommerce #tabs-wrap table p a.add{float:right}#wp-excerpt-editor-container{background:#fff}#product_variation-parent #parent_id{width:100%}#postimagediv img{border:1px solid #d5d5d5;max-width:100%}#woocommerce-product-images .inside{margin:0;padding:0}#woocommerce-product-images .inside .add_product_images{padding:0 12px 12px}#woocommerce-product-images .inside #product_images_container{padding:0 9px 0 0}#woocommerce-product-images .inside #product_images_container ul{margin:0;padding:0}#woocommerce-product-images .inside #product_images_container ul::after,#woocommerce-product-images .inside #product_images_container ul::before{content:' ';display:table}#woocommerce-product-images .inside #product_images_container ul::after{clear:both}#woocommerce-product-images .inside #product_images_container ul li.add,#woocommerce-product-images .inside #product_images_container ul li.image,#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder{width:80px;float:right;cursor:move;border:1px solid #d5d5d5;margin:9px 0 0 9px;background:#f7f7f7;border-radius:2px;position:relative;box-sizing:border-box}#woocommerce-product-images .inside #product_images_container ul li.add img,#woocommerce-product-images .inside #product_images_container ul li.image img,#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder img{width:100%;height:auto;display:block}#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder{border:3px dashed #ddd;position:relative}#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";font-size:2.618em;line-height:72px;color:#ddd}#woocommerce-product-images .inside #product_images_container ul ul.actions{position:absolute;top:-8px;left:-8px;padding:2px;display:none}#woocommerce-product-images .inside #product_images_container ul ul.actions li{float:left;margin:0 2px 0 0}#woocommerce-product-images .inside #product_images_container ul ul.actions li a{width:1em;height:1em;margin:0;height:0;display:block;overflow:hidden}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.tips{cursor:pointer}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.4em}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#999;background:#fff;border-radius:50%;height:1em;width:1em;line-height:1em}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete:hover::before{color:#a00}#woocommerce-product-images .inside #product_images_container ul li:hover ul.actions{display:block}#woocommerce-product-data .hndle{padding:10px}#woocommerce-product-data .hndle span{display:block;vertical-align:middle;line-height:24px}#woocommerce-product-data .hndle span span{display:inline;line-height:inherit;vertical-align:baseline}#woocommerce-product-data .hndle select{margin:0}#woocommerce-product-data .hndle label{padding-left:1em;font-size:12px;vertical-align:baseline}#woocommerce-product-data .hndle label:first-child{margin-left:1em;border-left:1px solid #dfdfdf}#woocommerce-product-data .hndle input,#woocommerce-product-data .hndle select{margin-top:-3px 0 0;vertical-align:middle}#woocommerce-product-data .hndle select{margin-right:.5em}#woocommerce-product-data>.handlediv{margin-top:4px}#woocommerce-product-data .wrap{margin:0}#woocommerce-coupon-description{padding:3px 8px;font-size:1.7em;line-height:1.42em;height:auto;width:100%;outline:0;margin:10px 0;display:block}#woocommerce-coupon-description::-webkit-input-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description::-moz-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description:-ms-input-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description:-moz-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-data .panel-wrap,#woocommerce-product-data .panel-wrap{background:#fff}#woocommerce-coupon-data .wc-metaboxes-wrapper,#woocommerce-coupon-data .woocommerce_options_panel,#woocommerce-product-data .wc-metaboxes-wrapper,#woocommerce-product-data .woocommerce_options_panel{float:right;width:80%}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios,#woocommerce-product-data .woocommerce_options_panel .wc-radios{display:block;float:right;margin:0}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios li,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios li,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios li,#woocommerce-product-data .woocommerce_options_panel .wc-radios li{display:block;padding:0 0 10px}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios li input,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios li input,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios li input,#woocommerce-product-data .woocommerce_options_panel .wc-radios li input{width:auto}#woocommerce-coupon-data .panel-wrap,#woocommerce-product-data .panel-wrap,.woocommerce .panel-wrap{overflow:hidden}#woocommerce-coupon-data ul.wc-tabs,#woocommerce-product-data ul.wc-tabs,.woocommerce ul.wc-tabs{margin:0;width:20%;float:right;line-height:1em;padding:0 0 10px;position:relative;background-color:#fafafa;border-left:1px solid #eee;box-sizing:border-box}#woocommerce-coupon-data ul.wc-tabs::after,#woocommerce-product-data ul.wc-tabs::after,.woocommerce ul.wc-tabs::after{content:'';display:block;width:100%;height:9999em;position:absolute;bottom:-9999em;right:0;background-color:#fafafa;border-left:1px solid #eee}#woocommerce-coupon-data ul.wc-tabs li,#woocommerce-product-data ul.wc-tabs li,.woocommerce ul.wc-tabs li{margin:0;padding:0;display:block;position:relative}#woocommerce-coupon-data ul.wc-tabs li a,#woocommerce-product-data ul.wc-tabs li a,.woocommerce ul.wc-tabs li a{margin:0;padding:10px;display:block;box-shadow:none;text-decoration:none;line-height:20px!important;border-bottom:1px solid #eee}#woocommerce-coupon-data ul.wc-tabs li a span,#woocommerce-product-data ul.wc-tabs li a span,.woocommerce ul.wc-tabs li a span{margin-right:.618em;margin-left:.618em}#woocommerce-coupon-data ul.wc-tabs li a::before,#woocommerce-product-data ul.wc-tabs li a::before,.woocommerce ul.wc-tabs li a::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;content:"";text-decoration:none}#woocommerce-coupon-data ul.wc-tabs li.general_options a::before,#woocommerce-product-data ul.wc-tabs li.general_options a::before,.woocommerce ul.wc-tabs li.general_options a::before{content:'\f107'}#woocommerce-coupon-data ul.wc-tabs li.inventory_options a::before,#woocommerce-product-data ul.wc-tabs li.inventory_options a::before,.woocommerce ul.wc-tabs li.inventory_options a::before{content:'\f481'}#woocommerce-coupon-data ul.wc-tabs li.shipping_options a::before,#woocommerce-product-data ul.wc-tabs li.shipping_options a::before,.woocommerce ul.wc-tabs li.shipping_options a::before{font-family:WooCommerce;content:'\e01a'}#woocommerce-coupon-data ul.wc-tabs li.linked_product_options a::before,#woocommerce-product-data ul.wc-tabs li.linked_product_options a::before,.woocommerce ul.wc-tabs li.linked_product_options a::before{content:'\f103'}#woocommerce-coupon-data ul.wc-tabs li.attribute_options a::before,#woocommerce-product-data ul.wc-tabs li.attribute_options a::before,.woocommerce ul.wc-tabs li.attribute_options a::before{content:'\f175'}#woocommerce-coupon-data ul.wc-tabs li.advanced_options a::before,#woocommerce-product-data ul.wc-tabs li.advanced_options a::before,.woocommerce ul.wc-tabs li.advanced_options a::before{font-family:Dashicons;content:'\f111'}#woocommerce-coupon-data ul.wc-tabs li.variations_options a::before,#woocommerce-product-data ul.wc-tabs li.variations_options a::before,.woocommerce ul.wc-tabs li.variations_options a::before{content:'\f509'}#woocommerce-coupon-data ul.wc-tabs li.usage_restriction_options a::before,#woocommerce-product-data ul.wc-tabs li.usage_restriction_options a::before,.woocommerce ul.wc-tabs li.usage_restriction_options a::before{font-family:WooCommerce;content:'\e602'}#woocommerce-coupon-data ul.wc-tabs li.usage_limit_options a::before,#woocommerce-product-data ul.wc-tabs li.usage_limit_options a::before,.woocommerce ul.wc-tabs li.usage_limit_options a::before{font-family:WooCommerce;content:'\e601'}#woocommerce-coupon-data ul.wc-tabs li.general_coupon_data a::before,#woocommerce-product-data ul.wc-tabs li.general_coupon_data a::before,.woocommerce ul.wc-tabs li.general_coupon_data a::before{font-family:WooCommerce;content:'\e600'}#woocommerce-coupon-data ul.wc-tabs li.active a,#woocommerce-product-data ul.wc-tabs li.active a,.woocommerce ul.wc-tabs li.active a{color:#555;position:relative;background-color:#eee}.woocommerce_page_wc-settings input[type=email],.woocommerce_page_wc-settings input[type=url]{direction:rtl}.woocommerce_page_wc-settings .shippingrows th.check-column{padding-top:20px}.woocommerce_page_wc-settings .shippingrows tfoot th{padding-right:10px}.woocommerce_page_wc-settings .shippingrows .add.button::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none}.woocommerce_page_wc-settings h3.wc-settings-sub-title{font-size:1.2em}#woocommerce-coupon-data .inside,#woocommerce-order-data .inside,#woocommerce-order-downloads .inside,#woocommerce-product-data .inside,#woocommerce-product-type-options .inside{margin:0;padding:0}.panel,.woocommerce_options_panel{padding:9px;color:#555}.panel .form-field .woocommerce-help-tip,.woocommerce_options_panel .form-field .woocommerce-help-tip{font-size:1.4em}.panel,.woocommerce_page_settings .woocommerce_options_panel{padding:0}#woocommerce-product-specs .inside,#woocommerce-product-type-options .panel{margin:0;padding:9px}#woocommerce-product-type-options .panel p,.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p{margin:0 0 9px;font-size:12px;padding:5px 9px;line-height:24px}#woocommerce-product-type-options .panel p::after,.woocommerce_options_panel fieldset.form-field::after,.woocommerce_options_panel p::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce_options_panel .checkbox,.woocommerce_variable_attributes .checkbox{width:auto;margin:4px 0!important;vertical-align:middle;float:right}.woocommerce_options_panel .downloadable_files table,.woocommerce_variations .downloadable_files table{width:100%;padding:0!important}.woocommerce_options_panel .downloadable_files table th,.woocommerce_variations .downloadable_files table th{padding:7px 7px 7px 0!important}.woocommerce_options_panel .downloadable_files table th.sort,.woocommerce_variations .downloadable_files table th.sort{width:17px;padding:7px!important}.woocommerce_options_panel .downloadable_files table th .woocommerce-help-tip,.woocommerce_variations .downloadable_files table th .woocommerce-help-tip{font-size:1.1em;margin-right:0}.woocommerce_options_panel .downloadable_files table td,.woocommerce_variations .downloadable_files table td{vertical-align:middle!important;padding:4px 7px 4px 0!important;position:relative}.woocommerce_options_panel .downloadable_files table td:last-child,.woocommerce_variations .downloadable_files table td:last-child{padding-left:7px!important}.woocommerce_options_panel .downloadable_files table td input.input_text,.woocommerce_variations .downloadable_files table td input.input_text{width:100%;float:none;min-width:0;margin:1px 0}.woocommerce_options_panel .downloadable_files table td .upload_file_button,.woocommerce_variations .downloadable_files table td .upload_file_button{width:auto;float:left;cursor:pointer}.woocommerce_options_panel .downloadable_files table td .delete,.woocommerce_variations .downloadable_files table td .delete{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.2em}.woocommerce_options_panel .downloadable_files table td .delete::before,.woocommerce_variations .downloadable_files table td .delete::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#999}.woocommerce_options_panel .downloadable_files table td .delete:hover::before,.woocommerce_variations .downloadable_files table td .delete:hover::before{color:#a00}.woocommerce_options_panel .downloadable_files table td.sort,.woocommerce_variations .downloadable_files table td.sort{width:17px;cursor:move;font-size:15px;text-align:center;background:#f9f9f9;padding-left:7px!important}.woocommerce_options_panel .downloadable_files table td.sort::before,.woocommerce_variations .downloadable_files table td.sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:right;height:100%}.woocommerce_options_panel .downloadable_files table td.sort:hover::before,.woocommerce_variations .downloadable_files table td.sort:hover::before{color:#333}.woocommerce_variation h3 .sort{width:17px;height:26px;cursor:move;float:left;font-size:15px;font-weight:400;margin-left:.5em;visibility:hidden;text-align:center;vertical-align:middle}.woocommerce_variation h3 .sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:28px;color:#999;display:block;width:17px;float:right;height:100%}.woocommerce_variation h3 .sort:hover::before{color:#777}.woocommerce_variation h3:hover .sort,.woocommerce_variation.ui-sortable-helper .sort{visibility:visible}.woocommerce_options_panel{min-height:175px;box-sizing:border-box}.woocommerce_options_panel .downloadable_files{padding:0 162px 0 9px;position:relative;margin:9px 0}.woocommerce_options_panel .downloadable_files label{position:absolute;right:0;margin:0 12px 0 0;line-height:24px}.woocommerce_options_panel p{margin:9px 0}.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p.form-field{padding:5px 162px 5px 20px!important}.woocommerce_options_panel .sale_price_dates_fields .short:first-of-type{margin-bottom:1em}.woocommerce_options_panel .sale_price_dates_fields .short:nth-of-type(2){clear:right}.woocommerce_options_panel label,.woocommerce_options_panel legend{float:right;width:150px;padding:0;margin:0 -150px 0 0}.woocommerce_options_panel label .req,.woocommerce_options_panel legend .req{font-weight:700;font-style:normal;color:#a00}.woocommerce_options_panel .description{padding:0;margin:0 7px 0 0;clear:none;display:inline}.woocommerce_options_panel .description-block{margin-right:0;display:block}.woocommerce_options_panel input,.woocommerce_options_panel select,.woocommerce_options_panel textarea{margin:0}.woocommerce_options_panel textarea{float:right;height:3.5em;line-height:1.5em;vertical-align:top}.woocommerce_options_panel input[type=email],.woocommerce_options_panel input[type=number],.woocommerce_options_panel input[type=password],.woocommerce_options_panel input[type=text]{width:50%;float:right}.woocommerce_options_panel input.button{width:auto;margin-right:8px}.woocommerce_options_panel select{float:right}.woocommerce_options_panel .short,.woocommerce_options_panel input[type=email].short,.woocommerce_options_panel input[type=number].short,.woocommerce_options_panel input[type=password].short,.woocommerce_options_panel input[type=text].short{width:50%}.woocommerce_options_panel .sized{width:auto!important;margin-left:6px}.woocommerce_options_panel .options_group{border-top:1px solid #fff;border-bottom:1px solid #eee}.woocommerce_options_panel .options_group:first-child{border-top:0}.woocommerce_options_panel .options_group:last-child{border-bottom:0}.woocommerce_options_panel .options_group fieldset{margin:9px 0;font-size:12px;padding:5px 9px;line-height:24px}.woocommerce_options_panel .options_group fieldset label{width:auto;float:none}.woocommerce_options_panel .options_group fieldset ul{float:right;width:50%;margin:0;padding:0}.woocommerce_options_panel .options_group fieldset ul li{margin:0;width:auto}.woocommerce_options_panel .options_group fieldset ul li input{width:auto;float:none;margin-left:4px}.woocommerce_options_panel .options_group fieldset ul.wc-radios label{margin-right:0}.woocommerce_options_panel .dimensions_field .wrap{display:block;width:50%}.woocommerce_options_panel .dimensions_field .wrap input{width:30.75%;margin-left:3.8%}.woocommerce_options_panel .dimensions_field .wrap .last{margin-left:0}.woocommerce_options_panel.padded{padding:1em}.woocommerce_options_panel .select2-container{float:right}#woocommerce-product-data input.dp-applied{float:right}#grouped_product_options,#simple_product_options,#virtual_product_options{padding:12px;font-style:italic;color:#666}.wc-metaboxes-wrapper .toolbar{margin:0!important;border-top:1px solid #fff;border-bottom:1px solid #eee;padding:9px 12px!important}.wc-metaboxes-wrapper .toolbar:first-child{border-top:0}.wc-metaboxes-wrapper .toolbar:last-child{border-bottom:0}.wc-metaboxes-wrapper .toolbar .add_variation{float:left;margin-right:5px}.wc-metaboxes-wrapper .toolbar .cancel-variation-changes,.wc-metaboxes-wrapper .toolbar .save-variation-changes{float:right;margin-left:5px}.wc-metaboxes-wrapper p.toolbar{overflow:hidden;zoom:1}.wc-metaboxes-wrapper .expand-close{margin-left:2px;color:#777;font-size:12px;font-style:italic}.wc-metaboxes-wrapper .expand-close a{background:0 0;padding:0;font-size:12px;text-decoration:none}.wc-metaboxes-wrapper#product_attributes .expand-close{float:left;line-height:28px}.wc-metaboxes-wrapper .fr,.wc-metaboxes-wrapper button.add_variable_attribute{float:left;margin:0 6px 0 0}.wc-metaboxes-wrapper .wc-metaboxes{border-bottom:1px solid #eee}.wc-metaboxes-wrapper .wc-metabox-sortable-placeholder{border-color:#bbb;background-color:#f5f5f5;margin-bottom:9px;border-width:1px;border-style:dashed}.wc-metaboxes-wrapper .wc-metabox{background:#fff;border-bottom:1px solid #eee;margin:0!important}.wc-metaboxes-wrapper .wc-metabox select{font-weight:400}.wc-metaboxes-wrapper .wc-metabox:last-of-type{border-bottom:0}.wc-metaboxes-wrapper .wc-metabox .handlediv{width:27px}.wc-metaboxes-wrapper .wc-metabox .handlediv::before{content:'\f142'!important;cursor:pointer;display:inline-block;font:400 20px/1 Dashicons;line-height:.5!important;padding:8px 10px;position:relative;left:12px;top:0}.wc-metaboxes-wrapper .wc-metabox.closed{border-radius:3px}.wc-metaboxes-wrapper .wc-metabox.closed .handlediv::before{content:'\f140'!important}.wc-metaboxes-wrapper .wc-metabox.closed h3{border:0}.wc-metaboxes-wrapper .wc-metabox h3{margin:0!important;padding:.75em 1em .75em .75em!important;font-size:1em!important;overflow:hidden;zoom:1;cursor:move}.wc-metaboxes-wrapper .wc-metabox h3 a.delete,.wc-metaboxes-wrapper .wc-metabox h3 button{float:left}.wc-metaboxes-wrapper .wc-metabox h3 a.delete{color:red;font-weight:400;line-height:26px;text-decoration:none;position:relative;visibility:hidden}.wc-metaboxes-wrapper .wc-metabox h3 strong{font-weight:400;line-height:26px;font-weight:700}.wc-metaboxes-wrapper .wc-metabox h3 select{font-family:sans-serif;max-width:20%;margin:.25em 0 .25em .25em}.wc-metaboxes-wrapper .wc-metabox h3 .handlediv{background-position:6px 5px!important;visibility:hidden;height:26px}.wc-metaboxes-wrapper .wc-metabox h3.fixed{cursor:pointer!important}.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3{cursor:pointer;padding:.5em 1em .5em .75em!important}.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 .handlediv,.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 .sort,.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 a.delete{margin-top:.25em}.wc-metaboxes-wrapper .wc-metabox h3:hover .handlediv,.wc-metaboxes-wrapper .wc-metabox h3:hover a.delete,.wc-metaboxes-wrapper .wc-metabox.ui-sortable-helper .handlediv,.wc-metaboxes-wrapper .wc-metabox.ui-sortable-helper a.delete{visibility:visible}.wc-metaboxes-wrapper .wc-metabox table{width:100%;position:relative;background-color:#fdfdfd;padding:1em;border-top:1px solid #eee}.wc-metaboxes-wrapper .wc-metabox table td{text-align:right;padding:0 0 1em 6px;vertical-align:top;border:0}.wc-metaboxes-wrapper .wc-metabox table td label{text-align:right;display:block;line-height:21px}.wc-metaboxes-wrapper .wc-metabox table td input{float:right;min-width:200px}.wc-metaboxes-wrapper .wc-metabox table td input,.wc-metaboxes-wrapper .wc-metabox table td textarea{width:100%;margin:0;display:block;font-size:14px;padding:4px;color:#555}.wc-metaboxes-wrapper .wc-metabox table td .select2-container,.wc-metaboxes-wrapper .wc-metabox table td select{width:100%!important}.wc-metaboxes-wrapper .wc-metabox table td input.short{width:200px}.wc-metaboxes-wrapper .wc-metabox table td input.checkbox{width:16px;min-width:inherit;vertical-align:text-bottom;display:inline-block;float:none}.wc-metaboxes-wrapper .wc-metabox table td.attribute_name{width:200px}.wc-metaboxes-wrapper .wc-metabox table .minus,.wc-metaboxes-wrapper .wc-metabox table .plus{margin-top:6px}.wc-metaboxes-wrapper .wc-metabox table .fl{float:right}.wc-metaboxes-wrapper .wc-metabox table .fr{float:left}.variations-pagenav{float:left;line-height:24px}.variations-pagenav .displaying-num{color:#777;font-size:12px;font-style:italic}.variations-pagenav a{padding:0 10px 3px;background:rgba(0,0,0,.05);font-size:16px;font-weight:400;text-decoration:none}.variations-pagenav a.disabled,.variations-pagenav a.disabled:active,.variations-pagenav a.disabled:focus,.variations-pagenav a.disabled:hover{color:#a0a5aa;background:rgba(0,0,0,.05)}.variations-defaults{float:right}.variations-defaults select{margin:.25em 0 .25em .25em}.woocommerce_variable_attributes{background-color:#fdfdfd;border-top:1px solid #eee}.woocommerce_variable_attributes .data{padding:1em 2em}.woocommerce_variable_attributes .data::after,.woocommerce_variable_attributes .data::before{content:' ';display:table}.woocommerce_variable_attributes .data::after{clear:both}.woocommerce_variable_attributes .upload_image_button{display:block;width:64px;height:64px;float:right;margin-left:20px;position:relative;cursor:pointer}.woocommerce_variable_attributes .upload_image_button img{width:100%;height:auto;display:none}.woocommerce_variable_attributes .upload_image_button::before{content:'\f128';font-family:Dashicons;position:absolute;top:0;right:0;left:0;bottom:0;text-align:center;line-height:64px;font-size:64px;font-weight:400;-webkit-font-smoothing:antialiased}.woocommerce_variable_attributes .upload_image_button.remove img{display:block}.woocommerce_variable_attributes .upload_image_button.remove::before{content:'\f335';display:none}.woocommerce_variable_attributes .upload_image_button.remove:hover::before{display:block}.woocommerce_variable_attributes .options{border:1px solid #eee;border-width:1px 0;padding:.25em 0}.woocommerce_variable_attributes .options label{display:inline-block;padding:4px 0 2px 1em}.woocommerce_variable_attributes .options input[type=checkbox]{margin:0 .5em 0 5px!important;vertical-align:middle}.form-row label{display:inline-block}.form-row .woocommerce-help-tip{float:left}.form-row input[type=number],.form-row input[type=text],.form-row select,.form-row textarea{width:100%;vertical-align:middle;margin:2px 0 0;padding:5px}.form-row select{height:30px;line-height:30px}.form-row.dimensions_field .wrap{clear:right;display:block}.form-row.dimensions_field input{width:33%;float:right;vertical-align:middle}.form-row.dimensions_field input:last-of-type{margin-left:0;width:34%}.form-row.form-row-first,.form-row.form-row-last{width:48%;float:left}.form-row.form-row-first{clear:both;float:right}.form-row.form-row-full{clear:both}.tips{cursor:help;text-decoration:none}img.tips{padding:5px 0 0}#tiptip_holder{display:none;z-index:8675309;position:absolute;top:0;left:0}#tiptip_holder.tip_top{padding-bottom:5px}#tiptip_holder.tip_top #tiptip_arrow_inner{margin-top:-7px;margin-right:-6px;border-top-color:#333}#tiptip_holder.tip_bottom{padding-top:5px}#tiptip_holder.tip_bottom #tiptip_arrow_inner{margin-top:-5px;margin-right:-6px;border-bottom-color:#333}#tiptip_holder.tip_right{padding-right:5px}#tiptip_holder.tip_right #tiptip_arrow_inner{margin-top:-6px;margin-right:-5px;border-left-color:#333}#tiptip_holder.tip_left{padding-left:5px}#tiptip_holder.tip_left #tiptip_arrow_inner{margin-top:-6px;margin-right:-7px;border-right-color:#333}#tiptip_content,.chart-tooltip,.wc_error_tip{color:#fff;font-size:.8em;max-width:150px;background:#333;text-align:center;border-radius:3px;padding:.618em 1em;box-shadow:0 1px 3px rgba(0,0,0,.2)}#tiptip_content code,.chart-tooltip code,.wc_error_tip code{padding:1px;background:#888}#tiptip_arrow,#tiptip_arrow_inner{position:absolute;border-color:transparent;border-style:solid;border-width:6px;height:0;width:0}#tiptip_arrow{right:50%;margin-right:-6px}.wc_error_tip{max-width:20em;line-height:1.8em;position:absolute;white-space:normal;background:#d82223;margin:1.5em -1em 0 1px;z-index:9999999}.wc_error_tip::after{content:'';display:block;border:8px solid #d82223;border-left-color:transparent;border-right-color:transparent;border-top-color:transparent;position:absolute;top:-3px;right:50%;margin:-1em -3px 0 0}img.ui-datepicker-trigger{vertical-align:middle;margin-top:-1px;cursor:pointer}.wc-metabox-content img.ui-datepicker-trigger,.woocommerce_options_panel img.ui-datepicker-trigger{float:right;margin-left:8px;margin-top:4px;margin-right:4px}#ui-datepicker-div{display:none}.woocommerce-reports-remove-filter{color:red;text-decoration:none}.woocommerce-reports-wide.woocommerce-reports-wrap,.woocommerce-reports-wrap.woocommerce-reports-wrap{margin-right:300px;padding-top:18px}.woocommerce-reports-wide.halved,.woocommerce-reports-wrap.halved{margin:0;overflow:hidden;zoom:1}.woocommerce-reports-wide .widefat th,.woocommerce-reports-wrap .widefat th{padding:7px}.woocommerce-reports-wide .widefat td,.woocommerce-reports-wrap .widefat td{vertical-align:top;padding:7px}.woocommerce-reports-wide .widefat td .description,.woocommerce-reports-wrap .widefat td .description{margin:4px 0 0}.woocommerce-reports-wide .postbox::after,.woocommerce-reports-wrap .postbox::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce-reports-wide .postbox h3,.woocommerce-reports-wrap .postbox h3{cursor:default!important}.woocommerce-reports-wide .postbox .inside,.woocommerce-reports-wrap .postbox .inside{padding:10px;margin:0!important}.woocommerce-reports-wide .postbox div.stats_range,.woocommerce-reports-wide .postbox h3.stats_range,.woocommerce-reports-wrap .postbox div.stats_range,.woocommerce-reports-wrap .postbox h3.stats_range{border-bottom-color:#dfdfdf;margin:0;padding:0!important}.woocommerce-reports-wide .postbox div.stats_range .export_csv,.woocommerce-reports-wide .postbox h3.stats_range .export_csv,.woocommerce-reports-wrap .postbox div.stats_range .export_csv,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv{float:left;line-height:26px;border-right:1px solid #dfdfdf;padding:10px;display:block;text-decoration:none}.woocommerce-reports-wide .postbox div.stats_range .export_csv::before,.woocommerce-reports-wide .postbox h3.stats_range .export_csv::before,.woocommerce-reports-wrap .postbox div.stats_range .export_csv::before,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;content:"";text-decoration:none;margin-left:4px}.woocommerce-reports-wide .postbox div.stats_range ul,.woocommerce-reports-wide .postbox h3.stats_range ul,.woocommerce-reports-wrap .postbox div.stats_range ul,.woocommerce-reports-wrap .postbox h3.stats_range ul{list-style:none outside;margin:0;padding:0;zoom:1;background:#f5f5f5;border-bottom:1px solid #ccc}.woocommerce-reports-wide .postbox div.stats_range ul::after,.woocommerce-reports-wide .postbox div.stats_range ul::before,.woocommerce-reports-wide .postbox h3.stats_range ul::after,.woocommerce-reports-wide .postbox h3.stats_range ul::before,.woocommerce-reports-wrap .postbox div.stats_range ul::after,.woocommerce-reports-wrap .postbox div.stats_range ul::before,.woocommerce-reports-wrap .postbox h3.stats_range ul::after,.woocommerce-reports-wrap .postbox h3.stats_range ul::before{content:' ';display:table}.woocommerce-reports-wide .postbox div.stats_range ul::after,.woocommerce-reports-wide .postbox h3.stats_range ul::after,.woocommerce-reports-wrap .postbox div.stats_range ul::after,.woocommerce-reports-wrap .postbox h3.stats_range ul::after{clear:both}.woocommerce-reports-wide .postbox div.stats_range ul li,.woocommerce-reports-wide .postbox h3.stats_range ul li,.woocommerce-reports-wrap .postbox div.stats_range ul li,.woocommerce-reports-wrap .postbox h3.stats_range ul li{float:right;margin:0;padding:0;line-height:26px;font-weight:700;font-size:14px}.woocommerce-reports-wide .postbox div.stats_range ul li a,.woocommerce-reports-wide .postbox h3.stats_range ul li a,.woocommerce-reports-wrap .postbox div.stats_range ul li a,.woocommerce-reports-wrap .postbox h3.stats_range ul li a{border-left:1px solid #dfdfdf;padding:10px;display:block;text-decoration:none}.woocommerce-reports-wide .postbox div.stats_range ul li.active,.woocommerce-reports-wide .postbox h3.stats_range ul li.active,.woocommerce-reports-wrap .postbox div.stats_range ul li.active,.woocommerce-reports-wrap .postbox h3.stats_range ul li.active{background:#fff;box-shadow:0 4px 0 0 #fff}.woocommerce-reports-wide .postbox div.stats_range ul li.active a,.woocommerce-reports-wide .postbox h3.stats_range ul li.active a,.woocommerce-reports-wrap .postbox div.stats_range ul li.active a,.woocommerce-reports-wrap .postbox h3.stats_range ul li.active a{color:#777}.woocommerce-reports-wide .postbox div.stats_range ul li.custom,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom{padding:9px 10px;vertical-align:middle}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form{display:inline;margin:0}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form input.range_datepicker{padding:0;margin:0 0 0 10px;background:0 0;border:0;color:#777;text-align:center;box-shadow:none}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form input.range_datepicker.from{margin-left:0}.woocommerce-reports-wide .postbox .chart-with-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar{padding:12px 249px 12px 12px;margin:0!important}.woocommerce-reports-wide .postbox .chart-with-sidebar .chart-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar .chart-sidebar{width:225px;margin-right:-237px;float:right}.woocommerce-reports-wide .postbox .chart-widgets,.woocommerce-reports-wrap .postbox .chart-widgets{margin:0;padding:0}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget{margin:0 0 1em;background:#fafafa;border:1px solid #dfdfdf}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget h4,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget h4{background:#fff;border:1px solid #dfdfdf;border-right-width:0;border-left-width:0;padding:10px;margin:0;color:#2ea2cc;border-top-width:0;background-image:-webkit-linear-gradient(bottom,#ececec,#f9f9f9);background-image:linear-gradient(to top,#ececec,#f9f9f9)}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget h4.section_title:hover,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget h4.section_title:hover{color:#a00}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title{cursor:pointer}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title span,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title span{display:block}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title span::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title span::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none;float:left;font-size:.9em;line-height:1.618}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title.open,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title.open{color:#333}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title.open span::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title.open span::after{display:none}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section{border-bottom:1px solid #dfdfdf}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section .select2-container,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section .select2-container{width:100%!important}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section:last-of-type,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section:last-of-type{border-radius:0 0 3px 3px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table{width:100%}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td{padding:7px 10px;vertical-align:top;border-top:1px solid #e5e5e5;line-height:1.4em}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table tr:first-child td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table tr:first-child td{border-top:0}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.count,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.count{background:#f5f5f5}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.name,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.name{max-width:175px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.name a,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.name a{word-wrap:break-word}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.sparkline,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.sparkline{vertical-align:middle}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table .wc_sparkline,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table .wc_sparkline{width:32px;height:1em;display:block;float:left}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table tr.active td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table tr.active td{background:#f5f5f5}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget form,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget p,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget form,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget p{margin:0;padding:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget form .submit,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget p .submit,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget form .submit,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget p .submit{margin-top:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget #product_ids,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget #product_ids{width:100%}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .select_all,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .select_none,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .select_all,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .select_none{float:left;color:#999;margin-right:4px;margin-top:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .description,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .description{margin-right:.5em;font-weight:400;opacity:.8}.woocommerce-reports-wide .postbox .chart-legend,.woocommerce-reports-wrap .postbox .chart-legend{list-style:none outside;margin:0 0 1em;padding:0;border:1px solid #dfdfdf;border-left-width:0;border-bottom-width:0;background:#fff}.woocommerce-reports-wide .postbox .chart-legend li,.woocommerce-reports-wrap .postbox .chart-legend li{border-left:5px solid #aaa;color:#aaa;padding:1em;display:block;margin:0;-webkit-transition:all ease .5s;transition:all ease .5s;box-shadow:inset 0 -1px 0 0 #dfdfdf}.woocommerce-reports-wide .postbox .chart-legend li strong,.woocommerce-reports-wrap .postbox .chart-legend li strong{font-size:1.618em;line-height:1.2em;color:#464646;font-weight:400;display:block;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif}.woocommerce-reports-wide .postbox .chart-legend li strong del,.woocommerce-reports-wrap .postbox .chart-legend li strong del{color:#e74c3c;font-weight:400}.woocommerce-reports-wide .postbox .chart-legend li:hover,.woocommerce-reports-wrap .postbox .chart-legend li:hover{box-shadow:inset 0 -1px 0 0 #dfdfdf,inset -300px 0 0 rgba(156,93,144,.1);border-left:5px solid #9c5d90!important;padding-right:1.5em;color:#9c5d90}.woocommerce-reports-wide .postbox .pie-chart-legend,.woocommerce-reports-wrap .postbox .pie-chart-legend{margin:12px 0 0;overflow:hidden}.woocommerce-reports-wide .postbox .pie-chart-legend li,.woocommerce-reports-wrap .postbox .pie-chart-legend li{float:right;margin:0;padding:6px 0 0;border-top:4px solid #999;text-align:center;box-sizing:border-box;width:50%}.woocommerce-reports-wide .postbox .stat,.woocommerce-reports-wrap .postbox .stat{font-size:1.5em!important;font-weight:700;text-align:center}.woocommerce-reports-wide .postbox .chart-placeholder,.woocommerce-reports-wrap .postbox .chart-placeholder{width:100%;height:650px;overflow:hidden;position:relative}.woocommerce-reports-wide .postbox .chart-prompt,.woocommerce-reports-wrap .postbox .chart-prompt{line-height:650px;margin:0;color:#999;font-size:1.2em;font-style:italic;text-align:center}.woocommerce-reports-wide .postbox .chart-container,.woocommerce-reports-wrap .postbox .chart-container{background:#fff;padding:12px;position:relative;border:1px solid #dfdfdf;border-radius:3px}.woocommerce-reports-wide .postbox .main .chart-legend,.woocommerce-reports-wrap .postbox .main .chart-legend{margin-top:12px}.woocommerce-reports-wide .postbox .main .chart-legend li,.woocommerce-reports-wrap .postbox .main .chart-legend li{border-left:0;margin:0 0 0 8px;float:right;border-top:4px solid #aaa}.woocommerce-reports-wide .woocommerce-reports-main,.woocommerce-reports-wrap .woocommerce-reports-main{float:right;min-width:100%}.woocommerce-reports-wide .woocommerce-reports-main table td,.woocommerce-reports-wrap .woocommerce-reports-main table td{padding:9px}.woocommerce-reports-wide .woocommerce-reports-sidebar,.woocommerce-reports-wrap .woocommerce-reports-sidebar{display:inline;width:281px;margin-right:-300px;clear:both;float:right}.woocommerce-reports-wide .woocommerce-reports-left,.woocommerce-reports-wrap .woocommerce-reports-left{width:49.5%;float:right}.woocommerce-reports-wide .woocommerce-reports-right,.woocommerce-reports-wrap .woocommerce-reports-right{width:49.5%;float:left}.woocommerce-wide-reports-wrap{padding-bottom:11px}.woocommerce-wide-reports-wrap .widefat .export-data{float:left}.woocommerce-wide-reports-wrap .widefat td,.woocommerce-wide-reports-wrap .widefat th{vertical-align:middle;padding:7px}form.report_filters p{vertical-align:middle}form.report_filters div,form.report_filters input,form.report_filters label{vertical-align:middle}.chart-tooltip{position:absolute;display:none;line-height:1}table.bar_chart{width:100%}table.bar_chart thead th{text-align:right;color:#ccc;padding:6px 0}table.bar_chart tbody th{padding:6px 0;width:25%;text-align:right!important;font-weight:400!important;border-bottom:1px solid #fee}table.bar_chart tbody td{text-align:left;line-height:24px;padding:6px 0 6px 6px;border-bottom:1px solid #fee}table.bar_chart tbody td span{color:#8a4b75;display:block}table.bar_chart tbody td span.alt{color:#47a03e;margin-top:6px}table.bar_chart tbody td.bars{position:relative;text-align:right;padding:6px 0 6px 6px;border-bottom:1px solid #fee}table.bar_chart tbody td.bars a,table.bar_chart tbody td.bars span{text-decoration:none;clear:both;background:#8a4b75;float:right;display:block;line-height:24px;height:24px;border-radius:3px}table.bar_chart tbody td.bars span.alt{clear:both;background:#47a03e}table.bar_chart tbody td.bars span.alt span{margin:0;color:#c5dec2!important;text-shadow:0 1px 0 #47a03e;background:0 0}.post-type-shop_order .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}.post-type-shop_coupon .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}.post-type-product .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState--api .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState--webhooks .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState{text-align:center;padding:5em 0 0}.woocommerce-BlankState .woocommerce-BlankState-message{color:#aaa;margin:0 auto 1.5em;line-height:1.5em;font-size:1.2em;max-width:500px}.woocommerce-BlankState .woocommerce-BlankState-message::before{color:#ddd;text-shadow:0 -1px 1px rgba(0,0,0,.2),0 1px 0 rgba(255,255,255,.8);font-size:8em;display:block;position:relative!important;top:auto;right:auto;line-height:1em;margin:0 0 .1875em}.woocommerce-BlankState .woocommerce-BlankState-cta{font-size:1.2em;padding:.75em 1.5em;margin:0 .25em;height:auto;display:inline-block!important}@media only screen and (max-width:1280px){#order_data .order_data_column{width:48%}#order_data .order_data_column:first-child{width:100%}.woocommerce_options_panel .description{display:block;clear:both;margin-right:0}.woocommerce_options_panel .dimensions_field .wrap,.woocommerce_options_panel .short,.woocommerce_options_panel input[type=email].short,.woocommerce_options_panel input[type=number].short,.woocommerce_options_panel input[type=password].short,.woocommerce_options_panel input[type=text].short{width:80%}.woocommerce_options_panel .downloadable_files,.woocommerce_variations .downloadable_files{padding:0;clear:both}.woocommerce_options_panel .downloadable_files label,.woocommerce_variations .downloadable_files label{position:static}.woocommerce_options_panel .downloadable_files table,.woocommerce_variations .downloadable_files table{margin:0 12px 24px;width:94%}.woocommerce_options_panel .downloadable_files table .sort,.woocommerce_variations .downloadable_files table .sort{visibility:hidden}.woocommerce_options_panel .woocommerce_variable_attributes .downloadable_files table,.woocommerce_variations .woocommerce_variable_attributes .downloadable_files table{margin:0 0 1em;width:100%}}@media only screen and (max-width:900px){#woocommerce-coupon-data ul.coupon_data_tabs,#woocommerce-product-data .wc-tabs-back,#woocommerce-product-data ul.product_data_tabs{width:10%}#woocommerce-coupon-data .wc-metaboxes-wrapper,#woocommerce-coupon-data .woocommerce_options_panel,#woocommerce-product-data .wc-metaboxes-wrapper,#woocommerce-product-data .woocommerce_options_panel{width:90%}#woocommerce-coupon-data ul.coupon_data_tabs li a,#woocommerce-product-data ul.product_data_tabs li a{position:relative;text-indent:-999px;padding:10px}#woocommerce-coupon-data ul.coupon_data_tabs li a::before,#woocommerce-product-data ul.product_data_tabs li a::before{position:absolute;top:0;left:0;bottom:0;right:0;text-indent:0;text-align:center;line-height:40px;width:100%;height:40px}}@media only screen and (max-width:782px){#wp-excerpt-media-buttons a{font-size:16px;line-height:37px;height:39px;padding:0 15px 0 20px}#wp-excerpt-editor-tools{padding-top:20px;padding-left:15px;overflow:hidden;margin-bottom:-1px}#woocommerce-product-data .checkbox{width:25px}.variations-pagenav{float:none;text-align:center;font-size:18px}.variations-pagenav .displaying-num{font-size:16px}.variations-pagenav a{padding:8px 20px 11px;font-size:18px}.variations-pagenav select{padding:0 20px}.variations-defaults{float:none;text-align:center;margin-top:10px}.post-type-product .wp-list-table .column-thumb{display:none;text-align:right;padding-bottom:0}.post-type-product .wp-list-table .column-thumb::before{display:none!important}.post-type-product .wp-list-table .column-thumb img{max-width:32px}.post-type-product .wp-list-table .is-expanded td:not(.hidden){overflow:visible}.post-type-product .wp-list-table .toggle-row{top:-28px}.post-type-shop_order .wp-list-table .column-customer_message,.post-type-shop_order .wp-list-table .column-order_notes{text-align:inherit}.post-type-shop_order .wp-list-table .column-order_notes .note-on{font-size:1.3em;margin:0}.post-type-shop_order .wp-list-table .is-expanded td:not(.hidden){overflow:visible}.post-type-shop_order .wp-list-table .toggle-row{top:-15px}}@media only screen and (max-width:500px){.woocommerce_options_panel label,.woocommerce_options_panel legend{float:none;width:auto;display:block;margin:0}.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p.form-field{padding:5px 20px!important}.addons-wcs-banner-block{-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}.wc_addons_wrap .addons-wcs-banner-block{padding:40px}.wc_addons_wrap .addons-wcs-banner-block-image{padding:1em;text-align:center;width:100%;padding:2em 0;margin:0}.wc_addons_wrap .addons-wcs-banner-block-image .addons-img{margin:0}}.wc-backbone-modal *{box-sizing:border-box}.wc-backbone-modal .wc-backbone-modal-content{position:fixed;background:#fff;z-index:100000;right:50%;top:50%;-webkit-transform:translate(50%,-50%);-ms-transform:translate(50%,-50%);transform:translate(50%,-50%);max-width:100%;min-width:500px}.wc-backbone-modal .wc-backbone-modal-content article{overflow:auto}.wc-backbone-modal.wc-backbone-modal-shipping-method-settings .wc-backbone-modal-content{width:75%;min-width:500px}.wc-backbone-modal .select2-container{width:100%!important}@media screen and (max-width:782px){.wc-backbone-modal .wc-backbone-modal-content{width:100%;height:100%;min-width:100%}}.wc-backbone-modal-backdrop{position:fixed;top:0;right:0;left:0;bottom:0;min-height:360px;background:#000;opacity:.7;z-index:99900}.wc-backbone-modal-main{padding-bottom:55px}.wc-backbone-modal-main article,.wc-backbone-modal-main header{display:block;position:relative}.wc-backbone-modal-main .wc-backbone-modal-header{height:auto;background:#fcfcfc;padding:1em 1.5em;border-bottom:1px solid #ddd}.wc-backbone-modal-main .wc-backbone-modal-header h1{margin:0;font-size:18px;font-weight:700;line-height:1.5em}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link{cursor:pointer;color:#777;height:54px;width:54px;padding:0;position:absolute;top:0;left:0;text-align:center;border:0;border-right:1px solid #ddd;background-color:transparent;-webkit-transition:color .1s ease-in-out,background .1s ease-in-out;transition:color .1s ease-in-out,background .1s ease-in-out}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link::before{font:normal 22px/50px dashicons!important;color:#666;display:block;content:'\f335';font-weight:300}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:focus,.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:hover{background:#ddd;border-color:#ccc;color:#000}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:focus{outline:0}.wc-backbone-modal-main article{padding:1.5em}.wc-backbone-modal-main article p{margin:1.5em 0}.wc-backbone-modal-main article p:first-child{margin-top:0}.wc-backbone-modal-main article p:last-child{margin-bottom:0}.wc-backbone-modal-main article .pagination{padding:10px 0 0;text-align:center}.wc-backbone-modal-main article table.widefat{margin:0;width:100%;border:0;box-shadow:none}.wc-backbone-modal-main article table.widefat thead th{padding:0 1em 1em 1em;text-align:right}.wc-backbone-modal-main article table.widefat thead th:first-child{padding-right:0}.wc-backbone-modal-main article table.widefat thead th:last-child{padding-left:0;text-align:left}.wc-backbone-modal-main article table.widefat tbody td,.wc-backbone-modal-main article table.widefat tbody th{padding:1em;text-align:right;vertical-align:middle}.wc-backbone-modal-main article table.widefat tbody td:first-child,.wc-backbone-modal-main article table.widefat tbody th:first-child{padding-right:0}.wc-backbone-modal-main article table.widefat tbody td:last-child,.wc-backbone-modal-main article table.widefat tbody th:last-child{padding-left:0;text-align:left}.wc-backbone-modal-main article table.widefat tbody td .select2-container,.wc-backbone-modal-main article table.widefat tbody td select,.wc-backbone-modal-main article table.widefat tbody th .select2-container,.wc-backbone-modal-main article table.widefat tbody th select{width:100%}.wc-backbone-modal-main footer{position:absolute;right:0;left:0;bottom:0;z-index:100;padding:1em 1.5em;background:#fcfcfc;border-top:1px solid #dfdfdf;box-shadow:0 -4px 4px -4px rgba(0,0,0,.1)}.wc-backbone-modal-main footer .inner{text-align:left;line-height:23px}.wc-backbone-modal-main footer .inner .button{margin-bottom:0}.select2-drop,.select2-dropdown{z-index:999999!important}.select2-results{line-height:1.5em}.select2-results .select2-results__group,.select2-results .select2-results__option{margin:0;padding:8px}.select2-results .description{display:block;color:#999;padding-top:4px}.select2-dropdown{border-color:#ddd}.select2-dropdown--below{box-shadow:0 1px 1px rgba(0,0,0,.1)}.select2-dropdown--above{box-shadow:0 -1px 1px rgba(0,0,0,.1)}.select2-container .select2-selection__rendered.ui-sortable li{cursor:move}.select2-container .select2-selection{border-color:#ddd}.select2-container .select2-search__field{min-width:150px}.select2-container .select2-selection--single{height:32px}.select2-container .select2-selection--single .select2-selection__rendered{line-height:32px;padding-left:24px}.select2-container .select2-selection--single .select2-selection__arrow{left:3px;height:30px}.select2-container .select2-selection--multiple{min-height:28px;border-radius:0;line-height:1.5}.select2-container .select2-selection--multiple li{margin:0}.select2-container .select2-selection--multiple .select2-selection__choice{padding:2px 6px}.select2-container .select2-selection--multiple .select2-selection__choice .description{display:none}.select2-container .select2-selection__clear{color:#999;margin-top:-1px}.select2-container .select2-search--inline .select2-search__field{font-family:inherit;font-size:inherit;font-weight:inherit;padding:3px 0}.woocommerce table.form-table .select2-container{min-width:400px!important}.post-type-product .tablenav .actions,.post-type-shop_order .tablenav .actions{overflow:visible}.post-type-product .tablenav input,.post-type-product .tablenav select,.post-type-shop_order .tablenav input,.post-type-shop_order .tablenav select{line-height:1;height:32px}.post-type-product .tablenav .select2-container,.post-type-shop_order .tablenav .select2-container{float:right;width:240px!important;font-size:14px;vertical-align:middle;margin:1px 1px 4px 6px}.woocommerce-exporter-wrapper,.woocommerce-importer-wrapper,.woocommerce-progress-form-wrapper{text-align:center;max-width:700px;margin:40px auto}.woocommerce-exporter-wrapper .error,.woocommerce-importer-wrapper .error,.woocommerce-progress-form-wrapper .error{text-align:right}.woocommerce-exporter-wrapper .wc-progress-steps,.woocommerce-importer-wrapper .wc-progress-steps,.woocommerce-progress-form-wrapper .wc-progress-steps{padding:0 0 24px;margin:0;list-style:none outside;overflow:hidden;color:#ccc;width:100%;display:-webkit-inline-box;display:inline-flex}.woocommerce-exporter-wrapper .wc-progress-steps li,.woocommerce-importer-wrapper .wc-progress-steps li,.woocommerce-progress-form-wrapper .wc-progress-steps li{width:25%;float:right;padding:0 0 .8em;margin:0;text-align:center;position:relative;border-bottom:4px solid #ccc;line-height:1.4em}.woocommerce-exporter-wrapper .wc-progress-steps li::before,.woocommerce-importer-wrapper .wc-progress-steps li::before,.woocommerce-progress-form-wrapper .wc-progress-steps li::before{content:'';border:4px solid #ccc;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;right:50%;margin-right:-6px;margin-bottom:-8px;background:#fff}.woocommerce-exporter-wrapper .wc-progress-steps li.active,.woocommerce-importer-wrapper .wc-progress-steps li.active,.woocommerce-progress-form-wrapper .wc-progress-steps li.active{border-color:#a16696;color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.active::before,.woocommerce-importer-wrapper .wc-progress-steps li.active::before,.woocommerce-progress-form-wrapper .wc-progress-steps li.active::before{border-color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.done,.woocommerce-importer-wrapper .wc-progress-steps li.done,.woocommerce-progress-form-wrapper .wc-progress-steps li.done{border-color:#a16696;color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.done::before,.woocommerce-importer-wrapper .wc-progress-steps li.done::before,.woocommerce-progress-form-wrapper .wc-progress-steps li.done::before{border-color:#a16696;background:#a16696}.woocommerce-exporter-wrapper .button,.woocommerce-importer-wrapper .button,.woocommerce-progress-form-wrapper .button{font-size:1.25em;padding:.5em 1em!important;line-height:1.5em!important;margin-left:.5em;margin-bottom:2px;height:auto!important;border-radius:4px;background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,-1px 0 1px #a36597,0 1px 1px #a36597,1px 0 1px #a36597;margin:0;opacity:1}.woocommerce-exporter-wrapper .button:active,.woocommerce-exporter-wrapper .button:focus,.woocommerce-exporter-wrapper .button:hover,.woocommerce-importer-wrapper .button:active,.woocommerce-importer-wrapper .button:focus,.woocommerce-importer-wrapper .button:hover,.woocommerce-progress-form-wrapper .button:active,.woocommerce-progress-form-wrapper .button:focus,.woocommerce-progress-form-wrapper .button:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-exporter-wrapper .error .button,.woocommerce-importer-wrapper .error .button,.woocommerce-progress-form-wrapper .error .button{font-size:1em}.woocommerce-exporter-wrapper .wc-actions,.woocommerce-importer-wrapper .wc-actions,.woocommerce-progress-form-wrapper .wc-actions{overflow:hidden;border-top:1px solid #eee;margin:0;padding:23px 24px 24px;line-height:3em}.woocommerce-exporter-wrapper .wc-actions .button,.woocommerce-importer-wrapper .wc-actions .button,.woocommerce-progress-form-wrapper .wc-actions .button{float:left}.woocommerce-exporter-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options,.woocommerce-importer-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options,.woocommerce-progress-form-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options{color:#999}.woocommerce-exporter-wrapper .wc-progress-form-content,.woocommerce-exporter-wrapper .woocommerce-exporter,.woocommerce-exporter-wrapper .woocommerce-importer,.woocommerce-importer-wrapper .wc-progress-form-content,.woocommerce-importer-wrapper .woocommerce-exporter,.woocommerce-importer-wrapper .woocommerce-importer,.woocommerce-progress-form-wrapper .wc-progress-form-content,.woocommerce-progress-form-wrapper .woocommerce-exporter,.woocommerce-progress-form-wrapper .woocommerce-importer{background:#fff;overflow:hidden;padding:0;margin:0 0 16px;box-shadow:0 1px 3px rgba(0,0,0,.13);color:#555;text-align:right}.woocommerce-exporter-wrapper .wc-progress-form-content header,.woocommerce-exporter-wrapper .woocommerce-exporter header,.woocommerce-exporter-wrapper .woocommerce-importer header,.woocommerce-importer-wrapper .wc-progress-form-content header,.woocommerce-importer-wrapper .woocommerce-exporter header,.woocommerce-importer-wrapper .woocommerce-importer header,.woocommerce-progress-form-wrapper .wc-progress-form-content header,.woocommerce-progress-form-wrapper .woocommerce-exporter header,.woocommerce-progress-form-wrapper .woocommerce-importer header{border-bottom:1px solid #eee;margin:0;padding:24px 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content section,.woocommerce-exporter-wrapper .woocommerce-exporter section,.woocommerce-exporter-wrapper .woocommerce-importer section,.woocommerce-importer-wrapper .wc-progress-form-content section,.woocommerce-importer-wrapper .woocommerce-exporter section,.woocommerce-importer-wrapper .woocommerce-importer section,.woocommerce-progress-form-wrapper .wc-progress-form-content section,.woocommerce-progress-form-wrapper .woocommerce-exporter section,.woocommerce-progress-form-wrapper .woocommerce-importer section{padding:24px 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content h2,.woocommerce-exporter-wrapper .woocommerce-exporter h2,.woocommerce-exporter-wrapper .woocommerce-importer h2,.woocommerce-importer-wrapper .wc-progress-form-content h2,.woocommerce-importer-wrapper .woocommerce-exporter h2,.woocommerce-importer-wrapper .woocommerce-importer h2,.woocommerce-progress-form-wrapper .wc-progress-form-content h2,.woocommerce-progress-form-wrapper .woocommerce-exporter h2,.woocommerce-progress-form-wrapper .woocommerce-importer h2{margin:0 0 24px;color:#555;font-size:24px;font-weight:400;line-height:1em}.woocommerce-exporter-wrapper .wc-progress-form-content p,.woocommerce-exporter-wrapper .woocommerce-exporter p,.woocommerce-exporter-wrapper .woocommerce-importer p,.woocommerce-importer-wrapper .wc-progress-form-content p,.woocommerce-importer-wrapper .woocommerce-exporter p,.woocommerce-importer-wrapper .woocommerce-importer p,.woocommerce-progress-form-wrapper .wc-progress-form-content p,.woocommerce-progress-form-wrapper .woocommerce-exporter p,.woocommerce-progress-form-wrapper .woocommerce-importer p{font-size:1em;line-height:1.75em;font-size:16px;color:#555;margin:0 0 24px}.woocommerce-exporter-wrapper .wc-progress-form-content .form-row,.woocommerce-exporter-wrapper .woocommerce-exporter .form-row,.woocommerce-exporter-wrapper .woocommerce-importer .form-row,.woocommerce-importer-wrapper .wc-progress-form-content .form-row,.woocommerce-importer-wrapper .woocommerce-exporter .form-row,.woocommerce-importer-wrapper .woocommerce-importer .form-row,.woocommerce-progress-form-wrapper .wc-progress-form-content .form-row,.woocommerce-progress-form-wrapper .woocommerce-exporter .form-row,.woocommerce-progress-form-wrapper .woocommerce-importer .form-row{margin-top:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter .spinner,.woocommerce-exporter-wrapper .woocommerce-importer .spinner,.woocommerce-importer-wrapper .wc-progress-form-content .spinner,.woocommerce-importer-wrapper .woocommerce-exporter .spinner,.woocommerce-importer-wrapper .woocommerce-importer .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer .spinner{display:none}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th{vertical-align:top;line-height:1.75em;padding:0 0 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th label{color:#555;font-weight:400}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox]{margin:0 0 0 4px;padding:7px}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text]{padding:7px;height:auto;margin:0}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper{border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);background-color:#fff;color:#32373c;outline:0;line-height:1;display:block}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code{background:0 0;font-size:smaller;padding:0;margin:0;color:#999;padding:7px 7px 0 0;display:inline-block}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input{font-family:Consolas,Monaco,monospace;border:0;margin:0;outline:0;box-shadow:none;display:inline-block;min-width:100%}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th{width:35%;padding-left:20px}.woocommerce-exporter-wrapper .wc-progress-form-content progress,.woocommerce-exporter-wrapper .woocommerce-exporter progress,.woocommerce-exporter-wrapper .woocommerce-importer progress,.woocommerce-importer-wrapper .wc-progress-form-content progress,.woocommerce-importer-wrapper .woocommerce-exporter progress,.woocommerce-importer-wrapper .woocommerce-importer progress,.woocommerce-progress-form-wrapper .wc-progress-form-content progress,.woocommerce-progress-form-wrapper .woocommerce-exporter progress,.woocommerce-progress-form-wrapper .woocommerce-importer progress{width:100%;height:42px;margin:0 auto 24px;display:block;-webkit-appearance:none;border:none;display:none;background:#f5f5f5;border:2px solid #eee;border-radius:4px;padding:0;box-shadow:0 1px 0 0 rgba(255,255,255,.2)}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-exporter-wrapper .woocommerce-importer progress::-webkit-progress-bar,.woocommerce-importer-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-importer-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-importer-wrapper .woocommerce-importer progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-webkit-progress-bar{background:transparent none;border:0;border-radius:4px;padding:0;box-shadow:none}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-exporter-wrapper .woocommerce-importer progress::-webkit-progress-value,.woocommerce-importer-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-importer-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-importer-wrapper .woocommerce-importer progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-webkit-progress-value{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:-webkit-linear-gradient(top,#a46497,#66405f),#a46497;background:linear-gradient(top,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-exporter-wrapper .woocommerce-importer progress::-moz-progress-bar,.woocommerce-importer-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-importer-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-importer-wrapper .woocommerce-importer progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-moz-progress-bar{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:linear-gradient(top,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-exporter-wrapper .woocommerce-importer progress::-ms-fill,.woocommerce-importer-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-importer-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-importer-wrapper .woocommerce-importer progress::-ms-fill,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-ms-fill{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:linear-gradient(to bottom,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner{display:block}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing progress{display:block}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options{display:none}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper{padding:0}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table{margin:0;border:0;box-shadow:none;width:100%;table-layout:fixed}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th{border:0;padding:12px;vertical-align:middle;word-wrap:break-word}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th select{width:100%}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th{background:#fbfbfb}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th{font-weight:700}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child{padding-right:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child{padding-left:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name{width:50%}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description{color:#999;margin-top:4px;display:block}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code{background:0 0;padding:0;white-space:pre-line;word-wrap:break-word;word-break:break-all}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-done,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-done,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-done{text-align:center;padding:48px 24px;font-size:1.5em;line-height:1.75em}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-done::before,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-done::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#a16696;position:static;font-size:100px;display:block;float:none;margin:0 0 24px}.wc-pointer .wc-pointer-buttons .close{float:right;margin:6px 15px 0 0}
\ No newline at end of file
+@charset "UTF-8";@-webkit-keyframes spin{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@keyframes spin{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;right:50%;margin-right:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.wc_addons_wrap{max-width:1200px}.wc_addons_wrap h1.search-form-title{clear:right;padding:0}.wc_addons_wrap form.search-form{clear:both;display:block;position:relative;margin-top:1em;margin-bottom:1em}.wc_addons_wrap form.search-form input{border:1px solid #ddd;box-shadow:none;height:53px;padding-right:50px;width:100%;margin:0}.wc_addons_wrap form.search-form button{background:0 0;border:none;cursor:pointer;height:53px;position:absolute;width:53px}.wc_addons_wrap .update-plugins .update-count{background-color:#d54e21;border-radius:10px;color:#fff;display:inline-block;font-size:9px;font-weight:600;line-height:17px;margin:1px 2px 0 0;padding:0 6px;vertical-align:text-top}.wc_addons_wrap .addons-featured{margin:0}.wc_addons_wrap ul.subsubsub.subsubsub{margin:-2px 0 12px}.wc_addons_wrap .subsubsub li::after{content:'|'}.wc_addons_wrap .subsubsub li:last-child::after{content:''}.wc_addons_wrap .addons-banner-block-item-icon,.wc_addons_wrap .addons-column-block-item-icon{-webkit-box-align:center;align-items:center;display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center}.wc_addons_wrap .addons-banner-block,.wc_addons_wrap .addons-wcs-banner-block{background:#fff;border:1px solid #ddd;margin:0 0 1em 0;padding:2em 2em 1em}.wc_addons_wrap .addons-banner-block img{height:62px}.wc_addons_wrap .addons-banner-block p{margin:0 0 20px}.wc_addons_wrap .addons-banner-block-items{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;flex-wrap:wrap;justify-content:space-around;margin:0 -10px 0 -10px}.wc_addons_wrap .addons-banner-block-item{border:1px solid #e6e6e6;border-radius:3px;-webkit-box-flex:1;flex:1;margin:1em;min-width:200px;width:30%}.wc_addons_wrap .addons-banner-block-item-icon{background:#f7f7f7;height:143px}.wc_addons_wrap .addons-banner-block-item-content{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;height:184px;-webkit-box-pack:justify;justify-content:space-between;padding:24px}.wc_addons_wrap .addons-banner-block-item-content h3{margin-top:0}.wc_addons_wrap .addons-banner-block-item-content p{margin:0 0 auto}.wc_addons_wrap .addons-wcs-banner-block{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center}.wc_addons_wrap .addons-wcs-banner-block-image{background:#f7f7f7;border:1px solid #e6e6e6;margin-left:2em;padding:4em}.wc_addons_wrap .addons-wcs-banner-block-image .addons-img{max-height:86px;max-width:97px}.wc_addons_wrap .addons-shipping-methods .addons-wcs-banner-block{margin-right:0;margin-left:0;margin-top:1em}.wc_addons_wrap .addons-wcs-banner-block-content{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;justify-content:space-around;align-self:stretch;padding:1em 0}.wc_addons_wrap .addons-wcs-banner-block-content h1{padding-bottom:0}.wc_addons_wrap .addons-wcs-banner-block-content p{margin-bottom:0}.wc_addons_wrap .addons-wcs-banner-block-content .wcs-service-logo{max-width:40px}.wc_addons_wrap .addons-column-section{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;flex-wrap:wrap;justify-content:space-around}.wc_addons_wrap .addons-column{-webkit-box-flex:1;flex:1;width:50%;padding:0 .5em}.wc_addons_wrap .addons-column:nth-child(2){margin-left:0}.wc_addons_wrap .addons-column-block,.wc_addons_wrap .addons-small-dark-block,.wc_addons_wrap .addons-small-light-block{box-sizing:border-box;border:1px solid #ddd;margin:0 0 1em;padding:20px}.wc_addons_wrap .addons-column-block img{max-height:50px;max-width:50px}.wc_addons_wrap .addons-column-block,.wc_addons_wrap .addons-small-light-block{background:#fff}.wc_addons_wrap .addons-column-block-left{float:right}.wc_addons_wrap .addons-column-block-right{float:left}.wc_addons_wrap .addons-column-block-item{border-top:2px solid #f9f9f9;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;flex-wrap:wrap;-webkit-box-pack:justify;justify-content:space-between;margin:0 -20px;padding:20px}.wc_addons_wrap .addons-column-block-item-icon{background:#f7f7f7;border:1px solid #e6e6e6;height:100px;margin:0 0 10px 10px;width:100px}.wc_addons_wrap .addons-column-block-item-content{display:-webkit-box;display:flex;-webkit-box-flex:1;flex:1;flex-wrap:wrap;height:20%;-webkit-box-pack:justify;justify-content:space-between;min-width:200px}.wc_addons_wrap .addons-column-block-item-content h2{float:right;margin-top:8px}.wc_addons_wrap .addons-column-block-item-content a{float:left}.wc_addons_wrap .addons-column-block-item-content p{float:right}.wc_addons_wrap .addons-banner-block-item,.wc_addons_wrap .addons-column-block-item{display:none}.wc_addons_wrap .addons-banner-block-item:nth-child(-n+3){display:block}.wc_addons_wrap .addons-column-block-item:nth-of-type(-n+3){display:-webkit-box;display:flex}.wc_addons_wrap .addons-small-dark-block{background-color:#54687d;text-align:center}.wc_addons_wrap .addons-small-dark-items{display:-webkit-box;display:flex;flex-wrap:wrap;justify-content:space-around}.wc_addons_wrap .addons-small-dark-item{margin:0 0 20px}.wc_addons_wrap .addons-small-dark-block h1{color:#fff}.wc_addons_wrap .addons-small-dark-block p{color:#fafafa}.wc_addons_wrap .addons-small-dark-item-icon img{height:30px}.wc_addons_wrap .addons-small-dark-item a{margin:28px auto 0}.wc_addons_wrap .addons-small-light-block{display:-webkit-box;display:flex;flex-wrap:wrap}.wc_addons_wrap .addons-small-light-block h1{margin-top:-12px}.wc_addons_wrap .addons-small-light-block p{margin-top:0}.wc_addons_wrap .addons-small-light-block img{height:225px;margin:0 -20px 0 0}.wc_addons_wrap .addons-small-light-block-content{display:-webkit-box;display:flex;-webkit-box-flex:1;flex:1 1 100px;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;justify-content:space-around}.wc_addons_wrap .addons-small-light-block-buttons{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between}.wc_addons_wrap .addons-small-light-block-content a{width:48%}.wc_addons_wrap .addons-button{border-radius:3px;cursor:pointer;display:block;height:37px;line-height:37px;text-align:center;text-decoration:none;width:124px}.wc_addons_wrap .addons-button-solid{background-color:#955a89;color:#fff}.wc_addons_wrap .addons-button-solid:hover{color:#fff;opacity:.8}.wc_addons_wrap .addons-button-outline-green{border:1px solid #73ae39;color:#73ae39}.wc_addons_wrap .addons-button-outline-green:hover{color:#73ae39;opacity:.8}.wc_addons_wrap .addons-button-outline-white{border:1px solid #fff;color:#fff}.wc_addons_wrap .addons-button-outline-white:hover{color:#fff;opacity:.8}.wc_addons_wrap .addons-button-installed{background:#e6e6e6;color:#3c3c3c}.wc_addons_wrap .addons-button-installed:hover{color:#3c3c3c;opacity:.8}@media only screen and (max-width:400px){.wc_addons_wrap .addons-featured{margin:-1% -5%}.wc_addons_wrap .addons-button{width:100%}.wc_addons_wrap .addons-small-dark-item{width:100%}.wc_addons_wrap .addons-column-block-item-icon{background:0 0;border:none;height:75px;margin:0 0 10px 10px;width:75px}}.wc_addons_wrap .products{overflow:hidden;display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row;flex-wrap:wrap;margin:0 -.5em}.wc_addons_wrap .products li{float:right;border:1px solid #ddd;margin:0 .5em 1em!important;padding:0;vertical-align:top;width:25%;min-width:280px;min-height:220px;-webkit-box-flex:1;flex:1;overflow:hidden;background:#f5f5f5;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),inset 0 -1px 0 rgba(0,0,0,.1)}.wc_addons_wrap .products li a{text-decoration:none;color:inherit;display:block;height:100%}.wc_addons_wrap .products li a .product-img-wrap{background:#fff;display:block}.wc_addons_wrap .products li a img{max-width:258px;max-height:24px;padding:17px 20px;display:block;margin:0;background:#fff;border-left:260px solid #fff}.wc_addons_wrap .products li a img.extension-thumb+h3{display:none}.wc_addons_wrap .products li a .price{display:none}.wc_addons_wrap .products li a h2,.wc_addons_wrap .products li a h3{margin:0!important;padding:20px!important;background:#fff}.wc_addons_wrap .products li a p{padding:20px!important;margin:0!important;border-top:1px solid #f1f1f1}.wc_addons_wrap .products li a:focus,.wc_addons_wrap .products li a:hover{background-color:#fff}.wc_addons_wrap .storefront{background:url(../images/storefront-bg.jpg) bottom right #f6f6f6;border:1px solid #ddd;margin-top:1em;padding:20px;overflow:hidden;zoom:1}.wc_addons_wrap .storefront img{width:278px;height:auto;float:right;margin:0 0 0 20px;box-shadow:0 1px 6px rgba(0,0,0,.1)}.wc_addons_wrap .storefront p{max-width:750px}.woocommerce-BlankState a.button-primary,.woocommerce-BlankState button.button-primary,.woocommerce-message a.button-primary,.woocommerce-message button.button-primary{background:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;color:#fff;text-shadow:0 -1px 1px #a36597,-1px 0 1px #a36597,0 1px 1px #a36597,1px 0 1px #a36597;display:inline-block}.woocommerce-BlankState a.button-primary:active,.woocommerce-BlankState a.button-primary:focus,.woocommerce-BlankState a.button-primary:hover,.woocommerce-BlankState button.button-primary:active,.woocommerce-BlankState button.button-primary:focus,.woocommerce-BlankState button.button-primary:hover,.woocommerce-message a.button-primary:active,.woocommerce-message a.button-primary:focus,.woocommerce-message a.button-primary:hover,.woocommerce-message button.button-primary:active,.woocommerce-message button.button-primary:focus,.woocommerce-message button.button-primary:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-message{position:relative;border-right-color:#cc99c2!important;overflow:hidden}.woocommerce-message a.docs,.woocommerce-message a.skip{text-decoration:none!important}.woocommerce-message a.woocommerce-message-close{position:static;float:left;padding:0 28px 10px 15px;margin-top:-10px;font-size:13px;line-height:1.23076923;text-decoration:none}.woocommerce-message a.woocommerce-message-close::before{position:relative;top:18px;right:-20px;-webkit-transition:all .1s ease-in-out;transition:all .1s ease-in-out}.woocommerce-message .twitter-share-button{margin-top:-3px;margin-right:3px;vertical-align:middle}#variable_product_options #message,#variable_product_options .notice{margin:10px}.clear{clear:both}.wrap.woocommerce div.error,.wrap.woocommerce div.updated{margin-top:10px}mark.amount{background:transparent none;color:inherit}.simplify-commerce-banner{overflow:hidden}.simplify-commerce-banner img{float:left;padding:15px 0;margin-right:1em;width:200px}.woocommerce-help-tip{color:#666;display:inline-block;font-size:1.1em;font-style:normal;height:16px;line-height:16px;position:relative;vertical-align:middle;width:16px}.woocommerce-help-tip::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";cursor:help}h2 .woocommerce-help-tip{margin-top:-5px;margin-right:.25em}table.wc_status_table{margin-bottom:1em}table.wc_status_table h2{font-size:14px;margin:0}table.wc_status_table tr:nth-child(2n) td,table.wc_status_table tr:nth-child(2n) th{background:#fcfcfc}table.wc_status_table th{font-weight:700;padding:9px}table.wc_status_table td:first-child{width:33%}table.wc_status_table td.help{width:1em}table.wc_status_table td,table.wc_status_table th{font-size:1.1em;font-weight:400}table.wc_status_table td.run-tool,table.wc_status_table th.run-tool{text-align:left}table.wc_status_table td strong.name,table.wc_status_table th strong.name{display:block;margin-bottom:.5em}table.wc_status_table td mark,table.wc_status_table th mark{background:transparent none}table.wc_status_table td mark.yes,table.wc_status_table th mark.yes{color:#7ad03a}table.wc_status_table td mark.no,table.wc_status_table th mark.no{color:#999}table.wc_status_table td .red,table.wc_status_table td mark.error,table.wc_status_table th .red,table.wc_status_table th mark.error{color:#a00}table.wc_status_table td ul,table.wc_status_table th ul{margin:0}table.wc_status_table .help_tip{cursor:help}table.wc_status_table--tools td,table.wc_status_table--tools th{padding:2em}.taxonomy-product_cat .check-column .woocommerce-help-tip{font-size:1.5em;margin:-3px 5px 0 0;display:block;position:absolute}#debug-report{display:none;margin:10px 0;padding:0;position:relative}#debug-report textarea{font-family:monospace;width:100%;margin:0;height:300px;padding:20px;border-radius:0;resize:none;font-size:12px;line-height:20px;outline:0}.wp-list-table.logs .log-level{display:inline;padding:.2em .6em .3em;font-size:80%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.2em}.wp-list-table.logs .log-level:empty{display:none}.wp-list-table.logs .log-level--alert,.wp-list-table.logs .log-level--emergency{background-color:#ff4136}.wp-list-table.logs .log-level--critical,.wp-list-table.logs .log-level--error{background-color:#ff851b}.wp-list-table.logs .log-level--notice,.wp-list-table.logs .log-level--warning{color:#222;background-color:#ffdc00}.wp-list-table.logs .log-level--info{background-color:#0074d9}.wp-list-table.logs .log-level--debug{background-color:#3d9970}@media screen and (min-width:783px){.wp-list-table.logs .column-timestamp{width:18%}.wp-list-table.logs .column-level{width:14%}.wp-list-table.logs .column-source{width:15%}}#log-viewer-select{padding:10px 0 8px;line-height:28px}#log-viewer-select h2 a{vertical-align:middle}#log-viewer{background:#fff;border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.04);padding:5px 20px}#log-viewer pre{font-family:monospace;white-space:pre-wrap;word-wrap:break-word}.inline-edit-product.quick-edit-row .inline-edit-col-center,.inline-edit-product.quick-edit-row .inline-edit-col-right{float:left!important}#woocommerce-fields.inline-edit-col{clear:right}#woocommerce-fields.inline-edit-col label.featured,#woocommerce-fields.inline-edit-col label.manage_stock{margin-right:10px}#woocommerce-fields.inline-edit-col label.stock_status_field{clear:both;float:right}#woocommerce-fields.inline-edit-col .dimensions div{display:block;margin:.2em 0}#woocommerce-fields.inline-edit-col .dimensions div span.title{display:block;float:right;width:5em}#woocommerce-fields.inline-edit-col .dimensions div span.input-text-wrap{display:block;margin-right:5em}#woocommerce-fields.inline-edit-col .text{box-sizing:border-box;width:99%;float:right;margin:1px 1px 1px 1%}#woocommerce-fields.inline-edit-col .height,#woocommerce-fields.inline-edit-col .length,#woocommerce-fields.inline-edit-col .width{width:32.33%}#woocommerce-fields.inline-edit-col .height{margin-left:0}#woocommerce-fields-bulk.inline-edit-col label{clear:right}#woocommerce-fields-bulk.inline-edit-col .inline-edit-group label{clear:none;width:49%;margin:.2em 0}#woocommerce-fields-bulk.inline-edit-col .inline-edit-group.dimensions label{width:75%;max-width:75%}#woocommerce-fields-bulk.inline-edit-col .length,#woocommerce-fields-bulk.inline-edit-col .regular_price,#woocommerce-fields-bulk.inline-edit-col .sale_price,#woocommerce-fields-bulk.inline-edit-col .stock,#woocommerce-fields-bulk.inline-edit-col .weight{box-sizing:border-box;width:100%;margin-right:4.4em}#woocommerce-fields-bulk.inline-edit-col .height,#woocommerce-fields-bulk.inline-edit-col .length,#woocommerce-fields-bulk.inline-edit-col .width{box-sizing:border-box;width:25%}.column-coupon_code{line-height:2.25em}.column-coupon_code,ul.wc_coupon_list{margin:0;overflow:hidden;zoom:1;clear:both}ul.wc_coupon_list{padding-bottom:5px}ul.wc_coupon_list li{margin:0}ul.wc_coupon_list li.code{display:inline-block;position:relative;padding:0 .5em;background-color:#fff;border:1px solid #aaa;box-shadow:0 1px 0 #dfdfdf;border-radius:4px;margin-left:5px;margin-top:5px}ul.wc_coupon_list li.code.editable{padding-left:2em}ul.wc_coupon_list li.code .tips{cursor:pointer}ul.wc_coupon_list li.code .tips span{color:#888}ul.wc_coupon_list li.code .tips span:hover{color:#000}ul.wc_coupon_list li.code .remove-coupon{text-decoration:none;color:#888;position:absolute;top:7px;left:20px;left:7px}ul.wc_coupon_list li.code .remove-coupon::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}ul.wc_coupon_list li.code .remove-coupon:hover::before{color:#a00}ul.wc_coupon_list_block{margin:0;padding-bottom:2px}ul.wc_coupon_list_block li{border-top:1px solid #fff;border-bottom:1px solid #ccc;line-height:2.5em;margin:0;padding:.5em 0}ul.wc_coupon_list_block li:first-child{border-top:0;padding-top:0}ul.wc_coupon_list_block li:last-child{border-bottom:0;padding-bottom:0}.button.wc-reload{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;padding:0;height:28px;width:28px!important;display:inline-block}.button.wc-reload::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";line-height:28px}#woocommerce-order-data .handlediv,#woocommerce-order-data .hndle{display:none}#woocommerce-order-data .inside{display:block!important}#order_data{padding:23px 24px 12px}#order_data h2{margin:0;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif;font-size:21px;font-weight:400;line-height:1.2;text-shadow:-1px 1px 1px #fff;padding:0}#order_data h3{font-size:14px}#order_data h3,#order_data h4{color:#333;margin:1.33em 0 0}#order_data p{color:#777}#order_data p.order_number{margin:0;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif;font-weight:400;line-height:1.6em;font-size:16px}#order_data .order_data_column_container{clear:both}#order_data .order_data_column{width:32%;padding:0 0 0 2%;float:right}#order_data .order_data_column>h3 span{display:block}#order_data .order_data_column:last-child{padding-left:0}#order_data .order_data_column p{padding:0!important}#order_data .order_data_column .address strong{display:block}#order_data .order_data_column .form-field{float:right;clear:right;width:48%;padding:0;margin:9px 0 0}#order_data .order_data_column .form-field label{display:block;padding:0 0 3px}#order_data .order_data_column .form-field input,#order_data .order_data_column .form-field textarea{width:100%}#order_data .order_data_column .form-field select{width:100%}#order_data .order_data_column .form-field .select2-container{width:100%!important}#order_data .order_data_column .form-field .date-picker{width:50%}#order_data .order_data_column .form-field .hour,#order_data .order_data_column .form-field .minute{width:3.5em}#order_data .order_data_column .form-field small{display:block;margin:5px 0 0;color:#999}#order_data .order_data_column ._billing_address_2_field,#order_data .order_data_column ._billing_last_name_field,#order_data .order_data_column ._billing_phone_field,#order_data .order_data_column ._billing_postcode_field,#order_data .order_data_column ._billing_state_field,#order_data .order_data_column ._shipping_address_2_field,#order_data .order_data_column ._shipping_last_name_field,#order_data .order_data_column ._shipping_postcode_field,#order_data .order_data_column ._shipping_state_field,#order_data .order_data_column .form-field.last{float:left;clear:left}#order_data .order_data_column ._billing_company_field,#order_data .order_data_column ._shipping_company_field,#order_data .order_data_column ._transaction_id_field,#order_data .order_data_column .form-field-wide{width:100%;clear:both}#order_data .order_data_column ._billing_company_field .wc-category-search,#order_data .order_data_column ._billing_company_field .wc-customer-search,#order_data .order_data_column ._billing_company_field .wc-enhanced-select,#order_data .order_data_column ._billing_company_field input,#order_data .order_data_column ._billing_company_field select,#order_data .order_data_column ._billing_company_field textarea,#order_data .order_data_column ._shipping_company_field .wc-category-search,#order_data .order_data_column ._shipping_company_field .wc-customer-search,#order_data .order_data_column ._shipping_company_field .wc-enhanced-select,#order_data .order_data_column ._shipping_company_field input,#order_data .order_data_column ._shipping_company_field select,#order_data .order_data_column ._shipping_company_field textarea,#order_data .order_data_column ._transaction_id_field .wc-category-search,#order_data .order_data_column ._transaction_id_field .wc-customer-search,#order_data .order_data_column ._transaction_id_field .wc-enhanced-select,#order_data .order_data_column ._transaction_id_field input,#order_data .order_data_column ._transaction_id_field select,#order_data .order_data_column ._transaction_id_field textarea,#order_data .order_data_column .form-field-wide .wc-category-search,#order_data .order_data_column .form-field-wide .wc-customer-search,#order_data .order_data_column .form-field-wide .wc-enhanced-select,#order_data .order_data_column .form-field-wide input,#order_data .order_data_column .form-field-wide select,#order_data .order_data_column .form-field-wide textarea{width:100%}#order_data .order_data_column p.none_set{color:#999}#order_data .order_data_column div.edit_address{display:none;zoom:1;padding-left:1px}#order_data .order_data_column .wc-customer-user label a,#order_data .order_data_column .wc-order-status label a{float:left;margin-right:8px}#order_data .order_data_column a.edit_address{width:14px;height:0;padding:14px 0 0;margin:0 6px 0 0;overflow:hidden;position:relative;color:#999;border:0;float:left}#order_data .order_data_column a.edit_address:focus,#order_data .order_data_column a.edit_address:hover{color:#000}#order_data .order_data_column a.edit_address::after{font-family:WooCommerce;position:absolute;top:0;right:0;text-align:center;vertical-align:top;line-height:14px;font-size:14px;font-weight:400}#order_data .order_data_column a.edit_address::after{font-family:Dashicons;content:'\f464'}#order_data .order_data_column .billing-same-as-shipping,#order_data .order_data_column .load_customer_billing,#order_data .order_data_column .load_customer_shipping{font-size:13px;display:inline-block;font-weight:400}#order_data .order_data_column .load_customer_shipping{margin-left:.3em}.order_actions{margin:0;overflow:hidden;zoom:1}.order_actions li{border-top:1px solid #fff;border-bottom:1px solid #ddd;padding:6px 0;margin:0;line-height:1.6em;float:right;width:50%;text-align:center}.order_actions li a{float:none;text-align:center;text-decoration:underline}.order_actions li.wide{width:auto;float:none;clear:both;padding:6px;text-align:right;overflow:hidden}.order_actions li #delete-action{line-height:25px;vertical-align:middle;text-align:right;float:right}.order_actions li .save_order{float:left}.order_actions li#actions{overflow:hidden}.order_actions li#actions .button{width:24px;box-sizing:border-box;float:left}.order_actions li#actions select{width:225px;box-sizing:border-box;float:right}#woocommerce-order-items .inside{margin:0;padding:0;background:#fefefe}#woocommerce-order-items .wc-order-data-row{border-bottom:1px solid #dfdfdf;padding:1.5em 2em;background:#f8f8f8;line-height:2em;text-align:left}#woocommerce-order-items .wc-order-data-row::after,#woocommerce-order-items .wc-order-data-row::before{content:' ';display:table}#woocommerce-order-items .wc-order-data-row::after{clear:both}#woocommerce-order-items .wc-order-data-row p{margin:0;line-height:2em}#woocommerce-order-items .wc-order-data-row .wc-used-coupons{text-align:right}#woocommerce-order-items .wc-order-data-row .wc-used-coupons .tips{display:inline-block}#woocommerce-order-items .wc-used-coupons{float:right;width:50%}#woocommerce-order-items .wc-order-totals{float:left;width:50%;margin:0;padding:0;text-align:left}#woocommerce-order-items .wc-order-totals .amount{font-weight:700}#woocommerce-order-items .wc-order-totals .label{vertical-align:top}#woocommerce-order-items .wc-order-totals .total{font-size:1em!important;width:10em;margin:0 .5em 0 0;box-sizing:border-box}#woocommerce-order-items .wc-order-totals .total input[type=text]{width:96%;float:left}#woocommerce-order-items .wc-order-totals .refunded-total{color:#a00}#woocommerce-order-items .refund-actions{margin-top:5px;padding-top:12px;border-top:1px solid #dfdfdf}#woocommerce-order-items .refund-actions .button{float:left;margin-right:4px}#woocommerce-order-items .refund-actions .cancel-action{float:right;margin-right:0}#woocommerce-order-items .add_meta{margin-right:0!important}#woocommerce-order-items h3 small{color:#999}#woocommerce-order-items .amount{white-space:nowrap}#woocommerce-order-items .add-items .description{margin-left:10px}#woocommerce-order-items .add-items .button{float:right;margin-left:.25em}#woocommerce-order-items .add-items .button-primary{float:none;margin-left:0}#woocommerce-order-items .inside{display:block!important}#woocommerce-order-items .handlediv,#woocommerce-order-items .hndle{display:none}#woocommerce-order-items .woocommerce_order_items_wrapper{margin:0;overflow-x:auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items{width:100%;background:#fff}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th{text-align:right;padding:1em;font-weight:400;color:#999;background:#f8f8f8;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th.sortable{cursor:pointer}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th:last-child{padding-left:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th:first-child{padding-right:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th .wc-arrow{float:left;position:relative;margin-left:-1em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td{padding:1.5em 1em 1em;text-align:right;line-height:1.5em;vertical-align:top;border-bottom:1px solid #f8f8f8}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td textarea{width:100%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td select{width:50%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td textarea{font-size:14px;padding:4px;color:#555}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th:last-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td:last-child{padding-left:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td:first-child{padding-right:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr:last-child td{border-bottom:1px solid #dfdfdf}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr:first-child td{border-top:8px solid #f8f8f8}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody#order_line_items tr:first-child td{border-top:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb{text-align:right;width:38px;padding-bottom:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail{width:38px;height:38px;border:2px solid #e8e8e8;background:#f8f8f8;color:#ccc;position:relative;font-size:21px;display:block;text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";width:38px;line-height:38px;display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail img{width:100%;height:100%;margin:0;padding:0;position:relative}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.name .wc-order-item-sku,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.name .wc-order-item-variation{display:block;margin-top:.5em;font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item{min-width:200px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .center,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .variation-id{text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class{text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class label{white-space:nowrap;color:#999;font-size:.833em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class label input{display:inline}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class input{width:70px;vertical-align:middle;text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class select{width:85px;height:26px;vertical-align:middle;font-size:1em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input{display:inline-block;background:#fff;border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);margin:1px 0;min-width:80px;overflow:hidden;line-height:1em;text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input{width:100%;box-sizing:border-box}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input label{font-size:.75em;padding:4px 6px 0;color:#555;display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input input{width:100%;box-sizing:border-box;border:0;box-shadow:none;margin:0;padding:0 6px 4px;color:#555;background:0 0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input input::-webkit-input-placeholder{color:#ddd}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child{border-bottom:1px dashed #ddd;background:#fff}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child label{color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child input{color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .view{white-space:nowrap}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .edit{text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class small.times{font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes{margin:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes label{display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-discount{display:block;margin-top:.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class small.times{margin-left:.25em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity{text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity input{text-align:center;width:50px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items span.subtotal{opacity:.5}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.tax_class,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.tax_class{text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .calculated{border-color:#ae8ca2;border-style:dotted}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta{width:100%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta{margin:.5em 0 0;font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr th,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr th{border:0;padding:0 0 .5em 4px;line-height:1.5em;width:20%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td{padding:0 0 .5em 4px;border:0;line-height:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td input{width:100%;margin:0;position:relative;border-bottom:0;box-shadow:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td textarea{width:100%;height:4em;margin:0;box-shadow:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td input:focus+textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td input:focus+textarea{border-top-color:#999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td p,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td p{margin:0 0 .5em;line-height:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td p:last-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td p:last-child{margin:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .refund_by{border-bottom:1px dotted #999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.fee .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.fee .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.refund .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.refund .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .shipping_method,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .shipping_method_name{width:100%;margin:0 0 .5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax{white-space:nowrap}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;float:left;font-size:14px;visibility:hidden;margin:3px 0 0 -18px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax::before,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax:hover::before,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax:hover::before{color:#a00}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax:hover .delete-order-tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax:hover .delete-order-tax{visibility:visible}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items small.refunded{display:block;color:#a00;white-space:nowrap;margin-top:.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items small.refunded::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";position:relative;top:auto;right:auto;margin:-1px 0 0 4px;vertical-align:middle;line-height:1em}#woocommerce-order-items .wc-order-edit-line-item{padding-right:0}#woocommerce-order-items .wc-order-edit-line-item-actions{width:44px;text-align:left;padding-right:0;vertical-align:middle}#woocommerce-order-items .wc-order-edit-line-item-actions a{color:#ccc;display:inline-block;cursor:pointer;padding:0 0 .5em;margin:0 12px 0 0;vertical-align:middle;text-decoration:none;line-height:16px;width:16px;overflow:hidden}#woocommerce-order-items .wc-order-edit-line-item-actions a::before{margin:0;padding:0;font-size:16px;width:16px;height:16px}#woocommerce-order-items .wc-order-edit-line-item-actions a:hover::before{color:#999}#woocommerce-order-items .wc-order-edit-line-item-actions a:first-child{margin-right:0}#woocommerce-order-items .wc-order-edit-line-item-actions .edit-order-item::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";position:relative}#woocommerce-order-items .wc-order-edit-line-item-actions .delete-order-item::before,#woocommerce-order-items .wc-order-edit-line-item-actions .delete_refund::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";position:relative}#woocommerce-order-items .wc-order-edit-line-item-actions .delete-order-item:hover::before,#woocommerce-order-items .wc-order-edit-line-item-actions .delete_refund:hover::before{color:#a00}#woocommerce-order-items tbody tr .wc-order-edit-line-item-actions{visibility:hidden}#woocommerce-order-items tbody tr:hover .wc-order-edit-line-item-actions{visibility:visible}#woocommerce-order-items .wc-order-totals .wc-order-edit-line-item-actions{width:1.5em;visibility:visible!important}#woocommerce-order-items .wc-order-totals .wc-order-edit-line-item-actions a{padding:0}#woocommerce-order-downloads .buttons{float:right;padding:0;margin:0;vertical-align:top}#woocommerce-order-downloads .buttons .add_item_id,#woocommerce-order-downloads .buttons .select2-container{width:400px!important;margin-left:9px;vertical-align:top;float:right}#woocommerce-order-downloads .buttons button{margin:2px 0 0}#woocommerce-order-downloads h3 small{color:#999}#poststuff #woocommerce-order-actions .inside{margin:0;padding:0}#poststuff #woocommerce-order-actions .inside ul.order_actions li{padding:6px 10px;box-sizing:border-box}#poststuff #woocommerce-order-actions .inside ul.order_actions li:last-child{border-bottom:0}#poststuff #woocommerce-order-notes .inside{margin:0;padding:0}#poststuff #woocommerce-order-notes .inside ul.order_notes li{padding:0 10px}#woocommerce_customers p.search-box{margin:6px 0 4px;float:right}#woocommerce_customers .tablenav{float:left;clear:none}.widefat.customers td{vertical-align:middle;padding:4px 7px}.widefat .column-order_title{width:15%}.widefat .column-order_title time{display:block;color:#999;margin:3px 0}.widefat .column-orders,.widefat .column-paying,.widefat .column-spent{text-align:center;width:8%}.widefat .column-last_order{width:11%}.widefat .column-wc_actions{width:110px}.widefat .column-wc_actions a.button{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;display:inline-block;margin:2px 0 2px 4px;padding:0!important;height:2em!important;width:2em;overflow:hidden;vertical-align:middle}.widefat .column-wc_actions a.button::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;line-height:1.85}.widefat .column-wc_actions a.button img{display:block;width:12px;height:auto}.widefat .column-wc_actions a.edit::after{content:'\f464'}.widefat .column-wc_actions a.link::after{font-family:WooCommerce;content:'\e00d'}.widefat .column-wc_actions a.view::after{content:'\f177'}.widefat .column-wc_actions a.refresh::after{font-family:WooCommerce;content:'\e031'}.widefat .column-wc_actions a.processing::after{font-family:WooCommerce;content:'\e00f'}.widefat .column-wc_actions a.complete::after{content:'\f147'}.widefat small.meta{display:block;color:#999;font-size:inherit;margin:3px 0}.post-type-shop_order .tablenav .one-page .displaying-num{display:none}.post-type-shop_order .wp-list-table{margin-top:1em}.post-type-shop_order .wp-list-table tfoot th,.post-type-shop_order .wp-list-table thead th{padding:.75em 1em}.post-type-shop_order .wp-list-table tfoot th.sortable a,.post-type-shop_order .wp-list-table tfoot th.sorted a,.post-type-shop_order .wp-list-table thead th.sortable a,.post-type-shop_order .wp-list-table thead th.sorted a{padding:0}.post-type-shop_order .wp-list-table tfoot th:first-child,.post-type-shop_order .wp-list-table thead th:first-child{padding-right:2em}.post-type-shop_order .wp-list-table tfoot th:last-child,.post-type-shop_order .wp-list-table thead th:last-child{padding-left:2em}.post-type-shop_order .wp-list-table tbody td,.post-type-shop_order .wp-list-table tbody th{padding:1em;line-height:26px}.post-type-shop_order .wp-list-table tbody td:first-child{padding-right:2em}.post-type-shop_order .wp-list-table tbody td:last-child{padding-left:2em}.post-type-shop_order .wp-list-table tbody tr{border-top:1px solid #f5f5f5}.post-type-shop_order .wp-list-table tbody tr:hover:not(.status-trash):not(.no-link) td{cursor:pointer}.post-type-shop_order .wp-list-table .no-link{cursor:default!important}.post-type-shop_order .wp-list-table td,.post-type-shop_order .wp-list-table th{width:12ch;vertical-align:middle}.post-type-shop_order .wp-list-table td p,.post-type-shop_order .wp-list-table th p{margin:0}.post-type-shop_order .wp-list-table .check-column{width:1px;white-space:nowrap;padding:1em 1em 1em 1em!important;vertical-align:middle}.post-type-shop_order .wp-list-table .check-column input{vertical-align:text-top;margin:1px 0}.post-type-shop_order .wp-list-table .column-order_number{width:20ch}.post-type-shop_order .wp-list-table .column-order_total{width:8ch;text-align:left}.post-type-shop_order .wp-list-table .column-order_total a span{float:left}.post-type-shop_order .wp-list-table .column-order_date,.post-type-shop_order .wp-list-table .column-order_status{width:10ch}.post-type-shop_order .wp-list-table .column-order_status{width:14ch}.post-type-shop_order .wp-list-table .column-billing_address,.post-type-shop_order .wp-list-table .column-shipping_address{width:20ch;line-height:1.5em}.post-type-shop_order .wp-list-table .column-billing_address .description,.post-type-shop_order .wp-list-table .column-shipping_address .description{display:block;color:#999}.post-type-shop_order .wp-list-table .column-wc_actions{text-align:left}.post-type-shop_order .wp-list-table .column-wc_actions a.button{text-indent:9999px;margin:2px 4px 2px 0}.post-type-shop_order .wp-list-table .order-preview{float:left;width:16px;padding:20px 4px 4px 4px;height:0;overflow:hidden;position:relative;border:2px solid transparent;border-radius:4px}.post-type-shop_order .wp-list-table .order-preview::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";line-height:16px;font-size:14px;vertical-align:middle;top:4px}.post-type-shop_order .wp-list-table .order-preview:hover{border:2px solid #00a0d2}.post-type-shop_order .wp-list-table .order-preview.disabled::before{content:'';background:url(../images/wpspin.gif) no-repeat center top}.order-status{display:-webkit-inline-box;display:inline-flex;line-height:2.5em;color:#777;background:#e5e5e5;border-radius:4px;border-bottom:1px solid rgba(0,0,0,.05);margin:-.25em 0;cursor:inherit!important;white-space:nowrap;max-width:100%}.order-status.status-completed{background:#c8d7e1;color:#2e4453}.order-status.status-on-hold{background:#f8dda7;color:#94660c}.order-status.status-failed{background:#eba3a3;color:#761919}.order-status.status-processing{background:#c6e1c6;color:#5b841b}.order-status.status-trash{background:#eba3a3;color:#761919}.order-status>span{margin:0 1em;overflow:hidden;text-overflow:ellipsis}.wc-order-preview .order-status{float:left;margin-left:54px}.wc-order-preview article{padding:0!important}.wc-order-preview .modal-close{border-radius:0}.wc-order-preview .wc-order-preview-table{width:100%;margin:0}.wc-order-preview .wc-order-preview-table td,.wc-order-preview .wc-order-preview-table th{padding:1em 1.5em;text-align:right;border:0;border-bottom:1px solid #eee;margin:0;background:0 0;box-shadow:none;text-align:left;vertical-align:top}.wc-order-preview .wc-order-preview-table td:first-child,.wc-order-preview .wc-order-preview-table th:first-child{text-align:right}.wc-order-preview .wc-order-preview-table th{border-color:#ccc}.wc-order-preview .wc-order-preview-table tr:last-child td{border:0}.wc-order-preview .wc-order-preview-table .wc-order-item-sku{margin-top:.5em}.wc-order-preview .wc-order-preview-table .wc-order-item-meta{margin-top:.5em}.wc-order-preview .wc-order-preview-table .wc-order-item-meta td,.wc-order-preview .wc-order-preview-table .wc-order-item-meta th{padding:0;border:0;text-align:right;vertical-align:top}.wc-order-preview .wc-order-preview-table .wc-order-item-meta td:last-child{padding-right:.5em}.wc-order-preview .wc-order-preview-addresses{overflow:hidden;padding-bottom:1.5em}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note{width:50%;float:right;padding:1.5em 1.5em 0;box-sizing:border-box;word-wrap:break-word}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address h2,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note h2{margin-top:0}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address strong,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note strong{display:block;margin-top:1.5em}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address strong:first-child,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note strong:first-child{margin-top:0}.wc-order-preview footer .wc-action-button-group{display:inline-block;float:right}.wc-order-preview footer .button.button-large{margin-right:10px;padding:0 10px!important;line-height:28px;height:auto;display:inline-block}.wc-order-preview .wc-action-button-group label{display:none}.wc-action-button-group{vertical-align:middle;line-height:26px;text-align:right}.wc-action-button-group label{margin-left:6px;cursor:default;font-weight:700;line-height:28px}.wc-action-button-group .wc-action-button-group__items{display:-webkit-inline-box;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row wrap;align-content:flex-start;-webkit-box-pack:start;justify-content:flex-start}.wc-action-button-group .wc-action-button{margin:0 -1px 0 0!important;border:1px solid #ccc;padding:0 10px!important;border-radius:0!important;float:none;line-height:28px;height:auto;z-index:1;position:relative;overflow:hidden;text-overflow:ellipsis;-webkit-box-flex:1;flex:1 0 auto;box-sizing:border-box;text-align:center;white-space:nowrap}.wc-action-button-group .wc-action-button:focus,.wc-action-button-group .wc-action-button:hover{border:1px solid #999;z-index:2}.wc-action-button-group .wc-action-button:first-child{margin-right:0!important;border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}.wc-action-button-group .wc-action-button:last-child{border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}@media screen and (max-width:782px){.wc-order-preview footer .wc-action-button-group .wc-action-button-group__items{display:-webkit-box;display:flex}.wc-order-preview footer .wc-action-button-group{float:none;display:block;margin-bottom:4px}.wc-order-preview footer .button.button-large{width:100%;float:none;text-align:center;margin:0;display:block}.post-type-shop_order .wp-list-table td.check-column{width:1em}.post-type-shop_order .wp-list-table td.column-order_number{padding-right:0;padding-bottom:.5em}.post-type-shop_order .wp-list-table td.column-order_date,.post-type-shop_order .wp-list-table td.column-order_status{display:inline-block!important;padding:0 1em 1em 1em!important}.post-type-shop_order .wp-list-table td.column-order_date:before,.post-type-shop_order .wp-list-table td.column-order_status:before{display:none!important}.post-type-shop_order .wp-list-table td.column-order_date{padding-right:0!important}.post-type-shop_order .wp-list-table td.column-order_status{float:left}}.column-customer_message .note-on{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto;color:#999}.column-customer_message .note-on::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";line-height:16px}.column-order_notes .note-on{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto;color:#999}.column-order_notes .note-on::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";line-height:16px}.attributes-table td,.attributes-table th{width:15%;vertical-align:top}.attributes-table .attribute-terms{width:32%}.attributes-table .attribute-actions{width:2em}.attributes-table .attribute-actions .configure-terms{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;padding:0!important;height:2em!important;width:2em}.attributes-table .attribute-actions .configure-terms::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";font-family:Dashicons;line-height:1.85}ul.order_notes{padding:2px 0 0}ul.order_notes li .note_content{padding:10px;background:#efefef;position:relative}ul.order_notes li .note_content p{margin:0;padding:0;word-wrap:break-word}ul.order_notes li p.meta{padding:10px;color:#999;margin:0;font-size:11px}ul.order_notes li p.meta .exact-date{border-bottom:1px dotted #999}ul.order_notes li a.delete_note{color:#a00}ul.order_notes li .note_content::after{content:'';display:block;position:absolute;bottom:-10px;right:20px;width:0;height:0;border-width:10px 0 0 10px;border-style:solid;border-color:#efefef transparent}ul.order_notes li.system-note .note_content{background:#d7cad2}ul.order_notes li.system-note .note_content::after{border-color:#d7cad2 transparent}ul.order_notes li.customer-note .note_content{background:#a7cedc}ul.order_notes li.customer-note .note_content::after{border-color:#a7cedc transparent}.add_note{border-top:1px solid #ddd;padding:10px 10px 0}.add_note h4{margin-top:5px!important}.add_note #add_order_note{width:100%;height:50px}table.wp-list-table .column-thumb{width:52px;text-align:center;white-space:nowrap}table.wp-list-table .column-handle{width:17px;display:none}table.wp-list-table tbody td.column-handle{cursor:move;width:17px;text-align:center;vertical-align:text-top}table.wp-list-table tbody td.column-handle::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;height:100%;margin:4px 0 0 0}table.wp-list-table .column-name{width:22%}table.wp-list-table .column-product_cat,table.wp-list-table .column-product_tag{width:11%!important}table.wp-list-table .column-featured,table.wp-list-table .column-product_type{width:48px;text-align:right!important}table.wp-list-table .column-customer_message,table.wp-list-table .column-order_notes{width:48px;text-align:center}table.wp-list-table .column-customer_message img,table.wp-list-table .column-order_notes img{margin:0 auto;padding-top:0!important}table.wp-list-table .manage-column.column-featured img,table.wp-list-table .manage-column.column-product_type img{padding-right:2px}table.wp-list-table .column-price .woocommerce-price-suffix{display:none}table.wp-list-table img{margin:1px 2px}table.wp-list-table .row-actions{color:#999}table.wp-list-table td.column-thumb img{margin:0;width:auto;height:auto;max-width:40px;max-height:40px;vertical-align:middle}table.wp-list-table span.na{color:#999}table.wp-list-table .column-sku{width:10%}table.wp-list-table .column-price{width:10ch}table.wp-list-table .column-is_in_stock{text-align:right!important;width:12ch}table.wp-list-table span.wc-featured,table.wp-list-table span.wc-image{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto}table.wp-list-table span.wc-featured::before,table.wp-list-table span.wc-image::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}table.wp-list-table span.wc-featured::before{content:'\f155'}table.wp-list-table span.wc-featured.not-featured::before{content:'\f154'}table.wp-list-table td.column-featured span.wc-featured{font-size:1.6em;cursor:pointer}table.wp-list-table mark.instock,table.wp-list-table mark.onbackorder,table.wp-list-table mark.outofstock{font-weight:700;background:transparent none;line-height:1}table.wp-list-table mark.instock{color:#7ad03a}table.wp-list-table mark.outofstock{color:#a44}table.wp-list-table mark.onbackorder{color:#eaa600}table.wp-list-table .notes_head,table.wp-list-table .order-notes_head,table.wp-list-table .status_head{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto}table.wp-list-table .notes_head::after,table.wp-list-table .order-notes_head::after,table.wp-list-table .status_head::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}table.wp-list-table .order-notes_head::after{content:'\e028'}table.wp-list-table .notes_head::after{content:'\e026'}table.wp-list-table .status_head::after{content:'\e011'}table.wp-list-table .column-order_items{width:12%}table.wp-list-table .column-order_items table.order_items{width:100%;margin:3px 0 0;padding:0;display:none}table.wp-list-table .column-order_items table.order_items td{border:0;margin:0;padding:0 0 3px}table.wp-list-table .column-order_items table.order_items td.qty{color:#999;padding-left:6px;text-align:right}mark.notice{background:#fff;color:#a00;margin:0 10px 0 0}a.export_rates,a.import_rates{float:left;margin-right:9px;margin-top:-2px;margin-bottom:0}#rates-search{float:left}#rates-search input.wc-tax-rates-search-field{padding:4px 8px;font-size:1.2em}#rates-pagination{float:left;margin-left:.5em}#rates-pagination .tablenav{margin:0}.wc_input_table_wrapper{overflow-x:auto;display:block}table.wc_input_table,table.wc_tax_rates{width:100%}table.wc_input_table td,table.wc_input_table th,table.wc_tax_rates td,table.wc_tax_rates th{display:table-cell!important}table.wc_input_table span.tips,table.wc_tax_rates span.tips{color:#2ea2cc}table.wc_input_table th,table.wc_tax_rates th{white-space:nowrap;padding:10px}table.wc_input_table td,table.wc_tax_rates td{padding:0;border-left:1px solid #dfdfdf;border-bottom:1px solid #dfdfdf;border-top:0;background:#fff;cursor:default}table.wc_input_table td input[type=number],table.wc_input_table td input[type=text],table.wc_tax_rates td input[type=number],table.wc_tax_rates td input[type=text]{width:100%!important;min-width:100px;padding:8px 10px;margin:0;border:0;outline:0;background:transparent none}table.wc_input_table td input[type=number]:focus,table.wc_input_table td input[type=text]:focus,table.wc_tax_rates td input[type=number]:focus,table.wc_tax_rates td input[type=text]:focus{outline:0;box-shadow:none}table.wc_input_table td.apply_to_shipping,table.wc_input_table td.compound,table.wc_tax_rates td.apply_to_shipping,table.wc_tax_rates td.compound{padding:5px 7px;vertical-align:middle}table.wc_input_table td.apply_to_shipping input,table.wc_input_table td.compound input,table.wc_tax_rates td.apply_to_shipping input,table.wc_tax_rates td.compound input{width:auto;padding:0}table.wc_input_table td:last-child,table.wc_tax_rates td:last-child{border-left:0}table.wc_input_table tr.current td,table.wc_tax_rates tr.current td{background-color:#fefbcc}table.wc_input_table .cost,table.wc_input_table .item_cost,table.wc_tax_rates .cost,table.wc_tax_rates .item_cost{text-align:left}table.wc_input_table .cost input,table.wc_input_table .item_cost input,table.wc_tax_rates .cost input,table.wc_tax_rates .item_cost input{text-align:left}table.wc_input_table th.sort,table.wc_tax_rates th.sort{width:17px;padding:0 4px}table.wc_input_table td.sort,table.wc_tax_rates td.sort{padding:0 4px}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort{cursor:move;font-size:15px;background:#f9f9f9;text-align:center;vertical-align:middle}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort::before,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:right;height:100%}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort:hover::before,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort:hover::before{color:#333}table.wc_input_table .button,table.wc_tax_rates .button{float:right;margin-left:5px}table.wc_input_table .export,table.wc_input_table .import,table.wc_tax_rates .export,table.wc_tax_rates .import{float:left;margin-left:0;margin-right:5px}table.wc_input_table span.tips,table.wc_tax_rates span.tips{padding:0 3px}table.wc_input_table .pagination,table.wc_tax_rates .pagination{float:left}table.wc_input_table .pagination .button,table.wc_tax_rates .pagination .button{margin-right:5px;margin-left:0}table.wc_input_table .pagination .current,table.wc_tax_rates .pagination .current{background:#bbb;text-shadow:none}table.wc_input_table tr:last-child td,table.wc_tax_rates tr:last-child td{border-bottom:0}table.wc_emails,table.wc_gateways,table.wc_shipping{position:relative}table.wc_emails td,table.wc_emails th,table.wc_gateways td,table.wc_gateways th,table.wc_shipping td,table.wc_shipping th{display:table-cell!important;padding:1em!important;vertical-align:top;line-height:1.75em}table.wc_emails.wc_emails td,table.wc_gateways.wc_emails td,table.wc_shipping.wc_emails td{vertical-align:middle}table.wc_emails tr:nth-child(odd) td,table.wc_gateways tr:nth-child(odd) td,table.wc_shipping tr:nth-child(odd) td{background:#f9f9f9}table.wc_emails td.name,table.wc_gateways td.name,table.wc_shipping td.name{font-weight:700}table.wc_emails .settings,table.wc_gateways .settings,table.wc_shipping .settings{text-align:left}table.wc_emails .default,table.wc_emails .radio,table.wc_emails .status,table.wc_gateways .default,table.wc_gateways .radio,table.wc_gateways .status,table.wc_shipping .default,table.wc_shipping .radio,table.wc_shipping .status{text-align:center}table.wc_emails .default .tips,table.wc_emails .radio .tips,table.wc_emails .status .tips,table.wc_gateways .default .tips,table.wc_gateways .radio .tips,table.wc_gateways .status .tips,table.wc_shipping .default .tips,table.wc_shipping .radio .tips,table.wc_shipping .status .tips{margin:0 auto}table.wc_emails .default input,table.wc_emails .radio input,table.wc_emails .status input,table.wc_gateways .default input,table.wc_gateways .radio input,table.wc_gateways .status input,table.wc_shipping .default input,table.wc_shipping .radio input,table.wc_shipping .status input{margin:0}table.wc_emails td.sort,table.wc_gateways td.sort,table.wc_shipping td.sort{font-size:15px;text-align:center}table.wc_emails td.sort .wc-item-reorder-nav,table.wc_gateways td.sort .wc-item-reorder-nav,table.wc_shipping td.sort .wc-item-reorder-nav{white-space:nowrap;width:72px}table.wc_emails td.sort .wc-item-reorder-nav:before,table.wc_gateways td.sort .wc-item-reorder-nav:before,table.wc_shipping td.sort .wc-item-reorder-nav:before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:24px;float:right;height:100%;line-height:24px;cursor:move}table.wc_emails td.sort .wc-item-reorder-nav button,table.wc_gateways td.sort .wc-item-reorder-nav button,table.wc_shipping td.sort .wc-item-reorder-nav button{position:relative;overflow:hidden;float:right;display:block;width:24px;height:24px;margin:0;background:0 0;border:none;box-shadow:none;color:#82878c;text-indent:-9999px;cursor:pointer;outline:0}table.wc_emails td.sort .wc-item-reorder-nav button:before,table.wc_gateways td.sort .wc-item-reorder-nav button:before,table.wc_shipping td.sort .wc-item-reorder-nav button:before{display:inline-block;position:absolute;top:0;left:0;width:100%;height:100%;font:normal 20px/23px dashicons;text-align:center;text-indent:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}table.wc_emails td.sort .wc-item-reorder-nav button:focus,table.wc_emails td.sort .wc-item-reorder-nav button:hover,table.wc_gateways td.sort .wc-item-reorder-nav button:focus,table.wc_gateways td.sort .wc-item-reorder-nav button:hover,table.wc_shipping td.sort .wc-item-reorder-nav button:focus,table.wc_shipping td.sort .wc-item-reorder-nav button:hover{color:#191e23}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-down:before,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-down:before,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-down:before{content:"\f347"}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-up:before,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-up:before,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-up:before{content:"\f343"}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-disabled,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-disabled,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-disabled{color:#d5d5d5!important;cursor:default;pointer-events:none}table.wc_emails .wc-payment-gateway-method-name,table.wc_gateways .wc-payment-gateway-method-name,table.wc_shipping .wc-payment-gateway-method-name{font-weight:400}table.wc_emails .wc-email-settings-table-name,table.wc_gateways .wc-email-settings-table-name,table.wc_shipping .wc-email-settings-table-name{font-weight:700}table.wc_emails .wc-email-settings-table-name span,table.wc_gateways .wc-email-settings-table-name span,table.wc_shipping .wc-email-settings-table-name span{font-weight:400;color:#999;margin:0 4px 0 0!important}table.wc_emails .wc-payment-gateway-method-toggle-disabled,table.wc_emails .wc-payment-gateway-method-toggle-enabled,table.wc_gateways .wc-payment-gateway-method-toggle-disabled,table.wc_gateways .wc-payment-gateway-method-toggle-enabled,table.wc_shipping .wc-payment-gateway-method-toggle-disabled,table.wc_shipping .wc-payment-gateway-method-toggle-enabled{padding-top:1px;display:block;outline:0;box-shadow:none}table.wc_emails .wc-email-settings-table-status,table.wc_gateways .wc-email-settings-table-status,table.wc_shipping .wc-email-settings-table-status{text-align:center;width:1em}table.wc_emails .wc-email-settings-table-status .tips,table.wc_gateways .wc-email-settings-table-status .tips,table.wc_shipping .wc-email-settings-table-status .tips{margin:0 auto}.wc-shipping-zone-settings th{padding:24px 0 24px 24px}.wc-shipping-zone-settings td.forminp input,.wc-shipping-zone-settings td.forminp textarea{padding:8px;max-width:100%!important}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select{width:448px;max-width:100%!important}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices{padding:8px 8px 4px;border-color:#ddd;min-height:0;line-height:1}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices input{padding:0}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices li{margin:0 0 4px 4px}.wc-shipping-zone-settings .wc-shipping-zone-postcodes-toggle{margin:.5em 0 0;font-size:.9em;text-decoration:underline;display:block}.wc-shipping-zone-settings .wc-shipping-zone-postcodes-toggle+.wc-shipping-zone-postcodes{display:none}.wc-shipping-zone-settings .wc-shipping-zone-postcodes textarea{margin:10px 0}.wc-shipping-zone-settings .wc-shipping-zone-postcodes .description{font-size:.9em;color:#999}.wc-shipping-zone-settings+p.submit{margin-top:0}table tr table.wc-shipping-zone-methods tr .row-actions,table tr:hover table.wc-shipping-zone-methods tr .row-actions{position:relative}table tr table.wc-shipping-zone-methods tr:hover .row-actions,table tr:hover table.wc-shipping-zone-methods tr:hover .row-actions{position:static}.wc-shipping-zones-heading .page-title-action{display:inline-block}table.wc-shipping-classes td,table.wc-shipping-classes th,table.wc-shipping-zone-methods td,table.wc-shipping-zone-methods th,table.wc-shipping-zones td,table.wc-shipping-zones th{vertical-align:top;line-height:24px;padding:1em!important;font-size:14px;background:#fff;display:table-cell!important}table.wc-shipping-classes td li,table.wc-shipping-classes th li,table.wc-shipping-zone-methods td li,table.wc-shipping-zone-methods th li,table.wc-shipping-zones td li,table.wc-shipping-zones th li{line-height:24px;font-size:14px}table.wc-shipping-classes td .woocommerce-help-tip,table.wc-shipping-classes th .woocommerce-help-tip,table.wc-shipping-zone-methods td .woocommerce-help-tip,table.wc-shipping-zone-methods th .woocommerce-help-tip,table.wc-shipping-zones td .woocommerce-help-tip,table.wc-shipping-zones th .woocommerce-help-tip{margin:0!important}table.wc-shipping-classes thead th,table.wc-shipping-zone-methods thead th,table.wc-shipping-zones thead th{vertical-align:middle}table.wc-shipping-classes thead .wc-shipping-zone-sort,table.wc-shipping-zone-methods thead .wc-shipping-zone-sort,table.wc-shipping-zones thead .wc-shipping-zone-sort{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state,table.wc-shipping-classes td.wc-shipping-zones-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zones-blank-state{background:#f7f1f6!important;overflow:hidden;position:relative;padding:7.5em 7.5%!important;border-bottom:2px solid #eee2ec}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-classes td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state{padding:2em!important}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-classes td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p{margin-bottom:0}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li,table.wc-shipping-classes td.wc-shipping-zone-method-blank-state p,table.wc-shipping-classes td.wc-shipping-zones-blank-state li,table.wc-shipping-classes td.wc-shipping-zones-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state p,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zones-blank-state li,table.wc-shipping-zones td.wc-shipping-zones-blank-state p{color:#a46497;font-size:1.5em;line-height:1.5em;margin:0 0 1em;position:relative;z-index:1;text-shadow:-1px 1px 1px #fff}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-classes td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-classes td.wc-shipping-zones-blank-state li.main,table.wc-shipping-classes td.wc-shipping-zones-blank-state p.main,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li.main,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state p.main,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-zones td.wc-shipping-zones-blank-state li.main,table.wc-shipping-zones td.wc-shipping-zones-blank-state p.main{font-size:2em}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li,table.wc-shipping-classes td.wc-shipping-zones-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zones td.wc-shipping-zones-blank-state li{margin-right:1em;list-style:circle inside}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-classes td.wc-shipping-zones-blank-state::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state::before,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-zones td.wc-shipping-zones-blank-state::before{content:'\e01b';font-family:WooCommerce;text-align:center;line-height:1;color:#eee2ec;display:block;width:1em;font-size:40em;top:50%;left:-3.75%;margin-top:-.1875em;position:absolute}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-classes td.wc-shipping-zones-blank-state .button-primary,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state .button-primary,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-zones td.wc-shipping-zones-blank-state .button-primary{background-color:#804877;border-color:#804877;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 0 rgba(0,0,0,.15);margin:0;opacity:1;text-shadow:0 -1px 1px #8a4f7f,-1px 0 1px #8a4f7f,0 1px 1px #8a4f7f,1px 0 1px #8a4f7f;font-size:1.5em;padding:.75em 1em;height:auto;position:relative;z-index:1}table.wc-shipping-classes .wc-shipping-zone-method-rows tr:nth-child(even) td,table.wc-shipping-zone-methods .wc-shipping-zone-method-rows tr:nth-child(even) td,table.wc-shipping-zones .wc-shipping-zone-method-rows tr:nth-child(even) td{background:#f9f9f9}table.wc-shipping-classes .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-classes tr.odd td,table.wc-shipping-zone-methods .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-zone-methods tr.odd td,table.wc-shipping-zones .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-zones tr.odd td{background:#f9f9f9}table.wc-shipping-classes tbody.wc-shipping-zone-rows td,table.wc-shipping-zone-methods tbody.wc-shipping-zone-rows td,table.wc-shipping-zones tbody.wc-shipping-zone-rows td{border-top:2px solid #f9f9f9}table.wc-shipping-classes tbody.wc-shipping-zone-rows tr:first-child td,table.wc-shipping-zone-methods tbody.wc-shipping-zone-rows tr:first-child td,table.wc-shipping-zones tbody.wc-shipping-zone-rows tr:first-child td{border-top:0}table.wc-shipping-classes tr.wc-shipping-zone-worldwide td,table.wc-shipping-zone-methods tr.wc-shipping-zone-worldwide td,table.wc-shipping-zones tr.wc-shipping-zone-worldwide td{background:#f9f9f9;border-top:2px solid #e1e1e1}table.wc-shipping-classes p,table.wc-shipping-classes ul,table.wc-shipping-zone-methods p,table.wc-shipping-zone-methods ul,table.wc-shipping-zones p,table.wc-shipping-zones ul{margin:0}table.wc-shipping-classes td.wc-shipping-zone-method-sort,table.wc-shipping-classes td.wc-shipping-zone-sort,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort,table.wc-shipping-zone-methods td.wc-shipping-zone-sort,table.wc-shipping-zones td.wc-shipping-zone-method-sort,table.wc-shipping-zones td.wc-shipping-zone-sort{cursor:move;font-size:15px;text-align:center}table.wc-shipping-classes td.wc-shipping-zone-method-sort::before,table.wc-shipping-classes td.wc-shipping-zone-sort::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort::before,table.wc-shipping-zone-methods td.wc-shipping-zone-sort::before,table.wc-shipping-zones td.wc-shipping-zone-method-sort::before,table.wc-shipping-zones td.wc-shipping-zone-sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:right;height:100%;line-height:24px}table.wc-shipping-classes td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-classes td.wc-shipping-zone-sort:hover::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-zone-methods td.wc-shipping-zone-sort:hover::before,table.wc-shipping-zones td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-zones td.wc-shipping-zone-sort:hover::before{color:#333}table.wc-shipping-classes td.wc-shipping-zone-worldwide,table.wc-shipping-zone-methods td.wc-shipping-zone-worldwide,table.wc-shipping-zones td.wc-shipping-zone-worldwide{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-worldwide::before,table.wc-shipping-zone-methods td.wc-shipping-zone-worldwide::before,table.wc-shipping-zones td.wc-shipping-zone-worldwide::before{content:'\f319';font-family:dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:right;height:100%;line-height:24px}table.wc-shipping-classes .wc-shipping-zone-methods,table.wc-shipping-classes .wc-shipping-zone-name,table.wc-shipping-zone-methods .wc-shipping-zone-methods,table.wc-shipping-zone-methods .wc-shipping-zone-name,table.wc-shipping-zones .wc-shipping-zone-methods,table.wc-shipping-zones .wc-shipping-zone-name{width:25%}table.wc-shipping-classes .wc-shipping-class-description input,table.wc-shipping-classes .wc-shipping-class-description select,table.wc-shipping-classes .wc-shipping-class-description textarea,table.wc-shipping-classes .wc-shipping-class-name input,table.wc-shipping-classes .wc-shipping-class-name select,table.wc-shipping-classes .wc-shipping-class-name textarea,table.wc-shipping-classes .wc-shipping-class-slug input,table.wc-shipping-classes .wc-shipping-class-slug select,table.wc-shipping-classes .wc-shipping-class-slug textarea,table.wc-shipping-classes .wc-shipping-zone-name input,table.wc-shipping-classes .wc-shipping-zone-name select,table.wc-shipping-classes .wc-shipping-zone-name textarea,table.wc-shipping-classes .wc-shipping-zone-region input,table.wc-shipping-classes .wc-shipping-zone-region select,table.wc-shipping-classes .wc-shipping-zone-region textarea,table.wc-shipping-zone-methods .wc-shipping-class-description input,table.wc-shipping-zone-methods .wc-shipping-class-description select,table.wc-shipping-zone-methods .wc-shipping-class-description textarea,table.wc-shipping-zone-methods .wc-shipping-class-name input,table.wc-shipping-zone-methods .wc-shipping-class-name select,table.wc-shipping-zone-methods .wc-shipping-class-name textarea,table.wc-shipping-zone-methods .wc-shipping-class-slug input,table.wc-shipping-zone-methods .wc-shipping-class-slug select,table.wc-shipping-zone-methods .wc-shipping-class-slug textarea,table.wc-shipping-zone-methods .wc-shipping-zone-name input,table.wc-shipping-zone-methods .wc-shipping-zone-name select,table.wc-shipping-zone-methods .wc-shipping-zone-name textarea,table.wc-shipping-zone-methods .wc-shipping-zone-region input,table.wc-shipping-zone-methods .wc-shipping-zone-region select,table.wc-shipping-zone-methods .wc-shipping-zone-region textarea,table.wc-shipping-zones .wc-shipping-class-description input,table.wc-shipping-zones .wc-shipping-class-description select,table.wc-shipping-zones .wc-shipping-class-description textarea,table.wc-shipping-zones .wc-shipping-class-name input,table.wc-shipping-zones .wc-shipping-class-name select,table.wc-shipping-zones .wc-shipping-class-name textarea,table.wc-shipping-zones .wc-shipping-class-slug input,table.wc-shipping-zones .wc-shipping-class-slug select,table.wc-shipping-zones .wc-shipping-class-slug textarea,table.wc-shipping-zones .wc-shipping-zone-name input,table.wc-shipping-zones .wc-shipping-zone-name select,table.wc-shipping-zones .wc-shipping-zone-name textarea,table.wc-shipping-zones .wc-shipping-zone-region input,table.wc-shipping-zones .wc-shipping-zone-region select,table.wc-shipping-zones .wc-shipping-zone-region textarea{width:100%}table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-zone-delete{color:#a00}table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-zone-delete:hover{color:red}table.wc-shipping-classes .wc-shipping-class-count,table.wc-shipping-zone-methods .wc-shipping-class-count,table.wc-shipping-zones .wc-shipping-class-count{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-methods,table.wc-shipping-zone-methods td.wc-shipping-zone-methods,table.wc-shipping-zones td.wc-shipping-zone-methods{color:#555}table.wc-shipping-classes td.wc-shipping-zone-methods .method_disabled,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .method_disabled,table.wc-shipping-zones td.wc-shipping-zone-methods .method_disabled{text-decoration:line-through}table.wc-shipping-classes td.wc-shipping-zone-methods ul,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul,table.wc-shipping-zones td.wc-shipping-zone-methods ul{position:relative;padding-left:32px}table.wc-shipping-classes td.wc-shipping-zone-methods ul li,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li,table.wc-shipping-zones td.wc-shipping-zone-methods ul li{color:#555;display:inline;margin:0}table.wc-shipping-classes td.wc-shipping-zone-methods ul li::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li::before,table.wc-shipping-zones td.wc-shipping-zone-methods ul li::before{content:', '}table.wc-shipping-classes td.wc-shipping-zone-methods ul li:first-child::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li:first-child::before,table.wc-shipping-zones td.wc-shipping-zone-methods ul li:first-child::before{content:''}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method{display:block;width:24px;padding:24px 0 0;height:0;overflow:hidden;cursor:pointer}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method::before,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";font-family:Dashicons;content:'\f502';color:#999;vertical-align:middle;line-height:24px;font-size:16px;margin:0}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method.disabled,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method.disabled,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method.disabled{cursor:not-allowed}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method.disabled::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method.disabled::before,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method.disabled::before{color:#ccc}table.wc-shipping-classes .wc-shipping-zone-method-title,table.wc-shipping-zone-methods .wc-shipping-zone-method-title,table.wc-shipping-zones .wc-shipping-zone-method-title{width:25%}table.wc-shipping-classes .wc-shipping-zone-method-title .wc-shipping-zone-method-delete,table.wc-shipping-zone-methods .wc-shipping-zone-method-title .wc-shipping-zone-method-delete,table.wc-shipping-zones .wc-shipping-zone-method-title .wc-shipping-zone-method-delete{color:red}table.wc-shipping-classes .wc-shipping-zone-method-enabled,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled,table.wc-shipping-zones .wc-shipping-zone-method-enabled{text-align:center}table.wc-shipping-classes .wc-shipping-zone-method-enabled a,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled a,table.wc-shipping-zones .wc-shipping-zone-method-enabled a{display:inline-block}table.wc-shipping-classes .wc-shipping-zone-method-enabled .woocommerce-input-toggle,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled .woocommerce-input-toggle,table.wc-shipping-zones .wc-shipping-zone-method-enabled .woocommerce-input-toggle{margin-top:3px}table.wc-shipping-classes .wc-shipping-zone-method-type,table.wc-shipping-zone-methods .wc-shipping-zone-method-type,table.wc-shipping-zones .wc-shipping-zone-method-type{display:block}table.wc-shipping-classes tfoot input,table.wc-shipping-classes tfoot select,table.wc-shipping-zone-methods tfoot input,table.wc-shipping-zone-methods tfoot select,table.wc-shipping-zones tfoot input,table.wc-shipping-zones tfoot select{vertical-align:middle!important}table.wc-shipping-classes tfoot .button-secondary,table.wc-shipping-zone-methods tfoot .button-secondary,table.wc-shipping-zones tfoot .button-secondary{float:left}table.wc-shipping-classes .editing .wc-shipping-zone-edit,table.wc-shipping-classes .editing .wc-shipping-zone-view,table.wc-shipping-zone-methods .editing .wc-shipping-zone-edit,table.wc-shipping-zone-methods .editing .wc-shipping-zone-view,table.wc-shipping-zones .editing .wc-shipping-zone-edit,table.wc-shipping-zones .editing .wc-shipping-zone-view{display:none}.woocommerce-input-toggle{height:16px;width:32px;border:2px solid #935687;background-color:#935687;display:inline-block;text-indent:-9999px;border-radius:10em;position:relative;margin-top:-1px;vertical-align:text-top}.woocommerce-input-toggle:before{content:"";display:block;width:16px;height:16px;background:#fff;position:absolute;top:0;left:0;border-radius:100%}.woocommerce-input-toggle.woocommerce-input-toggle--disabled{border-color:#999;background-color:#999}.woocommerce-input-toggle.woocommerce-input-toggle--disabled:before{left:auto;right:0}.woocommerce-input-toggle.woocommerce-input-toggle--loading{opacity:.5}.wc-modal-shipping-method-settings{background:#f8f8f8;padding:1em!important}.wc-modal-shipping-method-settings form .form-table{width:100%;background:#fff;margin:0 0 1.5em}.wc-modal-shipping-method-settings form .form-table tr th{width:30%;position:relative}.wc-modal-shipping-method-settings form .form-table tr th .woocommerce-help-tip{float:left;margin:-8px 0 0 -.5em;vertical-align:middle;left:0;top:50%;position:absolute}.wc-modal-shipping-method-settings form .form-table tr td input,.wc-modal-shipping-method-settings form .form-table tr td select,.wc-modal-shipping-method-settings form .form-table tr td textarea{width:50%;min-width:250px}.wc-modal-shipping-method-settings form .form-table tr td input[type=checkbox]{width:auto;min-width:16px}.wc-modal-shipping-method-settings form .form-table tr td,.wc-modal-shipping-method-settings form .form-table tr th{vertical-align:middle;margin:0;line-height:24px;padding:1em;border-bottom:1px solid #f8f8f8}.wc-modal-shipping-method-settings form .form-table:last-of-type{margin-bottom:0}.wc-backbone-modal .wc-shipping-zone-method-selector p{margin-top:0}.wc-backbone-modal .wc-shipping-zone-method-selector .wc-shipping-zone-method-description{margin:.75em 1px 0;line-height:1.5em;color:#999;font-style:italic}.wc-backbone-modal .wc-shipping-zone-method-selector select{width:100%;cursor:pointer}img.help_tip{margin:0 9px 0 0;vertical-align:middle}.postbox img.help_tip{margin-top:0}.postbox .woocommerce-help-tip{margin:0 9px 0 0}.status-disabled,.status-enabled,.status-manual{font-size:1.4em;display:block;text-indent:-9999px;position:relative;height:1em;width:1em}.status-manual::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#999}.status-enabled::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#a46497}.status-disabled::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}.woocommerce h2.woo-nav-tab-wrapper{margin-bottom:1em}.woocommerce nav.woo-nav-tab-wrapper{margin:1.5em 0 1em}.woocommerce .subsubsub{margin:-8px 0 0}.woocommerce .wc-admin-breadcrumb{margin-right:.5em}.woocommerce .wc-admin-breadcrumb a{color:#a46497}.woocommerce #template div{margin:0}.woocommerce #template div p .button{float:left;margin-right:10px;margin-top:-4px}.woocommerce #template div .editor textarea{margin-bottom:8px}.woocommerce textarea[disabled=disabled]{background:#dfdfdf!important}.woocommerce table.form-table{margin:0;position:relative;table-layout:fixed}.woocommerce table.form-table .forminp-radio ul{margin:0}.woocommerce table.form-table .forminp-radio ul li{line-height:1.4em}.woocommerce table.form-table input[type=email],.woocommerce table.form-table input[type=number],.woocommerce table.form-table input[type=text]{height:auto}.woocommerce table.form-table textarea.input-text{height:100%;min-width:150px;display:block}.woocommerce table.form-table input.regular-input,.woocommerce table.form-table input[type=date],.woocommerce table.form-table input[type=datetime-local],.woocommerce table.form-table input[type=datetime],.woocommerce table.form-table input[type=email],.woocommerce table.form-table input[type=number],.woocommerce table.form-table input[type=password],.woocommerce table.form-table input[type=tel],.woocommerce table.form-table input[type=text],.woocommerce table.form-table input[type=time],.woocommerce table.form-table input[type=url],.woocommerce table.form-table input[type=week],.woocommerce table.form-table textarea{width:400px;margin:0;padding:6px;box-sizing:border-box;vertical-align:top}.woocommerce table.form-table input[type=date],.woocommerce table.form-table input[type=datetime-local],.woocommerce table.form-table input[type=tel],.woocommerce table.form-table input[type=time],.woocommerce table.form-table input[type=week]{width:200px}.woocommerce table.form-table select{width:400px;margin:0;box-sizing:border-box;height:32px;line-height:32px;vertical-align:top}.woocommerce table.form-table input[size]{width:auto!important}.woocommerce table.form-table table input.regular-input,.woocommerce table.form-table table input[type=email],.woocommerce table.form-table table input[type=number],.woocommerce table.form-table table input[type=text],.woocommerce table.form-table table select,.woocommerce table.form-table table textarea{width:auto}.woocommerce table.form-table textarea.wide-input{width:100%}.woocommerce table.form-table .woocommerce-help-tip,.woocommerce table.form-table img.help_tip{padding:0;margin:-4px 5px 0 0;vertical-align:middle;cursor:help;line-height:1}.woocommerce table.form-table span.help_tip{cursor:help;color:#2ea2cc}.woocommerce table.form-table th{position:relative;padding-left:24px}.woocommerce table.form-table th label{position:relative;display:block}.woocommerce table.form-table th label .woocommerce-help-tip,.woocommerce table.form-table th label img.help_tip{margin:-8px 0 0 -24px;position:absolute;left:0;top:50%}.woocommerce table.form-table th label+.woocommerce-help-tip{margin:0;position:absolute;left:0;top:20px}.woocommerce table.form-table woocommerce-help-tip .select2-container{vertical-align:top;margin-bottom:3px}.woocommerce table.form-table table.widefat th{padding-left:inherit}.woocommerce table.form-table .wp-list-table .woocommerce-help-tip{float:none}.woocommerce table.form-table fieldset{margin-top:4px}.woocommerce table.form-table fieldset .woocommerce-help-tip,.woocommerce table.form-table fieldset img.help_tip{margin:-3px 5px 0 0}.woocommerce table.form-table fieldset p.description{margin-bottom:8px}.woocommerce table.form-table fieldset:first-child{margin-top:0}.woocommerce table.form-table .iris-picker{z-index:100;display:none;position:absolute;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.2)}.woocommerce table.form-table .iris-picker .ui-slider{border:0!important;margin:0!important;width:auto!important;height:auto!important;background:none transparent!important}.woocommerce table.form-table .iris-picker .ui-slider .ui-slider-handle{margin-bottom:0!important}.woocommerce table.form-table .iris-error{background-color:#ffafaf}.woocommerce table.form-table .colorpickpreview{padding:7px 0;line-height:1em;display:inline-block;width:26px;border:1px solid #ddd;font-size:14px}.woocommerce table.form-table .image_width_settings{vertical-align:middle}.woocommerce table.form-table .image_width_settings label{margin-right:10px}.woocommerce table.form-table .image_width_settings input{width:auto}.woocommerce table.form-table .wc_emails_wrapper,.woocommerce table.form-table .wc_payment_gateways_wrapper{padding:0 0 10px 15px}.woocommerce .wc-shipping-zone-settings td.forminp input,.woocommerce .wc-shipping-zone-settings td.forminp textarea{width:448px;padding:6px 11px}.woocommerce .wc-shipping-zone-settings td.forminp .select2-search input{padding:6px}.woocommerce #tabs-wrap table a.remove{margin-right:4px}.woocommerce #tabs-wrap table p{margin:0 0 4px!important;overflow:hidden;zoom:1}.woocommerce #tabs-wrap table p a.add{float:right}#wp-excerpt-editor-container{background:#fff}#product_variation-parent #parent_id{width:100%}#postimagediv img{border:1px solid #d5d5d5;max-width:100%}#woocommerce-product-images .inside{margin:0;padding:0}#woocommerce-product-images .inside .add_product_images{padding:0 12px 12px}#woocommerce-product-images .inside #product_images_container{padding:0 9px 0 0}#woocommerce-product-images .inside #product_images_container ul{margin:0;padding:0}#woocommerce-product-images .inside #product_images_container ul::after,#woocommerce-product-images .inside #product_images_container ul::before{content:' ';display:table}#woocommerce-product-images .inside #product_images_container ul::after{clear:both}#woocommerce-product-images .inside #product_images_container ul li.add,#woocommerce-product-images .inside #product_images_container ul li.image,#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder{width:80px;float:right;cursor:move;border:1px solid #d5d5d5;margin:9px 0 0 9px;background:#f7f7f7;border-radius:2px;position:relative;box-sizing:border-box}#woocommerce-product-images .inside #product_images_container ul li.add img,#woocommerce-product-images .inside #product_images_container ul li.image img,#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder img{width:100%;height:auto;display:block}#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder{border:3px dashed #ddd;position:relative}#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";font-size:2.618em;line-height:72px;color:#ddd}#woocommerce-product-images .inside #product_images_container ul ul.actions{position:absolute;top:-8px;left:-8px;padding:2px;display:none}#woocommerce-product-images .inside #product_images_container ul ul.actions li{float:left;margin:0 2px 0 0}#woocommerce-product-images .inside #product_images_container ul ul.actions li a{width:1em;height:1em;margin:0;height:0;display:block;overflow:hidden}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.tips{cursor:pointer}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.4em}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#999;background:#fff;border-radius:50%;height:1em;width:1em;line-height:1em}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete:hover::before{color:#a00}#woocommerce-product-images .inside #product_images_container ul li:hover ul.actions{display:block}#woocommerce-product-data .hndle{padding:10px}#woocommerce-product-data .hndle span{display:block;vertical-align:middle;line-height:24px}#woocommerce-product-data .hndle span span{display:inline;line-height:inherit;vertical-align:baseline}#woocommerce-product-data .hndle select{margin:0}#woocommerce-product-data .hndle label{padding-left:1em;font-size:12px;vertical-align:baseline}#woocommerce-product-data .hndle label:first-child{margin-left:1em;border-left:1px solid #dfdfdf}#woocommerce-product-data .hndle input,#woocommerce-product-data .hndle select{margin-top:-3px 0 0;vertical-align:middle}#woocommerce-product-data .hndle select{margin-right:.5em}#woocommerce-product-data>.handlediv{margin-top:4px}#woocommerce-product-data .wrap{margin:0}#woocommerce-coupon-description{padding:3px 8px;font-size:1.7em;line-height:1.42em;height:auto;width:100%;outline:0;margin:10px 0;display:block}#woocommerce-coupon-description::-webkit-input-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description::-moz-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description:-ms-input-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description:-moz-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-data .panel-wrap,#woocommerce-product-data .panel-wrap{background:#fff}#woocommerce-coupon-data .wc-metaboxes-wrapper,#woocommerce-coupon-data .woocommerce_options_panel,#woocommerce-product-data .wc-metaboxes-wrapper,#woocommerce-product-data .woocommerce_options_panel{float:right;width:80%}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios,#woocommerce-product-data .woocommerce_options_panel .wc-radios{display:block;float:right;margin:0}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios li,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios li,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios li,#woocommerce-product-data .woocommerce_options_panel .wc-radios li{display:block;padding:0 0 10px}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios li input,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios li input,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios li input,#woocommerce-product-data .woocommerce_options_panel .wc-radios li input{width:auto}#woocommerce-coupon-data .panel-wrap,#woocommerce-product-data .panel-wrap,.woocommerce .panel-wrap{overflow:hidden}#woocommerce-coupon-data ul.wc-tabs,#woocommerce-product-data ul.wc-tabs,.woocommerce ul.wc-tabs{margin:0;width:20%;float:right;line-height:1em;padding:0 0 10px;position:relative;background-color:#fafafa;border-left:1px solid #eee;box-sizing:border-box}#woocommerce-coupon-data ul.wc-tabs::after,#woocommerce-product-data ul.wc-tabs::after,.woocommerce ul.wc-tabs::after{content:'';display:block;width:100%;height:9999em;position:absolute;bottom:-9999em;right:0;background-color:#fafafa;border-left:1px solid #eee}#woocommerce-coupon-data ul.wc-tabs li,#woocommerce-product-data ul.wc-tabs li,.woocommerce ul.wc-tabs li{margin:0;padding:0;display:block;position:relative}#woocommerce-coupon-data ul.wc-tabs li a,#woocommerce-product-data ul.wc-tabs li a,.woocommerce ul.wc-tabs li a{margin:0;padding:10px;display:block;box-shadow:none;text-decoration:none;line-height:20px!important;border-bottom:1px solid #eee}#woocommerce-coupon-data ul.wc-tabs li a span,#woocommerce-product-data ul.wc-tabs li a span,.woocommerce ul.wc-tabs li a span{margin-right:.618em;margin-left:.618em}#woocommerce-coupon-data ul.wc-tabs li a::before,#woocommerce-product-data ul.wc-tabs li a::before,.woocommerce ul.wc-tabs li a::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;content:"";text-decoration:none}#woocommerce-coupon-data ul.wc-tabs li.general_options a::before,#woocommerce-product-data ul.wc-tabs li.general_options a::before,.woocommerce ul.wc-tabs li.general_options a::before{content:'\f107'}#woocommerce-coupon-data ul.wc-tabs li.inventory_options a::before,#woocommerce-product-data ul.wc-tabs li.inventory_options a::before,.woocommerce ul.wc-tabs li.inventory_options a::before{content:'\f481'}#woocommerce-coupon-data ul.wc-tabs li.shipping_options a::before,#woocommerce-product-data ul.wc-tabs li.shipping_options a::before,.woocommerce ul.wc-tabs li.shipping_options a::before{font-family:WooCommerce;content:'\e01a'}#woocommerce-coupon-data ul.wc-tabs li.linked_product_options a::before,#woocommerce-product-data ul.wc-tabs li.linked_product_options a::before,.woocommerce ul.wc-tabs li.linked_product_options a::before{content:'\f103'}#woocommerce-coupon-data ul.wc-tabs li.attribute_options a::before,#woocommerce-product-data ul.wc-tabs li.attribute_options a::before,.woocommerce ul.wc-tabs li.attribute_options a::before{content:'\f175'}#woocommerce-coupon-data ul.wc-tabs li.advanced_options a::before,#woocommerce-product-data ul.wc-tabs li.advanced_options a::before,.woocommerce ul.wc-tabs li.advanced_options a::before{font-family:Dashicons;content:'\f111'}#woocommerce-coupon-data ul.wc-tabs li.variations_options a::before,#woocommerce-product-data ul.wc-tabs li.variations_options a::before,.woocommerce ul.wc-tabs li.variations_options a::before{content:'\f509'}#woocommerce-coupon-data ul.wc-tabs li.usage_restriction_options a::before,#woocommerce-product-data ul.wc-tabs li.usage_restriction_options a::before,.woocommerce ul.wc-tabs li.usage_restriction_options a::before{font-family:WooCommerce;content:'\e602'}#woocommerce-coupon-data ul.wc-tabs li.usage_limit_options a::before,#woocommerce-product-data ul.wc-tabs li.usage_limit_options a::before,.woocommerce ul.wc-tabs li.usage_limit_options a::before{font-family:WooCommerce;content:'\e601'}#woocommerce-coupon-data ul.wc-tabs li.general_coupon_data a::before,#woocommerce-product-data ul.wc-tabs li.general_coupon_data a::before,.woocommerce ul.wc-tabs li.general_coupon_data a::before{font-family:WooCommerce;content:'\e600'}#woocommerce-coupon-data ul.wc-tabs li.active a,#woocommerce-product-data ul.wc-tabs li.active a,.woocommerce ul.wc-tabs li.active a{color:#555;position:relative;background-color:#eee}.woocommerce_page_wc-settings input[type=email],.woocommerce_page_wc-settings input[type=url]{direction:rtl}.woocommerce_page_wc-settings .shippingrows th.check-column{padding-top:20px}.woocommerce_page_wc-settings .shippingrows tfoot th{padding-right:10px}.woocommerce_page_wc-settings .shippingrows .add.button::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none}.woocommerce_page_wc-settings h3.wc-settings-sub-title{font-size:1.2em}#woocommerce-coupon-data .inside,#woocommerce-order-data .inside,#woocommerce-order-downloads .inside,#woocommerce-product-data .inside,#woocommerce-product-type-options .inside{margin:0;padding:0}.panel,.woocommerce_options_panel{padding:9px;color:#555}.panel .form-field .woocommerce-help-tip,.woocommerce_options_panel .form-field .woocommerce-help-tip{font-size:1.4em}.panel,.woocommerce_page_settings .woocommerce_options_panel{padding:0}#woocommerce-product-specs .inside,#woocommerce-product-type-options .panel{margin:0;padding:9px}#woocommerce-product-type-options .panel p,.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p{margin:0 0 9px;font-size:12px;padding:5px 9px;line-height:24px}#woocommerce-product-type-options .panel p::after,.woocommerce_options_panel fieldset.form-field::after,.woocommerce_options_panel p::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce_options_panel .checkbox,.woocommerce_variable_attributes .checkbox{width:auto;margin:4px 0!important;vertical-align:middle;float:right}.woocommerce_options_panel .downloadable_files table,.woocommerce_variations .downloadable_files table{width:100%;padding:0!important}.woocommerce_options_panel .downloadable_files table th,.woocommerce_variations .downloadable_files table th{padding:7px 7px 7px 0!important}.woocommerce_options_panel .downloadable_files table th.sort,.woocommerce_variations .downloadable_files table th.sort{width:17px;padding:7px!important}.woocommerce_options_panel .downloadable_files table th .woocommerce-help-tip,.woocommerce_variations .downloadable_files table th .woocommerce-help-tip{font-size:1.1em;margin-right:0}.woocommerce_options_panel .downloadable_files table td,.woocommerce_variations .downloadable_files table td{vertical-align:middle!important;padding:4px 7px 4px 0!important;position:relative}.woocommerce_options_panel .downloadable_files table td:last-child,.woocommerce_variations .downloadable_files table td:last-child{padding-left:7px!important}.woocommerce_options_panel .downloadable_files table td input.input_text,.woocommerce_variations .downloadable_files table td input.input_text{width:100%;float:none;min-width:0;margin:1px 0}.woocommerce_options_panel .downloadable_files table td .upload_file_button,.woocommerce_variations .downloadable_files table td .upload_file_button{width:auto;float:left;cursor:pointer}.woocommerce_options_panel .downloadable_files table td .delete,.woocommerce_variations .downloadable_files table td .delete{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.2em}.woocommerce_options_panel .downloadable_files table td .delete::before,.woocommerce_variations .downloadable_files table td .delete::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#999}.woocommerce_options_panel .downloadable_files table td .delete:hover::before,.woocommerce_variations .downloadable_files table td .delete:hover::before{color:#a00}.woocommerce_options_panel .downloadable_files table td.sort,.woocommerce_variations .downloadable_files table td.sort{width:17px;cursor:move;font-size:15px;text-align:center;background:#f9f9f9;padding-left:7px!important}.woocommerce_options_panel .downloadable_files table td.sort::before,.woocommerce_variations .downloadable_files table td.sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:right;height:100%}.woocommerce_options_panel .downloadable_files table td.sort:hover::before,.woocommerce_variations .downloadable_files table td.sort:hover::before{color:#333}.woocommerce_variation h3 .sort{width:17px;height:26px;cursor:move;float:left;font-size:15px;font-weight:400;margin-left:.5em;visibility:hidden;text-align:center;vertical-align:middle}.woocommerce_variation h3 .sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:28px;color:#999;display:block;width:17px;float:right;height:100%}.woocommerce_variation h3 .sort:hover::before{color:#777}.woocommerce_variation h3:hover .sort,.woocommerce_variation.ui-sortable-helper .sort{visibility:visible}.woocommerce_options_panel{min-height:175px;box-sizing:border-box}.woocommerce_options_panel .downloadable_files{padding:0 162px 0 9px;position:relative;margin:9px 0}.woocommerce_options_panel .downloadable_files label{position:absolute;right:0;margin:0 12px 0 0;line-height:24px}.woocommerce_options_panel p{margin:9px 0}.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p.form-field{padding:5px 162px 5px 20px!important}.woocommerce_options_panel .sale_price_dates_fields .short:first-of-type{margin-bottom:1em}.woocommerce_options_panel .sale_price_dates_fields .short:nth-of-type(2){clear:right}.woocommerce_options_panel label,.woocommerce_options_panel legend{float:right;width:150px;padding:0;margin:0 -150px 0 0}.woocommerce_options_panel label .req,.woocommerce_options_panel legend .req{font-weight:700;font-style:normal;color:#a00}.woocommerce_options_panel .description{padding:0;margin:0 7px 0 0;clear:none;display:inline}.woocommerce_options_panel .description-block{margin-right:0;display:block}.woocommerce_options_panel input,.woocommerce_options_panel select,.woocommerce_options_panel textarea{margin:0}.woocommerce_options_panel textarea{float:right;height:3.5em;line-height:1.5em;vertical-align:top}.woocommerce_options_panel input[type=email],.woocommerce_options_panel input[type=number],.woocommerce_options_panel input[type=password],.woocommerce_options_panel input[type=text]{width:50%;float:right}.woocommerce_options_panel input.button{width:auto;margin-right:8px}.woocommerce_options_panel select{float:right}.woocommerce_options_panel .short,.woocommerce_options_panel input[type=email].short,.woocommerce_options_panel input[type=number].short,.woocommerce_options_panel input[type=password].short,.woocommerce_options_panel input[type=text].short{width:50%}.woocommerce_options_panel .sized{width:auto!important;margin-left:6px}.woocommerce_options_panel .options_group{border-top:1px solid #fff;border-bottom:1px solid #eee}.woocommerce_options_panel .options_group:first-child{border-top:0}.woocommerce_options_panel .options_group:last-child{border-bottom:0}.woocommerce_options_panel .options_group fieldset{margin:9px 0;font-size:12px;padding:5px 9px;line-height:24px}.woocommerce_options_panel .options_group fieldset label{width:auto;float:none}.woocommerce_options_panel .options_group fieldset ul{float:right;width:50%;margin:0;padding:0}.woocommerce_options_panel .options_group fieldset ul li{margin:0;width:auto}.woocommerce_options_panel .options_group fieldset ul li input{width:auto;float:none;margin-left:4px}.woocommerce_options_panel .options_group fieldset ul.wc-radios label{margin-right:0}.woocommerce_options_panel .dimensions_field .wrap{display:block;width:50%}.woocommerce_options_panel .dimensions_field .wrap input{width:30.75%;margin-left:3.8%}.woocommerce_options_panel .dimensions_field .wrap .last{margin-left:0}.woocommerce_options_panel.padded{padding:1em}.woocommerce_options_panel .select2-container{float:right}#woocommerce-product-data input.dp-applied{float:right}#grouped_product_options,#simple_product_options,#virtual_product_options{padding:12px;font-style:italic;color:#666}.wc-metaboxes-wrapper .toolbar{margin:0!important;border-top:1px solid #fff;border-bottom:1px solid #eee;padding:9px 12px!important}.wc-metaboxes-wrapper .toolbar:first-child{border-top:0}.wc-metaboxes-wrapper .toolbar:last-child{border-bottom:0}.wc-metaboxes-wrapper .toolbar .add_variation{float:left;margin-right:5px}.wc-metaboxes-wrapper .toolbar .cancel-variation-changes,.wc-metaboxes-wrapper .toolbar .save-variation-changes{float:right;margin-left:5px}.wc-metaboxes-wrapper p.toolbar{overflow:hidden;zoom:1}.wc-metaboxes-wrapper .expand-close{margin-left:2px;color:#777;font-size:12px;font-style:italic}.wc-metaboxes-wrapper .expand-close a{background:0 0;padding:0;font-size:12px;text-decoration:none}.wc-metaboxes-wrapper#product_attributes .expand-close{float:left;line-height:28px}.wc-metaboxes-wrapper .fr,.wc-metaboxes-wrapper button.add_variable_attribute{float:left;margin:0 6px 0 0}.wc-metaboxes-wrapper .wc-metaboxes{border-bottom:1px solid #eee}.wc-metaboxes-wrapper .wc-metabox-sortable-placeholder{border-color:#bbb;background-color:#f5f5f5;margin-bottom:9px;border-width:1px;border-style:dashed}.wc-metaboxes-wrapper .wc-metabox{background:#fff;border-bottom:1px solid #eee;margin:0!important}.wc-metaboxes-wrapper .wc-metabox select{font-weight:400}.wc-metaboxes-wrapper .wc-metabox:last-of-type{border-bottom:0}.wc-metaboxes-wrapper .wc-metabox .handlediv{width:27px}.wc-metaboxes-wrapper .wc-metabox .handlediv::before{content:'\f142'!important;cursor:pointer;display:inline-block;font:400 20px/1 Dashicons;line-height:.5!important;padding:8px 10px;position:relative;left:12px;top:0}.wc-metaboxes-wrapper .wc-metabox.closed{border-radius:3px}.wc-metaboxes-wrapper .wc-metabox.closed .handlediv::before{content:'\f140'!important}.wc-metaboxes-wrapper .wc-metabox.closed h3{border:0}.wc-metaboxes-wrapper .wc-metabox h3{margin:0!important;padding:.75em 1em .75em .75em!important;font-size:1em!important;overflow:hidden;zoom:1;cursor:move}.wc-metaboxes-wrapper .wc-metabox h3 a.delete,.wc-metaboxes-wrapper .wc-metabox h3 button{float:left}.wc-metaboxes-wrapper .wc-metabox h3 a.delete{color:red;font-weight:400;line-height:26px;text-decoration:none;position:relative;visibility:hidden}.wc-metaboxes-wrapper .wc-metabox h3 strong{font-weight:400;line-height:26px;font-weight:700}.wc-metaboxes-wrapper .wc-metabox h3 select{font-family:sans-serif;max-width:20%;margin:.25em 0 .25em .25em}.wc-metaboxes-wrapper .wc-metabox h3 .handlediv{background-position:6px 5px!important;visibility:hidden;height:26px}.wc-metaboxes-wrapper .wc-metabox h3.fixed{cursor:pointer!important}.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3{cursor:pointer;padding:.5em 1em .5em .75em!important}.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 .handlediv,.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 .sort,.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 a.delete{margin-top:.25em}.wc-metaboxes-wrapper .wc-metabox h3:hover .handlediv,.wc-metaboxes-wrapper .wc-metabox h3:hover a.delete,.wc-metaboxes-wrapper .wc-metabox.ui-sortable-helper .handlediv,.wc-metaboxes-wrapper .wc-metabox.ui-sortable-helper a.delete{visibility:visible}.wc-metaboxes-wrapper .wc-metabox table{width:100%;position:relative;background-color:#fdfdfd;padding:1em;border-top:1px solid #eee}.wc-metaboxes-wrapper .wc-metabox table td{text-align:right;padding:0 0 1em 6px;vertical-align:top;border:0}.wc-metaboxes-wrapper .wc-metabox table td label{text-align:right;display:block;line-height:21px}.wc-metaboxes-wrapper .wc-metabox table td input{float:right;min-width:200px}.wc-metaboxes-wrapper .wc-metabox table td input,.wc-metaboxes-wrapper .wc-metabox table td textarea{width:100%;margin:0;display:block;font-size:14px;padding:4px;color:#555}.wc-metaboxes-wrapper .wc-metabox table td .select2-container,.wc-metaboxes-wrapper .wc-metabox table td select{width:100%!important}.wc-metaboxes-wrapper .wc-metabox table td input.short{width:200px}.wc-metaboxes-wrapper .wc-metabox table td input.checkbox{width:16px;min-width:inherit;vertical-align:text-bottom;display:inline-block;float:none}.wc-metaboxes-wrapper .wc-metabox table td.attribute_name{width:200px}.wc-metaboxes-wrapper .wc-metabox table .minus,.wc-metaboxes-wrapper .wc-metabox table .plus{margin-top:6px}.wc-metaboxes-wrapper .wc-metabox table .fl{float:right}.wc-metaboxes-wrapper .wc-metabox table .fr{float:left}.variations-pagenav{float:left;line-height:24px}.variations-pagenav .displaying-num{color:#777;font-size:12px;font-style:italic}.variations-pagenav a{padding:0 10px 3px;background:rgba(0,0,0,.05);font-size:16px;font-weight:400;text-decoration:none}.variations-pagenav a.disabled,.variations-pagenav a.disabled:active,.variations-pagenav a.disabled:focus,.variations-pagenav a.disabled:hover{color:#a0a5aa;background:rgba(0,0,0,.05)}.variations-defaults{float:right}.variations-defaults select{margin:.25em 0 .25em .25em}.woocommerce_variable_attributes{background-color:#fdfdfd;border-top:1px solid #eee}.woocommerce_variable_attributes .data{padding:1em 2em}.woocommerce_variable_attributes .data::after,.woocommerce_variable_attributes .data::before{content:' ';display:table}.woocommerce_variable_attributes .data::after{clear:both}.woocommerce_variable_attributes .upload_image_button{display:block;width:64px;height:64px;float:right;margin-left:20px;position:relative;cursor:pointer}.woocommerce_variable_attributes .upload_image_button img{width:100%;height:auto;display:none}.woocommerce_variable_attributes .upload_image_button::before{content:'\f128';font-family:Dashicons;position:absolute;top:0;right:0;left:0;bottom:0;text-align:center;line-height:64px;font-size:64px;font-weight:400;-webkit-font-smoothing:antialiased}.woocommerce_variable_attributes .upload_image_button.remove img{display:block}.woocommerce_variable_attributes .upload_image_button.remove::before{content:'\f335';display:none}.woocommerce_variable_attributes .upload_image_button.remove:hover::before{display:block}.woocommerce_variable_attributes .options{border:1px solid #eee;border-width:1px 0;padding:.25em 0}.woocommerce_variable_attributes .options label{display:inline-block;padding:4px 0 2px 1em}.woocommerce_variable_attributes .options input[type=checkbox]{margin:0 .5em 0 5px!important;vertical-align:middle}.form-row label{display:inline-block}.form-row .woocommerce-help-tip{float:left}.form-row input[type=number],.form-row input[type=text],.form-row select,.form-row textarea{width:100%;vertical-align:middle;margin:2px 0 0;padding:5px}.form-row select{height:30px;line-height:30px}.form-row.dimensions_field .wrap{clear:right;display:block}.form-row.dimensions_field input{width:33%;float:right;vertical-align:middle}.form-row.dimensions_field input:last-of-type{margin-left:0;width:34%}.form-row.form-row-first,.form-row.form-row-last{width:48%;float:left}.form-row.form-row-first{clear:both;float:right}.form-row.form-row-full{clear:both}.tips{cursor:help;text-decoration:none}img.tips{padding:5px 0 0}#tiptip_holder{display:none;z-index:8675309;position:absolute;top:0;left:0}#tiptip_holder.tip_top{padding-bottom:5px}#tiptip_holder.tip_top #tiptip_arrow_inner{margin-top:-7px;margin-right:-6px;border-top-color:#333}#tiptip_holder.tip_bottom{padding-top:5px}#tiptip_holder.tip_bottom #tiptip_arrow_inner{margin-top:-5px;margin-right:-6px;border-bottom-color:#333}#tiptip_holder.tip_right{padding-right:5px}#tiptip_holder.tip_right #tiptip_arrow_inner{margin-top:-6px;margin-right:-5px;border-left-color:#333}#tiptip_holder.tip_left{padding-left:5px}#tiptip_holder.tip_left #tiptip_arrow_inner{margin-top:-6px;margin-right:-7px;border-right-color:#333}#tiptip_content,.chart-tooltip,.wc_error_tip{color:#fff;font-size:.8em;max-width:150px;background:#333;text-align:center;border-radius:3px;padding:.618em 1em;box-shadow:0 1px 3px rgba(0,0,0,.2)}#tiptip_content code,.chart-tooltip code,.wc_error_tip code{padding:1px;background:#888}#tiptip_arrow,#tiptip_arrow_inner{position:absolute;border-color:transparent;border-style:solid;border-width:6px;height:0;width:0}#tiptip_arrow{right:50%;margin-right:-6px}.wc_error_tip{max-width:20em;line-height:1.8em;position:absolute;white-space:normal;background:#d82223;margin:1.5em -1em 0 1px;z-index:9999999}.wc_error_tip::after{content:'';display:block;border:8px solid #d82223;border-left-color:transparent;border-right-color:transparent;border-top-color:transparent;position:absolute;top:-3px;right:50%;margin:-1em -3px 0 0}img.ui-datepicker-trigger{vertical-align:middle;margin-top:-1px;cursor:pointer}.wc-metabox-content img.ui-datepicker-trigger,.woocommerce_options_panel img.ui-datepicker-trigger{float:right;margin-left:8px;margin-top:4px;margin-right:4px}#ui-datepicker-div{display:none}.woocommerce-reports-remove-filter{color:red;text-decoration:none}.woocommerce-reports-wide.woocommerce-reports-wrap,.woocommerce-reports-wrap.woocommerce-reports-wrap{margin-right:300px;padding-top:18px}.woocommerce-reports-wide.halved,.woocommerce-reports-wrap.halved{margin:0;overflow:hidden;zoom:1}.woocommerce-reports-wide .widefat th,.woocommerce-reports-wrap .widefat th{padding:7px}.woocommerce-reports-wide .widefat td,.woocommerce-reports-wrap .widefat td{vertical-align:top;padding:7px}.woocommerce-reports-wide .widefat td .description,.woocommerce-reports-wrap .widefat td .description{margin:4px 0 0}.woocommerce-reports-wide .postbox::after,.woocommerce-reports-wrap .postbox::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce-reports-wide .postbox h3,.woocommerce-reports-wrap .postbox h3{cursor:default!important}.woocommerce-reports-wide .postbox .inside,.woocommerce-reports-wrap .postbox .inside{padding:10px;margin:0!important}.woocommerce-reports-wide .postbox div.stats_range,.woocommerce-reports-wide .postbox h3.stats_range,.woocommerce-reports-wrap .postbox div.stats_range,.woocommerce-reports-wrap .postbox h3.stats_range{border-bottom-color:#dfdfdf;margin:0;padding:0!important}.woocommerce-reports-wide .postbox div.stats_range .export_csv,.woocommerce-reports-wide .postbox h3.stats_range .export_csv,.woocommerce-reports-wrap .postbox div.stats_range .export_csv,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv{float:left;line-height:26px;border-right:1px solid #dfdfdf;padding:10px;display:block;text-decoration:none}.woocommerce-reports-wide .postbox div.stats_range .export_csv::before,.woocommerce-reports-wide .postbox h3.stats_range .export_csv::before,.woocommerce-reports-wrap .postbox div.stats_range .export_csv::before,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;content:"";text-decoration:none;margin-left:4px}.woocommerce-reports-wide .postbox div.stats_range ul,.woocommerce-reports-wide .postbox h3.stats_range ul,.woocommerce-reports-wrap .postbox div.stats_range ul,.woocommerce-reports-wrap .postbox h3.stats_range ul{list-style:none outside;margin:0;padding:0;zoom:1;background:#f5f5f5;border-bottom:1px solid #ccc}.woocommerce-reports-wide .postbox div.stats_range ul::after,.woocommerce-reports-wide .postbox div.stats_range ul::before,.woocommerce-reports-wide .postbox h3.stats_range ul::after,.woocommerce-reports-wide .postbox h3.stats_range ul::before,.woocommerce-reports-wrap .postbox div.stats_range ul::after,.woocommerce-reports-wrap .postbox div.stats_range ul::before,.woocommerce-reports-wrap .postbox h3.stats_range ul::after,.woocommerce-reports-wrap .postbox h3.stats_range ul::before{content:' ';display:table}.woocommerce-reports-wide .postbox div.stats_range ul::after,.woocommerce-reports-wide .postbox h3.stats_range ul::after,.woocommerce-reports-wrap .postbox div.stats_range ul::after,.woocommerce-reports-wrap .postbox h3.stats_range ul::after{clear:both}.woocommerce-reports-wide .postbox div.stats_range ul li,.woocommerce-reports-wide .postbox h3.stats_range ul li,.woocommerce-reports-wrap .postbox div.stats_range ul li,.woocommerce-reports-wrap .postbox h3.stats_range ul li{float:right;margin:0;padding:0;line-height:26px;font-weight:700;font-size:14px}.woocommerce-reports-wide .postbox div.stats_range ul li a,.woocommerce-reports-wide .postbox h3.stats_range ul li a,.woocommerce-reports-wrap .postbox div.stats_range ul li a,.woocommerce-reports-wrap .postbox h3.stats_range ul li a{border-left:1px solid #dfdfdf;padding:10px;display:block;text-decoration:none}.woocommerce-reports-wide .postbox div.stats_range ul li.active,.woocommerce-reports-wide .postbox h3.stats_range ul li.active,.woocommerce-reports-wrap .postbox div.stats_range ul li.active,.woocommerce-reports-wrap .postbox h3.stats_range ul li.active{background:#fff;box-shadow:0 4px 0 0 #fff}.woocommerce-reports-wide .postbox div.stats_range ul li.active a,.woocommerce-reports-wide .postbox h3.stats_range ul li.active a,.woocommerce-reports-wrap .postbox div.stats_range ul li.active a,.woocommerce-reports-wrap .postbox h3.stats_range ul li.active a{color:#777}.woocommerce-reports-wide .postbox div.stats_range ul li.custom,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom{padding:9px 10px;vertical-align:middle}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form{display:inline;margin:0}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form input.range_datepicker{padding:0;margin:0 0 0 10px;background:0 0;border:0;color:#777;text-align:center;box-shadow:none}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form input.range_datepicker.from{margin-left:0}.woocommerce-reports-wide .postbox .chart-with-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar{padding:12px 249px 12px 12px;margin:0!important}.woocommerce-reports-wide .postbox .chart-with-sidebar .chart-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar .chart-sidebar{width:225px;margin-right:-237px;float:right}.woocommerce-reports-wide .postbox .chart-widgets,.woocommerce-reports-wrap .postbox .chart-widgets{margin:0;padding:0}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget{margin:0 0 1em;background:#fafafa;border:1px solid #dfdfdf}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget h4,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget h4{background:#fff;border:1px solid #dfdfdf;border-right-width:0;border-left-width:0;padding:10px;margin:0;color:#2ea2cc;border-top-width:0;background-image:-webkit-linear-gradient(bottom,#ececec,#f9f9f9);background-image:linear-gradient(to top,#ececec,#f9f9f9)}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget h4.section_title:hover,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget h4.section_title:hover{color:#a00}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title{cursor:pointer}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title span,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title span{display:block}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title span::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title span::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none;float:left;font-size:.9em;line-height:1.618}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title.open,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title.open{color:#333}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title.open span::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title.open span::after{display:none}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section{border-bottom:1px solid #dfdfdf}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section .select2-container,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section .select2-container{width:100%!important}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section:last-of-type,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section:last-of-type{border-radius:0 0 3px 3px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table{width:100%}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td{padding:7px 10px;vertical-align:top;border-top:1px solid #e5e5e5;line-height:1.4em}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table tr:first-child td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table tr:first-child td{border-top:0}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.count,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.count{background:#f5f5f5}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.name,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.name{max-width:175px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.name a,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.name a{word-wrap:break-word}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.sparkline,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.sparkline{vertical-align:middle}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table .wc_sparkline,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table .wc_sparkline{width:32px;height:1em;display:block;float:left}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table tr.active td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table tr.active td{background:#f5f5f5}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget form,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget p,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget form,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget p{margin:0;padding:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget form .submit,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget p .submit,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget form .submit,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget p .submit{margin-top:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget #product_ids,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget #product_ids{width:100%}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .select_all,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .select_none,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .select_all,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .select_none{float:left;color:#999;margin-right:4px;margin-top:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .description,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .description{margin-right:.5em;font-weight:400;opacity:.8}.woocommerce-reports-wide .postbox .chart-legend,.woocommerce-reports-wrap .postbox .chart-legend{list-style:none outside;margin:0 0 1em;padding:0;border:1px solid #dfdfdf;border-left-width:0;border-bottom-width:0;background:#fff}.woocommerce-reports-wide .postbox .chart-legend li,.woocommerce-reports-wrap .postbox .chart-legend li{border-left:5px solid #aaa;color:#aaa;padding:1em;display:block;margin:0;-webkit-transition:all ease .5s;transition:all ease .5s;box-shadow:inset 0 -1px 0 0 #dfdfdf}.woocommerce-reports-wide .postbox .chart-legend li strong,.woocommerce-reports-wrap .postbox .chart-legend li strong{font-size:1.618em;line-height:1.2em;color:#464646;font-weight:400;display:block;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif}.woocommerce-reports-wide .postbox .chart-legend li strong del,.woocommerce-reports-wrap .postbox .chart-legend li strong del{color:#e74c3c;font-weight:400}.woocommerce-reports-wide .postbox .chart-legend li:hover,.woocommerce-reports-wrap .postbox .chart-legend li:hover{box-shadow:inset 0 -1px 0 0 #dfdfdf,inset -300px 0 0 rgba(156,93,144,.1);border-left:5px solid #9c5d90!important;padding-right:1.5em;color:#9c5d90}.woocommerce-reports-wide .postbox .pie-chart-legend,.woocommerce-reports-wrap .postbox .pie-chart-legend{margin:12px 0 0;overflow:hidden}.woocommerce-reports-wide .postbox .pie-chart-legend li,.woocommerce-reports-wrap .postbox .pie-chart-legend li{float:right;margin:0;padding:6px 0 0;border-top:4px solid #999;text-align:center;box-sizing:border-box;width:50%}.woocommerce-reports-wide .postbox .stat,.woocommerce-reports-wrap .postbox .stat{font-size:1.5em!important;font-weight:700;text-align:center}.woocommerce-reports-wide .postbox .chart-placeholder,.woocommerce-reports-wrap .postbox .chart-placeholder{width:100%;height:650px;overflow:hidden;position:relative}.woocommerce-reports-wide .postbox .chart-prompt,.woocommerce-reports-wrap .postbox .chart-prompt{line-height:650px;margin:0;color:#999;font-size:1.2em;font-style:italic;text-align:center}.woocommerce-reports-wide .postbox .chart-container,.woocommerce-reports-wrap .postbox .chart-container{background:#fff;padding:12px;position:relative;border:1px solid #dfdfdf;border-radius:3px}.woocommerce-reports-wide .postbox .main .chart-legend,.woocommerce-reports-wrap .postbox .main .chart-legend{margin-top:12px}.woocommerce-reports-wide .postbox .main .chart-legend li,.woocommerce-reports-wrap .postbox .main .chart-legend li{border-left:0;margin:0 0 0 8px;float:right;border-top:4px solid #aaa}.woocommerce-reports-wide .woocommerce-reports-main,.woocommerce-reports-wrap .woocommerce-reports-main{float:right;min-width:100%}.woocommerce-reports-wide .woocommerce-reports-main table td,.woocommerce-reports-wrap .woocommerce-reports-main table td{padding:9px}.woocommerce-reports-wide .woocommerce-reports-sidebar,.woocommerce-reports-wrap .woocommerce-reports-sidebar{display:inline;width:281px;margin-right:-300px;clear:both;float:right}.woocommerce-reports-wide .woocommerce-reports-left,.woocommerce-reports-wrap .woocommerce-reports-left{width:49.5%;float:right}.woocommerce-reports-wide .woocommerce-reports-right,.woocommerce-reports-wrap .woocommerce-reports-right{width:49.5%;float:left}.woocommerce-wide-reports-wrap{padding-bottom:11px}.woocommerce-wide-reports-wrap .widefat .export-data{float:left}.woocommerce-wide-reports-wrap .widefat td,.woocommerce-wide-reports-wrap .widefat th{vertical-align:middle;padding:7px}form.report_filters p{vertical-align:middle}form.report_filters div,form.report_filters input,form.report_filters label{vertical-align:middle}.chart-tooltip{position:absolute;display:none;line-height:1}table.bar_chart{width:100%}table.bar_chart thead th{text-align:right;color:#ccc;padding:6px 0}table.bar_chart tbody th{padding:6px 0;width:25%;text-align:right!important;font-weight:400!important;border-bottom:1px solid #fee}table.bar_chart tbody td{text-align:left;line-height:24px;padding:6px 0 6px 6px;border-bottom:1px solid #fee}table.bar_chart tbody td span{color:#8a4b75;display:block}table.bar_chart tbody td span.alt{color:#47a03e;margin-top:6px}table.bar_chart tbody td.bars{position:relative;text-align:right;padding:6px 0 6px 6px;border-bottom:1px solid #fee}table.bar_chart tbody td.bars a,table.bar_chart tbody td.bars span{text-decoration:none;clear:both;background:#8a4b75;float:right;display:block;line-height:24px;height:24px;border-radius:3px}table.bar_chart tbody td.bars span.alt{clear:both;background:#47a03e}table.bar_chart tbody td.bars span.alt span{margin:0;color:#c5dec2!important;text-shadow:0 1px 0 #47a03e;background:0 0}.post-type-shop_order .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}.post-type-shop_coupon .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}.post-type-product .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState--api .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState--webhooks .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState{text-align:center;padding:5em 0 0}.woocommerce-BlankState .woocommerce-BlankState-message{color:#aaa;margin:0 auto 1.5em;line-height:1.5em;font-size:1.2em;max-width:500px}.woocommerce-BlankState .woocommerce-BlankState-message::before{color:#ddd;text-shadow:0 -1px 1px rgba(0,0,0,.2),0 1px 0 rgba(255,255,255,.8);font-size:8em;display:block;position:relative!important;top:auto;right:auto;line-height:1em;margin:0 0 .1875em}.woocommerce-BlankState .woocommerce-BlankState-cta{font-size:1.2em;padding:.75em 1.5em;margin:0 .25em;height:auto;display:inline-block!important}@media only screen and (max-width:1280px){#order_data .order_data_column{width:48%}#order_data .order_data_column:first-child{width:100%}.woocommerce_options_panel .description{display:block;clear:both;margin-right:0}.woocommerce_options_panel .dimensions_field .wrap,.woocommerce_options_panel .short,.woocommerce_options_panel input[type=email].short,.woocommerce_options_panel input[type=number].short,.woocommerce_options_panel input[type=password].short,.woocommerce_options_panel input[type=text].short{width:80%}.woocommerce_options_panel .downloadable_files,.woocommerce_variations .downloadable_files{padding:0;clear:both}.woocommerce_options_panel .downloadable_files label,.woocommerce_variations .downloadable_files label{position:static}.woocommerce_options_panel .downloadable_files table,.woocommerce_variations .downloadable_files table{margin:0 12px 24px;width:94%}.woocommerce_options_panel .downloadable_files table .sort,.woocommerce_variations .downloadable_files table .sort{visibility:hidden}.woocommerce_options_panel .woocommerce_variable_attributes .downloadable_files table,.woocommerce_variations .woocommerce_variable_attributes .downloadable_files table{margin:0 0 1em;width:100%}}@media only screen and (max-width:900px){#woocommerce-coupon-data ul.coupon_data_tabs,#woocommerce-product-data .wc-tabs-back,#woocommerce-product-data ul.product_data_tabs{width:10%}#woocommerce-coupon-data .wc-metaboxes-wrapper,#woocommerce-coupon-data .woocommerce_options_panel,#woocommerce-product-data .wc-metaboxes-wrapper,#woocommerce-product-data .woocommerce_options_panel{width:90%}#woocommerce-coupon-data ul.coupon_data_tabs li a,#woocommerce-product-data ul.product_data_tabs li a{position:relative;text-indent:-999px;padding:10px}#woocommerce-coupon-data ul.coupon_data_tabs li a::before,#woocommerce-product-data ul.product_data_tabs li a::before{position:absolute;top:0;left:0;bottom:0;right:0;text-indent:0;text-align:center;line-height:40px;width:100%;height:40px}}@media only screen and (max-width:782px){#wp-excerpt-media-buttons a{font-size:16px;line-height:37px;height:39px;padding:0 15px 0 20px}#wp-excerpt-editor-tools{padding-top:20px;padding-left:15px;overflow:hidden;margin-bottom:-1px}#woocommerce-product-data .checkbox{width:25px}.variations-pagenav{float:none;text-align:center;font-size:18px}.variations-pagenav .displaying-num{font-size:16px}.variations-pagenav a{padding:8px 20px 11px;font-size:18px}.variations-pagenav select{padding:0 20px}.variations-defaults{float:none;text-align:center;margin-top:10px}.post-type-product .wp-list-table .column-thumb{display:none;text-align:right;padding-bottom:0}.post-type-product .wp-list-table .column-thumb::before{display:none!important}.post-type-product .wp-list-table .column-thumb img{max-width:32px}.post-type-product .wp-list-table .is-expanded td:not(.hidden){overflow:visible}.post-type-product .wp-list-table .toggle-row{top:-28px}.post-type-shop_order .wp-list-table .column-customer_message,.post-type-shop_order .wp-list-table .column-order_notes{text-align:inherit}.post-type-shop_order .wp-list-table .column-order_notes .note-on{font-size:1.3em;margin:0}.post-type-shop_order .wp-list-table .is-expanded td:not(.hidden){overflow:visible}.post-type-shop_order .wp-list-table .toggle-row{top:-15px}}@media only screen and (max-width:500px){.woocommerce_options_panel label,.woocommerce_options_panel legend{float:none;width:auto;display:block;margin:0}.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p.form-field{padding:5px 20px!important}.addons-wcs-banner-block{-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}.wc_addons_wrap .addons-wcs-banner-block{padding:40px}.wc_addons_wrap .addons-wcs-banner-block-image{padding:1em;text-align:center;width:100%;padding:2em 0;margin:0}.wc_addons_wrap .addons-wcs-banner-block-image .addons-img{margin:0}}.wc-backbone-modal *{box-sizing:border-box}.wc-backbone-modal .wc-backbone-modal-content{position:fixed;background:#fff;z-index:100000;right:50%;top:50%;-webkit-transform:translate(50%,-50%);-ms-transform:translate(50%,-50%);transform:translate(50%,-50%);max-width:100%;min-width:500px}.wc-backbone-modal .wc-backbone-modal-content article{overflow:auto}.wc-backbone-modal.wc-backbone-modal-shipping-method-settings .wc-backbone-modal-content{width:75%;min-width:500px}.wc-backbone-modal .select2-container{width:100%!important}@media screen and (max-width:782px){.wc-backbone-modal .wc-backbone-modal-content{width:100%;height:100%;min-width:100%}}.wc-backbone-modal-backdrop{position:fixed;top:0;right:0;left:0;bottom:0;min-height:360px;background:#000;opacity:.7;z-index:99900}.wc-backbone-modal-main{padding-bottom:55px}.wc-backbone-modal-main article,.wc-backbone-modal-main header{display:block;position:relative}.wc-backbone-modal-main .wc-backbone-modal-header{height:auto;background:#fcfcfc;padding:1em 1.5em;border-bottom:1px solid #ddd}.wc-backbone-modal-main .wc-backbone-modal-header h1{margin:0;font-size:18px;font-weight:700;line-height:1.5em}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link{cursor:pointer;color:#777;height:54px;width:54px;padding:0;position:absolute;top:0;left:0;text-align:center;border:0;border-right:1px solid #ddd;background-color:transparent;-webkit-transition:color .1s ease-in-out,background .1s ease-in-out;transition:color .1s ease-in-out,background .1s ease-in-out}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link::before{font:normal 22px/50px dashicons!important;color:#666;display:block;content:'\f335';font-weight:300}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:focus,.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:hover{background:#ddd;border-color:#ccc;color:#000}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:focus{outline:0}.wc-backbone-modal-main article{padding:1.5em}.wc-backbone-modal-main article p{margin:1.5em 0}.wc-backbone-modal-main article p:first-child{margin-top:0}.wc-backbone-modal-main article p:last-child{margin-bottom:0}.wc-backbone-modal-main article .pagination{padding:10px 0 0;text-align:center}.wc-backbone-modal-main article table.widefat{margin:0;width:100%;border:0;box-shadow:none}.wc-backbone-modal-main article table.widefat thead th{padding:0 1em 1em 1em;text-align:right}.wc-backbone-modal-main article table.widefat thead th:first-child{padding-right:0}.wc-backbone-modal-main article table.widefat thead th:last-child{padding-left:0;text-align:left}.wc-backbone-modal-main article table.widefat tbody td,.wc-backbone-modal-main article table.widefat tbody th{padding:1em;text-align:right;vertical-align:middle}.wc-backbone-modal-main article table.widefat tbody td:first-child,.wc-backbone-modal-main article table.widefat tbody th:first-child{padding-right:0}.wc-backbone-modal-main article table.widefat tbody td:last-child,.wc-backbone-modal-main article table.widefat tbody th:last-child{padding-left:0;text-align:left}.wc-backbone-modal-main article table.widefat tbody td .select2-container,.wc-backbone-modal-main article table.widefat tbody td select,.wc-backbone-modal-main article table.widefat tbody th .select2-container,.wc-backbone-modal-main article table.widefat tbody th select{width:100%}.wc-backbone-modal-main footer{position:absolute;right:0;left:0;bottom:0;z-index:100;padding:1em 1.5em;background:#fcfcfc;border-top:1px solid #dfdfdf;box-shadow:0 -4px 4px -4px rgba(0,0,0,.1)}.wc-backbone-modal-main footer .inner{text-align:left;line-height:23px}.wc-backbone-modal-main footer .inner .button{margin-bottom:0}.select2-drop,.select2-dropdown{z-index:999999!important}.select2-results{line-height:1.5em}.select2-results .select2-results__group,.select2-results .select2-results__option{margin:0;padding:8px}.select2-results .description{display:block;color:#999;padding-top:4px}.select2-dropdown{border-color:#ddd}.select2-dropdown--below{box-shadow:0 1px 1px rgba(0,0,0,.1)}.select2-dropdown--above{box-shadow:0 -1px 1px rgba(0,0,0,.1)}.select2-container .select2-selection__rendered.ui-sortable li{cursor:move}.select2-container .select2-selection{border-color:#ddd}.select2-container .select2-search__field{min-width:150px}.select2-container .select2-selection--single{height:32px}.select2-container .select2-selection--single .select2-selection__rendered{line-height:32px;padding-left:24px}.select2-container .select2-selection--single .select2-selection__arrow{left:3px;height:30px}.select2-container .select2-selection--multiple{min-height:28px;border-radius:0;line-height:1.5}.select2-container .select2-selection--multiple li{margin:0}.select2-container .select2-selection--multiple .select2-selection__choice{padding:2px 6px}.select2-container .select2-selection--multiple .select2-selection__choice .description{display:none}.select2-container .select2-selection__clear{color:#999;margin-top:-1px}.select2-container .select2-search--inline .select2-search__field{font-family:inherit;font-size:inherit;font-weight:inherit;padding:3px 0}.woocommerce table.form-table .select2-container{min-width:400px!important}.post-type-product .tablenav .actions,.post-type-shop_order .tablenav .actions{overflow:visible}.post-type-product .tablenav input,.post-type-product .tablenav select,.post-type-shop_order .tablenav input,.post-type-shop_order .tablenav select{line-height:1;height:32px}.post-type-product .tablenav .select2-container,.post-type-shop_order .tablenav .select2-container{float:right;width:240px!important;font-size:14px;vertical-align:middle;margin:1px 1px 4px 6px}.woocommerce-exporter-wrapper,.woocommerce-importer-wrapper,.woocommerce-progress-form-wrapper{text-align:center;max-width:700px;margin:40px auto}.woocommerce-exporter-wrapper .error,.woocommerce-importer-wrapper .error,.woocommerce-progress-form-wrapper .error{text-align:right}.woocommerce-exporter-wrapper .wc-progress-steps,.woocommerce-importer-wrapper .wc-progress-steps,.woocommerce-progress-form-wrapper .wc-progress-steps{padding:0 0 24px;margin:0;list-style:none outside;overflow:hidden;color:#ccc;width:100%;display:-webkit-inline-box;display:inline-flex}.woocommerce-exporter-wrapper .wc-progress-steps li,.woocommerce-importer-wrapper .wc-progress-steps li,.woocommerce-progress-form-wrapper .wc-progress-steps li{width:25%;float:right;padding:0 0 .8em;margin:0;text-align:center;position:relative;border-bottom:4px solid #ccc;line-height:1.4em}.woocommerce-exporter-wrapper .wc-progress-steps li::before,.woocommerce-importer-wrapper .wc-progress-steps li::before,.woocommerce-progress-form-wrapper .wc-progress-steps li::before{content:'';border:4px solid #ccc;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;right:50%;margin-right:-6px;margin-bottom:-8px;background:#fff}.woocommerce-exporter-wrapper .wc-progress-steps li.active,.woocommerce-importer-wrapper .wc-progress-steps li.active,.woocommerce-progress-form-wrapper .wc-progress-steps li.active{border-color:#a16696;color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.active::before,.woocommerce-importer-wrapper .wc-progress-steps li.active::before,.woocommerce-progress-form-wrapper .wc-progress-steps li.active::before{border-color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.done,.woocommerce-importer-wrapper .wc-progress-steps li.done,.woocommerce-progress-form-wrapper .wc-progress-steps li.done{border-color:#a16696;color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.done::before,.woocommerce-importer-wrapper .wc-progress-steps li.done::before,.woocommerce-progress-form-wrapper .wc-progress-steps li.done::before{border-color:#a16696;background:#a16696}.woocommerce-exporter-wrapper .button,.woocommerce-importer-wrapper .button,.woocommerce-progress-form-wrapper .button{font-size:1.25em;padding:.5em 1em!important;line-height:1.5em!important;margin-left:.5em;margin-bottom:2px;height:auto!important;border-radius:4px;background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,-1px 0 1px #a36597,0 1px 1px #a36597,1px 0 1px #a36597;margin:0;opacity:1}.woocommerce-exporter-wrapper .button:active,.woocommerce-exporter-wrapper .button:focus,.woocommerce-exporter-wrapper .button:hover,.woocommerce-importer-wrapper .button:active,.woocommerce-importer-wrapper .button:focus,.woocommerce-importer-wrapper .button:hover,.woocommerce-progress-form-wrapper .button:active,.woocommerce-progress-form-wrapper .button:focus,.woocommerce-progress-form-wrapper .button:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-exporter-wrapper .error .button,.woocommerce-importer-wrapper .error .button,.woocommerce-progress-form-wrapper .error .button{font-size:1em}.woocommerce-exporter-wrapper .wc-actions,.woocommerce-importer-wrapper .wc-actions,.woocommerce-progress-form-wrapper .wc-actions{overflow:hidden;border-top:1px solid #eee;margin:0;padding:23px 24px 24px;line-height:3em}.woocommerce-exporter-wrapper .wc-actions .button,.woocommerce-importer-wrapper .wc-actions .button,.woocommerce-progress-form-wrapper .wc-actions .button{float:left}.woocommerce-exporter-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options,.woocommerce-importer-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options,.woocommerce-progress-form-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options{color:#999}.woocommerce-exporter-wrapper .wc-progress-form-content,.woocommerce-exporter-wrapper .woocommerce-exporter,.woocommerce-exporter-wrapper .woocommerce-importer,.woocommerce-importer-wrapper .wc-progress-form-content,.woocommerce-importer-wrapper .woocommerce-exporter,.woocommerce-importer-wrapper .woocommerce-importer,.woocommerce-progress-form-wrapper .wc-progress-form-content,.woocommerce-progress-form-wrapper .woocommerce-exporter,.woocommerce-progress-form-wrapper .woocommerce-importer{background:#fff;overflow:hidden;padding:0;margin:0 0 16px;box-shadow:0 1px 3px rgba(0,0,0,.13);color:#555;text-align:right}.woocommerce-exporter-wrapper .wc-progress-form-content header,.woocommerce-exporter-wrapper .woocommerce-exporter header,.woocommerce-exporter-wrapper .woocommerce-importer header,.woocommerce-importer-wrapper .wc-progress-form-content header,.woocommerce-importer-wrapper .woocommerce-exporter header,.woocommerce-importer-wrapper .woocommerce-importer header,.woocommerce-progress-form-wrapper .wc-progress-form-content header,.woocommerce-progress-form-wrapper .woocommerce-exporter header,.woocommerce-progress-form-wrapper .woocommerce-importer header{border-bottom:1px solid #eee;margin:0;padding:24px 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content section,.woocommerce-exporter-wrapper .woocommerce-exporter section,.woocommerce-exporter-wrapper .woocommerce-importer section,.woocommerce-importer-wrapper .wc-progress-form-content section,.woocommerce-importer-wrapper .woocommerce-exporter section,.woocommerce-importer-wrapper .woocommerce-importer section,.woocommerce-progress-form-wrapper .wc-progress-form-content section,.woocommerce-progress-form-wrapper .woocommerce-exporter section,.woocommerce-progress-form-wrapper .woocommerce-importer section{padding:24px 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content h2,.woocommerce-exporter-wrapper .woocommerce-exporter h2,.woocommerce-exporter-wrapper .woocommerce-importer h2,.woocommerce-importer-wrapper .wc-progress-form-content h2,.woocommerce-importer-wrapper .woocommerce-exporter h2,.woocommerce-importer-wrapper .woocommerce-importer h2,.woocommerce-progress-form-wrapper .wc-progress-form-content h2,.woocommerce-progress-form-wrapper .woocommerce-exporter h2,.woocommerce-progress-form-wrapper .woocommerce-importer h2{margin:0 0 24px;color:#555;font-size:24px;font-weight:400;line-height:1em}.woocommerce-exporter-wrapper .wc-progress-form-content p,.woocommerce-exporter-wrapper .woocommerce-exporter p,.woocommerce-exporter-wrapper .woocommerce-importer p,.woocommerce-importer-wrapper .wc-progress-form-content p,.woocommerce-importer-wrapper .woocommerce-exporter p,.woocommerce-importer-wrapper .woocommerce-importer p,.woocommerce-progress-form-wrapper .wc-progress-form-content p,.woocommerce-progress-form-wrapper .woocommerce-exporter p,.woocommerce-progress-form-wrapper .woocommerce-importer p{font-size:1em;line-height:1.75em;font-size:16px;color:#555;margin:0 0 24px}.woocommerce-exporter-wrapper .wc-progress-form-content .form-row,.woocommerce-exporter-wrapper .woocommerce-exporter .form-row,.woocommerce-exporter-wrapper .woocommerce-importer .form-row,.woocommerce-importer-wrapper .wc-progress-form-content .form-row,.woocommerce-importer-wrapper .woocommerce-exporter .form-row,.woocommerce-importer-wrapper .woocommerce-importer .form-row,.woocommerce-progress-form-wrapper .wc-progress-form-content .form-row,.woocommerce-progress-form-wrapper .woocommerce-exporter .form-row,.woocommerce-progress-form-wrapper .woocommerce-importer .form-row{margin-top:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter .spinner,.woocommerce-exporter-wrapper .woocommerce-importer .spinner,.woocommerce-importer-wrapper .wc-progress-form-content .spinner,.woocommerce-importer-wrapper .woocommerce-exporter .spinner,.woocommerce-importer-wrapper .woocommerce-importer .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer .spinner{display:none}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th{vertical-align:top;line-height:1.75em;padding:0 0 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th label{color:#555;font-weight:400}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox]{margin:0 0 0 4px;padding:7px}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text]{padding:7px;height:auto;margin:0}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper{border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);background-color:#fff;color:#32373c;outline:0;line-height:1;display:block}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code{background:0 0;font-size:smaller;padding:0;margin:0;color:#999;padding:7px 7px 0 0;display:inline-block}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input{font-family:Consolas,Monaco,monospace;border:0;margin:0;outline:0;box-shadow:none;display:inline-block;min-width:100%}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th{width:35%;padding-left:20px}.woocommerce-exporter-wrapper .wc-progress-form-content progress,.woocommerce-exporter-wrapper .woocommerce-exporter progress,.woocommerce-exporter-wrapper .woocommerce-importer progress,.woocommerce-importer-wrapper .wc-progress-form-content progress,.woocommerce-importer-wrapper .woocommerce-exporter progress,.woocommerce-importer-wrapper .woocommerce-importer progress,.woocommerce-progress-form-wrapper .wc-progress-form-content progress,.woocommerce-progress-form-wrapper .woocommerce-exporter progress,.woocommerce-progress-form-wrapper .woocommerce-importer progress{width:100%;height:42px;margin:0 auto 24px;display:block;-webkit-appearance:none;border:none;display:none;background:#f5f5f5;border:2px solid #eee;border-radius:4px;padding:0;box-shadow:0 1px 0 0 rgba(255,255,255,.2)}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-exporter-wrapper .woocommerce-importer progress::-webkit-progress-bar,.woocommerce-importer-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-importer-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-importer-wrapper .woocommerce-importer progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-webkit-progress-bar{background:transparent none;border:0;border-radius:4px;padding:0;box-shadow:none}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-exporter-wrapper .woocommerce-importer progress::-webkit-progress-value,.woocommerce-importer-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-importer-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-importer-wrapper .woocommerce-importer progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-webkit-progress-value{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:-webkit-linear-gradient(top,#a46497,#66405f),#a46497;background:linear-gradient(top,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-exporter-wrapper .woocommerce-importer progress::-moz-progress-bar,.woocommerce-importer-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-importer-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-importer-wrapper .woocommerce-importer progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-moz-progress-bar{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:linear-gradient(top,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-exporter-wrapper .woocommerce-importer progress::-ms-fill,.woocommerce-importer-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-importer-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-importer-wrapper .woocommerce-importer progress::-ms-fill,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-ms-fill{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:linear-gradient(to bottom,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner{display:block}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing progress{display:block}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options{display:none}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper{padding:0}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table{margin:0;border:0;box-shadow:none;width:100%;table-layout:fixed}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th{border:0;padding:12px;vertical-align:middle;word-wrap:break-word}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th select{width:100%}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th{background:#fbfbfb}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th{font-weight:700}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child{padding-right:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child{padding-left:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name{width:50%}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description{color:#999;margin-top:4px;display:block}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code{background:0 0;padding:0;white-space:pre-line;word-wrap:break-word;word-break:break-all}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-done,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-done,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-done{text-align:center;padding:48px 24px;font-size:1.5em;line-height:1.75em}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-done::before,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-done::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#a16696;position:static;font-size:100px;display:block;float:none;margin:0 0 24px}.wc-pointer .wc-pointer-buttons .close{float:right;margin:6px 15px 0 0}
\ No newline at end of file
diff --git a/assets/css/admin.css b/assets/css/admin.css
index 6ef9925a342..3bb085b7e2e 100644
--- a/assets/css/admin.css
+++ b/assets/css/admin.css
@@ -1,2 +1,2 @@
.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;margin:0 0 -4px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left;padding:0}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin:0;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected],.select2-results__option[data-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none;margin:5px 5px 0 0}.select2-container--default .select2-selection--multiple .select2-selection__rendered li:before{content:'';display:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid #000 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[data-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected],.select2-container--default .select2-results__option--highlighted[data-selected]{background-color:#0073aa;color:#fff}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single:focus{border:1px solid #0073aa}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #0073aa}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:0 0;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #0073aa}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #0073aa}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected],.select2-container--classic .select2-results__option--highlighted[data-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#0073aa}
-@charset "UTF-8";@-webkit-keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;left:50%;margin-left:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.wc_addons_wrap{max-width:1200px}.wc_addons_wrap h1.search-form-title{clear:left;padding:0}.wc_addons_wrap form.search-form{clear:both;display:block;position:relative;margin-top:1em;margin-bottom:1em}.wc_addons_wrap form.search-form input{border:1px solid #ddd;box-shadow:none;height:53px;padding-left:50px;width:100%;margin:0}.wc_addons_wrap form.search-form button{background:0 0;border:none;cursor:pointer;height:53px;position:absolute;width:53px}.wc_addons_wrap .update-plugins .update-count{background-color:#d54e21;border-radius:10px;color:#fff;display:inline-block;font-size:9px;font-weight:600;line-height:17px;margin:1px 0 0 2px;padding:0 6px;vertical-align:text-top}.wc_addons_wrap .addons-featured{margin:0}.wc_addons_wrap ul.subsubsub.subsubsub{margin:-2px 0 12px}.wc_addons_wrap .subsubsub li::after{content:'|'}.wc_addons_wrap .subsubsub li:last-child::after{content:''}.wc_addons_wrap .addons-banner-block-item-icon,.wc_addons_wrap .addons-column-block-item-icon{-webkit-box-align:center;align-items:center;display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center}.wc_addons_wrap .addons-banner-block,.wc_addons_wrap .addons-wcs-banner-block{background:#fff;border:1px solid #ddd;margin:0 0 1em 0;padding:2em 2em 1em}.wc_addons_wrap .addons-banner-block img{height:62px}.wc_addons_wrap .addons-banner-block p{margin:0 0 20px}.wc_addons_wrap .addons-banner-block-items{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;flex-wrap:wrap;justify-content:space-around;margin:0 -10px 0 -10px}.wc_addons_wrap .addons-banner-block-item{border:1px solid #e6e6e6;border-radius:3px;-webkit-box-flex:1;flex:1;margin:1em;min-width:200px;width:30%}.wc_addons_wrap .addons-banner-block-item-icon{background:#f7f7f7;height:143px}.wc_addons_wrap .addons-banner-block-item-content{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;height:184px;-webkit-box-pack:justify;justify-content:space-between;padding:24px}.wc_addons_wrap .addons-banner-block-item-content h3{margin-top:0}.wc_addons_wrap .addons-banner-block-item-content p{margin:0 0 auto}.wc_addons_wrap .addons-wcs-banner-block{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center}.wc_addons_wrap .addons-wcs-banner-block-image{background:#f7f7f7;border:1px solid #e6e6e6;margin-right:2em;padding:4em}.wc_addons_wrap .addons-wcs-banner-block-image .addons-img{max-height:86px;max-width:97px}.wc_addons_wrap .addons-shipping-methods .addons-wcs-banner-block{margin-left:0;margin-right:0;margin-top:1em}.wc_addons_wrap .addons-wcs-banner-block-content{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;justify-content:space-around;align-self:stretch;padding:1em 0}.wc_addons_wrap .addons-wcs-banner-block-content h1{padding-bottom:0}.wc_addons_wrap .addons-wcs-banner-block-content p{margin-bottom:0}.wc_addons_wrap .addons-wcs-banner-block-content .wcs-service-logo{max-width:40px}.wc_addons_wrap .addons-column-section{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;flex-wrap:wrap;justify-content:space-around}.wc_addons_wrap .addons-column{-webkit-box-flex:1;flex:1;width:50%;padding:0 .5em}.wc_addons_wrap .addons-column:nth-child(2){margin-right:0}.wc_addons_wrap .addons-column-block,.wc_addons_wrap .addons-small-dark-block,.wc_addons_wrap .addons-small-light-block{box-sizing:border-box;border:1px solid #ddd;margin:0 0 1em;padding:20px}.wc_addons_wrap .addons-column-block img{max-height:50px;max-width:50px}.wc_addons_wrap .addons-column-block,.wc_addons_wrap .addons-small-light-block{background:#fff}.wc_addons_wrap .addons-column-block-left{float:left}.wc_addons_wrap .addons-column-block-right{float:right}.wc_addons_wrap .addons-column-block-item{border-top:2px solid #f9f9f9;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;flex-wrap:wrap;-webkit-box-pack:justify;justify-content:space-between;margin:0 -20px;padding:20px}.wc_addons_wrap .addons-column-block-item-icon{background:#f7f7f7;border:1px solid #e6e6e6;height:100px;margin:0 10px 10px 0;width:100px}.wc_addons_wrap .addons-column-block-item-content{display:-webkit-box;display:flex;-webkit-box-flex:1;flex:1;flex-wrap:wrap;height:20%;-webkit-box-pack:justify;justify-content:space-between;min-width:200px}.wc_addons_wrap .addons-column-block-item-content h2{float:left;margin-top:8px}.wc_addons_wrap .addons-column-block-item-content a{float:right}.wc_addons_wrap .addons-column-block-item-content p{float:left}.wc_addons_wrap .addons-banner-block-item,.wc_addons_wrap .addons-column-block-item{display:none}.wc_addons_wrap .addons-banner-block-item:nth-child(-n+3){display:block}.wc_addons_wrap .addons-column-block-item:nth-of-type(-n+3){display:-webkit-box;display:flex}.wc_addons_wrap .addons-small-dark-block{background-color:#54687d;text-align:center}.wc_addons_wrap .addons-small-dark-items{display:-webkit-box;display:flex;flex-wrap:wrap;justify-content:space-around}.wc_addons_wrap .addons-small-dark-item{margin:0 0 20px}.wc_addons_wrap .addons-small-dark-block h1{color:#fff}.wc_addons_wrap .addons-small-dark-block p{color:#fafafa}.wc_addons_wrap .addons-small-dark-item-icon img{height:30px}.wc_addons_wrap .addons-small-dark-item a{margin:28px auto 0}.wc_addons_wrap .addons-small-light-block{display:-webkit-box;display:flex;flex-wrap:wrap}.wc_addons_wrap .addons-small-light-block h1{margin-top:-12px}.wc_addons_wrap .addons-small-light-block p{margin-top:0}.wc_addons_wrap .addons-small-light-block img{height:225px;margin:0 0 0 -20px}.wc_addons_wrap .addons-small-light-block-content{display:-webkit-box;display:flex;-webkit-box-flex:1;flex:1 1 100px;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;justify-content:space-around}.wc_addons_wrap .addons-small-light-block-buttons{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between}.wc_addons_wrap .addons-small-light-block-content a{width:48%}.wc_addons_wrap .addons-button{border-radius:3px;cursor:pointer;display:block;height:37px;line-height:37px;text-align:center;text-decoration:none;width:124px}.wc_addons_wrap .addons-button-solid{background-color:#955a89;color:#fff}.wc_addons_wrap .addons-button-solid:hover{color:#fff;opacity:.8}.wc_addons_wrap .addons-button-outline-green{border:1px solid #73ae39;color:#73ae39}.wc_addons_wrap .addons-button-outline-green:hover{color:#73ae39;opacity:.8}.wc_addons_wrap .addons-button-outline-white{border:1px solid #fff;color:#fff}.wc_addons_wrap .addons-button-outline-white:hover{color:#fff;opacity:.8}.wc_addons_wrap .addons-button-installed{background:#e6e6e6;color:#3c3c3c}.wc_addons_wrap .addons-button-installed:hover{color:#3c3c3c;opacity:.8}@media only screen and (max-width:400px){.wc_addons_wrap .addons-featured{margin:-1% -5%}.wc_addons_wrap .addons-button{width:100%}.wc_addons_wrap .addons-small-dark-item{width:100%}.wc_addons_wrap .addons-column-block-item-icon{background:0 0;border:none;height:75px;margin:0 10px 10px 0;width:75px}}.wc_addons_wrap .products{overflow:hidden;display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row;flex-wrap:wrap;margin:0 -.5em}.wc_addons_wrap .products li{float:left;border:1px solid #ddd;margin:0 .5em 1em!important;padding:0;vertical-align:top;width:25%;min-width:280px;min-height:220px;-webkit-box-flex:1;flex:1;overflow:hidden;background:#f5f5f5;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),inset 0 -1px 0 rgba(0,0,0,.1)}.wc_addons_wrap .products li a{text-decoration:none;color:inherit;display:block;height:100%}.wc_addons_wrap .products li a .product-img-wrap{background:#fff;display:block}.wc_addons_wrap .products li a img{max-width:258px;max-height:24px;padding:17px 20px;display:block;margin:0;background:#fff;border-right:260px solid #fff}.wc_addons_wrap .products li a img.extension-thumb+h3{display:none}.wc_addons_wrap .products li a .price{display:none}.wc_addons_wrap .products li a h2,.wc_addons_wrap .products li a h3{margin:0!important;padding:20px!important;background:#fff}.wc_addons_wrap .products li a p{padding:20px!important;margin:0!important;border-top:1px solid #f1f1f1}.wc_addons_wrap .products li a:focus,.wc_addons_wrap .products li a:hover{background-color:#fff}.wc_addons_wrap .storefront{background:url(../images/storefront-bg.jpg) bottom right #f6f6f6;border:1px solid #ddd;margin-top:1em;padding:20px;overflow:hidden;zoom:1}.wc_addons_wrap .storefront img{width:278px;height:auto;float:left;margin:0 20px 0 0;box-shadow:0 1px 6px rgba(0,0,0,.1)}.wc_addons_wrap .storefront p{max-width:750px}.woocommerce-BlankState a.button-primary,.woocommerce-BlankState button.button-primary,.woocommerce-message a.button-primary,.woocommerce-message button.button-primary{background:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;color:#fff;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597;display:inline-block}.woocommerce-BlankState a.button-primary:active,.woocommerce-BlankState a.button-primary:focus,.woocommerce-BlankState a.button-primary:hover,.woocommerce-BlankState button.button-primary:active,.woocommerce-BlankState button.button-primary:focus,.woocommerce-BlankState button.button-primary:hover,.woocommerce-message a.button-primary:active,.woocommerce-message a.button-primary:focus,.woocommerce-message a.button-primary:hover,.woocommerce-message button.button-primary:active,.woocommerce-message button.button-primary:focus,.woocommerce-message button.button-primary:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-message{position:relative;border-left-color:#cc99c2!important;overflow:hidden}.woocommerce-message a.docs,.woocommerce-message a.skip{text-decoration:none!important}.woocommerce-message a.woocommerce-message-close{position:static;float:right;padding:0 15px 10px 28px;margin-top:-10px;font-size:13px;line-height:1.23076923;text-decoration:none}.woocommerce-message a.woocommerce-message-close::before{position:relative;top:18px;left:-20px;-webkit-transition:all .1s ease-in-out;transition:all .1s ease-in-out}.woocommerce-message .twitter-share-button{margin-top:-3px;margin-left:3px;vertical-align:middle}#variable_product_options #message,#variable_product_options .notice{margin:10px}.clear{clear:both}.wrap.woocommerce div.error,.wrap.woocommerce div.updated{margin-top:10px}mark.amount{background:transparent none;color:inherit}.simplify-commerce-banner{overflow:hidden}.simplify-commerce-banner img{float:right;padding:15px 0;margin-left:1em;width:200px}.woocommerce-help-tip{color:#666;display:inline-block;font-size:1.1em;font-style:normal;height:16px;line-height:16px;position:relative;vertical-align:middle;width:16px}.woocommerce-help-tip::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";cursor:help}h2 .woocommerce-help-tip{margin-top:-5px;margin-left:.25em}table.wc_status_table{margin-bottom:1em}table.wc_status_table h2{font-size:14px;margin:0}table.wc_status_table tr:nth-child(2n) td,table.wc_status_table tr:nth-child(2n) th{background:#fcfcfc}table.wc_status_table th{font-weight:700;padding:9px}table.wc_status_table td:first-child{width:33%}table.wc_status_table td.help{width:1em}table.wc_status_table td,table.wc_status_table th{font-size:1.1em;font-weight:400}table.wc_status_table td.run-tool,table.wc_status_table th.run-tool{text-align:right}table.wc_status_table td strong.name,table.wc_status_table th strong.name{display:block;margin-bottom:.5em}table.wc_status_table td mark,table.wc_status_table th mark{background:transparent none}table.wc_status_table td mark.yes,table.wc_status_table th mark.yes{color:#7ad03a}table.wc_status_table td mark.no,table.wc_status_table th mark.no{color:#999}table.wc_status_table td .red,table.wc_status_table td mark.error,table.wc_status_table th .red,table.wc_status_table th mark.error{color:#a00}table.wc_status_table td ul,table.wc_status_table th ul{margin:0}table.wc_status_table .help_tip{cursor:help}table.wc_status_table--tools td,table.wc_status_table--tools th{padding:2em}.taxonomy-product_cat .column-thumb .woocommerce-help-tip{font-size:1.5em;margin:0 0 0 -34px;padding:0 2px 5px;display:block;position:absolute}#debug-report{display:none;margin:10px 0;padding:0;position:relative}#debug-report textarea{font-family:monospace;width:100%;margin:0;height:300px;padding:20px;border-radius:0;resize:none;font-size:12px;line-height:20px;outline:0}.wp-list-table.logs .log-level{display:inline;padding:.2em .6em .3em;font-size:80%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.2em}.wp-list-table.logs .log-level:empty{display:none}.wp-list-table.logs .log-level--alert,.wp-list-table.logs .log-level--emergency{background-color:#ff4136}.wp-list-table.logs .log-level--critical,.wp-list-table.logs .log-level--error{background-color:#ff851b}.wp-list-table.logs .log-level--notice,.wp-list-table.logs .log-level--warning{color:#222;background-color:#ffdc00}.wp-list-table.logs .log-level--info{background-color:#0074d9}.wp-list-table.logs .log-level--debug{background-color:#3d9970}@media screen and (min-width:783px){.wp-list-table.logs .column-timestamp{width:18%}.wp-list-table.logs .column-level{width:14%}.wp-list-table.logs .column-source{width:15%}}#log-viewer-select{padding:10px 0 8px;line-height:28px}#log-viewer-select h2 a{vertical-align:middle}#log-viewer{background:#fff;border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.04);padding:5px 20px}#log-viewer pre{font-family:monospace;white-space:pre-wrap;word-wrap:break-word}.inline-edit-product.quick-edit-row .inline-edit-col-center,.inline-edit-product.quick-edit-row .inline-edit-col-right{float:right!important}#woocommerce-fields.inline-edit-col{clear:left}#woocommerce-fields.inline-edit-col label.featured,#woocommerce-fields.inline-edit-col label.manage_stock{margin-left:10px}#woocommerce-fields.inline-edit-col label.stock_status_field{clear:both;float:left}#woocommerce-fields.inline-edit-col .dimensions div{display:block;margin:.2em 0}#woocommerce-fields.inline-edit-col .dimensions div span.title{display:block;float:left;width:5em}#woocommerce-fields.inline-edit-col .dimensions div span.input-text-wrap{display:block;margin-left:5em}#woocommerce-fields.inline-edit-col .text{box-sizing:border-box;width:99%;float:left;margin:1px 1% 1px 1px}#woocommerce-fields.inline-edit-col .height,#woocommerce-fields.inline-edit-col .length,#woocommerce-fields.inline-edit-col .width{width:32.33%}#woocommerce-fields.inline-edit-col .height{margin-right:0}#woocommerce-fields-bulk.inline-edit-col label{clear:left}#woocommerce-fields-bulk.inline-edit-col .inline-edit-group label{clear:none;width:49%;margin:.2em 0}#woocommerce-fields-bulk.inline-edit-col .inline-edit-group.dimensions label{width:75%;max-width:75%}#woocommerce-fields-bulk.inline-edit-col .length,#woocommerce-fields-bulk.inline-edit-col .regular_price,#woocommerce-fields-bulk.inline-edit-col .sale_price,#woocommerce-fields-bulk.inline-edit-col .stock,#woocommerce-fields-bulk.inline-edit-col .weight{box-sizing:border-box;width:100%;margin-left:4.4em}#woocommerce-fields-bulk.inline-edit-col .height,#woocommerce-fields-bulk.inline-edit-col .length,#woocommerce-fields-bulk.inline-edit-col .width{box-sizing:border-box;width:25%}.column-coupon_code{line-height:2.25em}.column-coupon_code,ul.wc_coupon_list{margin:0;overflow:hidden;zoom:1;clear:both}ul.wc_coupon_list{padding-bottom:5px}ul.wc_coupon_list li{margin:0}ul.wc_coupon_list li.code{display:inline-block;position:relative;padding:0 .5em;background-color:#fff;border:1px solid #aaa;box-shadow:0 1px 0 #dfdfdf;border-radius:4px;margin-right:5px;margin-top:5px}ul.wc_coupon_list li.code.editable{padding-right:2em}ul.wc_coupon_list li.code .tips{cursor:pointer}ul.wc_coupon_list li.code .tips span{color:#888}ul.wc_coupon_list li.code .tips span:hover{color:#000}ul.wc_coupon_list li.code .remove-coupon{text-decoration:none;color:#888;position:absolute;top:7px;right:20px}ul.wc_coupon_list li.code .remove-coupon::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}ul.wc_coupon_list li.code .remove-coupon:hover::before{color:#a00}ul.wc_coupon_list_block{margin:0;padding-bottom:2px}ul.wc_coupon_list_block li{border-top:1px solid #fff;border-bottom:1px solid #ccc;line-height:2.5em;margin:0;padding:.5em 0}ul.wc_coupon_list_block li:first-child{border-top:0;padding-top:0}ul.wc_coupon_list_block li:last-child{border-bottom:0;padding-bottom:0}.button.wc-reload{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;padding:0;height:28px;width:28px!important;display:inline-block}.button.wc-reload::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";line-height:28px}#woocommerce-order-data .handlediv,#woocommerce-order-data .hndle{display:none}#woocommerce-order-data .inside{display:block!important}#order_data{padding:23px 24px 12px}#order_data h2{margin:0;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif;font-size:21px;font-weight:400;line-height:1.2;text-shadow:1px 1px 1px #fff;padding:0}#order_data h3{font-size:14px}#order_data h3,#order_data h4{color:#333;margin:1.33em 0 0}#order_data p{color:#777}#order_data p.order_number{margin:0;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif;font-weight:400;line-height:1.6em;font-size:16px}#order_data .order_data_column_container{clear:both}#order_data .order_data_column{width:32%;padding:0 2% 0 0;float:left}#order_data .order_data_column>h3 span{display:block}#order_data .order_data_column:last-child{padding-right:0}#order_data .order_data_column p{padding:0!important}#order_data .order_data_column .address strong{display:block}#order_data .order_data_column .form-field{float:left;clear:left;width:48%;padding:0;margin:9px 0 0}#order_data .order_data_column .form-field label{display:block;padding:0 0 3px}#order_data .order_data_column .form-field input,#order_data .order_data_column .form-field textarea{width:100%}#order_data .order_data_column .form-field select{width:100%}#order_data .order_data_column .form-field .select2-container{width:100%!important}#order_data .order_data_column .form-field .date-picker{width:50%}#order_data .order_data_column .form-field .hour,#order_data .order_data_column .form-field .minute{width:3.5em}#order_data .order_data_column .form-field small{display:block;margin:5px 0 0;color:#999}#order_data .order_data_column ._billing_address_2_field,#order_data .order_data_column ._billing_last_name_field,#order_data .order_data_column ._billing_phone_field,#order_data .order_data_column ._billing_postcode_field,#order_data .order_data_column ._billing_state_field,#order_data .order_data_column ._shipping_address_2_field,#order_data .order_data_column ._shipping_last_name_field,#order_data .order_data_column ._shipping_postcode_field,#order_data .order_data_column ._shipping_state_field,#order_data .order_data_column .form-field.last{float:right;clear:right}#order_data .order_data_column ._billing_company_field,#order_data .order_data_column ._shipping_company_field,#order_data .order_data_column ._transaction_id_field,#order_data .order_data_column .form-field-wide{width:100%;clear:both}#order_data .order_data_column ._billing_company_field .wc-category-search,#order_data .order_data_column ._billing_company_field .wc-customer-search,#order_data .order_data_column ._billing_company_field .wc-enhanced-select,#order_data .order_data_column ._billing_company_field input,#order_data .order_data_column ._billing_company_field select,#order_data .order_data_column ._billing_company_field textarea,#order_data .order_data_column ._shipping_company_field .wc-category-search,#order_data .order_data_column ._shipping_company_field .wc-customer-search,#order_data .order_data_column ._shipping_company_field .wc-enhanced-select,#order_data .order_data_column ._shipping_company_field input,#order_data .order_data_column ._shipping_company_field select,#order_data .order_data_column ._shipping_company_field textarea,#order_data .order_data_column ._transaction_id_field .wc-category-search,#order_data .order_data_column ._transaction_id_field .wc-customer-search,#order_data .order_data_column ._transaction_id_field .wc-enhanced-select,#order_data .order_data_column ._transaction_id_field input,#order_data .order_data_column ._transaction_id_field select,#order_data .order_data_column ._transaction_id_field textarea,#order_data .order_data_column .form-field-wide .wc-category-search,#order_data .order_data_column .form-field-wide .wc-customer-search,#order_data .order_data_column .form-field-wide .wc-enhanced-select,#order_data .order_data_column .form-field-wide input,#order_data .order_data_column .form-field-wide select,#order_data .order_data_column .form-field-wide textarea{width:100%}#order_data .order_data_column p.none_set{color:#999}#order_data .order_data_column div.edit_address{display:none;zoom:1;padding-right:1px}#order_data .order_data_column .wc-customer-user label a,#order_data .order_data_column .wc-order-status label a{float:right;margin-left:8px}#order_data .order_data_column a.edit_address{width:14px;height:0;padding:14px 0 0;margin:0 0 0 6px;overflow:hidden;position:relative;color:#999;border:0;float:right}#order_data .order_data_column a.edit_address:focus,#order_data .order_data_column a.edit_address:hover{color:#000}#order_data .order_data_column a.edit_address::after{font-family:WooCommerce;position:absolute;top:0;left:0;text-align:center;vertical-align:top;line-height:14px;font-size:14px;font-weight:400}#order_data .order_data_column a.edit_address::after{font-family:Dashicons;content:'\f464'}#order_data .order_data_column .billing-same-as-shipping,#order_data .order_data_column .load_customer_billing,#order_data .order_data_column .load_customer_shipping{font-size:13px;display:inline-block;font-weight:400}#order_data .order_data_column .load_customer_shipping{margin-right:.3em}.order_actions{margin:0;overflow:hidden;zoom:1}.order_actions li{border-top:1px solid #fff;border-bottom:1px solid #ddd;padding:6px 0;margin:0;line-height:1.6em;float:left;width:50%;text-align:center}.order_actions li a{float:none;text-align:center;text-decoration:underline}.order_actions li.wide{width:auto;float:none;clear:both;padding:6px;text-align:left;overflow:hidden}.order_actions li #delete-action{line-height:25px;vertical-align:middle;text-align:left;float:left}.order_actions li .save_order{float:right}.order_actions li#actions{overflow:hidden}.order_actions li#actions .button{width:24px;box-sizing:border-box;float:right}.order_actions li#actions select{width:225px;box-sizing:border-box;float:left}#woocommerce-order-items .inside{margin:0;padding:0;background:#fefefe}#woocommerce-order-items .wc-order-data-row{border-bottom:1px solid #dfdfdf;padding:1.5em 2em;background:#f8f8f8;line-height:2em;text-align:right}#woocommerce-order-items .wc-order-data-row::after,#woocommerce-order-items .wc-order-data-row::before{content:' ';display:table}#woocommerce-order-items .wc-order-data-row::after{clear:both}#woocommerce-order-items .wc-order-data-row p{margin:0;line-height:2em}#woocommerce-order-items .wc-order-data-row .wc-used-coupons{text-align:left}#woocommerce-order-items .wc-order-data-row .wc-used-coupons .tips{display:inline-block}#woocommerce-order-items .wc-used-coupons{float:left;width:50%}#woocommerce-order-items .wc-order-totals{float:right;width:50%;margin:0;padding:0;text-align:right}#woocommerce-order-items .wc-order-totals .amount{font-weight:700}#woocommerce-order-items .wc-order-totals .label{vertical-align:top}#woocommerce-order-items .wc-order-totals .total{font-size:1em!important;width:10em;margin:0 0 0 .5em;box-sizing:border-box}#woocommerce-order-items .wc-order-totals .total input[type=text]{width:96%;float:right}#woocommerce-order-items .wc-order-totals .refunded-total{color:#a00}#woocommerce-order-items .refund-actions{margin-top:5px;padding-top:12px;border-top:1px solid #dfdfdf}#woocommerce-order-items .refund-actions .button{float:right;margin-left:4px}#woocommerce-order-items .refund-actions .cancel-action{float:left;margin-left:0}#woocommerce-order-items .add_meta{margin-left:0!important}#woocommerce-order-items h3 small{color:#999}#woocommerce-order-items .amount{white-space:nowrap}#woocommerce-order-items .add-items .description{margin-right:10px}#woocommerce-order-items .add-items .button{float:left;margin-right:.25em}#woocommerce-order-items .add-items .button-primary{float:none;margin-right:0}#woocommerce-order-items .inside{display:block!important}#woocommerce-order-items .handlediv,#woocommerce-order-items .hndle{display:none}#woocommerce-order-items .woocommerce_order_items_wrapper{margin:0;overflow-x:auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items{width:100%;background:#fff}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th{text-align:left;padding:1em;font-weight:400;color:#999;background:#f8f8f8;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th.sortable{cursor:pointer}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th:last-child{padding-right:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th:first-child{padding-left:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th .wc-arrow{float:right;position:relative;margin-right:-1em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td{padding:1.5em 1em 1em;text-align:left;line-height:1.5em;vertical-align:top;border-bottom:1px solid #f8f8f8}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td textarea{width:100%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td select{width:50%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td textarea{font-size:14px;padding:4px;color:#555}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th:last-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td:last-child{padding-right:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td:first-child{padding-left:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr:last-child td{border-bottom:1px solid #dfdfdf}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr:first-child td{border-top:8px solid #f8f8f8}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody#order_line_items tr:first-child td{border-top:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb{text-align:left;width:38px;padding-bottom:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail{width:38px;height:38px;border:2px solid #e8e8e8;background:#f8f8f8;color:#ccc;position:relative;font-size:21px;display:block;text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";width:38px;line-height:38px;display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail img{width:100%;height:100%;margin:0;padding:0;position:relative}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.name .wc-order-item-sku,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.name .wc-order-item-variation{display:block;margin-top:.5em;font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item{min-width:200px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .center,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .variation-id{text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class{text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class label{white-space:nowrap;color:#999;font-size:.833em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class label input{display:inline}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class input{width:70px;vertical-align:middle;text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class select{width:85px;height:26px;vertical-align:middle;font-size:1em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input{display:inline-block;background:#fff;border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);margin:1px 0;min-width:80px;overflow:hidden;line-height:1em;text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input{width:100%;box-sizing:border-box}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input label{font-size:.75em;padding:4px 6px 0;color:#555;display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input input{width:100%;box-sizing:border-box;border:0;box-shadow:none;margin:0;padding:0 6px 4px;color:#555;background:0 0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input input::-webkit-input-placeholder{color:#ddd}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child{border-bottom:1px dashed #ddd;background:#fff}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child label{color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child input{color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .view{white-space:nowrap}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .edit{text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class small.times{font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes{margin:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes label{display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-discount{display:block;margin-top:.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class small.times{margin-right:.25em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity{text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity input{text-align:center;width:50px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items span.subtotal{opacity:.5}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.tax_class,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.tax_class{text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .calculated{border-color:#ae8ca2;border-style:dotted}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta{width:100%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta{margin:.5em 0 0;font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr th,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr th{border:0;padding:0 4px .5em 0;line-height:1.5em;width:20%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td{padding:0 4px .5em 0;border:0;line-height:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td input{width:100%;margin:0;position:relative;border-bottom:0;box-shadow:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td textarea{width:100%;height:4em;margin:0;box-shadow:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td input:focus+textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td input:focus+textarea{border-top-color:#999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td p,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td p{margin:0 0 .5em;line-height:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td p:last-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td p:last-child{margin:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .refund_by{border-bottom:1px dotted #999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.fee .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.fee .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.refund .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.refund .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .shipping_method,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .shipping_method_name{width:100%;margin:0 0 .5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax{white-space:nowrap}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;float:right;font-size:14px;visibility:hidden;margin:3px -18px 0 0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax::before,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax:hover::before,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax:hover::before{color:#a00}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax:hover .delete-order-tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax:hover .delete-order-tax{visibility:visible}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items small.refunded{display:block;color:#a00;white-space:nowrap;margin-top:.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items small.refunded::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";position:relative;top:auto;left:auto;margin:-1px 4px 0 0;vertical-align:middle;line-height:1em}#woocommerce-order-items .wc-order-edit-line-item{padding-left:0}#woocommerce-order-items .wc-order-edit-line-item-actions{width:44px;text-align:right;padding-left:0;vertical-align:middle}#woocommerce-order-items .wc-order-edit-line-item-actions a{color:#ccc;display:inline-block;cursor:pointer;padding:0 0 .5em;margin:0 0 0 12px;vertical-align:middle;text-decoration:none;line-height:16px;width:16px;overflow:hidden}#woocommerce-order-items .wc-order-edit-line-item-actions a::before{margin:0;padding:0;font-size:16px;width:16px;height:16px}#woocommerce-order-items .wc-order-edit-line-item-actions a:hover::before{color:#999}#woocommerce-order-items .wc-order-edit-line-item-actions a:first-child{margin-left:0}#woocommerce-order-items .wc-order-edit-line-item-actions .edit-order-item::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";position:relative}#woocommerce-order-items .wc-order-edit-line-item-actions .delete-order-item::before,#woocommerce-order-items .wc-order-edit-line-item-actions .delete_refund::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";position:relative}#woocommerce-order-items .wc-order-edit-line-item-actions .delete-order-item:hover::before,#woocommerce-order-items .wc-order-edit-line-item-actions .delete_refund:hover::before{color:#a00}#woocommerce-order-items tbody tr .wc-order-edit-line-item-actions{visibility:hidden}#woocommerce-order-items tbody tr:hover .wc-order-edit-line-item-actions{visibility:visible}#woocommerce-order-items .wc-order-totals .wc-order-edit-line-item-actions{width:1.5em;visibility:visible!important}#woocommerce-order-items .wc-order-totals .wc-order-edit-line-item-actions a{padding:0}#woocommerce-order-downloads .buttons{float:left;padding:0;margin:0;vertical-align:top}#woocommerce-order-downloads .buttons .add_item_id,#woocommerce-order-downloads .buttons .select2-container{width:400px!important;margin-right:9px;vertical-align:top;float:left}#woocommerce-order-downloads .buttons button{margin:2px 0 0}#woocommerce-order-downloads h3 small{color:#999}#poststuff #woocommerce-order-actions .inside{margin:0;padding:0}#poststuff #woocommerce-order-actions .inside ul.order_actions li{padding:6px 10px;box-sizing:border-box}#poststuff #woocommerce-order-actions .inside ul.order_actions li:last-child{border-bottom:0}#poststuff #woocommerce-order-notes .inside{margin:0;padding:0}#poststuff #woocommerce-order-notes .inside ul.order_notes li{padding:0 10px}#woocommerce_customers p.search-box{margin:6px 0 4px;float:left}#woocommerce_customers .tablenav{float:right;clear:none}.widefat.customers td{vertical-align:middle;padding:4px 7px}.widefat .column-order_title{width:15%}.widefat .column-order_title time{display:block;color:#999;margin:3px 0}.widefat .column-orders,.widefat .column-paying,.widefat .column-spent{text-align:center;width:8%}.widefat .column-last_order{width:11%}.widefat .column-wc_actions{width:110px}.widefat .column-wc_actions a.button{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;display:inline-block;margin:2px 4px 2px 0;padding:0!important;height:2em!important;width:2em;overflow:hidden;vertical-align:middle}.widefat .column-wc_actions a.button::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;line-height:1.85}.widefat .column-wc_actions a.button img{display:block;width:12px;height:auto}.widefat .column-wc_actions a.edit::after{content:'\f464'}.widefat .column-wc_actions a.link::after{font-family:WooCommerce;content:'\e00d'}.widefat .column-wc_actions a.view::after{content:'\f177'}.widefat .column-wc_actions a.refresh::after{font-family:WooCommerce;content:'\e031'}.widefat .column-wc_actions a.processing::after{font-family:WooCommerce;content:'\e00f'}.widefat .column-wc_actions a.complete::after{content:'\f147'}.widefat small.meta{display:block;color:#999;font-size:inherit;margin:3px 0}.post-type-shop_order .tablenav .one-page .displaying-num{display:none}.post-type-shop_order .wp-list-table{margin-top:1em}.post-type-shop_order .wp-list-table tfoot th,.post-type-shop_order .wp-list-table thead th{padding:.75em 1em}.post-type-shop_order .wp-list-table tfoot th.sortable a,.post-type-shop_order .wp-list-table tfoot th.sorted a,.post-type-shop_order .wp-list-table thead th.sortable a,.post-type-shop_order .wp-list-table thead th.sorted a{padding:0}.post-type-shop_order .wp-list-table tfoot th:first-child,.post-type-shop_order .wp-list-table thead th:first-child{padding-left:2em}.post-type-shop_order .wp-list-table tfoot th:last-child,.post-type-shop_order .wp-list-table thead th:last-child{padding-right:2em}.post-type-shop_order .wp-list-table tbody td,.post-type-shop_order .wp-list-table tbody th{padding:1em;line-height:26px}.post-type-shop_order .wp-list-table tbody td:first-child{padding-left:2em}.post-type-shop_order .wp-list-table tbody td:last-child{padding-right:2em}.post-type-shop_order .wp-list-table tbody tr{border-top:1px solid #f5f5f5}.post-type-shop_order .wp-list-table tbody tr:hover:not(.status-trash):not(.no-link) td{cursor:pointer}.post-type-shop_order .wp-list-table .no-link{cursor:default!important}.post-type-shop_order .wp-list-table td,.post-type-shop_order .wp-list-table th{width:12ch;vertical-align:middle}.post-type-shop_order .wp-list-table td p,.post-type-shop_order .wp-list-table th p{margin:0}.post-type-shop_order .wp-list-table .check-column{width:1px;white-space:nowrap;padding:1em 1em 1em 1em!important;vertical-align:middle}.post-type-shop_order .wp-list-table .check-column input{vertical-align:text-top;margin:1px 0}.post-type-shop_order .wp-list-table .column-order_number{width:20ch}.post-type-shop_order .wp-list-table .column-order_total{width:8ch;text-align:right}.post-type-shop_order .wp-list-table .column-order_total a span{float:right}.post-type-shop_order .wp-list-table .column-order_date,.post-type-shop_order .wp-list-table .column-order_status{width:10ch}.post-type-shop_order .wp-list-table .column-order_status{width:14ch}.post-type-shop_order .wp-list-table .column-billing_address,.post-type-shop_order .wp-list-table .column-shipping_address{width:20ch;line-height:1.5em}.post-type-shop_order .wp-list-table .column-billing_address .description,.post-type-shop_order .wp-list-table .column-shipping_address .description{display:block;color:#999}.post-type-shop_order .wp-list-table .column-wc_actions{text-align:right}.post-type-shop_order .wp-list-table .column-wc_actions a.button{text-indent:9999px;margin:2px 0 2px 4px}.post-type-shop_order .wp-list-table .order-preview{float:right;width:16px;padding:20px 4px 4px 4px;height:0;overflow:hidden;position:relative;border:2px solid transparent;border-radius:4px}.post-type-shop_order .wp-list-table .order-preview::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";line-height:16px;font-size:14px;vertical-align:middle;top:4px}.post-type-shop_order .wp-list-table .order-preview:hover{border:2px solid #00a0d2}.post-type-shop_order .wp-list-table .order-preview.disabled::before{content:'';background:url(../images/wpspin.gif) no-repeat center top}.order-status{display:-webkit-inline-box;display:inline-flex;line-height:2.5em;color:#777;background:#e5e5e5;border-radius:4px;border-bottom:1px solid rgba(0,0,0,.05);margin:-.25em 0;cursor:inherit!important;white-space:nowrap;max-width:100%}.order-status.status-completed{background:#c8d7e1;color:#2e4453}.order-status.status-on-hold{background:#f8dda7;color:#94660c}.order-status.status-failed{background:#eba3a3;color:#761919}.order-status.status-processing{background:#c6e1c6;color:#5b841b}.order-status.status-trash{background:#eba3a3;color:#761919}.order-status>span{margin:0 1em;overflow:hidden;text-overflow:ellipsis}.wc-order-preview .order-status{float:right;margin-right:54px}.wc-order-preview article{padding:0!important}.wc-order-preview .modal-close{border-radius:0}.wc-order-preview .wc-order-preview-table{width:100%;margin:0}.wc-order-preview .wc-order-preview-table td,.wc-order-preview .wc-order-preview-table th{padding:1em 1.5em;text-align:left;border:0;border-bottom:1px solid #eee;margin:0;background:0 0;box-shadow:none;text-align:right;vertical-align:top}.wc-order-preview .wc-order-preview-table td:first-child,.wc-order-preview .wc-order-preview-table th:first-child{text-align:left}.wc-order-preview .wc-order-preview-table th{border-color:#ccc}.wc-order-preview .wc-order-preview-table tr:last-child td{border:0}.wc-order-preview .wc-order-preview-table .wc-order-item-sku{margin-top:.5em}.wc-order-preview .wc-order-preview-table .wc-order-item-meta{margin-top:.5em}.wc-order-preview .wc-order-preview-table .wc-order-item-meta td,.wc-order-preview .wc-order-preview-table .wc-order-item-meta th{padding:0;border:0;text-align:left;vertical-align:top}.wc-order-preview .wc-order-preview-table .wc-order-item-meta td:last-child{padding-left:.5em}.wc-order-preview .wc-order-preview-addresses{overflow:hidden;padding-bottom:1.5em}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note{width:50%;float:left;padding:1.5em 1.5em 0;box-sizing:border-box;word-wrap:break-word}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address h2,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note h2{margin-top:0}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address strong,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note strong{display:block;margin-top:1.5em}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address strong:first-child,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note strong:first-child{margin-top:0}.wc-order-preview footer .wc-action-button-group{display:inline-block;float:left}.wc-order-preview footer .button.button-large{margin-left:10px;padding:0 10px!important;line-height:28px;height:auto;display:inline-block}.wc-order-preview .wc-action-button-group label{display:none}.wc-action-button-group{vertical-align:middle;line-height:26px;text-align:left}.wc-action-button-group label{margin-right:6px;cursor:default;font-weight:700;line-height:28px}.wc-action-button-group .wc-action-button-group__items{display:-webkit-inline-box;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row wrap;align-content:flex-start;-webkit-box-pack:start;justify-content:flex-start}.wc-action-button-group .wc-action-button{margin:0 0 0 -1px!important;border:1px solid #ccc;padding:0 10px!important;border-radius:0!important;float:none;line-height:28px;height:auto;z-index:1;position:relative;overflow:hidden;text-overflow:ellipsis;-webkit-box-flex:1;flex:1 0 auto;box-sizing:border-box;text-align:center;white-space:nowrap}.wc-action-button-group .wc-action-button:focus,.wc-action-button-group .wc-action-button:hover{border:1px solid #999;z-index:2}.wc-action-button-group .wc-action-button:first-child{margin-left:0!important;border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}.wc-action-button-group .wc-action-button:last-child{border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}@media screen and (max-width:782px){.wc-order-preview footer .wc-action-button-group .wc-action-button-group__items{display:-webkit-box;display:flex}.wc-order-preview footer .wc-action-button-group{float:none;display:block;margin-bottom:4px}.wc-order-preview footer .button.button-large{width:100%;float:none;text-align:center;margin:0;display:block}.post-type-shop_order .wp-list-table td.check-column{width:1em}.post-type-shop_order .wp-list-table td.column-order_number{padding-left:0;padding-bottom:.5em}.post-type-shop_order .wp-list-table td.column-order_date,.post-type-shop_order .wp-list-table td.column-order_status{display:inline-block!important;padding:0 1em 1em 1em!important}.post-type-shop_order .wp-list-table td.column-order_date:before,.post-type-shop_order .wp-list-table td.column-order_status:before{display:none!important}.post-type-shop_order .wp-list-table td.column-order_date{padding-left:0!important}.post-type-shop_order .wp-list-table td.column-order_status{float:right}}.column-customer_message .note-on{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto;color:#999}.column-customer_message .note-on::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";line-height:16px}.column-order_notes .note-on{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto;color:#999}.column-order_notes .note-on::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";line-height:16px}.attributes-table td,.attributes-table th{width:15%;vertical-align:top}.attributes-table .attribute-terms{width:32%}.attributes-table .attribute-actions{width:2em}.attributes-table .attribute-actions .configure-terms{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;padding:0!important;height:2em!important;width:2em}.attributes-table .attribute-actions .configure-terms::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";font-family:Dashicons;line-height:1.85}ul.order_notes{padding:2px 0 0}ul.order_notes li .note_content{padding:10px;background:#efefef;position:relative}ul.order_notes li .note_content p{margin:0;padding:0;word-wrap:break-word}ul.order_notes li p.meta{padding:10px;color:#999;margin:0;font-size:11px}ul.order_notes li p.meta .exact-date{border-bottom:1px dotted #999}ul.order_notes li a.delete_note{color:#a00}ul.order_notes li .note_content::after{content:'';display:block;position:absolute;bottom:-10px;left:20px;width:0;height:0;border-width:10px 10px 0 0;border-style:solid;border-color:#efefef transparent}ul.order_notes li.system-note .note_content{background:#d7cad2}ul.order_notes li.system-note .note_content::after{border-color:#d7cad2 transparent}ul.order_notes li.customer-note .note_content{background:#a7cedc}ul.order_notes li.customer-note .note_content::after{border-color:#a7cedc transparent}.add_note{border-top:1px solid #ddd;padding:10px 10px 0}.add_note h4{margin-top:5px!important}.add_note #add_order_note{width:100%;height:50px}table.wp-list-table .column-thumb{width:52px;text-align:center;white-space:nowrap}table.wp-list-table .column-handle{width:17px;display:none}table.wp-list-table tbody td.column-handle{cursor:move;width:17px;text-align:center;vertical-align:text-top}table.wp-list-table tbody td.column-handle::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;height:100%;margin:4px 0 0 0}table.wp-list-table .column-name{width:22%}table.wp-list-table .column-product_cat,table.wp-list-table .column-product_tag{width:11%!important}table.wp-list-table .column-featured,table.wp-list-table .column-product_type{width:48px;text-align:left!important}table.wp-list-table .column-customer_message,table.wp-list-table .column-order_notes{width:48px;text-align:center}table.wp-list-table .column-customer_message img,table.wp-list-table .column-order_notes img{margin:0 auto;padding-top:0!important}table.wp-list-table .manage-column.column-featured img,table.wp-list-table .manage-column.column-product_type img{padding-left:2px}table.wp-list-table .column-price .woocommerce-price-suffix{display:none}table.wp-list-table img{margin:1px 2px}table.wp-list-table .row-actions{color:#999}table.wp-list-table td.column-thumb img{margin:0;width:auto;height:auto;max-width:40px;max-height:40px;vertical-align:middle}table.wp-list-table span.na{color:#999}table.wp-list-table .column-sku{width:10%}table.wp-list-table .column-price{width:10ch}table.wp-list-table .column-is_in_stock{text-align:left!important;width:12ch}table.wp-list-table span.wc-featured,table.wp-list-table span.wc-image{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto}table.wp-list-table span.wc-featured::before,table.wp-list-table span.wc-image::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}table.wp-list-table span.wc-featured::before{content:'\f155'}table.wp-list-table span.wc-featured.not-featured::before{content:'\f154'}table.wp-list-table td.column-featured span.wc-featured{font-size:1.6em;cursor:pointer}table.wp-list-table mark.instock,table.wp-list-table mark.onbackorder,table.wp-list-table mark.outofstock{font-weight:700;background:transparent none;line-height:1}table.wp-list-table mark.instock{color:#7ad03a}table.wp-list-table mark.outofstock{color:#a44}table.wp-list-table mark.onbackorder{color:#eaa600}table.wp-list-table .notes_head,table.wp-list-table .order-notes_head,table.wp-list-table .status_head{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto}table.wp-list-table .notes_head::after,table.wp-list-table .order-notes_head::after,table.wp-list-table .status_head::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}table.wp-list-table .order-notes_head::after{content:'\e028'}table.wp-list-table .notes_head::after{content:'\e026'}table.wp-list-table .status_head::after{content:'\e011'}table.wp-list-table .column-order_items{width:12%}table.wp-list-table .column-order_items table.order_items{width:100%;margin:3px 0 0;padding:0;display:none}table.wp-list-table .column-order_items table.order_items td{border:0;margin:0;padding:0 0 3px}table.wp-list-table .column-order_items table.order_items td.qty{color:#999;padding-right:6px;text-align:left}mark.notice{background:#fff;color:#a00;margin:0 0 0 10px}a.export_rates,a.import_rates{float:right;margin-left:9px;margin-top:-2px;margin-bottom:0}#rates-search{float:right}#rates-search input.wc-tax-rates-search-field{padding:4px 8px;font-size:1.2em}#rates-pagination{float:right;margin-right:.5em}#rates-pagination .tablenav{margin:0}.wc_input_table_wrapper{overflow-x:auto;display:block}table.wc_input_table,table.wc_tax_rates{width:100%}table.wc_input_table td,table.wc_input_table th,table.wc_tax_rates td,table.wc_tax_rates th{display:table-cell!important}table.wc_input_table span.tips,table.wc_tax_rates span.tips{color:#2ea2cc}table.wc_input_table th,table.wc_tax_rates th{white-space:nowrap;padding:10px}table.wc_input_table td,table.wc_tax_rates td{padding:0;border-right:1px solid #dfdfdf;border-bottom:1px solid #dfdfdf;border-top:0;background:#fff;cursor:default}table.wc_input_table td input[type=number],table.wc_input_table td input[type=text],table.wc_tax_rates td input[type=number],table.wc_tax_rates td input[type=text]{width:100%!important;min-width:100px;padding:8px 10px;margin:0;border:0;outline:0;background:transparent none}table.wc_input_table td input[type=number]:focus,table.wc_input_table td input[type=text]:focus,table.wc_tax_rates td input[type=number]:focus,table.wc_tax_rates td input[type=text]:focus{outline:0;box-shadow:none}table.wc_input_table td.apply_to_shipping,table.wc_input_table td.compound,table.wc_tax_rates td.apply_to_shipping,table.wc_tax_rates td.compound{padding:5px 7px;vertical-align:middle}table.wc_input_table td.apply_to_shipping input,table.wc_input_table td.compound input,table.wc_tax_rates td.apply_to_shipping input,table.wc_tax_rates td.compound input{width:auto;padding:0}table.wc_input_table td:last-child,table.wc_tax_rates td:last-child{border-right:0}table.wc_input_table tr.current td,table.wc_tax_rates tr.current td{background-color:#fefbcc}table.wc_input_table .cost,table.wc_input_table .item_cost,table.wc_tax_rates .cost,table.wc_tax_rates .item_cost{text-align:right}table.wc_input_table .cost input,table.wc_input_table .item_cost input,table.wc_tax_rates .cost input,table.wc_tax_rates .item_cost input{text-align:right}table.wc_input_table th.sort,table.wc_tax_rates th.sort{width:17px;padding:0 4px}table.wc_input_table td.sort,table.wc_tax_rates td.sort{padding:0 4px}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort{cursor:move;font-size:15px;background:#f9f9f9;text-align:center;vertical-align:middle}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort::before,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:left;height:100%}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort:hover::before,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort:hover::before{color:#333}table.wc_input_table .button,table.wc_tax_rates .button{float:left;margin-right:5px}table.wc_input_table .export,table.wc_input_table .import,table.wc_tax_rates .export,table.wc_tax_rates .import{float:right;margin-right:0;margin-left:5px}table.wc_input_table span.tips,table.wc_tax_rates span.tips{padding:0 3px}table.wc_input_table .pagination,table.wc_tax_rates .pagination{float:right}table.wc_input_table .pagination .button,table.wc_tax_rates .pagination .button{margin-left:5px;margin-right:0}table.wc_input_table .pagination .current,table.wc_tax_rates .pagination .current{background:#bbb;text-shadow:none}table.wc_input_table tr:last-child td,table.wc_tax_rates tr:last-child td{border-bottom:0}table.wc_emails,table.wc_gateways,table.wc_shipping{position:relative}table.wc_emails td,table.wc_emails th,table.wc_gateways td,table.wc_gateways th,table.wc_shipping td,table.wc_shipping th{display:table-cell!important;padding:1em!important;vertical-align:top;line-height:1.75em}table.wc_emails.wc_emails td,table.wc_gateways.wc_emails td,table.wc_shipping.wc_emails td{vertical-align:middle}table.wc_emails tr:nth-child(odd) td,table.wc_gateways tr:nth-child(odd) td,table.wc_shipping tr:nth-child(odd) td{background:#f9f9f9}table.wc_emails td.name,table.wc_gateways td.name,table.wc_shipping td.name{font-weight:700}table.wc_emails .settings,table.wc_gateways .settings,table.wc_shipping .settings{text-align:right}table.wc_emails .default,table.wc_emails .radio,table.wc_emails .status,table.wc_gateways .default,table.wc_gateways .radio,table.wc_gateways .status,table.wc_shipping .default,table.wc_shipping .radio,table.wc_shipping .status{text-align:center}table.wc_emails .default .tips,table.wc_emails .radio .tips,table.wc_emails .status .tips,table.wc_gateways .default .tips,table.wc_gateways .radio .tips,table.wc_gateways .status .tips,table.wc_shipping .default .tips,table.wc_shipping .radio .tips,table.wc_shipping .status .tips{margin:0 auto}table.wc_emails .default input,table.wc_emails .radio input,table.wc_emails .status input,table.wc_gateways .default input,table.wc_gateways .radio input,table.wc_gateways .status input,table.wc_shipping .default input,table.wc_shipping .radio input,table.wc_shipping .status input{margin:0}table.wc_emails td.sort,table.wc_gateways td.sort,table.wc_shipping td.sort{font-size:15px;text-align:center}table.wc_emails td.sort .wc-item-reorder-nav,table.wc_gateways td.sort .wc-item-reorder-nav,table.wc_shipping td.sort .wc-item-reorder-nav{white-space:nowrap;width:72px}table.wc_emails td.sort .wc-item-reorder-nav:before,table.wc_gateways td.sort .wc-item-reorder-nav:before,table.wc_shipping td.sort .wc-item-reorder-nav:before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:24px;float:left;height:100%;line-height:24px;cursor:move}table.wc_emails td.sort .wc-item-reorder-nav button,table.wc_gateways td.sort .wc-item-reorder-nav button,table.wc_shipping td.sort .wc-item-reorder-nav button{position:relative;overflow:hidden;float:left;display:block;width:24px;height:24px;margin:0;background:0 0;border:none;box-shadow:none;color:#82878c;text-indent:-9999px;cursor:pointer;outline:0}table.wc_emails td.sort .wc-item-reorder-nav button:before,table.wc_gateways td.sort .wc-item-reorder-nav button:before,table.wc_shipping td.sort .wc-item-reorder-nav button:before{display:inline-block;position:absolute;top:0;right:0;width:100%;height:100%;font:normal 20px/23px dashicons;text-align:center;text-indent:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}table.wc_emails td.sort .wc-item-reorder-nav button:focus,table.wc_emails td.sort .wc-item-reorder-nav button:hover,table.wc_gateways td.sort .wc-item-reorder-nav button:focus,table.wc_gateways td.sort .wc-item-reorder-nav button:hover,table.wc_shipping td.sort .wc-item-reorder-nav button:focus,table.wc_shipping td.sort .wc-item-reorder-nav button:hover{color:#191e23}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-down:before,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-down:before,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-down:before{content:"\f347"}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-up:before,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-up:before,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-up:before{content:"\f343"}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-disabled,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-disabled,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-disabled{color:#d5d5d5!important;cursor:default;pointer-events:none}table.wc_emails .wc-payment-gateway-method-name,table.wc_gateways .wc-payment-gateway-method-name,table.wc_shipping .wc-payment-gateway-method-name{font-weight:400}table.wc_emails .wc-email-settings-table-name,table.wc_gateways .wc-email-settings-table-name,table.wc_shipping .wc-email-settings-table-name{font-weight:700}table.wc_emails .wc-email-settings-table-name span,table.wc_gateways .wc-email-settings-table-name span,table.wc_shipping .wc-email-settings-table-name span{font-weight:400;color:#999;margin:0 0 0 4px!important}table.wc_emails .wc-payment-gateway-method-toggle-disabled,table.wc_emails .wc-payment-gateway-method-toggle-enabled,table.wc_gateways .wc-payment-gateway-method-toggle-disabled,table.wc_gateways .wc-payment-gateway-method-toggle-enabled,table.wc_shipping .wc-payment-gateway-method-toggle-disabled,table.wc_shipping .wc-payment-gateway-method-toggle-enabled{padding-top:1px;display:block;outline:0;box-shadow:none}table.wc_emails .wc-email-settings-table-status,table.wc_gateways .wc-email-settings-table-status,table.wc_shipping .wc-email-settings-table-status{text-align:center;width:1em}table.wc_emails .wc-email-settings-table-status .tips,table.wc_gateways .wc-email-settings-table-status .tips,table.wc_shipping .wc-email-settings-table-status .tips{margin:0 auto}.wc-shipping-zone-settings th{padding:24px 24px 24px 0}.wc-shipping-zone-settings td.forminp input,.wc-shipping-zone-settings td.forminp textarea{padding:8px;width:448px;max-width:100%!important}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select{width:448px;max-width:100%!important}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices{padding:8px 8px 4px;border-color:#ddd;min-height:0;line-height:1}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices input{padding:0}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices li{margin:0 4px 4px 0}.wc-shipping-zone-settings .wc-shipping-zone-postcodes-toggle{margin:.5em 0 0;font-size:.9em;text-decoration:underline;display:block}.wc-shipping-zone-settings .wc-shipping-zone-postcodes-toggle+.wc-shipping-zone-postcodes{display:none}.wc-shipping-zone-settings .wc-shipping-zone-postcodes textarea{margin:10px 0}.wc-shipping-zone-settings .wc-shipping-zone-postcodes .description{font-size:.9em;color:#999}.wc-shipping-zone-settings+p.submit{margin-top:0}table tr table.wc-shipping-zone-methods tr .row-actions,table tr:hover table.wc-shipping-zone-methods tr .row-actions{position:relative}table tr table.wc-shipping-zone-methods tr:hover .row-actions,table tr:hover table.wc-shipping-zone-methods tr:hover .row-actions{position:static}.wc-shipping-zones-heading .page-title-action{display:inline-block}table.wc-shipping-classes td,table.wc-shipping-classes th,table.wc-shipping-zone-methods td,table.wc-shipping-zone-methods th,table.wc-shipping-zones td,table.wc-shipping-zones th{vertical-align:top;line-height:24px;padding:1em!important;font-size:14px;background:#fff;display:table-cell!important}table.wc-shipping-classes td li,table.wc-shipping-classes th li,table.wc-shipping-zone-methods td li,table.wc-shipping-zone-methods th li,table.wc-shipping-zones td li,table.wc-shipping-zones th li{line-height:24px;font-size:14px}table.wc-shipping-classes td .woocommerce-help-tip,table.wc-shipping-classes th .woocommerce-help-tip,table.wc-shipping-zone-methods td .woocommerce-help-tip,table.wc-shipping-zone-methods th .woocommerce-help-tip,table.wc-shipping-zones td .woocommerce-help-tip,table.wc-shipping-zones th .woocommerce-help-tip{margin:0!important}table.wc-shipping-classes thead th,table.wc-shipping-zone-methods thead th,table.wc-shipping-zones thead th{vertical-align:middle}table.wc-shipping-classes thead .wc-shipping-zone-sort,table.wc-shipping-zone-methods thead .wc-shipping-zone-sort,table.wc-shipping-zones thead .wc-shipping-zone-sort{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state,table.wc-shipping-classes td.wc-shipping-zones-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zones-blank-state{background:#f7f1f6!important;overflow:hidden;position:relative;padding:7.5em 7.5%!important;border-bottom:2px solid #eee2ec}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-classes td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state{padding:2em!important}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-classes td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p{margin-bottom:0}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li,table.wc-shipping-classes td.wc-shipping-zone-method-blank-state p,table.wc-shipping-classes td.wc-shipping-zones-blank-state li,table.wc-shipping-classes td.wc-shipping-zones-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state p,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zones-blank-state li,table.wc-shipping-zones td.wc-shipping-zones-blank-state p{color:#a46497;font-size:1.5em;line-height:1.5em;margin:0 0 1em;position:relative;z-index:1;text-shadow:1px 1px 1px #fff}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-classes td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-classes td.wc-shipping-zones-blank-state li.main,table.wc-shipping-classes td.wc-shipping-zones-blank-state p.main,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li.main,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state p.main,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-zones td.wc-shipping-zones-blank-state li.main,table.wc-shipping-zones td.wc-shipping-zones-blank-state p.main{font-size:2em}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li,table.wc-shipping-classes td.wc-shipping-zones-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zones td.wc-shipping-zones-blank-state li{margin-left:1em;list-style:circle inside}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-classes td.wc-shipping-zones-blank-state::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state::before,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-zones td.wc-shipping-zones-blank-state::before{content:'\e01b';font-family:WooCommerce;text-align:center;line-height:1;color:#eee2ec;display:block;width:1em;font-size:40em;top:50%;right:-3.75%;margin-top:-.1875em;position:absolute}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-classes td.wc-shipping-zones-blank-state .button-primary,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state .button-primary,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-zones td.wc-shipping-zones-blank-state .button-primary{background-color:#804877;border-color:#804877;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 0 rgba(0,0,0,.15);margin:0;opacity:1;text-shadow:0 -1px 1px #8a4f7f,1px 0 1px #8a4f7f,0 1px 1px #8a4f7f,-1px 0 1px #8a4f7f;font-size:1.5em;padding:.75em 1em;height:auto;position:relative;z-index:1}table.wc-shipping-classes .wc-shipping-zone-method-rows tr:nth-child(even) td,table.wc-shipping-zone-methods .wc-shipping-zone-method-rows tr:nth-child(even) td,table.wc-shipping-zones .wc-shipping-zone-method-rows tr:nth-child(even) td{background:#f9f9f9}table.wc-shipping-classes .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-classes tr.odd td,table.wc-shipping-zone-methods .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-zone-methods tr.odd td,table.wc-shipping-zones .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-zones tr.odd td{background:#f9f9f9}table.wc-shipping-classes tbody.wc-shipping-zone-rows td,table.wc-shipping-zone-methods tbody.wc-shipping-zone-rows td,table.wc-shipping-zones tbody.wc-shipping-zone-rows td{border-top:2px solid #f9f9f9}table.wc-shipping-classes tbody.wc-shipping-zone-rows tr:first-child td,table.wc-shipping-zone-methods tbody.wc-shipping-zone-rows tr:first-child td,table.wc-shipping-zones tbody.wc-shipping-zone-rows tr:first-child td{border-top:0}table.wc-shipping-classes tr.wc-shipping-zone-worldwide td,table.wc-shipping-zone-methods tr.wc-shipping-zone-worldwide td,table.wc-shipping-zones tr.wc-shipping-zone-worldwide td{background:#f9f9f9;border-top:2px solid #e1e1e1}table.wc-shipping-classes p,table.wc-shipping-classes ul,table.wc-shipping-zone-methods p,table.wc-shipping-zone-methods ul,table.wc-shipping-zones p,table.wc-shipping-zones ul{margin:0}table.wc-shipping-classes td.wc-shipping-zone-method-sort,table.wc-shipping-classes td.wc-shipping-zone-sort,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort,table.wc-shipping-zone-methods td.wc-shipping-zone-sort,table.wc-shipping-zones td.wc-shipping-zone-method-sort,table.wc-shipping-zones td.wc-shipping-zone-sort{cursor:move;font-size:15px;text-align:center}table.wc-shipping-classes td.wc-shipping-zone-method-sort::before,table.wc-shipping-classes td.wc-shipping-zone-sort::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort::before,table.wc-shipping-zone-methods td.wc-shipping-zone-sort::before,table.wc-shipping-zones td.wc-shipping-zone-method-sort::before,table.wc-shipping-zones td.wc-shipping-zone-sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:left;height:100%;line-height:24px}table.wc-shipping-classes td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-classes td.wc-shipping-zone-sort:hover::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-zone-methods td.wc-shipping-zone-sort:hover::before,table.wc-shipping-zones td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-zones td.wc-shipping-zone-sort:hover::before{color:#333}table.wc-shipping-classes td.wc-shipping-zone-worldwide,table.wc-shipping-zone-methods td.wc-shipping-zone-worldwide,table.wc-shipping-zones td.wc-shipping-zone-worldwide{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-worldwide::before,table.wc-shipping-zone-methods td.wc-shipping-zone-worldwide::before,table.wc-shipping-zones td.wc-shipping-zone-worldwide::before{content:'\f319';font-family:dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:left;height:100%;line-height:24px}table.wc-shipping-classes .wc-shipping-zone-methods,table.wc-shipping-classes .wc-shipping-zone-name,table.wc-shipping-zone-methods .wc-shipping-zone-methods,table.wc-shipping-zone-methods .wc-shipping-zone-name,table.wc-shipping-zones .wc-shipping-zone-methods,table.wc-shipping-zones .wc-shipping-zone-name{width:25%}table.wc-shipping-classes .wc-shipping-class-description input,table.wc-shipping-classes .wc-shipping-class-description select,table.wc-shipping-classes .wc-shipping-class-description textarea,table.wc-shipping-classes .wc-shipping-class-name input,table.wc-shipping-classes .wc-shipping-class-name select,table.wc-shipping-classes .wc-shipping-class-name textarea,table.wc-shipping-classes .wc-shipping-class-slug input,table.wc-shipping-classes .wc-shipping-class-slug select,table.wc-shipping-classes .wc-shipping-class-slug textarea,table.wc-shipping-classes .wc-shipping-zone-name input,table.wc-shipping-classes .wc-shipping-zone-name select,table.wc-shipping-classes .wc-shipping-zone-name textarea,table.wc-shipping-classes .wc-shipping-zone-region input,table.wc-shipping-classes .wc-shipping-zone-region select,table.wc-shipping-classes .wc-shipping-zone-region textarea,table.wc-shipping-zone-methods .wc-shipping-class-description input,table.wc-shipping-zone-methods .wc-shipping-class-description select,table.wc-shipping-zone-methods .wc-shipping-class-description textarea,table.wc-shipping-zone-methods .wc-shipping-class-name input,table.wc-shipping-zone-methods .wc-shipping-class-name select,table.wc-shipping-zone-methods .wc-shipping-class-name textarea,table.wc-shipping-zone-methods .wc-shipping-class-slug input,table.wc-shipping-zone-methods .wc-shipping-class-slug select,table.wc-shipping-zone-methods .wc-shipping-class-slug textarea,table.wc-shipping-zone-methods .wc-shipping-zone-name input,table.wc-shipping-zone-methods .wc-shipping-zone-name select,table.wc-shipping-zone-methods .wc-shipping-zone-name textarea,table.wc-shipping-zone-methods .wc-shipping-zone-region input,table.wc-shipping-zone-methods .wc-shipping-zone-region select,table.wc-shipping-zone-methods .wc-shipping-zone-region textarea,table.wc-shipping-zones .wc-shipping-class-description input,table.wc-shipping-zones .wc-shipping-class-description select,table.wc-shipping-zones .wc-shipping-class-description textarea,table.wc-shipping-zones .wc-shipping-class-name input,table.wc-shipping-zones .wc-shipping-class-name select,table.wc-shipping-zones .wc-shipping-class-name textarea,table.wc-shipping-zones .wc-shipping-class-slug input,table.wc-shipping-zones .wc-shipping-class-slug select,table.wc-shipping-zones .wc-shipping-class-slug textarea,table.wc-shipping-zones .wc-shipping-zone-name input,table.wc-shipping-zones .wc-shipping-zone-name select,table.wc-shipping-zones .wc-shipping-zone-name textarea,table.wc-shipping-zones .wc-shipping-zone-region input,table.wc-shipping-zones .wc-shipping-zone-region select,table.wc-shipping-zones .wc-shipping-zone-region textarea{width:100%}table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-zone-delete{color:#a00}table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-zone-delete:hover{color:red}table.wc-shipping-classes .wc-shipping-class-count,table.wc-shipping-zone-methods .wc-shipping-class-count,table.wc-shipping-zones .wc-shipping-class-count{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-methods,table.wc-shipping-zone-methods td.wc-shipping-zone-methods,table.wc-shipping-zones td.wc-shipping-zone-methods{color:#555}table.wc-shipping-classes td.wc-shipping-zone-methods .method_disabled,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .method_disabled,table.wc-shipping-zones td.wc-shipping-zone-methods .method_disabled{text-decoration:line-through}table.wc-shipping-classes td.wc-shipping-zone-methods ul,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul,table.wc-shipping-zones td.wc-shipping-zone-methods ul{position:relative;padding-right:32px}table.wc-shipping-classes td.wc-shipping-zone-methods ul li,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li,table.wc-shipping-zones td.wc-shipping-zone-methods ul li{color:#555;display:inline;margin:0}table.wc-shipping-classes td.wc-shipping-zone-methods ul li::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li::before,table.wc-shipping-zones td.wc-shipping-zone-methods ul li::before{content:', '}table.wc-shipping-classes td.wc-shipping-zone-methods ul li:first-child::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li:first-child::before,table.wc-shipping-zones td.wc-shipping-zone-methods ul li:first-child::before{content:''}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method{display:block;width:24px;padding:24px 0 0;height:0;overflow:hidden;cursor:pointer}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method::before,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";font-family:Dashicons;content:'\f502';color:#999;vertical-align:middle;line-height:24px;font-size:16px;margin:0}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method.disabled,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method.disabled,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method.disabled{cursor:not-allowed}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method.disabled::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method.disabled::before,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method.disabled::before{color:#ccc}table.wc-shipping-classes .wc-shipping-zone-method-title,table.wc-shipping-zone-methods .wc-shipping-zone-method-title,table.wc-shipping-zones .wc-shipping-zone-method-title{width:25%}table.wc-shipping-classes .wc-shipping-zone-method-title .wc-shipping-zone-method-delete,table.wc-shipping-zone-methods .wc-shipping-zone-method-title .wc-shipping-zone-method-delete,table.wc-shipping-zones .wc-shipping-zone-method-title .wc-shipping-zone-method-delete{color:red}table.wc-shipping-classes .wc-shipping-zone-method-enabled,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled,table.wc-shipping-zones .wc-shipping-zone-method-enabled{text-align:center}table.wc-shipping-classes .wc-shipping-zone-method-enabled a,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled a,table.wc-shipping-zones .wc-shipping-zone-method-enabled a{display:inline-block}table.wc-shipping-classes .wc-shipping-zone-method-enabled .woocommerce-input-toggle,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled .woocommerce-input-toggle,table.wc-shipping-zones .wc-shipping-zone-method-enabled .woocommerce-input-toggle{margin-top:3px}table.wc-shipping-classes .wc-shipping-zone-method-type,table.wc-shipping-zone-methods .wc-shipping-zone-method-type,table.wc-shipping-zones .wc-shipping-zone-method-type{display:block}table.wc-shipping-classes tfoot input,table.wc-shipping-classes tfoot select,table.wc-shipping-zone-methods tfoot input,table.wc-shipping-zone-methods tfoot select,table.wc-shipping-zones tfoot input,table.wc-shipping-zones tfoot select{vertical-align:middle!important}table.wc-shipping-classes tfoot .button-secondary,table.wc-shipping-zone-methods tfoot .button-secondary,table.wc-shipping-zones tfoot .button-secondary{float:right}table.wc-shipping-classes .editing .wc-shipping-zone-edit,table.wc-shipping-classes .editing .wc-shipping-zone-view,table.wc-shipping-zone-methods .editing .wc-shipping-zone-edit,table.wc-shipping-zone-methods .editing .wc-shipping-zone-view,table.wc-shipping-zones .editing .wc-shipping-zone-edit,table.wc-shipping-zones .editing .wc-shipping-zone-view{display:none}.woocommerce-input-toggle{height:16px;width:32px;border:2px solid #935687;background-color:#935687;display:inline-block;text-indent:-9999px;border-radius:10em;position:relative;margin-top:-1px;vertical-align:text-top}.woocommerce-input-toggle:before{content:"";display:block;width:16px;height:16px;background:#fff;position:absolute;top:0;right:0;border-radius:100%}.woocommerce-input-toggle.woocommerce-input-toggle--disabled{border-color:#999;background-color:#999}.woocommerce-input-toggle.woocommerce-input-toggle--disabled:before{right:auto;left:0}.woocommerce-input-toggle.woocommerce-input-toggle--loading{opacity:.5}.wc-modal-shipping-method-settings{background:#f8f8f8;padding:1em!important}.wc-modal-shipping-method-settings form .form-table{width:100%;background:#fff;margin:0 0 1.5em}.wc-modal-shipping-method-settings form .form-table tr th{width:30%;position:relative}.wc-modal-shipping-method-settings form .form-table tr th .woocommerce-help-tip{float:right;margin:-8px -.5em 0 0;vertical-align:middle;right:0;top:50%;position:absolute}.wc-modal-shipping-method-settings form .form-table tr td input,.wc-modal-shipping-method-settings form .form-table tr td select,.wc-modal-shipping-method-settings form .form-table tr td textarea{width:50%;min-width:250px}.wc-modal-shipping-method-settings form .form-table tr td input[type=checkbox]{width:auto;min-width:16px}.wc-modal-shipping-method-settings form .form-table tr td,.wc-modal-shipping-method-settings form .form-table tr th{vertical-align:middle;margin:0;line-height:24px;padding:1em;border-bottom:1px solid #f8f8f8}.wc-modal-shipping-method-settings form .form-table:last-of-type{margin-bottom:0}.wc-backbone-modal .wc-shipping-zone-method-selector p{margin-top:0}.wc-backbone-modal .wc-shipping-zone-method-selector .wc-shipping-zone-method-description{margin:.75em 1px 0;line-height:1.5em;color:#999;font-style:italic}.wc-backbone-modal .wc-shipping-zone-method-selector select{width:100%;cursor:pointer}img.help_tip{margin:0 0 0 9px;vertical-align:middle}.postbox img.help_tip{margin-top:0}.postbox .woocommerce-help-tip{margin:0 0 0 9px}.status-disabled,.status-enabled,.status-manual{font-size:1.4em;display:block;text-indent:-9999px;position:relative;height:1em;width:1em}.status-manual::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#999}.status-enabled::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#a46497}.status-disabled::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}.woocommerce h2.woo-nav-tab-wrapper{margin-bottom:1em}.woocommerce nav.woo-nav-tab-wrapper{margin:1.5em 0 1em}.woocommerce .subsubsub{margin:-8px 0 0}.woocommerce .wc-admin-breadcrumb{margin-left:.5em}.woocommerce .wc-admin-breadcrumb a{color:#a46497}.woocommerce #template div{margin:0}.woocommerce #template div p .button{float:right;margin-left:10px;margin-top:-4px}.woocommerce #template div .editor textarea{margin-bottom:8px}.woocommerce textarea[disabled=disabled]{background:#dfdfdf!important}.woocommerce table.form-table{margin:0;position:relative;table-layout:fixed}.woocommerce table.form-table .forminp-radio ul{margin:0}.woocommerce table.form-table .forminp-radio ul li{line-height:1.4em}.woocommerce table.form-table input[type=email],.woocommerce table.form-table input[type=number],.woocommerce table.form-table input[type=text]{height:auto}.woocommerce table.form-table textarea.input-text{height:100%;min-width:150px;display:block}.woocommerce table.form-table input.regular-input,.woocommerce table.form-table input[type=date],.woocommerce table.form-table input[type=datetime-local],.woocommerce table.form-table input[type=datetime],.woocommerce table.form-table input[type=email],.woocommerce table.form-table input[type=number],.woocommerce table.form-table input[type=password],.woocommerce table.form-table input[type=tel],.woocommerce table.form-table input[type=text],.woocommerce table.form-table input[type=time],.woocommerce table.form-table input[type=url],.woocommerce table.form-table input[type=week],.woocommerce table.form-table textarea{width:400px;margin:0;padding:6px;box-sizing:border-box;vertical-align:top}.woocommerce table.form-table input[type=date],.woocommerce table.form-table input[type=datetime-local],.woocommerce table.form-table input[type=tel],.woocommerce table.form-table input[type=time],.woocommerce table.form-table input[type=week]{width:200px}.woocommerce table.form-table select{width:400px;margin:0;box-sizing:border-box;height:32px;line-height:32px;vertical-align:top}.woocommerce table.form-table input[size]{width:auto!important}.woocommerce table.form-table table input.regular-input,.woocommerce table.form-table table input[type=email],.woocommerce table.form-table table input[type=number],.woocommerce table.form-table table input[type=text],.woocommerce table.form-table table select,.woocommerce table.form-table table textarea{width:auto}.woocommerce table.form-table textarea.wide-input{width:100%}.woocommerce table.form-table .woocommerce-help-tip,.woocommerce table.form-table img.help_tip{padding:0;margin:-4px 0 0 5px;vertical-align:middle;cursor:help;line-height:1}.woocommerce table.form-table span.help_tip{cursor:help;color:#2ea2cc}.woocommerce table.form-table th{position:relative;padding-right:24px}.woocommerce table.form-table th label{position:relative;display:block}.woocommerce table.form-table th label .woocommerce-help-tip,.woocommerce table.form-table th label img.help_tip{margin:-8px -24px 0 0;position:absolute;right:0;top:50%}.woocommerce table.form-table th label+.woocommerce-help-tip{margin:0;position:absolute;right:0;top:20px}.woocommerce table.form-table woocommerce-help-tip .select2-container{vertical-align:top;margin-bottom:3px}.woocommerce table.form-table table.widefat th{padding-right:inherit}.woocommerce table.form-table .wp-list-table .woocommerce-help-tip{float:none}.woocommerce table.form-table fieldset{margin-top:4px}.woocommerce table.form-table fieldset .woocommerce-help-tip,.woocommerce table.form-table fieldset img.help_tip{margin:-3px 0 0 5px}.woocommerce table.form-table fieldset p.description{margin-bottom:8px}.woocommerce table.form-table fieldset:first-child{margin-top:0}.woocommerce table.form-table .iris-picker{z-index:100;display:none;position:absolute;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.2)}.woocommerce table.form-table .iris-picker .ui-slider{border:0!important;margin:0!important;width:auto!important;height:auto!important;background:none transparent!important}.woocommerce table.form-table .iris-picker .ui-slider .ui-slider-handle{margin-bottom:0!important}.woocommerce table.form-table .iris-error{background-color:#ffafaf}.woocommerce table.form-table .colorpickpreview{padding:7px 0;line-height:1em;display:inline-block;width:26px;border:1px solid #ddd;font-size:14px}.woocommerce table.form-table .image_width_settings{vertical-align:middle}.woocommerce table.form-table .image_width_settings label{margin-left:10px}.woocommerce table.form-table .image_width_settings input{width:auto}.woocommerce table.form-table .wc_emails_wrapper,.woocommerce table.form-table .wc_payment_gateways_wrapper{padding:0 15px 10px 0}.woocommerce #tabs-wrap table a.remove{margin-left:4px}.woocommerce #tabs-wrap table p{margin:0 0 4px!important;overflow:hidden;zoom:1}.woocommerce #tabs-wrap table p a.add{float:left}#wp-excerpt-editor-container{background:#fff}#product_variation-parent #parent_id{width:100%}#postimagediv img{border:1px solid #d5d5d5;max-width:100%}#woocommerce-product-images .inside{margin:0;padding:0}#woocommerce-product-images .inside .add_product_images{padding:0 12px 12px}#woocommerce-product-images .inside #product_images_container{padding:0 0 0 9px}#woocommerce-product-images .inside #product_images_container ul{margin:0;padding:0}#woocommerce-product-images .inside #product_images_container ul::after,#woocommerce-product-images .inside #product_images_container ul::before{content:' ';display:table}#woocommerce-product-images .inside #product_images_container ul::after{clear:both}#woocommerce-product-images .inside #product_images_container ul li.add,#woocommerce-product-images .inside #product_images_container ul li.image,#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder{width:80px;float:left;cursor:move;border:1px solid #d5d5d5;margin:9px 9px 0 0;background:#f7f7f7;border-radius:2px;position:relative;box-sizing:border-box}#woocommerce-product-images .inside #product_images_container ul li.add img,#woocommerce-product-images .inside #product_images_container ul li.image img,#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder img{width:100%;height:auto;display:block}#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder{border:3px dashed #ddd;position:relative}#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";font-size:2.618em;line-height:72px;color:#ddd}#woocommerce-product-images .inside #product_images_container ul ul.actions{position:absolute;top:-8px;right:-8px;padding:2px;display:none}#woocommerce-product-images .inside #product_images_container ul ul.actions li{float:right;margin:0 0 0 2px}#woocommerce-product-images .inside #product_images_container ul ul.actions li a{width:1em;height:1em;margin:0;height:0;display:block;overflow:hidden}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.tips{cursor:pointer}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.4em}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#999;background:#fff;border-radius:50%;height:1em;width:1em;line-height:1em}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete:hover::before{color:#a00}#woocommerce-product-images .inside #product_images_container ul li:hover ul.actions{display:block}#woocommerce-product-data .hndle{padding:10px}#woocommerce-product-data .hndle span{display:block;vertical-align:middle;line-height:24px}#woocommerce-product-data .hndle span span{display:inline;line-height:inherit;vertical-align:baseline}#woocommerce-product-data .hndle select{margin:0}#woocommerce-product-data .hndle label{padding-right:1em;font-size:12px;vertical-align:baseline}#woocommerce-product-data .hndle label:first-child{margin-right:1em;border-right:1px solid #dfdfdf}#woocommerce-product-data .hndle input,#woocommerce-product-data .hndle select{margin-top:-3px 0 0;vertical-align:middle}#woocommerce-product-data .hndle select{margin-left:.5em}#woocommerce-product-data>.handlediv{margin-top:4px}#woocommerce-product-data .wrap{margin:0}#woocommerce-coupon-description{padding:3px 8px;font-size:1.7em;line-height:1.42em;height:auto;width:100%;outline:0;margin:10px 0;display:block}#woocommerce-coupon-description::-webkit-input-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description::-moz-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description:-ms-input-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description:-moz-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-data .panel-wrap,#woocommerce-product-data .panel-wrap{background:#fff}#woocommerce-coupon-data .wc-metaboxes-wrapper,#woocommerce-coupon-data .woocommerce_options_panel,#woocommerce-product-data .wc-metaboxes-wrapper,#woocommerce-product-data .woocommerce_options_panel{float:left;width:80%}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios,#woocommerce-product-data .woocommerce_options_panel .wc-radios{display:block;float:left;margin:0}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios li,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios li,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios li,#woocommerce-product-data .woocommerce_options_panel .wc-radios li{display:block;padding:0 0 10px}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios li input,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios li input,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios li input,#woocommerce-product-data .woocommerce_options_panel .wc-radios li input{width:auto}#woocommerce-coupon-data .panel-wrap,#woocommerce-product-data .panel-wrap,.woocommerce .panel-wrap{overflow:hidden}#woocommerce-coupon-data ul.wc-tabs,#woocommerce-product-data ul.wc-tabs,.woocommerce ul.wc-tabs{margin:0;width:20%;float:left;line-height:1em;padding:0 0 10px;position:relative;background-color:#fafafa;border-right:1px solid #eee;box-sizing:border-box}#woocommerce-coupon-data ul.wc-tabs::after,#woocommerce-product-data ul.wc-tabs::after,.woocommerce ul.wc-tabs::after{content:'';display:block;width:100%;height:9999em;position:absolute;bottom:-9999em;left:0;background-color:#fafafa;border-right:1px solid #eee}#woocommerce-coupon-data ul.wc-tabs li,#woocommerce-product-data ul.wc-tabs li,.woocommerce ul.wc-tabs li{margin:0;padding:0;display:block;position:relative}#woocommerce-coupon-data ul.wc-tabs li a,#woocommerce-product-data ul.wc-tabs li a,.woocommerce ul.wc-tabs li a{margin:0;padding:10px;display:block;box-shadow:none;text-decoration:none;line-height:20px!important;border-bottom:1px solid #eee}#woocommerce-coupon-data ul.wc-tabs li a span,#woocommerce-product-data ul.wc-tabs li a span,.woocommerce ul.wc-tabs li a span{margin-left:.618em;margin-right:.618em}#woocommerce-coupon-data ul.wc-tabs li a::before,#woocommerce-product-data ul.wc-tabs li a::before,.woocommerce ul.wc-tabs li a::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;content:"";text-decoration:none}#woocommerce-coupon-data ul.wc-tabs li.general_options a::before,#woocommerce-product-data ul.wc-tabs li.general_options a::before,.woocommerce ul.wc-tabs li.general_options a::before{content:'\f107'}#woocommerce-coupon-data ul.wc-tabs li.inventory_options a::before,#woocommerce-product-data ul.wc-tabs li.inventory_options a::before,.woocommerce ul.wc-tabs li.inventory_options a::before{content:'\f481'}#woocommerce-coupon-data ul.wc-tabs li.shipping_options a::before,#woocommerce-product-data ul.wc-tabs li.shipping_options a::before,.woocommerce ul.wc-tabs li.shipping_options a::before{font-family:WooCommerce;content:'\e01a'}#woocommerce-coupon-data ul.wc-tabs li.linked_product_options a::before,#woocommerce-product-data ul.wc-tabs li.linked_product_options a::before,.woocommerce ul.wc-tabs li.linked_product_options a::before{content:'\f103'}#woocommerce-coupon-data ul.wc-tabs li.attribute_options a::before,#woocommerce-product-data ul.wc-tabs li.attribute_options a::before,.woocommerce ul.wc-tabs li.attribute_options a::before{content:'\f175'}#woocommerce-coupon-data ul.wc-tabs li.advanced_options a::before,#woocommerce-product-data ul.wc-tabs li.advanced_options a::before,.woocommerce ul.wc-tabs li.advanced_options a::before{font-family:Dashicons;content:'\f111'}#woocommerce-coupon-data ul.wc-tabs li.variations_options a::before,#woocommerce-product-data ul.wc-tabs li.variations_options a::before,.woocommerce ul.wc-tabs li.variations_options a::before{content:'\f509'}#woocommerce-coupon-data ul.wc-tabs li.usage_restriction_options a::before,#woocommerce-product-data ul.wc-tabs li.usage_restriction_options a::before,.woocommerce ul.wc-tabs li.usage_restriction_options a::before{font-family:WooCommerce;content:'\e602'}#woocommerce-coupon-data ul.wc-tabs li.usage_limit_options a::before,#woocommerce-product-data ul.wc-tabs li.usage_limit_options a::before,.woocommerce ul.wc-tabs li.usage_limit_options a::before{font-family:WooCommerce;content:'\e601'}#woocommerce-coupon-data ul.wc-tabs li.general_coupon_data a::before,#woocommerce-product-data ul.wc-tabs li.general_coupon_data a::before,.woocommerce ul.wc-tabs li.general_coupon_data a::before{font-family:WooCommerce;content:'\e600'}#woocommerce-coupon-data ul.wc-tabs li.active a,#woocommerce-product-data ul.wc-tabs li.active a,.woocommerce ul.wc-tabs li.active a{color:#555;position:relative;background-color:#eee}.woocommerce_page_wc-settings input[type=email],.woocommerce_page_wc-settings input[type=url]{direction:ltr}.woocommerce_page_wc-settings .shippingrows th.check-column{padding-top:20px}.woocommerce_page_wc-settings .shippingrows tfoot th{padding-left:10px}.woocommerce_page_wc-settings .shippingrows .add.button::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none}.woocommerce_page_wc-settings h3.wc-settings-sub-title{font-size:1.2em}#woocommerce-coupon-data .inside,#woocommerce-order-data .inside,#woocommerce-order-downloads .inside,#woocommerce-product-data .inside,#woocommerce-product-type-options .inside{margin:0;padding:0}.panel,.woocommerce_options_panel{padding:9px;color:#555}.panel .form-field .woocommerce-help-tip,.woocommerce_options_panel .form-field .woocommerce-help-tip{font-size:1.4em}.panel,.woocommerce_page_settings .woocommerce_options_panel{padding:0}#woocommerce-product-specs .inside,#woocommerce-product-type-options .panel{margin:0;padding:9px}#woocommerce-product-type-options .panel p,.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p{margin:0 0 9px;font-size:12px;padding:5px 9px;line-height:24px}#woocommerce-product-type-options .panel p::after,.woocommerce_options_panel fieldset.form-field::after,.woocommerce_options_panel p::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce_options_panel .checkbox,.woocommerce_variable_attributes .checkbox{width:auto;margin:4px 0!important;vertical-align:middle;float:left}.woocommerce_options_panel .downloadable_files table,.woocommerce_variations .downloadable_files table{width:100%;padding:0!important}.woocommerce_options_panel .downloadable_files table th,.woocommerce_variations .downloadable_files table th{padding:7px 0 7px 7px!important}.woocommerce_options_panel .downloadable_files table th.sort,.woocommerce_variations .downloadable_files table th.sort{width:17px;padding:7px!important}.woocommerce_options_panel .downloadable_files table th .woocommerce-help-tip,.woocommerce_variations .downloadable_files table th .woocommerce-help-tip{font-size:1.1em;margin-left:0}.woocommerce_options_panel .downloadable_files table td,.woocommerce_variations .downloadable_files table td{vertical-align:middle!important;padding:4px 0 4px 7px!important;position:relative}.woocommerce_options_panel .downloadable_files table td:last-child,.woocommerce_variations .downloadable_files table td:last-child{padding-right:7px!important}.woocommerce_options_panel .downloadable_files table td input.input_text,.woocommerce_variations .downloadable_files table td input.input_text{width:100%;float:none;min-width:0;margin:1px 0}.woocommerce_options_panel .downloadable_files table td .upload_file_button,.woocommerce_variations .downloadable_files table td .upload_file_button{width:auto;float:right;cursor:pointer}.woocommerce_options_panel .downloadable_files table td .delete,.woocommerce_variations .downloadable_files table td .delete{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.2em}.woocommerce_options_panel .downloadable_files table td .delete::before,.woocommerce_variations .downloadable_files table td .delete::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#999}.woocommerce_options_panel .downloadable_files table td .delete:hover::before,.woocommerce_variations .downloadable_files table td .delete:hover::before{color:#a00}.woocommerce_options_panel .downloadable_files table td.sort,.woocommerce_variations .downloadable_files table td.sort{width:17px;cursor:move;font-size:15px;text-align:center;background:#f9f9f9;padding-right:7px!important}.woocommerce_options_panel .downloadable_files table td.sort::before,.woocommerce_variations .downloadable_files table td.sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:left;height:100%}.woocommerce_options_panel .downloadable_files table td.sort:hover::before,.woocommerce_variations .downloadable_files table td.sort:hover::before{color:#333}.woocommerce_variation h3 .sort{width:17px;height:26px;cursor:move;float:right;font-size:15px;font-weight:400;margin-right:.5em;visibility:hidden;text-align:center;vertical-align:middle}.woocommerce_variation h3 .sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:28px;color:#999;display:block;width:17px;float:left;height:100%}.woocommerce_variation h3 .sort:hover::before{color:#777}.woocommerce_variation h3:hover .sort,.woocommerce_variation.ui-sortable-helper .sort{visibility:visible}.woocommerce_options_panel{min-height:175px;box-sizing:border-box}.woocommerce_options_panel .downloadable_files{padding:0 9px 0 162px;position:relative;margin:9px 0}.woocommerce_options_panel .downloadable_files label{position:absolute;left:0;margin:0 0 0 12px;line-height:24px}.woocommerce_options_panel p{margin:9px 0}.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p.form-field{padding:5px 20px 5px 162px!important}.woocommerce_options_panel .sale_price_dates_fields .short:first-of-type{margin-bottom:1em}.woocommerce_options_panel .sale_price_dates_fields .short:nth-of-type(2){clear:left}.woocommerce_options_panel label,.woocommerce_options_panel legend{float:left;width:150px;padding:0;margin:0 0 0 -150px}.woocommerce_options_panel label .req,.woocommerce_options_panel legend .req{font-weight:700;font-style:normal;color:#a00}.woocommerce_options_panel .description{padding:0;margin:0 0 0 7px;clear:none;display:inline}.woocommerce_options_panel .description-block{margin-left:0;display:block}.woocommerce_options_panel input,.woocommerce_options_panel select,.woocommerce_options_panel textarea{margin:0}.woocommerce_options_panel textarea{float:left;height:3.5em;line-height:1.5em;vertical-align:top}.woocommerce_options_panel input[type=email],.woocommerce_options_panel input[type=number],.woocommerce_options_panel input[type=password],.woocommerce_options_panel input[type=text]{width:50%;float:left}.woocommerce_options_panel input.button{width:auto;margin-left:8px}.woocommerce_options_panel select{float:left}.woocommerce_options_panel .short,.woocommerce_options_panel input[type=email].short,.woocommerce_options_panel input[type=number].short,.woocommerce_options_panel input[type=password].short,.woocommerce_options_panel input[type=text].short{width:50%}.woocommerce_options_panel .sized{width:auto!important;margin-right:6px}.woocommerce_options_panel .options_group{border-top:1px solid #fff;border-bottom:1px solid #eee}.woocommerce_options_panel .options_group:first-child{border-top:0}.woocommerce_options_panel .options_group:last-child{border-bottom:0}.woocommerce_options_panel .options_group fieldset{margin:9px 0;font-size:12px;padding:5px 9px;line-height:24px}.woocommerce_options_panel .options_group fieldset label{width:auto;float:none}.woocommerce_options_panel .options_group fieldset ul{float:left;width:50%;margin:0;padding:0}.woocommerce_options_panel .options_group fieldset ul li{margin:0;width:auto}.woocommerce_options_panel .options_group fieldset ul li input{width:auto;float:none;margin-right:4px}.woocommerce_options_panel .options_group fieldset ul.wc-radios label{margin-left:0}.woocommerce_options_panel .dimensions_field .wrap{display:block;width:50%}.woocommerce_options_panel .dimensions_field .wrap input{width:30.75%;margin-right:3.8%}.woocommerce_options_panel .dimensions_field .wrap .last{margin-right:0}.woocommerce_options_panel.padded{padding:1em}.woocommerce_options_panel .select2-container{float:left}#woocommerce-product-data input.dp-applied{float:left}#grouped_product_options,#simple_product_options,#virtual_product_options{padding:12px;font-style:italic;color:#666}.wc-metaboxes-wrapper .toolbar{margin:0!important;border-top:1px solid #fff;border-bottom:1px solid #eee;padding:9px 12px!important}.wc-metaboxes-wrapper .toolbar:first-child{border-top:0}.wc-metaboxes-wrapper .toolbar:last-child{border-bottom:0}.wc-metaboxes-wrapper .toolbar .add_variation{float:right;margin-left:5px}.wc-metaboxes-wrapper .toolbar .cancel-variation-changes,.wc-metaboxes-wrapper .toolbar .save-variation-changes{float:left;margin-right:5px}.wc-metaboxes-wrapper p.toolbar{overflow:hidden;zoom:1}.wc-metaboxes-wrapper .expand-close{margin-right:2px;color:#777;font-size:12px;font-style:italic}.wc-metaboxes-wrapper .expand-close a{background:0 0;padding:0;font-size:12px;text-decoration:none}.wc-metaboxes-wrapper#product_attributes .expand-close{float:right;line-height:28px}.wc-metaboxes-wrapper .fr,.wc-metaboxes-wrapper button.add_variable_attribute{float:right;margin:0 0 0 6px}.wc-metaboxes-wrapper .wc-metaboxes{border-bottom:1px solid #eee}.wc-metaboxes-wrapper .wc-metabox-sortable-placeholder{border-color:#bbb;background-color:#f5f5f5;margin-bottom:9px;border-width:1px;border-style:dashed}.wc-metaboxes-wrapper .wc-metabox{background:#fff;border-bottom:1px solid #eee;margin:0!important}.wc-metaboxes-wrapper .wc-metabox select{font-weight:400}.wc-metaboxes-wrapper .wc-metabox:last-of-type{border-bottom:0}.wc-metaboxes-wrapper .wc-metabox .handlediv{width:27px}.wc-metaboxes-wrapper .wc-metabox .handlediv::before{content:'\f142'!important;cursor:pointer;display:inline-block;font:400 20px/1 Dashicons;line-height:.5!important;padding:8px 10px;position:relative;right:12px;top:0}.wc-metaboxes-wrapper .wc-metabox.closed{border-radius:3px}.wc-metaboxes-wrapper .wc-metabox.closed .handlediv::before{content:'\f140'!important}.wc-metaboxes-wrapper .wc-metabox.closed h3{border:0}.wc-metaboxes-wrapper .wc-metabox h3{margin:0!important;padding:.75em .75em .75em 1em!important;font-size:1em!important;overflow:hidden;zoom:1;cursor:move}.wc-metaboxes-wrapper .wc-metabox h3 a.delete,.wc-metaboxes-wrapper .wc-metabox h3 button{float:right}.wc-metaboxes-wrapper .wc-metabox h3 a.delete{color:red;font-weight:400;line-height:26px;text-decoration:none;position:relative;visibility:hidden}.wc-metaboxes-wrapper .wc-metabox h3 strong{font-weight:400;line-height:26px;font-weight:700}.wc-metaboxes-wrapper .wc-metabox h3 select{font-family:sans-serif;max-width:20%;margin:.25em .25em .25em 0}.wc-metaboxes-wrapper .wc-metabox h3 .handlediv{background-position:6px 5px!important;visibility:hidden;height:26px}.wc-metaboxes-wrapper .wc-metabox h3.fixed{cursor:pointer!important}.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3{cursor:pointer;padding:.5em .75em .5em 1em!important}.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 .handlediv,.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 .sort,.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 a.delete{margin-top:.25em}.wc-metaboxes-wrapper .wc-metabox h3:hover .handlediv,.wc-metaboxes-wrapper .wc-metabox h3:hover a.delete,.wc-metaboxes-wrapper .wc-metabox.ui-sortable-helper .handlediv,.wc-metaboxes-wrapper .wc-metabox.ui-sortable-helper a.delete{visibility:visible}.wc-metaboxes-wrapper .wc-metabox table{width:100%;position:relative;background-color:#fdfdfd;padding:1em;border-top:1px solid #eee}.wc-metaboxes-wrapper .wc-metabox table td{text-align:left;padding:0 6px 1em 0;vertical-align:top;border:0}.wc-metaboxes-wrapper .wc-metabox table td label{text-align:left;display:block;line-height:21px}.wc-metaboxes-wrapper .wc-metabox table td input{float:left;min-width:200px}.wc-metaboxes-wrapper .wc-metabox table td input,.wc-metaboxes-wrapper .wc-metabox table td textarea{width:100%;margin:0;display:block;font-size:14px;padding:4px;color:#555}.wc-metaboxes-wrapper .wc-metabox table td .select2-container,.wc-metaboxes-wrapper .wc-metabox table td select{width:100%!important}.wc-metaboxes-wrapper .wc-metabox table td input.short{width:200px}.wc-metaboxes-wrapper .wc-metabox table td input.checkbox{width:16px;min-width:inherit;vertical-align:text-bottom;display:inline-block;float:none}.wc-metaboxes-wrapper .wc-metabox table td.attribute_name{width:200px}.wc-metaboxes-wrapper .wc-metabox table .minus,.wc-metaboxes-wrapper .wc-metabox table .plus{margin-top:6px}.wc-metaboxes-wrapper .wc-metabox table .fl{float:left}.wc-metaboxes-wrapper .wc-metabox table .fr{float:right}.variations-pagenav{float:right;line-height:24px}.variations-pagenav .displaying-num{color:#777;font-size:12px;font-style:italic}.variations-pagenav a{padding:0 10px 3px;background:rgba(0,0,0,.05);font-size:16px;font-weight:400;text-decoration:none}.variations-pagenav a.disabled,.variations-pagenav a.disabled:active,.variations-pagenav a.disabled:focus,.variations-pagenav a.disabled:hover{color:#a0a5aa;background:rgba(0,0,0,.05)}.variations-defaults{float:left}.variations-defaults select{margin:.25em .25em .25em 0}.woocommerce_variable_attributes{background-color:#fdfdfd;border-top:1px solid #eee}.woocommerce_variable_attributes .data{padding:1em 2em}.woocommerce_variable_attributes .data::after,.woocommerce_variable_attributes .data::before{content:' ';display:table}.woocommerce_variable_attributes .data::after{clear:both}.woocommerce_variable_attributes .upload_image_button{display:block;width:64px;height:64px;float:left;margin-right:20px;position:relative;cursor:pointer}.woocommerce_variable_attributes .upload_image_button img{width:100%;height:auto;display:none}.woocommerce_variable_attributes .upload_image_button::before{content:'\f128';font-family:Dashicons;position:absolute;top:0;left:0;right:0;bottom:0;text-align:center;line-height:64px;font-size:64px;font-weight:400;-webkit-font-smoothing:antialiased}.woocommerce_variable_attributes .upload_image_button.remove img{display:block}.woocommerce_variable_attributes .upload_image_button.remove::before{content:'\f335';display:none}.woocommerce_variable_attributes .upload_image_button.remove:hover::before{display:block}.woocommerce_variable_attributes .options{border:1px solid #eee;border-width:1px 0;padding:.25em 0}.woocommerce_variable_attributes .options label{display:inline-block;padding:4px 1em 2px 0}.woocommerce_variable_attributes .options input[type=checkbox]{margin:0 5px 0 .5em!important;vertical-align:middle}.form-row label{display:inline-block}.form-row .woocommerce-help-tip{float:right}.form-row input[type=number],.form-row input[type=text],.form-row select,.form-row textarea{width:100%;vertical-align:middle;margin:2px 0 0;padding:5px}.form-row select{height:30px;line-height:30px}.form-row.dimensions_field .wrap{clear:left;display:block}.form-row.dimensions_field input{width:33%;float:left;vertical-align:middle}.form-row.dimensions_field input:last-of-type{margin-right:0;width:34%}.form-row.form-row-first,.form-row.form-row-last{width:48%;float:right}.form-row.form-row-first{clear:both;float:left}.form-row.form-row-full{clear:both}.tips{cursor:help;text-decoration:none}img.tips{padding:5px 0 0}#tiptip_holder{display:none;z-index:8675309;position:absolute;top:0;left:0}#tiptip_holder.tip_top{padding-bottom:5px}#tiptip_holder.tip_top #tiptip_arrow_inner{margin-top:-7px;margin-left:-6px;border-top-color:#333}#tiptip_holder.tip_bottom{padding-top:5px}#tiptip_holder.tip_bottom #tiptip_arrow_inner{margin-top:-5px;margin-left:-6px;border-bottom-color:#333}#tiptip_holder.tip_right{padding-left:5px}#tiptip_holder.tip_right #tiptip_arrow_inner{margin-top:-6px;margin-left:-5px;border-right-color:#333}#tiptip_holder.tip_left{padding-right:5px}#tiptip_holder.tip_left #tiptip_arrow_inner{margin-top:-6px;margin-left:-7px;border-left-color:#333}#tiptip_content,.chart-tooltip,.wc_error_tip{color:#fff;font-size:.8em;max-width:150px;background:#333;text-align:center;border-radius:3px;padding:.618em 1em;box-shadow:0 1px 3px rgba(0,0,0,.2)}#tiptip_content code,.chart-tooltip code,.wc_error_tip code{padding:1px;background:#888}#tiptip_arrow,#tiptip_arrow_inner{position:absolute;border-color:transparent;border-style:solid;border-width:6px;height:0;width:0}.wc_error_tip{max-width:20em;line-height:1.8em;position:absolute;white-space:normal;background:#d82223;margin:1.5em 1px 0 -1em;z-index:9999999}.wc_error_tip::after{content:'';display:block;border:8px solid #d82223;border-right-color:transparent;border-left-color:transparent;border-top-color:transparent;position:absolute;top:-3px;left:50%;margin:-1em 0 0 -3px}img.ui-datepicker-trigger{vertical-align:middle;margin-top:-1px;cursor:pointer}.wc-metabox-content img.ui-datepicker-trigger,.woocommerce_options_panel img.ui-datepicker-trigger{float:left;margin-right:8px;margin-top:4px;margin-left:4px}#ui-datepicker-div{display:none}.woocommerce-reports-remove-filter{color:red;text-decoration:none}.woocommerce-reports-wide.woocommerce-reports-wrap,.woocommerce-reports-wrap.woocommerce-reports-wrap{margin-left:300px;padding-top:18px}.woocommerce-reports-wide.halved,.woocommerce-reports-wrap.halved{margin:0;overflow:hidden;zoom:1}.woocommerce-reports-wide .widefat th,.woocommerce-reports-wrap .widefat th{padding:7px}.woocommerce-reports-wide .widefat td,.woocommerce-reports-wrap .widefat td{vertical-align:top;padding:7px}.woocommerce-reports-wide .widefat td .description,.woocommerce-reports-wrap .widefat td .description{margin:4px 0 0}.woocommerce-reports-wide .postbox::after,.woocommerce-reports-wrap .postbox::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce-reports-wide .postbox h3,.woocommerce-reports-wrap .postbox h3{cursor:default!important}.woocommerce-reports-wide .postbox .inside,.woocommerce-reports-wrap .postbox .inside{padding:10px;margin:0!important}.woocommerce-reports-wide .postbox div.stats_range,.woocommerce-reports-wide .postbox h3.stats_range,.woocommerce-reports-wrap .postbox div.stats_range,.woocommerce-reports-wrap .postbox h3.stats_range{border-bottom-color:#dfdfdf;margin:0;padding:0!important}.woocommerce-reports-wide .postbox div.stats_range .export_csv,.woocommerce-reports-wide .postbox h3.stats_range .export_csv,.woocommerce-reports-wrap .postbox div.stats_range .export_csv,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv{float:right;line-height:26px;border-left:1px solid #dfdfdf;padding:10px;display:block;text-decoration:none}.woocommerce-reports-wide .postbox div.stats_range .export_csv::before,.woocommerce-reports-wide .postbox h3.stats_range .export_csv::before,.woocommerce-reports-wrap .postbox div.stats_range .export_csv::before,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;content:"";text-decoration:none;margin-right:4px}.woocommerce-reports-wide .postbox div.stats_range ul,.woocommerce-reports-wide .postbox h3.stats_range ul,.woocommerce-reports-wrap .postbox div.stats_range ul,.woocommerce-reports-wrap .postbox h3.stats_range ul{list-style:none outside;margin:0;padding:0;zoom:1;background:#f5f5f5;border-bottom:1px solid #ccc}.woocommerce-reports-wide .postbox div.stats_range ul::after,.woocommerce-reports-wide .postbox div.stats_range ul::before,.woocommerce-reports-wide .postbox h3.stats_range ul::after,.woocommerce-reports-wide .postbox h3.stats_range ul::before,.woocommerce-reports-wrap .postbox div.stats_range ul::after,.woocommerce-reports-wrap .postbox div.stats_range ul::before,.woocommerce-reports-wrap .postbox h3.stats_range ul::after,.woocommerce-reports-wrap .postbox h3.stats_range ul::before{content:' ';display:table}.woocommerce-reports-wide .postbox div.stats_range ul::after,.woocommerce-reports-wide .postbox h3.stats_range ul::after,.woocommerce-reports-wrap .postbox div.stats_range ul::after,.woocommerce-reports-wrap .postbox h3.stats_range ul::after{clear:both}.woocommerce-reports-wide .postbox div.stats_range ul li,.woocommerce-reports-wide .postbox h3.stats_range ul li,.woocommerce-reports-wrap .postbox div.stats_range ul li,.woocommerce-reports-wrap .postbox h3.stats_range ul li{float:left;margin:0;padding:0;line-height:26px;font-weight:700;font-size:14px}.woocommerce-reports-wide .postbox div.stats_range ul li a,.woocommerce-reports-wide .postbox h3.stats_range ul li a,.woocommerce-reports-wrap .postbox div.stats_range ul li a,.woocommerce-reports-wrap .postbox h3.stats_range ul li a{border-right:1px solid #dfdfdf;padding:10px;display:block;text-decoration:none}.woocommerce-reports-wide .postbox div.stats_range ul li.active,.woocommerce-reports-wide .postbox h3.stats_range ul li.active,.woocommerce-reports-wrap .postbox div.stats_range ul li.active,.woocommerce-reports-wrap .postbox h3.stats_range ul li.active{background:#fff;box-shadow:0 4px 0 0 #fff}.woocommerce-reports-wide .postbox div.stats_range ul li.active a,.woocommerce-reports-wide .postbox h3.stats_range ul li.active a,.woocommerce-reports-wrap .postbox div.stats_range ul li.active a,.woocommerce-reports-wrap .postbox h3.stats_range ul li.active a{color:#777}.woocommerce-reports-wide .postbox div.stats_range ul li.custom,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom{padding:9px 10px;vertical-align:middle}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form{display:inline;margin:0}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form input.range_datepicker{padding:0;margin:0 10px 0 0;background:0 0;border:0;color:#777;text-align:center;box-shadow:none}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form input.range_datepicker.from{margin-right:0}.woocommerce-reports-wide .postbox .chart-with-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar{padding:12px 12px 12px 249px;margin:0!important}.woocommerce-reports-wide .postbox .chart-with-sidebar .chart-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar .chart-sidebar{width:225px;margin-left:-237px;float:left}.woocommerce-reports-wide .postbox .chart-widgets,.woocommerce-reports-wrap .postbox .chart-widgets{margin:0;padding:0}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget{margin:0 0 1em;background:#fafafa;border:1px solid #dfdfdf}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget h4,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget h4{background:#fff;border:1px solid #dfdfdf;border-left-width:0;border-right-width:0;padding:10px;margin:0;color:#2ea2cc;border-top-width:0;background-image:-webkit-linear-gradient(bottom,#ececec,#f9f9f9);background-image:linear-gradient(to top,#ececec,#f9f9f9)}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget h4.section_title:hover,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget h4.section_title:hover{color:#a00}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title{cursor:pointer}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title span,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title span{display:block}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title span::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title span::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none;float:right;font-size:.9em;line-height:1.618}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title.open,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title.open{color:#333}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title.open span::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title.open span::after{display:none}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section{border-bottom:1px solid #dfdfdf}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section .select2-container,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section .select2-container{width:100%!important}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section:last-of-type,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section:last-of-type{border-radius:0 0 3px 3px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table{width:100%}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td{padding:7px 10px;vertical-align:top;border-top:1px solid #e5e5e5;line-height:1.4em}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table tr:first-child td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table tr:first-child td{border-top:0}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.count,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.count{background:#f5f5f5}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.name,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.name{max-width:175px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.name a,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.name a{word-wrap:break-word}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.sparkline,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.sparkline{vertical-align:middle}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table .wc_sparkline,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table .wc_sparkline{width:32px;height:1em;display:block;float:right}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table tr.active td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table tr.active td{background:#f5f5f5}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget form,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget p,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget form,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget p{margin:0;padding:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget form .submit,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget p .submit,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget form .submit,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget p .submit{margin-top:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget #product_ids,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget #product_ids{width:100%}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .select_all,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .select_none,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .select_all,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .select_none{float:right;color:#999;margin-left:4px;margin-top:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .description,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .description{margin-left:.5em;font-weight:400;opacity:.8}.woocommerce-reports-wide .postbox .chart-legend,.woocommerce-reports-wrap .postbox .chart-legend{list-style:none outside;margin:0 0 1em;padding:0;border:1px solid #dfdfdf;border-right-width:0;border-bottom-width:0;background:#fff}.woocommerce-reports-wide .postbox .chart-legend li,.woocommerce-reports-wrap .postbox .chart-legend li{border-right:5px solid #aaa;color:#aaa;padding:1em;display:block;margin:0;-webkit-transition:all ease .5s;transition:all ease .5s;box-shadow:inset 0 -1px 0 0 #dfdfdf}.woocommerce-reports-wide .postbox .chart-legend li strong,.woocommerce-reports-wrap .postbox .chart-legend li strong{font-size:1.618em;line-height:1.2em;color:#464646;font-weight:400;display:block;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif}.woocommerce-reports-wide .postbox .chart-legend li strong del,.woocommerce-reports-wrap .postbox .chart-legend li strong del{color:#e74c3c;font-weight:400}.woocommerce-reports-wide .postbox .chart-legend li:hover,.woocommerce-reports-wrap .postbox .chart-legend li:hover{box-shadow:inset 0 -1px 0 0 #dfdfdf,inset 300px 0 0 rgba(156,93,144,.1);border-right:5px solid #9c5d90!important;padding-left:1.5em;color:#9c5d90}.woocommerce-reports-wide .postbox .pie-chart-legend,.woocommerce-reports-wrap .postbox .pie-chart-legend{margin:12px 0 0;overflow:hidden}.woocommerce-reports-wide .postbox .pie-chart-legend li,.woocommerce-reports-wrap .postbox .pie-chart-legend li{float:left;margin:0;padding:6px 0 0;border-top:4px solid #999;text-align:center;box-sizing:border-box;width:50%}.woocommerce-reports-wide .postbox .stat,.woocommerce-reports-wrap .postbox .stat{font-size:1.5em!important;font-weight:700;text-align:center}.woocommerce-reports-wide .postbox .chart-placeholder,.woocommerce-reports-wrap .postbox .chart-placeholder{width:100%;height:650px;overflow:hidden;position:relative}.woocommerce-reports-wide .postbox .chart-prompt,.woocommerce-reports-wrap .postbox .chart-prompt{line-height:650px;margin:0;color:#999;font-size:1.2em;font-style:italic;text-align:center}.woocommerce-reports-wide .postbox .chart-container,.woocommerce-reports-wrap .postbox .chart-container{background:#fff;padding:12px;position:relative;border:1px solid #dfdfdf;border-radius:3px}.woocommerce-reports-wide .postbox .main .chart-legend,.woocommerce-reports-wrap .postbox .main .chart-legend{margin-top:12px}.woocommerce-reports-wide .postbox .main .chart-legend li,.woocommerce-reports-wrap .postbox .main .chart-legend li{border-right:0;margin:0 8px 0 0;float:left;border-top:4px solid #aaa}.woocommerce-reports-wide .woocommerce-reports-main,.woocommerce-reports-wrap .woocommerce-reports-main{float:left;min-width:100%}.woocommerce-reports-wide .woocommerce-reports-main table td,.woocommerce-reports-wrap .woocommerce-reports-main table td{padding:9px}.woocommerce-reports-wide .woocommerce-reports-sidebar,.woocommerce-reports-wrap .woocommerce-reports-sidebar{display:inline;width:281px;margin-left:-300px;clear:both;float:left}.woocommerce-reports-wide .woocommerce-reports-left,.woocommerce-reports-wrap .woocommerce-reports-left{width:49.5%;float:left}.woocommerce-reports-wide .woocommerce-reports-right,.woocommerce-reports-wrap .woocommerce-reports-right{width:49.5%;float:right}.woocommerce-wide-reports-wrap{padding-bottom:11px}.woocommerce-wide-reports-wrap .widefat .export-data{float:right}.woocommerce-wide-reports-wrap .widefat td,.woocommerce-wide-reports-wrap .widefat th{vertical-align:middle;padding:7px}form.report_filters p{vertical-align:middle}form.report_filters div,form.report_filters input,form.report_filters label{vertical-align:middle}.chart-tooltip{position:absolute;display:none;line-height:1}table.bar_chart{width:100%}table.bar_chart thead th{text-align:left;color:#ccc;padding:6px 0}table.bar_chart tbody th{padding:6px 0;width:25%;text-align:left!important;font-weight:400!important;border-bottom:1px solid #fee}table.bar_chart tbody td{text-align:right;line-height:24px;padding:6px 6px 6px 0;border-bottom:1px solid #fee}table.bar_chart tbody td span{color:#8a4b75;display:block}table.bar_chart tbody td span.alt{color:#47a03e;margin-top:6px}table.bar_chart tbody td.bars{position:relative;text-align:left;padding:6px 6px 6px 0;border-bottom:1px solid #fee}table.bar_chart tbody td.bars a,table.bar_chart tbody td.bars span{text-decoration:none;clear:both;background:#8a4b75;float:left;display:block;line-height:24px;height:24px;border-radius:3px}table.bar_chart tbody td.bars span.alt{clear:both;background:#47a03e}table.bar_chart tbody td.bars span.alt span{margin:0;color:#c5dec2!important;text-shadow:0 1px 0 #47a03e;background:0 0}.post-type-shop_order .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.post-type-shop_coupon .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.post-type-product .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState--api .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState--webhooks .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState{text-align:center;padding:5em 0 0}.woocommerce-BlankState .woocommerce-BlankState-message{color:#aaa;margin:0 auto 1.5em;line-height:1.5em;font-size:1.2em;max-width:500px}.woocommerce-BlankState .woocommerce-BlankState-message::before{color:#ddd;text-shadow:0 -1px 1px rgba(0,0,0,.2),0 1px 0 rgba(255,255,255,.8);font-size:8em;display:block;position:relative!important;top:auto;left:auto;line-height:1em;margin:0 0 .1875em}.woocommerce-BlankState .woocommerce-BlankState-cta{font-size:1.2em;padding:.75em 1.5em;margin:0 .25em;height:auto;display:inline-block!important}@media only screen and (max-width:1280px){#order_data .order_data_column{width:48%}#order_data .order_data_column:first-child{width:100%}.woocommerce_options_panel .description{display:block;clear:both;margin-left:0}.woocommerce_options_panel .dimensions_field .wrap,.woocommerce_options_panel .short,.woocommerce_options_panel input[type=email].short,.woocommerce_options_panel input[type=number].short,.woocommerce_options_panel input[type=password].short,.woocommerce_options_panel input[type=text].short{width:80%}.woocommerce_options_panel .downloadable_files,.woocommerce_variations .downloadable_files{padding:0;clear:both}.woocommerce_options_panel .downloadable_files label,.woocommerce_variations .downloadable_files label{position:static}.woocommerce_options_panel .downloadable_files table,.woocommerce_variations .downloadable_files table{margin:0 12px 24px;width:94%}.woocommerce_options_panel .downloadable_files table .sort,.woocommerce_variations .downloadable_files table .sort{visibility:hidden}.woocommerce_options_panel .woocommerce_variable_attributes .downloadable_files table,.woocommerce_variations .woocommerce_variable_attributes .downloadable_files table{margin:0 0 1em;width:100%}}@media only screen and (max-width:900px){#woocommerce-coupon-data ul.coupon_data_tabs,#woocommerce-product-data .wc-tabs-back,#woocommerce-product-data ul.product_data_tabs{width:10%}#woocommerce-coupon-data .wc-metaboxes-wrapper,#woocommerce-coupon-data .woocommerce_options_panel,#woocommerce-product-data .wc-metaboxes-wrapper,#woocommerce-product-data .woocommerce_options_panel{width:90%}#woocommerce-coupon-data ul.coupon_data_tabs li a,#woocommerce-product-data ul.product_data_tabs li a{position:relative;text-indent:-999px;padding:10px}#woocommerce-coupon-data ul.coupon_data_tabs li a::before,#woocommerce-product-data ul.product_data_tabs li a::before{position:absolute;top:0;right:0;bottom:0;left:0;text-indent:0;text-align:center;line-height:40px;width:100%;height:40px}}@media only screen and (max-width:782px){#wp-excerpt-media-buttons a{font-size:16px;line-height:37px;height:39px;padding:0 20px 0 15px}#wp-excerpt-editor-tools{padding-top:20px;padding-right:15px;overflow:hidden;margin-bottom:-1px}#woocommerce-product-data .checkbox{width:25px}.variations-pagenav{float:none;text-align:center;font-size:18px}.variations-pagenav .displaying-num{font-size:16px}.variations-pagenav a{padding:8px 20px 11px;font-size:18px}.variations-pagenav select{padding:0 20px}.variations-defaults{float:none;text-align:center;margin-top:10px}.post-type-product .wp-list-table .column-thumb{display:none;text-align:left;padding-bottom:0}.post-type-product .wp-list-table .column-thumb::before{display:none!important}.post-type-product .wp-list-table .column-thumb img{max-width:32px}.post-type-product .wp-list-table .is-expanded td:not(.hidden){overflow:visible}.post-type-product .wp-list-table .toggle-row{top:-28px}.post-type-shop_order .wp-list-table .column-customer_message,.post-type-shop_order .wp-list-table .column-order_notes{text-align:inherit}.post-type-shop_order .wp-list-table .column-order_notes .note-on{font-size:1.3em;margin:0}.post-type-shop_order .wp-list-table .is-expanded td:not(.hidden){overflow:visible}.post-type-shop_order .wp-list-table .toggle-row{top:-15px}}@media only screen and (max-width:500px){.woocommerce_options_panel label,.woocommerce_options_panel legend{float:none;width:auto;display:block;margin:0}.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p.form-field{padding:5px 20px!important}.addons-wcs-banner-block{-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}.wc_addons_wrap .addons-wcs-banner-block{padding:40px}.wc_addons_wrap .addons-wcs-banner-block-image{padding:1em;text-align:center;width:100%;padding:2em 0;margin:0}.wc_addons_wrap .addons-wcs-banner-block-image .addons-img{margin:0}}.wc-backbone-modal *{box-sizing:border-box}.wc-backbone-modal .wc-backbone-modal-content{position:fixed;background:#fff;z-index:100000;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);max-width:100%;min-width:500px}.wc-backbone-modal .wc-backbone-modal-content article{overflow:auto}.wc-backbone-modal.wc-backbone-modal-shipping-method-settings .wc-backbone-modal-content{width:75%;min-width:500px}.wc-backbone-modal .select2-container{width:100%!important}@media screen and (max-width:782px){.wc-backbone-modal .wc-backbone-modal-content{width:100%;height:100%;min-width:100%}}.wc-backbone-modal-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;min-height:360px;background:#000;opacity:.7;z-index:99900}.wc-backbone-modal-main{padding-bottom:55px}.wc-backbone-modal-main article,.wc-backbone-modal-main header{display:block;position:relative}.wc-backbone-modal-main .wc-backbone-modal-header{height:auto;background:#fcfcfc;padding:1em 1.5em;border-bottom:1px solid #ddd}.wc-backbone-modal-main .wc-backbone-modal-header h1{margin:0;font-size:18px;font-weight:700;line-height:1.5em}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link{cursor:pointer;color:#777;height:54px;width:54px;padding:0;position:absolute;top:0;right:0;text-align:center;border:0;border-left:1px solid #ddd;background-color:transparent;-webkit-transition:color .1s ease-in-out,background .1s ease-in-out;transition:color .1s ease-in-out,background .1s ease-in-out}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link::before{font:normal 22px/50px dashicons!important;color:#666;display:block;content:'\f335';font-weight:300}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:focus,.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:hover{background:#ddd;border-color:#ccc;color:#000}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:focus{outline:0}.wc-backbone-modal-main article{padding:1.5em}.wc-backbone-modal-main article p{margin:1.5em 0}.wc-backbone-modal-main article p:first-child{margin-top:0}.wc-backbone-modal-main article p:last-child{margin-bottom:0}.wc-backbone-modal-main article .pagination{padding:10px 0 0;text-align:center}.wc-backbone-modal-main article table.widefat{margin:0;width:100%;border:0;box-shadow:none}.wc-backbone-modal-main article table.widefat thead th{padding:0 1em 1em 1em;text-align:left}.wc-backbone-modal-main article table.widefat thead th:first-child{padding-left:0}.wc-backbone-modal-main article table.widefat thead th:last-child{padding-right:0;text-align:right}.wc-backbone-modal-main article table.widefat tbody td,.wc-backbone-modal-main article table.widefat tbody th{padding:1em;text-align:left;vertical-align:middle}.wc-backbone-modal-main article table.widefat tbody td:first-child,.wc-backbone-modal-main article table.widefat tbody th:first-child{padding-left:0}.wc-backbone-modal-main article table.widefat tbody td:last-child,.wc-backbone-modal-main article table.widefat tbody th:last-child{padding-right:0;text-align:right}.wc-backbone-modal-main article table.widefat tbody td .select2-container,.wc-backbone-modal-main article table.widefat tbody td select,.wc-backbone-modal-main article table.widefat tbody th .select2-container,.wc-backbone-modal-main article table.widefat tbody th select{width:100%}.wc-backbone-modal-main footer{position:absolute;left:0;right:0;bottom:0;z-index:100;padding:1em 1.5em;background:#fcfcfc;border-top:1px solid #dfdfdf;box-shadow:0 -4px 4px -4px rgba(0,0,0,.1)}.wc-backbone-modal-main footer .inner{text-align:right;line-height:23px}.wc-backbone-modal-main footer .inner .button{margin-bottom:0}.select2-drop,.select2-dropdown{z-index:999999!important}.select2-results{line-height:1.5em}.select2-results .select2-results__group,.select2-results .select2-results__option{margin:0;padding:8px}.select2-results .description{display:block;color:#999;padding-top:4px}.select2-dropdown{border-color:#ddd}.select2-dropdown--below{box-shadow:0 1px 1px rgba(0,0,0,.1)}.select2-dropdown--above{box-shadow:0 -1px 1px rgba(0,0,0,.1)}.select2-container .select2-selection__rendered.ui-sortable li{cursor:move}.select2-container .select2-selection{border-color:#ddd}.select2-container .select2-search__field{min-width:150px}.select2-container .select2-selection--single{height:32px}.select2-container .select2-selection--single .select2-selection__rendered{line-height:32px;padding-right:24px}.select2-container .select2-selection--single .select2-selection__arrow{right:3px;height:30px}.select2-container .select2-selection--multiple{min-height:28px;border-radius:0;line-height:1.5}.select2-container .select2-selection--multiple li{margin:0}.select2-container .select2-selection--multiple .select2-selection__choice{padding:2px 6px}.select2-container .select2-selection--multiple .select2-selection__choice .description{display:none}.select2-container .select2-selection__clear{color:#999;margin-top:-1px}.select2-container .select2-search--inline .select2-search__field{font-family:inherit;font-size:inherit;font-weight:inherit;padding:3px 0}.woocommerce table.form-table .select2-container{min-width:400px!important}.post-type-product .tablenav .actions,.post-type-shop_order .tablenav .actions{overflow:visible}.post-type-product .tablenav input,.post-type-product .tablenav select,.post-type-shop_order .tablenav input,.post-type-shop_order .tablenav select{line-height:1;height:32px}.post-type-product .tablenav .select2-container,.post-type-shop_order .tablenav .select2-container{float:left;width:240px!important;font-size:14px;vertical-align:middle;margin:1px 6px 4px 1px}.woocommerce-exporter-wrapper,.woocommerce-importer-wrapper,.woocommerce-progress-form-wrapper{text-align:center;max-width:700px;margin:40px auto}.woocommerce-exporter-wrapper .error,.woocommerce-importer-wrapper .error,.woocommerce-progress-form-wrapper .error{text-align:left}.woocommerce-exporter-wrapper .wc-progress-steps,.woocommerce-importer-wrapper .wc-progress-steps,.woocommerce-progress-form-wrapper .wc-progress-steps{padding:0 0 24px;margin:0;list-style:none outside;overflow:hidden;color:#ccc;width:100%;display:-webkit-inline-box;display:inline-flex}.woocommerce-exporter-wrapper .wc-progress-steps li,.woocommerce-importer-wrapper .wc-progress-steps li,.woocommerce-progress-form-wrapper .wc-progress-steps li{width:25%;float:left;padding:0 0 .8em;margin:0;text-align:center;position:relative;border-bottom:4px solid #ccc;line-height:1.4em}.woocommerce-exporter-wrapper .wc-progress-steps li::before,.woocommerce-importer-wrapper .wc-progress-steps li::before,.woocommerce-progress-form-wrapper .wc-progress-steps li::before{content:'';border:4px solid #ccc;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;left:50%;margin-left:-6px;margin-bottom:-8px;background:#fff}.woocommerce-exporter-wrapper .wc-progress-steps li.active,.woocommerce-importer-wrapper .wc-progress-steps li.active,.woocommerce-progress-form-wrapper .wc-progress-steps li.active{border-color:#a16696;color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.active::before,.woocommerce-importer-wrapper .wc-progress-steps li.active::before,.woocommerce-progress-form-wrapper .wc-progress-steps li.active::before{border-color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.done,.woocommerce-importer-wrapper .wc-progress-steps li.done,.woocommerce-progress-form-wrapper .wc-progress-steps li.done{border-color:#a16696;color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.done::before,.woocommerce-importer-wrapper .wc-progress-steps li.done::before,.woocommerce-progress-form-wrapper .wc-progress-steps li.done::before{border-color:#a16696;background:#a16696}.woocommerce-exporter-wrapper .button,.woocommerce-importer-wrapper .button,.woocommerce-progress-form-wrapper .button{font-size:1.25em;padding:.5em 1em!important;line-height:1.5em!important;margin-right:.5em;margin-bottom:2px;height:auto!important;border-radius:4px;background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597;margin:0;opacity:1}.woocommerce-exporter-wrapper .button:active,.woocommerce-exporter-wrapper .button:focus,.woocommerce-exporter-wrapper .button:hover,.woocommerce-importer-wrapper .button:active,.woocommerce-importer-wrapper .button:focus,.woocommerce-importer-wrapper .button:hover,.woocommerce-progress-form-wrapper .button:active,.woocommerce-progress-form-wrapper .button:focus,.woocommerce-progress-form-wrapper .button:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-exporter-wrapper .error .button,.woocommerce-importer-wrapper .error .button,.woocommerce-progress-form-wrapper .error .button{font-size:1em}.woocommerce-exporter-wrapper .wc-actions,.woocommerce-importer-wrapper .wc-actions,.woocommerce-progress-form-wrapper .wc-actions{overflow:hidden;border-top:1px solid #eee;margin:0;padding:23px 24px 24px;line-height:3em}.woocommerce-exporter-wrapper .wc-actions .button,.woocommerce-importer-wrapper .wc-actions .button,.woocommerce-progress-form-wrapper .wc-actions .button{float:right}.woocommerce-exporter-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options,.woocommerce-importer-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options,.woocommerce-progress-form-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options{color:#999}.woocommerce-exporter-wrapper .wc-progress-form-content,.woocommerce-exporter-wrapper .woocommerce-exporter,.woocommerce-exporter-wrapper .woocommerce-importer,.woocommerce-importer-wrapper .wc-progress-form-content,.woocommerce-importer-wrapper .woocommerce-exporter,.woocommerce-importer-wrapper .woocommerce-importer,.woocommerce-progress-form-wrapper .wc-progress-form-content,.woocommerce-progress-form-wrapper .woocommerce-exporter,.woocommerce-progress-form-wrapper .woocommerce-importer{background:#fff;overflow:hidden;padding:0;margin:0 0 16px;box-shadow:0 1px 3px rgba(0,0,0,.13);color:#555;text-align:left}.woocommerce-exporter-wrapper .wc-progress-form-content header,.woocommerce-exporter-wrapper .woocommerce-exporter header,.woocommerce-exporter-wrapper .woocommerce-importer header,.woocommerce-importer-wrapper .wc-progress-form-content header,.woocommerce-importer-wrapper .woocommerce-exporter header,.woocommerce-importer-wrapper .woocommerce-importer header,.woocommerce-progress-form-wrapper .wc-progress-form-content header,.woocommerce-progress-form-wrapper .woocommerce-exporter header,.woocommerce-progress-form-wrapper .woocommerce-importer header{border-bottom:1px solid #eee;margin:0;padding:24px 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content section,.woocommerce-exporter-wrapper .woocommerce-exporter section,.woocommerce-exporter-wrapper .woocommerce-importer section,.woocommerce-importer-wrapper .wc-progress-form-content section,.woocommerce-importer-wrapper .woocommerce-exporter section,.woocommerce-importer-wrapper .woocommerce-importer section,.woocommerce-progress-form-wrapper .wc-progress-form-content section,.woocommerce-progress-form-wrapper .woocommerce-exporter section,.woocommerce-progress-form-wrapper .woocommerce-importer section{padding:24px 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content h2,.woocommerce-exporter-wrapper .woocommerce-exporter h2,.woocommerce-exporter-wrapper .woocommerce-importer h2,.woocommerce-importer-wrapper .wc-progress-form-content h2,.woocommerce-importer-wrapper .woocommerce-exporter h2,.woocommerce-importer-wrapper .woocommerce-importer h2,.woocommerce-progress-form-wrapper .wc-progress-form-content h2,.woocommerce-progress-form-wrapper .woocommerce-exporter h2,.woocommerce-progress-form-wrapper .woocommerce-importer h2{margin:0 0 24px;color:#555;font-size:24px;font-weight:400;line-height:1em}.woocommerce-exporter-wrapper .wc-progress-form-content p,.woocommerce-exporter-wrapper .woocommerce-exporter p,.woocommerce-exporter-wrapper .woocommerce-importer p,.woocommerce-importer-wrapper .wc-progress-form-content p,.woocommerce-importer-wrapper .woocommerce-exporter p,.woocommerce-importer-wrapper .woocommerce-importer p,.woocommerce-progress-form-wrapper .wc-progress-form-content p,.woocommerce-progress-form-wrapper .woocommerce-exporter p,.woocommerce-progress-form-wrapper .woocommerce-importer p{font-size:1em;line-height:1.75em;font-size:16px;color:#555;margin:0 0 24px}.woocommerce-exporter-wrapper .wc-progress-form-content .form-row,.woocommerce-exporter-wrapper .woocommerce-exporter .form-row,.woocommerce-exporter-wrapper .woocommerce-importer .form-row,.woocommerce-importer-wrapper .wc-progress-form-content .form-row,.woocommerce-importer-wrapper .woocommerce-exporter .form-row,.woocommerce-importer-wrapper .woocommerce-importer .form-row,.woocommerce-progress-form-wrapper .wc-progress-form-content .form-row,.woocommerce-progress-form-wrapper .woocommerce-exporter .form-row,.woocommerce-progress-form-wrapper .woocommerce-importer .form-row{margin-top:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter .spinner,.woocommerce-exporter-wrapper .woocommerce-importer .spinner,.woocommerce-importer-wrapper .wc-progress-form-content .spinner,.woocommerce-importer-wrapper .woocommerce-exporter .spinner,.woocommerce-importer-wrapper .woocommerce-importer .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer .spinner{display:none}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th{vertical-align:top;line-height:1.75em;padding:0 0 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th label{color:#555;font-weight:400}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox]{margin:0 4px 0 0;padding:7px}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text]{padding:7px;height:auto;margin:0}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper{border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);background-color:#fff;color:#32373c;outline:0;line-height:1;display:block}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code{background:0 0;font-size:smaller;padding:0;margin:0;color:#999;padding:7px 0 0 7px;display:inline-block}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input{font-family:Consolas,Monaco,monospace;border:0;margin:0;outline:0;box-shadow:none;display:inline-block;min-width:100%}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th{width:35%;padding-right:20px}.woocommerce-exporter-wrapper .wc-progress-form-content progress,.woocommerce-exporter-wrapper .woocommerce-exporter progress,.woocommerce-exporter-wrapper .woocommerce-importer progress,.woocommerce-importer-wrapper .wc-progress-form-content progress,.woocommerce-importer-wrapper .woocommerce-exporter progress,.woocommerce-importer-wrapper .woocommerce-importer progress,.woocommerce-progress-form-wrapper .wc-progress-form-content progress,.woocommerce-progress-form-wrapper .woocommerce-exporter progress,.woocommerce-progress-form-wrapper .woocommerce-importer progress{width:100%;height:42px;margin:0 auto 24px;display:block;-webkit-appearance:none;border:none;display:none;background:#f5f5f5;border:2px solid #eee;border-radius:4px;padding:0;box-shadow:0 1px 0 0 rgba(255,255,255,.2)}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-exporter-wrapper .woocommerce-importer progress::-webkit-progress-bar,.woocommerce-importer-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-importer-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-importer-wrapper .woocommerce-importer progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-webkit-progress-bar{background:transparent none;border:0;border-radius:4px;padding:0;box-shadow:none}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-exporter-wrapper .woocommerce-importer progress::-webkit-progress-value,.woocommerce-importer-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-importer-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-importer-wrapper .woocommerce-importer progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-webkit-progress-value{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:-webkit-linear-gradient(top,#a46497,#66405f),#a46497;background:linear-gradient(top,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-exporter-wrapper .woocommerce-importer progress::-moz-progress-bar,.woocommerce-importer-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-importer-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-importer-wrapper .woocommerce-importer progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-moz-progress-bar{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:linear-gradient(top,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-exporter-wrapper .woocommerce-importer progress::-ms-fill,.woocommerce-importer-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-importer-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-importer-wrapper .woocommerce-importer progress::-ms-fill,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-ms-fill{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:linear-gradient(to bottom,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner{display:block}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing progress{display:block}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options{display:none}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper{padding:0}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table{margin:0;border:0;box-shadow:none;width:100%;table-layout:fixed}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th{border:0;padding:12px;vertical-align:middle;word-wrap:break-word}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th select{width:100%}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th{background:#fbfbfb}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th{font-weight:700}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child{padding-left:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child{padding-right:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name{width:50%}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description{color:#999;margin-top:4px;display:block}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code{background:0 0;padding:0;white-space:pre-line;word-wrap:break-word;word-break:break-all}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-done,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-done,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-done{text-align:center;padding:48px 24px;font-size:1.5em;line-height:1.75em}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-done::before,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-done::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#a16696;position:static;font-size:100px;display:block;float:none;margin:0 0 24px}.wc-pointer .wc-pointer-buttons .close{float:left;margin:6px 0 0 15px}
\ No newline at end of file
+@charset "UTF-8";@-webkit-keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;left:50%;margin-left:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.wc_addons_wrap{max-width:1200px}.wc_addons_wrap h1.search-form-title{clear:left;padding:0}.wc_addons_wrap form.search-form{clear:both;display:block;position:relative;margin-top:1em;margin-bottom:1em}.wc_addons_wrap form.search-form input{border:1px solid #ddd;box-shadow:none;height:53px;padding-left:50px;width:100%;margin:0}.wc_addons_wrap form.search-form button{background:0 0;border:none;cursor:pointer;height:53px;position:absolute;width:53px}.wc_addons_wrap .update-plugins .update-count{background-color:#d54e21;border-radius:10px;color:#fff;display:inline-block;font-size:9px;font-weight:600;line-height:17px;margin:1px 0 0 2px;padding:0 6px;vertical-align:text-top}.wc_addons_wrap .addons-featured{margin:0}.wc_addons_wrap ul.subsubsub.subsubsub{margin:-2px 0 12px}.wc_addons_wrap .subsubsub li::after{content:'|'}.wc_addons_wrap .subsubsub li:last-child::after{content:''}.wc_addons_wrap .addons-banner-block-item-icon,.wc_addons_wrap .addons-column-block-item-icon{-webkit-box-align:center;align-items:center;display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center}.wc_addons_wrap .addons-banner-block,.wc_addons_wrap .addons-wcs-banner-block{background:#fff;border:1px solid #ddd;margin:0 0 1em 0;padding:2em 2em 1em}.wc_addons_wrap .addons-banner-block img{height:62px}.wc_addons_wrap .addons-banner-block p{margin:0 0 20px}.wc_addons_wrap .addons-banner-block-items{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;flex-wrap:wrap;justify-content:space-around;margin:0 -10px 0 -10px}.wc_addons_wrap .addons-banner-block-item{border:1px solid #e6e6e6;border-radius:3px;-webkit-box-flex:1;flex:1;margin:1em;min-width:200px;width:30%}.wc_addons_wrap .addons-banner-block-item-icon{background:#f7f7f7;height:143px}.wc_addons_wrap .addons-banner-block-item-content{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;height:184px;-webkit-box-pack:justify;justify-content:space-between;padding:24px}.wc_addons_wrap .addons-banner-block-item-content h3{margin-top:0}.wc_addons_wrap .addons-banner-block-item-content p{margin:0 0 auto}.wc_addons_wrap .addons-wcs-banner-block{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center}.wc_addons_wrap .addons-wcs-banner-block-image{background:#f7f7f7;border:1px solid #e6e6e6;margin-right:2em;padding:4em}.wc_addons_wrap .addons-wcs-banner-block-image .addons-img{max-height:86px;max-width:97px}.wc_addons_wrap .addons-shipping-methods .addons-wcs-banner-block{margin-left:0;margin-right:0;margin-top:1em}.wc_addons_wrap .addons-wcs-banner-block-content{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;justify-content:space-around;align-self:stretch;padding:1em 0}.wc_addons_wrap .addons-wcs-banner-block-content h1{padding-bottom:0}.wc_addons_wrap .addons-wcs-banner-block-content p{margin-bottom:0}.wc_addons_wrap .addons-wcs-banner-block-content .wcs-service-logo{max-width:40px}.wc_addons_wrap .addons-column-section{display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;flex-wrap:wrap;justify-content:space-around}.wc_addons_wrap .addons-column{-webkit-box-flex:1;flex:1;width:50%;padding:0 .5em}.wc_addons_wrap .addons-column:nth-child(2){margin-right:0}.wc_addons_wrap .addons-column-block,.wc_addons_wrap .addons-small-dark-block,.wc_addons_wrap .addons-small-light-block{box-sizing:border-box;border:1px solid #ddd;margin:0 0 1em;padding:20px}.wc_addons_wrap .addons-column-block img{max-height:50px;max-width:50px}.wc_addons_wrap .addons-column-block,.wc_addons_wrap .addons-small-light-block{background:#fff}.wc_addons_wrap .addons-column-block-left{float:left}.wc_addons_wrap .addons-column-block-right{float:right}.wc_addons_wrap .addons-column-block-item{border-top:2px solid #f9f9f9;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-direction:row;flex-wrap:wrap;-webkit-box-pack:justify;justify-content:space-between;margin:0 -20px;padding:20px}.wc_addons_wrap .addons-column-block-item-icon{background:#f7f7f7;border:1px solid #e6e6e6;height:100px;margin:0 10px 10px 0;width:100px}.wc_addons_wrap .addons-column-block-item-content{display:-webkit-box;display:flex;-webkit-box-flex:1;flex:1;flex-wrap:wrap;height:20%;-webkit-box-pack:justify;justify-content:space-between;min-width:200px}.wc_addons_wrap .addons-column-block-item-content h2{float:left;margin-top:8px}.wc_addons_wrap .addons-column-block-item-content a{float:right}.wc_addons_wrap .addons-column-block-item-content p{float:left}.wc_addons_wrap .addons-banner-block-item,.wc_addons_wrap .addons-column-block-item{display:none}.wc_addons_wrap .addons-banner-block-item:nth-child(-n+3){display:block}.wc_addons_wrap .addons-column-block-item:nth-of-type(-n+3){display:-webkit-box;display:flex}.wc_addons_wrap .addons-small-dark-block{background-color:#54687d;text-align:center}.wc_addons_wrap .addons-small-dark-items{display:-webkit-box;display:flex;flex-wrap:wrap;justify-content:space-around}.wc_addons_wrap .addons-small-dark-item{margin:0 0 20px}.wc_addons_wrap .addons-small-dark-block h1{color:#fff}.wc_addons_wrap .addons-small-dark-block p{color:#fafafa}.wc_addons_wrap .addons-small-dark-item-icon img{height:30px}.wc_addons_wrap .addons-small-dark-item a{margin:28px auto 0}.wc_addons_wrap .addons-small-light-block{display:-webkit-box;display:flex;flex-wrap:wrap}.wc_addons_wrap .addons-small-light-block h1{margin-top:-12px}.wc_addons_wrap .addons-small-light-block p{margin-top:0}.wc_addons_wrap .addons-small-light-block img{height:225px;margin:0 0 0 -20px}.wc_addons_wrap .addons-small-light-block-content{display:-webkit-box;display:flex;-webkit-box-flex:1;flex:1 1 100px;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;justify-content:space-around}.wc_addons_wrap .addons-small-light-block-buttons{display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between}.wc_addons_wrap .addons-small-light-block-content a{width:48%}.wc_addons_wrap .addons-button{border-radius:3px;cursor:pointer;display:block;height:37px;line-height:37px;text-align:center;text-decoration:none;width:124px}.wc_addons_wrap .addons-button-solid{background-color:#955a89;color:#fff}.wc_addons_wrap .addons-button-solid:hover{color:#fff;opacity:.8}.wc_addons_wrap .addons-button-outline-green{border:1px solid #73ae39;color:#73ae39}.wc_addons_wrap .addons-button-outline-green:hover{color:#73ae39;opacity:.8}.wc_addons_wrap .addons-button-outline-white{border:1px solid #fff;color:#fff}.wc_addons_wrap .addons-button-outline-white:hover{color:#fff;opacity:.8}.wc_addons_wrap .addons-button-installed{background:#e6e6e6;color:#3c3c3c}.wc_addons_wrap .addons-button-installed:hover{color:#3c3c3c;opacity:.8}@media only screen and (max-width:400px){.wc_addons_wrap .addons-featured{margin:-1% -5%}.wc_addons_wrap .addons-button{width:100%}.wc_addons_wrap .addons-small-dark-item{width:100%}.wc_addons_wrap .addons-column-block-item-icon{background:0 0;border:none;height:75px;margin:0 10px 10px 0;width:75px}}.wc_addons_wrap .products{overflow:hidden;display:-webkit-box;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row;flex-wrap:wrap;margin:0 -.5em}.wc_addons_wrap .products li{float:left;border:1px solid #ddd;margin:0 .5em 1em!important;padding:0;vertical-align:top;width:25%;min-width:280px;min-height:220px;-webkit-box-flex:1;flex:1;overflow:hidden;background:#f5f5f5;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),inset 0 -1px 0 rgba(0,0,0,.1)}.wc_addons_wrap .products li a{text-decoration:none;color:inherit;display:block;height:100%}.wc_addons_wrap .products li a .product-img-wrap{background:#fff;display:block}.wc_addons_wrap .products li a img{max-width:258px;max-height:24px;padding:17px 20px;display:block;margin:0;background:#fff;border-right:260px solid #fff}.wc_addons_wrap .products li a img.extension-thumb+h3{display:none}.wc_addons_wrap .products li a .price{display:none}.wc_addons_wrap .products li a h2,.wc_addons_wrap .products li a h3{margin:0!important;padding:20px!important;background:#fff}.wc_addons_wrap .products li a p{padding:20px!important;margin:0!important;border-top:1px solid #f1f1f1}.wc_addons_wrap .products li a:focus,.wc_addons_wrap .products li a:hover{background-color:#fff}.wc_addons_wrap .storefront{background:url(../images/storefront-bg.jpg) bottom right #f6f6f6;border:1px solid #ddd;margin-top:1em;padding:20px;overflow:hidden;zoom:1}.wc_addons_wrap .storefront img{width:278px;height:auto;float:left;margin:0 20px 0 0;box-shadow:0 1px 6px rgba(0,0,0,.1)}.wc_addons_wrap .storefront p{max-width:750px}.woocommerce-BlankState a.button-primary,.woocommerce-BlankState button.button-primary,.woocommerce-message a.button-primary,.woocommerce-message button.button-primary{background:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;color:#fff;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597;display:inline-block}.woocommerce-BlankState a.button-primary:active,.woocommerce-BlankState a.button-primary:focus,.woocommerce-BlankState a.button-primary:hover,.woocommerce-BlankState button.button-primary:active,.woocommerce-BlankState button.button-primary:focus,.woocommerce-BlankState button.button-primary:hover,.woocommerce-message a.button-primary:active,.woocommerce-message a.button-primary:focus,.woocommerce-message a.button-primary:hover,.woocommerce-message button.button-primary:active,.woocommerce-message button.button-primary:focus,.woocommerce-message button.button-primary:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-message{position:relative;border-left-color:#cc99c2!important;overflow:hidden}.woocommerce-message a.docs,.woocommerce-message a.skip{text-decoration:none!important}.woocommerce-message a.woocommerce-message-close{position:static;float:right;padding:0 15px 10px 28px;margin-top:-10px;font-size:13px;line-height:1.23076923;text-decoration:none}.woocommerce-message a.woocommerce-message-close::before{position:relative;top:18px;left:-20px;-webkit-transition:all .1s ease-in-out;transition:all .1s ease-in-out}.woocommerce-message .twitter-share-button{margin-top:-3px;margin-left:3px;vertical-align:middle}#variable_product_options #message,#variable_product_options .notice{margin:10px}.clear{clear:both}.wrap.woocommerce div.error,.wrap.woocommerce div.updated{margin-top:10px}mark.amount{background:transparent none;color:inherit}.simplify-commerce-banner{overflow:hidden}.simplify-commerce-banner img{float:right;padding:15px 0;margin-left:1em;width:200px}.woocommerce-help-tip{color:#666;display:inline-block;font-size:1.1em;font-style:normal;height:16px;line-height:16px;position:relative;vertical-align:middle;width:16px}.woocommerce-help-tip::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";cursor:help}h2 .woocommerce-help-tip{margin-top:-5px;margin-left:.25em}table.wc_status_table{margin-bottom:1em}table.wc_status_table h2{font-size:14px;margin:0}table.wc_status_table tr:nth-child(2n) td,table.wc_status_table tr:nth-child(2n) th{background:#fcfcfc}table.wc_status_table th{font-weight:700;padding:9px}table.wc_status_table td:first-child{width:33%}table.wc_status_table td.help{width:1em}table.wc_status_table td,table.wc_status_table th{font-size:1.1em;font-weight:400}table.wc_status_table td.run-tool,table.wc_status_table th.run-tool{text-align:right}table.wc_status_table td strong.name,table.wc_status_table th strong.name{display:block;margin-bottom:.5em}table.wc_status_table td mark,table.wc_status_table th mark{background:transparent none}table.wc_status_table td mark.yes,table.wc_status_table th mark.yes{color:#7ad03a}table.wc_status_table td mark.no,table.wc_status_table th mark.no{color:#999}table.wc_status_table td .red,table.wc_status_table td mark.error,table.wc_status_table th .red,table.wc_status_table th mark.error{color:#a00}table.wc_status_table td ul,table.wc_status_table th ul{margin:0}table.wc_status_table .help_tip{cursor:help}table.wc_status_table--tools td,table.wc_status_table--tools th{padding:2em}.taxonomy-product_cat .check-column .woocommerce-help-tip{font-size:1.5em;margin:-3px 0 0 5px;display:block;position:absolute}#debug-report{display:none;margin:10px 0;padding:0;position:relative}#debug-report textarea{font-family:monospace;width:100%;margin:0;height:300px;padding:20px;border-radius:0;resize:none;font-size:12px;line-height:20px;outline:0}.wp-list-table.logs .log-level{display:inline;padding:.2em .6em .3em;font-size:80%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.2em}.wp-list-table.logs .log-level:empty{display:none}.wp-list-table.logs .log-level--alert,.wp-list-table.logs .log-level--emergency{background-color:#ff4136}.wp-list-table.logs .log-level--critical,.wp-list-table.logs .log-level--error{background-color:#ff851b}.wp-list-table.logs .log-level--notice,.wp-list-table.logs .log-level--warning{color:#222;background-color:#ffdc00}.wp-list-table.logs .log-level--info{background-color:#0074d9}.wp-list-table.logs .log-level--debug{background-color:#3d9970}@media screen and (min-width:783px){.wp-list-table.logs .column-timestamp{width:18%}.wp-list-table.logs .column-level{width:14%}.wp-list-table.logs .column-source{width:15%}}#log-viewer-select{padding:10px 0 8px;line-height:28px}#log-viewer-select h2 a{vertical-align:middle}#log-viewer{background:#fff;border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.04);padding:5px 20px}#log-viewer pre{font-family:monospace;white-space:pre-wrap;word-wrap:break-word}.inline-edit-product.quick-edit-row .inline-edit-col-center,.inline-edit-product.quick-edit-row .inline-edit-col-right{float:right!important}#woocommerce-fields.inline-edit-col{clear:left}#woocommerce-fields.inline-edit-col label.featured,#woocommerce-fields.inline-edit-col label.manage_stock{margin-left:10px}#woocommerce-fields.inline-edit-col label.stock_status_field{clear:both;float:left}#woocommerce-fields.inline-edit-col .dimensions div{display:block;margin:.2em 0}#woocommerce-fields.inline-edit-col .dimensions div span.title{display:block;float:left;width:5em}#woocommerce-fields.inline-edit-col .dimensions div span.input-text-wrap{display:block;margin-left:5em}#woocommerce-fields.inline-edit-col .text{box-sizing:border-box;width:99%;float:left;margin:1px 1% 1px 1px}#woocommerce-fields.inline-edit-col .height,#woocommerce-fields.inline-edit-col .length,#woocommerce-fields.inline-edit-col .width{width:32.33%}#woocommerce-fields.inline-edit-col .height{margin-right:0}#woocommerce-fields-bulk.inline-edit-col label{clear:left}#woocommerce-fields-bulk.inline-edit-col .inline-edit-group label{clear:none;width:49%;margin:.2em 0}#woocommerce-fields-bulk.inline-edit-col .inline-edit-group.dimensions label{width:75%;max-width:75%}#woocommerce-fields-bulk.inline-edit-col .length,#woocommerce-fields-bulk.inline-edit-col .regular_price,#woocommerce-fields-bulk.inline-edit-col .sale_price,#woocommerce-fields-bulk.inline-edit-col .stock,#woocommerce-fields-bulk.inline-edit-col .weight{box-sizing:border-box;width:100%;margin-left:4.4em}#woocommerce-fields-bulk.inline-edit-col .height,#woocommerce-fields-bulk.inline-edit-col .length,#woocommerce-fields-bulk.inline-edit-col .width{box-sizing:border-box;width:25%}.column-coupon_code{line-height:2.25em}.column-coupon_code,ul.wc_coupon_list{margin:0;overflow:hidden;zoom:1;clear:both}ul.wc_coupon_list{padding-bottom:5px}ul.wc_coupon_list li{margin:0}ul.wc_coupon_list li.code{display:inline-block;position:relative;padding:0 .5em;background-color:#fff;border:1px solid #aaa;box-shadow:0 1px 0 #dfdfdf;border-radius:4px;margin-right:5px;margin-top:5px}ul.wc_coupon_list li.code.editable{padding-right:2em}ul.wc_coupon_list li.code .tips{cursor:pointer}ul.wc_coupon_list li.code .tips span{color:#888}ul.wc_coupon_list li.code .tips span:hover{color:#000}ul.wc_coupon_list li.code .remove-coupon{text-decoration:none;color:#888;position:absolute;top:7px;right:20px}ul.wc_coupon_list li.code .remove-coupon::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}ul.wc_coupon_list li.code .remove-coupon:hover::before{color:#a00}ul.wc_coupon_list_block{margin:0;padding-bottom:2px}ul.wc_coupon_list_block li{border-top:1px solid #fff;border-bottom:1px solid #ccc;line-height:2.5em;margin:0;padding:.5em 0}ul.wc_coupon_list_block li:first-child{border-top:0;padding-top:0}ul.wc_coupon_list_block li:last-child{border-bottom:0;padding-bottom:0}.button.wc-reload{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;padding:0;height:28px;width:28px!important;display:inline-block}.button.wc-reload::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";line-height:28px}#woocommerce-order-data .handlediv,#woocommerce-order-data .hndle{display:none}#woocommerce-order-data .inside{display:block!important}#order_data{padding:23px 24px 12px}#order_data h2{margin:0;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif;font-size:21px;font-weight:400;line-height:1.2;text-shadow:1px 1px 1px #fff;padding:0}#order_data h3{font-size:14px}#order_data h3,#order_data h4{color:#333;margin:1.33em 0 0}#order_data p{color:#777}#order_data p.order_number{margin:0;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif;font-weight:400;line-height:1.6em;font-size:16px}#order_data .order_data_column_container{clear:both}#order_data .order_data_column{width:32%;padding:0 2% 0 0;float:left}#order_data .order_data_column>h3 span{display:block}#order_data .order_data_column:last-child{padding-right:0}#order_data .order_data_column p{padding:0!important}#order_data .order_data_column .address strong{display:block}#order_data .order_data_column .form-field{float:left;clear:left;width:48%;padding:0;margin:9px 0 0}#order_data .order_data_column .form-field label{display:block;padding:0 0 3px}#order_data .order_data_column .form-field input,#order_data .order_data_column .form-field textarea{width:100%}#order_data .order_data_column .form-field select{width:100%}#order_data .order_data_column .form-field .select2-container{width:100%!important}#order_data .order_data_column .form-field .date-picker{width:50%}#order_data .order_data_column .form-field .hour,#order_data .order_data_column .form-field .minute{width:3.5em}#order_data .order_data_column .form-field small{display:block;margin:5px 0 0;color:#999}#order_data .order_data_column ._billing_address_2_field,#order_data .order_data_column ._billing_last_name_field,#order_data .order_data_column ._billing_phone_field,#order_data .order_data_column ._billing_postcode_field,#order_data .order_data_column ._billing_state_field,#order_data .order_data_column ._shipping_address_2_field,#order_data .order_data_column ._shipping_last_name_field,#order_data .order_data_column ._shipping_postcode_field,#order_data .order_data_column ._shipping_state_field,#order_data .order_data_column .form-field.last{float:right;clear:right}#order_data .order_data_column ._billing_company_field,#order_data .order_data_column ._shipping_company_field,#order_data .order_data_column ._transaction_id_field,#order_data .order_data_column .form-field-wide{width:100%;clear:both}#order_data .order_data_column ._billing_company_field .wc-category-search,#order_data .order_data_column ._billing_company_field .wc-customer-search,#order_data .order_data_column ._billing_company_field .wc-enhanced-select,#order_data .order_data_column ._billing_company_field input,#order_data .order_data_column ._billing_company_field select,#order_data .order_data_column ._billing_company_field textarea,#order_data .order_data_column ._shipping_company_field .wc-category-search,#order_data .order_data_column ._shipping_company_field .wc-customer-search,#order_data .order_data_column ._shipping_company_field .wc-enhanced-select,#order_data .order_data_column ._shipping_company_field input,#order_data .order_data_column ._shipping_company_field select,#order_data .order_data_column ._shipping_company_field textarea,#order_data .order_data_column ._transaction_id_field .wc-category-search,#order_data .order_data_column ._transaction_id_field .wc-customer-search,#order_data .order_data_column ._transaction_id_field .wc-enhanced-select,#order_data .order_data_column ._transaction_id_field input,#order_data .order_data_column ._transaction_id_field select,#order_data .order_data_column ._transaction_id_field textarea,#order_data .order_data_column .form-field-wide .wc-category-search,#order_data .order_data_column .form-field-wide .wc-customer-search,#order_data .order_data_column .form-field-wide .wc-enhanced-select,#order_data .order_data_column .form-field-wide input,#order_data .order_data_column .form-field-wide select,#order_data .order_data_column .form-field-wide textarea{width:100%}#order_data .order_data_column p.none_set{color:#999}#order_data .order_data_column div.edit_address{display:none;zoom:1;padding-right:1px}#order_data .order_data_column .wc-customer-user label a,#order_data .order_data_column .wc-order-status label a{float:right;margin-left:8px}#order_data .order_data_column a.edit_address{width:14px;height:0;padding:14px 0 0;margin:0 0 0 6px;overflow:hidden;position:relative;color:#999;border:0;float:right}#order_data .order_data_column a.edit_address:focus,#order_data .order_data_column a.edit_address:hover{color:#000}#order_data .order_data_column a.edit_address::after{font-family:WooCommerce;position:absolute;top:0;left:0;text-align:center;vertical-align:top;line-height:14px;font-size:14px;font-weight:400}#order_data .order_data_column a.edit_address::after{font-family:Dashicons;content:'\f464'}#order_data .order_data_column .billing-same-as-shipping,#order_data .order_data_column .load_customer_billing,#order_data .order_data_column .load_customer_shipping{font-size:13px;display:inline-block;font-weight:400}#order_data .order_data_column .load_customer_shipping{margin-right:.3em}.order_actions{margin:0;overflow:hidden;zoom:1}.order_actions li{border-top:1px solid #fff;border-bottom:1px solid #ddd;padding:6px 0;margin:0;line-height:1.6em;float:left;width:50%;text-align:center}.order_actions li a{float:none;text-align:center;text-decoration:underline}.order_actions li.wide{width:auto;float:none;clear:both;padding:6px;text-align:left;overflow:hidden}.order_actions li #delete-action{line-height:25px;vertical-align:middle;text-align:left;float:left}.order_actions li .save_order{float:right}.order_actions li#actions{overflow:hidden}.order_actions li#actions .button{width:24px;box-sizing:border-box;float:right}.order_actions li#actions select{width:225px;box-sizing:border-box;float:left}#woocommerce-order-items .inside{margin:0;padding:0;background:#fefefe}#woocommerce-order-items .wc-order-data-row{border-bottom:1px solid #dfdfdf;padding:1.5em 2em;background:#f8f8f8;line-height:2em;text-align:right}#woocommerce-order-items .wc-order-data-row::after,#woocommerce-order-items .wc-order-data-row::before{content:' ';display:table}#woocommerce-order-items .wc-order-data-row::after{clear:both}#woocommerce-order-items .wc-order-data-row p{margin:0;line-height:2em}#woocommerce-order-items .wc-order-data-row .wc-used-coupons{text-align:left}#woocommerce-order-items .wc-order-data-row .wc-used-coupons .tips{display:inline-block}#woocommerce-order-items .wc-used-coupons{float:left;width:50%}#woocommerce-order-items .wc-order-totals{float:right;width:50%;margin:0;padding:0;text-align:right}#woocommerce-order-items .wc-order-totals .amount{font-weight:700}#woocommerce-order-items .wc-order-totals .label{vertical-align:top}#woocommerce-order-items .wc-order-totals .total{font-size:1em!important;width:10em;margin:0 0 0 .5em;box-sizing:border-box}#woocommerce-order-items .wc-order-totals .total input[type=text]{width:96%;float:right}#woocommerce-order-items .wc-order-totals .refunded-total{color:#a00}#woocommerce-order-items .refund-actions{margin-top:5px;padding-top:12px;border-top:1px solid #dfdfdf}#woocommerce-order-items .refund-actions .button{float:right;margin-left:4px}#woocommerce-order-items .refund-actions .cancel-action{float:left;margin-left:0}#woocommerce-order-items .add_meta{margin-left:0!important}#woocommerce-order-items h3 small{color:#999}#woocommerce-order-items .amount{white-space:nowrap}#woocommerce-order-items .add-items .description{margin-right:10px}#woocommerce-order-items .add-items .button{float:left;margin-right:.25em}#woocommerce-order-items .add-items .button-primary{float:none;margin-right:0}#woocommerce-order-items .inside{display:block!important}#woocommerce-order-items .handlediv,#woocommerce-order-items .hndle{display:none}#woocommerce-order-items .woocommerce_order_items_wrapper{margin:0;overflow-x:auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items{width:100%;background:#fff}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th{text-align:left;padding:1em;font-weight:400;color:#999;background:#f8f8f8;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th.sortable{cursor:pointer}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th:last-child{padding-right:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th:first-child{padding-left:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th .wc-arrow{float:right;position:relative;margin-right:-1em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td{padding:1.5em 1em 1em;text-align:left;line-height:1.5em;vertical-align:top;border-bottom:1px solid #f8f8f8}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td textarea{width:100%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td select{width:50%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td textarea{font-size:14px;padding:4px;color:#555}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th:last-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td:last-child{padding-right:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td:first-child{padding-left:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr:last-child td{border-bottom:1px solid #dfdfdf}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr:first-child td{border-top:8px solid #f8f8f8}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody#order_line_items tr:first-child td{border-top:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb{text-align:left;width:38px;padding-bottom:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail{width:38px;height:38px;border:2px solid #e8e8e8;background:#f8f8f8;color:#ccc;position:relative;font-size:21px;display:block;text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";width:38px;line-height:38px;display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail img{width:100%;height:100%;margin:0;padding:0;position:relative}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.name .wc-order-item-sku,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.name .wc-order-item-variation{display:block;margin-top:.5em;font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item{min-width:200px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .center,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .variation-id{text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class{text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class label{white-space:nowrap;color:#999;font-size:.833em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class label input{display:inline}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class input{width:70px;vertical-align:middle;text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class select{width:85px;height:26px;vertical-align:middle;font-size:1em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input{display:inline-block;background:#fff;border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);margin:1px 0;min-width:80px;overflow:hidden;line-height:1em;text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input{width:100%;box-sizing:border-box}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input label{font-size:.75em;padding:4px 6px 0;color:#555;display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input input{width:100%;box-sizing:border-box;border:0;box-shadow:none;margin:0;padding:0 6px 4px;color:#555;background:0 0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input input::-webkit-input-placeholder{color:#ddd}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child{border-bottom:1px dashed #ddd;background:#fff}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child label{color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child input{color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .view{white-space:nowrap}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .edit{text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class small.times{font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes{margin:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes label{display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-discount{display:block;margin-top:.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class small.times{margin-right:.25em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity{text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity input{text-align:center;width:50px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items span.subtotal{opacity:.5}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.tax_class,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.tax_class{text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .calculated{border-color:#ae8ca2;border-style:dotted}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta{width:100%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta{margin:.5em 0 0;font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr th,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr th{border:0;padding:0 4px .5em 0;line-height:1.5em;width:20%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td{padding:0 4px .5em 0;border:0;line-height:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td input{width:100%;margin:0;position:relative;border-bottom:0;box-shadow:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td textarea{width:100%;height:4em;margin:0;box-shadow:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td input:focus+textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td input:focus+textarea{border-top-color:#999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td p,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td p{margin:0 0 .5em;line-height:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td p:last-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td p:last-child{margin:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .refund_by{border-bottom:1px dotted #999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.fee .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.fee .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.refund .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.refund .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .shipping_method,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .shipping_method_name{width:100%;margin:0 0 .5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax{white-space:nowrap}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;float:right;font-size:14px;visibility:hidden;margin:3px -18px 0 0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax::before,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax:hover::before,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax:hover::before{color:#a00}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax:hover .delete-order-tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax:hover .delete-order-tax{visibility:visible}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items small.refunded{display:block;color:#a00;white-space:nowrap;margin-top:.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items small.refunded::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";position:relative;top:auto;left:auto;margin:-1px 4px 0 0;vertical-align:middle;line-height:1em}#woocommerce-order-items .wc-order-edit-line-item{padding-left:0}#woocommerce-order-items .wc-order-edit-line-item-actions{width:44px;text-align:right;padding-left:0;vertical-align:middle}#woocommerce-order-items .wc-order-edit-line-item-actions a{color:#ccc;display:inline-block;cursor:pointer;padding:0 0 .5em;margin:0 0 0 12px;vertical-align:middle;text-decoration:none;line-height:16px;width:16px;overflow:hidden}#woocommerce-order-items .wc-order-edit-line-item-actions a::before{margin:0;padding:0;font-size:16px;width:16px;height:16px}#woocommerce-order-items .wc-order-edit-line-item-actions a:hover::before{color:#999}#woocommerce-order-items .wc-order-edit-line-item-actions a:first-child{margin-left:0}#woocommerce-order-items .wc-order-edit-line-item-actions .edit-order-item::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";position:relative}#woocommerce-order-items .wc-order-edit-line-item-actions .delete-order-item::before,#woocommerce-order-items .wc-order-edit-line-item-actions .delete_refund::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";position:relative}#woocommerce-order-items .wc-order-edit-line-item-actions .delete-order-item:hover::before,#woocommerce-order-items .wc-order-edit-line-item-actions .delete_refund:hover::before{color:#a00}#woocommerce-order-items tbody tr .wc-order-edit-line-item-actions{visibility:hidden}#woocommerce-order-items tbody tr:hover .wc-order-edit-line-item-actions{visibility:visible}#woocommerce-order-items .wc-order-totals .wc-order-edit-line-item-actions{width:1.5em;visibility:visible!important}#woocommerce-order-items .wc-order-totals .wc-order-edit-line-item-actions a{padding:0}#woocommerce-order-downloads .buttons{float:left;padding:0;margin:0;vertical-align:top}#woocommerce-order-downloads .buttons .add_item_id,#woocommerce-order-downloads .buttons .select2-container{width:400px!important;margin-right:9px;vertical-align:top;float:left}#woocommerce-order-downloads .buttons button{margin:2px 0 0}#woocommerce-order-downloads h3 small{color:#999}#poststuff #woocommerce-order-actions .inside{margin:0;padding:0}#poststuff #woocommerce-order-actions .inside ul.order_actions li{padding:6px 10px;box-sizing:border-box}#poststuff #woocommerce-order-actions .inside ul.order_actions li:last-child{border-bottom:0}#poststuff #woocommerce-order-notes .inside{margin:0;padding:0}#poststuff #woocommerce-order-notes .inside ul.order_notes li{padding:0 10px}#woocommerce_customers p.search-box{margin:6px 0 4px;float:left}#woocommerce_customers .tablenav{float:right;clear:none}.widefat.customers td{vertical-align:middle;padding:4px 7px}.widefat .column-order_title{width:15%}.widefat .column-order_title time{display:block;color:#999;margin:3px 0}.widefat .column-orders,.widefat .column-paying,.widefat .column-spent{text-align:center;width:8%}.widefat .column-last_order{width:11%}.widefat .column-wc_actions{width:110px}.widefat .column-wc_actions a.button{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;display:inline-block;margin:2px 4px 2px 0;padding:0!important;height:2em!important;width:2em;overflow:hidden;vertical-align:middle}.widefat .column-wc_actions a.button::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;line-height:1.85}.widefat .column-wc_actions a.button img{display:block;width:12px;height:auto}.widefat .column-wc_actions a.edit::after{content:'\f464'}.widefat .column-wc_actions a.link::after{font-family:WooCommerce;content:'\e00d'}.widefat .column-wc_actions a.view::after{content:'\f177'}.widefat .column-wc_actions a.refresh::after{font-family:WooCommerce;content:'\e031'}.widefat .column-wc_actions a.processing::after{font-family:WooCommerce;content:'\e00f'}.widefat .column-wc_actions a.complete::after{content:'\f147'}.widefat small.meta{display:block;color:#999;font-size:inherit;margin:3px 0}.post-type-shop_order .tablenav .one-page .displaying-num{display:none}.post-type-shop_order .wp-list-table{margin-top:1em}.post-type-shop_order .wp-list-table tfoot th,.post-type-shop_order .wp-list-table thead th{padding:.75em 1em}.post-type-shop_order .wp-list-table tfoot th.sortable a,.post-type-shop_order .wp-list-table tfoot th.sorted a,.post-type-shop_order .wp-list-table thead th.sortable a,.post-type-shop_order .wp-list-table thead th.sorted a{padding:0}.post-type-shop_order .wp-list-table tfoot th:first-child,.post-type-shop_order .wp-list-table thead th:first-child{padding-left:2em}.post-type-shop_order .wp-list-table tfoot th:last-child,.post-type-shop_order .wp-list-table thead th:last-child{padding-right:2em}.post-type-shop_order .wp-list-table tbody td,.post-type-shop_order .wp-list-table tbody th{padding:1em;line-height:26px}.post-type-shop_order .wp-list-table tbody td:first-child{padding-left:2em}.post-type-shop_order .wp-list-table tbody td:last-child{padding-right:2em}.post-type-shop_order .wp-list-table tbody tr{border-top:1px solid #f5f5f5}.post-type-shop_order .wp-list-table tbody tr:hover:not(.status-trash):not(.no-link) td{cursor:pointer}.post-type-shop_order .wp-list-table .no-link{cursor:default!important}.post-type-shop_order .wp-list-table td,.post-type-shop_order .wp-list-table th{width:12ch;vertical-align:middle}.post-type-shop_order .wp-list-table td p,.post-type-shop_order .wp-list-table th p{margin:0}.post-type-shop_order .wp-list-table .check-column{width:1px;white-space:nowrap;padding:1em 1em 1em 1em!important;vertical-align:middle}.post-type-shop_order .wp-list-table .check-column input{vertical-align:text-top;margin:1px 0}.post-type-shop_order .wp-list-table .column-order_number{width:20ch}.post-type-shop_order .wp-list-table .column-order_total{width:8ch;text-align:right}.post-type-shop_order .wp-list-table .column-order_total a span{float:right}.post-type-shop_order .wp-list-table .column-order_date,.post-type-shop_order .wp-list-table .column-order_status{width:10ch}.post-type-shop_order .wp-list-table .column-order_status{width:14ch}.post-type-shop_order .wp-list-table .column-billing_address,.post-type-shop_order .wp-list-table .column-shipping_address{width:20ch;line-height:1.5em}.post-type-shop_order .wp-list-table .column-billing_address .description,.post-type-shop_order .wp-list-table .column-shipping_address .description{display:block;color:#999}.post-type-shop_order .wp-list-table .column-wc_actions{text-align:right}.post-type-shop_order .wp-list-table .column-wc_actions a.button{text-indent:9999px;margin:2px 0 2px 4px}.post-type-shop_order .wp-list-table .order-preview{float:right;width:16px;padding:20px 4px 4px 4px;height:0;overflow:hidden;position:relative;border:2px solid transparent;border-radius:4px}.post-type-shop_order .wp-list-table .order-preview::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";line-height:16px;font-size:14px;vertical-align:middle;top:4px}.post-type-shop_order .wp-list-table .order-preview:hover{border:2px solid #00a0d2}.post-type-shop_order .wp-list-table .order-preview.disabled::before{content:'';background:url(../images/wpspin.gif) no-repeat center top}.order-status{display:-webkit-inline-box;display:inline-flex;line-height:2.5em;color:#777;background:#e5e5e5;border-radius:4px;border-bottom:1px solid rgba(0,0,0,.05);margin:-.25em 0;cursor:inherit!important;white-space:nowrap;max-width:100%}.order-status.status-completed{background:#c8d7e1;color:#2e4453}.order-status.status-on-hold{background:#f8dda7;color:#94660c}.order-status.status-failed{background:#eba3a3;color:#761919}.order-status.status-processing{background:#c6e1c6;color:#5b841b}.order-status.status-trash{background:#eba3a3;color:#761919}.order-status>span{margin:0 1em;overflow:hidden;text-overflow:ellipsis}.wc-order-preview .order-status{float:right;margin-right:54px}.wc-order-preview article{padding:0!important}.wc-order-preview .modal-close{border-radius:0}.wc-order-preview .wc-order-preview-table{width:100%;margin:0}.wc-order-preview .wc-order-preview-table td,.wc-order-preview .wc-order-preview-table th{padding:1em 1.5em;text-align:left;border:0;border-bottom:1px solid #eee;margin:0;background:0 0;box-shadow:none;text-align:right;vertical-align:top}.wc-order-preview .wc-order-preview-table td:first-child,.wc-order-preview .wc-order-preview-table th:first-child{text-align:left}.wc-order-preview .wc-order-preview-table th{border-color:#ccc}.wc-order-preview .wc-order-preview-table tr:last-child td{border:0}.wc-order-preview .wc-order-preview-table .wc-order-item-sku{margin-top:.5em}.wc-order-preview .wc-order-preview-table .wc-order-item-meta{margin-top:.5em}.wc-order-preview .wc-order-preview-table .wc-order-item-meta td,.wc-order-preview .wc-order-preview-table .wc-order-item-meta th{padding:0;border:0;text-align:left;vertical-align:top}.wc-order-preview .wc-order-preview-table .wc-order-item-meta td:last-child{padding-left:.5em}.wc-order-preview .wc-order-preview-addresses{overflow:hidden;padding-bottom:1.5em}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note{width:50%;float:left;padding:1.5em 1.5em 0;box-sizing:border-box;word-wrap:break-word}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address h2,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note h2{margin-top:0}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address strong,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note strong{display:block;margin-top:1.5em}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address strong:first-child,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note strong:first-child{margin-top:0}.wc-order-preview footer .wc-action-button-group{display:inline-block;float:left}.wc-order-preview footer .button.button-large{margin-left:10px;padding:0 10px!important;line-height:28px;height:auto;display:inline-block}.wc-order-preview .wc-action-button-group label{display:none}.wc-action-button-group{vertical-align:middle;line-height:26px;text-align:left}.wc-action-button-group label{margin-right:6px;cursor:default;font-weight:700;line-height:28px}.wc-action-button-group .wc-action-button-group__items{display:-webkit-inline-box;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row wrap;align-content:flex-start;-webkit-box-pack:start;justify-content:flex-start}.wc-action-button-group .wc-action-button{margin:0 0 0 -1px!important;border:1px solid #ccc;padding:0 10px!important;border-radius:0!important;float:none;line-height:28px;height:auto;z-index:1;position:relative;overflow:hidden;text-overflow:ellipsis;-webkit-box-flex:1;flex:1 0 auto;box-sizing:border-box;text-align:center;white-space:nowrap}.wc-action-button-group .wc-action-button:focus,.wc-action-button-group .wc-action-button:hover{border:1px solid #999;z-index:2}.wc-action-button-group .wc-action-button:first-child{margin-left:0!important;border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}.wc-action-button-group .wc-action-button:last-child{border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}@media screen and (max-width:782px){.wc-order-preview footer .wc-action-button-group .wc-action-button-group__items{display:-webkit-box;display:flex}.wc-order-preview footer .wc-action-button-group{float:none;display:block;margin-bottom:4px}.wc-order-preview footer .button.button-large{width:100%;float:none;text-align:center;margin:0;display:block}.post-type-shop_order .wp-list-table td.check-column{width:1em}.post-type-shop_order .wp-list-table td.column-order_number{padding-left:0;padding-bottom:.5em}.post-type-shop_order .wp-list-table td.column-order_date,.post-type-shop_order .wp-list-table td.column-order_status{display:inline-block!important;padding:0 1em 1em 1em!important}.post-type-shop_order .wp-list-table td.column-order_date:before,.post-type-shop_order .wp-list-table td.column-order_status:before{display:none!important}.post-type-shop_order .wp-list-table td.column-order_date{padding-left:0!important}.post-type-shop_order .wp-list-table td.column-order_status{float:right}}.column-customer_message .note-on{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto;color:#999}.column-customer_message .note-on::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";line-height:16px}.column-order_notes .note-on{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto;color:#999}.column-order_notes .note-on::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";line-height:16px}.attributes-table td,.attributes-table th{width:15%;vertical-align:top}.attributes-table .attribute-terms{width:32%}.attributes-table .attribute-actions{width:2em}.attributes-table .attribute-actions .configure-terms{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;padding:0!important;height:2em!important;width:2em}.attributes-table .attribute-actions .configure-terms::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";font-family:Dashicons;line-height:1.85}ul.order_notes{padding:2px 0 0}ul.order_notes li .note_content{padding:10px;background:#efefef;position:relative}ul.order_notes li .note_content p{margin:0;padding:0;word-wrap:break-word}ul.order_notes li p.meta{padding:10px;color:#999;margin:0;font-size:11px}ul.order_notes li p.meta .exact-date{border-bottom:1px dotted #999}ul.order_notes li a.delete_note{color:#a00}ul.order_notes li .note_content::after{content:'';display:block;position:absolute;bottom:-10px;left:20px;width:0;height:0;border-width:10px 10px 0 0;border-style:solid;border-color:#efefef transparent}ul.order_notes li.system-note .note_content{background:#d7cad2}ul.order_notes li.system-note .note_content::after{border-color:#d7cad2 transparent}ul.order_notes li.customer-note .note_content{background:#a7cedc}ul.order_notes li.customer-note .note_content::after{border-color:#a7cedc transparent}.add_note{border-top:1px solid #ddd;padding:10px 10px 0}.add_note h4{margin-top:5px!important}.add_note #add_order_note{width:100%;height:50px}table.wp-list-table .column-thumb{width:52px;text-align:center;white-space:nowrap}table.wp-list-table .column-handle{width:17px;display:none}table.wp-list-table tbody td.column-handle{cursor:move;width:17px;text-align:center;vertical-align:text-top}table.wp-list-table tbody td.column-handle::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;height:100%;margin:4px 0 0 0}table.wp-list-table .column-name{width:22%}table.wp-list-table .column-product_cat,table.wp-list-table .column-product_tag{width:11%!important}table.wp-list-table .column-featured,table.wp-list-table .column-product_type{width:48px;text-align:left!important}table.wp-list-table .column-customer_message,table.wp-list-table .column-order_notes{width:48px;text-align:center}table.wp-list-table .column-customer_message img,table.wp-list-table .column-order_notes img{margin:0 auto;padding-top:0!important}table.wp-list-table .manage-column.column-featured img,table.wp-list-table .manage-column.column-product_type img{padding-left:2px}table.wp-list-table .column-price .woocommerce-price-suffix{display:none}table.wp-list-table img{margin:1px 2px}table.wp-list-table .row-actions{color:#999}table.wp-list-table td.column-thumb img{margin:0;width:auto;height:auto;max-width:40px;max-height:40px;vertical-align:middle}table.wp-list-table span.na{color:#999}table.wp-list-table .column-sku{width:10%}table.wp-list-table .column-price{width:10ch}table.wp-list-table .column-is_in_stock{text-align:left!important;width:12ch}table.wp-list-table span.wc-featured,table.wp-list-table span.wc-image{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto}table.wp-list-table span.wc-featured::before,table.wp-list-table span.wc-image::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}table.wp-list-table span.wc-featured::before{content:'\f155'}table.wp-list-table span.wc-featured.not-featured::before{content:'\f154'}table.wp-list-table td.column-featured span.wc-featured{font-size:1.6em;cursor:pointer}table.wp-list-table mark.instock,table.wp-list-table mark.onbackorder,table.wp-list-table mark.outofstock{font-weight:700;background:transparent none;line-height:1}table.wp-list-table mark.instock{color:#7ad03a}table.wp-list-table mark.outofstock{color:#a44}table.wp-list-table mark.onbackorder{color:#eaa600}table.wp-list-table .notes_head,table.wp-list-table .order-notes_head,table.wp-list-table .status_head{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto}table.wp-list-table .notes_head::after,table.wp-list-table .order-notes_head::after,table.wp-list-table .status_head::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}table.wp-list-table .order-notes_head::after{content:'\e028'}table.wp-list-table .notes_head::after{content:'\e026'}table.wp-list-table .status_head::after{content:'\e011'}table.wp-list-table .column-order_items{width:12%}table.wp-list-table .column-order_items table.order_items{width:100%;margin:3px 0 0;padding:0;display:none}table.wp-list-table .column-order_items table.order_items td{border:0;margin:0;padding:0 0 3px}table.wp-list-table .column-order_items table.order_items td.qty{color:#999;padding-right:6px;text-align:left}mark.notice{background:#fff;color:#a00;margin:0 0 0 10px}a.export_rates,a.import_rates{float:right;margin-left:9px;margin-top:-2px;margin-bottom:0}#rates-search{float:right}#rates-search input.wc-tax-rates-search-field{padding:4px 8px;font-size:1.2em}#rates-pagination{float:right;margin-right:.5em}#rates-pagination .tablenav{margin:0}.wc_input_table_wrapper{overflow-x:auto;display:block}table.wc_input_table,table.wc_tax_rates{width:100%}table.wc_input_table td,table.wc_input_table th,table.wc_tax_rates td,table.wc_tax_rates th{display:table-cell!important}table.wc_input_table span.tips,table.wc_tax_rates span.tips{color:#2ea2cc}table.wc_input_table th,table.wc_tax_rates th{white-space:nowrap;padding:10px}table.wc_input_table td,table.wc_tax_rates td{padding:0;border-right:1px solid #dfdfdf;border-bottom:1px solid #dfdfdf;border-top:0;background:#fff;cursor:default}table.wc_input_table td input[type=number],table.wc_input_table td input[type=text],table.wc_tax_rates td input[type=number],table.wc_tax_rates td input[type=text]{width:100%!important;min-width:100px;padding:8px 10px;margin:0;border:0;outline:0;background:transparent none}table.wc_input_table td input[type=number]:focus,table.wc_input_table td input[type=text]:focus,table.wc_tax_rates td input[type=number]:focus,table.wc_tax_rates td input[type=text]:focus{outline:0;box-shadow:none}table.wc_input_table td.apply_to_shipping,table.wc_input_table td.compound,table.wc_tax_rates td.apply_to_shipping,table.wc_tax_rates td.compound{padding:5px 7px;vertical-align:middle}table.wc_input_table td.apply_to_shipping input,table.wc_input_table td.compound input,table.wc_tax_rates td.apply_to_shipping input,table.wc_tax_rates td.compound input{width:auto;padding:0}table.wc_input_table td:last-child,table.wc_tax_rates td:last-child{border-right:0}table.wc_input_table tr.current td,table.wc_tax_rates tr.current td{background-color:#fefbcc}table.wc_input_table .cost,table.wc_input_table .item_cost,table.wc_tax_rates .cost,table.wc_tax_rates .item_cost{text-align:right}table.wc_input_table .cost input,table.wc_input_table .item_cost input,table.wc_tax_rates .cost input,table.wc_tax_rates .item_cost input{text-align:right}table.wc_input_table th.sort,table.wc_tax_rates th.sort{width:17px;padding:0 4px}table.wc_input_table td.sort,table.wc_tax_rates td.sort{padding:0 4px}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort{cursor:move;font-size:15px;background:#f9f9f9;text-align:center;vertical-align:middle}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort::before,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:left;height:100%}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort:hover::before,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort:hover::before{color:#333}table.wc_input_table .button,table.wc_tax_rates .button{float:left;margin-right:5px}table.wc_input_table .export,table.wc_input_table .import,table.wc_tax_rates .export,table.wc_tax_rates .import{float:right;margin-right:0;margin-left:5px}table.wc_input_table span.tips,table.wc_tax_rates span.tips{padding:0 3px}table.wc_input_table .pagination,table.wc_tax_rates .pagination{float:right}table.wc_input_table .pagination .button,table.wc_tax_rates .pagination .button{margin-left:5px;margin-right:0}table.wc_input_table .pagination .current,table.wc_tax_rates .pagination .current{background:#bbb;text-shadow:none}table.wc_input_table tr:last-child td,table.wc_tax_rates tr:last-child td{border-bottom:0}table.wc_emails,table.wc_gateways,table.wc_shipping{position:relative}table.wc_emails td,table.wc_emails th,table.wc_gateways td,table.wc_gateways th,table.wc_shipping td,table.wc_shipping th{display:table-cell!important;padding:1em!important;vertical-align:top;line-height:1.75em}table.wc_emails.wc_emails td,table.wc_gateways.wc_emails td,table.wc_shipping.wc_emails td{vertical-align:middle}table.wc_emails tr:nth-child(odd) td,table.wc_gateways tr:nth-child(odd) td,table.wc_shipping tr:nth-child(odd) td{background:#f9f9f9}table.wc_emails td.name,table.wc_gateways td.name,table.wc_shipping td.name{font-weight:700}table.wc_emails .settings,table.wc_gateways .settings,table.wc_shipping .settings{text-align:right}table.wc_emails .default,table.wc_emails .radio,table.wc_emails .status,table.wc_gateways .default,table.wc_gateways .radio,table.wc_gateways .status,table.wc_shipping .default,table.wc_shipping .radio,table.wc_shipping .status{text-align:center}table.wc_emails .default .tips,table.wc_emails .radio .tips,table.wc_emails .status .tips,table.wc_gateways .default .tips,table.wc_gateways .radio .tips,table.wc_gateways .status .tips,table.wc_shipping .default .tips,table.wc_shipping .radio .tips,table.wc_shipping .status .tips{margin:0 auto}table.wc_emails .default input,table.wc_emails .radio input,table.wc_emails .status input,table.wc_gateways .default input,table.wc_gateways .radio input,table.wc_gateways .status input,table.wc_shipping .default input,table.wc_shipping .radio input,table.wc_shipping .status input{margin:0}table.wc_emails td.sort,table.wc_gateways td.sort,table.wc_shipping td.sort{font-size:15px;text-align:center}table.wc_emails td.sort .wc-item-reorder-nav,table.wc_gateways td.sort .wc-item-reorder-nav,table.wc_shipping td.sort .wc-item-reorder-nav{white-space:nowrap;width:72px}table.wc_emails td.sort .wc-item-reorder-nav:before,table.wc_gateways td.sort .wc-item-reorder-nav:before,table.wc_shipping td.sort .wc-item-reorder-nav:before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:24px;float:left;height:100%;line-height:24px;cursor:move}table.wc_emails td.sort .wc-item-reorder-nav button,table.wc_gateways td.sort .wc-item-reorder-nav button,table.wc_shipping td.sort .wc-item-reorder-nav button{position:relative;overflow:hidden;float:left;display:block;width:24px;height:24px;margin:0;background:0 0;border:none;box-shadow:none;color:#82878c;text-indent:-9999px;cursor:pointer;outline:0}table.wc_emails td.sort .wc-item-reorder-nav button:before,table.wc_gateways td.sort .wc-item-reorder-nav button:before,table.wc_shipping td.sort .wc-item-reorder-nav button:before{display:inline-block;position:absolute;top:0;right:0;width:100%;height:100%;font:normal 20px/23px dashicons;text-align:center;text-indent:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}table.wc_emails td.sort .wc-item-reorder-nav button:focus,table.wc_emails td.sort .wc-item-reorder-nav button:hover,table.wc_gateways td.sort .wc-item-reorder-nav button:focus,table.wc_gateways td.sort .wc-item-reorder-nav button:hover,table.wc_shipping td.sort .wc-item-reorder-nav button:focus,table.wc_shipping td.sort .wc-item-reorder-nav button:hover{color:#191e23}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-down:before,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-down:before,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-down:before{content:"\f347"}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-up:before,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-up:before,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-up:before{content:"\f343"}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-disabled,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-disabled,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-disabled{color:#d5d5d5!important;cursor:default;pointer-events:none}table.wc_emails .wc-payment-gateway-method-name,table.wc_gateways .wc-payment-gateway-method-name,table.wc_shipping .wc-payment-gateway-method-name{font-weight:400}table.wc_emails .wc-email-settings-table-name,table.wc_gateways .wc-email-settings-table-name,table.wc_shipping .wc-email-settings-table-name{font-weight:700}table.wc_emails .wc-email-settings-table-name span,table.wc_gateways .wc-email-settings-table-name span,table.wc_shipping .wc-email-settings-table-name span{font-weight:400;color:#999;margin:0 0 0 4px!important}table.wc_emails .wc-payment-gateway-method-toggle-disabled,table.wc_emails .wc-payment-gateway-method-toggle-enabled,table.wc_gateways .wc-payment-gateway-method-toggle-disabled,table.wc_gateways .wc-payment-gateway-method-toggle-enabled,table.wc_shipping .wc-payment-gateway-method-toggle-disabled,table.wc_shipping .wc-payment-gateway-method-toggle-enabled{padding-top:1px;display:block;outline:0;box-shadow:none}table.wc_emails .wc-email-settings-table-status,table.wc_gateways .wc-email-settings-table-status,table.wc_shipping .wc-email-settings-table-status{text-align:center;width:1em}table.wc_emails .wc-email-settings-table-status .tips,table.wc_gateways .wc-email-settings-table-status .tips,table.wc_shipping .wc-email-settings-table-status .tips{margin:0 auto}.wc-shipping-zone-settings th{padding:24px 24px 24px 0}.wc-shipping-zone-settings td.forminp input,.wc-shipping-zone-settings td.forminp textarea{padding:8px;max-width:100%!important}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select{width:448px;max-width:100%!important}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices{padding:8px 8px 4px;border-color:#ddd;min-height:0;line-height:1}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices input{padding:0}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices li{margin:0 4px 4px 0}.wc-shipping-zone-settings .wc-shipping-zone-postcodes-toggle{margin:.5em 0 0;font-size:.9em;text-decoration:underline;display:block}.wc-shipping-zone-settings .wc-shipping-zone-postcodes-toggle+.wc-shipping-zone-postcodes{display:none}.wc-shipping-zone-settings .wc-shipping-zone-postcodes textarea{margin:10px 0}.wc-shipping-zone-settings .wc-shipping-zone-postcodes .description{font-size:.9em;color:#999}.wc-shipping-zone-settings+p.submit{margin-top:0}table tr table.wc-shipping-zone-methods tr .row-actions,table tr:hover table.wc-shipping-zone-methods tr .row-actions{position:relative}table tr table.wc-shipping-zone-methods tr:hover .row-actions,table tr:hover table.wc-shipping-zone-methods tr:hover .row-actions{position:static}.wc-shipping-zones-heading .page-title-action{display:inline-block}table.wc-shipping-classes td,table.wc-shipping-classes th,table.wc-shipping-zone-methods td,table.wc-shipping-zone-methods th,table.wc-shipping-zones td,table.wc-shipping-zones th{vertical-align:top;line-height:24px;padding:1em!important;font-size:14px;background:#fff;display:table-cell!important}table.wc-shipping-classes td li,table.wc-shipping-classes th li,table.wc-shipping-zone-methods td li,table.wc-shipping-zone-methods th li,table.wc-shipping-zones td li,table.wc-shipping-zones th li{line-height:24px;font-size:14px}table.wc-shipping-classes td .woocommerce-help-tip,table.wc-shipping-classes th .woocommerce-help-tip,table.wc-shipping-zone-methods td .woocommerce-help-tip,table.wc-shipping-zone-methods th .woocommerce-help-tip,table.wc-shipping-zones td .woocommerce-help-tip,table.wc-shipping-zones th .woocommerce-help-tip{margin:0!important}table.wc-shipping-classes thead th,table.wc-shipping-zone-methods thead th,table.wc-shipping-zones thead th{vertical-align:middle}table.wc-shipping-classes thead .wc-shipping-zone-sort,table.wc-shipping-zone-methods thead .wc-shipping-zone-sort,table.wc-shipping-zones thead .wc-shipping-zone-sort{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state,table.wc-shipping-classes td.wc-shipping-zones-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zones-blank-state{background:#f7f1f6!important;overflow:hidden;position:relative;padding:7.5em 7.5%!important;border-bottom:2px solid #eee2ec}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-classes td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state{padding:2em!important}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-classes td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p{margin-bottom:0}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li,table.wc-shipping-classes td.wc-shipping-zone-method-blank-state p,table.wc-shipping-classes td.wc-shipping-zones-blank-state li,table.wc-shipping-classes td.wc-shipping-zones-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state p,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zones-blank-state li,table.wc-shipping-zones td.wc-shipping-zones-blank-state p{color:#a46497;font-size:1.5em;line-height:1.5em;margin:0 0 1em;position:relative;z-index:1;text-shadow:1px 1px 1px #fff}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-classes td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-classes td.wc-shipping-zones-blank-state li.main,table.wc-shipping-classes td.wc-shipping-zones-blank-state p.main,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li.main,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state p.main,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-zones td.wc-shipping-zones-blank-state li.main,table.wc-shipping-zones td.wc-shipping-zones-blank-state p.main{font-size:2em}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li,table.wc-shipping-classes td.wc-shipping-zones-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zones td.wc-shipping-zones-blank-state li{margin-left:1em;list-style:circle inside}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-classes td.wc-shipping-zones-blank-state::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state::before,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-zones td.wc-shipping-zones-blank-state::before{content:'\e01b';font-family:WooCommerce;text-align:center;line-height:1;color:#eee2ec;display:block;width:1em;font-size:40em;top:50%;right:-3.75%;margin-top:-.1875em;position:absolute}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-classes td.wc-shipping-zones-blank-state .button-primary,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state .button-primary,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-zones td.wc-shipping-zones-blank-state .button-primary{background-color:#804877;border-color:#804877;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 0 rgba(0,0,0,.15);margin:0;opacity:1;text-shadow:0 -1px 1px #8a4f7f,1px 0 1px #8a4f7f,0 1px 1px #8a4f7f,-1px 0 1px #8a4f7f;font-size:1.5em;padding:.75em 1em;height:auto;position:relative;z-index:1}table.wc-shipping-classes .wc-shipping-zone-method-rows tr:nth-child(even) td,table.wc-shipping-zone-methods .wc-shipping-zone-method-rows tr:nth-child(even) td,table.wc-shipping-zones .wc-shipping-zone-method-rows tr:nth-child(even) td{background:#f9f9f9}table.wc-shipping-classes .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-classes tr.odd td,table.wc-shipping-zone-methods .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-zone-methods tr.odd td,table.wc-shipping-zones .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-zones tr.odd td{background:#f9f9f9}table.wc-shipping-classes tbody.wc-shipping-zone-rows td,table.wc-shipping-zone-methods tbody.wc-shipping-zone-rows td,table.wc-shipping-zones tbody.wc-shipping-zone-rows td{border-top:2px solid #f9f9f9}table.wc-shipping-classes tbody.wc-shipping-zone-rows tr:first-child td,table.wc-shipping-zone-methods tbody.wc-shipping-zone-rows tr:first-child td,table.wc-shipping-zones tbody.wc-shipping-zone-rows tr:first-child td{border-top:0}table.wc-shipping-classes tr.wc-shipping-zone-worldwide td,table.wc-shipping-zone-methods tr.wc-shipping-zone-worldwide td,table.wc-shipping-zones tr.wc-shipping-zone-worldwide td{background:#f9f9f9;border-top:2px solid #e1e1e1}table.wc-shipping-classes p,table.wc-shipping-classes ul,table.wc-shipping-zone-methods p,table.wc-shipping-zone-methods ul,table.wc-shipping-zones p,table.wc-shipping-zones ul{margin:0}table.wc-shipping-classes td.wc-shipping-zone-method-sort,table.wc-shipping-classes td.wc-shipping-zone-sort,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort,table.wc-shipping-zone-methods td.wc-shipping-zone-sort,table.wc-shipping-zones td.wc-shipping-zone-method-sort,table.wc-shipping-zones td.wc-shipping-zone-sort{cursor:move;font-size:15px;text-align:center}table.wc-shipping-classes td.wc-shipping-zone-method-sort::before,table.wc-shipping-classes td.wc-shipping-zone-sort::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort::before,table.wc-shipping-zone-methods td.wc-shipping-zone-sort::before,table.wc-shipping-zones td.wc-shipping-zone-method-sort::before,table.wc-shipping-zones td.wc-shipping-zone-sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:left;height:100%;line-height:24px}table.wc-shipping-classes td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-classes td.wc-shipping-zone-sort:hover::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-zone-methods td.wc-shipping-zone-sort:hover::before,table.wc-shipping-zones td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-zones td.wc-shipping-zone-sort:hover::before{color:#333}table.wc-shipping-classes td.wc-shipping-zone-worldwide,table.wc-shipping-zone-methods td.wc-shipping-zone-worldwide,table.wc-shipping-zones td.wc-shipping-zone-worldwide{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-worldwide::before,table.wc-shipping-zone-methods td.wc-shipping-zone-worldwide::before,table.wc-shipping-zones td.wc-shipping-zone-worldwide::before{content:'\f319';font-family:dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:left;height:100%;line-height:24px}table.wc-shipping-classes .wc-shipping-zone-methods,table.wc-shipping-classes .wc-shipping-zone-name,table.wc-shipping-zone-methods .wc-shipping-zone-methods,table.wc-shipping-zone-methods .wc-shipping-zone-name,table.wc-shipping-zones .wc-shipping-zone-methods,table.wc-shipping-zones .wc-shipping-zone-name{width:25%}table.wc-shipping-classes .wc-shipping-class-description input,table.wc-shipping-classes .wc-shipping-class-description select,table.wc-shipping-classes .wc-shipping-class-description textarea,table.wc-shipping-classes .wc-shipping-class-name input,table.wc-shipping-classes .wc-shipping-class-name select,table.wc-shipping-classes .wc-shipping-class-name textarea,table.wc-shipping-classes .wc-shipping-class-slug input,table.wc-shipping-classes .wc-shipping-class-slug select,table.wc-shipping-classes .wc-shipping-class-slug textarea,table.wc-shipping-classes .wc-shipping-zone-name input,table.wc-shipping-classes .wc-shipping-zone-name select,table.wc-shipping-classes .wc-shipping-zone-name textarea,table.wc-shipping-classes .wc-shipping-zone-region input,table.wc-shipping-classes .wc-shipping-zone-region select,table.wc-shipping-classes .wc-shipping-zone-region textarea,table.wc-shipping-zone-methods .wc-shipping-class-description input,table.wc-shipping-zone-methods .wc-shipping-class-description select,table.wc-shipping-zone-methods .wc-shipping-class-description textarea,table.wc-shipping-zone-methods .wc-shipping-class-name input,table.wc-shipping-zone-methods .wc-shipping-class-name select,table.wc-shipping-zone-methods .wc-shipping-class-name textarea,table.wc-shipping-zone-methods .wc-shipping-class-slug input,table.wc-shipping-zone-methods .wc-shipping-class-slug select,table.wc-shipping-zone-methods .wc-shipping-class-slug textarea,table.wc-shipping-zone-methods .wc-shipping-zone-name input,table.wc-shipping-zone-methods .wc-shipping-zone-name select,table.wc-shipping-zone-methods .wc-shipping-zone-name textarea,table.wc-shipping-zone-methods .wc-shipping-zone-region input,table.wc-shipping-zone-methods .wc-shipping-zone-region select,table.wc-shipping-zone-methods .wc-shipping-zone-region textarea,table.wc-shipping-zones .wc-shipping-class-description input,table.wc-shipping-zones .wc-shipping-class-description select,table.wc-shipping-zones .wc-shipping-class-description textarea,table.wc-shipping-zones .wc-shipping-class-name input,table.wc-shipping-zones .wc-shipping-class-name select,table.wc-shipping-zones .wc-shipping-class-name textarea,table.wc-shipping-zones .wc-shipping-class-slug input,table.wc-shipping-zones .wc-shipping-class-slug select,table.wc-shipping-zones .wc-shipping-class-slug textarea,table.wc-shipping-zones .wc-shipping-zone-name input,table.wc-shipping-zones .wc-shipping-zone-name select,table.wc-shipping-zones .wc-shipping-zone-name textarea,table.wc-shipping-zones .wc-shipping-zone-region input,table.wc-shipping-zones .wc-shipping-zone-region select,table.wc-shipping-zones .wc-shipping-zone-region textarea{width:100%}table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-zone-delete{color:#a00}table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-zone-delete:hover{color:red}table.wc-shipping-classes .wc-shipping-class-count,table.wc-shipping-zone-methods .wc-shipping-class-count,table.wc-shipping-zones .wc-shipping-class-count{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-methods,table.wc-shipping-zone-methods td.wc-shipping-zone-methods,table.wc-shipping-zones td.wc-shipping-zone-methods{color:#555}table.wc-shipping-classes td.wc-shipping-zone-methods .method_disabled,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .method_disabled,table.wc-shipping-zones td.wc-shipping-zone-methods .method_disabled{text-decoration:line-through}table.wc-shipping-classes td.wc-shipping-zone-methods ul,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul,table.wc-shipping-zones td.wc-shipping-zone-methods ul{position:relative;padding-right:32px}table.wc-shipping-classes td.wc-shipping-zone-methods ul li,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li,table.wc-shipping-zones td.wc-shipping-zone-methods ul li{color:#555;display:inline;margin:0}table.wc-shipping-classes td.wc-shipping-zone-methods ul li::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li::before,table.wc-shipping-zones td.wc-shipping-zone-methods ul li::before{content:', '}table.wc-shipping-classes td.wc-shipping-zone-methods ul li:first-child::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li:first-child::before,table.wc-shipping-zones td.wc-shipping-zone-methods ul li:first-child::before{content:''}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method{display:block;width:24px;padding:24px 0 0;height:0;overflow:hidden;cursor:pointer}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method::before,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";font-family:Dashicons;content:'\f502';color:#999;vertical-align:middle;line-height:24px;font-size:16px;margin:0}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method.disabled,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method.disabled,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method.disabled{cursor:not-allowed}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method.disabled::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method.disabled::before,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method.disabled::before{color:#ccc}table.wc-shipping-classes .wc-shipping-zone-method-title,table.wc-shipping-zone-methods .wc-shipping-zone-method-title,table.wc-shipping-zones .wc-shipping-zone-method-title{width:25%}table.wc-shipping-classes .wc-shipping-zone-method-title .wc-shipping-zone-method-delete,table.wc-shipping-zone-methods .wc-shipping-zone-method-title .wc-shipping-zone-method-delete,table.wc-shipping-zones .wc-shipping-zone-method-title .wc-shipping-zone-method-delete{color:red}table.wc-shipping-classes .wc-shipping-zone-method-enabled,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled,table.wc-shipping-zones .wc-shipping-zone-method-enabled{text-align:center}table.wc-shipping-classes .wc-shipping-zone-method-enabled a,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled a,table.wc-shipping-zones .wc-shipping-zone-method-enabled a{display:inline-block}table.wc-shipping-classes .wc-shipping-zone-method-enabled .woocommerce-input-toggle,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled .woocommerce-input-toggle,table.wc-shipping-zones .wc-shipping-zone-method-enabled .woocommerce-input-toggle{margin-top:3px}table.wc-shipping-classes .wc-shipping-zone-method-type,table.wc-shipping-zone-methods .wc-shipping-zone-method-type,table.wc-shipping-zones .wc-shipping-zone-method-type{display:block}table.wc-shipping-classes tfoot input,table.wc-shipping-classes tfoot select,table.wc-shipping-zone-methods tfoot input,table.wc-shipping-zone-methods tfoot select,table.wc-shipping-zones tfoot input,table.wc-shipping-zones tfoot select{vertical-align:middle!important}table.wc-shipping-classes tfoot .button-secondary,table.wc-shipping-zone-methods tfoot .button-secondary,table.wc-shipping-zones tfoot .button-secondary{float:right}table.wc-shipping-classes .editing .wc-shipping-zone-edit,table.wc-shipping-classes .editing .wc-shipping-zone-view,table.wc-shipping-zone-methods .editing .wc-shipping-zone-edit,table.wc-shipping-zone-methods .editing .wc-shipping-zone-view,table.wc-shipping-zones .editing .wc-shipping-zone-edit,table.wc-shipping-zones .editing .wc-shipping-zone-view{display:none}.woocommerce-input-toggle{height:16px;width:32px;border:2px solid #935687;background-color:#935687;display:inline-block;text-indent:-9999px;border-radius:10em;position:relative;margin-top:-1px;vertical-align:text-top}.woocommerce-input-toggle:before{content:"";display:block;width:16px;height:16px;background:#fff;position:absolute;top:0;right:0;border-radius:100%}.woocommerce-input-toggle.woocommerce-input-toggle--disabled{border-color:#999;background-color:#999}.woocommerce-input-toggle.woocommerce-input-toggle--disabled:before{right:auto;left:0}.woocommerce-input-toggle.woocommerce-input-toggle--loading{opacity:.5}.wc-modal-shipping-method-settings{background:#f8f8f8;padding:1em!important}.wc-modal-shipping-method-settings form .form-table{width:100%;background:#fff;margin:0 0 1.5em}.wc-modal-shipping-method-settings form .form-table tr th{width:30%;position:relative}.wc-modal-shipping-method-settings form .form-table tr th .woocommerce-help-tip{float:right;margin:-8px -.5em 0 0;vertical-align:middle;right:0;top:50%;position:absolute}.wc-modal-shipping-method-settings form .form-table tr td input,.wc-modal-shipping-method-settings form .form-table tr td select,.wc-modal-shipping-method-settings form .form-table tr td textarea{width:50%;min-width:250px}.wc-modal-shipping-method-settings form .form-table tr td input[type=checkbox]{width:auto;min-width:16px}.wc-modal-shipping-method-settings form .form-table tr td,.wc-modal-shipping-method-settings form .form-table tr th{vertical-align:middle;margin:0;line-height:24px;padding:1em;border-bottom:1px solid #f8f8f8}.wc-modal-shipping-method-settings form .form-table:last-of-type{margin-bottom:0}.wc-backbone-modal .wc-shipping-zone-method-selector p{margin-top:0}.wc-backbone-modal .wc-shipping-zone-method-selector .wc-shipping-zone-method-description{margin:.75em 1px 0;line-height:1.5em;color:#999;font-style:italic}.wc-backbone-modal .wc-shipping-zone-method-selector select{width:100%;cursor:pointer}img.help_tip{margin:0 0 0 9px;vertical-align:middle}.postbox img.help_tip{margin-top:0}.postbox .woocommerce-help-tip{margin:0 0 0 9px}.status-disabled,.status-enabled,.status-manual{font-size:1.4em;display:block;text-indent:-9999px;position:relative;height:1em;width:1em}.status-manual::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#999}.status-enabled::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#a46497}.status-disabled::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}.woocommerce h2.woo-nav-tab-wrapper{margin-bottom:1em}.woocommerce nav.woo-nav-tab-wrapper{margin:1.5em 0 1em}.woocommerce .subsubsub{margin:-8px 0 0}.woocommerce .wc-admin-breadcrumb{margin-left:.5em}.woocommerce .wc-admin-breadcrumb a{color:#a46497}.woocommerce #template div{margin:0}.woocommerce #template div p .button{float:right;margin-left:10px;margin-top:-4px}.woocommerce #template div .editor textarea{margin-bottom:8px}.woocommerce textarea[disabled=disabled]{background:#dfdfdf!important}.woocommerce table.form-table{margin:0;position:relative;table-layout:fixed}.woocommerce table.form-table .forminp-radio ul{margin:0}.woocommerce table.form-table .forminp-radio ul li{line-height:1.4em}.woocommerce table.form-table input[type=email],.woocommerce table.form-table input[type=number],.woocommerce table.form-table input[type=text]{height:auto}.woocommerce table.form-table textarea.input-text{height:100%;min-width:150px;display:block}.woocommerce table.form-table input.regular-input,.woocommerce table.form-table input[type=date],.woocommerce table.form-table input[type=datetime-local],.woocommerce table.form-table input[type=datetime],.woocommerce table.form-table input[type=email],.woocommerce table.form-table input[type=number],.woocommerce table.form-table input[type=password],.woocommerce table.form-table input[type=tel],.woocommerce table.form-table input[type=text],.woocommerce table.form-table input[type=time],.woocommerce table.form-table input[type=url],.woocommerce table.form-table input[type=week],.woocommerce table.form-table textarea{width:400px;margin:0;padding:6px;box-sizing:border-box;vertical-align:top}.woocommerce table.form-table input[type=date],.woocommerce table.form-table input[type=datetime-local],.woocommerce table.form-table input[type=tel],.woocommerce table.form-table input[type=time],.woocommerce table.form-table input[type=week]{width:200px}.woocommerce table.form-table select{width:400px;margin:0;box-sizing:border-box;height:32px;line-height:32px;vertical-align:top}.woocommerce table.form-table input[size]{width:auto!important}.woocommerce table.form-table table input.regular-input,.woocommerce table.form-table table input[type=email],.woocommerce table.form-table table input[type=number],.woocommerce table.form-table table input[type=text],.woocommerce table.form-table table select,.woocommerce table.form-table table textarea{width:auto}.woocommerce table.form-table textarea.wide-input{width:100%}.woocommerce table.form-table .woocommerce-help-tip,.woocommerce table.form-table img.help_tip{padding:0;margin:-4px 0 0 5px;vertical-align:middle;cursor:help;line-height:1}.woocommerce table.form-table span.help_tip{cursor:help;color:#2ea2cc}.woocommerce table.form-table th{position:relative;padding-right:24px}.woocommerce table.form-table th label{position:relative;display:block}.woocommerce table.form-table th label .woocommerce-help-tip,.woocommerce table.form-table th label img.help_tip{margin:-8px -24px 0 0;position:absolute;right:0;top:50%}.woocommerce table.form-table th label+.woocommerce-help-tip{margin:0;position:absolute;right:0;top:20px}.woocommerce table.form-table woocommerce-help-tip .select2-container{vertical-align:top;margin-bottom:3px}.woocommerce table.form-table table.widefat th{padding-right:inherit}.woocommerce table.form-table .wp-list-table .woocommerce-help-tip{float:none}.woocommerce table.form-table fieldset{margin-top:4px}.woocommerce table.form-table fieldset .woocommerce-help-tip,.woocommerce table.form-table fieldset img.help_tip{margin:-3px 0 0 5px}.woocommerce table.form-table fieldset p.description{margin-bottom:8px}.woocommerce table.form-table fieldset:first-child{margin-top:0}.woocommerce table.form-table .iris-picker{z-index:100;display:none;position:absolute;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.2)}.woocommerce table.form-table .iris-picker .ui-slider{border:0!important;margin:0!important;width:auto!important;height:auto!important;background:none transparent!important}.woocommerce table.form-table .iris-picker .ui-slider .ui-slider-handle{margin-bottom:0!important}.woocommerce table.form-table .iris-error{background-color:#ffafaf}.woocommerce table.form-table .colorpickpreview{padding:7px 0;line-height:1em;display:inline-block;width:26px;border:1px solid #ddd;font-size:14px}.woocommerce table.form-table .image_width_settings{vertical-align:middle}.woocommerce table.form-table .image_width_settings label{margin-left:10px}.woocommerce table.form-table .image_width_settings input{width:auto}.woocommerce table.form-table .wc_emails_wrapper,.woocommerce table.form-table .wc_payment_gateways_wrapper{padding:0 15px 10px 0}.woocommerce .wc-shipping-zone-settings td.forminp input,.woocommerce .wc-shipping-zone-settings td.forminp textarea{width:448px;padding:6px 11px}.woocommerce .wc-shipping-zone-settings td.forminp .select2-search input{padding:6px}.woocommerce #tabs-wrap table a.remove{margin-left:4px}.woocommerce #tabs-wrap table p{margin:0 0 4px!important;overflow:hidden;zoom:1}.woocommerce #tabs-wrap table p a.add{float:left}#wp-excerpt-editor-container{background:#fff}#product_variation-parent #parent_id{width:100%}#postimagediv img{border:1px solid #d5d5d5;max-width:100%}#woocommerce-product-images .inside{margin:0;padding:0}#woocommerce-product-images .inside .add_product_images{padding:0 12px 12px}#woocommerce-product-images .inside #product_images_container{padding:0 0 0 9px}#woocommerce-product-images .inside #product_images_container ul{margin:0;padding:0}#woocommerce-product-images .inside #product_images_container ul::after,#woocommerce-product-images .inside #product_images_container ul::before{content:' ';display:table}#woocommerce-product-images .inside #product_images_container ul::after{clear:both}#woocommerce-product-images .inside #product_images_container ul li.add,#woocommerce-product-images .inside #product_images_container ul li.image,#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder{width:80px;float:left;cursor:move;border:1px solid #d5d5d5;margin:9px 9px 0 0;background:#f7f7f7;border-radius:2px;position:relative;box-sizing:border-box}#woocommerce-product-images .inside #product_images_container ul li.add img,#woocommerce-product-images .inside #product_images_container ul li.image img,#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder img{width:100%;height:auto;display:block}#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder{border:3px dashed #ddd;position:relative}#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";font-size:2.618em;line-height:72px;color:#ddd}#woocommerce-product-images .inside #product_images_container ul ul.actions{position:absolute;top:-8px;right:-8px;padding:2px;display:none}#woocommerce-product-images .inside #product_images_container ul ul.actions li{float:right;margin:0 0 0 2px}#woocommerce-product-images .inside #product_images_container ul ul.actions li a{width:1em;height:1em;margin:0;height:0;display:block;overflow:hidden}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.tips{cursor:pointer}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.4em}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#999;background:#fff;border-radius:50%;height:1em;width:1em;line-height:1em}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete:hover::before{color:#a00}#woocommerce-product-images .inside #product_images_container ul li:hover ul.actions{display:block}#woocommerce-product-data .hndle{padding:10px}#woocommerce-product-data .hndle span{display:block;vertical-align:middle;line-height:24px}#woocommerce-product-data .hndle span span{display:inline;line-height:inherit;vertical-align:baseline}#woocommerce-product-data .hndle select{margin:0}#woocommerce-product-data .hndle label{padding-right:1em;font-size:12px;vertical-align:baseline}#woocommerce-product-data .hndle label:first-child{margin-right:1em;border-right:1px solid #dfdfdf}#woocommerce-product-data .hndle input,#woocommerce-product-data .hndle select{margin-top:-3px 0 0;vertical-align:middle}#woocommerce-product-data .hndle select{margin-left:.5em}#woocommerce-product-data>.handlediv{margin-top:4px}#woocommerce-product-data .wrap{margin:0}#woocommerce-coupon-description{padding:3px 8px;font-size:1.7em;line-height:1.42em;height:auto;width:100%;outline:0;margin:10px 0;display:block}#woocommerce-coupon-description::-webkit-input-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description::-moz-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description:-ms-input-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description:-moz-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-data .panel-wrap,#woocommerce-product-data .panel-wrap{background:#fff}#woocommerce-coupon-data .wc-metaboxes-wrapper,#woocommerce-coupon-data .woocommerce_options_panel,#woocommerce-product-data .wc-metaboxes-wrapper,#woocommerce-product-data .woocommerce_options_panel{float:left;width:80%}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios,#woocommerce-product-data .woocommerce_options_panel .wc-radios{display:block;float:left;margin:0}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios li,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios li,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios li,#woocommerce-product-data .woocommerce_options_panel .wc-radios li{display:block;padding:0 0 10px}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios li input,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios li input,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios li input,#woocommerce-product-data .woocommerce_options_panel .wc-radios li input{width:auto}#woocommerce-coupon-data .panel-wrap,#woocommerce-product-data .panel-wrap,.woocommerce .panel-wrap{overflow:hidden}#woocommerce-coupon-data ul.wc-tabs,#woocommerce-product-data ul.wc-tabs,.woocommerce ul.wc-tabs{margin:0;width:20%;float:left;line-height:1em;padding:0 0 10px;position:relative;background-color:#fafafa;border-right:1px solid #eee;box-sizing:border-box}#woocommerce-coupon-data ul.wc-tabs::after,#woocommerce-product-data ul.wc-tabs::after,.woocommerce ul.wc-tabs::after{content:'';display:block;width:100%;height:9999em;position:absolute;bottom:-9999em;left:0;background-color:#fafafa;border-right:1px solid #eee}#woocommerce-coupon-data ul.wc-tabs li,#woocommerce-product-data ul.wc-tabs li,.woocommerce ul.wc-tabs li{margin:0;padding:0;display:block;position:relative}#woocommerce-coupon-data ul.wc-tabs li a,#woocommerce-product-data ul.wc-tabs li a,.woocommerce ul.wc-tabs li a{margin:0;padding:10px;display:block;box-shadow:none;text-decoration:none;line-height:20px!important;border-bottom:1px solid #eee}#woocommerce-coupon-data ul.wc-tabs li a span,#woocommerce-product-data ul.wc-tabs li a span,.woocommerce ul.wc-tabs li a span{margin-left:.618em;margin-right:.618em}#woocommerce-coupon-data ul.wc-tabs li a::before,#woocommerce-product-data ul.wc-tabs li a::before,.woocommerce ul.wc-tabs li a::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;content:"";text-decoration:none}#woocommerce-coupon-data ul.wc-tabs li.general_options a::before,#woocommerce-product-data ul.wc-tabs li.general_options a::before,.woocommerce ul.wc-tabs li.general_options a::before{content:'\f107'}#woocommerce-coupon-data ul.wc-tabs li.inventory_options a::before,#woocommerce-product-data ul.wc-tabs li.inventory_options a::before,.woocommerce ul.wc-tabs li.inventory_options a::before{content:'\f481'}#woocommerce-coupon-data ul.wc-tabs li.shipping_options a::before,#woocommerce-product-data ul.wc-tabs li.shipping_options a::before,.woocommerce ul.wc-tabs li.shipping_options a::before{font-family:WooCommerce;content:'\e01a'}#woocommerce-coupon-data ul.wc-tabs li.linked_product_options a::before,#woocommerce-product-data ul.wc-tabs li.linked_product_options a::before,.woocommerce ul.wc-tabs li.linked_product_options a::before{content:'\f103'}#woocommerce-coupon-data ul.wc-tabs li.attribute_options a::before,#woocommerce-product-data ul.wc-tabs li.attribute_options a::before,.woocommerce ul.wc-tabs li.attribute_options a::before{content:'\f175'}#woocommerce-coupon-data ul.wc-tabs li.advanced_options a::before,#woocommerce-product-data ul.wc-tabs li.advanced_options a::before,.woocommerce ul.wc-tabs li.advanced_options a::before{font-family:Dashicons;content:'\f111'}#woocommerce-coupon-data ul.wc-tabs li.variations_options a::before,#woocommerce-product-data ul.wc-tabs li.variations_options a::before,.woocommerce ul.wc-tabs li.variations_options a::before{content:'\f509'}#woocommerce-coupon-data ul.wc-tabs li.usage_restriction_options a::before,#woocommerce-product-data ul.wc-tabs li.usage_restriction_options a::before,.woocommerce ul.wc-tabs li.usage_restriction_options a::before{font-family:WooCommerce;content:'\e602'}#woocommerce-coupon-data ul.wc-tabs li.usage_limit_options a::before,#woocommerce-product-data ul.wc-tabs li.usage_limit_options a::before,.woocommerce ul.wc-tabs li.usage_limit_options a::before{font-family:WooCommerce;content:'\e601'}#woocommerce-coupon-data ul.wc-tabs li.general_coupon_data a::before,#woocommerce-product-data ul.wc-tabs li.general_coupon_data a::before,.woocommerce ul.wc-tabs li.general_coupon_data a::before{font-family:WooCommerce;content:'\e600'}#woocommerce-coupon-data ul.wc-tabs li.active a,#woocommerce-product-data ul.wc-tabs li.active a,.woocommerce ul.wc-tabs li.active a{color:#555;position:relative;background-color:#eee}.woocommerce_page_wc-settings input[type=email],.woocommerce_page_wc-settings input[type=url]{direction:ltr}.woocommerce_page_wc-settings .shippingrows th.check-column{padding-top:20px}.woocommerce_page_wc-settings .shippingrows tfoot th{padding-left:10px}.woocommerce_page_wc-settings .shippingrows .add.button::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none}.woocommerce_page_wc-settings h3.wc-settings-sub-title{font-size:1.2em}#woocommerce-coupon-data .inside,#woocommerce-order-data .inside,#woocommerce-order-downloads .inside,#woocommerce-product-data .inside,#woocommerce-product-type-options .inside{margin:0;padding:0}.panel,.woocommerce_options_panel{padding:9px;color:#555}.panel .form-field .woocommerce-help-tip,.woocommerce_options_panel .form-field .woocommerce-help-tip{font-size:1.4em}.panel,.woocommerce_page_settings .woocommerce_options_panel{padding:0}#woocommerce-product-specs .inside,#woocommerce-product-type-options .panel{margin:0;padding:9px}#woocommerce-product-type-options .panel p,.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p{margin:0 0 9px;font-size:12px;padding:5px 9px;line-height:24px}#woocommerce-product-type-options .panel p::after,.woocommerce_options_panel fieldset.form-field::after,.woocommerce_options_panel p::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce_options_panel .checkbox,.woocommerce_variable_attributes .checkbox{width:auto;margin:4px 0!important;vertical-align:middle;float:left}.woocommerce_options_panel .downloadable_files table,.woocommerce_variations .downloadable_files table{width:100%;padding:0!important}.woocommerce_options_panel .downloadable_files table th,.woocommerce_variations .downloadable_files table th{padding:7px 0 7px 7px!important}.woocommerce_options_panel .downloadable_files table th.sort,.woocommerce_variations .downloadable_files table th.sort{width:17px;padding:7px!important}.woocommerce_options_panel .downloadable_files table th .woocommerce-help-tip,.woocommerce_variations .downloadable_files table th .woocommerce-help-tip{font-size:1.1em;margin-left:0}.woocommerce_options_panel .downloadable_files table td,.woocommerce_variations .downloadable_files table td{vertical-align:middle!important;padding:4px 0 4px 7px!important;position:relative}.woocommerce_options_panel .downloadable_files table td:last-child,.woocommerce_variations .downloadable_files table td:last-child{padding-right:7px!important}.woocommerce_options_panel .downloadable_files table td input.input_text,.woocommerce_variations .downloadable_files table td input.input_text{width:100%;float:none;min-width:0;margin:1px 0}.woocommerce_options_panel .downloadable_files table td .upload_file_button,.woocommerce_variations .downloadable_files table td .upload_file_button{width:auto;float:right;cursor:pointer}.woocommerce_options_panel .downloadable_files table td .delete,.woocommerce_variations .downloadable_files table td .delete{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.2em}.woocommerce_options_panel .downloadable_files table td .delete::before,.woocommerce_variations .downloadable_files table td .delete::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#999}.woocommerce_options_panel .downloadable_files table td .delete:hover::before,.woocommerce_variations .downloadable_files table td .delete:hover::before{color:#a00}.woocommerce_options_panel .downloadable_files table td.sort,.woocommerce_variations .downloadable_files table td.sort{width:17px;cursor:move;font-size:15px;text-align:center;background:#f9f9f9;padding-right:7px!important}.woocommerce_options_panel .downloadable_files table td.sort::before,.woocommerce_variations .downloadable_files table td.sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:left;height:100%}.woocommerce_options_panel .downloadable_files table td.sort:hover::before,.woocommerce_variations .downloadable_files table td.sort:hover::before{color:#333}.woocommerce_variation h3 .sort{width:17px;height:26px;cursor:move;float:right;font-size:15px;font-weight:400;margin-right:.5em;visibility:hidden;text-align:center;vertical-align:middle}.woocommerce_variation h3 .sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:28px;color:#999;display:block;width:17px;float:left;height:100%}.woocommerce_variation h3 .sort:hover::before{color:#777}.woocommerce_variation h3:hover .sort,.woocommerce_variation.ui-sortable-helper .sort{visibility:visible}.woocommerce_options_panel{min-height:175px;box-sizing:border-box}.woocommerce_options_panel .downloadable_files{padding:0 9px 0 162px;position:relative;margin:9px 0}.woocommerce_options_panel .downloadable_files label{position:absolute;left:0;margin:0 0 0 12px;line-height:24px}.woocommerce_options_panel p{margin:9px 0}.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p.form-field{padding:5px 20px 5px 162px!important}.woocommerce_options_panel .sale_price_dates_fields .short:first-of-type{margin-bottom:1em}.woocommerce_options_panel .sale_price_dates_fields .short:nth-of-type(2){clear:left}.woocommerce_options_panel label,.woocommerce_options_panel legend{float:left;width:150px;padding:0;margin:0 0 0 -150px}.woocommerce_options_panel label .req,.woocommerce_options_panel legend .req{font-weight:700;font-style:normal;color:#a00}.woocommerce_options_panel .description{padding:0;margin:0 0 0 7px;clear:none;display:inline}.woocommerce_options_panel .description-block{margin-left:0;display:block}.woocommerce_options_panel input,.woocommerce_options_panel select,.woocommerce_options_panel textarea{margin:0}.woocommerce_options_panel textarea{float:left;height:3.5em;line-height:1.5em;vertical-align:top}.woocommerce_options_panel input[type=email],.woocommerce_options_panel input[type=number],.woocommerce_options_panel input[type=password],.woocommerce_options_panel input[type=text]{width:50%;float:left}.woocommerce_options_panel input.button{width:auto;margin-left:8px}.woocommerce_options_panel select{float:left}.woocommerce_options_panel .short,.woocommerce_options_panel input[type=email].short,.woocommerce_options_panel input[type=number].short,.woocommerce_options_panel input[type=password].short,.woocommerce_options_panel input[type=text].short{width:50%}.woocommerce_options_panel .sized{width:auto!important;margin-right:6px}.woocommerce_options_panel .options_group{border-top:1px solid #fff;border-bottom:1px solid #eee}.woocommerce_options_panel .options_group:first-child{border-top:0}.woocommerce_options_panel .options_group:last-child{border-bottom:0}.woocommerce_options_panel .options_group fieldset{margin:9px 0;font-size:12px;padding:5px 9px;line-height:24px}.woocommerce_options_panel .options_group fieldset label{width:auto;float:none}.woocommerce_options_panel .options_group fieldset ul{float:left;width:50%;margin:0;padding:0}.woocommerce_options_panel .options_group fieldset ul li{margin:0;width:auto}.woocommerce_options_panel .options_group fieldset ul li input{width:auto;float:none;margin-right:4px}.woocommerce_options_panel .options_group fieldset ul.wc-radios label{margin-left:0}.woocommerce_options_panel .dimensions_field .wrap{display:block;width:50%}.woocommerce_options_panel .dimensions_field .wrap input{width:30.75%;margin-right:3.8%}.woocommerce_options_panel .dimensions_field .wrap .last{margin-right:0}.woocommerce_options_panel.padded{padding:1em}.woocommerce_options_panel .select2-container{float:left}#woocommerce-product-data input.dp-applied{float:left}#grouped_product_options,#simple_product_options,#virtual_product_options{padding:12px;font-style:italic;color:#666}.wc-metaboxes-wrapper .toolbar{margin:0!important;border-top:1px solid #fff;border-bottom:1px solid #eee;padding:9px 12px!important}.wc-metaboxes-wrapper .toolbar:first-child{border-top:0}.wc-metaboxes-wrapper .toolbar:last-child{border-bottom:0}.wc-metaboxes-wrapper .toolbar .add_variation{float:right;margin-left:5px}.wc-metaboxes-wrapper .toolbar .cancel-variation-changes,.wc-metaboxes-wrapper .toolbar .save-variation-changes{float:left;margin-right:5px}.wc-metaboxes-wrapper p.toolbar{overflow:hidden;zoom:1}.wc-metaboxes-wrapper .expand-close{margin-right:2px;color:#777;font-size:12px;font-style:italic}.wc-metaboxes-wrapper .expand-close a{background:0 0;padding:0;font-size:12px;text-decoration:none}.wc-metaboxes-wrapper#product_attributes .expand-close{float:right;line-height:28px}.wc-metaboxes-wrapper .fr,.wc-metaboxes-wrapper button.add_variable_attribute{float:right;margin:0 0 0 6px}.wc-metaboxes-wrapper .wc-metaboxes{border-bottom:1px solid #eee}.wc-metaboxes-wrapper .wc-metabox-sortable-placeholder{border-color:#bbb;background-color:#f5f5f5;margin-bottom:9px;border-width:1px;border-style:dashed}.wc-metaboxes-wrapper .wc-metabox{background:#fff;border-bottom:1px solid #eee;margin:0!important}.wc-metaboxes-wrapper .wc-metabox select{font-weight:400}.wc-metaboxes-wrapper .wc-metabox:last-of-type{border-bottom:0}.wc-metaboxes-wrapper .wc-metabox .handlediv{width:27px}.wc-metaboxes-wrapper .wc-metabox .handlediv::before{content:'\f142'!important;cursor:pointer;display:inline-block;font:400 20px/1 Dashicons;line-height:.5!important;padding:8px 10px;position:relative;right:12px;top:0}.wc-metaboxes-wrapper .wc-metabox.closed{border-radius:3px}.wc-metaboxes-wrapper .wc-metabox.closed .handlediv::before{content:'\f140'!important}.wc-metaboxes-wrapper .wc-metabox.closed h3{border:0}.wc-metaboxes-wrapper .wc-metabox h3{margin:0!important;padding:.75em .75em .75em 1em!important;font-size:1em!important;overflow:hidden;zoom:1;cursor:move}.wc-metaboxes-wrapper .wc-metabox h3 a.delete,.wc-metaboxes-wrapper .wc-metabox h3 button{float:right}.wc-metaboxes-wrapper .wc-metabox h3 a.delete{color:red;font-weight:400;line-height:26px;text-decoration:none;position:relative;visibility:hidden}.wc-metaboxes-wrapper .wc-metabox h3 strong{font-weight:400;line-height:26px;font-weight:700}.wc-metaboxes-wrapper .wc-metabox h3 select{font-family:sans-serif;max-width:20%;margin:.25em .25em .25em 0}.wc-metaboxes-wrapper .wc-metabox h3 .handlediv{background-position:6px 5px!important;visibility:hidden;height:26px}.wc-metaboxes-wrapper .wc-metabox h3.fixed{cursor:pointer!important}.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3{cursor:pointer;padding:.5em .75em .5em 1em!important}.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 .handlediv,.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 .sort,.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 a.delete{margin-top:.25em}.wc-metaboxes-wrapper .wc-metabox h3:hover .handlediv,.wc-metaboxes-wrapper .wc-metabox h3:hover a.delete,.wc-metaboxes-wrapper .wc-metabox.ui-sortable-helper .handlediv,.wc-metaboxes-wrapper .wc-metabox.ui-sortable-helper a.delete{visibility:visible}.wc-metaboxes-wrapper .wc-metabox table{width:100%;position:relative;background-color:#fdfdfd;padding:1em;border-top:1px solid #eee}.wc-metaboxes-wrapper .wc-metabox table td{text-align:left;padding:0 6px 1em 0;vertical-align:top;border:0}.wc-metaboxes-wrapper .wc-metabox table td label{text-align:left;display:block;line-height:21px}.wc-metaboxes-wrapper .wc-metabox table td input{float:left;min-width:200px}.wc-metaboxes-wrapper .wc-metabox table td input,.wc-metaboxes-wrapper .wc-metabox table td textarea{width:100%;margin:0;display:block;font-size:14px;padding:4px;color:#555}.wc-metaboxes-wrapper .wc-metabox table td .select2-container,.wc-metaboxes-wrapper .wc-metabox table td select{width:100%!important}.wc-metaboxes-wrapper .wc-metabox table td input.short{width:200px}.wc-metaboxes-wrapper .wc-metabox table td input.checkbox{width:16px;min-width:inherit;vertical-align:text-bottom;display:inline-block;float:none}.wc-metaboxes-wrapper .wc-metabox table td.attribute_name{width:200px}.wc-metaboxes-wrapper .wc-metabox table .minus,.wc-metaboxes-wrapper .wc-metabox table .plus{margin-top:6px}.wc-metaboxes-wrapper .wc-metabox table .fl{float:left}.wc-metaboxes-wrapper .wc-metabox table .fr{float:right}.variations-pagenav{float:right;line-height:24px}.variations-pagenav .displaying-num{color:#777;font-size:12px;font-style:italic}.variations-pagenav a{padding:0 10px 3px;background:rgba(0,0,0,.05);font-size:16px;font-weight:400;text-decoration:none}.variations-pagenav a.disabled,.variations-pagenav a.disabled:active,.variations-pagenav a.disabled:focus,.variations-pagenav a.disabled:hover{color:#a0a5aa;background:rgba(0,0,0,.05)}.variations-defaults{float:left}.variations-defaults select{margin:.25em .25em .25em 0}.woocommerce_variable_attributes{background-color:#fdfdfd;border-top:1px solid #eee}.woocommerce_variable_attributes .data{padding:1em 2em}.woocommerce_variable_attributes .data::after,.woocommerce_variable_attributes .data::before{content:' ';display:table}.woocommerce_variable_attributes .data::after{clear:both}.woocommerce_variable_attributes .upload_image_button{display:block;width:64px;height:64px;float:left;margin-right:20px;position:relative;cursor:pointer}.woocommerce_variable_attributes .upload_image_button img{width:100%;height:auto;display:none}.woocommerce_variable_attributes .upload_image_button::before{content:'\f128';font-family:Dashicons;position:absolute;top:0;left:0;right:0;bottom:0;text-align:center;line-height:64px;font-size:64px;font-weight:400;-webkit-font-smoothing:antialiased}.woocommerce_variable_attributes .upload_image_button.remove img{display:block}.woocommerce_variable_attributes .upload_image_button.remove::before{content:'\f335';display:none}.woocommerce_variable_attributes .upload_image_button.remove:hover::before{display:block}.woocommerce_variable_attributes .options{border:1px solid #eee;border-width:1px 0;padding:.25em 0}.woocommerce_variable_attributes .options label{display:inline-block;padding:4px 1em 2px 0}.woocommerce_variable_attributes .options input[type=checkbox]{margin:0 5px 0 .5em!important;vertical-align:middle}.form-row label{display:inline-block}.form-row .woocommerce-help-tip{float:right}.form-row input[type=number],.form-row input[type=text],.form-row select,.form-row textarea{width:100%;vertical-align:middle;margin:2px 0 0;padding:5px}.form-row select{height:30px;line-height:30px}.form-row.dimensions_field .wrap{clear:left;display:block}.form-row.dimensions_field input{width:33%;float:left;vertical-align:middle}.form-row.dimensions_field input:last-of-type{margin-right:0;width:34%}.form-row.form-row-first,.form-row.form-row-last{width:48%;float:right}.form-row.form-row-first{clear:both;float:left}.form-row.form-row-full{clear:both}.tips{cursor:help;text-decoration:none}img.tips{padding:5px 0 0}#tiptip_holder{display:none;z-index:8675309;position:absolute;top:0;left:0}#tiptip_holder.tip_top{padding-bottom:5px}#tiptip_holder.tip_top #tiptip_arrow_inner{margin-top:-7px;margin-left:-6px;border-top-color:#333}#tiptip_holder.tip_bottom{padding-top:5px}#tiptip_holder.tip_bottom #tiptip_arrow_inner{margin-top:-5px;margin-left:-6px;border-bottom-color:#333}#tiptip_holder.tip_right{padding-left:5px}#tiptip_holder.tip_right #tiptip_arrow_inner{margin-top:-6px;margin-left:-5px;border-right-color:#333}#tiptip_holder.tip_left{padding-right:5px}#tiptip_holder.tip_left #tiptip_arrow_inner{margin-top:-6px;margin-left:-7px;border-left-color:#333}#tiptip_content,.chart-tooltip,.wc_error_tip{color:#fff;font-size:.8em;max-width:150px;background:#333;text-align:center;border-radius:3px;padding:.618em 1em;box-shadow:0 1px 3px rgba(0,0,0,.2)}#tiptip_content code,.chart-tooltip code,.wc_error_tip code{padding:1px;background:#888}#tiptip_arrow,#tiptip_arrow_inner{position:absolute;border-color:transparent;border-style:solid;border-width:6px;height:0;width:0}.wc_error_tip{max-width:20em;line-height:1.8em;position:absolute;white-space:normal;background:#d82223;margin:1.5em 1px 0 -1em;z-index:9999999}.wc_error_tip::after{content:'';display:block;border:8px solid #d82223;border-right-color:transparent;border-left-color:transparent;border-top-color:transparent;position:absolute;top:-3px;left:50%;margin:-1em 0 0 -3px}img.ui-datepicker-trigger{vertical-align:middle;margin-top:-1px;cursor:pointer}.wc-metabox-content img.ui-datepicker-trigger,.woocommerce_options_panel img.ui-datepicker-trigger{float:left;margin-right:8px;margin-top:4px;margin-left:4px}#ui-datepicker-div{display:none}.woocommerce-reports-remove-filter{color:red;text-decoration:none}.woocommerce-reports-wide.woocommerce-reports-wrap,.woocommerce-reports-wrap.woocommerce-reports-wrap{margin-left:300px;padding-top:18px}.woocommerce-reports-wide.halved,.woocommerce-reports-wrap.halved{margin:0;overflow:hidden;zoom:1}.woocommerce-reports-wide .widefat th,.woocommerce-reports-wrap .widefat th{padding:7px}.woocommerce-reports-wide .widefat td,.woocommerce-reports-wrap .widefat td{vertical-align:top;padding:7px}.woocommerce-reports-wide .widefat td .description,.woocommerce-reports-wrap .widefat td .description{margin:4px 0 0}.woocommerce-reports-wide .postbox::after,.woocommerce-reports-wrap .postbox::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce-reports-wide .postbox h3,.woocommerce-reports-wrap .postbox h3{cursor:default!important}.woocommerce-reports-wide .postbox .inside,.woocommerce-reports-wrap .postbox .inside{padding:10px;margin:0!important}.woocommerce-reports-wide .postbox div.stats_range,.woocommerce-reports-wide .postbox h3.stats_range,.woocommerce-reports-wrap .postbox div.stats_range,.woocommerce-reports-wrap .postbox h3.stats_range{border-bottom-color:#dfdfdf;margin:0;padding:0!important}.woocommerce-reports-wide .postbox div.stats_range .export_csv,.woocommerce-reports-wide .postbox h3.stats_range .export_csv,.woocommerce-reports-wrap .postbox div.stats_range .export_csv,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv{float:right;line-height:26px;border-left:1px solid #dfdfdf;padding:10px;display:block;text-decoration:none}.woocommerce-reports-wide .postbox div.stats_range .export_csv::before,.woocommerce-reports-wide .postbox h3.stats_range .export_csv::before,.woocommerce-reports-wrap .postbox div.stats_range .export_csv::before,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;content:"";text-decoration:none;margin-right:4px}.woocommerce-reports-wide .postbox div.stats_range ul,.woocommerce-reports-wide .postbox h3.stats_range ul,.woocommerce-reports-wrap .postbox div.stats_range ul,.woocommerce-reports-wrap .postbox h3.stats_range ul{list-style:none outside;margin:0;padding:0;zoom:1;background:#f5f5f5;border-bottom:1px solid #ccc}.woocommerce-reports-wide .postbox div.stats_range ul::after,.woocommerce-reports-wide .postbox div.stats_range ul::before,.woocommerce-reports-wide .postbox h3.stats_range ul::after,.woocommerce-reports-wide .postbox h3.stats_range ul::before,.woocommerce-reports-wrap .postbox div.stats_range ul::after,.woocommerce-reports-wrap .postbox div.stats_range ul::before,.woocommerce-reports-wrap .postbox h3.stats_range ul::after,.woocommerce-reports-wrap .postbox h3.stats_range ul::before{content:' ';display:table}.woocommerce-reports-wide .postbox div.stats_range ul::after,.woocommerce-reports-wide .postbox h3.stats_range ul::after,.woocommerce-reports-wrap .postbox div.stats_range ul::after,.woocommerce-reports-wrap .postbox h3.stats_range ul::after{clear:both}.woocommerce-reports-wide .postbox div.stats_range ul li,.woocommerce-reports-wide .postbox h3.stats_range ul li,.woocommerce-reports-wrap .postbox div.stats_range ul li,.woocommerce-reports-wrap .postbox h3.stats_range ul li{float:left;margin:0;padding:0;line-height:26px;font-weight:700;font-size:14px}.woocommerce-reports-wide .postbox div.stats_range ul li a,.woocommerce-reports-wide .postbox h3.stats_range ul li a,.woocommerce-reports-wrap .postbox div.stats_range ul li a,.woocommerce-reports-wrap .postbox h3.stats_range ul li a{border-right:1px solid #dfdfdf;padding:10px;display:block;text-decoration:none}.woocommerce-reports-wide .postbox div.stats_range ul li.active,.woocommerce-reports-wide .postbox h3.stats_range ul li.active,.woocommerce-reports-wrap .postbox div.stats_range ul li.active,.woocommerce-reports-wrap .postbox h3.stats_range ul li.active{background:#fff;box-shadow:0 4px 0 0 #fff}.woocommerce-reports-wide .postbox div.stats_range ul li.active a,.woocommerce-reports-wide .postbox h3.stats_range ul li.active a,.woocommerce-reports-wrap .postbox div.stats_range ul li.active a,.woocommerce-reports-wrap .postbox h3.stats_range ul li.active a{color:#777}.woocommerce-reports-wide .postbox div.stats_range ul li.custom,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom{padding:9px 10px;vertical-align:middle}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form{display:inline;margin:0}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form input.range_datepicker{padding:0;margin:0 10px 0 0;background:0 0;border:0;color:#777;text-align:center;box-shadow:none}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form input.range_datepicker.from{margin-right:0}.woocommerce-reports-wide .postbox .chart-with-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar{padding:12px 12px 12px 249px;margin:0!important}.woocommerce-reports-wide .postbox .chart-with-sidebar .chart-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar .chart-sidebar{width:225px;margin-left:-237px;float:left}.woocommerce-reports-wide .postbox .chart-widgets,.woocommerce-reports-wrap .postbox .chart-widgets{margin:0;padding:0}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget{margin:0 0 1em;background:#fafafa;border:1px solid #dfdfdf}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget h4,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget h4{background:#fff;border:1px solid #dfdfdf;border-left-width:0;border-right-width:0;padding:10px;margin:0;color:#2ea2cc;border-top-width:0;background-image:-webkit-linear-gradient(bottom,#ececec,#f9f9f9);background-image:linear-gradient(to top,#ececec,#f9f9f9)}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget h4.section_title:hover,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget h4.section_title:hover{color:#a00}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title{cursor:pointer}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title span,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title span{display:block}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title span::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title span::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none;float:right;font-size:.9em;line-height:1.618}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title.open,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title.open{color:#333}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title.open span::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title.open span::after{display:none}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section{border-bottom:1px solid #dfdfdf}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section .select2-container,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section .select2-container{width:100%!important}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section:last-of-type,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section:last-of-type{border-radius:0 0 3px 3px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table{width:100%}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td{padding:7px 10px;vertical-align:top;border-top:1px solid #e5e5e5;line-height:1.4em}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table tr:first-child td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table tr:first-child td{border-top:0}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.count,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.count{background:#f5f5f5}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.name,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.name{max-width:175px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.name a,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.name a{word-wrap:break-word}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.sparkline,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.sparkline{vertical-align:middle}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table .wc_sparkline,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table .wc_sparkline{width:32px;height:1em;display:block;float:right}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table tr.active td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table tr.active td{background:#f5f5f5}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget form,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget p,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget form,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget p{margin:0;padding:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget form .submit,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget p .submit,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget form .submit,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget p .submit{margin-top:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget #product_ids,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget #product_ids{width:100%}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .select_all,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .select_none,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .select_all,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .select_none{float:right;color:#999;margin-left:4px;margin-top:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .description,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .description{margin-left:.5em;font-weight:400;opacity:.8}.woocommerce-reports-wide .postbox .chart-legend,.woocommerce-reports-wrap .postbox .chart-legend{list-style:none outside;margin:0 0 1em;padding:0;border:1px solid #dfdfdf;border-right-width:0;border-bottom-width:0;background:#fff}.woocommerce-reports-wide .postbox .chart-legend li,.woocommerce-reports-wrap .postbox .chart-legend li{border-right:5px solid #aaa;color:#aaa;padding:1em;display:block;margin:0;-webkit-transition:all ease .5s;transition:all ease .5s;box-shadow:inset 0 -1px 0 0 #dfdfdf}.woocommerce-reports-wide .postbox .chart-legend li strong,.woocommerce-reports-wrap .postbox .chart-legend li strong{font-size:1.618em;line-height:1.2em;color:#464646;font-weight:400;display:block;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif}.woocommerce-reports-wide .postbox .chart-legend li strong del,.woocommerce-reports-wrap .postbox .chart-legend li strong del{color:#e74c3c;font-weight:400}.woocommerce-reports-wide .postbox .chart-legend li:hover,.woocommerce-reports-wrap .postbox .chart-legend li:hover{box-shadow:inset 0 -1px 0 0 #dfdfdf,inset 300px 0 0 rgba(156,93,144,.1);border-right:5px solid #9c5d90!important;padding-left:1.5em;color:#9c5d90}.woocommerce-reports-wide .postbox .pie-chart-legend,.woocommerce-reports-wrap .postbox .pie-chart-legend{margin:12px 0 0;overflow:hidden}.woocommerce-reports-wide .postbox .pie-chart-legend li,.woocommerce-reports-wrap .postbox .pie-chart-legend li{float:left;margin:0;padding:6px 0 0;border-top:4px solid #999;text-align:center;box-sizing:border-box;width:50%}.woocommerce-reports-wide .postbox .stat,.woocommerce-reports-wrap .postbox .stat{font-size:1.5em!important;font-weight:700;text-align:center}.woocommerce-reports-wide .postbox .chart-placeholder,.woocommerce-reports-wrap .postbox .chart-placeholder{width:100%;height:650px;overflow:hidden;position:relative}.woocommerce-reports-wide .postbox .chart-prompt,.woocommerce-reports-wrap .postbox .chart-prompt{line-height:650px;margin:0;color:#999;font-size:1.2em;font-style:italic;text-align:center}.woocommerce-reports-wide .postbox .chart-container,.woocommerce-reports-wrap .postbox .chart-container{background:#fff;padding:12px;position:relative;border:1px solid #dfdfdf;border-radius:3px}.woocommerce-reports-wide .postbox .main .chart-legend,.woocommerce-reports-wrap .postbox .main .chart-legend{margin-top:12px}.woocommerce-reports-wide .postbox .main .chart-legend li,.woocommerce-reports-wrap .postbox .main .chart-legend li{border-right:0;margin:0 8px 0 0;float:left;border-top:4px solid #aaa}.woocommerce-reports-wide .woocommerce-reports-main,.woocommerce-reports-wrap .woocommerce-reports-main{float:left;min-width:100%}.woocommerce-reports-wide .woocommerce-reports-main table td,.woocommerce-reports-wrap .woocommerce-reports-main table td{padding:9px}.woocommerce-reports-wide .woocommerce-reports-sidebar,.woocommerce-reports-wrap .woocommerce-reports-sidebar{display:inline;width:281px;margin-left:-300px;clear:both;float:left}.woocommerce-reports-wide .woocommerce-reports-left,.woocommerce-reports-wrap .woocommerce-reports-left{width:49.5%;float:left}.woocommerce-reports-wide .woocommerce-reports-right,.woocommerce-reports-wrap .woocommerce-reports-right{width:49.5%;float:right}.woocommerce-wide-reports-wrap{padding-bottom:11px}.woocommerce-wide-reports-wrap .widefat .export-data{float:right}.woocommerce-wide-reports-wrap .widefat td,.woocommerce-wide-reports-wrap .widefat th{vertical-align:middle;padding:7px}form.report_filters p{vertical-align:middle}form.report_filters div,form.report_filters input,form.report_filters label{vertical-align:middle}.chart-tooltip{position:absolute;display:none;line-height:1}table.bar_chart{width:100%}table.bar_chart thead th{text-align:left;color:#ccc;padding:6px 0}table.bar_chart tbody th{padding:6px 0;width:25%;text-align:left!important;font-weight:400!important;border-bottom:1px solid #fee}table.bar_chart tbody td{text-align:right;line-height:24px;padding:6px 6px 6px 0;border-bottom:1px solid #fee}table.bar_chart tbody td span{color:#8a4b75;display:block}table.bar_chart tbody td span.alt{color:#47a03e;margin-top:6px}table.bar_chart tbody td.bars{position:relative;text-align:left;padding:6px 6px 6px 0;border-bottom:1px solid #fee}table.bar_chart tbody td.bars a,table.bar_chart tbody td.bars span{text-decoration:none;clear:both;background:#8a4b75;float:left;display:block;line-height:24px;height:24px;border-radius:3px}table.bar_chart tbody td.bars span.alt{clear:both;background:#47a03e}table.bar_chart tbody td.bars span.alt span{margin:0;color:#c5dec2!important;text-shadow:0 1px 0 #47a03e;background:0 0}.post-type-shop_order .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.post-type-shop_coupon .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.post-type-product .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState--api .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState--webhooks .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState{text-align:center;padding:5em 0 0}.woocommerce-BlankState .woocommerce-BlankState-message{color:#aaa;margin:0 auto 1.5em;line-height:1.5em;font-size:1.2em;max-width:500px}.woocommerce-BlankState .woocommerce-BlankState-message::before{color:#ddd;text-shadow:0 -1px 1px rgba(0,0,0,.2),0 1px 0 rgba(255,255,255,.8);font-size:8em;display:block;position:relative!important;top:auto;left:auto;line-height:1em;margin:0 0 .1875em}.woocommerce-BlankState .woocommerce-BlankState-cta{font-size:1.2em;padding:.75em 1.5em;margin:0 .25em;height:auto;display:inline-block!important}@media only screen and (max-width:1280px){#order_data .order_data_column{width:48%}#order_data .order_data_column:first-child{width:100%}.woocommerce_options_panel .description{display:block;clear:both;margin-left:0}.woocommerce_options_panel .dimensions_field .wrap,.woocommerce_options_panel .short,.woocommerce_options_panel input[type=email].short,.woocommerce_options_panel input[type=number].short,.woocommerce_options_panel input[type=password].short,.woocommerce_options_panel input[type=text].short{width:80%}.woocommerce_options_panel .downloadable_files,.woocommerce_variations .downloadable_files{padding:0;clear:both}.woocommerce_options_panel .downloadable_files label,.woocommerce_variations .downloadable_files label{position:static}.woocommerce_options_panel .downloadable_files table,.woocommerce_variations .downloadable_files table{margin:0 12px 24px;width:94%}.woocommerce_options_panel .downloadable_files table .sort,.woocommerce_variations .downloadable_files table .sort{visibility:hidden}.woocommerce_options_panel .woocommerce_variable_attributes .downloadable_files table,.woocommerce_variations .woocommerce_variable_attributes .downloadable_files table{margin:0 0 1em;width:100%}}@media only screen and (max-width:900px){#woocommerce-coupon-data ul.coupon_data_tabs,#woocommerce-product-data .wc-tabs-back,#woocommerce-product-data ul.product_data_tabs{width:10%}#woocommerce-coupon-data .wc-metaboxes-wrapper,#woocommerce-coupon-data .woocommerce_options_panel,#woocommerce-product-data .wc-metaboxes-wrapper,#woocommerce-product-data .woocommerce_options_panel{width:90%}#woocommerce-coupon-data ul.coupon_data_tabs li a,#woocommerce-product-data ul.product_data_tabs li a{position:relative;text-indent:-999px;padding:10px}#woocommerce-coupon-data ul.coupon_data_tabs li a::before,#woocommerce-product-data ul.product_data_tabs li a::before{position:absolute;top:0;right:0;bottom:0;left:0;text-indent:0;text-align:center;line-height:40px;width:100%;height:40px}}@media only screen and (max-width:782px){#wp-excerpt-media-buttons a{font-size:16px;line-height:37px;height:39px;padding:0 20px 0 15px}#wp-excerpt-editor-tools{padding-top:20px;padding-right:15px;overflow:hidden;margin-bottom:-1px}#woocommerce-product-data .checkbox{width:25px}.variations-pagenav{float:none;text-align:center;font-size:18px}.variations-pagenav .displaying-num{font-size:16px}.variations-pagenav a{padding:8px 20px 11px;font-size:18px}.variations-pagenav select{padding:0 20px}.variations-defaults{float:none;text-align:center;margin-top:10px}.post-type-product .wp-list-table .column-thumb{display:none;text-align:left;padding-bottom:0}.post-type-product .wp-list-table .column-thumb::before{display:none!important}.post-type-product .wp-list-table .column-thumb img{max-width:32px}.post-type-product .wp-list-table .is-expanded td:not(.hidden){overflow:visible}.post-type-product .wp-list-table .toggle-row{top:-28px}.post-type-shop_order .wp-list-table .column-customer_message,.post-type-shop_order .wp-list-table .column-order_notes{text-align:inherit}.post-type-shop_order .wp-list-table .column-order_notes .note-on{font-size:1.3em;margin:0}.post-type-shop_order .wp-list-table .is-expanded td:not(.hidden){overflow:visible}.post-type-shop_order .wp-list-table .toggle-row{top:-15px}}@media only screen and (max-width:500px){.woocommerce_options_panel label,.woocommerce_options_panel legend{float:none;width:auto;display:block;margin:0}.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p.form-field{padding:5px 20px!important}.addons-wcs-banner-block{-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}.wc_addons_wrap .addons-wcs-banner-block{padding:40px}.wc_addons_wrap .addons-wcs-banner-block-image{padding:1em;text-align:center;width:100%;padding:2em 0;margin:0}.wc_addons_wrap .addons-wcs-banner-block-image .addons-img{margin:0}}.wc-backbone-modal *{box-sizing:border-box}.wc-backbone-modal .wc-backbone-modal-content{position:fixed;background:#fff;z-index:100000;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);max-width:100%;min-width:500px}.wc-backbone-modal .wc-backbone-modal-content article{overflow:auto}.wc-backbone-modal.wc-backbone-modal-shipping-method-settings .wc-backbone-modal-content{width:75%;min-width:500px}.wc-backbone-modal .select2-container{width:100%!important}@media screen and (max-width:782px){.wc-backbone-modal .wc-backbone-modal-content{width:100%;height:100%;min-width:100%}}.wc-backbone-modal-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;min-height:360px;background:#000;opacity:.7;z-index:99900}.wc-backbone-modal-main{padding-bottom:55px}.wc-backbone-modal-main article,.wc-backbone-modal-main header{display:block;position:relative}.wc-backbone-modal-main .wc-backbone-modal-header{height:auto;background:#fcfcfc;padding:1em 1.5em;border-bottom:1px solid #ddd}.wc-backbone-modal-main .wc-backbone-modal-header h1{margin:0;font-size:18px;font-weight:700;line-height:1.5em}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link{cursor:pointer;color:#777;height:54px;width:54px;padding:0;position:absolute;top:0;right:0;text-align:center;border:0;border-left:1px solid #ddd;background-color:transparent;-webkit-transition:color .1s ease-in-out,background .1s ease-in-out;transition:color .1s ease-in-out,background .1s ease-in-out}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link::before{font:normal 22px/50px dashicons!important;color:#666;display:block;content:'\f335';font-weight:300}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:focus,.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:hover{background:#ddd;border-color:#ccc;color:#000}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:focus{outline:0}.wc-backbone-modal-main article{padding:1.5em}.wc-backbone-modal-main article p{margin:1.5em 0}.wc-backbone-modal-main article p:first-child{margin-top:0}.wc-backbone-modal-main article p:last-child{margin-bottom:0}.wc-backbone-modal-main article .pagination{padding:10px 0 0;text-align:center}.wc-backbone-modal-main article table.widefat{margin:0;width:100%;border:0;box-shadow:none}.wc-backbone-modal-main article table.widefat thead th{padding:0 1em 1em 1em;text-align:left}.wc-backbone-modal-main article table.widefat thead th:first-child{padding-left:0}.wc-backbone-modal-main article table.widefat thead th:last-child{padding-right:0;text-align:right}.wc-backbone-modal-main article table.widefat tbody td,.wc-backbone-modal-main article table.widefat tbody th{padding:1em;text-align:left;vertical-align:middle}.wc-backbone-modal-main article table.widefat tbody td:first-child,.wc-backbone-modal-main article table.widefat tbody th:first-child{padding-left:0}.wc-backbone-modal-main article table.widefat tbody td:last-child,.wc-backbone-modal-main article table.widefat tbody th:last-child{padding-right:0;text-align:right}.wc-backbone-modal-main article table.widefat tbody td .select2-container,.wc-backbone-modal-main article table.widefat tbody td select,.wc-backbone-modal-main article table.widefat tbody th .select2-container,.wc-backbone-modal-main article table.widefat tbody th select{width:100%}.wc-backbone-modal-main footer{position:absolute;left:0;right:0;bottom:0;z-index:100;padding:1em 1.5em;background:#fcfcfc;border-top:1px solid #dfdfdf;box-shadow:0 -4px 4px -4px rgba(0,0,0,.1)}.wc-backbone-modal-main footer .inner{text-align:right;line-height:23px}.wc-backbone-modal-main footer .inner .button{margin-bottom:0}.select2-drop,.select2-dropdown{z-index:999999!important}.select2-results{line-height:1.5em}.select2-results .select2-results__group,.select2-results .select2-results__option{margin:0;padding:8px}.select2-results .description{display:block;color:#999;padding-top:4px}.select2-dropdown{border-color:#ddd}.select2-dropdown--below{box-shadow:0 1px 1px rgba(0,0,0,.1)}.select2-dropdown--above{box-shadow:0 -1px 1px rgba(0,0,0,.1)}.select2-container .select2-selection__rendered.ui-sortable li{cursor:move}.select2-container .select2-selection{border-color:#ddd}.select2-container .select2-search__field{min-width:150px}.select2-container .select2-selection--single{height:32px}.select2-container .select2-selection--single .select2-selection__rendered{line-height:32px;padding-right:24px}.select2-container .select2-selection--single .select2-selection__arrow{right:3px;height:30px}.select2-container .select2-selection--multiple{min-height:28px;border-radius:0;line-height:1.5}.select2-container .select2-selection--multiple li{margin:0}.select2-container .select2-selection--multiple .select2-selection__choice{padding:2px 6px}.select2-container .select2-selection--multiple .select2-selection__choice .description{display:none}.select2-container .select2-selection__clear{color:#999;margin-top:-1px}.select2-container .select2-search--inline .select2-search__field{font-family:inherit;font-size:inherit;font-weight:inherit;padding:3px 0}.woocommerce table.form-table .select2-container{min-width:400px!important}.post-type-product .tablenav .actions,.post-type-shop_order .tablenav .actions{overflow:visible}.post-type-product .tablenav input,.post-type-product .tablenav select,.post-type-shop_order .tablenav input,.post-type-shop_order .tablenav select{line-height:1;height:32px}.post-type-product .tablenav .select2-container,.post-type-shop_order .tablenav .select2-container{float:left;width:240px!important;font-size:14px;vertical-align:middle;margin:1px 6px 4px 1px}.woocommerce-exporter-wrapper,.woocommerce-importer-wrapper,.woocommerce-progress-form-wrapper{text-align:center;max-width:700px;margin:40px auto}.woocommerce-exporter-wrapper .error,.woocommerce-importer-wrapper .error,.woocommerce-progress-form-wrapper .error{text-align:left}.woocommerce-exporter-wrapper .wc-progress-steps,.woocommerce-importer-wrapper .wc-progress-steps,.woocommerce-progress-form-wrapper .wc-progress-steps{padding:0 0 24px;margin:0;list-style:none outside;overflow:hidden;color:#ccc;width:100%;display:-webkit-inline-box;display:inline-flex}.woocommerce-exporter-wrapper .wc-progress-steps li,.woocommerce-importer-wrapper .wc-progress-steps li,.woocommerce-progress-form-wrapper .wc-progress-steps li{width:25%;float:left;padding:0 0 .8em;margin:0;text-align:center;position:relative;border-bottom:4px solid #ccc;line-height:1.4em}.woocommerce-exporter-wrapper .wc-progress-steps li::before,.woocommerce-importer-wrapper .wc-progress-steps li::before,.woocommerce-progress-form-wrapper .wc-progress-steps li::before{content:'';border:4px solid #ccc;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;left:50%;margin-left:-6px;margin-bottom:-8px;background:#fff}.woocommerce-exporter-wrapper .wc-progress-steps li.active,.woocommerce-importer-wrapper .wc-progress-steps li.active,.woocommerce-progress-form-wrapper .wc-progress-steps li.active{border-color:#a16696;color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.active::before,.woocommerce-importer-wrapper .wc-progress-steps li.active::before,.woocommerce-progress-form-wrapper .wc-progress-steps li.active::before{border-color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.done,.woocommerce-importer-wrapper .wc-progress-steps li.done,.woocommerce-progress-form-wrapper .wc-progress-steps li.done{border-color:#a16696;color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.done::before,.woocommerce-importer-wrapper .wc-progress-steps li.done::before,.woocommerce-progress-form-wrapper .wc-progress-steps li.done::before{border-color:#a16696;background:#a16696}.woocommerce-exporter-wrapper .button,.woocommerce-importer-wrapper .button,.woocommerce-progress-form-wrapper .button{font-size:1.25em;padding:.5em 1em!important;line-height:1.5em!important;margin-right:.5em;margin-bottom:2px;height:auto!important;border-radius:4px;background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597;margin:0;opacity:1}.woocommerce-exporter-wrapper .button:active,.woocommerce-exporter-wrapper .button:focus,.woocommerce-exporter-wrapper .button:hover,.woocommerce-importer-wrapper .button:active,.woocommerce-importer-wrapper .button:focus,.woocommerce-importer-wrapper .button:hover,.woocommerce-progress-form-wrapper .button:active,.woocommerce-progress-form-wrapper .button:focus,.woocommerce-progress-form-wrapper .button:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-exporter-wrapper .error .button,.woocommerce-importer-wrapper .error .button,.woocommerce-progress-form-wrapper .error .button{font-size:1em}.woocommerce-exporter-wrapper .wc-actions,.woocommerce-importer-wrapper .wc-actions,.woocommerce-progress-form-wrapper .wc-actions{overflow:hidden;border-top:1px solid #eee;margin:0;padding:23px 24px 24px;line-height:3em}.woocommerce-exporter-wrapper .wc-actions .button,.woocommerce-importer-wrapper .wc-actions .button,.woocommerce-progress-form-wrapper .wc-actions .button{float:right}.woocommerce-exporter-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options,.woocommerce-importer-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options,.woocommerce-progress-form-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options{color:#999}.woocommerce-exporter-wrapper .wc-progress-form-content,.woocommerce-exporter-wrapper .woocommerce-exporter,.woocommerce-exporter-wrapper .woocommerce-importer,.woocommerce-importer-wrapper .wc-progress-form-content,.woocommerce-importer-wrapper .woocommerce-exporter,.woocommerce-importer-wrapper .woocommerce-importer,.woocommerce-progress-form-wrapper .wc-progress-form-content,.woocommerce-progress-form-wrapper .woocommerce-exporter,.woocommerce-progress-form-wrapper .woocommerce-importer{background:#fff;overflow:hidden;padding:0;margin:0 0 16px;box-shadow:0 1px 3px rgba(0,0,0,.13);color:#555;text-align:left}.woocommerce-exporter-wrapper .wc-progress-form-content header,.woocommerce-exporter-wrapper .woocommerce-exporter header,.woocommerce-exporter-wrapper .woocommerce-importer header,.woocommerce-importer-wrapper .wc-progress-form-content header,.woocommerce-importer-wrapper .woocommerce-exporter header,.woocommerce-importer-wrapper .woocommerce-importer header,.woocommerce-progress-form-wrapper .wc-progress-form-content header,.woocommerce-progress-form-wrapper .woocommerce-exporter header,.woocommerce-progress-form-wrapper .woocommerce-importer header{border-bottom:1px solid #eee;margin:0;padding:24px 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content section,.woocommerce-exporter-wrapper .woocommerce-exporter section,.woocommerce-exporter-wrapper .woocommerce-importer section,.woocommerce-importer-wrapper .wc-progress-form-content section,.woocommerce-importer-wrapper .woocommerce-exporter section,.woocommerce-importer-wrapper .woocommerce-importer section,.woocommerce-progress-form-wrapper .wc-progress-form-content section,.woocommerce-progress-form-wrapper .woocommerce-exporter section,.woocommerce-progress-form-wrapper .woocommerce-importer section{padding:24px 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content h2,.woocommerce-exporter-wrapper .woocommerce-exporter h2,.woocommerce-exporter-wrapper .woocommerce-importer h2,.woocommerce-importer-wrapper .wc-progress-form-content h2,.woocommerce-importer-wrapper .woocommerce-exporter h2,.woocommerce-importer-wrapper .woocommerce-importer h2,.woocommerce-progress-form-wrapper .wc-progress-form-content h2,.woocommerce-progress-form-wrapper .woocommerce-exporter h2,.woocommerce-progress-form-wrapper .woocommerce-importer h2{margin:0 0 24px;color:#555;font-size:24px;font-weight:400;line-height:1em}.woocommerce-exporter-wrapper .wc-progress-form-content p,.woocommerce-exporter-wrapper .woocommerce-exporter p,.woocommerce-exporter-wrapper .woocommerce-importer p,.woocommerce-importer-wrapper .wc-progress-form-content p,.woocommerce-importer-wrapper .woocommerce-exporter p,.woocommerce-importer-wrapper .woocommerce-importer p,.woocommerce-progress-form-wrapper .wc-progress-form-content p,.woocommerce-progress-form-wrapper .woocommerce-exporter p,.woocommerce-progress-form-wrapper .woocommerce-importer p{font-size:1em;line-height:1.75em;font-size:16px;color:#555;margin:0 0 24px}.woocommerce-exporter-wrapper .wc-progress-form-content .form-row,.woocommerce-exporter-wrapper .woocommerce-exporter .form-row,.woocommerce-exporter-wrapper .woocommerce-importer .form-row,.woocommerce-importer-wrapper .wc-progress-form-content .form-row,.woocommerce-importer-wrapper .woocommerce-exporter .form-row,.woocommerce-importer-wrapper .woocommerce-importer .form-row,.woocommerce-progress-form-wrapper .wc-progress-form-content .form-row,.woocommerce-progress-form-wrapper .woocommerce-exporter .form-row,.woocommerce-progress-form-wrapper .woocommerce-importer .form-row{margin-top:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter .spinner,.woocommerce-exporter-wrapper .woocommerce-importer .spinner,.woocommerce-importer-wrapper .wc-progress-form-content .spinner,.woocommerce-importer-wrapper .woocommerce-exporter .spinner,.woocommerce-importer-wrapper .woocommerce-importer .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer .spinner{display:none}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th{vertical-align:top;line-height:1.75em;padding:0 0 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th label{color:#555;font-weight:400}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox]{margin:0 4px 0 0;padding:7px}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text]{padding:7px;height:auto;margin:0}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper{border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);background-color:#fff;color:#32373c;outline:0;line-height:1;display:block}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code{background:0 0;font-size:smaller;padding:0;margin:0;color:#999;padding:7px 0 0 7px;display:inline-block}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input{font-family:Consolas,Monaco,monospace;border:0;margin:0;outline:0;box-shadow:none;display:inline-block;min-width:100%}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th{width:35%;padding-right:20px}.woocommerce-exporter-wrapper .wc-progress-form-content progress,.woocommerce-exporter-wrapper .woocommerce-exporter progress,.woocommerce-exporter-wrapper .woocommerce-importer progress,.woocommerce-importer-wrapper .wc-progress-form-content progress,.woocommerce-importer-wrapper .woocommerce-exporter progress,.woocommerce-importer-wrapper .woocommerce-importer progress,.woocommerce-progress-form-wrapper .wc-progress-form-content progress,.woocommerce-progress-form-wrapper .woocommerce-exporter progress,.woocommerce-progress-form-wrapper .woocommerce-importer progress{width:100%;height:42px;margin:0 auto 24px;display:block;-webkit-appearance:none;border:none;display:none;background:#f5f5f5;border:2px solid #eee;border-radius:4px;padding:0;box-shadow:0 1px 0 0 rgba(255,255,255,.2)}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-exporter-wrapper .woocommerce-importer progress::-webkit-progress-bar,.woocommerce-importer-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-importer-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-importer-wrapper .woocommerce-importer progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-webkit-progress-bar{background:transparent none;border:0;border-radius:4px;padding:0;box-shadow:none}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-exporter-wrapper .woocommerce-importer progress::-webkit-progress-value,.woocommerce-importer-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-importer-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-importer-wrapper .woocommerce-importer progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-webkit-progress-value{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:-webkit-linear-gradient(top,#a46497,#66405f),#a46497;background:linear-gradient(top,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-exporter-wrapper .woocommerce-importer progress::-moz-progress-bar,.woocommerce-importer-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-importer-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-importer-wrapper .woocommerce-importer progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-moz-progress-bar{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:linear-gradient(top,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-exporter-wrapper .woocommerce-importer progress::-ms-fill,.woocommerce-importer-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-importer-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-importer-wrapper .woocommerce-importer progress::-ms-fill,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-ms-fill{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:linear-gradient(to bottom,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner{display:block}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing progress{display:block}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options{display:none}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper{padding:0}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table{margin:0;border:0;box-shadow:none;width:100%;table-layout:fixed}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th{border:0;padding:12px;vertical-align:middle;word-wrap:break-word}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th select{width:100%}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th{background:#fbfbfb}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th{font-weight:700}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child{padding-left:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child{padding-right:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name{width:50%}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description{color:#999;margin-top:4px;display:block}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code{background:0 0;padding:0;white-space:pre-line;word-wrap:break-word;word-break:break-all}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-done,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-done,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-done{text-align:center;padding:48px 24px;font-size:1.5em;line-height:1.75em}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-done::before,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-done::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#a16696;position:static;font-size:100px;display:block;float:none;margin:0 0 24px}.wc-pointer .wc-pointer-buttons .close{float:left;margin:6px 0 0 15px}
\ No newline at end of file
diff --git a/assets/css/admin.scss b/assets/css/admin.scss
index 899898c1eed..e72585b7aa9 100644
--- a/assets/css/admin.scss
+++ b/assets/css/admin.scss
@@ -693,10 +693,9 @@
}
.taxonomy-product_cat {
- .column-thumb .woocommerce-help-tip {
+ .check-column .woocommerce-help-tip {
font-size: 1.5em;
- margin: 0 0 0 -34px;
- padding: 0px 2px 5px;
+ margin: -3px 0 0 5px;
display: block;
position: absolute;
}
@@ -3004,7 +3003,6 @@
td.forminp {
input, textarea {
padding: 8px;
- width: 448px;
max-width: 100% !important;
}
.wc-shipping-zone-region-select {
@@ -3688,6 +3686,20 @@
padding: 0 15px 10px 0;
}
}
+
+ .wc-shipping-zone-settings {
+
+ td.forminp {
+ input, textarea {
+ width: 448px;
+ padding: 6px 11px;
+ }
+
+ .select2-search input {
+ padding: 6px;
+ }
+ }
+ }
}
.woocommerce #tabs-wrap table a.remove {
diff --git a/assets/css/helper-rtl.css b/assets/css/helper-rtl.css
index fd001ae5201..c950d73f47d 100644
--- a/assets/css/helper-rtl.css
+++ b/assets/css/helper-rtl.css
@@ -1 +1 @@
-.wc-helper .nav-tab-wrapper{margin-bottom:22px}@media only screen and (max-width:784px){.wc-helper .nav-tab{max-width:40%;overflow:hidden;text-overflow:ellipsis}}.wc-helper .button,.wc-helper .button:active,.wc-helper .button:focus,.wc-helper .button:hover{background-color:#955a89;border-width:0;box-shadow:none;border-radius:3px;color:#fff;height:auto;padding:3px 14px;text-align:center;white-space:normal!important}@media only screen and (max-width:782px){.wc-helper .button,.wc-helper .button:active,.wc-helper .button:focus,.wc-helper .button:hover{line-height:2}}.wc-helper .button.button-secondary,.wc-helper .button:active.button-secondary,.wc-helper .button:focus.button-secondary,.wc-helper .button:hover.button-secondary{background-color:#e6e6e6;color:#3c3c3c;text-shadow:none}.wc-helper .button:hover{opacity:.8}.wc-helper .subscription-filter{color:#2e4453;font-size:13px;line-height:13px;margin:22px 0}.wc-helper .subscription-filter label{display:none;position:relative}.wc-helper .subscription-filter label .chevron{color:#e1e1e1;border-bottom-width:0;line-height:1;padding:0;position:absolute;top:10px;left:14px}.wc-helper .subscription-filter li{color:#0073aa;display:inline-block;padding:0 8px 0 4px;position:relative}.wc-helper .subscription-filter li::before{background-color:#979797;content:" ";position:absolute;top:0;right:0;bottom:0;width:1px}.wc-helper .subscription-filter li:first-of-type::before{display:none}.wc-helper .subscription-filter a{color:#0073aa;text-decoration:none}.wc-helper .subscription-filter a.current{color:#000;font-weight:600}.wc-helper .subscription-filter .count{color:#555d66;font-weight:400}@media only screen and (max-width:600px){.wc-helper .subscription-filter{background-color:#fff;border:1px solid #e1e1e1;border-radius:4px;font-size:14px}.wc-helper .subscription-filter label,.wc-helper .subscription-filter li{line-height:21px;padding:8px 16px;margin:0}.wc-helper .subscription-filter label:last-child,.wc-helper .subscription-filter li:last-child{border-bottom:none}.wc-helper .subscription-filter li{border-bottom:1px solid #e1e1e1}.wc-helper .subscription-filter label,.wc-helper .subscription-filter span.chevron{display:block}.wc-helper .subscription-filter label{text-decoration:none}.wc-helper .subscription-filter li{display:none}.wc-helper .subscription-filter li::before{display:none}.wc-helper .subscription-filter a{cursor:pointer}.wc-helper .subscription-filter span.chevron{color:#555;opacity:.5;-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.wc-helper .subscription-filter:focus,.wc-helper .subscription-filter:hover{box-shadow:0 3px 5px rgba(0,0,0,.2)}.wc-helper .subscription-filter:focus label,.wc-helper .subscription-filter:hover label{border-bottom:1px solid #e1e1e1}.wc-helper .subscription-filter:focus li,.wc-helper .subscription-filter:hover li{display:block}.wc-helper .subscription-filter:focus span.chevron,.wc-helper .subscription-filter:hover span.chevron{-webkit-transform:rotateX(0);transform:rotateX(0)}}.wc-helper .subscriptions-header{margin:3em 0 0;position:relative;z-index:10}.wc-helper .subscriptions-header h2{display:inline-block;line-height:25px;margin:0 0 1.5em 0}.wc-helper .button-update,.wc-helper .button-update:hover{background-color:#e6e6e6;border-radius:4px;color:#333;font-weight:800;font-size:10px;line-height:20px;margin-right:6px;opacity:.75;padding:3px 7px;text-transform:uppercase}.wc-helper .button-update .dashicons,.wc-helper .button-update:hover .dashicons{font-size:12px;height:12px;width:12px;vertical-align:text-bottom}.wc-helper .button-update:hover{opacity:1}.wc-helper .user-info{background-color:#fff;border:1px solid #e1e1e1;border-radius:4px;font-size:12px;line-height:26px;position:absolute;top:-10px;left:0;-webkit-transition:all .1s ease-in;transition:all .1s ease-in}@media only screen and (max-width:600px){.wc-helper .user-info{position:relative;width:100%}}.wc-helper .user-info p{line-height:26px;margin:0}.wc-helper .user-info:hover{box-shadow:0 3px 5px rgba(0,0,0,.2)}.wc-helper .user-info header{color:#555;font-weight:600;padding:6px 14px;position:relative}.wc-helper .user-info header p{padding-left:26px}.wc-helper .user-info header .dashicons{opacity:.5;position:absolute;top:9px;left:14px}.wc-helper .user-info header:hover{cursor:pointer}.wc-helper .user-info section{display:none}.wc-helper .user-info section p{border-top:1px solid #e1e1e1;padding:6px 14px;text-align:center}.wc-helper .user-info section .actions{border-top:1px solid #e1e1e1;display:-webkit-box;display:flex}.wc-helper .user-info section a{color:#a26897;cursor:pointer;font-weight:600;line-height:38px;padding:0 14px;text-align:center;text-decoration:none;white-space:nowrap;width:50%}.wc-helper .user-info section a .dashicons{margin-top:-3px;vertical-align:middle}.wc-helper .user-info section a:first-child{border-left:1px solid #e1e1e1}.wc-helper .user-info section a:hover{background-color:#a26897;color:#fff}.wc-helper .user-info section .avatar{border:1px solid #ece1ea;border-radius:50%;height:auto;margin-left:6px;width:24px;vertical-align:bottom}.wc-helper .user-info:active header .dashicons,.wc-helper .user-info:focus header .dashicons,.wc-helper .user-info:hover header .dashicons{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.wc-helper .user-info:active section,.wc-helper .user-info:focus section,.wc-helper .user-info:hover section{display:block}.wc-helper .alternate,.wc-helper .striped>tbody>:nth-child(odd),.wc-helper ul.striped>:nth-child(odd){background-color:#fff}.wc-helper .comment-ays,.wc-helper .feature-filter,.wc-helper .imgedit-group,.wc-helper .popular-tags,.wc-helper .stuffbox,.wc-helper .widgets-holder-wrap,.wc-helper .wp-editor-container,.wc-helper p.popular-tags,.wc-helper table.widefat{padding-top:5px}.wc-helper .widefat tfoot tr td,.wc-helper .widefat tfoot tr th,.wc-helper .widefat thead tr td,.wc-helper .widefat thead tr th{color:#32373c;padding-bottom:15px;padding-top:10px}.wc-helper .widefat td{padding-bottom:15px;padding-top:15px}.wc-helper .wp-list-table{border:0;box-shadow:none;padding-top:0!important;z-index:1}@media only screen and (max-width:782px){.wc-helper .button{font-size:11px}}.wc-helper .wp-list-table__row{background-color:rgba(0,0,0,0)}.wc-helper .wp-list-table__row td{-webkit-box-align:center;align-items:center;background-color:#fff;border:0;padding:16px 22px;vertical-align:middle}@media only screen and (max-width:782px){.wc-helper .wp-list-table__row td{padding:16px}}.wc-helper .wp-list-table__row td.color-bar{border-right:0}.wc-helper .wp-list-table__row.is-ext-header td{border-top:1px solid #e1e1e1}@media only screen and (max-width:782px){.wc-helper .wp-list-table__row.is-ext-header{display:-webkit-inline-box;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row wrap;width:100%}.wc-helper .wp-list-table__row.is-ext-header .wp-list-table__ext-details{display:block;-webkit-box-flex:2;flex:2}.wc-helper .wp-list-table__row.is-ext-header .wp-list-table__ext-actions{display:block;-webkit-box-flex:1;flex:1;min-width:0}}.wc-helper .wp-list-table__row:last-child td{border-bottom:24px solid #f1f1f1;box-shadow:inset 0 -1px 0 #e1e1e1}.wc-helper .wp-list-table__ext-details,.wc-helper .wp-list-table__ext-status,.wc-helper .wp-list-table__licence-container{padding-left:22px;position:relative;width:100%}.wc-helper .wp-list-table__ext-details::before,.wc-helper .wp-list-table__ext-status::before,.wc-helper .wp-list-table__licence-container::before{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;right:0!important;width:1px!important}.wc-helper .wp-list-table__ext-details{display:-webkit-box;display:flex}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-details{display:table}}.wc-helper .wp-list-table__ext-title{color:#0073aa;font-size:18px;font-weight:600;width:60%}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-title{margin-bottom:12px;width:100%}}@media only screen and (max-width:320px){.wc-helper .wp-list-table__ext-title{max-width:120px}}.wc-helper .wp-list-table__ext-description{color:#333;padding-right:12px;width:40%}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-description{padding-right:0;width:100%}}.wc-helper .wp-list-table__ext-status{position:relative}.wc-helper .wp-list-table__ext-status.update-available::after{background-color:#ffc322;content:" ";position:absolute;top:0;right:0;bottom:0;width:5px}.wc-helper .wp-list-table__ext-status.expired::after{background-color:#b81c23;content:" ";position:absolute;top:0;right:0;bottom:0;width:5px}.wc-helper .wp-list-table__ext-status .dashicons-update{color:#ffc322}.wc-helper .wp-list-table__ext-status .dashicons-info{color:#b81c23}.wc-helper .wp-list-table__ext-status p{color:#333;margin:0}.wc-helper .wp-list-table__ext-status .dashicons{margin-left:5px}.wc-helper .wp-list-table__ext-actions{min-width:150px;position:relative;width:25%;text-align:left}.wc-helper .wp-list-table__ext-actions::after{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;left:0;width:1px}.wc-helper .wp-list-table__ext-licence td,.wc-helper .wp-list-table__ext-updates td{position:relative}.wc-helper .wp-list-table__ext-licence td::before,.wc-helper .wp-list-table__ext-updates td::before{background-color:#e1e1e1;content:" ";height:1px;position:absolute;top:0;right:0;left:0}.wc-helper .wp-list-table__ext-licence td.wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-licence td.wp-list-table__licence-container::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__licence-container::before{right:22px!important;width:auto!important}.wc-helper .wp-list-table__ext-licence td.wp-list-table__ext-actions::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__ext-actions::before{left:22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-licence,.wc-helper .wp-list-table__ext-updates{display:-webkit-box;display:flex}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-status,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-status{-webkit-box-flex:2;flex:2}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-status::before{right:0!important;width:100%!important}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-actions,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-actions{-webkit-box-flex:1;flex:1;min-width:0}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-actions::before,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-actions::before{right:0!important;left:0!important;width:100%!important}}.wc-helper .wp-list-table__licence-container{padding:0!important}.wc-helper .wp-list-table__licence-container::after{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;left:0;width:1px}.wc-helper .wp-list-table__licence-form{display:-webkit-box;display:flex;padding:16px 22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form{display:block}}.wc-helper .wp-list-table__licence-form::before{background-color:#e1e1e1;content:" ";height:1px;position:absolute;top:0;left:22px;right:22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form::before{left:0;right:0}}.wc-helper .wp-list-table__licence-form div{padding-left:16px;vertical-align:middle}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form div{padding:0}}.wc-helper .wp-list-table__licence-form p{margin:0!important}.wc-helper .wp-list-table__licence-label label{color:#23282d;font-weight:600;line-height:30px}.wc-helper .wp-list-table__licence-field input{height:32px}@media only screen and (max-width:480px){.wc-helper .wp-list-table__licence-field input{width:100%}}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-field{padding:8px 0 16px!important}}.wc-helper .wp-list-table__licence-actions{-webkit-box-flex:2;flex-grow:2;padding-left:0!important}.wc-helper .wp-list-table__licence-actions .button{margin-left:8px}.wc-helper .wp-list-table__licence-actions .button-secondary{float:left;margin:0 8px 0 0}@media only screen and (max-width:480px){.wc-helper .wp-list-table__licence-actions{text-align:left}}.wc-helper td.color-bar{border-right:solid 4px transparent}.wc-helper td.color-bar.expired{border-right-color:#b81c23}.wc-helper td.color-bar.expiring{border-right-color:orange}.wc-helper td.color-bar.update-available{border-right-color:#8fae1b}.wc-helper td.color-bar.expiring.update-available{border-right-color:#8fae1b}.wc-helper .connect-wrapper{background-color:#fff;border:1px solid #e5e5e5;margin-bottom:25px;overflow:auto}.wc-helper .connected{display:-webkit-box;display:flex}.wc-helper .connected .user-info{display:-webkit-box;display:flex;padding:20px;width:100%;vertical-align:middle}.wc-helper .connected img{border:1px solid #e5e5e5;height:34px;width:34px}.wc-helper .connected .buttons{padding:20px;white-space:nowrap}.wc-helper .connected p{-webkit-box-flex:2;flex:2;margin:10px 20px 0 0}.wc-helper .connected .chevron{display:none}.wc-helper .connected .chevron:hover{color:#955a89;cursor:pointer}@media only screen and (max-width:784px){.wc-helper .connected{display:block}.wc-helper .connected strong{display:block;overflow:hidden;text-overflow:ellipsis}.wc-helper .connected p{margin:0;overflow:hidden;text-overflow:ellipsis;width:80%}.wc-helper .connected .user-info{padding-left:0;width:auto}.wc-helper .connected .avatar{margin-left:12px}.wc-helper .connected .chevron{color:#e1e1e1;display:block;margin:10px;-webkit-transform:rotateX(0);transform:rotateX(0)}.wc-helper .connected .buttons{display:none;border-top:1px solid #e1e1e1;padding:10px 20px}.wc-helper .connected .buttons.active{display:block}}.wc-helper .start-container{background-color:#fff;border-right:4px solid #cc99c2;padding:45px 30px 20px 20px;position:relative;overflow:hidden}.wc-helper .start-container h2,.wc-helper .start-container p{max-width:800px}.wc-helper .start-container::before{color:#eee2ec;content:"\e01C";display:block;font-family:WooCommerce;font-size:192px;line-height:1;position:absolute;top:65%;left:-3%;text-align:center;width:1em}.wc-helper .start-container h2{font-size:24px;line-height:29px;position:relative}.wc-helper .start-container p{font-size:16px;margin-bottom:30px;position:relative}.wc-helper .button-primary{height:37px;line-height:37px;min-width:124px;padding:0 13px;text-shadow:none}.wc-helper .button-primary:active,.wc-helper .button-primary:focus,.wc-helper .button-primary:hover{padding:0 13px}.form-toggle__wrapper{position:relative}.form-toggle__wrapper label{cursor:default}.form-toggle{cursor:pointer;display:block;position:absolute;top:0;bottom:-1px;right:0;left:0;text-align:right;text-indent:-100000px;z-index:2}.form-toggle:focus{box-shadow:none}.form-toggle.disabled{cursor:default}.form-toggle__switch{align-self:flex-start;background:#c8d7e1;border-radius:12px;box-sizing:border-box;display:inline-block;padding:2px;outline:0;position:relative;width:40px;height:24px;-webkit-transition:all .4s ease,box-shadow 0s;transition:all .4s ease,box-shadow 0s;vertical-align:middle}.form-toggle__switch::after,.form-toggle__switch::before{content:"";display:block;position:relative;width:20px;height:20px}.form-toggle__switch::after{border-radius:50%;background:#fff;right:0;-webkit-transition:all .2s ease;transition:all .2s ease}.form-toggle__switch::before{display:none}.accessible-focus .form-toggle__switch:focus{box-shadow:0 0 0 2px #955a89}.form-toggle__label{vertical-align:bottom;z-index:1}.form-toggle__label .form-toggle__label-content{color:#87a6bc;-webkit-box-flex:0;flex:0 1 100%;font-size:13px;line-height:16px;margin-right:12px;margin-left:8px;vertical-align:top;text-transform:uppercase}@media only screen and (max-width:480px){.form-toggle__label .form-toggle__label-content{display:none}}.accessible-focus .form-toggle:focus+.form-toggle__label .form-toggle__switch{box-shadow:0 0 0 2px #955a89}.accessible-focus .form-toggle:focus:checked+.form-toggle__label .form-toggle__switch{box-shadow:0 0 0 2px #bb77ae}.form-toggle+.form-toggle__label .form-toggle__switch{background:#a8bece}.form-toggle:not(:disabled)+.form-toggle__label:hover .form-toggle__switch{background:#c8d7e1}.form-toggle.active+.form-toggle__label .form-toggle__switch{background:#955a89}.form-toggle.active+.form-toggle__label .form-toggle__switch::after{right:8px}.form-toggle.active+.form-toggle__label:hover .form-toggle__switch{background:#bb77ae}.form-toggle.disabled+label.form-toggle__label span.form-toggle__switch{opacity:.25}.form-toggle.is-toggling+.form-toggle__label .form-toggle__switch{background:#955a89}.form-toggle.is-toggling:checked+.form-toggle__label .form-toggle__switch{background:#c8d7e1}.form-toggle.is-compact+.form-toggle__label .form-toggle__switch{border-radius:8px;width:24px;height:16px}.form-toggle.is-compact+.form-toggle__label .form-toggle__switch::after,.form-toggle.is-compact+.form-toggle__label .form-toggle__switch::before{height:12px;width:12px}.form-toggle.is-compact:checked+.form-toggle__label .form-toggle__switch::after{right:8px}
\ No newline at end of file
+.wc-helper .nav-tab-wrapper{margin-bottom:22px}@media only screen and (max-width:784px){.wc-helper .nav-tab{max-width:40%;overflow:hidden;text-overflow:ellipsis}}.wc-helper .button,.wc-helper .button:active,.wc-helper .button:focus,.wc-helper .button:hover{background-color:#955a89;border-width:0;box-shadow:none;border-radius:3px;color:#fff;height:auto;padding:3px 14px;text-align:center;white-space:normal!important}@media only screen and (max-width:782px){.wc-helper .button,.wc-helper .button:active,.wc-helper .button:focus,.wc-helper .button:hover{line-height:2}}.wc-helper .button.button-secondary,.wc-helper .button:active.button-secondary,.wc-helper .button:focus.button-secondary,.wc-helper .button:hover.button-secondary{background-color:#e6e6e6;color:#3c3c3c;text-shadow:none}.wc-helper .button:hover{opacity:.8}.wc-helper .subscription-filter{color:#2e4453;font-size:13px;line-height:13px;margin:22px 0}.wc-helper .subscription-filter label{display:none;position:relative}.wc-helper .subscription-filter label .chevron{color:#e1e1e1;border-bottom-width:0;line-height:1;padding:0;position:absolute;top:10px;left:14px}.wc-helper .subscription-filter li{color:#0073aa;display:inline-block;padding:0 8px 0 4px;position:relative}.wc-helper .subscription-filter li::before{background-color:#979797;content:" ";position:absolute;top:0;right:0;bottom:0;width:1px}.wc-helper .subscription-filter li:first-of-type::before{display:none}.wc-helper .subscription-filter a{color:#0073aa;text-decoration:none}.wc-helper .subscription-filter a.current{color:#000;font-weight:600}.wc-helper .subscription-filter .count{color:#555d66;font-weight:400}@media only screen and (max-width:600px){.wc-helper .subscription-filter{background-color:#fff;border:1px solid #e1e1e1;border-radius:4px;font-size:14px}.wc-helper .subscription-filter label,.wc-helper .subscription-filter li{line-height:21px;padding:8px 16px;margin:0}.wc-helper .subscription-filter label:last-child,.wc-helper .subscription-filter li:last-child{border-bottom:none}.wc-helper .subscription-filter li{border-bottom:1px solid #e1e1e1}.wc-helper .subscription-filter label,.wc-helper .subscription-filter span.chevron{display:block}.wc-helper .subscription-filter label{text-decoration:none}.wc-helper .subscription-filter li{display:none}.wc-helper .subscription-filter li::before{display:none}.wc-helper .subscription-filter a{cursor:pointer}.wc-helper .subscription-filter span.chevron{color:#555;opacity:.5;-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.wc-helper .subscription-filter:focus,.wc-helper .subscription-filter:hover{box-shadow:0 3px 5px rgba(0,0,0,.2)}.wc-helper .subscription-filter:focus label,.wc-helper .subscription-filter:hover label{border-bottom:1px solid #e1e1e1}.wc-helper .subscription-filter:focus li,.wc-helper .subscription-filter:hover li{display:block}.wc-helper .subscription-filter:focus span.chevron,.wc-helper .subscription-filter:hover span.chevron{-webkit-transform:rotateX(0);transform:rotateX(0)}}.wc-helper .subscriptions-header{margin:3em 0 0;position:relative;z-index:10}.wc-helper .subscriptions-header h2{display:inline-block;line-height:25px;margin:0 0 1.5em 0}.wc-helper .button-update,.wc-helper .button-update:hover{background-color:#e6e6e6;border-radius:4px;color:#333;font-weight:800;font-size:10px;line-height:20px;margin-right:6px;opacity:.75;padding:3px 7px;text-transform:uppercase}.wc-helper .button-update .dashicons,.wc-helper .button-update:hover .dashicons{font-size:12px;height:12px;width:12px;vertical-align:text-bottom}.wc-helper .button-update:hover{opacity:1}.wc-helper .user-info{background-color:#fff;border:1px solid #e1e1e1;border-radius:4px;font-size:12px;line-height:26px;position:absolute;top:-10px;left:0;-webkit-transition:all .1s ease-in;transition:all .1s ease-in}@media only screen and (max-width:600px){.wc-helper .user-info{position:relative;width:100%}}.wc-helper .user-info p{line-height:26px;margin:0}.wc-helper .user-info:hover{box-shadow:0 3px 5px rgba(0,0,0,.2)}.wc-helper .user-info header{color:#555;font-weight:600;padding:6px 14px;position:relative}.wc-helper .user-info header p{padding-left:26px}.wc-helper .user-info header .dashicons{opacity:.5;position:absolute;top:9px;left:14px}.wc-helper .user-info header:hover{cursor:pointer}.wc-helper .user-info section{display:none}.wc-helper .user-info section p{border-top:1px solid #e1e1e1;padding:6px 14px;text-align:center}.wc-helper .user-info section .actions{border-top:1px solid #e1e1e1;display:-webkit-box;display:flex}.wc-helper .user-info section a{color:#a26897;cursor:pointer;font-weight:600;line-height:38px;padding:0 14px;text-align:center;text-decoration:none;white-space:nowrap;width:50%}.wc-helper .user-info section a .dashicons{margin-top:-3px;vertical-align:middle}.wc-helper .user-info section a:first-child{border-left:1px solid #e1e1e1}.wc-helper .user-info section a:hover{background-color:#a26897;color:#fff}.wc-helper .user-info section .avatar{border:1px solid #ece1ea;border-radius:50%;height:auto;margin-left:6px;width:24px;vertical-align:bottom}.wc-helper .user-info:active header .dashicons,.wc-helper .user-info:focus header .dashicons,.wc-helper .user-info:hover header .dashicons{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.wc-helper .user-info:active section,.wc-helper .user-info:focus section,.wc-helper .user-info:hover section{display:block}.wc-helper .alternate,.wc-helper .striped>tbody>:nth-child(odd),.wc-helper ul.striped>:nth-child(odd){background-color:#fff}.wc-helper .comment-ays,.wc-helper .feature-filter,.wc-helper .imgedit-group,.wc-helper .popular-tags,.wc-helper .stuffbox,.wc-helper .widgets-holder-wrap,.wc-helper .wp-editor-container,.wc-helper p.popular-tags,.wc-helper table.widefat{padding-top:5px}.wc-helper .widefat tfoot tr td,.wc-helper .widefat tfoot tr th,.wc-helper .widefat thead tr td,.wc-helper .widefat thead tr th{color:#32373c;padding-bottom:15px;padding-top:10px}.wc-helper .widefat td{padding-bottom:15px;padding-top:15px}.wc-helper .wp-list-table{border:0;box-shadow:none;padding-top:0!important;z-index:1}@media only screen and (max-width:782px){.wc-helper .button{font-size:11px}}.wc-helper .wp-list-table__row{background-color:rgba(0,0,0,0)}.wc-helper .wp-list-table__row td{-webkit-box-align:center;align-items:center;background-color:#fff;border:0;padding:16px 22px;vertical-align:middle}@media only screen and (max-width:782px){.wc-helper .wp-list-table__row td{padding:16px}}.wc-helper .wp-list-table__row td.color-bar{border-right:0}.wc-helper .wp-list-table__row.is-ext-header td{border-top:1px solid #e1e1e1}@media only screen and (max-width:782px){.wc-helper .wp-list-table__row.is-ext-header{display:-webkit-inline-box;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row wrap;width:100%}.wc-helper .wp-list-table__row.is-ext-header .wp-list-table__ext-details{display:block;-webkit-box-flex:2;flex:2}.wc-helper .wp-list-table__row.is-ext-header .wp-list-table__ext-actions{display:block;-webkit-box-flex:1;flex:1;min-width:0}}.wc-helper .wp-list-table__row:last-child td{border-bottom:24px solid #f1f1f1;box-shadow:inset 0 -1px 0 #e1e1e1}.wc-helper .wp-list-table__ext-details,.wc-helper .wp-list-table__ext-status,.wc-helper .wp-list-table__licence-container{padding-left:22px;position:relative;width:100%}.wc-helper .wp-list-table__ext-details::before,.wc-helper .wp-list-table__ext-status::before,.wc-helper .wp-list-table__licence-container::before{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;right:0!important;width:1px!important}.wc-helper .wp-list-table__ext-details{display:-webkit-box;display:flex}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-details{display:table}}.wc-helper .wp-list-table__ext-title{color:#0073aa;font-size:18px;font-weight:600;width:60%}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-title{margin-bottom:12px;width:100%}}@media only screen and (max-width:320px){.wc-helper .wp-list-table__ext-title{max-width:120px}}.wc-helper .wp-list-table__ext-description{color:#333;padding-right:12px;width:40%}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-description{padding-right:0;width:100%}}.wc-helper .wp-list-table__ext-status{position:relative}.wc-helper .wp-list-table__ext-status.update-available::after{background-color:#ffc322;content:" ";position:absolute;top:0;right:0;bottom:0;width:5px}.wc-helper .wp-list-table__ext-status.expired::after{background-color:#b81c23;content:" ";position:absolute;top:0;right:0;bottom:0;width:5px}.wc-helper .wp-list-table__ext-status .dashicons-update{color:#ffc322}.wc-helper .wp-list-table__ext-status .dashicons-info{color:#b81c23}.wc-helper .wp-list-table__ext-status p{color:#333;margin:0}.wc-helper .wp-list-table__ext-status .dashicons{margin-left:5px}.wc-helper .wp-list-table__ext-actions{min-width:150px;position:relative;width:25%;text-align:left}.wc-helper .wp-list-table__ext-actions::after{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;left:0;width:1px}.wc-helper .wp-list-table__ext-licence td,.wc-helper .wp-list-table__ext-updates td{position:relative}.wc-helper .wp-list-table__ext-licence td::before,.wc-helper .wp-list-table__ext-updates td::before{background-color:#e1e1e1;content:" ";height:1px;position:absolute;top:0;right:0;left:0}.wc-helper .wp-list-table__ext-licence td.wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-licence td.wp-list-table__licence-container::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__licence-container::before{right:22px!important;width:auto!important}.wc-helper .wp-list-table__ext-licence td.wp-list-table__ext-actions::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__ext-actions::before{left:22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-licence,.wc-helper .wp-list-table__ext-updates{display:-webkit-box;display:flex}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-status,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-status{-webkit-box-flex:2;flex:2}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-status::before{right:0!important;width:100%!important}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-actions,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-actions{-webkit-box-flex:1;flex:1;min-width:0}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-actions::before,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-actions::before{right:0!important;left:0!important;width:100%!important}}.wc-helper .wp-list-table__licence-container{padding:0!important}.wc-helper .wp-list-table__licence-container::after{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;left:0;width:1px}.wc-helper .wp-list-table__licence-form{display:-webkit-box;display:flex;padding:16px 22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form{display:block}}.wc-helper .wp-list-table__licence-form::before{background-color:#e1e1e1;content:" ";height:1px;position:absolute;top:0;left:22px;right:22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form::before{left:0;right:0}}.wc-helper .wp-list-table__licence-form div{padding-left:16px;vertical-align:middle}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form div{padding:0}}.wc-helper .wp-list-table__licence-form p{margin:0!important}.wc-helper .wp-list-table__licence-label label{color:#23282d;font-weight:600;line-height:30px}.wc-helper .wp-list-table__licence-field input{height:32px}@media only screen and (max-width:480px){.wc-helper .wp-list-table__licence-field input{width:100%}}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-field{padding:8px 0 16px!important}}.wc-helper .wp-list-table__licence-actions{-webkit-box-flex:2;flex-grow:2;padding-left:0!important}.wc-helper .wp-list-table__licence-actions .button{margin-left:8px}.wc-helper .wp-list-table__licence-actions .button-secondary{float:left;margin:0 8px 0 0}@media only screen and (max-width:480px){.wc-helper .wp-list-table__licence-actions{text-align:left}}.wc-helper td.color-bar{border-right:solid 4px transparent}.wc-helper td.color-bar.expired{border-right-color:#b81c23}.wc-helper td.color-bar.expiring{border-right-color:orange}.wc-helper td.color-bar.update-available{border-right-color:#8fae1b}.wc-helper td.color-bar.expiring.update-available{border-right-color:#8fae1b}.wc-helper .connect-wrapper{background-color:#fff;border:1px solid #e5e5e5;margin-bottom:25px;overflow:auto}.wc-helper .connected{display:-webkit-box;display:flex}.wc-helper .connected .user-info{display:-webkit-box;display:flex;padding:20px;width:100%;vertical-align:middle}.wc-helper .connected img{border:1px solid #e5e5e5;height:34px;width:34px}.wc-helper .connected .buttons{padding:20px;white-space:nowrap}.wc-helper .connected p{-webkit-box-flex:2;flex:2;margin:10px 20px 0 0}.wc-helper .connected .chevron{display:none}.wc-helper .connected .chevron:hover{color:#955a89;cursor:pointer}@media only screen and (max-width:784px){.wc-helper .connected{display:block}.wc-helper .connected strong{display:block;overflow:hidden;text-overflow:ellipsis}.wc-helper .connected p{margin:0;overflow:hidden;text-overflow:ellipsis;width:80%}.wc-helper .connected .user-info{padding-left:0;width:auto}.wc-helper .connected .avatar{margin-left:12px}.wc-helper .connected .chevron{color:#e1e1e1;display:block;margin:10px;-webkit-transform:rotateX(0);transform:rotateX(0)}.wc-helper .connected .buttons{display:none;border-top:1px solid #e1e1e1;padding:10px 20px}.wc-helper .connected .buttons.active{display:block}}.wc-helper .start-container{background-color:#fff;border-right:4px solid #cc99c2;padding:45px 30px 20px 20px;position:relative;overflow:hidden}.wc-helper .start-container h2,.wc-helper .start-container p{max-width:800px}.wc-helper .start-container::before{color:#eee2ec;content:"\e01C";display:block;font-family:WooCommerce;font-size:192px;line-height:1;position:absolute;top:65%;left:-3%;text-align:center;width:1em}.wc-helper .start-container h2{font-size:24px;line-height:29px;position:relative}.wc-helper .start-container p{font-size:16px;margin-bottom:30px;position:relative}.wc-helper .button-helper-connect{height:37px;line-height:37px;min-width:124px;padding:0 13px;text-shadow:none}.wc-helper .button-helper-connect:active,.wc-helper .button-helper-connect:focus,.wc-helper .button-helper-connect:hover{padding:0 13px}.form-toggle__wrapper{position:relative}.form-toggle__wrapper label{cursor:default}.form-toggle{cursor:pointer;display:block;position:absolute;top:0;bottom:-1px;right:0;left:0;text-align:right;text-indent:-100000px;z-index:2}.form-toggle:focus{box-shadow:none}.form-toggle.disabled{cursor:default}.form-toggle__switch{align-self:flex-start;background:#c8d7e1;border-radius:12px;box-sizing:border-box;display:inline-block;padding:2px;outline:0;position:relative;width:40px;height:24px;-webkit-transition:all .4s ease,box-shadow 0s;transition:all .4s ease,box-shadow 0s;vertical-align:middle}.form-toggle__switch::after,.form-toggle__switch::before{content:"";display:block;position:relative;width:20px;height:20px}.form-toggle__switch::after{border-radius:50%;background:#fff;right:0;-webkit-transition:all .2s ease;transition:all .2s ease}.form-toggle__switch::before{display:none}.accessible-focus .form-toggle__switch:focus{box-shadow:0 0 0 2px #955a89}.form-toggle__label{vertical-align:bottom;z-index:1}.form-toggle__label .form-toggle__label-content{color:#87a6bc;-webkit-box-flex:0;flex:0 1 100%;font-size:13px;line-height:16px;margin-right:12px;margin-left:8px;vertical-align:top;text-transform:uppercase}@media only screen and (max-width:480px){.form-toggle__label .form-toggle__label-content{display:none}}.accessible-focus .form-toggle:focus+.form-toggle__label .form-toggle__switch{box-shadow:0 0 0 2px #955a89}.accessible-focus .form-toggle:focus:checked+.form-toggle__label .form-toggle__switch{box-shadow:0 0 0 2px #bb77ae}.form-toggle+.form-toggle__label .form-toggle__switch{background:#a8bece}.form-toggle:not(:disabled)+.form-toggle__label:hover .form-toggle__switch{background:#c8d7e1}.form-toggle.active+.form-toggle__label .form-toggle__switch{background:#955a89}.form-toggle.active+.form-toggle__label .form-toggle__switch::after{right:8px}.form-toggle.active+.form-toggle__label:hover .form-toggle__switch{background:#bb77ae}.form-toggle.disabled+label.form-toggle__label span.form-toggle__switch{opacity:.25}.form-toggle.is-toggling+.form-toggle__label .form-toggle__switch{background:#955a89}.form-toggle.is-toggling:checked+.form-toggle__label .form-toggle__switch{background:#c8d7e1}.form-toggle.is-compact+.form-toggle__label .form-toggle__switch{border-radius:8px;width:24px;height:16px}.form-toggle.is-compact+.form-toggle__label .form-toggle__switch::after,.form-toggle.is-compact+.form-toggle__label .form-toggle__switch::before{height:12px;width:12px}.form-toggle.is-compact:checked+.form-toggle__label .form-toggle__switch::after{right:8px}
\ No newline at end of file
diff --git a/assets/css/helper.css b/assets/css/helper.css
index 80bf17140d9..55c5e508ac6 100644
--- a/assets/css/helper.css
+++ b/assets/css/helper.css
@@ -1 +1 @@
-.wc-helper .nav-tab-wrapper{margin-bottom:22px}@media only screen and (max-width:784px){.wc-helper .nav-tab{max-width:40%;overflow:hidden;text-overflow:ellipsis}}.wc-helper .button,.wc-helper .button:active,.wc-helper .button:focus,.wc-helper .button:hover{background-color:#955a89;border-width:0;box-shadow:none;border-radius:3px;color:#fff;height:auto;padding:3px 14px;text-align:center;white-space:normal!important}@media only screen and (max-width:782px){.wc-helper .button,.wc-helper .button:active,.wc-helper .button:focus,.wc-helper .button:hover{line-height:2}}.wc-helper .button.button-secondary,.wc-helper .button:active.button-secondary,.wc-helper .button:focus.button-secondary,.wc-helper .button:hover.button-secondary{background-color:#e6e6e6;color:#3c3c3c;text-shadow:none}.wc-helper .button:hover{opacity:.8}.wc-helper .subscription-filter{color:#2e4453;font-size:13px;line-height:13px;margin:22px 0}.wc-helper .subscription-filter label{display:none;position:relative}.wc-helper .subscription-filter label .chevron{color:#e1e1e1;border-bottom-width:0;line-height:1;padding:0;position:absolute;top:10px;right:14px}.wc-helper .subscription-filter li{color:#0073aa;display:inline-block;padding:0 4px 0 8px;position:relative}.wc-helper .subscription-filter li::before{background-color:#979797;content:" ";position:absolute;top:0;left:0;bottom:0;width:1px}.wc-helper .subscription-filter li:first-of-type::before{display:none}.wc-helper .subscription-filter a{color:#0073aa;text-decoration:none}.wc-helper .subscription-filter a.current{color:#000;font-weight:600}.wc-helper .subscription-filter .count{color:#555d66;font-weight:400}@media only screen and (max-width:600px){.wc-helper .subscription-filter{background-color:#fff;border:1px solid #e1e1e1;border-radius:4px;font-size:14px}.wc-helper .subscription-filter label,.wc-helper .subscription-filter li{line-height:21px;padding:8px 16px;margin:0}.wc-helper .subscription-filter label:last-child,.wc-helper .subscription-filter li:last-child{border-bottom:none}.wc-helper .subscription-filter li{border-bottom:1px solid #e1e1e1}.wc-helper .subscription-filter label,.wc-helper .subscription-filter span.chevron{display:block}.wc-helper .subscription-filter label{text-decoration:none}.wc-helper .subscription-filter li{display:none}.wc-helper .subscription-filter li::before{display:none}.wc-helper .subscription-filter a{cursor:pointer}.wc-helper .subscription-filter span.chevron{color:#555;opacity:.5;-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.wc-helper .subscription-filter:focus,.wc-helper .subscription-filter:hover{box-shadow:0 3px 5px rgba(0,0,0,.2)}.wc-helper .subscription-filter:focus label,.wc-helper .subscription-filter:hover label{border-bottom:1px solid #e1e1e1}.wc-helper .subscription-filter:focus li,.wc-helper .subscription-filter:hover li{display:block}.wc-helper .subscription-filter:focus span.chevron,.wc-helper .subscription-filter:hover span.chevron{-webkit-transform:rotateX(0);transform:rotateX(0)}}.wc-helper .subscriptions-header{margin:3em 0 0;position:relative;z-index:10}.wc-helper .subscriptions-header h2{display:inline-block;line-height:25px;margin:0 0 1.5em 0}.wc-helper .button-update,.wc-helper .button-update:hover{background-color:#e6e6e6;border-radius:4px;color:#333;font-weight:800;font-size:10px;line-height:20px;margin-left:6px;opacity:.75;padding:3px 7px;text-transform:uppercase}.wc-helper .button-update .dashicons,.wc-helper .button-update:hover .dashicons{font-size:12px;height:12px;width:12px;vertical-align:text-bottom}.wc-helper .button-update:hover{opacity:1}.wc-helper .user-info{background-color:#fff;border:1px solid #e1e1e1;border-radius:4px;font-size:12px;line-height:26px;position:absolute;top:-10px;right:0;-webkit-transition:all .1s ease-in;transition:all .1s ease-in}@media only screen and (max-width:600px){.wc-helper .user-info{position:relative;width:100%}}.wc-helper .user-info p{line-height:26px;margin:0}.wc-helper .user-info:hover{box-shadow:0 3px 5px rgba(0,0,0,.2)}.wc-helper .user-info header{color:#555;font-weight:600;padding:6px 14px;position:relative}.wc-helper .user-info header p{padding-right:26px}.wc-helper .user-info header .dashicons{opacity:.5;position:absolute;top:9px;right:14px}.wc-helper .user-info header:hover{cursor:pointer}.wc-helper .user-info section{display:none}.wc-helper .user-info section p{border-top:1px solid #e1e1e1;padding:6px 14px;text-align:center}.wc-helper .user-info section .actions{border-top:1px solid #e1e1e1;display:-webkit-box;display:flex}.wc-helper .user-info section a{color:#a26897;cursor:pointer;font-weight:600;line-height:38px;padding:0 14px;text-align:center;text-decoration:none;white-space:nowrap;width:50%}.wc-helper .user-info section a .dashicons{margin-top:-3px;vertical-align:middle}.wc-helper .user-info section a:first-child{border-right:1px solid #e1e1e1}.wc-helper .user-info section a:hover{background-color:#a26897;color:#fff}.wc-helper .user-info section .avatar{border:1px solid #ece1ea;border-radius:50%;height:auto;margin-right:6px;width:24px;vertical-align:bottom}.wc-helper .user-info:active header .dashicons,.wc-helper .user-info:focus header .dashicons,.wc-helper .user-info:hover header .dashicons{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.wc-helper .user-info:active section,.wc-helper .user-info:focus section,.wc-helper .user-info:hover section{display:block}.wc-helper .alternate,.wc-helper .striped>tbody>:nth-child(odd),.wc-helper ul.striped>:nth-child(odd){background-color:#fff}.wc-helper .comment-ays,.wc-helper .feature-filter,.wc-helper .imgedit-group,.wc-helper .popular-tags,.wc-helper .stuffbox,.wc-helper .widgets-holder-wrap,.wc-helper .wp-editor-container,.wc-helper p.popular-tags,.wc-helper table.widefat{padding-top:5px}.wc-helper .widefat tfoot tr td,.wc-helper .widefat tfoot tr th,.wc-helper .widefat thead tr td,.wc-helper .widefat thead tr th{color:#32373c;padding-bottom:15px;padding-top:10px}.wc-helper .widefat td{padding-bottom:15px;padding-top:15px}.wc-helper .wp-list-table{border:0;box-shadow:none;padding-top:0!important;z-index:1}@media only screen and (max-width:782px){.wc-helper .button{font-size:11px}}.wc-helper .wp-list-table__row{background-color:rgba(0,0,0,0)}.wc-helper .wp-list-table__row td{-webkit-box-align:center;align-items:center;background-color:#fff;border:0;padding:16px 22px;vertical-align:middle}@media only screen and (max-width:782px){.wc-helper .wp-list-table__row td{padding:16px}}.wc-helper .wp-list-table__row td.color-bar{border-left:0}.wc-helper .wp-list-table__row.is-ext-header td{border-top:1px solid #e1e1e1}@media only screen and (max-width:782px){.wc-helper .wp-list-table__row.is-ext-header{display:-webkit-inline-box;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row wrap;width:100%}.wc-helper .wp-list-table__row.is-ext-header .wp-list-table__ext-details{display:block;-webkit-box-flex:2;flex:2}.wc-helper .wp-list-table__row.is-ext-header .wp-list-table__ext-actions{display:block;-webkit-box-flex:1;flex:1;min-width:0}}.wc-helper .wp-list-table__row:last-child td{border-bottom:24px solid #f1f1f1;box-shadow:inset 0 -1px 0 #e1e1e1}.wc-helper .wp-list-table__ext-details,.wc-helper .wp-list-table__ext-status,.wc-helper .wp-list-table__licence-container{padding-right:22px;position:relative;width:100%}.wc-helper .wp-list-table__ext-details::before,.wc-helper .wp-list-table__ext-status::before,.wc-helper .wp-list-table__licence-container::before{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;left:0!important;width:1px!important}.wc-helper .wp-list-table__ext-details{display:-webkit-box;display:flex}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-details{display:table}}.wc-helper .wp-list-table__ext-title{color:#0073aa;font-size:18px;font-weight:600;width:60%}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-title{margin-bottom:12px;width:100%}}@media only screen and (max-width:320px){.wc-helper .wp-list-table__ext-title{max-width:120px}}.wc-helper .wp-list-table__ext-description{color:#333;padding-left:12px;width:40%}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-description{padding-left:0;width:100%}}.wc-helper .wp-list-table__ext-status{position:relative}.wc-helper .wp-list-table__ext-status.update-available::after{background-color:#ffc322;content:" ";position:absolute;top:0;left:0;bottom:0;width:5px}.wc-helper .wp-list-table__ext-status.expired::after{background-color:#b81c23;content:" ";position:absolute;top:0;left:0;bottom:0;width:5px}.wc-helper .wp-list-table__ext-status .dashicons-update{color:#ffc322}.wc-helper .wp-list-table__ext-status .dashicons-info{color:#b81c23}.wc-helper .wp-list-table__ext-status p{color:#333;margin:0}.wc-helper .wp-list-table__ext-status .dashicons{margin-right:5px}.wc-helper .wp-list-table__ext-actions{min-width:150px;position:relative;width:25%;text-align:right}.wc-helper .wp-list-table__ext-actions::after{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;right:0;width:1px}.wc-helper .wp-list-table__ext-licence td,.wc-helper .wp-list-table__ext-updates td{position:relative}.wc-helper .wp-list-table__ext-licence td::before,.wc-helper .wp-list-table__ext-updates td::before{background-color:#e1e1e1;content:" ";height:1px;position:absolute;top:0;left:0;right:0}.wc-helper .wp-list-table__ext-licence td.wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-licence td.wp-list-table__licence-container::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__licence-container::before{left:22px!important;width:auto!important}.wc-helper .wp-list-table__ext-licence td.wp-list-table__ext-actions::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__ext-actions::before{right:22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-licence,.wc-helper .wp-list-table__ext-updates{display:-webkit-box;display:flex}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-status,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-status{-webkit-box-flex:2;flex:2}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-status::before{left:0!important;width:100%!important}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-actions,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-actions{-webkit-box-flex:1;flex:1;min-width:0}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-actions::before,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-actions::before{left:0!important;right:0!important;width:100%!important}}.wc-helper .wp-list-table__licence-container{padding:0!important}.wc-helper .wp-list-table__licence-container::after{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;right:0;width:1px}.wc-helper .wp-list-table__licence-form{display:-webkit-box;display:flex;padding:16px 22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form{display:block}}.wc-helper .wp-list-table__licence-form::before{background-color:#e1e1e1;content:" ";height:1px;position:absolute;top:0;right:22px;left:22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form::before{right:0;left:0}}.wc-helper .wp-list-table__licence-form div{padding-right:16px;vertical-align:middle}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form div{padding:0}}.wc-helper .wp-list-table__licence-form p{margin:0!important}.wc-helper .wp-list-table__licence-label label{color:#23282d;font-weight:600;line-height:30px}.wc-helper .wp-list-table__licence-field input{height:32px}@media only screen and (max-width:480px){.wc-helper .wp-list-table__licence-field input{width:100%}}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-field{padding:8px 0 16px!important}}.wc-helper .wp-list-table__licence-actions{-webkit-box-flex:2;flex-grow:2;padding-right:0!important}.wc-helper .wp-list-table__licence-actions .button{margin-right:8px}.wc-helper .wp-list-table__licence-actions .button-secondary{float:right;margin:0 0 0 8px}@media only screen and (max-width:480px){.wc-helper .wp-list-table__licence-actions{text-align:right}}.wc-helper td.color-bar{border-left:solid 4px transparent}.wc-helper td.color-bar.expired{border-left-color:#b81c23}.wc-helper td.color-bar.expiring{border-left-color:orange}.wc-helper td.color-bar.update-available{border-left-color:#8fae1b}.wc-helper td.color-bar.expiring.update-available{border-left-color:#8fae1b}.wc-helper .connect-wrapper{background-color:#fff;border:1px solid #e5e5e5;margin-bottom:25px;overflow:auto}.wc-helper .connected{display:-webkit-box;display:flex}.wc-helper .connected .user-info{display:-webkit-box;display:flex;padding:20px;width:100%;vertical-align:middle}.wc-helper .connected img{border:1px solid #e5e5e5;height:34px;width:34px}.wc-helper .connected .buttons{padding:20px;white-space:nowrap}.wc-helper .connected p{-webkit-box-flex:2;flex:2;margin:10px 0 0 20px}.wc-helper .connected .chevron{display:none}.wc-helper .connected .chevron:hover{color:#955a89;cursor:pointer}@media only screen and (max-width:784px){.wc-helper .connected{display:block}.wc-helper .connected strong{display:block;overflow:hidden;text-overflow:ellipsis}.wc-helper .connected p{margin:0;overflow:hidden;text-overflow:ellipsis;width:80%}.wc-helper .connected .user-info{padding-right:0;width:auto}.wc-helper .connected .avatar{margin-right:12px}.wc-helper .connected .chevron{color:#e1e1e1;display:block;margin:10px;-webkit-transform:rotateX(0);transform:rotateX(0)}.wc-helper .connected .buttons{display:none;border-top:1px solid #e1e1e1;padding:10px 20px}.wc-helper .connected .buttons.active{display:block}}.wc-helper .start-container{background-color:#fff;border-left:4px solid #cc99c2;padding:45px 20px 20px 30px;position:relative;overflow:hidden}.wc-helper .start-container h2,.wc-helper .start-container p{max-width:800px}.wc-helper .start-container::before{color:#eee2ec;content:"\e01C";display:block;font-family:WooCommerce;font-size:192px;line-height:1;position:absolute;top:65%;right:-3%;text-align:center;width:1em}.wc-helper .start-container h2{font-size:24px;line-height:29px;position:relative}.wc-helper .start-container p{font-size:16px;margin-bottom:30px;position:relative}.wc-helper .button-primary{height:37px;line-height:37px;min-width:124px;padding:0 13px;text-shadow:none}.wc-helper .button-primary:active,.wc-helper .button-primary:focus,.wc-helper .button-primary:hover{padding:0 13px}.form-toggle__wrapper{position:relative}.form-toggle__wrapper label{cursor:default}.form-toggle{cursor:pointer;display:block;position:absolute;top:0;bottom:-1px;left:0;right:0;text-align:left;text-indent:-100000px;z-index:2}.form-toggle:focus{box-shadow:none}.form-toggle.disabled{cursor:default}.form-toggle__switch{align-self:flex-start;background:#c8d7e1;border-radius:12px;box-sizing:border-box;display:inline-block;padding:2px;outline:0;position:relative;width:40px;height:24px;-webkit-transition:all .4s ease,box-shadow 0s;transition:all .4s ease,box-shadow 0s;vertical-align:middle}.form-toggle__switch::after,.form-toggle__switch::before{content:"";display:block;position:relative;width:20px;height:20px}.form-toggle__switch::after{border-radius:50%;background:#fff;left:0;-webkit-transition:all .2s ease;transition:all .2s ease}.form-toggle__switch::before{display:none}.accessible-focus .form-toggle__switch:focus{box-shadow:0 0 0 2px #955a89}.form-toggle__label{vertical-align:bottom;z-index:1}.form-toggle__label .form-toggle__label-content{color:#87a6bc;-webkit-box-flex:0;flex:0 1 100%;font-size:13px;line-height:16px;margin-left:12px;margin-right:8px;vertical-align:top;text-transform:uppercase}@media only screen and (max-width:480px){.form-toggle__label .form-toggle__label-content{display:none}}.accessible-focus .form-toggle:focus+.form-toggle__label .form-toggle__switch{box-shadow:0 0 0 2px #955a89}.accessible-focus .form-toggle:focus:checked+.form-toggle__label .form-toggle__switch{box-shadow:0 0 0 2px #bb77ae}.form-toggle+.form-toggle__label .form-toggle__switch{background:#a8bece}.form-toggle:not(:disabled)+.form-toggle__label:hover .form-toggle__switch{background:#c8d7e1}.form-toggle.active+.form-toggle__label .form-toggle__switch{background:#955a89}.form-toggle.active+.form-toggle__label .form-toggle__switch::after{left:8px}.form-toggle.active+.form-toggle__label:hover .form-toggle__switch{background:#bb77ae}.form-toggle.disabled+label.form-toggle__label span.form-toggle__switch{opacity:.25}.form-toggle.is-toggling+.form-toggle__label .form-toggle__switch{background:#955a89}.form-toggle.is-toggling:checked+.form-toggle__label .form-toggle__switch{background:#c8d7e1}.form-toggle.is-compact+.form-toggle__label .form-toggle__switch{border-radius:8px;width:24px;height:16px}.form-toggle.is-compact+.form-toggle__label .form-toggle__switch::after,.form-toggle.is-compact+.form-toggle__label .form-toggle__switch::before{height:12px;width:12px}.form-toggle.is-compact:checked+.form-toggle__label .form-toggle__switch::after{left:8px}
\ No newline at end of file
+.wc-helper .nav-tab-wrapper{margin-bottom:22px}@media only screen and (max-width:784px){.wc-helper .nav-tab{max-width:40%;overflow:hidden;text-overflow:ellipsis}}.wc-helper .button,.wc-helper .button:active,.wc-helper .button:focus,.wc-helper .button:hover{background-color:#955a89;border-width:0;box-shadow:none;border-radius:3px;color:#fff;height:auto;padding:3px 14px;text-align:center;white-space:normal!important}@media only screen and (max-width:782px){.wc-helper .button,.wc-helper .button:active,.wc-helper .button:focus,.wc-helper .button:hover{line-height:2}}.wc-helper .button.button-secondary,.wc-helper .button:active.button-secondary,.wc-helper .button:focus.button-secondary,.wc-helper .button:hover.button-secondary{background-color:#e6e6e6;color:#3c3c3c;text-shadow:none}.wc-helper .button:hover{opacity:.8}.wc-helper .subscription-filter{color:#2e4453;font-size:13px;line-height:13px;margin:22px 0}.wc-helper .subscription-filter label{display:none;position:relative}.wc-helper .subscription-filter label .chevron{color:#e1e1e1;border-bottom-width:0;line-height:1;padding:0;position:absolute;top:10px;right:14px}.wc-helper .subscription-filter li{color:#0073aa;display:inline-block;padding:0 4px 0 8px;position:relative}.wc-helper .subscription-filter li::before{background-color:#979797;content:" ";position:absolute;top:0;left:0;bottom:0;width:1px}.wc-helper .subscription-filter li:first-of-type::before{display:none}.wc-helper .subscription-filter a{color:#0073aa;text-decoration:none}.wc-helper .subscription-filter a.current{color:#000;font-weight:600}.wc-helper .subscription-filter .count{color:#555d66;font-weight:400}@media only screen and (max-width:600px){.wc-helper .subscription-filter{background-color:#fff;border:1px solid #e1e1e1;border-radius:4px;font-size:14px}.wc-helper .subscription-filter label,.wc-helper .subscription-filter li{line-height:21px;padding:8px 16px;margin:0}.wc-helper .subscription-filter label:last-child,.wc-helper .subscription-filter li:last-child{border-bottom:none}.wc-helper .subscription-filter li{border-bottom:1px solid #e1e1e1}.wc-helper .subscription-filter label,.wc-helper .subscription-filter span.chevron{display:block}.wc-helper .subscription-filter label{text-decoration:none}.wc-helper .subscription-filter li{display:none}.wc-helper .subscription-filter li::before{display:none}.wc-helper .subscription-filter a{cursor:pointer}.wc-helper .subscription-filter span.chevron{color:#555;opacity:.5;-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.wc-helper .subscription-filter:focus,.wc-helper .subscription-filter:hover{box-shadow:0 3px 5px rgba(0,0,0,.2)}.wc-helper .subscription-filter:focus label,.wc-helper .subscription-filter:hover label{border-bottom:1px solid #e1e1e1}.wc-helper .subscription-filter:focus li,.wc-helper .subscription-filter:hover li{display:block}.wc-helper .subscription-filter:focus span.chevron,.wc-helper .subscription-filter:hover span.chevron{-webkit-transform:rotateX(0);transform:rotateX(0)}}.wc-helper .subscriptions-header{margin:3em 0 0;position:relative;z-index:10}.wc-helper .subscriptions-header h2{display:inline-block;line-height:25px;margin:0 0 1.5em 0}.wc-helper .button-update,.wc-helper .button-update:hover{background-color:#e6e6e6;border-radius:4px;color:#333;font-weight:800;font-size:10px;line-height:20px;margin-left:6px;opacity:.75;padding:3px 7px;text-transform:uppercase}.wc-helper .button-update .dashicons,.wc-helper .button-update:hover .dashicons{font-size:12px;height:12px;width:12px;vertical-align:text-bottom}.wc-helper .button-update:hover{opacity:1}.wc-helper .user-info{background-color:#fff;border:1px solid #e1e1e1;border-radius:4px;font-size:12px;line-height:26px;position:absolute;top:-10px;right:0;-webkit-transition:all .1s ease-in;transition:all .1s ease-in}@media only screen and (max-width:600px){.wc-helper .user-info{position:relative;width:100%}}.wc-helper .user-info p{line-height:26px;margin:0}.wc-helper .user-info:hover{box-shadow:0 3px 5px rgba(0,0,0,.2)}.wc-helper .user-info header{color:#555;font-weight:600;padding:6px 14px;position:relative}.wc-helper .user-info header p{padding-right:26px}.wc-helper .user-info header .dashicons{opacity:.5;position:absolute;top:9px;right:14px}.wc-helper .user-info header:hover{cursor:pointer}.wc-helper .user-info section{display:none}.wc-helper .user-info section p{border-top:1px solid #e1e1e1;padding:6px 14px;text-align:center}.wc-helper .user-info section .actions{border-top:1px solid #e1e1e1;display:-webkit-box;display:flex}.wc-helper .user-info section a{color:#a26897;cursor:pointer;font-weight:600;line-height:38px;padding:0 14px;text-align:center;text-decoration:none;white-space:nowrap;width:50%}.wc-helper .user-info section a .dashicons{margin-top:-3px;vertical-align:middle}.wc-helper .user-info section a:first-child{border-right:1px solid #e1e1e1}.wc-helper .user-info section a:hover{background-color:#a26897;color:#fff}.wc-helper .user-info section .avatar{border:1px solid #ece1ea;border-radius:50%;height:auto;margin-right:6px;width:24px;vertical-align:bottom}.wc-helper .user-info:active header .dashicons,.wc-helper .user-info:focus header .dashicons,.wc-helper .user-info:hover header .dashicons{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.wc-helper .user-info:active section,.wc-helper .user-info:focus section,.wc-helper .user-info:hover section{display:block}.wc-helper .alternate,.wc-helper .striped>tbody>:nth-child(odd),.wc-helper ul.striped>:nth-child(odd){background-color:#fff}.wc-helper .comment-ays,.wc-helper .feature-filter,.wc-helper .imgedit-group,.wc-helper .popular-tags,.wc-helper .stuffbox,.wc-helper .widgets-holder-wrap,.wc-helper .wp-editor-container,.wc-helper p.popular-tags,.wc-helper table.widefat{padding-top:5px}.wc-helper .widefat tfoot tr td,.wc-helper .widefat tfoot tr th,.wc-helper .widefat thead tr td,.wc-helper .widefat thead tr th{color:#32373c;padding-bottom:15px;padding-top:10px}.wc-helper .widefat td{padding-bottom:15px;padding-top:15px}.wc-helper .wp-list-table{border:0;box-shadow:none;padding-top:0!important;z-index:1}@media only screen and (max-width:782px){.wc-helper .button{font-size:11px}}.wc-helper .wp-list-table__row{background-color:rgba(0,0,0,0)}.wc-helper .wp-list-table__row td{-webkit-box-align:center;align-items:center;background-color:#fff;border:0;padding:16px 22px;vertical-align:middle}@media only screen and (max-width:782px){.wc-helper .wp-list-table__row td{padding:16px}}.wc-helper .wp-list-table__row td.color-bar{border-left:0}.wc-helper .wp-list-table__row.is-ext-header td{border-top:1px solid #e1e1e1}@media only screen and (max-width:782px){.wc-helper .wp-list-table__row.is-ext-header{display:-webkit-inline-box;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;flex-flow:row wrap;width:100%}.wc-helper .wp-list-table__row.is-ext-header .wp-list-table__ext-details{display:block;-webkit-box-flex:2;flex:2}.wc-helper .wp-list-table__row.is-ext-header .wp-list-table__ext-actions{display:block;-webkit-box-flex:1;flex:1;min-width:0}}.wc-helper .wp-list-table__row:last-child td{border-bottom:24px solid #f1f1f1;box-shadow:inset 0 -1px 0 #e1e1e1}.wc-helper .wp-list-table__ext-details,.wc-helper .wp-list-table__ext-status,.wc-helper .wp-list-table__licence-container{padding-right:22px;position:relative;width:100%}.wc-helper .wp-list-table__ext-details::before,.wc-helper .wp-list-table__ext-status::before,.wc-helper .wp-list-table__licence-container::before{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;left:0!important;width:1px!important}.wc-helper .wp-list-table__ext-details{display:-webkit-box;display:flex}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-details{display:table}}.wc-helper .wp-list-table__ext-title{color:#0073aa;font-size:18px;font-weight:600;width:60%}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-title{margin-bottom:12px;width:100%}}@media only screen and (max-width:320px){.wc-helper .wp-list-table__ext-title{max-width:120px}}.wc-helper .wp-list-table__ext-description{color:#333;padding-left:12px;width:40%}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-description{padding-left:0;width:100%}}.wc-helper .wp-list-table__ext-status{position:relative}.wc-helper .wp-list-table__ext-status.update-available::after{background-color:#ffc322;content:" ";position:absolute;top:0;left:0;bottom:0;width:5px}.wc-helper .wp-list-table__ext-status.expired::after{background-color:#b81c23;content:" ";position:absolute;top:0;left:0;bottom:0;width:5px}.wc-helper .wp-list-table__ext-status .dashicons-update{color:#ffc322}.wc-helper .wp-list-table__ext-status .dashicons-info{color:#b81c23}.wc-helper .wp-list-table__ext-status p{color:#333;margin:0}.wc-helper .wp-list-table__ext-status .dashicons{margin-right:5px}.wc-helper .wp-list-table__ext-actions{min-width:150px;position:relative;width:25%;text-align:right}.wc-helper .wp-list-table__ext-actions::after{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;right:0;width:1px}.wc-helper .wp-list-table__ext-licence td,.wc-helper .wp-list-table__ext-updates td{position:relative}.wc-helper .wp-list-table__ext-licence td::before,.wc-helper .wp-list-table__ext-updates td::before{background-color:#e1e1e1;content:" ";height:1px;position:absolute;top:0;left:0;right:0}.wc-helper .wp-list-table__ext-licence td.wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-licence td.wp-list-table__licence-container::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__licence-container::before{left:22px!important;width:auto!important}.wc-helper .wp-list-table__ext-licence td.wp-list-table__ext-actions::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__ext-actions::before{right:22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-licence,.wc-helper .wp-list-table__ext-updates{display:-webkit-box;display:flex}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-status,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-status{-webkit-box-flex:2;flex:2}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-status::before{left:0!important;width:100%!important}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-actions,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-actions{-webkit-box-flex:1;flex:1;min-width:0}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-actions::before,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-actions::before{left:0!important;right:0!important;width:100%!important}}.wc-helper .wp-list-table__licence-container{padding:0!important}.wc-helper .wp-list-table__licence-container::after{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;right:0;width:1px}.wc-helper .wp-list-table__licence-form{display:-webkit-box;display:flex;padding:16px 22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form{display:block}}.wc-helper .wp-list-table__licence-form::before{background-color:#e1e1e1;content:" ";height:1px;position:absolute;top:0;right:22px;left:22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form::before{right:0;left:0}}.wc-helper .wp-list-table__licence-form div{padding-right:16px;vertical-align:middle}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form div{padding:0}}.wc-helper .wp-list-table__licence-form p{margin:0!important}.wc-helper .wp-list-table__licence-label label{color:#23282d;font-weight:600;line-height:30px}.wc-helper .wp-list-table__licence-field input{height:32px}@media only screen and (max-width:480px){.wc-helper .wp-list-table__licence-field input{width:100%}}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-field{padding:8px 0 16px!important}}.wc-helper .wp-list-table__licence-actions{-webkit-box-flex:2;flex-grow:2;padding-right:0!important}.wc-helper .wp-list-table__licence-actions .button{margin-right:8px}.wc-helper .wp-list-table__licence-actions .button-secondary{float:right;margin:0 0 0 8px}@media only screen and (max-width:480px){.wc-helper .wp-list-table__licence-actions{text-align:right}}.wc-helper td.color-bar{border-left:solid 4px transparent}.wc-helper td.color-bar.expired{border-left-color:#b81c23}.wc-helper td.color-bar.expiring{border-left-color:orange}.wc-helper td.color-bar.update-available{border-left-color:#8fae1b}.wc-helper td.color-bar.expiring.update-available{border-left-color:#8fae1b}.wc-helper .connect-wrapper{background-color:#fff;border:1px solid #e5e5e5;margin-bottom:25px;overflow:auto}.wc-helper .connected{display:-webkit-box;display:flex}.wc-helper .connected .user-info{display:-webkit-box;display:flex;padding:20px;width:100%;vertical-align:middle}.wc-helper .connected img{border:1px solid #e5e5e5;height:34px;width:34px}.wc-helper .connected .buttons{padding:20px;white-space:nowrap}.wc-helper .connected p{-webkit-box-flex:2;flex:2;margin:10px 0 0 20px}.wc-helper .connected .chevron{display:none}.wc-helper .connected .chevron:hover{color:#955a89;cursor:pointer}@media only screen and (max-width:784px){.wc-helper .connected{display:block}.wc-helper .connected strong{display:block;overflow:hidden;text-overflow:ellipsis}.wc-helper .connected p{margin:0;overflow:hidden;text-overflow:ellipsis;width:80%}.wc-helper .connected .user-info{padding-right:0;width:auto}.wc-helper .connected .avatar{margin-right:12px}.wc-helper .connected .chevron{color:#e1e1e1;display:block;margin:10px;-webkit-transform:rotateX(0);transform:rotateX(0)}.wc-helper .connected .buttons{display:none;border-top:1px solid #e1e1e1;padding:10px 20px}.wc-helper .connected .buttons.active{display:block}}.wc-helper .start-container{background-color:#fff;border-left:4px solid #cc99c2;padding:45px 20px 20px 30px;position:relative;overflow:hidden}.wc-helper .start-container h2,.wc-helper .start-container p{max-width:800px}.wc-helper .start-container::before{color:#eee2ec;content:"\e01C";display:block;font-family:WooCommerce;font-size:192px;line-height:1;position:absolute;top:65%;right:-3%;text-align:center;width:1em}.wc-helper .start-container h2{font-size:24px;line-height:29px;position:relative}.wc-helper .start-container p{font-size:16px;margin-bottom:30px;position:relative}.wc-helper .button-helper-connect{height:37px;line-height:37px;min-width:124px;padding:0 13px;text-shadow:none}.wc-helper .button-helper-connect:active,.wc-helper .button-helper-connect:focus,.wc-helper .button-helper-connect:hover{padding:0 13px}.form-toggle__wrapper{position:relative}.form-toggle__wrapper label{cursor:default}.form-toggle{cursor:pointer;display:block;position:absolute;top:0;bottom:-1px;left:0;right:0;text-align:left;text-indent:-100000px;z-index:2}.form-toggle:focus{box-shadow:none}.form-toggle.disabled{cursor:default}.form-toggle__switch{align-self:flex-start;background:#c8d7e1;border-radius:12px;box-sizing:border-box;display:inline-block;padding:2px;outline:0;position:relative;width:40px;height:24px;-webkit-transition:all .4s ease,box-shadow 0s;transition:all .4s ease,box-shadow 0s;vertical-align:middle}.form-toggle__switch::after,.form-toggle__switch::before{content:"";display:block;position:relative;width:20px;height:20px}.form-toggle__switch::after{border-radius:50%;background:#fff;left:0;-webkit-transition:all .2s ease;transition:all .2s ease}.form-toggle__switch::before{display:none}.accessible-focus .form-toggle__switch:focus{box-shadow:0 0 0 2px #955a89}.form-toggle__label{vertical-align:bottom;z-index:1}.form-toggle__label .form-toggle__label-content{color:#87a6bc;-webkit-box-flex:0;flex:0 1 100%;font-size:13px;line-height:16px;margin-left:12px;margin-right:8px;vertical-align:top;text-transform:uppercase}@media only screen and (max-width:480px){.form-toggle__label .form-toggle__label-content{display:none}}.accessible-focus .form-toggle:focus+.form-toggle__label .form-toggle__switch{box-shadow:0 0 0 2px #955a89}.accessible-focus .form-toggle:focus:checked+.form-toggle__label .form-toggle__switch{box-shadow:0 0 0 2px #bb77ae}.form-toggle+.form-toggle__label .form-toggle__switch{background:#a8bece}.form-toggle:not(:disabled)+.form-toggle__label:hover .form-toggle__switch{background:#c8d7e1}.form-toggle.active+.form-toggle__label .form-toggle__switch{background:#955a89}.form-toggle.active+.form-toggle__label .form-toggle__switch::after{left:8px}.form-toggle.active+.form-toggle__label:hover .form-toggle__switch{background:#bb77ae}.form-toggle.disabled+label.form-toggle__label span.form-toggle__switch{opacity:.25}.form-toggle.is-toggling+.form-toggle__label .form-toggle__switch{background:#955a89}.form-toggle.is-toggling:checked+.form-toggle__label .form-toggle__switch{background:#c8d7e1}.form-toggle.is-compact+.form-toggle__label .form-toggle__switch{border-radius:8px;width:24px;height:16px}.form-toggle.is-compact+.form-toggle__label .form-toggle__switch::after,.form-toggle.is-compact+.form-toggle__label .form-toggle__switch::before{height:12px;width:12px}.form-toggle.is-compact:checked+.form-toggle__label .form-toggle__switch::after{left:8px}
\ No newline at end of file
diff --git a/assets/css/helper.scss b/assets/css/helper.scss
index 68bbae60ab9..4eaaac98e6d 100644
--- a/assets/css/helper.scss
+++ b/assets/css/helper.scss
@@ -866,7 +866,7 @@ $color_button_secondary: $woo_pink2;
position: relative;
}
- .button-primary {
+ .button-helper-connect {
height: 37px;
line-height: 37px;
min-width: 124px;
diff --git a/assets/css/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png b/assets/css/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png
index 89ee1f10d13..a2e6bfc085f 100755
Binary files a/assets/css/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png and b/assets/css/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png differ
diff --git a/assets/css/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png b/assets/css/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png
index af7f4851300..e36540bbf98 100755
Binary files a/assets/css/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png and b/assets/css/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png differ
diff --git a/assets/css/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png b/assets/css/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png
index 14ebfd7eebd..2763b5021d4 100755
Binary files a/assets/css/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png and b/assets/css/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png differ
diff --git a/assets/css/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png b/assets/css/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png
index ceef7df61f2..693b8d18767 100755
Binary files a/assets/css/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png and b/assets/css/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png differ
diff --git a/assets/css/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png b/assets/css/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png
index cf3abc31efc..857314addeb 100755
Binary files a/assets/css/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png and b/assets/css/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png differ
diff --git a/assets/css/jquery-ui/images/ui-icons_222222_256x240.png b/assets/css/jquery-ui/images/ui-icons_222222_256x240.png
index f184400db5d..e61b7eefbd2 100644
Binary files a/assets/css/jquery-ui/images/ui-icons_222222_256x240.png and b/assets/css/jquery-ui/images/ui-icons_222222_256x240.png differ
diff --git a/assets/css/jquery-ui/images/ui-icons_2e83ff_256x240.png b/assets/css/jquery-ui/images/ui-icons_2e83ff_256x240.png
index 264b2213589..d578ae26ed9 100644
Binary files a/assets/css/jquery-ui/images/ui-icons_2e83ff_256x240.png and b/assets/css/jquery-ui/images/ui-icons_2e83ff_256x240.png differ
diff --git a/assets/css/jquery-ui/images/ui-icons_454545_256x240.png b/assets/css/jquery-ui/images/ui-icons_454545_256x240.png
index e6e41cd0781..d7ebd2397c7 100644
Binary files a/assets/css/jquery-ui/images/ui-icons_454545_256x240.png and b/assets/css/jquery-ui/images/ui-icons_454545_256x240.png differ
diff --git a/assets/css/jquery-ui/images/ui-icons_888888_256x240.png b/assets/css/jquery-ui/images/ui-icons_888888_256x240.png
index 2f1cf26a504..e1caba91938 100644
Binary files a/assets/css/jquery-ui/images/ui-icons_888888_256x240.png and b/assets/css/jquery-ui/images/ui-icons_888888_256x240.png differ
diff --git a/assets/css/jquery-ui/images/ui-icons_cd0a0a_256x240.png b/assets/css/jquery-ui/images/ui-icons_cd0a0a_256x240.png
index ed1b23a81c2..ab58528bf97 100644
Binary files a/assets/css/jquery-ui/images/ui-icons_cd0a0a_256x240.png and b/assets/css/jquery-ui/images/ui-icons_cd0a0a_256x240.png differ
diff --git a/assets/css/photoswipe/default-skin/default-skin.svg b/assets/css/photoswipe/default-skin/default-skin.svg
index 9d5f0c6a10a..ffc2bbb67b9 100644
--- a/assets/css/photoswipe/default-skin/default-skin.svg
+++ b/assets/css/photoswipe/default-skin/default-skin.svg
@@ -1 +1 @@
-default-skin 2
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/css/twenty-nineteen-rtl.css b/assets/css/twenty-nineteen-rtl.css
new file mode 100644
index 00000000000..fe001cd7b43
--- /dev/null
+++ b/assets/css/twenty-nineteen-rtl.css
@@ -0,0 +1 @@
+@charset "UTF-8";@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}a.button{display:inline-block;text-align:center;box-sizing:border-box;word-break:break-all;color:#fff;text-decoration:none!important}a.button:hover,a.button:visited{color:#fff}.woocommerce form .form-row .required{color:#b22222;text-decoration:none;visibility:hidden}.woocommerce form .form-row .required[title]{border:0!important}.woocommerce form .form-row .optional{visibility:visible}.woocommerce-breadcrumb{margin-bottom:3rem;font-size:.88889em;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif}.woocommerce-pagination{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif;font-size:.88889em}.woocommerce-pagination ul.page-numbers{margin:0;padding:0;display:block;font-weight:700;letter-spacing:-.02em;line-height:1.2}.woocommerce-pagination .next.page-numbers,.woocommerce-pagination .prev.page-numbers,.woocommerce-pagination a.page-numbers,.woocommerce-pagination span.page-numbers{padding:0 calc(.5 * 1rem);display:inline-block}.onsale{position:absolute;top:0;right:0;display:inline-block;background:#0073aa;color:#fff;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif;font-size:.71111em;font-weight:700;letter-spacing:-.02em;line-height:1.2;padding:.5rem;position:absolute;text-transform:uppercase;top:0;z-index:1}.price{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif}.price del{opacity:.5;display:inline-block}.price ins{display:inline-block}.woocommerce-error,.woocommerce-info,.woocommerce-message{margin-bottom:1.5rem;padding:1rem;background:#eee;font-size:.88889em;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif;list-style:none;overflow:hidden}.woocommerce-message{background:#eee;color:#111}.woocommerce-error,.woocommerce-info{color:#fff}.woocommerce-error a,.woocommerce-info a{color:#fff}.woocommerce-error a:hover,.woocommerce-info a:hover{color:#fff}.woocommerce-error a.button,.woocommerce-info a.button{background:#111}.woocommerce-error{background:#b22222}.woocommerce-info{background:#0073aa}.woocommerce-store-notice{background:#0073aa;color:#fff;padding:1rem;position:absolute;top:0;right:0;width:100%;z-index:999}.admin-bar .woocommerce-store-notice{top:32px}.woocommerce-store-notice__dismiss-link{float:left;color:#fff}.woocommerce-store-notice__dismiss-link:hover{text-decoration:underline;color:#fff}.woocommerce table.shop_table td,.woocommerce table.shop_table th,.woocommerce-page table.shop_table td,.woocommerce-page table.shop_table th{word-break:normal}.woocommerce-products-header__title.page-title{font-size:1.6875em;font-weight:700;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif}.woocommerce-result-count{margin:0;padding:.75rem 0}ul.products{margin:0;padding:0}ul.products li.product{list-style:none}ul.products li.product .woocommerce-loop-product__link{display:block}ul.products li.product .woocommerce-loop-product__title{margin:.8rem 0;font-size:.88889em}ul.products li.product .woocommerce-loop-product__title:before{content:none}ul.products li.product .price,ul.products li.product .star-rating,ul.products li.product .woocommerce-loop-product__title{color:#111}ul.products li.product .star-rating{margin-bottom:.8rem}ul.products li.product .price{margin-bottom:1.3rem}ul.products li.product .price,ul.products li.product .star-rating{display:block;font-size:.88889em}ul.products li.product .woocommerce-placeholder{border:1px solid #f2f2f2}ul.products li.product .button{vertical-align:middle}ul.products li.product .button.loading{opacity:.5}ul.products li.product .added_to_cart{margin-right:.5rem;font-size:.88889em;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif}.star-rating{overflow:hidden;position:relative;height:1em;line-height:1;font-size:1em;width:5.4em;font-family:star}.star-rating::before{content:'\73\73\73\73\73';float:right;top:0;right:0;position:absolute}.star-rating span{overflow:hidden;float:right;top:0;right:0;position:absolute;padding-top:1.5em}.star-rating span::before{content:'\53\53\53\53\53';top:0;position:absolute;right:0}a.remove{display:inline-block;width:20px;height:20px;line-height:17px;font-size:20px;font-weight:700;text-align:center;border-radius:100%;text-decoration:none!important;background:#b22222;color:#fff}a.remove:hover{background:#000;color:#fff!important}.wc-item-meta,dl.variation{list-style:none outside}.wc-item-meta .wc-item-meta-label,.wc-item-meta dt,dl.variation .wc-item-meta-label,dl.variation dt{float:right;clear:both;margin-left:.25rem;list-style:none outside}.wc-item-meta dd,dl.variation dd{margin:0}.wc-item-meta p,.wc-item-meta:last-child,dl.variation p,dl.variation:last-child{margin-bottom:0}.single-product div.product{position:relative}.single-product .single-featured-image-header{display:none}.single-product .entry .entry-title{margin-top:0}.single-product .entry .entry-title:before{margin-top:0}.single-product .summary p.price{margin-bottom:2rem}.single-product .woocommerce-product-rating{margin-bottom:2rem;line-height:1}.single-product .woocommerce-product-rating .star-rating{float:right;margin-left:.25rem}.single-product form.cart .quantity{float:right;margin-left:.5rem}.single-product form.cart input{width:5em}.single-product .woocommerce-variation-add-to-cart .button{padding-top:.72rem;padding-bottom:.72rem}.single-product .woocommerce-variation-add-to-cart .button.disabled{opacity:.2}table.variations label{margin:0}table.variations select{margin-left:.5rem}.woocommerce-product-gallery{position:relative;margin-bottom:3rem}.woocommerce-product-gallery figure{margin:0;padding:0}.woocommerce-product-gallery .woocommerce-product-gallery__wrapper{margin:0;padding:0}.woocommerce-product-gallery .zoomImg{background-color:#fff;opacity:0}.woocommerce-product-gallery .woocommerce-product-gallery__image--placeholder{border:1px solid #f2f2f2}.woocommerce-product-gallery .woocommerce-product-gallery__image:nth-child(n+2){width:25%;display:inline-block}.woocommerce-product-gallery .flex-control-thumbs li{list-style:none;cursor:pointer;float:right}.woocommerce-product-gallery .flex-control-thumbs img{opacity:.5}.woocommerce-product-gallery .flex-control-thumbs img.flex-active,.woocommerce-product-gallery .flex-control-thumbs img:hover{opacity:1}.woocommerce-product-gallery img{display:block;height:auto}.woocommerce-product-gallery--columns-3 .flex-control-thumbs li{width:33.3333%}.woocommerce-product-gallery--columns-3 .flex-control-thumbs li:nth-child(3n+1){clear:right}.woocommerce-product-gallery--columns-4 .flex-control-thumbs li{width:25%}.woocommerce-product-gallery--columns-4 .flex-control-thumbs li:nth-child(4n+1){clear:right}.woocommerce-product-gallery--columns-5 .flex-control-thumbs li{width:20%}.woocommerce-product-gallery--columns-5 .flex-control-thumbs li:nth-child(5n+1){clear:right}.woocommerce-product-gallery__trigger{position:absolute;top:1rem;left:1rem;z-index:99}.woocommerce-tabs{margin:0 0 2rem}.woocommerce-tabs ul{margin:0 0 1.5rem;padding:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif}.woocommerce-tabs ul li{margin-left:1rem}.woocommerce-tabs ul li a{color:#111;text-decoration:none;font-weight:700}.woocommerce-tabs ul li.active a{color:#0073aa;box-shadow:0 2px 0 #0073aa}.woocommerce-tabs .panel>*{margin-top:0!important}.woocommerce-tabs .panel h1:before,.woocommerce-tabs .panel h2:before{content:none}.woocommerce-tabs .panel h2:first-of-type{font-size: 1em;margin:0 0 1rem}.woocommerce-tabs #comments{padding-top:0}.woocommerce-tabs .comment-reply-title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif;font-size:1em;font-weight:700;margin:0 0 .75rem;display:block}.woocommerce-tabs #reviews ol.commentlist{padding:0}.woocommerce-tabs #reviews li.comment,.woocommerce-tabs #reviews li.review{list-style:none;margin-left:0;margin-bottom:2.5rem}.woocommerce-tabs #reviews li.comment .avatar,.woocommerce-tabs #reviews li.review .avatar{max-height:36px;width:auto;float:left}.woocommerce-tabs #reviews li.comment p.meta,.woocommerce-tabs #reviews li.review p.meta{margin-bottom:.5em}.woocommerce-tabs #reviews p.stars{margin-top:0}.woocommerce-tabs #reviews p.stars a{position:relative;height:1em;width:1em;text-indent:-999em;display:inline-block;text-decoration:none;box-shadow:none}.woocommerce-tabs #reviews p.stars a::before{display:block;position:absolute;top:0;right:0;width:1em;height:1em;line-height:1;font-family:WooCommerce;content:'\e021';text-indent:0}.woocommerce-tabs #reviews p.stars a:hover~a::before{content:'\e021'}.woocommerce-tabs #reviews p.stars:hover a::before{content:'\e020'}.woocommerce-tabs #reviews p.stars.selected a.active::before{content:'\e020'}.woocommerce-tabs #reviews p.stars.selected a.active~a::before{content:'\e021'}.woocommerce-tabs #reviews p.stars.selected a:not(.active)::before{content:'\e020'}.widget.woocommerce ul{padding-right:0}.widget.woocommerce ul li{list-style:none}.site-footer .widget .product_list_widget,.widget .product_list_widget{margin-bottom:1.5rem}.site-footer .widget .product_list_widget a,.widget .product_list_widget a{display:block;box-shadow:none}.site-footer .widget .product_list_widget a:hover,.widget .product_list_widget a:hover{box-shadow:none}.site-footer .widget .product_list_widget li,.widget .product_list_widget li{padding:.5rem 0}.site-footer .widget .product_list_widget li a.remove,.widget .product_list_widget li a.remove{float:right;margin-top:7px;line-height:20px;color:#fff;margin-left:.5rem}.site-footer .widget .product_list_widget img,.widget .product_list_widget img{display:none}.widget_shopping_cart .buttons a{display:inline-block;margin:0 0 0 .5rem}.widget_layered_nav .chosen:before{content:"×";display:inline-block;width:16px;height:16px;line-height:16px;font-size:16px;text-align:center;border-radius:100%;border:1px solid #000;margin-left:.25rem}.widget_price_filter .price_slider{margin-bottom:1rem}.widget_price_filter .price_slider_amount{text-align:left;line-height:2.4;font-size:.8751em}.widget_price_filter .price_slider_amount .button{float:right;padding:.4rem 1rem}.widget_price_filter .ui-slider{position:relative;text-align:right;margin-right:.5rem;margin-left:.5rem}.widget_price_filter .ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1em;height:1em;background-color:#000;border-radius:1em;cursor:ew-resize;outline:0;top:-.3em;margin-right:-.5em}.widget_price_filter .ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;border-radius:1em;background-color:#000}.widget_price_filter .price_slider_wrapper .ui-widget-content{border-radius:1em;background-color:#666;border:0}.widget_price_filter .ui-slider-horizontal{height:.5em}.widget_price_filter .ui-slider-horizontal .ui-slider-range{top:0;height:100%}.widget_price_filter .ui-slider-horizontal .ui-slider-range-min{right:-1px}.widget_price_filter .ui-slider-horizontal .ui-slider-range-max{left:-1px}.widget_rating_filter li{text-align:left}.widget_rating_filter li .star-rating{float:right;margin-top:.3rem}.widget_product_search form{position:relative}.widget_product_search .search-field{padding-left:100px}.widget_product_search input[type=submit]{position:absolute;top:.5rem;left:.5rem;padding-right:1rem;padding-left:1rem}.woocommerce-account .woocommerce-MyAccount-navigation{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif;margin:0 0 2rem}.woocommerce-account .woocommerce-MyAccount-navigation ul{margin:0;padding:0}.woocommerce-account .woocommerce-MyAccount-navigation li{list-style:none;padding:.5rem 0;border-bottom:1px solid #ccc}.woocommerce-account .woocommerce-MyAccount-navigation li:first-child{padding-top:0}.woocommerce-account .woocommerce-MyAccount-navigation li a{box-shadow:none;text-decoration:none;font-weight:600}.woocommerce-account .woocommerce-MyAccount-navigation li a:hover{color:#005177;text-decoration:underline}.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a{text-decoration:underline}.woocommerce-account table.account-orders-table .button{margin:0 0 .35rem .35rem}.woocommerce-cart-form img{max-width:42px;height:auto;display:block}.woocommerce-cart-form dl.variation{margin-top:0}.woocommerce-cart-form dl.variation p,.woocommerce-cart-form dl.variation:last-child{margin-bottom:0}.woocommerce-cart-form .product-remove{text-align:center}.woocommerce-cart-form .actions .input-text{width:200px!important;float:right;margin-left:.25rem}.woocommerce-cart-form .quantity input{width:4rem}.cart_totals td,.cart_totals th{vertical-align:top}.cart_totals th{padding-left:1rem}.cart_totals .woocommerce-shipping-destination{margin-bottom:0}.shipping-calculator-button{margin-top:.5rem;display:inline-block}.shipping-calculator-form{margin:1rem 0 0 0}#shipping_method{list-style:none;margin:0;padding:0}#shipping_method li{margin-bottom:.5rem}#shipping_method li input{float:right;margin-top:.17rem}#shipping_method li label{line-height:1.5rem}.checkout-button{display:block;padding:1rem 2rem;border:2px solid #000;text-align:center;font-weight:800}.checkout-button:hover{border-color:#999}.checkout-button:after{content:"→";margin-right:.5rem}#ship-to-different-address{font-size:1em;display:inline-block}#ship-to-different-address label{font-weight:300;cursor:pointer}#ship-to-different-address label span{position:relative;display:block;text-align:left;padding-left:45px}#ship-to-different-address label span:before{content:"";display:block;height:16px;width:30px;border:2px solid #bbb;background:#bbb;border-radius:13rem;box-sizing:content-box;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s;position:absolute;top:4px;left:0}#ship-to-different-address label span:after{content:"";display:block;width:14px;height:14px;background:#fff;position:absolute;top:7px;left:17px;border-radius:13rem;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s}#ship-to-different-address label input[type=checkbox]{display:none}#ship-to-different-address label input[type=checkbox]:checked+span:after{left:3px}#ship-to-different-address label input[type=checkbox]:checked+span:before{border-color:#000;background:#000}.woocommerce-no-js form.woocommerce-form-coupon,.woocommerce-no-js form.woocommerce-form-login{display:block!important}.woocommerce-no-js .showcoupon,.woocommerce-no-js .woocommerce-form-coupon-toggle,.woocommerce-no-js .woocommerce-form-login-toggle{display:none!important}.woocommerce-terms-and-conditions{border:1px solid rgba(0,0,0,.2);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background:rgba(0,0,0,.05)}.woocommerce-terms-and-conditions-link{display:inline-block}.woocommerce-terms-and-conditions-link:after{content:"";display:inline-block;border-style:solid;margin-bottom:2px;margin-right:.25rem;border-width:6px 6px 0 6px;border-color:#111 transparent transparent transparent}.woocommerce-terms-and-conditions-link.woocommerce-terms-and-conditions-link--open:after{border-width:0 6px 6px 6px;border-color:transparent transparent #111 transparent}.woocommerce-checkout .woocommerce-input-wrapper .description{background:#4169e1;color:#fff;border-radius:3px;padding:1rem;margin:.5rem 0 0;clear:both;display:none;position:relative}.woocommerce-checkout .woocommerce-input-wrapper .description a{color:#fff;text-decoration:underline;border:0;box-shadow:none}.woocommerce-checkout .woocommerce-input-wrapper .description:before{right:50%;top:0;margin-top:-4px;-webkit-transform:translatex(50%) rotate(-180deg);-ms-transform:translatex(50%) rotate(-180deg);transform:translatex(50%) rotate(-180deg);content:"";position:absolute;border-width:4px 6px 0 6px;border-style:solid;border-color:#4169e1 transparent transparent transparent;z-index:100;display:block}.woocommerce-checkout .select2-choice,.woocommerce-checkout .select2-choice:hover{box-shadow:none!important}.woocommerce-checkout .select2-choice{padding:.7rem .7rem .7rem 0}.woocommerce-checkout .select2-container .select2-selection--single{height:48px}.woocommerce-checkout .select2-container .select2-selection--single .select2-selection__rendered{line-height:48px}.woocommerce-checkout .select2-container--default .select2-selection--single .select2-selection__arrow{height:46px}.woocommerce-checkout .select2-container--focus .select2-selection{border-color:#000}.woocommerce-checkout-review-order-table td{padding:1rem .5rem}.woocommerce-checkout-review-order-table dl.variation{margin:0}.woocommerce-checkout-review-order-table dl.variation p{margin:0}.woocommerce-checkout-review-order ul{margin:2rem 0 1rem;padding-right:0}.wc_payment_method{list-style:none}.wc_payment_method .payment_box{padding:1rem;background:#eee}.wc_payment_method .payment_box ol:last-of-type,.wc_payment_method .payment_box ul:last-of-type{margin-bottom:0}.wc_payment_method .payment_box fieldset{padding:1.5rem;padding-bottom:0;border:0;background:#f6f6f6}.wc_payment_method .payment_box li{list-style:none}.wc_payment_method .payment_box p:first-child{margin-top:0}.wc_payment_method .payment_box p:last-child{margin-bottom:0}.wc_payment_method>label:first-of-type{display:block;margin:1rem 0}.wc_payment_method>label:first-of-type img{max-height:24px;max-width:200px;float:left}.wc_payment_method label{cursor:pointer}.wc_payment_method input.input-radio[name=payment_method]{display:none}.wc_payment_method input.input-radio[name=payment_method]+label:before{content:"";display:inline-block;width:16px;height:16px;border:2px solid #fff;box-shadow:0 0 0 2px #000;background:#fff;margin-right:4px;margin-left:.5rem;border-radius:100%;-webkit-transform:translateY(2px);-ms-transform:translateY(2px);transform:translateY(2px)}.wc_payment_method input.input-radio[name=payment_method]:checked+label:before{background:#000}.woocommerce-order-overview{margin-bottom:2rem}.woocommerce-table--order-details{margin-bottom:2rem}.woocommerce .content-area .site-main{margin:calc(2 * 1rem) 1rem}@media only screen and (max-width:768px){.woocommerce table.shop_table_responsive tr,.woocommerce-page table.shop_table_responsive tr{margin:0 0 1.5rem}.woocommerce table.shop_table_responsive tr:first-child,.woocommerce-page table.shop_table_responsive tr:first-child{border-top:1px solid}.woocommerce table.shop_table_responsive tr:last-child,.woocommerce-page table.shop_table_responsive tr:last-child{margin-bottom:0}.woocommerce table.shop_table_responsive tr td,.woocommerce-page table.shop_table_responsive tr td{border-bottom-width:0}.woocommerce table.shop_table_responsive tr td:last-child,.woocommerce-page table.shop_table_responsive tr td:last-child{border-bottom-width:1px}}@media only screen and (min-width:768px){.woocommerce table.shop_table tbody tr,.woocommerce-page table.shop_table tbody tr{font-size:.88889em}.woocommerce-products-header__title.page-title{font-size:2.25em}.woocommerce-pagination .next.page-numbers,.woocommerce-pagination .prev.page-numbers,.woocommerce-pagination a.page-numbers,.woocommerce-pagination span.page-numbers{padding:1rem}.woocommerce-account .woocommerce-MyAccount-navigation{float:none;width:100%;margin-bottom:1.5rem}.woocommerce-account .woocommerce-MyAccount-navigation li{display:inline-block;margin:0 0 0 1rem;padding:0;border-bottom:0}.woocommerce-account .woocommerce-MyAccount-navigation li:last-child{margin-left:0}.woocommerce-account .woocommerce-MyAccount-content{float:none;width:100%}#ship-to-different-address{display:block}.woocommerce .content-area{margin:0 calc(10% + 60px)}.woocommerce .content-area .site-main{margin:0;max-width:calc(8 * (100vw / 12) - 28px)}.single-product .entry .entry-content,.single-product .entry .entry-summary{max-width:none;margin:0 0 3rem;padding:0}.single-product .entry .entry-content>*,.single-product .entry .entry-summary>*{max-width:none}}@media only screen and (min-width:1168px){.woocommerce .content-area .site-main{max-width:calc(6 * (100vw / 12) - 28px)}}
\ No newline at end of file
diff --git a/assets/css/twenty-nineteen.css b/assets/css/twenty-nineteen.css
new file mode 100644
index 00000000000..379360f419c
--- /dev/null
+++ b/assets/css/twenty-nineteen.css
@@ -0,0 +1 @@
+@charset "UTF-8";@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}a.button{display:inline-block;text-align:center;box-sizing:border-box;word-break:break-all;color:#fff;text-decoration:none!important}a.button:hover,a.button:visited{color:#fff}.woocommerce form .form-row .required{color:#b22222;text-decoration:none;visibility:hidden}.woocommerce form .form-row .required[title]{border:0!important}.woocommerce form .form-row .optional{visibility:visible}.woocommerce-breadcrumb{margin-bottom:3rem;font-size:.88889em;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif}.woocommerce-pagination{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif;font-size:.88889em}.woocommerce-pagination ul.page-numbers{margin:0;padding:0;display:block;font-weight:700;letter-spacing:-.02em;line-height:1.2}.woocommerce-pagination .next.page-numbers,.woocommerce-pagination .prev.page-numbers,.woocommerce-pagination a.page-numbers,.woocommerce-pagination span.page-numbers{padding:0 calc(.5 * 1rem);display:inline-block}.onsale{position:absolute;top:0;left:0;display:inline-block;background:#0073aa;color:#fff;display:inline-block;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif;font-size:.71111em;font-weight:700;letter-spacing:-.02em;line-height:1.2;padding:.5rem;position:absolute;text-transform:uppercase;top:0;z-index:1}.price{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif}.price del{opacity:.5;display:inline-block}.price ins{display:inline-block}.woocommerce-error,.woocommerce-info,.woocommerce-message{margin-bottom:1.5rem;padding:1rem;background:#eee;font-size:.88889em;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif;list-style:none;overflow:hidden}.woocommerce-message{background:#eee;color:#111}.woocommerce-error,.woocommerce-info{color:#fff}.woocommerce-error a,.woocommerce-info a{color:#fff}.woocommerce-error a:hover,.woocommerce-info a:hover{color:#fff}.woocommerce-error a.button,.woocommerce-info a.button{background:#111}.woocommerce-error{background:#b22222}.woocommerce-info{background:#0073aa}.woocommerce-store-notice{background:#0073aa;color:#fff;padding:1rem;position:absolute;top:0;left:0;width:100%;z-index:999}.admin-bar .woocommerce-store-notice{top:32px}.woocommerce-store-notice__dismiss-link{float:right;color:#fff}.woocommerce-store-notice__dismiss-link:hover{text-decoration:underline;color:#fff}.woocommerce table.shop_table td,.woocommerce table.shop_table th,.woocommerce-page table.shop_table td,.woocommerce-page table.shop_table th{word-break:normal}.woocommerce-products-header__title.page-title{font-size:1.6875em;font-weight:700;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif}.woocommerce-result-count{margin:0;padding:.75rem 0}ul.products{margin:0;padding:0}ul.products li.product{list-style:none}ul.products li.product .woocommerce-loop-product__link{display:block}ul.products li.product .woocommerce-loop-product__title{margin:.8rem 0;font-size:.88889em}ul.products li.product .woocommerce-loop-product__title:before{content:none}ul.products li.product .price,ul.products li.product .star-rating,ul.products li.product .woocommerce-loop-product__title{color:#111}ul.products li.product .star-rating{margin-bottom:.8rem}ul.products li.product .price{margin-bottom:1.3rem}ul.products li.product .price,ul.products li.product .star-rating{display:block;font-size:.88889em}ul.products li.product .woocommerce-placeholder{border:1px solid #f2f2f2}ul.products li.product .button{vertical-align:middle}ul.products li.product .button.loading{opacity:.5}ul.products li.product .added_to_cart{margin-left:.5rem;font-size:.88889em;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif}.star-rating{overflow:hidden;position:relative;height:1em;line-height:1;font-size:1em;width:5.4em;font-family:star}.star-rating::before{content:'\73\73\73\73\73';float:left;top:0;left:0;position:absolute}.star-rating span{overflow:hidden;float:left;top:0;left:0;position:absolute;padding-top:1.5em}.star-rating span::before{content:'\53\53\53\53\53';top:0;position:absolute;left:0}a.remove{display:inline-block;width:20px;height:20px;line-height:17px;font-size:20px;font-weight:700;text-align:center;border-radius:100%;text-decoration:none!important;background:#b22222;color:#fff}a.remove:hover{background:#000;color:#fff!important}.wc-item-meta,dl.variation{list-style:none outside}.wc-item-meta .wc-item-meta-label,.wc-item-meta dt,dl.variation .wc-item-meta-label,dl.variation dt{float:left;clear:both;margin-right:.25rem;list-style:none outside}.wc-item-meta dd,dl.variation dd{margin:0}.wc-item-meta p,.wc-item-meta:last-child,dl.variation p,dl.variation:last-child{margin-bottom:0}.single-product div.product{position:relative}.single-product .single-featured-image-header{display:none}.single-product .entry .entry-title{margin-top:0}.single-product .entry .entry-title:before{margin-top:0}.single-product .summary p.price{margin-bottom:2rem}.single-product .woocommerce-product-rating{margin-bottom:2rem;line-height:1}.single-product .woocommerce-product-rating .star-rating{float:left;margin-right:.25rem}.single-product form.cart .quantity{float:left;margin-right:.5rem}.single-product form.cart input{width:5em}.single-product .woocommerce-variation-add-to-cart .button{padding-top:.72rem;padding-bottom:.72rem}.single-product .woocommerce-variation-add-to-cart .button.disabled{opacity:.2}table.variations label{margin:0}table.variations select{margin-right:.5rem}.woocommerce-product-gallery{position:relative;margin-bottom:3rem}.woocommerce-product-gallery figure{margin:0;padding:0}.woocommerce-product-gallery .woocommerce-product-gallery__wrapper{margin:0;padding:0}.woocommerce-product-gallery .zoomImg{background-color:#fff;opacity:0}.woocommerce-product-gallery .woocommerce-product-gallery__image--placeholder{border:1px solid #f2f2f2}.woocommerce-product-gallery .woocommerce-product-gallery__image:nth-child(n+2){width:25%;display:inline-block}.woocommerce-product-gallery .flex-control-thumbs li{list-style:none;cursor:pointer;float:left}.woocommerce-product-gallery .flex-control-thumbs img{opacity:.5}.woocommerce-product-gallery .flex-control-thumbs img.flex-active,.woocommerce-product-gallery .flex-control-thumbs img:hover{opacity:1}.woocommerce-product-gallery img{display:block;height:auto}.woocommerce-product-gallery--columns-3 .flex-control-thumbs li{width:33.3333%}.woocommerce-product-gallery--columns-3 .flex-control-thumbs li:nth-child(3n+1){clear:left}.woocommerce-product-gallery--columns-4 .flex-control-thumbs li{width:25%}.woocommerce-product-gallery--columns-4 .flex-control-thumbs li:nth-child(4n+1){clear:left}.woocommerce-product-gallery--columns-5 .flex-control-thumbs li{width:20%}.woocommerce-product-gallery--columns-5 .flex-control-thumbs li:nth-child(5n+1){clear:left}.woocommerce-product-gallery__trigger{position:absolute;top:1rem;right:1rem;z-index:99}.woocommerce-tabs{margin:0 0 2rem}.woocommerce-tabs ul{margin:0 0 1.5rem;padding:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif}.woocommerce-tabs ul li{margin-right:1rem}.woocommerce-tabs ul li a{color:#111;text-decoration:none;font-weight:700}.woocommerce-tabs ul li.active a{color:#0073aa;box-shadow:0 2px 0 #0073aa}.woocommerce-tabs .panel>*{margin-top:0!important}.woocommerce-tabs .panel h1:before,.woocommerce-tabs .panel h2:before{content:none}.woocommerce-tabs .panel h2:first-of-type{font-size: 1em;margin:0 0 1rem}.woocommerce-tabs #comments{padding-top:0}.woocommerce-tabs .comment-reply-title{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif;font-size:1em;font-weight:700;margin:0 0 .75rem;display:block}.woocommerce-tabs #reviews ol.commentlist{padding:0}.woocommerce-tabs #reviews li.comment,.woocommerce-tabs #reviews li.review{list-style:none;margin-right:0;margin-bottom:2.5rem}.woocommerce-tabs #reviews li.comment .avatar,.woocommerce-tabs #reviews li.review .avatar{max-height:36px;width:auto;float:right}.woocommerce-tabs #reviews li.comment p.meta,.woocommerce-tabs #reviews li.review p.meta{margin-bottom:.5em}.woocommerce-tabs #reviews p.stars{margin-top:0}.woocommerce-tabs #reviews p.stars a{position:relative;height:1em;width:1em;text-indent:-999em;display:inline-block;text-decoration:none;box-shadow:none}.woocommerce-tabs #reviews p.stars a::before{display:block;position:absolute;top:0;left:0;width:1em;height:1em;line-height:1;font-family:WooCommerce;content:'\e021';text-indent:0}.woocommerce-tabs #reviews p.stars a:hover~a::before{content:'\e021'}.woocommerce-tabs #reviews p.stars:hover a::before{content:'\e020'}.woocommerce-tabs #reviews p.stars.selected a.active::before{content:'\e020'}.woocommerce-tabs #reviews p.stars.selected a.active~a::before{content:'\e021'}.woocommerce-tabs #reviews p.stars.selected a:not(.active)::before{content:'\e020'}.widget.woocommerce ul{padding-left:0}.widget.woocommerce ul li{list-style:none}.site-footer .widget .product_list_widget,.widget .product_list_widget{margin-bottom:1.5rem}.site-footer .widget .product_list_widget a,.widget .product_list_widget a{display:block;box-shadow:none}.site-footer .widget .product_list_widget a:hover,.widget .product_list_widget a:hover{box-shadow:none}.site-footer .widget .product_list_widget li,.widget .product_list_widget li{padding:.5rem 0}.site-footer .widget .product_list_widget li a.remove,.widget .product_list_widget li a.remove{float:left;margin-top:7px;line-height:20px;color:#fff;margin-right:.5rem}.site-footer .widget .product_list_widget img,.widget .product_list_widget img{display:none}.widget_shopping_cart .buttons a{display:inline-block;margin:0 .5rem 0 0}.widget_layered_nav .chosen:before{content:"×";display:inline-block;width:16px;height:16px;line-height:16px;font-size:16px;text-align:center;border-radius:100%;border:1px solid #000;margin-right:.25rem}.widget_price_filter .price_slider{margin-bottom:1rem}.widget_price_filter .price_slider_amount{text-align:right;line-height:2.4;font-size:.8751em}.widget_price_filter .price_slider_amount .button{float:left;padding:.4rem 1rem}.widget_price_filter .ui-slider{position:relative;text-align:left;margin-left:.5rem;margin-right:.5rem}.widget_price_filter .ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1em;height:1em;background-color:#000;border-radius:1em;cursor:ew-resize;outline:0;top:-.3em;margin-left:-.5em}.widget_price_filter .ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;border-radius:1em;background-color:#000}.widget_price_filter .price_slider_wrapper .ui-widget-content{border-radius:1em;background-color:#666;border:0}.widget_price_filter .ui-slider-horizontal{height:.5em}.widget_price_filter .ui-slider-horizontal .ui-slider-range{top:0;height:100%}.widget_price_filter .ui-slider-horizontal .ui-slider-range-min{left:-1px}.widget_price_filter .ui-slider-horizontal .ui-slider-range-max{right:-1px}.widget_rating_filter li{text-align:right}.widget_rating_filter li .star-rating{float:left;margin-top:.3rem}.widget_product_search form{position:relative}.widget_product_search .search-field{padding-right:100px}.widget_product_search input[type=submit]{position:absolute;top:.5rem;right:.5rem;padding-left:1rem;padding-right:1rem}.woocommerce-account .woocommerce-MyAccount-navigation{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif;margin:0 0 2rem}.woocommerce-account .woocommerce-MyAccount-navigation ul{margin:0;padding:0}.woocommerce-account .woocommerce-MyAccount-navigation li{list-style:none;padding:.5rem 0;border-bottom:1px solid #ccc}.woocommerce-account .woocommerce-MyAccount-navigation li:first-child{padding-top:0}.woocommerce-account .woocommerce-MyAccount-navigation li a{box-shadow:none;text-decoration:none;font-weight:600}.woocommerce-account .woocommerce-MyAccount-navigation li a:hover{color:#005177;text-decoration:underline}.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a{text-decoration:underline}.woocommerce-account table.account-orders-table .button{margin:0 .35rem .35rem 0}.woocommerce-cart-form img{max-width:42px;height:auto;display:block}.woocommerce-cart-form dl.variation{margin-top:0}.woocommerce-cart-form dl.variation p,.woocommerce-cart-form dl.variation:last-child{margin-bottom:0}.woocommerce-cart-form .product-remove{text-align:center}.woocommerce-cart-form .actions .input-text{width:200px!important;float:left;margin-right:.25rem}.woocommerce-cart-form .quantity input{width:4rem}.cart_totals td,.cart_totals th{vertical-align:top}.cart_totals th{padding-right:1rem}.cart_totals .woocommerce-shipping-destination{margin-bottom:0}.shipping-calculator-button{margin-top:.5rem;display:inline-block}.shipping-calculator-form{margin:1rem 0 0 0}#shipping_method{list-style:none;margin:0;padding:0}#shipping_method li{margin-bottom:.5rem}#shipping_method li input{float:left;margin-top:.17rem}#shipping_method li label{line-height:1.5rem}.checkout-button{display:block;padding:1rem 2rem;border:2px solid #000;text-align:center;font-weight:800}.checkout-button:hover{border-color:#999}.checkout-button:after{content:"→";margin-left:.5rem}#ship-to-different-address{font-size:1em;display:inline-block}#ship-to-different-address label{font-weight:300;cursor:pointer}#ship-to-different-address label span{position:relative;display:block;text-align:right;padding-right:45px}#ship-to-different-address label span:before{content:"";display:block;height:16px;width:30px;border:2px solid #bbb;background:#bbb;border-radius:13rem;box-sizing:content-box;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s;position:absolute;top:4px;right:0}#ship-to-different-address label span:after{content:"";display:block;width:14px;height:14px;background:#fff;position:absolute;top:7px;right:17px;border-radius:13rem;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s}#ship-to-different-address label input[type=checkbox]{display:none}#ship-to-different-address label input[type=checkbox]:checked+span:after{right:3px}#ship-to-different-address label input[type=checkbox]:checked+span:before{border-color:#000;background:#000}.woocommerce-no-js form.woocommerce-form-coupon,.woocommerce-no-js form.woocommerce-form-login{display:block!important}.woocommerce-no-js .showcoupon,.woocommerce-no-js .woocommerce-form-coupon-toggle,.woocommerce-no-js .woocommerce-form-login-toggle{display:none!important}.woocommerce-terms-and-conditions{border:1px solid rgba(0,0,0,.2);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background:rgba(0,0,0,.05)}.woocommerce-terms-and-conditions-link{display:inline-block}.woocommerce-terms-and-conditions-link:after{content:"";display:inline-block;border-style:solid;margin-bottom:2px;margin-left:.25rem;border-width:6px 6px 0 6px;border-color:#111 transparent transparent transparent}.woocommerce-terms-and-conditions-link.woocommerce-terms-and-conditions-link--open:after{border-width:0 6px 6px 6px;border-color:transparent transparent #111 transparent}.woocommerce-checkout .woocommerce-input-wrapper .description{background:#4169e1;color:#fff;border-radius:3px;padding:1rem;margin:.5rem 0 0;clear:both;display:none;position:relative}.woocommerce-checkout .woocommerce-input-wrapper .description a{color:#fff;text-decoration:underline;border:0;box-shadow:none}.woocommerce-checkout .woocommerce-input-wrapper .description:before{left:50%;top:0;margin-top:-4px;-webkit-transform:translatex(-50%) rotate(180deg);-ms-transform:translatex(-50%) rotate(180deg);transform:translatex(-50%) rotate(180deg);content:"";position:absolute;border-width:4px 6px 0 6px;border-style:solid;border-color:#4169e1 transparent transparent transparent;z-index:100;display:block}.woocommerce-checkout .select2-choice,.woocommerce-checkout .select2-choice:hover{box-shadow:none!important}.woocommerce-checkout .select2-choice{padding:.7rem 0 .7rem .7rem}.woocommerce-checkout .select2-container .select2-selection--single{height:48px}.woocommerce-checkout .select2-container .select2-selection--single .select2-selection__rendered{line-height:48px}.woocommerce-checkout .select2-container--default .select2-selection--single .select2-selection__arrow{height:46px}.woocommerce-checkout .select2-container--focus .select2-selection{border-color:#000}.woocommerce-checkout-review-order-table td{padding:1rem .5rem}.woocommerce-checkout-review-order-table dl.variation{margin:0}.woocommerce-checkout-review-order-table dl.variation p{margin:0}.woocommerce-checkout-review-order ul{margin:2rem 0 1rem;padding-left:0}.wc_payment_method{list-style:none}.wc_payment_method .payment_box{padding:1rem;background:#eee}.wc_payment_method .payment_box ol:last-of-type,.wc_payment_method .payment_box ul:last-of-type{margin-bottom:0}.wc_payment_method .payment_box fieldset{padding:1.5rem;padding-bottom:0;border:0;background:#f6f6f6}.wc_payment_method .payment_box li{list-style:none}.wc_payment_method .payment_box p:first-child{margin-top:0}.wc_payment_method .payment_box p:last-child{margin-bottom:0}.wc_payment_method>label:first-of-type{display:block;margin:1rem 0}.wc_payment_method>label:first-of-type img{max-height:24px;max-width:200px;float:right}.wc_payment_method label{cursor:pointer}.wc_payment_method input.input-radio[name=payment_method]{display:none}.wc_payment_method input.input-radio[name=payment_method]+label:before{content:"";display:inline-block;width:16px;height:16px;border:2px solid #fff;box-shadow:0 0 0 2px #000;background:#fff;margin-left:4px;margin-right:.5rem;border-radius:100%;-webkit-transform:translateY(2px);-ms-transform:translateY(2px);transform:translateY(2px)}.wc_payment_method input.input-radio[name=payment_method]:checked+label:before{background:#000}.woocommerce-order-overview{margin-bottom:2rem}.woocommerce-table--order-details{margin-bottom:2rem}.woocommerce .content-area .site-main{margin:calc(2 * 1rem) 1rem}@media only screen and (max-width:768px){.woocommerce table.shop_table_responsive tr,.woocommerce-page table.shop_table_responsive tr{margin:0 0 1.5rem}.woocommerce table.shop_table_responsive tr:first-child,.woocommerce-page table.shop_table_responsive tr:first-child{border-top:1px solid}.woocommerce table.shop_table_responsive tr:last-child,.woocommerce-page table.shop_table_responsive tr:last-child{margin-bottom:0}.woocommerce table.shop_table_responsive tr td,.woocommerce-page table.shop_table_responsive tr td{border-bottom-width:0}.woocommerce table.shop_table_responsive tr td:last-child,.woocommerce-page table.shop_table_responsive tr td:last-child{border-bottom-width:1px}}@media only screen and (min-width:768px){.woocommerce table.shop_table tbody tr,.woocommerce-page table.shop_table tbody tr{font-size:.88889em}.woocommerce-products-header__title.page-title{font-size:2.25em}.woocommerce-pagination .next.page-numbers,.woocommerce-pagination .prev.page-numbers,.woocommerce-pagination a.page-numbers,.woocommerce-pagination span.page-numbers{padding:1rem}.woocommerce-account .woocommerce-MyAccount-navigation{float:none;width:100%;margin-bottom:1.5rem}.woocommerce-account .woocommerce-MyAccount-navigation li{display:inline-block;margin:0 1rem 0 0;padding:0;border-bottom:0}.woocommerce-account .woocommerce-MyAccount-navigation li:last-child{margin-right:0}.woocommerce-account .woocommerce-MyAccount-content{float:none;width:100%}#ship-to-different-address{display:block}.woocommerce .content-area{margin:0 calc(10% + 60px)}.woocommerce .content-area .site-main{margin:0;max-width:calc(8 * (100vw / 12) - 28px)}.single-product .entry .entry-content,.single-product .entry .entry-summary{max-width:none;margin:0 0 3rem;padding:0}.single-product .entry .entry-content>*,.single-product .entry .entry-summary>*{max-width:none}}@media only screen and (min-width:1168px){.woocommerce .content-area .site-main{max-width:calc(6 * (100vw / 12) - 28px)}}
\ No newline at end of file
diff --git a/assets/css/twenty-nineteen.scss b/assets/css/twenty-nineteen.scss
new file mode 100644
index 00000000000..ad244322002
--- /dev/null
+++ b/assets/css/twenty-nineteen.scss
@@ -0,0 +1,1374 @@
+@import 'mixins';
+
+/**
+ * Sass variables
+ */
+
+$headings: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif;
+$body: "NonBreakingSpaceOverride", "Hoefler Text", "Baskerville Old Face", Garamond, "Times New Roman", serif;
+
+$body-color: #111;
+$highlights-color: #0073aa;
+
+/**
+ * Fonts
+ */
+ @font-face {
+ font-family: 'star';
+ src: url('../fonts/star.eot');
+ src: url('../fonts/star.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/star.woff') format('woff'),
+ url('../fonts/star.ttf') format('truetype'),
+ url('../fonts/star.svg#star') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+@font-face {
+ font-family: 'WooCommerce';
+ src: url('../fonts/WooCommerce.eot');
+ src: url('../fonts/WooCommerce.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/WooCommerce.woff') format('woff'),
+ url('../fonts/WooCommerce.ttf') format('truetype'),
+ url('../fonts/WooCommerce.svg#WooCommerce') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+/**
+ * Global elements
+ */
+a.button {
+ display: inline-block;
+ text-align: center;
+ box-sizing: border-box;
+ word-break: break-all;
+ color: #fff;
+ text-decoration: none !important;
+
+ &:hover,
+ &:visited {
+ color: #fff;
+ }
+}
+
+.woocommerce {
+ form .form-row {
+ .required {
+ color: firebrick;
+ text-decoration: none;
+ visibility: hidden; // Only show optional by default.
+
+ &[title] {
+ border: 0 !important;
+ }
+ }
+
+ .optional {
+ visibility: visible;
+ }
+ }
+}
+
+.woocommerce-breadcrumb {
+ margin-bottom: 3rem;
+ font-size: 0.88889em;
+ font-family: $headings;
+}
+
+.woocommerce-pagination {
+ font-family: $headings;
+ font-size: 0.88889em;
+
+ ul.page-numbers {
+ margin: 0;
+ padding: 0;
+ display: block;
+ font-weight: 700;
+ letter-spacing: -0.02em;
+ line-height: 1.2;
+ }
+
+ span.page-numbers,
+ a.page-numbers,
+ .next.page-numbers,
+ .prev.page-numbers {
+ padding: 0 calc(.5 * 1rem);
+ display: inline-block;
+ }
+}
+
+.onsale {
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: inline-block;
+ background: $highlights-color;
+ color: #fff;
+ display: inline-block;
+ font-family: $headings;
+ font-size: 0.71111em;
+ font-weight: 700;
+ letter-spacing: -0.02em;
+ line-height: 1.2;
+ padding: 0.5rem;
+ position: absolute;
+ text-transform: uppercase;
+ top: 0;
+ z-index: 1;
+}
+
+.price {
+ font-family: $headings;
+
+ del {
+ opacity: 0.5;
+ display: inline-block;
+ }
+ ins {
+ display: inline-block;
+ }
+}
+
+.woocommerce-message,
+.woocommerce-error,
+.woocommerce-info {
+ margin-bottom: 1.5rem;
+ padding: 1rem;
+ background: #eee;
+ font-size: 0.88889em;
+ font-family: $headings;
+ list-style: none;
+ overflow: hidden;
+}
+
+.woocommerce-message {
+ background: #eee;
+ color: $body-color;
+}
+
+.woocommerce-error,
+.woocommerce-info {
+ color: #fff;
+
+ a {
+ color: #fff;
+
+ &:hover {
+ color: #fff;
+ }
+
+ &.button {
+ background: #111;
+ }
+ }
+}
+
+.woocommerce-error {
+ background: firebrick;
+}
+
+.woocommerce-info {
+ background: $highlights-color;
+}
+
+.woocommerce-store-notice {
+ background: $highlights-color;
+ color: #fff;
+ padding: 1rem;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ z-index: 999;
+}
+
+.admin-bar .woocommerce-store-notice {
+ top: 32px;
+}
+
+.woocommerce-store-notice__dismiss-link {
+ float: right;
+ color: #fff;
+
+ &:hover {
+ text-decoration: underline;
+ color: #fff;
+ }
+}
+
+/**
+* Tables
+*/
+.woocommerce,
+.woocommerce-page {
+ table.shop_table {
+ td, th {
+ word-break: normal;
+ }
+ }
+}
+
+/**
+ * Shop page
+ */
+.woocommerce-products-header__title.page-title {
+ font-size: 1.6875em;
+ font-weight: 700;
+ font-family: $headings;
+}
+
+.woocommerce-result-count {
+ margin: 0;
+ padding: 0.75rem 0;
+}
+
+/**
+ * Products
+ */
+ul.products {
+ margin: 0;
+ padding: 0;
+
+ li.product {
+ list-style: none;
+
+ .woocommerce-loop-product__link {
+ display: block;
+ }
+
+ .woocommerce-loop-product__title {
+ margin: 0.8rem 0;
+ font-size: 0.88889em;
+
+ &:before {
+ content: none;
+ }
+ }
+
+ .woocommerce-loop-product__title,
+ .price,
+ .star-rating {
+ color: $body-color;
+ }
+
+ .star-rating {
+ margin-bottom: 0.8rem;
+ }
+
+ .price {
+ margin-bottom: 1.3rem;
+ }
+
+ .price,
+ .star-rating {
+ display: block;
+ font-size: 0.88889em;
+ }
+
+ .woocommerce-placeholder {
+ border: 1px solid #F2F2F2;
+ }
+
+ .button {
+ vertical-align: middle;
+
+ &.loading {
+ opacity: 0.5;
+ }
+ }
+
+ .added_to_cart {
+ margin-left: 0.5rem;
+ font-size: 0.88889em;
+ font-family: $headings;
+ }
+ }
+}
+
+.star-rating {
+ overflow: hidden;
+ position: relative;
+ height: 1em;
+ line-height: 1;
+ font-size: 1em;
+ width: 5.4em;
+ font-family: 'star';
+
+ &::before {
+ content: '\73\73\73\73\73';
+ float: left;
+ top: 0;
+ left: 0;
+ position: absolute;
+ }
+
+ span {
+ overflow: hidden;
+ float: left;
+ top: 0;
+ left: 0;
+ position: absolute;
+ padding-top: 1.5em;
+ }
+
+ span::before {
+ content: '\53\53\53\53\53';
+ top: 0;
+ position: absolute;
+ left: 0;
+ }
+}
+
+a.remove {
+ display: inline-block;
+ width: 20px;
+ height: 20px;
+ line-height: 17px;
+ font-size: 20px;
+ font-weight: 700;
+ text-align: center;
+ border-radius: 100%;
+ text-decoration: none !important;
+ background: firebrick;
+ color: #fff;
+
+ &:hover {
+ background: #000;
+ color: #fff !important;
+ }
+}
+
+dl.variation, .wc-item-meta {
+ list-style: none outside;
+
+ dt, .wc-item-meta-label {
+ float: left;
+ clear: both;
+ margin-right: 0.25rem;
+ list-style: none outside;
+ }
+
+ dd {
+ margin: 0;
+ }
+
+ p,
+ &:last-child {
+ margin-bottom: 0;
+ }
+}
+
+/**
+ * Single product
+ */
+.single-product {
+ div.product {
+ position: relative;
+ }
+
+ .single-featured-image-header {
+ display: none;
+ }
+
+ .entry {
+ .entry-title {
+ margin-top: 0;
+
+ &:before {
+ margin-top: 0;
+ }
+ }
+ }
+
+ .summary {
+ p.price {
+ margin-bottom: 2rem;
+ }
+ }
+
+ .woocommerce-product-rating {
+ margin-bottom: 2rem;
+ line-height: 1;
+
+ .star-rating {
+ float: left;
+ margin-right: 0.25rem;
+ }
+ }
+
+ form.cart {
+ .quantity {
+ float: left;
+ margin-right: 0.5rem;
+ }
+
+ input {
+ width: 5em;
+ }
+ }
+
+ .woocommerce-variation-add-to-cart {
+ .button {
+ padding-top: 0.72rem;
+ padding-bottom: 0.72rem;
+ }
+
+ .button.disabled {
+ opacity: 0.2;
+ }
+ }
+}
+
+table.variations {
+ label {
+ margin: 0;
+ }
+
+ select {
+ margin-right: 0.5rem;
+ }
+}
+
+.woocommerce-product-gallery {
+ position: relative;
+ margin-bottom: 3rem;
+
+ figure {
+ margin: 0;
+ padding: 0;
+ }
+
+ .woocommerce-product-gallery__wrapper {
+ margin: 0;
+ padding: 0;
+ }
+
+ .zoomImg {
+ background-color: #fff;
+ opacity: 0;
+ }
+
+ .woocommerce-product-gallery__image--placeholder {
+ border: 1px solid #F2F2F2;
+ }
+
+ .woocommerce-product-gallery__image:nth-child(n+2) {
+ width: 25%;
+ display: inline-block;
+ }
+
+ .flex-control-thumbs {
+ li {
+ list-style: none;
+ cursor: pointer;
+ float: left;
+ }
+
+ img {
+ opacity: 0.5;
+
+ &:hover,
+ &.flex-active {
+ opacity: 1;
+ }
+ }
+ }
+
+ img {
+ display: block;
+ height: auto;
+ }
+}
+
+.woocommerce-product-gallery--columns-3 {
+ .flex-control-thumbs li {
+ width: 33.3333%;
+ }
+
+ .flex-control-thumbs li:nth-child(3n+1) {
+ clear: left;
+ }
+}
+
+.woocommerce-product-gallery--columns-4 {
+ .flex-control-thumbs li {
+ width: 25%;
+ }
+
+ .flex-control-thumbs li:nth-child(4n+1) {
+ clear: left;
+ }
+}
+
+.woocommerce-product-gallery--columns-5 {
+ .flex-control-thumbs li {
+ width: 20%;
+ }
+
+ .flex-control-thumbs li:nth-child(5n+1) {
+ clear: left;
+ }
+}
+
+.woocommerce-product-gallery__trigger {
+ position: absolute;
+ top: 1rem;
+ right: 1rem;
+ z-index: 99;
+}
+
+.woocommerce-tabs {
+ margin: 0 0 2rem;
+
+ ul {
+ margin: 0 0 1.5rem;
+ padding: 0;
+ font-family: $headings;
+
+ li {
+ margin-right: 1rem;
+
+ a {
+ color: $body-color;
+ text-decoration: none;
+ font-weight: 700;
+ }
+
+ &.active {
+ a {
+ color: $highlights-color;
+ box-shadow: 0 2px 0 $highlights-color;
+ }
+ }
+ }
+ }
+
+ .panel {
+ > * {
+ margin-top: 0 !important;
+ }
+
+ h1,
+ h2 {
+ &:before {
+ content: none;
+ }
+ }
+
+ h2:first-of-type {
+ font-size: 1em;
+ margin: 0 0 1rem;
+ }
+ }
+
+ #comments {
+ padding-top: 0;
+ }
+
+ .comment-reply-title {
+ font-family: $headings;
+ font-size: 1em;
+ font-weight: bold;
+ margin: 0 0 0.75rem;
+ display: block;
+ }
+
+ #reviews {
+ ol.commentlist {
+ padding: 0;
+ }
+
+ li.review,
+ li.comment {
+ list-style: none;
+ margin-right: 0;
+ margin-bottom: 2.5rem;
+
+ .avatar {
+ max-height: 36px;
+ width: auto;
+ float: right;
+ }
+
+ p.meta {
+ margin-bottom: 0.5em;
+ }
+ }
+
+ p.stars {
+ margin-top: 0;
+
+ a {
+ position: relative;
+ height: 1em;
+ width: 1em;
+ text-indent: -999em;
+ display: inline-block;
+ text-decoration: none;
+ box-shadow: none;
+
+ &::before {
+ display: block;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 1em;
+ height: 1em;
+ line-height: 1;
+ font-family: 'WooCommerce';
+ content: '\e021';
+ text-indent: 0;
+ }
+
+ &:hover {
+ ~ a::before {
+ content: '\e021';
+ }
+ }
+ }
+
+ &:hover {
+ a {
+ &::before {
+ content: '\e020';
+ }
+ }
+ }
+
+ &.selected {
+ a.active {
+ &::before {
+ content: '\e020';
+ }
+
+ ~ a::before {
+ content: '\e021';
+ }
+ }
+
+ a:not( .active ) {
+ &::before {
+ content: '\e020';
+ }
+ }
+ }
+ }
+ }
+}
+
+/**
+ * Widgets
+ */
+.widget.woocommerce {
+ ul {
+ padding-left: 0;
+
+ li {
+ list-style: none;
+ }
+ }
+}
+
+.widget .product_list_widget,
+.site-footer .widget .product_list_widget {
+ margin-bottom: 1.5rem;
+
+ a {
+ display: block;
+ box-shadow: none;
+
+ &:hover {
+ box-shadow: none;
+ }
+ }
+
+ li {
+ padding: 0.5rem 0;
+
+ a.remove {
+ float: left;
+ margin-top: 7px;
+ line-height: 20px;
+ color: #fff;
+ margin-right: .5rem;
+ }
+ }
+
+ img {
+ display: none;
+ }
+}
+
+.widget_shopping_cart {
+ .buttons {
+ a {
+ display: inline-block;
+ margin: 0 0.5rem 0 0;
+ }
+ }
+}
+
+.widget_layered_nav {
+ .chosen {
+ &:before {
+ content: "×";
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ line-height: 16px;
+ font-size: 16px;
+ text-align: center;
+ border-radius: 100%;
+ border: 1px solid black;
+ margin-right: 0.25rem;
+ }
+ }
+}
+
+.widget_price_filter {
+ .price_slider {
+ margin-bottom: 1rem;
+ }
+
+ .price_slider_amount {
+ text-align: right;
+ line-height: 2.4;
+ font-size: 0.8751em;
+
+ .button {
+ float: left;
+ padding: 0.4rem 1rem;
+ }
+ }
+
+ .ui-slider {
+ position: relative;
+ text-align: left;
+ margin-left: 0.5rem;
+ margin-right: 0.5rem;
+ }
+
+ .ui-slider .ui-slider-handle {
+ position: absolute;
+ z-index: 2;
+ width: 1em;
+ height: 1em;
+ background-color: #000;
+ border-radius: 1em;
+ cursor: ew-resize;
+ outline: none;
+ top: -0.3em;
+ margin-left: -0.5em;
+ }
+
+ .ui-slider .ui-slider-range {
+ position: absolute;
+ z-index: 1;
+ font-size: 0.7em;
+ display: block;
+ border: 0;
+ border-radius: 1em;
+ background-color: #000;
+ }
+
+ .price_slider_wrapper .ui-widget-content {
+ border-radius: 1em;
+ background-color: #666;
+ border: 0;
+ }
+
+ .ui-slider-horizontal {
+ height: 0.5em;
+ }
+
+ .ui-slider-horizontal .ui-slider-range {
+ top: 0;
+ height: 100%;
+ }
+
+ .ui-slider-horizontal .ui-slider-range-min {
+ left: -1px;
+ }
+
+ .ui-slider-horizontal .ui-slider-range-max {
+ right: -1px;
+ }
+ }
+
+.widget_rating_filter {
+ li {
+ text-align: right;
+
+ .star-rating {
+ float: left;
+ margin-top: 0.3rem;
+ }
+ }
+}
+
+.widget_product_search {
+ form {
+ position: relative;
+ }
+
+ .search-field {
+ padding-right: 100px;
+ }
+
+ input[type=submit] {
+ position: absolute;
+ top: 0.5rem;
+ right: 0.5rem;
+ padding-left: 1rem;
+ padding-right: 1rem;
+ }
+}
+
+/**
+ * Account section
+ */
+ .woocommerce-account {
+ .woocommerce-MyAccount-navigation {
+ font-family: $headings;
+ margin: 0 0 2rem;
+
+ ul {
+ margin: 0;
+ padding: 0;
+ }
+
+ li {
+ list-style: none;
+ padding: 0.5rem 0;
+ border-bottom: 1px solid #ccc;
+
+ &:first-child {
+ padding-top: 0;
+ }
+
+ a {
+ box-shadow: none;
+ text-decoration: none;
+ font-weight: 600;
+
+ &:hover {
+ color: #005177;
+ text-decoration: underline;
+ }
+ }
+
+ &.is-active {
+ a {
+ text-decoration: underline;
+ }
+ }
+ }
+ }
+
+ table.account-orders-table {
+ .button {
+ margin: 0 .35rem .35rem 0;
+ }
+ }
+}
+
+/**
+ * Cart
+ */
+ .woocommerce-cart-form {
+ img {
+ max-width: 42px;
+ height: auto;
+ display: block;
+ }
+
+ dl.variation {
+ margin-top: 0;
+
+ p,
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+
+ .product-remove {
+ text-align: center;
+ }
+
+ .actions {
+ .input-text {
+ width: 200px !important;
+ float: left;
+ margin-right: 0.25rem;
+ }
+ }
+
+ .quantity {
+ input {
+ width: 4rem;
+ }
+ }
+}
+
+.cart_totals {
+ th, td {
+ vertical-align: top;
+ }
+
+ th {
+ padding-right: 1rem;
+ }
+
+ .woocommerce-shipping-destination {
+ margin-bottom: 0;
+ }
+}
+
+.shipping-calculator-button {
+ margin-top: 0.5rem;
+ display: inline-block;
+}
+
+.shipping-calculator-form {
+ margin: 1rem 0 0 0;
+}
+
+#shipping_method {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+
+ li {
+ margin-bottom: 0.5rem;
+
+ input {
+ float: left;
+ margin-top: 0.17rem;
+ }
+
+ label {
+ line-height: 1.5rem;
+ }
+ }
+}
+
+.checkout-button {
+ display: block;
+ padding: 1rem 2rem;
+ border: 2px solid #000;
+ text-align: center;
+ font-weight: 800;
+
+ &:hover {
+ border-color: #999;
+ }
+
+ &:after {
+ content: "→";
+ margin-left: .5rem;
+ }
+}
+
+/**
+ * Checkout
+ */
+ #ship-to-different-address {
+ font-size: 1em;
+ display: inline-block;
+
+ label {
+ font-weight: 300;
+ cursor: pointer;
+
+ span {
+ position: relative;
+ display: block;
+ text-align: right;
+ padding-right: 45px;
+
+ &:before {
+ content: "";
+ display: block;
+ height: 16px;
+ width: 30px;
+ border: 2px solid #bbb;
+ background: #bbb;
+ border-radius: 13rem;
+ box-sizing: content-box;
+ transition: all ease-in-out 0.3s;
+ position: absolute;
+ top: 4px;
+ right: 0;
+ }
+
+ &:after {
+ content: "";
+ display: block;
+ width: 14px;
+ height: 14px;
+ background: white;
+ position: absolute;
+ top: 7px;
+ right: 17px;
+ border-radius: 13rem;
+ transition: all ease-in-out 0.3s;
+ }
+ }
+
+ input[type=checkbox] {
+ display: none;
+ }
+
+ input[type=checkbox]:checked + span:after {
+ right: 3px;
+ }
+
+ input[type=checkbox]:checked + span:before {
+ border-color: #000;
+ background: #000;
+ }
+ }
+}
+
+.woocommerce-no-js {
+ form.woocommerce-form-login,
+ form.woocommerce-form-coupon {
+ display: block !important;
+ }
+ .woocommerce-form-login-toggle,
+ .woocommerce-form-coupon-toggle,
+ .showcoupon {
+ display: none !important;
+ }
+}
+
+.woocommerce-terms-and-conditions {
+ border: 1px solid rgba(0,0,0,.2);
+ box-shadow: inset 0 1px 2px rgba(0,0,0,.1);
+ background: rgba(0,0,0,.05);
+}
+
+.woocommerce-terms-and-conditions-link {
+ display: inline-block;
+
+ &:after {
+ content: "";
+ display: inline-block;
+ border-style: solid;
+ margin-bottom: 2px;
+ margin-left: 0.25rem;
+ border-width: 6px 6px 0 6px;
+ border-color: $body-color transparent transparent transparent;
+ }
+ &.woocommerce-terms-and-conditions-link--open:after {
+ border-width: 0 6px 6px 6px;
+ border-color: transparent transparent $body-color transparent;
+ }
+}
+
+.woocommerce-checkout {
+ .woocommerce-input-wrapper {
+ .description {
+ background: royalblue;
+ color: #fff;
+ border-radius: 3px;
+ padding: 1rem;
+ margin: 0.5rem 0 0;
+ clear: both;
+ display: none;
+ position: relative;
+
+ a {
+ color: #fff;
+ text-decoration: underline;
+ border: 0;
+ box-shadow: none;
+ }
+
+ &:before {
+ left: 50%;
+ top: 0%;
+ margin-top: -4px;
+ transform: translatex(-50%) rotate(180deg);
+ content: "";
+ position: absolute;
+ border-width: 4px 6px 0 6px;
+ border-style: solid;
+ border-color: royalblue transparent transparent transparent;
+ z-index: 100;
+ display: block;
+ }
+ }
+ }
+
+ .select2-choice,
+ .select2-choice:hover {
+ box-shadow: none !important;
+ }
+ .select2-choice {
+ padding: 0.7rem 0 0.7rem 0.7rem;
+ }
+ .select2-container .select2-selection--single {
+ height: 48px;
+ }
+ .select2-container .select2-selection--single .select2-selection__rendered {
+ line-height: 48px;
+ }
+ .select2-container--default .select2-selection--single .select2-selection__arrow {
+ height: 46px;
+ }
+ .select2-container--focus .select2-selection {
+ border-color: black;
+ }
+}
+
+.woocommerce-checkout-review-order-table {
+ td {
+ padding: 1rem 0.5rem;
+ }
+
+ dl.variation {
+ margin: 0;
+
+ p {
+ margin: 0;
+ }
+ }
+}
+
+.woocommerce-checkout-review-order {
+ ul {
+ margin: 2rem 0 1rem;
+ padding-left: 0;
+ }
+}
+
+.wc_payment_method {
+ list-style: none;
+
+ .payment_box {
+ padding: 1rem;
+ background: #eee;
+
+ ul,
+ ol {
+ &:last-of-type {
+ margin-bottom: 0;
+ }
+ }
+
+ fieldset {
+ padding: 1.5rem;
+ padding-bottom: 0;
+ border: 0;
+ background: #f6f6f6;
+ }
+
+ li {
+ list-style: none;
+ }
+
+ p {
+ &:first-child {
+ margin-top: 0;
+ }
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+ }
+
+ > label:first-of-type {
+ display: block;
+ margin: 1rem 0;
+
+ img {
+ max-height: 24px;
+ max-width: 200px;
+ float: right;
+ }
+ }
+
+ label {
+ cursor: pointer;
+ }
+
+ input.input-radio[name=payment_method] {
+ display: none;
+
+ & + label {
+ &:before {
+ content: "";
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ border: 2px solid white;
+ box-shadow: 0 0 0 2px black;
+ background: white;
+ margin-left: 4px;
+ margin-right: 0.5rem;
+ border-radius: 100%;
+ transform: translateY(2px);
+ }
+ }
+
+ &:checked + label {
+ &:before {
+ background: black;
+ }
+ }
+ }
+}
+
+.woocommerce-order-overview {
+ margin-bottom: 2rem;
+}
+
+.woocommerce-table--order-details {
+ margin-bottom: 2rem;
+}
+
+/**
+ * Layout stuff
+ */
+ .woocommerce {
+ .content-area {
+ .site-main {
+ margin: calc(2 * 1rem) 1rem;
+ }
+ }
+}
+
+@media only screen and (max-width: 768px) {
+ .woocommerce,
+ .woocommerce-page {
+ table.shop_table_responsive {
+ tr {
+ margin: 0 0 1.5rem;
+
+ &:first-child {
+ border-top: 1px solid;
+ }
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+
+ td {
+ border-bottom-width: 0;
+
+ &:last-child {
+ border-bottom-width: 1px;
+ }
+ }
+ }
+ }
+ }
+}
+
+@media only screen and (min-width: 768px) {
+ /**
+ * Tables
+ */
+ .woocommerce,
+ .woocommerce-page {
+ table.shop_table {
+ tbody {
+ tr {
+ font-size: 0.88889em;
+ }
+ }
+ }
+ }
+
+ /**
+ * Shop page
+ */
+ .woocommerce-products-header__title.page-title {
+ font-size: 2.25em;
+ }
+
+ .woocommerce-pagination {
+ span.page-numbers,
+ a.page-numbers,
+ .next.page-numbers,
+ .prev.page-numbers {
+ padding: 1rem;
+ }
+ }
+
+ /**
+ * Account section
+ */
+ .woocommerce-account {
+ .woocommerce-MyAccount-navigation {
+ float: none;
+ width: 100%;
+ margin-bottom: 1.5rem;
+
+ li {
+ display: inline-block;
+ margin: 0 1rem 0 0;
+ padding: 0;
+ border-bottom: 0;
+
+ &:last-child {
+ margin-right: 0;
+ }
+ }
+ }
+
+ .woocommerce-MyAccount-content {
+ float: none;
+ width: 100%;
+ }
+ }
+
+ /**
+ * Checkout
+ */
+ #ship-to-different-address {
+ display: block;
+ }
+
+ /**
+ * Layout stuff
+ */
+ .woocommerce {
+ .content-area {
+ margin: 0 calc(10% + 60px);
+
+ .site-main {
+ margin: 0;
+ max-width: calc(8 * (100vw / 12) - 28px);
+ }
+ }
+ }
+
+ .single-product {
+ .entry {
+ .entry-content,
+ .entry-summary {
+ max-width: none;
+ margin: 0 0 3rem;
+ padding: 0;
+
+ > * {
+ max-width: none;
+ }
+ }
+ }
+ }
+}
+
+@media only screen and (min-width: 1168px) {
+ .woocommerce {
+ .content-area {
+ .site-main {
+ max-width: calc(6 * (100vw / 12) - 28px);
+ }
+ }
+ }
+}
diff --git a/assets/css/wc-setup-rtl.css b/assets/css/wc-setup-rtl.css
index 3e64e1fe052..6b2179baf75 100644
--- a/assets/css/wc-setup-rtl.css
+++ b/assets/css/wc-setup-rtl.css
@@ -1 +1 @@
-@charset "UTF-8";body{margin:65px auto 24px;box-shadow:none;background:#f1f1f1;padding:0}#wc-logo{border:0;margin:0 0 24px;padding:0;text-align:center}#wc-logo img{max-width:30%}.wc-setup{text-align:center}.wc-setup .select2-container{text-align:right}.wc-setup .hidden{display:none}.wc-setup-content{box-shadow:0 1px 3px rgba(0,0,0,.13);padding:2em;margin:0 0 20px;background:#fff;overflow:hidden;zoom:1;text-align:right}.wc-setup-content h1,.wc-setup-content h2,.wc-setup-content h3,.wc-setup-content table{margin:0 0 20px;border:0;padding:0;color:#666;clear:none;font-weight:500}.wc-setup-content p{margin:20px 0;font-size:1em;line-height:1.75em;color:#666}.wc-setup-content table{font-size:1em;line-height:1.75em;color:#666}.wc-setup-content a{color:#a16696}.wc-setup-content a:focus,.wc-setup-content a:hover{color:#111}.wc-setup-content .form-table th{width:35%;vertical-align:top;font-weight:400}.wc-setup-content .form-table td{vertical-align:top}.wc-setup-content .form-table td input,.wc-setup-content .form-table td select{width:100%;box-sizing:border-box}.wc-setup-content .form-table td input[size]{width:auto}.wc-setup-content .form-table td .description{line-height:1.5em;display:block;margin-top:.25em;color:#999;font-style:italic}.wc-setup-content .form-table td .input-checkbox,.wc-setup-content .form-table td .input-radio{width:auto;box-sizing:inherit;padding:inherit;margin:0 0 0 .5em;box-shadow:none}.wc-setup-content .form-table .section_title td{padding:0}.wc-setup-content .form-table .section_title td h2,.wc-setup-content .form-table .section_title td p{margin:12px 0 0}.wc-setup-content .form-table td,.wc-setup-content .form-table th{padding:12px 0;margin:0;border:0}.wc-setup-content .form-table td:first-child,.wc-setup-content .form-table th:first-child{padding-left:1em}.wc-setup-content table.tax-rates{width:100%;font-size:.92em}.wc-setup-content table.tax-rates th{padding:0;text-align:center;width:auto;vertical-align:middle}.wc-setup-content table.tax-rates td{border:1px solid #f5f5f5;padding:6px;text-align:center;vertical-align:middle}.wc-setup-content table.tax-rates td input{outline:0;border:0;padding:0;box-shadow:none;text-align:center;width:100%}.wc-setup-content table.tax-rates td.sort{cursor:move;color:#ccc}.wc-setup-content table.tax-rates td.sort::before{content:'\f333';font-family:dashicons}.wc-setup-content table.tax-rates td.readonly{background:#f5f5f5}.wc-setup-content table.tax-rates .add{padding:1em 1em 0 0;line-height:1em;font-size:1em;width:0;margin:6px 0 0;height:0;overflow:hidden;position:relative;display:inline-block}.wc-setup-content table.tax-rates .add::before{content:'\f502';font-family:dashicons;position:absolute;right:0;top:0}.wc-setup-content table.tax-rates .remove{padding:1em 1em 0 0;line-height:1em;font-size:1em;width:0;margin:0;height:0;overflow:hidden;position:relative;display:inline-block}.wc-setup-content table.tax-rates .remove::before{content:'\f182';font-family:dashicons;position:absolute;right:0;top:0}.wc-setup-content .wc-setup-pages{width:100%;border-top:1px solid #eee}.wc-setup-content .wc-setup-pages thead th{display:none}.wc-setup-content .wc-setup-pages .page-name{width:30%;font-weight:700}.wc-setup-content .wc-setup-pages td,.wc-setup-content .wc-setup-pages th{padding:14px 0;border-bottom:1px solid #eee}.wc-setup-content .wc-setup-pages td:first-child,.wc-setup-content .wc-setup-pages th:first-child{padding-left:9px}.wc-setup-content .wc-setup-pages th{padding-top:0}.wc-setup-content .wc-setup-pages .page-options p{color:#777;margin:6px 24px 0 0;line-height:1.75em}.wc-setup-content .wc-setup-pages .page-options p input{vertical-align:middle;margin:1px 0 0;height:1.75em;width:1.75em;line-height:1.75em}.wc-setup-content .wc-setup-pages .page-options p label{line-height:1}@media screen and (max-width:782px){.wc-setup-content .form-table tbody th{width:auto}}.wc-setup-content .twitter-share-button{float:left}.wc-setup-content .wc-setup-next-steps{overflow:hidden;margin:0 0 24px;padding-bottom:2px}.wc-setup-content .wc-setup-next-steps h2{margin-bottom:12px}.wc-setup-content .wc-setup-next-steps .wc-setup-next-steps-first{float:right;width:50%;box-sizing:border-box}.wc-setup-content .wc-setup-next-steps .wc-setup-next-steps-last{float:left;width:50%;box-sizing:border-box}.wc-setup-content .wc-setup-next-steps ul{padding:0 0 0 2em;list-style:none outside;margin:0}.wc-setup-content .wc-setup-next-steps ul li a{display:block;padding:0 0 .75em}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button{background-color:#f7f7f7;border-color:#ccc;color:#23282d;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #ccc;text-shadow:-1px 0 1px #eee,0 1px 1px #eee;font-size:1em;height:auto;line-height:1.75em;margin:0 0 .75em;opacity:1;padding:1em;text-align:center}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:active,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:focus,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:hover{background:#f5f5f5;border-color:#aaa}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary{color:#fff;background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,-1px 0 1px #a36597,0 1px 1px #a36597,1px 0 1px #a36597}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:active,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:focus,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:hover{color:#fff;background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.wc-setup-content .wc-setup-next-steps ul li a::before{color:#82878c;font:normal 20px/1 dashicons;speak:none;display:inline-block;padding:0 0 0 10px;top:1px;position:relative;text-decoration:none!important;vertical-align:top}.wc-setup-content .wc-setup-next-steps ul .learn-more a::before{content:'\f105'}.wc-setup-content .wc-setup-next-steps ul .video-walkthrough a::before{content:'\f126'}.wc-setup-content .wc-setup-next-steps ul .newsletter a::before{content:'\f465'}.wc-setup-content .updated,.wc-setup-content .woocommerce-newsletter{padding:24px 24px 0;margin:0 0 24px;overflow:hidden;background:#f5f5f5}.wc-setup-content .updated p,.wc-setup-content .woocommerce-newsletter p{padding:0;margin:0 0 12px}.wc-setup-content .updated form,.wc-setup-content .updated p:last-child,.wc-setup-content .woocommerce-newsletter form,.wc-setup-content .woocommerce-newsletter p:last-child{margin:0 0 24px}.wc-setup-content .woocommerce-tracker{margin:24px 0;border:1px solid #eee;padding:20px;border-radius:4px;overflow:hidden}.wc-setup-content .woocommerce-tracker p{font-size:14px;line-height:1.5em}.wc-setup-content .woocommerce-tracker .checkbox{line-height:24px;font-weight:500;font-size:1em;margin-top:0;margin-bottom:20px}.wc-setup-content .checkbox input[type=checkbox]{opacity:0;position:absolute;right:-9999px}.wc-setup-content .checkbox label{position:relative;display:inline-block;padding-right:28px}.wc-setup-content .checkbox label:after,.wc-setup-content .checkbox label:before{position:absolute;content:"";display:inline-block}.wc-setup-content .checkbox label:before{height:16px;width:16px;right:0;top:3px;border:1px solid #aaa;background-color:#fff;border-radius:3px}.wc-setup-content .checkbox label:after{height:5px;width:9px;border-right:2px solid;border-bottom:2px solid;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);right:4px;top:7px;color:#fff}.wc-setup-content .checkbox input[type=checkbox]+label::after{content:none}.wc-setup-content .checkbox input[type=checkbox]:checked+label::after{content:""}.wc-setup-content .checkbox input[type=checkbox]:focus+label::before{outline:#3b99fc auto 5px}.wc-setup-content .checkbox input[type=checkbox]:checked+label::before{background:#935687;border-color:#935687}.wc-setup-steps{padding:0 0 24px;margin:0;list-style:none outside;overflow:hidden;color:#ccc;width:100%;display:-webkit-inline-box;display:inline-flex}.wc-setup-steps li{width:100%;float:right;padding:0 0 .8em;margin:0;text-align:center;position:relative;border-bottom:4px solid #ccc;line-height:1.4em}.wc-setup-steps li a{color:#a16696;text-decoration:none;padding:1.5em;margin:-1.5em;position:relative;z-index:1}.wc-setup-steps li a:focus,.wc-setup-steps li a:hover{color:#111;text-decoration:underline}.wc-setup-steps li::before{content:'';border:4px solid #ccc;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;right:50%;margin-right:-6px;margin-bottom:-8px;background:#fff}.wc-setup-steps li.active{border-color:#a16696;color:#a16696;font-weight:700}.wc-setup-steps li.active::before{border-color:#a16696}.wc-setup-steps li.done{border-color:#a16696;color:#a16696}.wc-setup-steps li.done::before{border-color:#a16696;background:#a16696}.wc-setup .wc-setup-actions{overflow:hidden;margin:20px 0 0;position:relative}.wc-setup .wc-setup-actions .button{font-size:1.25em;padding:.5em 1em;line-height:1em;margin-left:.5em;margin-bottom:2px;height:auto;border-radius:4px}.wc-setup .wc-setup-actions .button-primary{background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,-1px 0 1px #a36597,0 1px 1px #a36597,1px 0 1px #a36597;margin:0;opacity:1}.wc-setup .wc-setup-actions .button-primary:active,.wc-setup .wc-setup-actions .button-primary:focus,.wc-setup .wc-setup-actions .button-primary:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.wc-setup-content p:last-child{margin-bottom:0}.wc-setup-content p.store-setup{margin-top:0}.wc-setup-footer-links{font-size:.85em;color:#7b7b7b;margin:1.18em auto;display:inline-block;text-align:center}.wc-wizard-storefront .wc-wizard-storefront-intro{padding:40px 40px 0;background:#f5f5f5;text-align:center}.wc-wizard-storefront .wc-wizard-storefront-intro img{margin:40px 0 0 0;width:100%;display:block}.wc-wizard-storefront .wc-wizard-storefront-features{list-style:none outside;margin:0 0 20px;padding:0 30px 0 0;overflow:hidden}.wc-wizard-storefront .wc-wizard-storefront-feature{margin:0;padding:20px 2em 20px 30px;width:50%;box-sizing:border-box}.wc-wizard-storefront .wc-wizard-storefront-feature::before{margin-right:-2em;position:absolute}.wc-wizard-storefront .wc-wizard-storefront-feature.first{clear:both;float:right}.wc-wizard-storefront .wc-wizard-storefront-feature.last{float:left}.wc-wizard-storefront .wc-wizard-storefront-feature__bulletproof::before{content:'🔒'}.wc-wizard-storefront .wc-wizard-storefront-feature__mobile::before{content:'📱'}.wc-wizard-storefront .wc-wizard-storefront-feature__accessibility::before{content:'👓'}.wc-wizard-storefront .wc-wizard-storefront-feature__search::before{content:'🔍'}.wc-wizard-storefront .wc-wizard-storefront-feature__compatibility::before{content:'🔧'}.wc-wizard-storefront .wc-wizard-storefront-feature__extendable::before{content:'🎨'}.wc-wizard-services{border:1px solid #eee;padding:0;margin:0 0 1em;list-style:none outside;border-radius:4px;overflow:hidden}.wc-wizard-services p{margin:0 0 1em 0;padding:0;font-size:1em;line-height:1.5em}.wc-wizard-service-item,.wc-wizard-services-list-toggle{display:-webkit-box;display:flex;flex-wrap:nowrap;-webkit-box-pack:justify;justify-content:space-between;padding:0;border-bottom:1px solid #eee;color:#666;-webkit-box-align:center;align-items:center}.wc-wizard-service-item:last-child,.wc-wizard-services-list-toggle:last-child{border-bottom:0}.wc-wizard-service-item .payment-gateway-fee,.wc-wizard-services-list-toggle .payment-gateway-fee{color:#a6a6a6}.wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-services-list-toggle .wc-wizard-service-name{flex-basis:0;min-width:160px;text-align:center;font-weight:700;padding:2em 0;align-self:stretch;display:-webkit-box;display:flex;-webkit-box-align:baseline;align-items:baseline}.wc-wizard-payment-gateway-form .wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-payment-gateway-form .wc-wizard-services-list-toggle .wc-wizard-service-name{-webkit-box-pack:center;justify-content:center}.wc-wizard-service-item .wc-wizard-service-name img,.wc-wizard-services-list-toggle .wc-wizard-service-name img{max-width:75px}.wc-wizard-service-item.stripe-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.stripe-logo .wc-wizard-service-name img{padding:8px 0}.wc-wizard-service-item.paypal-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.paypal-logo .wc-wizard-service-name img{max-width:87px;padding:2px 0}.wc-wizard-service-item.klarna-logo .wc-wizard-service-name,.wc-wizard-services-list-toggle.klarna-logo .wc-wizard-service-name{background:#000}.wc-wizard-service-item.klarna-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.klarna-logo .wc-wizard-service-name img{max-width:87px;padding:12px 0}.wc-wizard-service-item.square-logo .wc-wizard-service-name,.wc-wizard-services-list-toggle.square-logo .wc-wizard-service-name{background:#000}.wc-wizard-service-item.square-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.square-logo .wc-wizard-service-name img{max-width:95px;padding:12px 0}.wc-wizard-service-item.eway-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.eway-logo .wc-wizard-service-name img{max-width:87px}.wc-wizard-service-item.payfast-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.payfast-logo .wc-wizard-service-name img{max-width:140px}.wc-wizard-service-item .wc-wizard-service-description,.wc-wizard-services-list-toggle .wc-wizard-service-description{-webkit-box-flex:1;flex-grow:1;padding:20px}.wc-wizard-service-item .wc-wizard-service-description p,.wc-wizard-services-list-toggle .wc-wizard-service-description p{margin-bottom:1em}.wc-wizard-service-item .wc-wizard-service-description p:last-child,.wc-wizard-services-list-toggle .wc-wizard-service-description p:last-child{margin-bottom:0}.wc-wizard-service-item .wc-wizard-service-description .wc-wizard-service-settings-description,.wc-wizard-services-list-toggle .wc-wizard-service-description .wc-wizard-service-settings-description{display:block;font-style:italic;color:#999}.wc-wizard-service-item .wc-wizard-service-enable,.wc-wizard-services-list-toggle .wc-wizard-service-enable{flex-basis:0;min-width:75px;text-align:center;cursor:pointer;padding:2em 0;position:relative;max-height:1.5em;align-self:flex-start}.wc-wizard-service-item .wc-wizard-service-toggle,.wc-wizard-services-list-toggle .wc-wizard-service-toggle{height:16px;width:32px;border:2px solid #935687;background-color:#935687;display:inline-block;text-indent:-9999px;border-radius:10em;position:relative}.wc-wizard-service-item .wc-wizard-service-toggle input[type=checkbox],.wc-wizard-services-list-toggle .wc-wizard-service-toggle input[type=checkbox]{display:none}.wc-wizard-service-item .wc-wizard-service-toggle:before,.wc-wizard-services-list-toggle .wc-wizard-service-toggle:before{content:"";display:block;width:16px;height:16px;background:#fff;position:absolute;top:0;left:0;border-radius:100%}.wc-wizard-service-item .wc-wizard-service-toggle.disabled,.wc-wizard-services-list-toggle .wc-wizard-service-toggle.disabled{border-color:#999;background-color:#999}.wc-wizard-service-item .wc-wizard-service-toggle.disabled:before,.wc-wizard-services-list-toggle .wc-wizard-service-toggle.disabled:before{left:auto;right:0}.wc-wizard-service-item .wc-wizard-service-settings,.wc-wizard-services-list-toggle .wc-wizard-service-settings{display:none;margin-top:.75em;margin-bottom:0;cursor:default}.wc-wizard-service-item .wc-wizard-service-settings.hide,.wc-wizard-services-list-toggle .wc-wizard-service-settings.hide{display:none}.wc-wizard-service-item.checked .wc-wizard-service-settings,.wc-wizard-services-list-toggle.checked .wc-wizard-service-settings{display:inline-block}.wc-wizard-service-item.checked .wc-wizard-service-settings.hide,.wc-wizard-services-list-toggle.checked .wc-wizard-service-settings.hide{display:none}.wc-wizard-service-item.closed,.wc-wizard-services-list-toggle.closed{border-bottom:0}.wc-wizard-services-list-toggle{cursor:pointer}.wc-wizard-services-list-toggle .wc-wizard-service-enable::before{content:"\f343";font-family:dashicons;visibility:initial;color:#666;font-size:25px;margin-top:-7px;margin-right:-5px;position:absolute;visibility:visible}.wc-wizard-services-list-toggle.closed .wc-wizard-service-enable::before{content:"\f347"}.wc-wizard-services-list-toggle .wc-wizard-service-enable input{visibility:hidden;position:relative}.wc-wizard-services.manual .wc-wizard-service-item{display:none}.wc-wizard-services.shipping .wc-wizard-service-name{font-weight:400;text-align:right;-webkit-box-align:center;align-items:center;max-height:5em;padding:0}.wc-wizard-services.shipping .wc-wizard-service-item{padding-right:2em;padding-top:.67em}.wc-wizard-services.shipping .wc-wizard-service-item:first-child{border-bottom:0;padding-bottom:0;font-weight:700}.wc-wizard-services.shipping .wc-wizard-service-item:first-child .wc-wizard-service-name{font-weight:700}.wc-wizard-services.shipping .shipping-method-setting,.wc-wizard-services.shipping .wc-wizard-shipping-method-select{display:-webkit-box;display:flex}.wc-wizard-services.shipping .shipping-method-setting.hide,.wc-wizard-services.shipping .wc-wizard-shipping-method-select.hide{display:none}.wc-wizard-services.shipping .shipping-method-setting input,.wc-wizard-services.shipping .wc-wizard-shipping-method-dropdown{margin-left:2em;margin-bottom:1em}.wc-wizard-services.shipping .shipping-method-setting input .select2,.wc-wizard-services.shipping .wc-wizard-shipping-method-dropdown .select2{min-width:130px}.wc-wizard-services.shipping .wc-wizard-service-description{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;color:#a6a6a6}.wc-wizard-services.shipping .wc-wizard-service-item:not(:first-child) .wc-wizard-service-description{font-size:.92em;padding-bottom:10px}.wc-wizard-services.shipping .shipping-method-setting input{width:95px;border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:28px;padding-right:8px;padding-left:24px;font-size:14px;color:#444;background-color:#fff;display:inline-block}.wc-wizard-services.shipping .shipping-method-description,.wc-wizard-services.shipping .shipping-method-setting .description{color:#7e7e7e;font-size:.9em}.wc-wizard-services.shipping .shipping-method-setting input::-webkit-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::-moz-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input:-ms-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::-ms-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::placeholder{color:#e1e1e1}.wc-setup-shipping-units p{line-height:1.5em;font-size:13px;margin-bottom:.25em}.wc-setup-shipping-units .wc-setup-shipping-unit{margin-bottom:1.75em}.wc-setup-shipping-units .wc-setup-shipping-unit .select2{min-width:100%}.hide{display:none}.wc-wizard-features{display:-webkit-box;display:flex;flex-wrap:wrap;list-style:none;padding:0}.wc-wizard-features .wc-wizard-feature-item{flex-basis:calc(50% - 4em - 3px);border:1px solid #eee;padding:2em}.wc-wizard-features .wc-wizard-feature-item:nth-child(1){border-radius:0 4px 0 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(2){border-right:0;border-radius:4px 0 0 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(3){border-top:0;border-radius:0 0 4px 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(4){border-top:0;border-right:0;border-radius:0 0 0 4px}.wc-wizard-features p.wc-wizard-feature-description,.wc-wizard-features p.wc-wizard-feature-name{margin:0;line-height:1.5em}h3.jetpack-reasons{text-align:center;margin:3em 0 1em 0;font-size:14px}.jetpack-logo,.wcs-notice{display:block;margin:1.75em auto 2em auto;max-height:175px}.activate-splash .jetpack-logo{width:170px;margin-bottom:0}.activate-splash .wcs-notice{margin-top:1em;padding-right:57px}.step{text-align:center}.wc-setup .wc-setup-actions .button{font-weight:300;font-size:16px;padding:1em 2em;box-shadow:none;min-width:12em;min-width:auto;margin-top:10px}.wc-setup .wc-setup-actions .button:active,.wc-setup .wc-setup-actions .button:focus,.wc-setup .wc-setup-actions .button:hover{box-shadow:none}.wc-setup .wc-setup-actions .plugin-install-info{display:block;font-style:italic;color:#999;font-size:14px;line-height:1.5em;margin:5px 0}.wc-setup .wc-setup-actions .plugin-install-info>*{display:block}.wc-setup .wc-setup-actions .plugin-install-info .plugin-install-info-list-item:not(:last-child)::after{content:', '}.wc-setup .wc-setup-actions .plugin-install-info a{white-space:nowrap}.wc-setup .wc-setup-actions .plugin-install-info a:not(:hover):not(:focus){color:inherit}.plugin-install-source{background:rgba(187,119,174,.15)}.plugin-install-source:not(.wc-wizard-service-item){box-shadow:0 0 0 10px rgba(187,119,174,.15)}.location-prompt{color:#666;font-size:13px;font-weight:500;margin-bottom:.5em;margin-top:.85em;display:inline-block}.location-input{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:30px;width:calc(100% - 8px - 24px - 2px);padding-right:8px;padding-left:24px;font-size:16px;color:#444;background-color:#fff;display:inline-block}.location-input.dropdown{width:100%}.address-step .select2{min-width:100%}.store-address-container .city-and-postcode{display:-webkit-box;display:flex}.store-address-container .city-and-postcode div{flex-basis:50%;margin-left:1em}.store-address-container .city-and-postcode div:last-of-type{margin-left:0}.store-address-container .select2-container,.store-address-container input[type=text],.store-address-container select{margin-bottom:10px}.product-type-container{margin-top:14px;margin-bottom:1px}#woocommerce_sell_in_person{margin-right:0}.wc-wizard-service-settings .payment-email-input{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:30px;padding:0 8px;font-size:14px;color:#444;background-color:#fff;display:inline-block}.newsletter-form-container{display:-webkit-box;display:flex}.newsletter-form-container .newsletter-form-email{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:42px;padding:0 8px;font-size:16px;color:#666;background-color:#fff;display:inline-block;margin-left:6px;-webkit-box-flex:1;flex-grow:1}.newsletter-form-container .newsletter-form-button-container{-webkit-box-flex:0;flex-grow:0}.wc-setup .wc-setup-actions .button.newsletter-form-button{height:42px;padding:0 1em;margin:0}.wc-wizard-next-steps{border:1px solid #eee;border-radius:4px;list-style:none;padding:0}.wc-wizard-next-steps li{padding:0}.wc-wizard-next-steps .wc-wizard-next-step-item{display:-webkit-box;display:flex;border-top:1px solid #eee}.wc-wizard-next-steps .wc-wizard-next-step-item:first-child{border-top:0}.wc-wizard-next-steps .wc-wizard-next-step-description{-webkit-box-flex:1;flex-grow:1;margin:1.5em}.wc-wizard-next-steps .wc-wizard-next-step-action{-webkit-box-flex:0;flex-grow:0;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center}.wc-wizard-next-steps .wc-wizard-next-step-action .button{margin:1em 1.5em}.wc-wizard-next-steps p.next-step-heading{margin:0;font-size:.95em;font-weight:400;font-variant:all-petite-caps}.wc-wizard-next-steps p.next-step-extra-info{margin:0}.wc-wizard-next-steps h3.next-step-description{margin:0;font-size:16px;font-weight:600}.wc-wizard-next-steps .wc-wizard-additional-steps{border-top:1px solid #eee}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-wizard-next-step-description{margin-bottom:0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions{margin:0 0 1.5em 0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions .button{font-size:15px;margin:1em 1.5em 1em 0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions .button::last-child{margin-left:1.5em}p.next-steps-help-text{color:#9f9f9f;padding:0 2em;text-align:center;font-size:.9em}p.jetpack-terms{font-size:.8em;text-align:center;max-width:480px;margin:0 auto;line-height:1.5em}.woocommerce-error{background:#ffe6e5;border-color:#ffc5c2;padding:1em;margin-bottom:1em}.woocommerce-error p{margin-top:0;margin-bottom:.5em;color:#444}.woocommerce-error a{color:#ff645c}.woocommerce-error .reconnect-reminder{font-size:.85em}.woocommerce-error .wc-setup-actions .button{font-size:14px}.wc-wizard-service-setting-ppec_paypal_reroute_requests,.wc-wizard-service-setting-stripe_create_account{display:-webkit-box;display:flex;-webkit-box-align:start;align-items:flex-start}.wc-wizard-service-setting-ppec_paypal_reroute_requests .payment-checkbox-input,.wc-wizard-service-setting-stripe_create_account .payment-checkbox-input{-webkit-box-ordinal-group:2;order:1;margin-top:5px;margin-right:0;margin-left:0;width:1.5em}.wc-wizard-service-setting-ppec_paypal_reroute_requests .ppec_paypal_reroute_requests,.wc-wizard-service-setting-ppec_paypal_reroute_requests .stripe_create_account,.wc-wizard-service-setting-stripe_create_account .ppec_paypal_reroute_requests,.wc-wizard-service-setting-stripe_create_account .stripe_create_account{-webkit-box-ordinal-group:3;order:2;margin-right:.3em}.wc-wizard-service-setting-ppec_paypal_email,.wc-wizard-service-setting-stripe_email{margin-top:.75em;margin-right:1.5em}.wc-wizard-service-setting-ppec_paypal_email label.ppec_paypal_email,.wc-wizard-service-setting-ppec_paypal_email label.stripe_email,.wc-wizard-service-setting-stripe_email label.ppec_paypal_email,.wc-wizard-service-setting-stripe_email label.stripe_email{position:absolute;margin:-1px;padding:0;height:1px;width:1px;overflow:hidden;clip:rect(0 0 0 0);border:0}.wc-wizard-service-setting-ppec_paypal_email input.payment-email-input,.wc-wizard-service-setting-stripe_email input.payment-email-input{box-sizing:border-box;margin-bottom:.5em;width:100%;height:32px}.wc-setup-content .recommended-step{border:1px solid #ebebeb;border-radius:4px;padding:2.5em}.wc-setup-content .recommended-step li{list-style:none}.wc-setup-content .recommended-step li:last-child label{margin-bottom:0}.wc-setup-content .recommended-step label{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;margin-bottom:1.5em}.wc-setup-content .recommended-step label:after,.wc-setup-content .recommended-step label:before{top:auto}.wc-setup-content .recommended-step label:after{margin-top:-1.5px}.wc-setup-content .recommended-step .recommended-item-icon{border:1px solid #fff;border-radius:7px;height:3.5em;margin-left:1em;margin-right:4px}.wc-setup-content .recommended-step .recommended-item-icon.recommended-item-icon-storefront_theme{background-color:#f4a224;max-height:3em;max-width:3em;padding:.25em}.wc-setup-content .recommended-step .recommended-item-icon.recommended-item-icon-automated_taxes{background-color:#d0011b;max-height:1.75em;padding:.875em}.wc-setup-content .recommended-step .recommended-item-icon.recommended-item-icon-mailchimp{background-color:#209bbb;height:2em;padding:.75em}.wc-setup-content .recommended-step .recommended-item-description-container h3{font-size:15px;font-weight:700;letter-spacing:.5px;margin-bottom:0}.wc-setup-content .recommended-step .recommended-item-description-container p{margin-top:0;line-height:1.5em}
\ No newline at end of file
+@charset "UTF-8";body{margin:65px auto 24px;box-shadow:none;background:#f1f1f1;padding:0}#wc-logo{border:0;margin:0 0 24px;padding:0;text-align:center}#wc-logo img{max-width:30%}.wc-setup{text-align:center}.wc-setup .select2-container{text-align:right}.wc-setup .hidden{display:none}.wc-setup-content{box-shadow:0 1px 3px rgba(0,0,0,.13);padding:2em;margin:0 0 20px;background:#fff;overflow:hidden;zoom:1;text-align:right}.wc-setup-content h1,.wc-setup-content h2,.wc-setup-content h3,.wc-setup-content table{margin:0 0 20px;border:0;padding:0;color:#666;clear:none;font-weight:500}.wc-setup-content p{margin:20px 0;font-size:1em;line-height:1.75em;color:#666}.wc-setup-content table{font-size:1em;line-height:1.75em;color:#666}.wc-setup-content a{color:#a16696}.wc-setup-content a:focus,.wc-setup-content a:hover{color:#111}.wc-setup-content .form-table th{width:35%;vertical-align:top;font-weight:400}.wc-setup-content .form-table td{vertical-align:top}.wc-setup-content .form-table td input,.wc-setup-content .form-table td select{width:100%;box-sizing:border-box}.wc-setup-content .form-table td input[size]{width:auto}.wc-setup-content .form-table td .description{line-height:1.5em;display:block;margin-top:.25em;color:#999;font-style:italic}.wc-setup-content .form-table td .input-checkbox,.wc-setup-content .form-table td .input-radio{width:auto;box-sizing:inherit;padding:inherit;margin:0 0 0 .5em;box-shadow:none}.wc-setup-content .form-table .section_title td{padding:0}.wc-setup-content .form-table .section_title td h2,.wc-setup-content .form-table .section_title td p{margin:12px 0 0}.wc-setup-content .form-table td,.wc-setup-content .form-table th{padding:12px 0;margin:0;border:0}.wc-setup-content .form-table td:first-child,.wc-setup-content .form-table th:first-child{padding-left:1em}.wc-setup-content table.tax-rates{width:100%;font-size:.92em}.wc-setup-content table.tax-rates th{padding:0;text-align:center;width:auto;vertical-align:middle}.wc-setup-content table.tax-rates td{border:1px solid #f5f5f5;padding:6px;text-align:center;vertical-align:middle}.wc-setup-content table.tax-rates td input{outline:0;border:0;padding:0;box-shadow:none;text-align:center;width:100%}.wc-setup-content table.tax-rates td.sort{cursor:move;color:#ccc}.wc-setup-content table.tax-rates td.sort::before{content:'\f333';font-family:dashicons}.wc-setup-content table.tax-rates td.readonly{background:#f5f5f5}.wc-setup-content table.tax-rates .add{padding:1em 1em 0 0;line-height:1em;font-size:1em;width:0;margin:6px 0 0;height:0;overflow:hidden;position:relative;display:inline-block}.wc-setup-content table.tax-rates .add::before{content:'\f502';font-family:dashicons;position:absolute;right:0;top:0}.wc-setup-content table.tax-rates .remove{padding:1em 1em 0 0;line-height:1em;font-size:1em;width:0;margin:0;height:0;overflow:hidden;position:relative;display:inline-block}.wc-setup-content table.tax-rates .remove::before{content:'\f182';font-family:dashicons;position:absolute;right:0;top:0}.wc-setup-content .wc-setup-pages{width:100%;border-top:1px solid #eee}.wc-setup-content .wc-setup-pages thead th{display:none}.wc-setup-content .wc-setup-pages .page-name{width:30%;font-weight:700}.wc-setup-content .wc-setup-pages td,.wc-setup-content .wc-setup-pages th{padding:14px 0;border-bottom:1px solid #eee}.wc-setup-content .wc-setup-pages td:first-child,.wc-setup-content .wc-setup-pages th:first-child{padding-left:9px}.wc-setup-content .wc-setup-pages th{padding-top:0}.wc-setup-content .wc-setup-pages .page-options p{color:#777;margin:6px 24px 0 0;line-height:1.75em}.wc-setup-content .wc-setup-pages .page-options p input{vertical-align:middle;margin:1px 0 0;height:1.75em;width:1.75em;line-height:1.75em}.wc-setup-content .wc-setup-pages .page-options p label{line-height:1}@media screen and (max-width:782px){.wc-setup-content .form-table tbody th{width:auto}}.wc-setup-content .twitter-share-button{float:left}.wc-setup-content .wc-setup-next-steps{overflow:hidden;margin:0 0 24px;padding-bottom:2px}.wc-setup-content .wc-setup-next-steps h2{margin-bottom:12px}.wc-setup-content .wc-setup-next-steps .wc-setup-next-steps-first{float:right;width:50%;box-sizing:border-box}.wc-setup-content .wc-setup-next-steps .wc-setup-next-steps-last{float:left;width:50%;box-sizing:border-box}.wc-setup-content .wc-setup-next-steps ul{padding:0 0 0 2em;list-style:none outside;margin:0}.wc-setup-content .wc-setup-next-steps ul li a{display:block;padding:0 0 .75em}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button{background-color:#f7f7f7;border-color:#ccc;color:#23282d;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #ccc;text-shadow:-1px 0 1px #eee,0 1px 1px #eee;font-size:1em;height:auto;line-height:1.75em;margin:0 0 .75em;opacity:1;padding:1em;text-align:center}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:active,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:focus,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:hover{background:#f5f5f5;border-color:#aaa}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary{color:#fff;background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,-1px 0 1px #a36597,0 1px 1px #a36597,1px 0 1px #a36597}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:active,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:focus,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:hover{color:#fff;background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.wc-setup-content .wc-setup-next-steps ul li a::before{color:#82878c;font:normal 20px/1 dashicons;speak:none;display:inline-block;padding:0 0 0 10px;top:1px;position:relative;text-decoration:none!important;vertical-align:top}.wc-setup-content .wc-setup-next-steps ul .learn-more a::before{content:'\f105'}.wc-setup-content .wc-setup-next-steps ul .video-walkthrough a::before{content:'\f126'}.wc-setup-content .wc-setup-next-steps ul .newsletter a::before{content:'\f465'}.wc-setup-content .updated,.wc-setup-content .woocommerce-newsletter{padding:24px 24px 0;margin:0 0 24px;overflow:hidden;background:#f5f5f5}.wc-setup-content .updated p,.wc-setup-content .woocommerce-newsletter p{padding:0;margin:0 0 12px}.wc-setup-content .updated form,.wc-setup-content .updated p:last-child,.wc-setup-content .woocommerce-newsletter form,.wc-setup-content .woocommerce-newsletter p:last-child{margin:0 0 24px}.wc-setup-content .woocommerce-tracker{margin:24px 0;border:1px solid #eee;padding:20px;border-radius:4px;overflow:hidden}.wc-setup-content .woocommerce-tracker p{font-size:14px;line-height:1.5em}.wc-setup-content .woocommerce-tracker .checkbox{line-height:24px;font-weight:500;font-size:1em;margin-top:0;margin-bottom:20px}.wc-setup-content .checkbox input[type=checkbox]{opacity:0;position:absolute;right:-9999px}.wc-setup-content .checkbox label{position:relative;display:inline-block;padding-right:28px}.wc-setup-content .checkbox label:after,.wc-setup-content .checkbox label:before{position:absolute;content:"";display:inline-block}.wc-setup-content .checkbox label:before{height:16px;width:16px;right:0;top:3px;border:1px solid #aaa;background-color:#fff;border-radius:3px}.wc-setup-content .checkbox label:after{height:5px;width:9px;border-right:2px solid;border-bottom:2px solid;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);right:4px;top:7px;color:#fff}.wc-setup-content .checkbox input[type=checkbox]+label::after{content:none}.wc-setup-content .checkbox input[type=checkbox]:checked+label::after{content:""}.wc-setup-content .checkbox input[type=checkbox]:focus+label::before{outline:#3b99fc auto 5px}.wc-setup-content .checkbox input[type=checkbox]:checked+label::before{background:#935687;border-color:#935687}.wc-setup-steps{padding:0 0 24px;margin:0;list-style:none outside;overflow:hidden;color:#ccc;width:100%;display:-webkit-inline-box;display:inline-flex}.wc-setup-steps li{width:100%;float:right;padding:0 0 .8em;margin:0;text-align:center;position:relative;border-bottom:4px solid #ccc;line-height:1.4em}.wc-setup-steps li a{color:#a16696;text-decoration:none;padding:1.5em;margin:-1.5em;position:relative;z-index:1}.wc-setup-steps li a:focus,.wc-setup-steps li a:hover{color:#111;text-decoration:underline}.wc-setup-steps li::before{content:'';border:4px solid #ccc;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;right:50%;margin-right:-6px;margin-bottom:-8px;background:#fff}.wc-setup-steps li.active{border-color:#a16696;color:#a16696;font-weight:700}.wc-setup-steps li.active::before{border-color:#a16696}.wc-setup-steps li.done{border-color:#a16696;color:#a16696}.wc-setup-steps li.done::before{border-color:#a16696;background:#a16696}.wc-setup .wc-setup-actions{overflow:hidden;margin:20px 0 0;position:relative}.wc-setup .wc-setup-actions .button{font-size:1.25em;padding:.5em 1em;line-height:1em;margin-left:.5em;margin-bottom:2px;height:auto;border-radius:4px}.wc-setup .wc-setup-actions .button-primary{background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,-1px 0 1px #a36597,0 1px 1px #a36597,1px 0 1px #a36597;margin:0;opacity:1}.wc-setup .wc-setup-actions .button-primary:active,.wc-setup .wc-setup-actions .button-primary:focus,.wc-setup .wc-setup-actions .button-primary:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.wc-setup-content p:last-child{margin-bottom:0}.wc-setup-content p.store-setup{margin-top:0}.wc-setup-footer-links{font-size:.85em;color:#7b7b7b;margin:1.18em auto;display:inline-block;text-align:center}.wc-wizard-storefront .wc-wizard-storefront-intro{padding:40px 40px 0;background:#f5f5f5;text-align:center}.wc-wizard-storefront .wc-wizard-storefront-intro img{margin:40px 0 0 0;width:100%;display:block}.wc-wizard-storefront .wc-wizard-storefront-features{list-style:none outside;margin:0 0 20px;padding:0 30px 0 0;overflow:hidden}.wc-wizard-storefront .wc-wizard-storefront-feature{margin:0;padding:20px 2em 20px 30px;width:50%;box-sizing:border-box}.wc-wizard-storefront .wc-wizard-storefront-feature::before{margin-right:-2em;position:absolute}.wc-wizard-storefront .wc-wizard-storefront-feature.first{clear:both;float:right}.wc-wizard-storefront .wc-wizard-storefront-feature.last{float:left}.wc-wizard-storefront .wc-wizard-storefront-feature__bulletproof::before{content:'🔒'}.wc-wizard-storefront .wc-wizard-storefront-feature__mobile::before{content:'📱'}.wc-wizard-storefront .wc-wizard-storefront-feature__accessibility::before{content:'👓'}.wc-wizard-storefront .wc-wizard-storefront-feature__search::before{content:'🔍'}.wc-wizard-storefront .wc-wizard-storefront-feature__compatibility::before{content:'🔧'}.wc-wizard-storefront .wc-wizard-storefront-feature__extendable::before{content:'🎨'}.wc-wizard-services{border:1px solid #eee;padding:0;margin:0 0 1em;list-style:none outside;border-radius:4px;overflow:hidden}.wc-wizard-services p{margin:0 0 1em 0;padding:0;font-size:1em;line-height:1.5em}.wc-wizard-service-item,.wc-wizard-services-list-toggle{display:-webkit-box;display:flex;flex-wrap:nowrap;-webkit-box-pack:justify;justify-content:space-between;padding:0;border-bottom:1px solid #eee;color:#666;-webkit-box-align:center;align-items:center}.wc-wizard-service-item:last-child,.wc-wizard-services-list-toggle:last-child{border-bottom:0}.wc-wizard-service-item .payment-gateway-fee,.wc-wizard-services-list-toggle .payment-gateway-fee{color:#a6a6a6}.wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-services-list-toggle .wc-wizard-service-name{flex-basis:0;min-width:160px;text-align:center;font-weight:700;padding:2em 0;align-self:stretch;display:-webkit-box;display:flex;-webkit-box-align:baseline;align-items:baseline}.wc-wizard-payment-gateway-form .wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-payment-gateway-form .wc-wizard-services-list-toggle .wc-wizard-service-name{-webkit-box-pack:center;justify-content:center}.wc-wizard-service-item .wc-wizard-service-name img,.wc-wizard-services-list-toggle .wc-wizard-service-name img{max-width:75px}.wc-wizard-service-item.stripe-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.stripe-logo .wc-wizard-service-name img{padding:8px 0}.wc-wizard-service-item.paypal-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.paypal-logo .wc-wizard-service-name img{max-width:87px;padding:2px 0}.wc-wizard-service-item.klarna-logo .wc-wizard-service-name,.wc-wizard-services-list-toggle.klarna-logo .wc-wizard-service-name{background:#000}.wc-wizard-service-item.klarna-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.klarna-logo .wc-wizard-service-name img{max-width:87px;padding:12px 0}.wc-wizard-service-item.square-logo .wc-wizard-service-name,.wc-wizard-services-list-toggle.square-logo .wc-wizard-service-name{background:#000}.wc-wizard-service-item.square-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.square-logo .wc-wizard-service-name img{max-width:95px;padding:12px 0}.wc-wizard-service-item.eway-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.eway-logo .wc-wizard-service-name img{max-width:87px}.wc-wizard-service-item.payfast-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.payfast-logo .wc-wizard-service-name img{max-width:140px}.wc-wizard-service-item .wc-wizard-service-description,.wc-wizard-services-list-toggle .wc-wizard-service-description{-webkit-box-flex:1;flex-grow:1;padding:20px}.wc-wizard-service-item .wc-wizard-service-description p,.wc-wizard-services-list-toggle .wc-wizard-service-description p{margin-bottom:1em}.wc-wizard-service-item .wc-wizard-service-description p:last-child,.wc-wizard-services-list-toggle .wc-wizard-service-description p:last-child{margin-bottom:0}.wc-wizard-service-item .wc-wizard-service-description .wc-wizard-service-settings-description,.wc-wizard-services-list-toggle .wc-wizard-service-description .wc-wizard-service-settings-description{display:block;font-style:italic;color:#999}.wc-wizard-service-item .wc-wizard-service-enable,.wc-wizard-services-list-toggle .wc-wizard-service-enable{flex-basis:0;min-width:75px;text-align:center;cursor:pointer;padding:2em 0;position:relative;max-height:1.5em;align-self:flex-start}.wc-wizard-service-item .wc-wizard-service-toggle,.wc-wizard-services-list-toggle .wc-wizard-service-toggle{height:16px;width:32px;border:2px solid #935687;background-color:#935687;display:inline-block;text-indent:-9999px;border-radius:10em;position:relative}.wc-wizard-service-item .wc-wizard-service-toggle input[type=checkbox],.wc-wizard-services-list-toggle .wc-wizard-service-toggle input[type=checkbox]{display:none}.wc-wizard-service-item .wc-wizard-service-toggle:before,.wc-wizard-services-list-toggle .wc-wizard-service-toggle:before{content:"";display:block;width:16px;height:16px;background:#fff;position:absolute;top:0;left:0;border-radius:100%}.wc-wizard-service-item .wc-wizard-service-toggle.disabled,.wc-wizard-services-list-toggle .wc-wizard-service-toggle.disabled{border-color:#999;background-color:#999}.wc-wizard-service-item .wc-wizard-service-toggle.disabled:before,.wc-wizard-services-list-toggle .wc-wizard-service-toggle.disabled:before{left:auto;right:0}.wc-wizard-service-item .wc-wizard-service-settings,.wc-wizard-services-list-toggle .wc-wizard-service-settings{display:none;margin-top:.75em;margin-bottom:0;cursor:default}.wc-wizard-service-item .wc-wizard-service-settings.hide,.wc-wizard-services-list-toggle .wc-wizard-service-settings.hide{display:none}.wc-wizard-service-item.checked .wc-wizard-service-settings,.wc-wizard-services-list-toggle.checked .wc-wizard-service-settings{display:inline-block}.wc-wizard-service-item.checked .wc-wizard-service-settings.hide,.wc-wizard-services-list-toggle.checked .wc-wizard-service-settings.hide{display:none}.wc-wizard-service-item.closed,.wc-wizard-services-list-toggle.closed{border-bottom:0}.wc-wizard-services-list-toggle{cursor:pointer}.wc-wizard-services-list-toggle .wc-wizard-service-enable::before{content:"\f343";font-family:dashicons;visibility:initial;color:#666;font-size:25px;margin-top:-7px;margin-right:-5px;position:absolute;visibility:visible}.wc-wizard-services-list-toggle.closed .wc-wizard-service-enable::before{content:"\f347"}.wc-wizard-services-list-toggle .wc-wizard-service-enable input{visibility:hidden;position:relative}.wc-wizard-services.manual .wc-wizard-service-item{display:none}.wc-wizard-services.shipping{margin:0}.wc-wizard-services.shipping .wc-wizard-service-name{font-weight:400;text-align:right;-webkit-box-align:center;align-items:center;max-height:5em;padding:0}.wc-wizard-services.shipping .wc-wizard-service-item{padding-right:2em;padding-top:.67em}.wc-wizard-services.shipping .wc-wizard-service-item:first-child{border-bottom:0;padding-bottom:0;font-weight:700}.wc-wizard-services.shipping .wc-wizard-service-item:first-child .wc-wizard-service-name{font-weight:700}.wc-wizard-services.shipping .shipping-method-setting,.wc-wizard-services.shipping .wc-wizard-shipping-method-select{display:-webkit-box;display:flex}.wc-wizard-services.shipping .shipping-method-setting.hide,.wc-wizard-services.shipping .wc-wizard-shipping-method-select.hide{display:none}.wc-wizard-services.shipping .shipping-method-setting input,.wc-wizard-services.shipping .wc-wizard-shipping-method-dropdown{margin-left:2em;margin-bottom:1em}.wc-wizard-services.shipping .shipping-method-setting input .select2,.wc-wizard-services.shipping .wc-wizard-shipping-method-dropdown .select2{min-width:130px}.wc-wizard-services.shipping .wc-wizard-service-description{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;color:#a6a6a6}.wc-wizard-services.shipping .wc-wizard-service-item:not(:first-child) .wc-wizard-service-description{font-size:.92em;padding-bottom:10px}.wc-wizard-services.shipping .shipping-method-setting input{width:95px;border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:28px;padding-right:8px;padding-left:24px;font-size:14px;color:#444;background-color:#fff;display:inline-block}.wc-wizard-services.shipping .shipping-method-description,.wc-wizard-services.shipping .shipping-method-setting .description{color:#7e7e7e;font-size:.9em}.wc-wizard-services.shipping .shipping-method-setting input::-webkit-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::-ms-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::placeholder{color:#e1e1e1}.wc-setup-shipping-units p{line-height:1.5em;font-size:13px;margin-bottom:.25em;text-align:center}.wc-setup-shipping-units .wc-setup-shipping-unit{margin-bottom:1.75em}.wc-setup-shipping-units .wc-setup-shipping-unit .select2{min-width:125px;top:-5px}.hide{display:none}.wc-wizard-features{display:-webkit-box;display:flex;flex-wrap:wrap;list-style:none;padding:0}.wc-wizard-features .wc-wizard-feature-item{flex-basis:calc(50% - 4em - 3px);border:1px solid #eee;padding:2em}.wc-wizard-features .wc-wizard-feature-item:nth-child(1){border-radius:0 4px 0 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(2){border-right:0;border-radius:4px 0 0 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(3){border-top:0;border-radius:0 0 4px 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(4){border-top:0;border-right:0;border-radius:0 0 0 4px}.wc-wizard-features p.wc-wizard-feature-description,.wc-wizard-features p.wc-wizard-feature-name{margin:0;line-height:1.5em}h3.jetpack-reasons{text-align:center;margin:3em 0 1em 0;font-size:14px}.jetpack-logo,.wcs-notice{display:block;margin:1.75em auto 2em auto;max-height:175px}.activate-splash .jetpack-logo{width:170px;margin-bottom:0}.activate-splash .wcs-notice{margin-top:1em;padding-right:57px}.step{text-align:center}.wc-setup .wc-setup-actions .button{font-weight:300;font-size:16px;padding:1em 2em;box-shadow:none;min-width:12em;min-width:auto;margin-top:10px}.wc-setup .wc-setup-actions .button:active,.wc-setup .wc-setup-actions .button:focus,.wc-setup .wc-setup-actions .button:hover{box-shadow:none}.wc-setup .wc-setup-actions .plugin-install-info{display:block;font-style:italic;color:#999;font-size:14px;line-height:1.5em;margin:5px 0}.wc-setup .wc-setup-actions .plugin-install-info>*{display:block}.wc-setup .wc-setup-actions .plugin-install-info .plugin-install-info-list-item::after{content:', '}.wc-setup .wc-setup-actions .plugin-install-info .plugin-install-info-list-item:last-of-type::after{content:'. '}.wc-setup .wc-setup-actions .plugin-install-info a{white-space:nowrap}.wc-setup .wc-setup-actions .plugin-install-info a:not(:hover):not(:focus){color:inherit}.plugin-install-source{background:rgba(187,119,174,.15)}.plugin-install-source:not(.wc-wizard-service-item){box-shadow:0 0 0 10px rgba(187,119,174,.15)}.location-prompt{color:#666;font-size:13px;font-weight:500;margin-bottom:.5em;margin-top:.85em;display:inline-block}.location-input{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:30px;width:calc(100% - 8px - 24px - 2px);padding-right:8px;padding-left:24px;font-size:16px;color:#444;background-color:#fff;display:inline-block}.location-input.dropdown{width:100%}.address-step .select2{min-width:100%}.store-address-container .city-and-postcode{display:-webkit-box;display:flex}.store-address-container .city-and-postcode div{flex-basis:50%;margin-left:1em}.store-address-container .city-and-postcode div:last-of-type{margin-left:0}.store-address-container .select2-container,.store-address-container input[type=text],.store-address-container select{margin-bottom:10px}.product-type-container{margin-top:14px;margin-bottom:1px}#woocommerce_sell_in_person{margin-right:0}.wc-wizard-service-settings .payment-email-input{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:30px;padding:0 8px;font-size:14px;color:#444;background-color:#fff;display:inline-block}.wc-wizard-service-settings .payment-email-input[disabled]{color:#aaa}.newsletter-form-container{display:-webkit-box;display:flex}.newsletter-form-container .newsletter-form-email{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:42px;padding:0 8px;font-size:16px;color:#666;background-color:#fff;display:inline-block;margin-left:6px;-webkit-box-flex:1;flex-grow:1}.newsletter-form-container .newsletter-form-button-container{-webkit-box-flex:0;flex-grow:0}.wc-setup .wc-setup-actions .button.newsletter-form-button{height:42px;padding:0 1em;margin:0}.wc-wizard-next-steps{border:1px solid #eee;border-radius:4px;list-style:none;padding:0}.wc-wizard-next-steps li{padding:0}.wc-wizard-next-steps .wc-wizard-next-step-item{display:-webkit-box;display:flex;border-top:1px solid #eee}.wc-wizard-next-steps .wc-wizard-next-step-item:first-child{border-top:0}.wc-wizard-next-steps .wc-wizard-next-step-description{-webkit-box-flex:1;flex-grow:1;margin:1.5em}.wc-wizard-next-steps .wc-wizard-next-step-action{-webkit-box-flex:0;flex-grow:0;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center}.wc-wizard-next-steps .wc-wizard-next-step-action .button{margin:1em 1.5em}.wc-wizard-next-steps p.next-step-heading{margin:0;font-size:.95em;font-weight:400;font-variant:all-petite-caps}.wc-wizard-next-steps p.next-step-extra-info{margin:0}.wc-wizard-next-steps h3.next-step-description{margin:0;font-size:16px;font-weight:600}.wc-wizard-next-steps .wc-wizard-additional-steps{border-top:1px solid #eee}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-wizard-next-step-description{margin-bottom:0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions{margin:0 0 1.5em 0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions .button{font-size:15px;margin:1em 1.5em 1em 0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions .button::last-child{margin-left:1.5em}p.next-steps-help-text{color:#9f9f9f;padding:0 2em;text-align:center;font-size:.9em}p.jetpack-terms{font-size:.8em;text-align:center;max-width:480px;margin:0 auto;line-height:1.5em}.woocommerce-error{background:#ffe6e5;border-color:#ffc5c2;padding:1em;margin-bottom:1em}.woocommerce-error p{margin-top:0;margin-bottom:.5em;color:#444}.woocommerce-error a{color:#ff645c}.woocommerce-error .reconnect-reminder{font-size:.85em}.woocommerce-error .wc-setup-actions .button{font-size:14px}.wc-wizard-service-setting-ppec_paypal_reroute_requests,.wc-wizard-service-setting-stripe_create_account{display:-webkit-box;display:flex;-webkit-box-align:start;align-items:flex-start}.wc-wizard-service-setting-ppec_paypal_reroute_requests .payment-checkbox-input,.wc-wizard-service-setting-stripe_create_account .payment-checkbox-input{-webkit-box-ordinal-group:2;order:1;margin-top:5px;margin-right:0;margin-left:0;width:1.5em}.wc-wizard-service-setting-ppec_paypal_reroute_requests .ppec_paypal_reroute_requests,.wc-wizard-service-setting-ppec_paypal_reroute_requests .stripe_create_account,.wc-wizard-service-setting-stripe_create_account .ppec_paypal_reroute_requests,.wc-wizard-service-setting-stripe_create_account .stripe_create_account{-webkit-box-ordinal-group:3;order:2;margin-right:.3em}.wc-wizard-service-setting-ppec_paypal_email,.wc-wizard-service-setting-stripe_email{margin-top:.75em;margin-right:1.5em}.wc-wizard-service-setting-ppec_paypal_email label.ppec_paypal_email,.wc-wizard-service-setting-ppec_paypal_email label.stripe_email,.wc-wizard-service-setting-stripe_email label.ppec_paypal_email,.wc-wizard-service-setting-stripe_email label.stripe_email{position:absolute;margin:-1px;padding:0;height:1px;width:1px;overflow:hidden;clip:rect(0 0 0 0);border:0}.wc-wizard-service-setting-ppec_paypal_email input.payment-email-input,.wc-wizard-service-setting-stripe_email input.payment-email-input{box-sizing:border-box;margin-bottom:.5em;width:100%;height:32px}.wc-setup-content .recommended-step{border:1px solid #ebebeb;border-radius:4px;padding:2.5em}.wc-setup-content .recommended-item{list-style:none}.wc-setup-content .recommended-item:last-child label{margin-bottom:0}.wc-setup-content .recommended-item label{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;margin-bottom:1.5em}.wc-setup-content .recommended-item label:after,.wc-setup-content .recommended-item label:before{top:auto}.wc-setup-content .recommended-item label:after{margin-top:-1.5px}.wc-setup-content .recommended-item .recommended-item-icon{border:1px solid #fff;border-radius:7px;height:3.5em;margin-left:1em;margin-right:4px}.wc-setup-content .recommended-item .recommended-item-icon.recommended-item-icon-storefront_theme{background-color:#f4a224;max-height:3em;max-width:3em;padding:.25em}.wc-setup-content .recommended-item .recommended-item-icon.recommended-item-icon-automated_taxes{background-color:#d0011b;max-height:1.75em;padding:.875em}.wc-setup-content .recommended-item .recommended-item-icon.recommended-item-icon-mailchimp{background-color:#209bbb;height:2em;padding:.75em}.wc-setup-content .recommended-item .recommended-item-icon.recommended-item-icon-woocommerce_services{background-color:#f0f0f0;max-height:1.5em;padding:1.3em .7em}.wc-setup-content .recommended-item .recommended-item-icon.recommended-item-icon-shipstation{background-color:#f0f0f0;padding:.3em}.wc-setup-content .recommended-item .recommended-item-description-container h3{font-size:15px;font-weight:700;letter-spacing:.5px;margin-bottom:0}.wc-setup-content .recommended-item .recommended-item-description-container p{margin-top:0;line-height:1.5em}.wc-wizard-service-info{padding:1em 2em;background-color:#fafafa}.help_tip{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.wc-setup #tiptip_content{background:#5f6973}.wc-setup #tiptip_holder.tip_top #tiptip_arrow_inner{border-top-color:#5f6973}.wc-setup-shipping-recommended{border-bottom:1px solid #eee;margin-top:0;padding:30px 0}
\ No newline at end of file
diff --git a/assets/css/wc-setup.css b/assets/css/wc-setup.css
index 7dc1a4c10e9..78261945a67 100644
--- a/assets/css/wc-setup.css
+++ b/assets/css/wc-setup.css
@@ -1 +1 @@
-@charset "UTF-8";body{margin:65px auto 24px;box-shadow:none;background:#f1f1f1;padding:0}#wc-logo{border:0;margin:0 0 24px;padding:0;text-align:center}#wc-logo img{max-width:30%}.wc-setup{text-align:center}.wc-setup .select2-container{text-align:left}.wc-setup .hidden{display:none}.wc-setup-content{box-shadow:0 1px 3px rgba(0,0,0,.13);padding:2em;margin:0 0 20px;background:#fff;overflow:hidden;zoom:1;text-align:left}.wc-setup-content h1,.wc-setup-content h2,.wc-setup-content h3,.wc-setup-content table{margin:0 0 20px;border:0;padding:0;color:#666;clear:none;font-weight:500}.wc-setup-content p{margin:20px 0;font-size:1em;line-height:1.75em;color:#666}.wc-setup-content table{font-size:1em;line-height:1.75em;color:#666}.wc-setup-content a{color:#a16696}.wc-setup-content a:focus,.wc-setup-content a:hover{color:#111}.wc-setup-content .form-table th{width:35%;vertical-align:top;font-weight:400}.wc-setup-content .form-table td{vertical-align:top}.wc-setup-content .form-table td input,.wc-setup-content .form-table td select{width:100%;box-sizing:border-box}.wc-setup-content .form-table td input[size]{width:auto}.wc-setup-content .form-table td .description{line-height:1.5em;display:block;margin-top:.25em;color:#999;font-style:italic}.wc-setup-content .form-table td .input-checkbox,.wc-setup-content .form-table td .input-radio{width:auto;box-sizing:inherit;padding:inherit;margin:0 .5em 0 0;box-shadow:none}.wc-setup-content .form-table .section_title td{padding:0}.wc-setup-content .form-table .section_title td h2,.wc-setup-content .form-table .section_title td p{margin:12px 0 0}.wc-setup-content .form-table td,.wc-setup-content .form-table th{padding:12px 0;margin:0;border:0}.wc-setup-content .form-table td:first-child,.wc-setup-content .form-table th:first-child{padding-right:1em}.wc-setup-content table.tax-rates{width:100%;font-size:.92em}.wc-setup-content table.tax-rates th{padding:0;text-align:center;width:auto;vertical-align:middle}.wc-setup-content table.tax-rates td{border:1px solid #f5f5f5;padding:6px;text-align:center;vertical-align:middle}.wc-setup-content table.tax-rates td input{outline:0;border:0;padding:0;box-shadow:none;text-align:center;width:100%}.wc-setup-content table.tax-rates td.sort{cursor:move;color:#ccc}.wc-setup-content table.tax-rates td.sort::before{content:'\f333';font-family:dashicons}.wc-setup-content table.tax-rates td.readonly{background:#f5f5f5}.wc-setup-content table.tax-rates .add{padding:1em 0 0 1em;line-height:1em;font-size:1em;width:0;margin:6px 0 0;height:0;overflow:hidden;position:relative;display:inline-block}.wc-setup-content table.tax-rates .add::before{content:'\f502';font-family:dashicons;position:absolute;left:0;top:0}.wc-setup-content table.tax-rates .remove{padding:1em 0 0 1em;line-height:1em;font-size:1em;width:0;margin:0;height:0;overflow:hidden;position:relative;display:inline-block}.wc-setup-content table.tax-rates .remove::before{content:'\f182';font-family:dashicons;position:absolute;left:0;top:0}.wc-setup-content .wc-setup-pages{width:100%;border-top:1px solid #eee}.wc-setup-content .wc-setup-pages thead th{display:none}.wc-setup-content .wc-setup-pages .page-name{width:30%;font-weight:700}.wc-setup-content .wc-setup-pages td,.wc-setup-content .wc-setup-pages th{padding:14px 0;border-bottom:1px solid #eee}.wc-setup-content .wc-setup-pages td:first-child,.wc-setup-content .wc-setup-pages th:first-child{padding-right:9px}.wc-setup-content .wc-setup-pages th{padding-top:0}.wc-setup-content .wc-setup-pages .page-options p{color:#777;margin:6px 0 0 24px;line-height:1.75em}.wc-setup-content .wc-setup-pages .page-options p input{vertical-align:middle;margin:1px 0 0;height:1.75em;width:1.75em;line-height:1.75em}.wc-setup-content .wc-setup-pages .page-options p label{line-height:1}@media screen and (max-width:782px){.wc-setup-content .form-table tbody th{width:auto}}.wc-setup-content .twitter-share-button{float:right}.wc-setup-content .wc-setup-next-steps{overflow:hidden;margin:0 0 24px;padding-bottom:2px}.wc-setup-content .wc-setup-next-steps h2{margin-bottom:12px}.wc-setup-content .wc-setup-next-steps .wc-setup-next-steps-first{float:left;width:50%;box-sizing:border-box}.wc-setup-content .wc-setup-next-steps .wc-setup-next-steps-last{float:right;width:50%;box-sizing:border-box}.wc-setup-content .wc-setup-next-steps ul{padding:0 2em 0 0;list-style:none outside;margin:0}.wc-setup-content .wc-setup-next-steps ul li a{display:block;padding:0 0 .75em}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button{background-color:#f7f7f7;border-color:#ccc;color:#23282d;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #ccc;text-shadow:1px 0 1px #eee,0 1px 1px #eee;font-size:1em;height:auto;line-height:1.75em;margin:0 0 .75em;opacity:1;padding:1em;text-align:center}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:active,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:focus,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:hover{background:#f5f5f5;border-color:#aaa}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary{color:#fff;background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:active,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:focus,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:hover{color:#fff;background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.wc-setup-content .wc-setup-next-steps ul li a::before{color:#82878c;font:normal 20px/1 dashicons;speak:none;display:inline-block;padding:0 10px 0 0;top:1px;position:relative;text-decoration:none!important;vertical-align:top}.wc-setup-content .wc-setup-next-steps ul .learn-more a::before{content:'\f105'}.wc-setup-content .wc-setup-next-steps ul .video-walkthrough a::before{content:'\f126'}.wc-setup-content .wc-setup-next-steps ul .newsletter a::before{content:'\f465'}.wc-setup-content .updated,.wc-setup-content .woocommerce-newsletter{padding:24px 24px 0;margin:0 0 24px;overflow:hidden;background:#f5f5f5}.wc-setup-content .updated p,.wc-setup-content .woocommerce-newsletter p{padding:0;margin:0 0 12px}.wc-setup-content .updated form,.wc-setup-content .updated p:last-child,.wc-setup-content .woocommerce-newsletter form,.wc-setup-content .woocommerce-newsletter p:last-child{margin:0 0 24px}.wc-setup-content .woocommerce-tracker{margin:24px 0;border:1px solid #eee;padding:20px;border-radius:4px;overflow:hidden}.wc-setup-content .woocommerce-tracker p{font-size:14px;line-height:1.5em}.wc-setup-content .woocommerce-tracker .checkbox{line-height:24px;font-weight:500;font-size:1em;margin-top:0;margin-bottom:20px}.wc-setup-content .checkbox input[type=checkbox]{opacity:0;position:absolute;left:-9999px}.wc-setup-content .checkbox label{position:relative;display:inline-block;padding-left:28px}.wc-setup-content .checkbox label:after,.wc-setup-content .checkbox label:before{position:absolute;content:"";display:inline-block}.wc-setup-content .checkbox label:before{height:16px;width:16px;left:0;top:3px;border:1px solid #aaa;background-color:#fff;border-radius:3px}.wc-setup-content .checkbox label:after{height:5px;width:9px;border-left:2px solid;border-bottom:2px solid;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);left:4px;top:7px;color:#fff}.wc-setup-content .checkbox input[type=checkbox]+label::after{content:none}.wc-setup-content .checkbox input[type=checkbox]:checked+label::after{content:""}.wc-setup-content .checkbox input[type=checkbox]:focus+label::before{outline:#3b99fc auto 5px}.wc-setup-content .checkbox input[type=checkbox]:checked+label::before{background:#935687;border-color:#935687}.wc-setup-steps{padding:0 0 24px;margin:0;list-style:none outside;overflow:hidden;color:#ccc;width:100%;display:-webkit-inline-box;display:inline-flex}.wc-setup-steps li{width:100%;float:left;padding:0 0 .8em;margin:0;text-align:center;position:relative;border-bottom:4px solid #ccc;line-height:1.4em}.wc-setup-steps li a{color:#a16696;text-decoration:none;padding:1.5em;margin:-1.5em;position:relative;z-index:1}.wc-setup-steps li a:focus,.wc-setup-steps li a:hover{color:#111;text-decoration:underline}.wc-setup-steps li::before{content:'';border:4px solid #ccc;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;left:50%;margin-left:-6px;margin-bottom:-8px;background:#fff}.wc-setup-steps li.active{border-color:#a16696;color:#a16696;font-weight:700}.wc-setup-steps li.active::before{border-color:#a16696}.wc-setup-steps li.done{border-color:#a16696;color:#a16696}.wc-setup-steps li.done::before{border-color:#a16696;background:#a16696}.wc-setup .wc-setup-actions{overflow:hidden;margin:20px 0 0;position:relative}.wc-setup .wc-setup-actions .button{font-size:1.25em;padding:.5em 1em;line-height:1em;margin-right:.5em;margin-bottom:2px;height:auto;border-radius:4px}.wc-setup .wc-setup-actions .button-primary{background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597;margin:0;opacity:1}.wc-setup .wc-setup-actions .button-primary:active,.wc-setup .wc-setup-actions .button-primary:focus,.wc-setup .wc-setup-actions .button-primary:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.wc-setup-content p:last-child{margin-bottom:0}.wc-setup-content p.store-setup{margin-top:0}.wc-setup-footer-links{font-size:.85em;color:#7b7b7b;margin:1.18em auto;display:inline-block;text-align:center}.wc-wizard-storefront .wc-wizard-storefront-intro{padding:40px 40px 0;background:#f5f5f5;text-align:center}.wc-wizard-storefront .wc-wizard-storefront-intro img{margin:40px 0 0 0;width:100%;display:block}.wc-wizard-storefront .wc-wizard-storefront-features{list-style:none outside;margin:0 0 20px;padding:0 0 0 30px;overflow:hidden}.wc-wizard-storefront .wc-wizard-storefront-feature{margin:0;padding:20px 30px 20px 2em;width:50%;box-sizing:border-box}.wc-wizard-storefront .wc-wizard-storefront-feature::before{margin-left:-2em;position:absolute}.wc-wizard-storefront .wc-wizard-storefront-feature.first{clear:both;float:left}.wc-wizard-storefront .wc-wizard-storefront-feature.last{float:right}.wc-wizard-storefront .wc-wizard-storefront-feature__bulletproof::before{content:'🔒'}.wc-wizard-storefront .wc-wizard-storefront-feature__mobile::before{content:'📱'}.wc-wizard-storefront .wc-wizard-storefront-feature__accessibility::before{content:'👓'}.wc-wizard-storefront .wc-wizard-storefront-feature__search::before{content:'🔍'}.wc-wizard-storefront .wc-wizard-storefront-feature__compatibility::before{content:'🔧'}.wc-wizard-storefront .wc-wizard-storefront-feature__extendable::before{content:'🎨'}.wc-wizard-services{border:1px solid #eee;padding:0;margin:0 0 1em;list-style:none outside;border-radius:4px;overflow:hidden}.wc-wizard-services p{margin:0 0 1em 0;padding:0;font-size:1em;line-height:1.5em}.wc-wizard-service-item,.wc-wizard-services-list-toggle{display:-webkit-box;display:flex;flex-wrap:nowrap;-webkit-box-pack:justify;justify-content:space-between;padding:0;border-bottom:1px solid #eee;color:#666;-webkit-box-align:center;align-items:center}.wc-wizard-service-item:last-child,.wc-wizard-services-list-toggle:last-child{border-bottom:0}.wc-wizard-service-item .payment-gateway-fee,.wc-wizard-services-list-toggle .payment-gateway-fee{color:#a6a6a6}.wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-services-list-toggle .wc-wizard-service-name{flex-basis:0;min-width:160px;text-align:center;font-weight:700;padding:2em 0;align-self:stretch;display:-webkit-box;display:flex;-webkit-box-align:baseline;align-items:baseline}.wc-wizard-payment-gateway-form .wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-payment-gateway-form .wc-wizard-services-list-toggle .wc-wizard-service-name{-webkit-box-pack:center;justify-content:center}.wc-wizard-service-item .wc-wizard-service-name img,.wc-wizard-services-list-toggle .wc-wizard-service-name img{max-width:75px}.wc-wizard-service-item.stripe-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.stripe-logo .wc-wizard-service-name img{padding:8px 0}.wc-wizard-service-item.paypal-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.paypal-logo .wc-wizard-service-name img{max-width:87px;padding:2px 0}.wc-wizard-service-item.klarna-logo .wc-wizard-service-name,.wc-wizard-services-list-toggle.klarna-logo .wc-wizard-service-name{background:#000}.wc-wizard-service-item.klarna-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.klarna-logo .wc-wizard-service-name img{max-width:87px;padding:12px 0}.wc-wizard-service-item.square-logo .wc-wizard-service-name,.wc-wizard-services-list-toggle.square-logo .wc-wizard-service-name{background:#000}.wc-wizard-service-item.square-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.square-logo .wc-wizard-service-name img{max-width:95px;padding:12px 0}.wc-wizard-service-item.eway-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.eway-logo .wc-wizard-service-name img{max-width:87px}.wc-wizard-service-item.payfast-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.payfast-logo .wc-wizard-service-name img{max-width:140px}.wc-wizard-service-item .wc-wizard-service-description,.wc-wizard-services-list-toggle .wc-wizard-service-description{-webkit-box-flex:1;flex-grow:1;padding:20px}.wc-wizard-service-item .wc-wizard-service-description p,.wc-wizard-services-list-toggle .wc-wizard-service-description p{margin-bottom:1em}.wc-wizard-service-item .wc-wizard-service-description p:last-child,.wc-wizard-services-list-toggle .wc-wizard-service-description p:last-child{margin-bottom:0}.wc-wizard-service-item .wc-wizard-service-description .wc-wizard-service-settings-description,.wc-wizard-services-list-toggle .wc-wizard-service-description .wc-wizard-service-settings-description{display:block;font-style:italic;color:#999}.wc-wizard-service-item .wc-wizard-service-enable,.wc-wizard-services-list-toggle .wc-wizard-service-enable{flex-basis:0;min-width:75px;text-align:center;cursor:pointer;padding:2em 0;position:relative;max-height:1.5em;align-self:flex-start}.wc-wizard-service-item .wc-wizard-service-toggle,.wc-wizard-services-list-toggle .wc-wizard-service-toggle{height:16px;width:32px;border:2px solid #935687;background-color:#935687;display:inline-block;text-indent:-9999px;border-radius:10em;position:relative}.wc-wizard-service-item .wc-wizard-service-toggle input[type=checkbox],.wc-wizard-services-list-toggle .wc-wizard-service-toggle input[type=checkbox]{display:none}.wc-wizard-service-item .wc-wizard-service-toggle:before,.wc-wizard-services-list-toggle .wc-wizard-service-toggle:before{content:"";display:block;width:16px;height:16px;background:#fff;position:absolute;top:0;right:0;border-radius:100%}.wc-wizard-service-item .wc-wizard-service-toggle.disabled,.wc-wizard-services-list-toggle .wc-wizard-service-toggle.disabled{border-color:#999;background-color:#999}.wc-wizard-service-item .wc-wizard-service-toggle.disabled:before,.wc-wizard-services-list-toggle .wc-wizard-service-toggle.disabled:before{right:auto;left:0}.wc-wizard-service-item .wc-wizard-service-settings,.wc-wizard-services-list-toggle .wc-wizard-service-settings{display:none;margin-top:.75em;margin-bottom:0;cursor:default}.wc-wizard-service-item .wc-wizard-service-settings.hide,.wc-wizard-services-list-toggle .wc-wizard-service-settings.hide{display:none}.wc-wizard-service-item.checked .wc-wizard-service-settings,.wc-wizard-services-list-toggle.checked .wc-wizard-service-settings{display:inline-block}.wc-wizard-service-item.checked .wc-wizard-service-settings.hide,.wc-wizard-services-list-toggle.checked .wc-wizard-service-settings.hide{display:none}.wc-wizard-service-item.closed,.wc-wizard-services-list-toggle.closed{border-bottom:0}.wc-wizard-services-list-toggle{cursor:pointer}.wc-wizard-services-list-toggle .wc-wizard-service-enable::before{content:"\f343";font-family:dashicons;visibility:initial;color:#666;font-size:25px;margin-top:-7px;margin-left:-5px;position:absolute;visibility:visible}.wc-wizard-services-list-toggle.closed .wc-wizard-service-enable::before{content:"\f347"}.wc-wizard-services-list-toggle .wc-wizard-service-enable input{visibility:hidden;position:relative}.wc-wizard-services.manual .wc-wizard-service-item{display:none}.wc-wizard-services.shipping .wc-wizard-service-name{font-weight:400;text-align:left;-webkit-box-align:center;align-items:center;max-height:5em;padding:0}.wc-wizard-services.shipping .wc-wizard-service-item{padding-left:2em;padding-top:.67em}.wc-wizard-services.shipping .wc-wizard-service-item:first-child{border-bottom:0;padding-bottom:0;font-weight:700}.wc-wizard-services.shipping .wc-wizard-service-item:first-child .wc-wizard-service-name{font-weight:700}.wc-wizard-services.shipping .shipping-method-setting,.wc-wizard-services.shipping .wc-wizard-shipping-method-select{display:-webkit-box;display:flex}.wc-wizard-services.shipping .shipping-method-setting.hide,.wc-wizard-services.shipping .wc-wizard-shipping-method-select.hide{display:none}.wc-wizard-services.shipping .shipping-method-setting input,.wc-wizard-services.shipping .wc-wizard-shipping-method-dropdown{margin-right:2em;margin-bottom:1em}.wc-wizard-services.shipping .shipping-method-setting input .select2,.wc-wizard-services.shipping .wc-wizard-shipping-method-dropdown .select2{min-width:130px}.wc-wizard-services.shipping .wc-wizard-service-description{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;color:#a6a6a6}.wc-wizard-services.shipping .wc-wizard-service-item:not(:first-child) .wc-wizard-service-description{font-size:.92em;padding-bottom:10px}.wc-wizard-services.shipping .shipping-method-setting input{width:95px;border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:28px;padding-left:8px;padding-right:24px;font-size:14px;color:#444;background-color:#fff;display:inline-block}.wc-wizard-services.shipping .shipping-method-description,.wc-wizard-services.shipping .shipping-method-setting .description{color:#7e7e7e;font-size:.9em}.wc-wizard-services.shipping .shipping-method-setting input::-webkit-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::-moz-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input:-ms-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::-ms-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::placeholder{color:#e1e1e1}.wc-setup-shipping-units p{line-height:1.5em;font-size:13px;margin-bottom:.25em}.wc-setup-shipping-units .wc-setup-shipping-unit{margin-bottom:1.75em}.wc-setup-shipping-units .wc-setup-shipping-unit .select2{min-width:100%}.hide{display:none}.wc-wizard-features{display:-webkit-box;display:flex;flex-wrap:wrap;list-style:none;padding:0}.wc-wizard-features .wc-wizard-feature-item{flex-basis:calc(50% - 4em - 3px);border:1px solid #eee;padding:2em}.wc-wizard-features .wc-wizard-feature-item:nth-child(1){border-radius:4px 0 0 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(2){border-left:0;border-radius:0 4px 0 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(3){border-top:0;border-radius:0 0 0 4px}.wc-wizard-features .wc-wizard-feature-item:nth-child(4){border-top:0;border-left:0;border-radius:0 0 4px 0}.wc-wizard-features p.wc-wizard-feature-description,.wc-wizard-features p.wc-wizard-feature-name{margin:0;line-height:1.5em}h3.jetpack-reasons{text-align:center;margin:3em 0 1em 0;font-size:14px}.jetpack-logo,.wcs-notice{display:block;margin:1.75em auto 2em auto;max-height:175px}.activate-splash .jetpack-logo{width:170px;margin-bottom:0}.activate-splash .wcs-notice{margin-top:1em;padding-left:57px}.step{text-align:center}.wc-setup .wc-setup-actions .button{font-weight:300;font-size:16px;padding:1em 2em;box-shadow:none;min-width:12em;min-width:auto;margin-top:10px}.wc-setup .wc-setup-actions .button:active,.wc-setup .wc-setup-actions .button:focus,.wc-setup .wc-setup-actions .button:hover{box-shadow:none}.wc-setup .wc-setup-actions .plugin-install-info{display:block;font-style:italic;color:#999;font-size:14px;line-height:1.5em;margin:5px 0}.wc-setup .wc-setup-actions .plugin-install-info>*{display:block}.wc-setup .wc-setup-actions .plugin-install-info .plugin-install-info-list-item:not(:last-child)::after{content:', '}.wc-setup .wc-setup-actions .plugin-install-info a{white-space:nowrap}.wc-setup .wc-setup-actions .plugin-install-info a:not(:hover):not(:focus){color:inherit}.plugin-install-source{background:rgba(187,119,174,.15)}.plugin-install-source:not(.wc-wizard-service-item){box-shadow:0 0 0 10px rgba(187,119,174,.15)}.location-prompt{color:#666;font-size:13px;font-weight:500;margin-bottom:.5em;margin-top:.85em;display:inline-block}.location-input{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:30px;width:calc(100% - 8px - 24px - 2px);padding-left:8px;padding-right:24px;font-size:16px;color:#444;background-color:#fff;display:inline-block}.location-input.dropdown{width:100%}.address-step .select2{min-width:100%}.store-address-container .city-and-postcode{display:-webkit-box;display:flex}.store-address-container .city-and-postcode div{flex-basis:50%;margin-right:1em}.store-address-container .city-and-postcode div:last-of-type{margin-right:0}.store-address-container .select2-container,.store-address-container input[type=text],.store-address-container select{margin-bottom:10px}.product-type-container{margin-top:14px;margin-bottom:1px}#woocommerce_sell_in_person{margin-left:0}.wc-wizard-service-settings .payment-email-input{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:30px;padding:0 8px;font-size:14px;color:#444;background-color:#fff;display:inline-block}.newsletter-form-container{display:-webkit-box;display:flex}.newsletter-form-container .newsletter-form-email{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:42px;padding:0 8px;font-size:16px;color:#666;background-color:#fff;display:inline-block;margin-right:6px;-webkit-box-flex:1;flex-grow:1}.newsletter-form-container .newsletter-form-button-container{-webkit-box-flex:0;flex-grow:0}.wc-setup .wc-setup-actions .button.newsletter-form-button{height:42px;padding:0 1em;margin:0}.wc-wizard-next-steps{border:1px solid #eee;border-radius:4px;list-style:none;padding:0}.wc-wizard-next-steps li{padding:0}.wc-wizard-next-steps .wc-wizard-next-step-item{display:-webkit-box;display:flex;border-top:1px solid #eee}.wc-wizard-next-steps .wc-wizard-next-step-item:first-child{border-top:0}.wc-wizard-next-steps .wc-wizard-next-step-description{-webkit-box-flex:1;flex-grow:1;margin:1.5em}.wc-wizard-next-steps .wc-wizard-next-step-action{-webkit-box-flex:0;flex-grow:0;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center}.wc-wizard-next-steps .wc-wizard-next-step-action .button{margin:1em 1.5em}.wc-wizard-next-steps p.next-step-heading{margin:0;font-size:.95em;font-weight:400;font-variant:all-petite-caps}.wc-wizard-next-steps p.next-step-extra-info{margin:0}.wc-wizard-next-steps h3.next-step-description{margin:0;font-size:16px;font-weight:600}.wc-wizard-next-steps .wc-wizard-additional-steps{border-top:1px solid #eee}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-wizard-next-step-description{margin-bottom:0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions{margin:0 0 1.5em 0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions .button{font-size:15px;margin:1em 0 1em 1.5em}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions .button::last-child{margin-right:1.5em}p.next-steps-help-text{color:#9f9f9f;padding:0 2em;text-align:center;font-size:.9em}p.jetpack-terms{font-size:.8em;text-align:center;max-width:480px;margin:0 auto;line-height:1.5em}.woocommerce-error{background:#ffe6e5;border-color:#ffc5c2;padding:1em;margin-bottom:1em}.woocommerce-error p{margin-top:0;margin-bottom:.5em;color:#444}.woocommerce-error a{color:#ff645c}.woocommerce-error .reconnect-reminder{font-size:.85em}.woocommerce-error .wc-setup-actions .button{font-size:14px}.wc-wizard-service-setting-ppec_paypal_reroute_requests,.wc-wizard-service-setting-stripe_create_account{display:-webkit-box;display:flex;-webkit-box-align:start;align-items:flex-start}.wc-wizard-service-setting-ppec_paypal_reroute_requests .payment-checkbox-input,.wc-wizard-service-setting-stripe_create_account .payment-checkbox-input{-webkit-box-ordinal-group:2;order:1;margin-top:5px;margin-left:0;margin-right:0;width:1.5em}.wc-wizard-service-setting-ppec_paypal_reroute_requests .ppec_paypal_reroute_requests,.wc-wizard-service-setting-ppec_paypal_reroute_requests .stripe_create_account,.wc-wizard-service-setting-stripe_create_account .ppec_paypal_reroute_requests,.wc-wizard-service-setting-stripe_create_account .stripe_create_account{-webkit-box-ordinal-group:3;order:2;margin-left:.3em}.wc-wizard-service-setting-ppec_paypal_email,.wc-wizard-service-setting-stripe_email{margin-top:.75em;margin-left:1.5em}.wc-wizard-service-setting-ppec_paypal_email label.ppec_paypal_email,.wc-wizard-service-setting-ppec_paypal_email label.stripe_email,.wc-wizard-service-setting-stripe_email label.ppec_paypal_email,.wc-wizard-service-setting-stripe_email label.stripe_email{position:absolute;margin:-1px;padding:0;height:1px;width:1px;overflow:hidden;clip:rect(0 0 0 0);border:0}.wc-wizard-service-setting-ppec_paypal_email input.payment-email-input,.wc-wizard-service-setting-stripe_email input.payment-email-input{box-sizing:border-box;margin-bottom:.5em;width:100%;height:32px}.wc-setup-content .recommended-step{border:1px solid #ebebeb;border-radius:4px;padding:2.5em}.wc-setup-content .recommended-step li{list-style:none}.wc-setup-content .recommended-step li:last-child label{margin-bottom:0}.wc-setup-content .recommended-step label{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;margin-bottom:1.5em}.wc-setup-content .recommended-step label:after,.wc-setup-content .recommended-step label:before{top:auto}.wc-setup-content .recommended-step label:after{margin-top:-1.5px}.wc-setup-content .recommended-step .recommended-item-icon{border:1px solid #fff;border-radius:7px;height:3.5em;margin-right:1em;margin-left:4px}.wc-setup-content .recommended-step .recommended-item-icon.recommended-item-icon-storefront_theme{background-color:#f4a224;max-height:3em;max-width:3em;padding:.25em}.wc-setup-content .recommended-step .recommended-item-icon.recommended-item-icon-automated_taxes{background-color:#d0011b;max-height:1.75em;padding:.875em}.wc-setup-content .recommended-step .recommended-item-icon.recommended-item-icon-mailchimp{background-color:#209bbb;height:2em;padding:.75em}.wc-setup-content .recommended-step .recommended-item-description-container h3{font-size:15px;font-weight:700;letter-spacing:.5px;margin-bottom:0}.wc-setup-content .recommended-step .recommended-item-description-container p{margin-top:0;line-height:1.5em}
\ No newline at end of file
+@charset "UTF-8";body{margin:65px auto 24px;box-shadow:none;background:#f1f1f1;padding:0}#wc-logo{border:0;margin:0 0 24px;padding:0;text-align:center}#wc-logo img{max-width:30%}.wc-setup{text-align:center}.wc-setup .select2-container{text-align:left}.wc-setup .hidden{display:none}.wc-setup-content{box-shadow:0 1px 3px rgba(0,0,0,.13);padding:2em;margin:0 0 20px;background:#fff;overflow:hidden;zoom:1;text-align:left}.wc-setup-content h1,.wc-setup-content h2,.wc-setup-content h3,.wc-setup-content table{margin:0 0 20px;border:0;padding:0;color:#666;clear:none;font-weight:500}.wc-setup-content p{margin:20px 0;font-size:1em;line-height:1.75em;color:#666}.wc-setup-content table{font-size:1em;line-height:1.75em;color:#666}.wc-setup-content a{color:#a16696}.wc-setup-content a:focus,.wc-setup-content a:hover{color:#111}.wc-setup-content .form-table th{width:35%;vertical-align:top;font-weight:400}.wc-setup-content .form-table td{vertical-align:top}.wc-setup-content .form-table td input,.wc-setup-content .form-table td select{width:100%;box-sizing:border-box}.wc-setup-content .form-table td input[size]{width:auto}.wc-setup-content .form-table td .description{line-height:1.5em;display:block;margin-top:.25em;color:#999;font-style:italic}.wc-setup-content .form-table td .input-checkbox,.wc-setup-content .form-table td .input-radio{width:auto;box-sizing:inherit;padding:inherit;margin:0 .5em 0 0;box-shadow:none}.wc-setup-content .form-table .section_title td{padding:0}.wc-setup-content .form-table .section_title td h2,.wc-setup-content .form-table .section_title td p{margin:12px 0 0}.wc-setup-content .form-table td,.wc-setup-content .form-table th{padding:12px 0;margin:0;border:0}.wc-setup-content .form-table td:first-child,.wc-setup-content .form-table th:first-child{padding-right:1em}.wc-setup-content table.tax-rates{width:100%;font-size:.92em}.wc-setup-content table.tax-rates th{padding:0;text-align:center;width:auto;vertical-align:middle}.wc-setup-content table.tax-rates td{border:1px solid #f5f5f5;padding:6px;text-align:center;vertical-align:middle}.wc-setup-content table.tax-rates td input{outline:0;border:0;padding:0;box-shadow:none;text-align:center;width:100%}.wc-setup-content table.tax-rates td.sort{cursor:move;color:#ccc}.wc-setup-content table.tax-rates td.sort::before{content:'\f333';font-family:dashicons}.wc-setup-content table.tax-rates td.readonly{background:#f5f5f5}.wc-setup-content table.tax-rates .add{padding:1em 0 0 1em;line-height:1em;font-size:1em;width:0;margin:6px 0 0;height:0;overflow:hidden;position:relative;display:inline-block}.wc-setup-content table.tax-rates .add::before{content:'\f502';font-family:dashicons;position:absolute;left:0;top:0}.wc-setup-content table.tax-rates .remove{padding:1em 0 0 1em;line-height:1em;font-size:1em;width:0;margin:0;height:0;overflow:hidden;position:relative;display:inline-block}.wc-setup-content table.tax-rates .remove::before{content:'\f182';font-family:dashicons;position:absolute;left:0;top:0}.wc-setup-content .wc-setup-pages{width:100%;border-top:1px solid #eee}.wc-setup-content .wc-setup-pages thead th{display:none}.wc-setup-content .wc-setup-pages .page-name{width:30%;font-weight:700}.wc-setup-content .wc-setup-pages td,.wc-setup-content .wc-setup-pages th{padding:14px 0;border-bottom:1px solid #eee}.wc-setup-content .wc-setup-pages td:first-child,.wc-setup-content .wc-setup-pages th:first-child{padding-right:9px}.wc-setup-content .wc-setup-pages th{padding-top:0}.wc-setup-content .wc-setup-pages .page-options p{color:#777;margin:6px 0 0 24px;line-height:1.75em}.wc-setup-content .wc-setup-pages .page-options p input{vertical-align:middle;margin:1px 0 0;height:1.75em;width:1.75em;line-height:1.75em}.wc-setup-content .wc-setup-pages .page-options p label{line-height:1}@media screen and (max-width:782px){.wc-setup-content .form-table tbody th{width:auto}}.wc-setup-content .twitter-share-button{float:right}.wc-setup-content .wc-setup-next-steps{overflow:hidden;margin:0 0 24px;padding-bottom:2px}.wc-setup-content .wc-setup-next-steps h2{margin-bottom:12px}.wc-setup-content .wc-setup-next-steps .wc-setup-next-steps-first{float:left;width:50%;box-sizing:border-box}.wc-setup-content .wc-setup-next-steps .wc-setup-next-steps-last{float:right;width:50%;box-sizing:border-box}.wc-setup-content .wc-setup-next-steps ul{padding:0 2em 0 0;list-style:none outside;margin:0}.wc-setup-content .wc-setup-next-steps ul li a{display:block;padding:0 0 .75em}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button{background-color:#f7f7f7;border-color:#ccc;color:#23282d;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #ccc;text-shadow:1px 0 1px #eee,0 1px 1px #eee;font-size:1em;height:auto;line-height:1.75em;margin:0 0 .75em;opacity:1;padding:1em;text-align:center}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:active,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:focus,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:hover{background:#f5f5f5;border-color:#aaa}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary{color:#fff;background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:active,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:focus,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:hover{color:#fff;background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.wc-setup-content .wc-setup-next-steps ul li a::before{color:#82878c;font:normal 20px/1 dashicons;speak:none;display:inline-block;padding:0 10px 0 0;top:1px;position:relative;text-decoration:none!important;vertical-align:top}.wc-setup-content .wc-setup-next-steps ul .learn-more a::before{content:'\f105'}.wc-setup-content .wc-setup-next-steps ul .video-walkthrough a::before{content:'\f126'}.wc-setup-content .wc-setup-next-steps ul .newsletter a::before{content:'\f465'}.wc-setup-content .updated,.wc-setup-content .woocommerce-newsletter{padding:24px 24px 0;margin:0 0 24px;overflow:hidden;background:#f5f5f5}.wc-setup-content .updated p,.wc-setup-content .woocommerce-newsletter p{padding:0;margin:0 0 12px}.wc-setup-content .updated form,.wc-setup-content .updated p:last-child,.wc-setup-content .woocommerce-newsletter form,.wc-setup-content .woocommerce-newsletter p:last-child{margin:0 0 24px}.wc-setup-content .woocommerce-tracker{margin:24px 0;border:1px solid #eee;padding:20px;border-radius:4px;overflow:hidden}.wc-setup-content .woocommerce-tracker p{font-size:14px;line-height:1.5em}.wc-setup-content .woocommerce-tracker .checkbox{line-height:24px;font-weight:500;font-size:1em;margin-top:0;margin-bottom:20px}.wc-setup-content .checkbox input[type=checkbox]{opacity:0;position:absolute;left:-9999px}.wc-setup-content .checkbox label{position:relative;display:inline-block;padding-left:28px}.wc-setup-content .checkbox label:after,.wc-setup-content .checkbox label:before{position:absolute;content:"";display:inline-block}.wc-setup-content .checkbox label:before{height:16px;width:16px;left:0;top:3px;border:1px solid #aaa;background-color:#fff;border-radius:3px}.wc-setup-content .checkbox label:after{height:5px;width:9px;border-left:2px solid;border-bottom:2px solid;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);left:4px;top:7px;color:#fff}.wc-setup-content .checkbox input[type=checkbox]+label::after{content:none}.wc-setup-content .checkbox input[type=checkbox]:checked+label::after{content:""}.wc-setup-content .checkbox input[type=checkbox]:focus+label::before{outline:#3b99fc auto 5px}.wc-setup-content .checkbox input[type=checkbox]:checked+label::before{background:#935687;border-color:#935687}.wc-setup-steps{padding:0 0 24px;margin:0;list-style:none outside;overflow:hidden;color:#ccc;width:100%;display:-webkit-inline-box;display:inline-flex}.wc-setup-steps li{width:100%;float:left;padding:0 0 .8em;margin:0;text-align:center;position:relative;border-bottom:4px solid #ccc;line-height:1.4em}.wc-setup-steps li a{color:#a16696;text-decoration:none;padding:1.5em;margin:-1.5em;position:relative;z-index:1}.wc-setup-steps li a:focus,.wc-setup-steps li a:hover{color:#111;text-decoration:underline}.wc-setup-steps li::before{content:'';border:4px solid #ccc;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;left:50%;margin-left:-6px;margin-bottom:-8px;background:#fff}.wc-setup-steps li.active{border-color:#a16696;color:#a16696;font-weight:700}.wc-setup-steps li.active::before{border-color:#a16696}.wc-setup-steps li.done{border-color:#a16696;color:#a16696}.wc-setup-steps li.done::before{border-color:#a16696;background:#a16696}.wc-setup .wc-setup-actions{overflow:hidden;margin:20px 0 0;position:relative}.wc-setup .wc-setup-actions .button{font-size:1.25em;padding:.5em 1em;line-height:1em;margin-right:.5em;margin-bottom:2px;height:auto;border-radius:4px}.wc-setup .wc-setup-actions .button-primary{background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597;margin:0;opacity:1}.wc-setup .wc-setup-actions .button-primary:active,.wc-setup .wc-setup-actions .button-primary:focus,.wc-setup .wc-setup-actions .button-primary:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.wc-setup-content p:last-child{margin-bottom:0}.wc-setup-content p.store-setup{margin-top:0}.wc-setup-footer-links{font-size:.85em;color:#7b7b7b;margin:1.18em auto;display:inline-block;text-align:center}.wc-wizard-storefront .wc-wizard-storefront-intro{padding:40px 40px 0;background:#f5f5f5;text-align:center}.wc-wizard-storefront .wc-wizard-storefront-intro img{margin:40px 0 0 0;width:100%;display:block}.wc-wizard-storefront .wc-wizard-storefront-features{list-style:none outside;margin:0 0 20px;padding:0 0 0 30px;overflow:hidden}.wc-wizard-storefront .wc-wizard-storefront-feature{margin:0;padding:20px 30px 20px 2em;width:50%;box-sizing:border-box}.wc-wizard-storefront .wc-wizard-storefront-feature::before{margin-left:-2em;position:absolute}.wc-wizard-storefront .wc-wizard-storefront-feature.first{clear:both;float:left}.wc-wizard-storefront .wc-wizard-storefront-feature.last{float:right}.wc-wizard-storefront .wc-wizard-storefront-feature__bulletproof::before{content:'🔒'}.wc-wizard-storefront .wc-wizard-storefront-feature__mobile::before{content:'📱'}.wc-wizard-storefront .wc-wizard-storefront-feature__accessibility::before{content:'👓'}.wc-wizard-storefront .wc-wizard-storefront-feature__search::before{content:'🔍'}.wc-wizard-storefront .wc-wizard-storefront-feature__compatibility::before{content:'🔧'}.wc-wizard-storefront .wc-wizard-storefront-feature__extendable::before{content:'🎨'}.wc-wizard-services{border:1px solid #eee;padding:0;margin:0 0 1em;list-style:none outside;border-radius:4px;overflow:hidden}.wc-wizard-services p{margin:0 0 1em 0;padding:0;font-size:1em;line-height:1.5em}.wc-wizard-service-item,.wc-wizard-services-list-toggle{display:-webkit-box;display:flex;flex-wrap:nowrap;-webkit-box-pack:justify;justify-content:space-between;padding:0;border-bottom:1px solid #eee;color:#666;-webkit-box-align:center;align-items:center}.wc-wizard-service-item:last-child,.wc-wizard-services-list-toggle:last-child{border-bottom:0}.wc-wizard-service-item .payment-gateway-fee,.wc-wizard-services-list-toggle .payment-gateway-fee{color:#a6a6a6}.wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-services-list-toggle .wc-wizard-service-name{flex-basis:0;min-width:160px;text-align:center;font-weight:700;padding:2em 0;align-self:stretch;display:-webkit-box;display:flex;-webkit-box-align:baseline;align-items:baseline}.wc-wizard-payment-gateway-form .wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-payment-gateway-form .wc-wizard-services-list-toggle .wc-wizard-service-name{-webkit-box-pack:center;justify-content:center}.wc-wizard-service-item .wc-wizard-service-name img,.wc-wizard-services-list-toggle .wc-wizard-service-name img{max-width:75px}.wc-wizard-service-item.stripe-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.stripe-logo .wc-wizard-service-name img{padding:8px 0}.wc-wizard-service-item.paypal-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.paypal-logo .wc-wizard-service-name img{max-width:87px;padding:2px 0}.wc-wizard-service-item.klarna-logo .wc-wizard-service-name,.wc-wizard-services-list-toggle.klarna-logo .wc-wizard-service-name{background:#000}.wc-wizard-service-item.klarna-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.klarna-logo .wc-wizard-service-name img{max-width:87px;padding:12px 0}.wc-wizard-service-item.square-logo .wc-wizard-service-name,.wc-wizard-services-list-toggle.square-logo .wc-wizard-service-name{background:#000}.wc-wizard-service-item.square-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.square-logo .wc-wizard-service-name img{max-width:95px;padding:12px 0}.wc-wizard-service-item.eway-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.eway-logo .wc-wizard-service-name img{max-width:87px}.wc-wizard-service-item.payfast-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.payfast-logo .wc-wizard-service-name img{max-width:140px}.wc-wizard-service-item .wc-wizard-service-description,.wc-wizard-services-list-toggle .wc-wizard-service-description{-webkit-box-flex:1;flex-grow:1;padding:20px}.wc-wizard-service-item .wc-wizard-service-description p,.wc-wizard-services-list-toggle .wc-wizard-service-description p{margin-bottom:1em}.wc-wizard-service-item .wc-wizard-service-description p:last-child,.wc-wizard-services-list-toggle .wc-wizard-service-description p:last-child{margin-bottom:0}.wc-wizard-service-item .wc-wizard-service-description .wc-wizard-service-settings-description,.wc-wizard-services-list-toggle .wc-wizard-service-description .wc-wizard-service-settings-description{display:block;font-style:italic;color:#999}.wc-wizard-service-item .wc-wizard-service-enable,.wc-wizard-services-list-toggle .wc-wizard-service-enable{flex-basis:0;min-width:75px;text-align:center;cursor:pointer;padding:2em 0;position:relative;max-height:1.5em;align-self:flex-start}.wc-wizard-service-item .wc-wizard-service-toggle,.wc-wizard-services-list-toggle .wc-wizard-service-toggle{height:16px;width:32px;border:2px solid #935687;background-color:#935687;display:inline-block;text-indent:-9999px;border-radius:10em;position:relative}.wc-wizard-service-item .wc-wizard-service-toggle input[type=checkbox],.wc-wizard-services-list-toggle .wc-wizard-service-toggle input[type=checkbox]{display:none}.wc-wizard-service-item .wc-wizard-service-toggle:before,.wc-wizard-services-list-toggle .wc-wizard-service-toggle:before{content:"";display:block;width:16px;height:16px;background:#fff;position:absolute;top:0;right:0;border-radius:100%}.wc-wizard-service-item .wc-wizard-service-toggle.disabled,.wc-wizard-services-list-toggle .wc-wizard-service-toggle.disabled{border-color:#999;background-color:#999}.wc-wizard-service-item .wc-wizard-service-toggle.disabled:before,.wc-wizard-services-list-toggle .wc-wizard-service-toggle.disabled:before{right:auto;left:0}.wc-wizard-service-item .wc-wizard-service-settings,.wc-wizard-services-list-toggle .wc-wizard-service-settings{display:none;margin-top:.75em;margin-bottom:0;cursor:default}.wc-wizard-service-item .wc-wizard-service-settings.hide,.wc-wizard-services-list-toggle .wc-wizard-service-settings.hide{display:none}.wc-wizard-service-item.checked .wc-wizard-service-settings,.wc-wizard-services-list-toggle.checked .wc-wizard-service-settings{display:inline-block}.wc-wizard-service-item.checked .wc-wizard-service-settings.hide,.wc-wizard-services-list-toggle.checked .wc-wizard-service-settings.hide{display:none}.wc-wizard-service-item.closed,.wc-wizard-services-list-toggle.closed{border-bottom:0}.wc-wizard-services-list-toggle{cursor:pointer}.wc-wizard-services-list-toggle .wc-wizard-service-enable::before{content:"\f343";font-family:dashicons;visibility:initial;color:#666;font-size:25px;margin-top:-7px;margin-left:-5px;position:absolute;visibility:visible}.wc-wizard-services-list-toggle.closed .wc-wizard-service-enable::before{content:"\f347"}.wc-wizard-services-list-toggle .wc-wizard-service-enable input{visibility:hidden;position:relative}.wc-wizard-services.manual .wc-wizard-service-item{display:none}.wc-wizard-services.shipping{margin:0}.wc-wizard-services.shipping .wc-wizard-service-name{font-weight:400;text-align:left;-webkit-box-align:center;align-items:center;max-height:5em;padding:0}.wc-wizard-services.shipping .wc-wizard-service-item{padding-left:2em;padding-top:.67em}.wc-wizard-services.shipping .wc-wizard-service-item:first-child{border-bottom:0;padding-bottom:0;font-weight:700}.wc-wizard-services.shipping .wc-wizard-service-item:first-child .wc-wizard-service-name{font-weight:700}.wc-wizard-services.shipping .shipping-method-setting,.wc-wizard-services.shipping .wc-wizard-shipping-method-select{display:-webkit-box;display:flex}.wc-wizard-services.shipping .shipping-method-setting.hide,.wc-wizard-services.shipping .wc-wizard-shipping-method-select.hide{display:none}.wc-wizard-services.shipping .shipping-method-setting input,.wc-wizard-services.shipping .wc-wizard-shipping-method-dropdown{margin-right:2em;margin-bottom:1em}.wc-wizard-services.shipping .shipping-method-setting input .select2,.wc-wizard-services.shipping .wc-wizard-shipping-method-dropdown .select2{min-width:130px}.wc-wizard-services.shipping .wc-wizard-service-description{display:-webkit-box;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;color:#a6a6a6}.wc-wizard-services.shipping .wc-wizard-service-item:not(:first-child) .wc-wizard-service-description{font-size:.92em;padding-bottom:10px}.wc-wizard-services.shipping .shipping-method-setting input{width:95px;border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:28px;padding-left:8px;padding-right:24px;font-size:14px;color:#444;background-color:#fff;display:inline-block}.wc-wizard-services.shipping .shipping-method-description,.wc-wizard-services.shipping .shipping-method-setting .description{color:#7e7e7e;font-size:.9em}.wc-wizard-services.shipping .shipping-method-setting input::-webkit-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::-ms-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::placeholder{color:#e1e1e1}.wc-setup-shipping-units p{line-height:1.5em;font-size:13px;margin-bottom:.25em;text-align:center}.wc-setup-shipping-units .wc-setup-shipping-unit{margin-bottom:1.75em}.wc-setup-shipping-units .wc-setup-shipping-unit .select2{min-width:125px;top:-5px}.hide{display:none}.wc-wizard-features{display:-webkit-box;display:flex;flex-wrap:wrap;list-style:none;padding:0}.wc-wizard-features .wc-wizard-feature-item{flex-basis:calc(50% - 4em - 3px);border:1px solid #eee;padding:2em}.wc-wizard-features .wc-wizard-feature-item:nth-child(1){border-radius:4px 0 0 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(2){border-left:0;border-radius:0 4px 0 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(3){border-top:0;border-radius:0 0 0 4px}.wc-wizard-features .wc-wizard-feature-item:nth-child(4){border-top:0;border-left:0;border-radius:0 0 4px 0}.wc-wizard-features p.wc-wizard-feature-description,.wc-wizard-features p.wc-wizard-feature-name{margin:0;line-height:1.5em}h3.jetpack-reasons{text-align:center;margin:3em 0 1em 0;font-size:14px}.jetpack-logo,.wcs-notice{display:block;margin:1.75em auto 2em auto;max-height:175px}.activate-splash .jetpack-logo{width:170px;margin-bottom:0}.activate-splash .wcs-notice{margin-top:1em;padding-left:57px}.step{text-align:center}.wc-setup .wc-setup-actions .button{font-weight:300;font-size:16px;padding:1em 2em;box-shadow:none;min-width:12em;min-width:auto;margin-top:10px}.wc-setup .wc-setup-actions .button:active,.wc-setup .wc-setup-actions .button:focus,.wc-setup .wc-setup-actions .button:hover{box-shadow:none}.wc-setup .wc-setup-actions .plugin-install-info{display:block;font-style:italic;color:#999;font-size:14px;line-height:1.5em;margin:5px 0}.wc-setup .wc-setup-actions .plugin-install-info>*{display:block}.wc-setup .wc-setup-actions .plugin-install-info .plugin-install-info-list-item::after{content:', '}.wc-setup .wc-setup-actions .plugin-install-info .plugin-install-info-list-item:last-of-type::after{content:'. '}.wc-setup .wc-setup-actions .plugin-install-info a{white-space:nowrap}.wc-setup .wc-setup-actions .plugin-install-info a:not(:hover):not(:focus){color:inherit}.plugin-install-source{background:rgba(187,119,174,.15)}.plugin-install-source:not(.wc-wizard-service-item){box-shadow:0 0 0 10px rgba(187,119,174,.15)}.location-prompt{color:#666;font-size:13px;font-weight:500;margin-bottom:.5em;margin-top:.85em;display:inline-block}.location-input{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:30px;width:calc(100% - 8px - 24px - 2px);padding-left:8px;padding-right:24px;font-size:16px;color:#444;background-color:#fff;display:inline-block}.location-input.dropdown{width:100%}.address-step .select2{min-width:100%}.store-address-container .city-and-postcode{display:-webkit-box;display:flex}.store-address-container .city-and-postcode div{flex-basis:50%;margin-right:1em}.store-address-container .city-and-postcode div:last-of-type{margin-right:0}.store-address-container .select2-container,.store-address-container input[type=text],.store-address-container select{margin-bottom:10px}.product-type-container{margin-top:14px;margin-bottom:1px}#woocommerce_sell_in_person{margin-left:0}.wc-wizard-service-settings .payment-email-input{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:30px;padding:0 8px;font-size:14px;color:#444;background-color:#fff;display:inline-block}.wc-wizard-service-settings .payment-email-input[disabled]{color:#aaa}.newsletter-form-container{display:-webkit-box;display:flex}.newsletter-form-container .newsletter-form-email{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:42px;padding:0 8px;font-size:16px;color:#666;background-color:#fff;display:inline-block;margin-right:6px;-webkit-box-flex:1;flex-grow:1}.newsletter-form-container .newsletter-form-button-container{-webkit-box-flex:0;flex-grow:0}.wc-setup .wc-setup-actions .button.newsletter-form-button{height:42px;padding:0 1em;margin:0}.wc-wizard-next-steps{border:1px solid #eee;border-radius:4px;list-style:none;padding:0}.wc-wizard-next-steps li{padding:0}.wc-wizard-next-steps .wc-wizard-next-step-item{display:-webkit-box;display:flex;border-top:1px solid #eee}.wc-wizard-next-steps .wc-wizard-next-step-item:first-child{border-top:0}.wc-wizard-next-steps .wc-wizard-next-step-description{-webkit-box-flex:1;flex-grow:1;margin:1.5em}.wc-wizard-next-steps .wc-wizard-next-step-action{-webkit-box-flex:0;flex-grow:0;display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center}.wc-wizard-next-steps .wc-wizard-next-step-action .button{margin:1em 1.5em}.wc-wizard-next-steps p.next-step-heading{margin:0;font-size:.95em;font-weight:400;font-variant:all-petite-caps}.wc-wizard-next-steps p.next-step-extra-info{margin:0}.wc-wizard-next-steps h3.next-step-description{margin:0;font-size:16px;font-weight:600}.wc-wizard-next-steps .wc-wizard-additional-steps{border-top:1px solid #eee}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-wizard-next-step-description{margin-bottom:0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions{margin:0 0 1.5em 0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions .button{font-size:15px;margin:1em 0 1em 1.5em}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions .button::last-child{margin-right:1.5em}p.next-steps-help-text{color:#9f9f9f;padding:0 2em;text-align:center;font-size:.9em}p.jetpack-terms{font-size:.8em;text-align:center;max-width:480px;margin:0 auto;line-height:1.5em}.woocommerce-error{background:#ffe6e5;border-color:#ffc5c2;padding:1em;margin-bottom:1em}.woocommerce-error p{margin-top:0;margin-bottom:.5em;color:#444}.woocommerce-error a{color:#ff645c}.woocommerce-error .reconnect-reminder{font-size:.85em}.woocommerce-error .wc-setup-actions .button{font-size:14px}.wc-wizard-service-setting-ppec_paypal_reroute_requests,.wc-wizard-service-setting-stripe_create_account{display:-webkit-box;display:flex;-webkit-box-align:start;align-items:flex-start}.wc-wizard-service-setting-ppec_paypal_reroute_requests .payment-checkbox-input,.wc-wizard-service-setting-stripe_create_account .payment-checkbox-input{-webkit-box-ordinal-group:2;order:1;margin-top:5px;margin-left:0;margin-right:0;width:1.5em}.wc-wizard-service-setting-ppec_paypal_reroute_requests .ppec_paypal_reroute_requests,.wc-wizard-service-setting-ppec_paypal_reroute_requests .stripe_create_account,.wc-wizard-service-setting-stripe_create_account .ppec_paypal_reroute_requests,.wc-wizard-service-setting-stripe_create_account .stripe_create_account{-webkit-box-ordinal-group:3;order:2;margin-left:.3em}.wc-wizard-service-setting-ppec_paypal_email,.wc-wizard-service-setting-stripe_email{margin-top:.75em;margin-left:1.5em}.wc-wizard-service-setting-ppec_paypal_email label.ppec_paypal_email,.wc-wizard-service-setting-ppec_paypal_email label.stripe_email,.wc-wizard-service-setting-stripe_email label.ppec_paypal_email,.wc-wizard-service-setting-stripe_email label.stripe_email{position:absolute;margin:-1px;padding:0;height:1px;width:1px;overflow:hidden;clip:rect(0 0 0 0);border:0}.wc-wizard-service-setting-ppec_paypal_email input.payment-email-input,.wc-wizard-service-setting-stripe_email input.payment-email-input{box-sizing:border-box;margin-bottom:.5em;width:100%;height:32px}.wc-setup-content .recommended-step{border:1px solid #ebebeb;border-radius:4px;padding:2.5em}.wc-setup-content .recommended-item{list-style:none}.wc-setup-content .recommended-item:last-child label{margin-bottom:0}.wc-setup-content .recommended-item label{display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center;margin-bottom:1.5em}.wc-setup-content .recommended-item label:after,.wc-setup-content .recommended-item label:before{top:auto}.wc-setup-content .recommended-item label:after{margin-top:-1.5px}.wc-setup-content .recommended-item .recommended-item-icon{border:1px solid #fff;border-radius:7px;height:3.5em;margin-right:1em;margin-left:4px}.wc-setup-content .recommended-item .recommended-item-icon.recommended-item-icon-storefront_theme{background-color:#f4a224;max-height:3em;max-width:3em;padding:.25em}.wc-setup-content .recommended-item .recommended-item-icon.recommended-item-icon-automated_taxes{background-color:#d0011b;max-height:1.75em;padding:.875em}.wc-setup-content .recommended-item .recommended-item-icon.recommended-item-icon-mailchimp{background-color:#209bbb;height:2em;padding:.75em}.wc-setup-content .recommended-item .recommended-item-icon.recommended-item-icon-woocommerce_services{background-color:#f0f0f0;max-height:1.5em;padding:1.3em .7em}.wc-setup-content .recommended-item .recommended-item-icon.recommended-item-icon-shipstation{background-color:#f0f0f0;padding:.3em}.wc-setup-content .recommended-item .recommended-item-description-container h3{font-size:15px;font-weight:700;letter-spacing:.5px;margin-bottom:0}.wc-setup-content .recommended-item .recommended-item-description-container p{margin-top:0;line-height:1.5em}.wc-wizard-service-info{padding:1em 2em;background-color:#fafafa}.help_tip{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.wc-setup #tiptip_content{background:#5f6973}.wc-setup #tiptip_holder.tip_top #tiptip_arrow_inner{border-top-color:#5f6973}.wc-setup-shipping-recommended{border-bottom:1px solid #eee;margin-top:0;padding:30px 0}
\ No newline at end of file
diff --git a/assets/css/wc-setup.scss b/assets/css/wc-setup.scss
index e7926dd69a4..bffdc285f41 100644
--- a/assets/css/wc-setup.scss
+++ b/assets/css/wc-setup.scss
@@ -767,6 +767,7 @@ body {
// Shipping list of services
.wc-wizard-services.shipping {
+ margin: 0;
.wc-wizard-service-name {
font-weight: normal;
@@ -852,13 +853,15 @@ body {
line-height: 1.5em;
font-size: 13px;
margin-bottom: 0.25em;
+ text-align: center;
}
.wc-setup-shipping-unit {
margin-bottom: 1.75em;
.select2 {
- min-width: 100%; // widen dropdowns
+ min-width: 125px; // widen dropdowns
+ top: -5px; // vertically align dropdown value with surrounding text
}
}
}
@@ -960,10 +963,14 @@ h3.jetpack-reasons {
display: block;
}
- .plugin-install-info-list-item:not(:last-child)::after {
+ .plugin-install-info-list-item::after {
content: ', ';
}
+ .plugin-install-info-list-item:last-of-type::after {
+ content: '. ';
+ }
+
a {
white-space: nowrap;
@@ -1053,6 +1060,10 @@ h3.jetpack-reasons {
color: #444;
background-color: #fff;
display: inline-block;
+
+ &[disabled] {
+ color: #aaa;
+ }
}
}
@@ -1245,13 +1256,13 @@ p.jetpack-terms {
border: 1px solid #ebebeb;
border-radius: 4px;
padding: 2.5em;
+}
- li {
- list-style: none;
+.wc-setup-content .recommended-item {
+ list-style: none;
- &:last-child label {
- margin-bottom: 0; // Avoid extra space at the end of the list.
- }
+ &:last-child label {
+ margin-bottom: 0; // Avoid extra space at the end of the list.
}
label {
@@ -1292,6 +1303,17 @@ p.jetpack-terms {
height: 2em;
padding: ( 3.5em - 2em ) / 2;
}
+
+ &.recommended-item-icon-woocommerce_services {
+ background-color: #f0f0f0;
+ max-height: 1.5em;
+ padding: 1.3em .7em;
+ }
+
+ &.recommended-item-icon-shipstation {
+ background-color: #f0f0f0;
+ padding: .3em;
+ }
}
.recommended-item-description-container {
@@ -1308,3 +1330,28 @@ p.jetpack-terms {
}
}
}
+
+.wc-wizard-service-info {
+ padding: 1em 2em;
+ background-color: #fafafa;
+}
+
+.help_tip {
+ text-decoration: underline dotted;
+}
+
+.wc-setup {
+ #tiptip_content {
+ background: #5f6973;
+ }
+
+ #tiptip_holder.tip_top #tiptip_arrow_inner {
+ border-top-color: #5f6973;
+ }
+}
+
+.wc-setup-shipping-recommended {
+ border-bottom: 1px solid #eee;
+ margin-top: 0;
+ padding: 30px 0;
+}
\ No newline at end of file
diff --git a/assets/fonts/WooCommerce.svg b/assets/fonts/WooCommerce.svg
index 05880716894..6be91d22366 100644
--- a/assets/fonts/WooCommerce.svg
+++ b/assets/fonts/WooCommerce.svg
@@ -1,98 +1 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/assets/fonts/star.svg b/assets/fonts/star.svg
index 0f00f2e9d2e..0c606d71f02 100644
--- a/assets/fonts/star.svg
+++ b/assets/fonts/star.svg
@@ -1,19 +1 @@
-
-
-
-
-This is a custom SVG font generated by IcoMoon.
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/images/eway-logo.jpg b/assets/images/eway-logo.jpg
index 696cb01b539..627eb3b8902 100644
Binary files a/assets/images/eway-logo.jpg and b/assets/images/eway-logo.jpg differ
diff --git a/assets/images/icons/credit-cards/amex.png b/assets/images/icons/credit-cards/amex.png
index 9a2b07d0d5d..643153e54fb 100644
Binary files a/assets/images/icons/credit-cards/amex.png and b/assets/images/icons/credit-cards/amex.png differ
diff --git a/assets/images/icons/credit-cards/amex.svg b/assets/images/icons/credit-cards/amex.svg
index 9fe30485465..bc02a4242b3 100644
--- a/assets/images/icons/credit-cards/amex.svg
+++ b/assets/images/icons/credit-cards/amex.svg
@@ -1,14 +1 @@
-
-
-
- Slice 1
- Created with Sketch.
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/images/icons/credit-cards/diners.png b/assets/images/icons/credit-cards/diners.png
index 294073d9fd9..91164293bde 100644
Binary files a/assets/images/icons/credit-cards/diners.png and b/assets/images/icons/credit-cards/diners.png differ
diff --git a/assets/images/icons/credit-cards/diners.svg b/assets/images/icons/credit-cards/diners.svg
index b0c78cdd712..12eba6516b0 100644
--- a/assets/images/icons/credit-cards/diners.svg
+++ b/assets/images/icons/credit-cards/diners.svg
@@ -1,15 +1 @@
-
-
-
- diners
- Created with Sketch.
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/images/icons/credit-cards/discover.png b/assets/images/icons/credit-cards/discover.png
index a0f4ab39ccf..2d1b1ad183b 100644
Binary files a/assets/images/icons/credit-cards/discover.png and b/assets/images/icons/credit-cards/discover.png differ
diff --git a/assets/images/icons/credit-cards/discover.svg b/assets/images/icons/credit-cards/discover.svg
index b2e4636ef1a..ef41dd7d813 100644
--- a/assets/images/icons/credit-cards/discover.svg
+++ b/assets/images/icons/credit-cards/discover.svg
@@ -1,14 +1 @@
-
-
-
- discover
- Created with Sketch.
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/images/icons/credit-cards/jcb.png b/assets/images/icons/credit-cards/jcb.png
index 30f31a311a9..37498371dba 100644
Binary files a/assets/images/icons/credit-cards/jcb.png and b/assets/images/icons/credit-cards/jcb.png differ
diff --git a/assets/images/icons/credit-cards/jcb.svg b/assets/images/icons/credit-cards/jcb.svg
index b30f4c3cab1..c639790905e 100644
--- a/assets/images/icons/credit-cards/jcb.svg
+++ b/assets/images/icons/credit-cards/jcb.svg
@@ -1,29 +1 @@
-
-
-
- Slice 1
- Created with Sketch.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/images/icons/credit-cards/laser.png b/assets/images/icons/credit-cards/laser.png
index 7917b0aac7e..cf7a656edde 100644
Binary files a/assets/images/icons/credit-cards/laser.png and b/assets/images/icons/credit-cards/laser.png differ
diff --git a/assets/images/icons/credit-cards/laser.svg b/assets/images/icons/credit-cards/laser.svg
index 55250c4d103..6e83154c46b 100644
--- a/assets/images/icons/credit-cards/laser.svg
+++ b/assets/images/icons/credit-cards/laser.svg
@@ -1,71 +1 @@
-
-
-
-
-Slice 1
-Created with Sketch.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/assets/images/icons/credit-cards/maestro.png b/assets/images/icons/credit-cards/maestro.png
index 509d99b8724..64f3ab351c9 100644
Binary files a/assets/images/icons/credit-cards/maestro.png and b/assets/images/icons/credit-cards/maestro.png differ
diff --git a/assets/images/icons/credit-cards/maestro.svg b/assets/images/icons/credit-cards/maestro.svg
index 8f0494a2b3b..1d9b19d6b06 100644
--- a/assets/images/icons/credit-cards/maestro.svg
+++ b/assets/images/icons/credit-cards/maestro.svg
@@ -1,29 +1 @@
-
-
-
- Slice 1
- Created with Sketch.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/images/icons/credit-cards/mastercard.png b/assets/images/icons/credit-cards/mastercard.png
index c626f5e1795..9ee5ac318a6 100644
Binary files a/assets/images/icons/credit-cards/mastercard.png and b/assets/images/icons/credit-cards/mastercard.png differ
diff --git a/assets/images/icons/credit-cards/mastercard.svg b/assets/images/icons/credit-cards/mastercard.svg
index 8ceb0d2bfb0..68cdecb6541 100644
--- a/assets/images/icons/credit-cards/mastercard.svg
+++ b/assets/images/icons/credit-cards/mastercard.svg
@@ -1,31 +1 @@
-
-
-
- Slice 1
- Created with Sketch.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/images/icons/credit-cards/visa.png b/assets/images/icons/credit-cards/visa.png
index 43cbfcbf7a4..9b5c9c7ff16 100644
Binary files a/assets/images/icons/credit-cards/visa.png and b/assets/images/icons/credit-cards/visa.png differ
diff --git a/assets/images/icons/credit-cards/visa.svg b/assets/images/icons/credit-cards/visa.svg
index 115f2bfb813..515586fab23 100644
--- a/assets/images/icons/credit-cards/visa.svg
+++ b/assets/images/icons/credit-cards/visa.svg
@@ -1,17 +1 @@
-
-
-
- Slice 1
- Created with Sketch.
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/images/icons/edit.png b/assets/images/icons/edit.png
index 8167b2bfcbe..650db013c5b 100644
Binary files a/assets/images/icons/edit.png and b/assets/images/icons/edit.png differ
diff --git a/assets/images/icons/loader.svg b/assets/images/icons/loader.svg
index 4107219b969..f6737a22585 100644
--- a/assets/images/icons/loader.svg
+++ b/assets/images/icons/loader.svg
@@ -1,8 +1 @@
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/assets/images/jetpack_horizontal_logo.png b/assets/images/jetpack_horizontal_logo.png
index 7a9747a694b..0209c0cc16b 100644
Binary files a/assets/images/jetpack_horizontal_logo.png and b/assets/images/jetpack_horizontal_logo.png differ
diff --git a/assets/images/jetpack_vertical_logo.png b/assets/images/jetpack_vertical_logo.png
index f6650ba1446..619fabd4525 100644
Binary files a/assets/images/jetpack_vertical_logo.png and b/assets/images/jetpack_vertical_logo.png differ
diff --git a/assets/images/klarna-white.png b/assets/images/klarna-white.png
index bb15c8aa506..9e91ebdbed6 100644
Binary files a/assets/images/klarna-white.png and b/assets/images/klarna-white.png differ
diff --git a/assets/images/obw-mailchimp-icon.svg b/assets/images/obw-mailchimp-icon.svg
index 73f72b88bc9..4a9b616a176 100644
--- a/assets/images/obw-mailchimp-icon.svg
+++ b/assets/images/obw-mailchimp-icon.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/images/obw-shipstation-icon.png b/assets/images/obw-shipstation-icon.png
new file mode 100644
index 00000000000..b546301a945
Binary files /dev/null and b/assets/images/obw-shipstation-icon.png differ
diff --git a/assets/images/obw-storefront-icon.svg b/assets/images/obw-storefront-icon.svg
index a61ebc722bd..4617e869942 100644
--- a/assets/images/obw-storefront-icon.svg
+++ b/assets/images/obw-storefront-icon.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/assets/images/obw-taxes-icon.svg b/assets/images/obw-taxes-icon.svg
index ff9e702715f..d1b0469cf1e 100644
--- a/assets/images/obw-taxes-icon.svg
+++ b/assets/images/obw-taxes-icon.svg
@@ -1 +1 @@
-
+
\ No newline at end of file
diff --git a/assets/images/obw-woocommerce-services-icon.png b/assets/images/obw-woocommerce-services-icon.png
new file mode 100644
index 00000000000..3ef4c2da453
Binary files /dev/null and b/assets/images/obw-woocommerce-services-icon.png differ
diff --git a/assets/images/payfast.png b/assets/images/payfast.png
index 1ff033096e9..7199cd00b8f 100644
Binary files a/assets/images/payfast.png and b/assets/images/payfast.png differ
diff --git a/assets/images/paypal-braintree.png b/assets/images/paypal-braintree.png
index 2eb31c6136f..465109ac26f 100644
Binary files a/assets/images/paypal-braintree.png and b/assets/images/paypal-braintree.png differ
diff --git a/assets/images/paypal.png b/assets/images/paypal.png
index a892ac1d876..743d0f2a612 100644
Binary files a/assets/images/paypal.png and b/assets/images/paypal.png differ
diff --git a/assets/images/placeholder.png b/assets/images/placeholder.png
index d95719cea10..0a039557062 100644
Binary files a/assets/images/placeholder.png and b/assets/images/placeholder.png differ
diff --git a/assets/images/select2-spinner.gif b/assets/images/select2-spinner.gif
index 5b33f7e54f4..2525782bb8d 100644
Binary files a/assets/images/select2-spinner.gif and b/assets/images/select2-spinner.gif differ
diff --git a/assets/images/select2.png b/assets/images/select2.png
index 1d804ffb996..32c2fc3a22b 100644
Binary files a/assets/images/select2.png and b/assets/images/select2.png differ
diff --git a/assets/images/select2x2.png b/assets/images/select2x2.png
index 4bdd5c961d4..44b188fd020 100644
Binary files a/assets/images/select2x2.png and b/assets/images/select2x2.png differ
diff --git a/assets/images/square-white.png b/assets/images/square-white.png
index 3a7921f3f8f..b062c251d9e 100644
Binary files a/assets/images/square-white.png and b/assets/images/square-white.png differ
diff --git a/assets/images/storefront-bg.jpg b/assets/images/storefront-bg.jpg
index 1ba57202afb..85f51952cf4 100644
Binary files a/assets/images/storefront-bg.jpg and b/assets/images/storefront-bg.jpg differ
diff --git a/assets/images/storefront-intro.png b/assets/images/storefront-intro.png
index b26200a8c7a..96c0aec579f 100644
Binary files a/assets/images/storefront-intro.png and b/assets/images/storefront-intro.png differ
diff --git a/assets/images/storefront.png b/assets/images/storefront.png
index 92e931b8907..28c22bf4f4a 100644
Binary files a/assets/images/storefront.png and b/assets/images/storefront.png differ
diff --git a/assets/images/stripe.png b/assets/images/stripe.png
index 2f7ca444c7a..3632e05de3b 100644
Binary files a/assets/images/stripe.png and b/assets/images/stripe.png differ
diff --git a/assets/images/wcs-canada-post-logo.jpg b/assets/images/wcs-canada-post-logo.jpg
index 45f66bffa65..004bbd448d4 100644
Binary files a/assets/images/wcs-canada-post-logo.jpg and b/assets/images/wcs-canada-post-logo.jpg differ
diff --git a/assets/images/wcs-extensions-banner-3x.png b/assets/images/wcs-extensions-banner-3x.png
index 543317f3150..0b81938fbd1 100644
Binary files a/assets/images/wcs-extensions-banner-3x.png and b/assets/images/wcs-extensions-banner-3x.png differ
diff --git a/assets/images/wcs-notice.png b/assets/images/wcs-notice.png
index 2fb926bfecc..99b604d8e92 100644
Binary files a/assets/images/wcs-notice.png and b/assets/images/wcs-notice.png differ
diff --git a/assets/images/wcs-truck-banner-3x.png b/assets/images/wcs-truck-banner-3x.png
index 638a2f8814b..3175a5d04d0 100644
Binary files a/assets/images/wcs-truck-banner-3x.png and b/assets/images/wcs-truck-banner-3x.png differ
diff --git a/assets/images/wcs-usps-logo.png b/assets/images/wcs-usps-logo.png
index 5523e3e5152..04184bf2bbc 100644
Binary files a/assets/images/wcs-usps-logo.png and b/assets/images/wcs-usps-logo.png differ
diff --git a/assets/images/woocommerce_logo.png b/assets/images/woocommerce_logo.png
index 3a016645f38..d5f53691d43 100644
Binary files a/assets/images/woocommerce_logo.png and b/assets/images/woocommerce_logo.png differ
diff --git a/assets/images/woocommerce_logo.svg b/assets/images/woocommerce_logo.svg
index a2f90d6dcae..7eb949c7773 100644
--- a/assets/images/woocommerce_logo.svg
+++ b/assets/images/woocommerce_logo.svg
@@ -1,47 +1 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/assets/images/wpspin-2x.gif b/assets/images/wpspin-2x.gif
index 392e82ff71b..82778416693 100644
Binary files a/assets/images/wpspin-2x.gif and b/assets/images/wpspin-2x.gif differ
diff --git a/assets/images/wpspin.gif b/assets/images/wpspin.gif
index 4c42dcb2f57..547360d127e 100644
Binary files a/assets/images/wpspin.gif and b/assets/images/wpspin.gif differ
diff --git a/assets/js/admin/api-keys.js b/assets/js/admin/api-keys.js
index 437cd52a63b..760e883be27 100644
--- a/assets/js/admin/api-keys.js
+++ b/assets/js/admin/api-keys.js
@@ -142,7 +142,7 @@
$( '#key_permissions', self.el ).val( data.permissions );
}
} else {
- $( 'h3', self.el ).first().append( '
' + response.data.message + '
' );
+ $( 'h2, h3', self.el ).first().append( '' + response.data.message + '
' );
}
self.unblock();
diff --git a/assets/js/admin/api-keys.min.js b/assets/js/admin/api-keys.min.js
index b9575dc4139..20cf5e06878 100644
--- a/assets/js/admin/api-keys.min.js
+++ b/assets/js/admin/api-keys.min.js
@@ -1 +1 @@
-!function(e){new(Backbone.View.extend({el:e("#key-fields"),events:{"click input#update_api_key":"saveKey"},initialize:function(){_.bindAll(this,"saveKey")},block:function(){e(this.el).block({message:null,overlayCSS:{background:"#fff",opacity:.6}})},unblock:function(){e(this.el).unblock()},initTipTip:function(i){e(document.body).on("click",i,function(o){o.preventDefault(),document.queryCommandSupported("copy")?(e("#copy-error").text(""),wcClearClipboard(),wcSetClipboard(e.trim(e(this).prev("input").val()),e(i))):(e(i).parent().find("input").focus().select(),e("#copy-error").text(woocommerce_admin_api_keys.clipboard_failed))}).on("aftercopy",i,function(){e("#copy-error").text(""),e(i).tipTip({attribute:"data-tip",activation:"focus",fadeIn:50,fadeOut:50,delay:0}).focus()}).on("aftercopyerror",i,function(){e(i).parent().find("input").focus().select(),e("#copy-error").text(woocommerce_admin_api_keys.clipboard_failed)})},createQRCode:function(i,o){e("#keys-qrcode").qrcode({text:i+"|"+o,width:120,height:120})},saveKey:function(i){i.preventDefault();var o=this;o.block(),Backbone.ajax({method:"POST",dataType:"json",url:woocommerce_admin_api_keys.ajax_url,data:{action:"woocommerce_update_api_key",security:woocommerce_admin_api_keys.update_api_nonce,key_id:e("#key_id",o.el).val(),description:e("#key_description",o.el).val(),user:e("#key_user",o.el).val(),permissions:e("#key_permissions",o.el).val()},success:function(i){if(e(".wc-api-message",o.el).remove(),i.success){var t=i.data;if(e("h2, h3",o.el).first().append('"),0'+i.data.message+"
");o.unblock()}})}}))}(jQuery);
\ No newline at end of file
+!function(e){new(Backbone.View.extend({el:e("#key-fields"),events:{"click input#update_api_key":"saveKey"},initialize:function(){_.bindAll(this,"saveKey")},block:function(){e(this.el).block({message:null,overlayCSS:{background:"#fff",opacity:.6}})},unblock:function(){e(this.el).unblock()},initTipTip:function(i){e(document.body).on("click",i,function(o){o.preventDefault(),document.queryCommandSupported("copy")?(e("#copy-error").text(""),wcClearClipboard(),wcSetClipboard(e.trim(e(this).prev("input").val()),e(i))):(e(i).parent().find("input").focus().select(),e("#copy-error").text(woocommerce_admin_api_keys.clipboard_failed))}).on("aftercopy",i,function(){e("#copy-error").text(""),e(i).tipTip({attribute:"data-tip",activation:"focus",fadeIn:50,fadeOut:50,delay:0}).focus()}).on("aftercopyerror",i,function(){e(i).parent().find("input").focus().select(),e("#copy-error").text(woocommerce_admin_api_keys.clipboard_failed)})},createQRCode:function(i,o){e("#keys-qrcode").qrcode({text:i+"|"+o,width:120,height:120})},saveKey:function(i){i.preventDefault();var o=this;o.block(),Backbone.ajax({method:"POST",dataType:"json",url:woocommerce_admin_api_keys.ajax_url,data:{action:"woocommerce_update_api_key",security:woocommerce_admin_api_keys.update_api_nonce,key_id:e("#key_id",o.el).val(),description:e("#key_description",o.el).val(),user:e("#key_user",o.el).val(),permissions:e("#key_permissions",o.el).val()},success:function(i){if(e(".wc-api-message",o.el).remove(),i.success){var t=i.data;if(e("h2, h3",o.el).first().append('"),0'+i.data.message+"
");o.unblock()}})}}))}(jQuery);
diff --git a/assets/js/admin/backbone-modal.min.js b/assets/js/admin/backbone-modal.min.js
index b549b2ca7d5..ea8ee3a0e5e 100644
--- a/assets/js/admin/backbone-modal.min.js
+++ b/assets/js/admin/backbone-modal.min.js
@@ -1 +1 @@
-!function(e,t,n){"use strict";e.fn.WCBackboneModal=function(t){return this.each(function(){new e.WCBackboneModal(e(this),t)})},e.WCBackboneModal=function(t,n){var o=e.extend({},e.WCBackboneModal.defaultOptions,n);o.template&&new e.WCBackboneModal.View({target:o.template,string:o.variable})},e.WCBackboneModal.defaultOptions={template:"",variable:{}},e.WCBackboneModal.View=t.View.extend({tagName:"div",id:"wc-backbone-modal-dialog",_target:undefined,_string:undefined,events:{"click .modal-close":"closeButton","click #btn-ok":"addButton","touchstart #btn-ok":"addButton",keydown:"keyboardActions"},resizeContent:function(){var t=e(".wc-backbone-modal-content").find("article"),n=.75*e(window).height();t.css({"max-height":n+"px"})},initialize:function(t){var o=this;this._target=t.target,this._string=t.string,n.bindAll(this,"render"),this.render(),e(window).resize(function(){o.resizeContent()})},render:function(){var t=wp.template(this._target);this.$el.append(t(this._string)),e(document.body).css({overflow:"hidden"}).append(this.$el),this.resizeContent(),this.$(".wc-backbone-modal-content").attr("tabindex","0").focus(),e(document.body).trigger("init_tooltips"),e(document.body).trigger("wc_backbone_modal_loaded",this._target)},closeButton:function(t){t.preventDefault(),e(document.body).trigger("wc_backbone_modal_before_remove",this._target),this.undelegateEvents(),e(document).off("focusin"),e(document.body).css({overflow:"auto"}),this.remove(),e(document.body).trigger("wc_backbone_modal_removed",this._target)},addButton:function(t){e(document.body).trigger("wc_backbone_modal_response",[this._target,this.getFormData()]),this.closeButton(t)},getFormData:function(){var t={};return e(document.body).trigger("wc_backbone_modal_before_update",this._target),e.each(e("form",this.$el).serializeArray(),function(n,o){-1!==o.name.indexOf("[]")?(o.name=o.name.replace("[]",""),t[o.name]=e.makeArray(t[o.name]),t[o.name].push(o.value)):t[o.name]=o.value}),t},keyboardActions:function(e){var t=e.keyCode||e.which;13!==t||e.target.tagName&&("input"===e.target.tagName.toLowerCase()||"textarea"===e.target.tagName.toLowerCase())||this.addButton(e),27===t&&this.closeButton(e)}})}(jQuery,Backbone,_);
\ No newline at end of file
+!function(o,e,n){"use strict";o.fn.WCBackboneModal=function(e){return this.each(function(){new o.WCBackboneModal(o(this),e)})},o.WCBackboneModal=function(e,t){var n=o.extend({},o.WCBackboneModal.defaultOptions,t);n.template&&new o.WCBackboneModal.View({target:n.template,string:n.variable})},o.WCBackboneModal.defaultOptions={template:"",variable:{}},o.WCBackboneModal.View=e.View.extend({tagName:"div",id:"wc-backbone-modal-dialog",_target:undefined,_string:undefined,events:{"click .modal-close":"closeButton","click #btn-ok":"addButton","touchstart #btn-ok":"addButton",keydown:"keyboardActions"},resizeContent:function(){var e=o(".wc-backbone-modal-content").find("article"),t=.75*o(window).height();e.css({"max-height":t+"px"})},initialize:function(e){var t=this;this._target=e.target,this._string=e.string,n.bindAll(this,"render"),this.render(),o(window).resize(function(){t.resizeContent()})},render:function(){var e=wp.template(this._target);this.$el.append(e(this._string)),o(document.body).css({overflow:"hidden"}).append(this.$el),this.resizeContent(),this.$(".wc-backbone-modal-content").attr("tabindex","0").focus(),o(document.body).trigger("init_tooltips"),o(document.body).trigger("wc_backbone_modal_loaded",this._target)},closeButton:function(e){e.preventDefault(),o(document.body).trigger("wc_backbone_modal_before_remove",this._target),this.undelegateEvents(),o(document).off("focusin"),o(document.body).css({overflow:"auto"}),this.remove(),o(document.body).trigger("wc_backbone_modal_removed",this._target)},addButton:function(e){o(document.body).trigger("wc_backbone_modal_response",[this._target,this.getFormData()]),this.closeButton(e)},getFormData:function(){var n={};return o(document.body).trigger("wc_backbone_modal_before_update",this._target),o.each(o("form",this.$el).serializeArray(),function(e,t){-1!==t.name.indexOf("[]")?(t.name=t.name.replace("[]",""),n[t.name]=o.makeArray(n[t.name]),n[t.name].push(t.value)):n[t.name]=t.value}),n},keyboardActions:function(e){var t=e.keyCode||e.which;13!==t||e.target.tagName&&("input"===e.target.tagName.toLowerCase()||"textarea"===e.target.tagName.toLowerCase())||this.addButton(e),27===t&&this.closeButton(e)}})}(jQuery,Backbone,_);
\ No newline at end of file
diff --git a/assets/js/admin/meta-boxes-order.js b/assets/js/admin/meta-boxes-order.js
index 18bfdce16c2..ce9c9c9f704 100644
--- a/assets/js/admin/meta-boxes-order.js
+++ b/assets/js/admin/meta-boxes-order.js
@@ -750,7 +750,7 @@ jQuery( function ( $ ) {
$.post( woocommerce_admin_meta_boxes.ajax_url, data, function( response ) {
if ( true === response.success ) {
// Redirect to same page for show the refunded status
- window.location.href = window.location.href;
+ window.location.reload();
} else {
window.alert( response.data.error );
wc_meta_boxes_order_items.reload_items();
diff --git a/assets/js/admin/meta-boxes-order.min.js b/assets/js/admin/meta-boxes-order.min.js
index bd27d1a1d01..dcffd2dd305 100644
--- a/assets/js/admin/meta-boxes-order.min.js
+++ b/assets/js/admin/meta-boxes-order.min.js
@@ -1 +1 @@
-jQuery(function(e){var o={states:null,init:function(){"undefined"!=typeof woocommerce_admin_meta_boxes_order&&"undefined"!=typeof woocommerce_admin_meta_boxes_order.countries&&(this.states=e.parseJSON(woocommerce_admin_meta_boxes_order.countries.replace(/"/g,'"'))),e(".js_field-country").selectWoo().change(this.change_country),e(".js_field-country").trigger("change",[!0]),e(document.body).on("change","select.js_field-state",this.change_state),e("#woocommerce-order-actions input, #woocommerce-order-actions a").click(function(){window.onbeforeunload=""}),e("a.edit_address").click(this.edit_address),e("a.billing-same-as-shipping").on("click",this.copy_billing_to_shipping),e("a.load_customer_billing").on("click",this.load_billing),e("a.load_customer_shipping").on("click",this.load_shipping),e("#customer_user").on("change",this.change_customer_user)},change_country:function(t,i){if(void 0===i&&(i=!1),null!==o.states){var a=e(this),n=a.val(),r=a.parents("div.edit_address").find(":input.js_field-state"),c=r.parent(),d=r.attr("name"),m=r.attr("id"),_=a.data("woocommerce.stickState-"+n)?a.data("woocommerce.stickState-"+n):r.val(),s=r.attr("placeholder");if(i&&a.data("woocommerce.stickState-"+n,_),c.show().find(".select2-container").remove(),e.isEmptyObject(o.states[n]))r.replaceWith(' ');else{var l=e(' '),u=o.states[n];l.append(e(''+woocommerce_admin_meta_boxes_order.i18n_select_state_text+" ")),e.each(u,function(o){l.append(e(''+u[o]+" "))}),l.val(_),r.replaceWith(l),l.show().selectWoo().hide().change()}e(document.body).trigger("contry-change.woocommerce",[n,e(this).closest("div")]),e(document.body).trigger("country-change.woocommerce",[n,e(this).closest("div")])}},change_state:function(){var o=e(this),t=o.val(),i=o.parents("div.edit_address").find(":input.js_field-country"),a=i.val();i.data("woocommerce.stickState-"+a,t)},init_tiptip:function(){e("#tiptip_holder").removeAttr("style"),e("#tiptip_arrow").removeAttr("style"),e(".tips").tipTip({attribute:"data-tip",fadeIn:50,fadeOut:50,delay:200})},edit_address:function(o){o.preventDefault();var t=e(this),i=t.closest(".order_data_column"),a=i.find("div.edit_address"),n=i.find("div.address"),r=a.find(".js_field-country"),c=a.find(".js_field-state");n.hide(),t.parent().find("a").toggle(),r.val()||(r.val(woocommerce_admin_meta_boxes_order.default_country).change(),c.val(woocommerce_admin_meta_boxes_order.default_state).change()),a.show()},change_customer_user:function(){e("#_billing_country").val()||(e("a.edit_address").click(),o.load_billing(!0),o.load_shipping(!0))},load_billing:function(o){if(!0===o||window.confirm(woocommerce_admin_meta_boxes.load_billing)){var t=e("#customer_user").val();if(!t)return window.alert(woocommerce_admin_meta_boxes.no_customer_selected),!1;var i={user_id:t,action:"woocommerce_get_customer_details",security:woocommerce_admin_meta_boxes.get_customer_details_nonce};e(this).closest("div.edit_address").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),e.ajax({url:woocommerce_admin_meta_boxes.ajax_url,data:i,type:"POST",success:function(o){o&&o.billing&&e.each(o.billing,function(o,t){e(":input#_billing_"+o).val(t).change()}),e("div.edit_address").unblock()}})}return!1},load_shipping:function(o){if(!0===o||window.confirm(woocommerce_admin_meta_boxes.load_shipping)){var t=e("#customer_user").val();if(!t)return window.alert(woocommerce_admin_meta_boxes.no_customer_selected),!1;var i={user_id:t,action:"woocommerce_get_customer_details",security:woocommerce_admin_meta_boxes.get_customer_details_nonce};e(this).closest("div.edit_address").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),e.ajax({url:woocommerce_admin_meta_boxes.ajax_url,data:i,type:"POST",success:function(o){o&&o.billing&&e.each(o.shipping,function(o,t){e(":input#_shipping_"+o).val(t).change()}),e("div.edit_address").unblock()}})}return!1},copy_billing_to_shipping:function(){return window.confirm(woocommerce_admin_meta_boxes.copy_billing)&&e('.order_data_column :input[name^="_billing_"]').each(function(){var o=e(this).attr("name");o=o.replace("_billing_","_shipping_"),e(":input#"+o).val(e(this).val()).change()}),!1}},t={init:function(){this.stupidtable.init(),e("#woocommerce-order-items").on("click","button.add-line-item",this.add_line_item).on("click","button.add-coupon",this.add_coupon).on("click","a.remove-coupon",this.remove_coupon).on("click","button.refund-items",this.refund_items).on("click",".cancel-action",this.cancel).on("click","button.add-order-item",this.add_item).on("click","button.add-order-fee",this.add_fee).on("click","button.add-order-shipping",this.add_shipping).on("click","button.add-order-tax",this.add_tax).on("click","button.save-action",this.save_line_items).on("click","a.delete-order-tax",this.delete_tax).on("click","button.calculate-action",this.recalculate).on("click","a.edit-order-item",this.edit_item).on("click","a.delete-order-item",this.delete_item).on("click",".delete_refund",this.refunds.delete_refund).on("click","button.do-api-refund, button.do-manual-refund",this.refunds.do_refund).on("change",".refund input.refund_line_total, .refund input.refund_line_tax",this.refunds.input_changed).on("change keyup",".wc-order-refund-items #refund_amount",this.refunds.amount_changed).on("change","input.refund_order_item_qty",this.refunds.refund_quantity_changed).on("change","input.quantity",this.quantity_changed).on("keyup change",".split-input :input",function(){var o=e(this).parent().prev().find(":input");o&&(""===o.val()||o.is(".match-total"))&&o.val(e(this).val()).addClass("match-total")}).on("keyup",".split-input :input",function(){e(this).removeClass("match-total")}).on("click","button.add_order_item_meta",this.item_meta.add).on("click","button.remove_order_item_meta",this.item_meta.remove).on("wc_order_items_reload",this.reload_items).on("wc_order_items_reloaded",this.reloaded_items),e(document.body).on("wc_backbone_modal_loaded",this.backbone.init).on("wc_backbone_modal_response",this.backbone.response)},block:function(){e("#woocommerce-order-items").block({message:null,overlayCSS:{background:"#fff",opacity:.6}})},unblock:function(){e("#woocommerce-order-items").unblock()},reload_items:function(){var o={order_id:woocommerce_admin_meta_boxes.post_id,action:"woocommerce_load_order_items",security:woocommerce_admin_meta_boxes.order_item_nonce};t.block(),e.ajax({url:woocommerce_admin_meta_boxes.ajax_url,data:o,type:"POST",success:function(o){e("#woocommerce-order-items").find(".inside").empty(),e("#woocommerce-order-items").find(".inside").append(o),t.reloaded_items(),t.unblock()}})},reloaded_items:function(){o.init_tiptip(),t.stupidtable.init()},quantity_changed:function(){var o=e(this).closest("tr.item"),t=e(this).val(),i=e(this).attr("data-qty"),a=e("input.line_total",o),n=e("input.line_subtotal",o),r=accounting.unformat(a.attr("data-total"),woocommerce_admin.mon_decimal_point)/i;a.val(parseFloat(accounting.formatNumber(r*t,woocommerce_admin_meta_boxes.rounding_precision,"")).toString().replace(".",woocommerce_admin.mon_decimal_point));var c=accounting.unformat(n.attr("data-subtotal"),woocommerce_admin.mon_decimal_point)/i;n.val(parseFloat(accounting.formatNumber(c*t,woocommerce_admin_meta_boxes.rounding_precision,"")).toString().replace(".",woocommerce_admin.mon_decimal_point)),e("input.line_tax",o).each(function(){var a=e(this),n=a.data("tax_id"),r=accounting.unformat(a.attr("data-total_tax"),woocommerce_admin.mon_decimal_point)/i,c=e('input.line_subtotal_tax[data-tax_id="'+n+'"]',o),d=accounting.unformat(c.attr("data-subtotal_tax"),woocommerce_admin.mon_decimal_point)/i;00?e("#restock_refunded_items").closest("tr").show():(e("#restock_refunded_items").closest("tr").hide(),e(".woocommerce_order_items input.refund_order_item_qty").each(function(){e(this).val()>0&&e("#restock_refunded_items").closest("tr").show()})),e(this).trigger("refund_quantity_changed")}},item_meta:{add:function(){var o=e(this).closest("tr.item, tr.shipping"),t=o.find("tbody.meta_items"),i=t.find("tr").length+1,a='× ';return t.append(a),!1},remove:function(){if(window.confirm(woocommerce_admin_meta_boxes.remove_item_meta)){var o=e(this).closest("tr");o.find(":input").val(""),o.hide()}return!1}},backbone:{init:function(o,t){"wc-modal-add-products"===t&&(e(document.body).trigger("wc-enhanced-select-init"),e(this).on("change",".wc-product-search",function(){if(e(this).closest("tr").is(":last-child")){var o=e(this).closest("table.widefat").find("tbody"),t=o.find("tr").length,i=o.data("row").replace(/\[0\]/g,"["+t+"]");o.append(""+i+" "),e(document.body).trigger("wc-enhanced-select-init")}}))},response:function(o,i,a){if("wc-modal-add-tax"===i){var n=a.add_order_tax,r="";a.manual_tax_rate_id&&(r=a.manual_tax_rate_id),t.backbone.add_tax(n,r)}if("wc-modal-add-products"===i){var c=e(this).find("table.widefat").find("tbody").find("tr"),d=[];return e(c).each(function(){var o=e(this).find(':input[name="item_id"]').val(),t=e(this).find(':input[name="item_qty"]').val();d.push({id:o,qty:t||1})}),t.backbone.add_items(d)}},add_items:function(o){t.block();var i={action:"woocommerce_add_order_item",order_id:woocommerce_admin_meta_boxes.post_id,security:woocommerce_admin_meta_boxes.order_item_nonce,data:o};"true"===e("button.cancel-action").attr("data-reload")&&(i.items=e("table.woocommerce_order_items :input[name], .wc-order-totals-items :input[name]").serialize()),e.ajax({type:"POST",url:woocommerce_admin_meta_boxes.ajax_url,data:i,success:function(o){o.success?(e("#woocommerce-order-items").find(".inside").empty(),e("#woocommerce-order-items").find(".inside").append(o.data.html),t.reloaded_items(),t.unblock()):(t.unblock(),window.alert(o.data.error))},dataType:"json"})},add_tax:function(o,i){if(i&&(o=i),!o)return!1;var a=e(".order-tax-id").map(function(){return e(this).val()}).get();if(-1===e.inArray(o,a)){t.block();var n={action:"woocommerce_add_order_tax",rate_id:o,order_id:woocommerce_admin_meta_boxes.post_id,security:woocommerce_admin_meta_boxes.order_item_nonce};e.ajax({url:woocommerce_admin_meta_boxes.ajax_url,data:n,dataType:"json",type:"POST",success:function(o){o.success?(e("#woocommerce-order-items").find(".inside").empty(),e("#woocommerce-order-items").find(".inside").append(o.data.html),t.reloaded_items()):window.alert(o.data.error),t.unblock()}})}else window.alert(woocommerce_admin_meta_boxes.i18n_tax_rate_already_exists)}},stupidtable:{init:function(){e(".woocommerce_order_items").stupidtable(),e(".woocommerce_order_items").on("aftertablesort",this.add_arrows)},add_arrows:function(o,t){var i=e(this).find("th"),a="asc"===t.direction?"↑":"↓",n=t.column;i.find(".wc-arrow").remove(),i.eq(n).append(''+a+" ")}}},i={init:function(){e("#woocommerce-order-notes").on("click","button.add_note",this.add_order_note).on("click","a.delete_note",this.delete_order_note)},add_order_note:function(){if(e("textarea#add_order_note").val()){e("#woocommerce-order-notes").block({message:null,overlayCSS:{background:"#fff",opacity:.6}});var o={action:"woocommerce_add_order_note",post_id:woocommerce_admin_meta_boxes.post_id,note:e("textarea#add_order_note").val(),note_type:e("select#order_note_type").val(),security:woocommerce_admin_meta_boxes.add_order_note_nonce};return e.post(woocommerce_admin_meta_boxes.ajax_url,o,function(o){e("ul.order_notes").prepend(o),e("#woocommerce-order-notes").unblock(),e("#add_order_note").val("")}),!1}},delete_order_note:function(){if(window.confirm(woocommerce_admin_meta_boxes.i18n_delete_note)){var o=e(this).closest("li.note");e(o).block({message:null,overlayCSS:{background:"#fff",opacity:.6}});var t={action:"woocommerce_delete_order_note",note_id:e(o).attr("rel"),security:woocommerce_admin_meta_boxes.delete_order_note_nonce};e.post(woocommerce_admin_meta_boxes.ajax_url,t,function(){e(o).remove()})}return!1}},a={init:function(){e(".order_download_permissions").on("click","button.grant_access",this.grant_access).on("click","button.revoke_access",this.revoke_access).on("click","#copy-download-link",this.copy_link).on("aftercopy","#copy-download-link",this.copy_success).on("aftercopyfailure","#copy-download-link",this.copy_fail)},grant_access:function(){var o=e("#grant_access_id").val();if(o){e(".order_download_permissions").block({message:null,overlayCSS:{background:"#fff",opacity:.6}});var t={action:"woocommerce_grant_access_to_download",product_ids:o,loop:e(".order_download_permissions .wc-metabox").length,order_id:woocommerce_admin_meta_boxes.post_id,security:woocommerce_admin_meta_boxes.grant_access_nonce};return e.post(woocommerce_admin_meta_boxes.ajax_url,t,function(o){o?e(".order_download_permissions .wc-metaboxes").append(o):window.alert(woocommerce_admin_meta_boxes.i18n_download_permission_fail),e(document.body).trigger("wc-init-datepickers"),e("#grant_access_id").val("").change(),e(".order_download_permissions").unblock()}),!1}},revoke_access:function(){if(window.confirm(woocommerce_admin_meta_boxes.i18n_permission_revoke)){var o=e(this).parent().parent(),t=e(this).attr("rel").split(",")[0],i=e(this).attr("rel").split(",")[1],a=e(this).data("permission_id");if(t>0){e(o).block({message:null,overlayCSS:{background:"#fff",opacity:.6}});var n={action:"woocommerce_revoke_access_to_download",product_id:t,download_id:i,permission_id:a,order_id:woocommerce_admin_meta_boxes.post_id,security:woocommerce_admin_meta_boxes.revoke_access_nonce};e.post(woocommerce_admin_meta_boxes.ajax_url,n,function(){e(o).fadeOut("300",function(){e(o).remove()})})}else e(o).fadeOut("300",function(){e(o).remove()})}return!1},copy_link:function(o){wcClearClipboard(),wcSetClipboard(e(this).attr("href"),e(this)),o.preventDefault()},copy_success:function(){e(this).tipTip({attribute:"data-tip",activation:"focus",fadeIn:50,fadeOut:50,delay:0}).focus()},copy_fail:function(){e(this).tipTip({attribute:"data-tip-failed",activation:"focus",fadeIn:50,fadeOut:50,delay:0}).focus()}};o.init(),t.init(),i.init(),a.init()});
\ No newline at end of file
+jQuery(function(l){var u={states:null,init:function(){"undefined"!=typeof woocommerce_admin_meta_boxes_order&&"undefined"!=typeof woocommerce_admin_meta_boxes_order.countries&&(this.states=l.parseJSON(woocommerce_admin_meta_boxes_order.countries.replace(/"/g,'"'))),l(".js_field-country").selectWoo().change(this.change_country),l(".js_field-country").trigger("change",[!0]),l(document.body).on("change","select.js_field-state",this.change_state),l("#woocommerce-order-actions input, #woocommerce-order-actions a").click(function(){window.onbeforeunload=""}),l("a.edit_address").click(this.edit_address),l("a.billing-same-as-shipping").on("click",this.copy_billing_to_shipping),l("a.load_customer_billing").on("click",this.load_billing),l("a.load_customer_shipping").on("click",this.load_shipping),l("#customer_user").on("change",this.change_customer_user)},change_country:function(e,o){if(void 0===o&&(o=!1),null!==u.states){var t=l(this),i=t.val(),a=t.parents("div.edit_address").find(":input.js_field-state"),n=a.parent(),r=a.attr("name"),c=a.attr("id"),d=t.data("woocommerce.stickState-"+i)?t.data("woocommerce.stickState-"+i):a.val(),m=a.attr("placeholder");if(o&&t.data("woocommerce.stickState-"+i,d),n.show().find(".select2-container").remove(),l.isEmptyObject(u.states[i]))a.replaceWith(' ');else{var _=l(' '),s=u.states[i];_.append(l(''+woocommerce_admin_meta_boxes_order.i18n_select_state_text+" ")),l.each(s,function(e){_.append(l(''+s[e]+" "))}),_.val(d),a.replaceWith(_),_.show().selectWoo().hide().change()}l(document.body).trigger("contry-change.woocommerce",[i,l(this).closest("div")]),l(document.body).trigger("country-change.woocommerce",[i,l(this).closest("div")])}},change_state:function(){var e=l(this),o=e.val(),t=e.parents("div.edit_address").find(":input.js_field-country"),i=t.val();t.data("woocommerce.stickState-"+i,o)},init_tiptip:function(){l("#tiptip_holder").removeAttr("style"),l("#tiptip_arrow").removeAttr("style"),l(".tips").tipTip({attribute:"data-tip",fadeIn:50,fadeOut:50,delay:200})},edit_address:function(e){e.preventDefault();var o=l(this),t=o.closest(".order_data_column"),i=t.find("div.edit_address"),a=t.find("div.address"),n=i.find(".js_field-country"),r=i.find(".js_field-state");a.hide(),o.parent().find("a").toggle(),n.val()||(n.val(woocommerce_admin_meta_boxes_order.default_country).change(),r.val(woocommerce_admin_meta_boxes_order.default_state).change()),i.show()},change_customer_user:function(){l("#_billing_country").val()||(l("a.edit_address").click(),u.load_billing(!0),u.load_shipping(!0))},load_billing:function(e){if(!0===e||window.confirm(woocommerce_admin_meta_boxes.load_billing)){var o=l("#customer_user").val();if(!o)return window.alert(woocommerce_admin_meta_boxes.no_customer_selected),!1;var t={user_id:o,action:"woocommerce_get_customer_details",security:woocommerce_admin_meta_boxes.get_customer_details_nonce};l(this).closest("div.edit_address").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),l.ajax({url:woocommerce_admin_meta_boxes.ajax_url,data:t,type:"POST",success:function(e){e&&e.billing&&l.each(e.billing,function(e,o){l(":input#_billing_"+e).val(o).change()}),l("div.edit_address").unblock()}})}return!1},load_shipping:function(e){if(!0===e||window.confirm(woocommerce_admin_meta_boxes.load_shipping)){var o=l("#customer_user").val();if(!o)return window.alert(woocommerce_admin_meta_boxes.no_customer_selected),!1;var t={user_id:o,action:"woocommerce_get_customer_details",security:woocommerce_admin_meta_boxes.get_customer_details_nonce};l(this).closest("div.edit_address").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),l.ajax({url:woocommerce_admin_meta_boxes.ajax_url,data:t,type:"POST",success:function(e){e&&e.billing&&l.each(e.shipping,function(e,o){l(":input#_shipping_"+e).val(o).change()}),l("div.edit_address").unblock()}})}return!1},copy_billing_to_shipping:function(){return window.confirm(woocommerce_admin_meta_boxes.copy_billing)&&l('.order_data_column :input[name^="_billing_"]').each(function(){var e=l(this).attr("name");e=e.replace("_billing_","_shipping_"),l(":input#"+e).val(l(this).val()).change()}),!1}},c={init:function(){this.stupidtable.init(),l("#woocommerce-order-items").on("click","button.add-line-item",this.add_line_item).on("click","button.add-coupon",this.add_coupon).on("click","a.remove-coupon",this.remove_coupon).on("click","button.refund-items",this.refund_items).on("click",".cancel-action",this.cancel).on("click","button.add-order-item",this.add_item).on("click","button.add-order-fee",this.add_fee).on("click","button.add-order-shipping",this.add_shipping).on("click","button.add-order-tax",this.add_tax).on("click","button.save-action",this.save_line_items).on("click","a.delete-order-tax",this.delete_tax).on("click","button.calculate-action",this.recalculate).on("click","a.edit-order-item",this.edit_item).on("click","a.delete-order-item",this.delete_item).on("click",".delete_refund",this.refunds.delete_refund).on("click","button.do-api-refund, button.do-manual-refund",this.refunds.do_refund).on("change",".refund input.refund_line_total, .refund input.refund_line_tax",this.refunds.input_changed).on("change keyup",".wc-order-refund-items #refund_amount",this.refunds.amount_changed).on("change","input.refund_order_item_qty",this.refunds.refund_quantity_changed).on("change","input.quantity",this.quantity_changed).on("keyup change",".split-input :input",function(){var e=l(this).parent().prev().find(":input");e&&(""===e.val()||e.is(".match-total"))&&e.val(l(this).val()).addClass("match-total")}).on("keyup",".split-input :input",function(){l(this).removeClass("match-total")}).on("click","button.add_order_item_meta",this.item_meta.add).on("click","button.remove_order_item_meta",this.item_meta.remove).on("wc_order_items_reload",this.reload_items).on("wc_order_items_reloaded",this.reloaded_items),l(document.body).on("wc_backbone_modal_loaded",this.backbone.init).on("wc_backbone_modal_response",this.backbone.response)},block:function(){l("#woocommerce-order-items").block({message:null,overlayCSS:{background:"#fff",opacity:.6}})},unblock:function(){l("#woocommerce-order-items").unblock()},reload_items:function(){var e={order_id:woocommerce_admin_meta_boxes.post_id,action:"woocommerce_load_order_items",security:woocommerce_admin_meta_boxes.order_item_nonce};c.block(),l.ajax({url:woocommerce_admin_meta_boxes.ajax_url,data:e,type:"POST",success:function(e){l("#woocommerce-order-items").find(".inside").empty(),l("#woocommerce-order-items").find(".inside").append(e),c.reloaded_items(),c.unblock()}})},reloaded_items:function(){u.init_tiptip(),c.stupidtable.init()},quantity_changed:function(){var n=l(this).closest("tr.item"),r=l(this).val(),c=l(this).attr("data-qty"),e=l("input.line_total",n),o=l("input.line_subtotal",n),t=accounting.unformat(e.attr("data-total"),woocommerce_admin.mon_decimal_point)/c;e.val(parseFloat(accounting.formatNumber(t*r,woocommerce_admin_meta_boxes.rounding_precision,"")).toString().replace(".",woocommerce_admin.mon_decimal_point));var i=accounting.unformat(o.attr("data-subtotal"),woocommerce_admin.mon_decimal_point)/c;o.val(parseFloat(accounting.formatNumber(i*r,woocommerce_admin_meta_boxes.rounding_precision,"")).toString().replace(".",woocommerce_admin.mon_decimal_point)),l("input.line_tax",n).each(function(){var e=l(this),o=e.data("tax_id"),t=accounting.unformat(e.attr("data-total_tax"),woocommerce_admin.mon_decimal_point)/c,i=l('input.line_subtotal_tax[data-tax_id="'+o+'"]',n),a=accounting.unformat(i.attr("data-subtotal_tax"),woocommerce_admin.mon_decimal_point)/c;0× ';return o.append(i),!1},remove:function(){if(window.confirm(woocommerce_admin_meta_boxes.remove_item_meta)){var e=l(this).closest("tr");e.find(":input").val(""),e.hide()}return!1}},backbone:{init:function(e,o){"wc-modal-add-products"===o&&(l(document.body).trigger("wc-enhanced-select-init"),l(this).on("change",".wc-product-search",function(){if(l(this).closest("tr").is(":last-child")){var e=l(this).closest("table.widefat").find("tbody"),o=e.find("tr").length,t=e.data("row").replace(/\[0\]/g,"["+o+"]");e.append(""+t+" "),l(document.body).trigger("wc-enhanced-select-init")}}))},response:function(e,o,t){if("wc-modal-add-tax"===o){var i=t.add_order_tax,a="";t.manual_tax_rate_id&&(a=t.manual_tax_rate_id),c.backbone.add_tax(i,a)}if("wc-modal-add-products"===o){var n=l(this).find("table.widefat").find("tbody").find("tr"),r=[];return l(n).each(function(){var e=l(this).find(':input[name="item_id"]').val(),o=l(this).find(':input[name="item_qty"]').val();r.push({id:e,qty:o||1})}),c.backbone.add_items(r)}},add_items:function(e){c.block();var o={action:"woocommerce_add_order_item",order_id:woocommerce_admin_meta_boxes.post_id,security:woocommerce_admin_meta_boxes.order_item_nonce,data:e};"true"===l("button.cancel-action").attr("data-reload")&&(o.items=l("table.woocommerce_order_items :input[name], .wc-order-totals-items :input[name]").serialize()),l.ajax({type:"POST",url:woocommerce_admin_meta_boxes.ajax_url,data:o,success:function(e){e.success?(l("#woocommerce-order-items").find(".inside").empty(),l("#woocommerce-order-items").find(".inside").append(e.data.html),c.reloaded_items(),c.unblock()):(c.unblock(),window.alert(e.data.error))},dataType:"json"})},add_tax:function(e,o){if(o&&(e=o),!e)return!1;var t=l(".order-tax-id").map(function(){return l(this).val()}).get();if(-1===l.inArray(e,t)){c.block();var i={action:"woocommerce_add_order_tax",rate_id:e,order_id:woocommerce_admin_meta_boxes.post_id,security:woocommerce_admin_meta_boxes.order_item_nonce};l.ajax({url:woocommerce_admin_meta_boxes.ajax_url,data:i,dataType:"json",type:"POST",success:function(e){e.success?(l("#woocommerce-order-items").find(".inside").empty(),l("#woocommerce-order-items").find(".inside").append(e.data.html),c.reloaded_items()):window.alert(e.data.error),c.unblock()}})}else window.alert(woocommerce_admin_meta_boxes.i18n_tax_rate_already_exists)}},stupidtable:{init:function(){l(".woocommerce_order_items").stupidtable(),l(".woocommerce_order_items").on("aftertablesort",this.add_arrows)},add_arrows:function(e,o){var t=l(this).find("th"),i="asc"===o.direction?"↑":"↓",a=o.column;t.find(".wc-arrow").remove(),t.eq(a).append(''+i+" ")}}},e={init:function(){l("#woocommerce-order-notes").on("click","button.add_note",this.add_order_note).on("click","a.delete_note",this.delete_order_note)},add_order_note:function(){if(l("textarea#add_order_note").val()){l("#woocommerce-order-notes").block({message:null,overlayCSS:{background:"#fff",opacity:.6}});var e={action:"woocommerce_add_order_note",post_id:woocommerce_admin_meta_boxes.post_id,note:l("textarea#add_order_note").val(),note_type:l("select#order_note_type").val(),security:woocommerce_admin_meta_boxes.add_order_note_nonce};return l.post(woocommerce_admin_meta_boxes.ajax_url,e,function(e){l("ul.order_notes").prepend(e),l("#woocommerce-order-notes").unblock(),l("#add_order_note").val("")}),!1}},delete_order_note:function(){if(window.confirm(woocommerce_admin_meta_boxes.i18n_delete_note)){var e=l(this).closest("li.note");l(e).block({message:null,overlayCSS:{background:"#fff",opacity:.6}});var o={action:"woocommerce_delete_order_note",note_id:l(e).attr("rel"),security:woocommerce_admin_meta_boxes.delete_order_note_nonce};l.post(woocommerce_admin_meta_boxes.ajax_url,o,function(){l(e).remove()})}return!1}},o={init:function(){l(".order_download_permissions").on("click","button.grant_access",this.grant_access).on("click","button.revoke_access",this.revoke_access).on("click","#copy-download-link",this.copy_link).on("aftercopy","#copy-download-link",this.copy_success).on("aftercopyfailure","#copy-download-link",this.copy_fail)},grant_access:function(){var e=l("#grant_access_id").val();if(e){l(".order_download_permissions").block({message:null,overlayCSS:{background:"#fff",opacity:.6}});var o={action:"woocommerce_grant_access_to_download",product_ids:e,loop:l(".order_download_permissions .wc-metabox").length,order_id:woocommerce_admin_meta_boxes.post_id,security:woocommerce_admin_meta_boxes.grant_access_nonce};return l.post(woocommerce_admin_meta_boxes.ajax_url,o,function(e){e?l(".order_download_permissions .wc-metaboxes").append(e):window.alert(woocommerce_admin_meta_boxes.i18n_download_permission_fail),l(document.body).trigger("wc-init-datepickers"),l("#grant_access_id").val("").change(),l(".order_download_permissions").unblock()}),!1}},revoke_access:function(){if(window.confirm(woocommerce_admin_meta_boxes.i18n_permission_revoke)){var e=l(this).parent().parent(),o=l(this).attr("rel").split(",")[0],t=l(this).attr("rel").split(",")[1],i=l(this).data("permission_id");if(0 ').submit();
+ } else {
+ postForm.append(' ').submit();
+ }
},
/**
diff --git a/assets/js/admin/meta-boxes-product-variation.min.js b/assets/js/admin/meta-boxes-product-variation.min.js
index 911d54d7a9a..bc65c710147 100644
--- a/assets/js/admin/meta-boxes-product-variation.min.js
+++ b/assets/js/admin/meta-boxes-product-variation.min.js
@@ -1 +1 @@
-jQuery(function(a){"use strict";var e={init:function(){a("#variable_product_options").on("change","input.variable_is_downloadable",this.variable_is_downloadable).on("change","input.variable_is_virtual",this.variable_is_virtual).on("change","input.variable_manage_stock",this.variable_manage_stock).on("click","button.notice-dismiss",this.notice_dismiss).on("click","h3 .sort",this.set_menu_order).on("reload",this.reload),a("input.variable_is_downloadable, input.variable_is_virtual, input.variable_manage_stock").change(),a("#woocommerce-product-data").on("woocommerce_variations_loaded",this.variations_loaded),a(document.body).on("woocommerce_variations_added",this.variation_added)},reload:function(){o.load_variations(1),t.set_paginav(0)},variable_is_downloadable:function(){a(this).closest(".woocommerce_variation").find(".show_if_variation_downloadable").hide(),a(this).is(":checked")&&a(this).closest(".woocommerce_variation").find(".show_if_variation_downloadable").show()},variable_is_virtual:function(){a(this).closest(".woocommerce_variation").find(".hide_if_variation_virtual").show(),a(this).is(":checked")&&a(this).closest(".woocommerce_variation").find(".hide_if_variation_virtual").hide()},variable_manage_stock:function(){a(this).closest(".woocommerce_variation").find(".show_if_variation_manage_stock").hide(),a(this).closest(".woocommerce_variation").find(".hide_if_variation_manage_stock").show(),a(this).is(":checked")&&(a(this).closest(".woocommerce_variation").find(".show_if_variation_manage_stock").show(),a(this).closest(".woocommerce_variation").find(".hide_if_variation_manage_stock").hide())},notice_dismiss:function(){a(this).closest("div.notice").remove()},variations_loaded:function(i,o){o=o||!1;var t=a("#woocommerce-product-data");o||(a("input.variable_is_downloadable, input.variable_is_virtual, input.variable_manage_stock",t).change(),a(".woocommerce_variation",t).each(function(e,i){var o=a(i),t=a(".sale_price_dates_from",o).val(),n=a(".sale_price_dates_to",o).val();""===t&&""===n||a("a.sale_schedule",o).click()}),a(".woocommerce_variations .variation-needs-update",t).removeClass("variation-needs-update"),a("button.cancel-variation-changes, button.save-variation-changes",t).attr("disabled","disabled")),a("#tiptip_holder").removeAttr("style"),a("#tiptip_arrow").removeAttr("style"),a(".woocommerce_variations .tips, .woocommerce_variations .help_tip, .woocommerce_variations .woocommerce-help-tip",t).tipTip({attribute:"data-tip",fadeIn:50,fadeOut:50,delay:200}),a(".sale_price_dates_fields",t).find("input").datepicker({defaultDate:"",dateFormat:"yy-mm-dd",numberOfMonths:1,showButtonPanel:!0,onSelect:function(){var e=a(this).is(".sale_price_dates_from")?"minDate":"maxDate",i=a(this).closest(".sale_price_dates_fields").find("input"),o=a(this).datepicker("getDate");i.not(this).datepicker("option",e,o),a(this).change()}}),a(".woocommerce_variations",t).sortable({items:".woocommerce_variation",cursor:"move",axis:"y",handle:".sort",scrollSensitivity:40,forcePlaceholderSize:!0,helper:"clone",opacity:.65,stop:function(){e.variation_row_indexes()}}),a(document.body).trigger("wc-enhanced-select-init")},variation_added:function(a,i){1===i&&e.variations_loaded(null,!0)},set_menu_order:function(e){e.preventDefault();var i=a(this).closest(".woocommerce_variation").find(".variation_menu_order"),t=window.prompt(woocommerce_admin_meta_boxes_variations.i18n_enter_menu_order,i.val());null!=t&&(i.val(parseInt(t,10)).change(),o.save_variations())},variation_row_indexes:function(){var e=a("#variable_product_options").find(".woocommerce_variations"),i=parseInt(e.attr("data-page"),10),o=parseInt((i-1)*woocommerce_admin_meta_boxes_variations.variations_per_page,10);a(".woocommerce_variations .woocommerce_variation").each(function(e,i){a(".variation_menu_order",i).val(parseInt(a(i).index(".woocommerce_variations .woocommerce_variation"),10)+1+o).change()})}},i={variable_image_frame:null,setting_variation_image_id:null,setting_variation_image:null,wp_media_post_id:wp.media.model.settings.post.id,init:function(){a("#variable_product_options").on("click",".upload_image_button",this.add_image),a("a.add_media").on("click",this.restore_wp_media_post_id)},add_image:function(e){var o=a(this),t=o.attr("rel"),n=o.closest(".upload_image");if(i.setting_variation_image=n,i.setting_variation_image_id=t,e.preventDefault(),o.is(".remove"))a(".upload_image_id",i.setting_variation_image).val("").change(),i.setting_variation_image.find("img").eq(0).attr("src",woocommerce_admin_meta_boxes_variations.woocommerce_placeholder_img_src),i.setting_variation_image.find(".upload_image_button").removeClass("remove");else{if(i.variable_image_frame)return i.variable_image_frame.uploader.uploader.param("post_id",i.setting_variation_image_id),void i.variable_image_frame.open();wp.media.model.settings.post.id=i.setting_variation_image_id,i.variable_image_frame=wp.media.frames.variable_image=wp.media({title:woocommerce_admin_meta_boxes_variations.i18n_choose_image,button:{text:woocommerce_admin_meta_boxes_variations.i18n_set_image},states:[new wp.media.controller.Library({title:woocommerce_admin_meta_boxes_variations.i18n_choose_image,filterable:"all"})]}),i.variable_image_frame.on("select",function(){var e=i.variable_image_frame.state().get("selection").first().toJSON(),o=e.sizes&&e.sizes.thumbnail?e.sizes.thumbnail.url:e.url;a(".upload_image_id",i.setting_variation_image).val(e.id).change(),i.setting_variation_image.find(".upload_image_button").addClass("remove"),i.setting_variation_image.find("img").eq(0).attr("src",o),wp.media.model.settings.post.id=i.wp_media_post_id}),i.variable_image_frame.open()}},restore_wp_media_post_id:function(){wp.media.model.settings.post.id=i.wp_media_post_id}},o={init:function(){a("li.variations_tab a").on("click",this.initial_load),a("#variable_product_options").on("click","button.save-variation-changes",this.save_variations).on("click","button.cancel-variation-changes",this.cancel_variations).on("click",".remove_variation",this.remove_variation),a(document.body).on("change","#variable_product_options .woocommerce_variations :input",this.input_changed).on("change",".variations-defaults select",this.defaults_changed),a("form#post").on("submit",this.save_on_submit),a(".wc-metaboxes-wrapper").on("click","a.do_variation_action",this.do_variation_action)},check_for_changes:function(){var e=a("#variable_product_options").find(".woocommerce_variations .variation-needs-update");if(0o&&0!==o&&(n=o),t.go_to_page(n,-1)})):o.unblock()}return!1},link_all_variations:function(){if(o.check_for_changes(),window.confirm(woocommerce_admin_meta_boxes_variations.i18n_link_all_variations)){o.block();var e={action:"woocommerce_link_all_variations",post_id:woocommerce_admin_meta_boxes_variations.post_id,security:woocommerce_admin_meta_boxes_variations.link_variation_nonce};a.post(woocommerce_admin_meta_boxes_variations.ajax_url,e,function(e){var i=parseInt(e,10);1===i?window.alert(i+" "+woocommerce_admin_meta_boxes_variations.i18n_variation_added):0===i||i>1?window.alert(i+" "+woocommerce_admin_meta_boxes_variations.i18n_variations_added):window.alert(woocommerce_admin_meta_boxes_variations.i18n_no_variations_added),i>0?(t.go_to_page(1,i),a("#variable_product_options").trigger("woocommerce_variations_added",i)):o.unblock()})}return!1},input_changed:function(){a(this).closest(".woocommerce_variation").addClass("variation-needs-update"),a("button.cancel-variation-changes, button.save-variation-changes").removeAttr("disabled"),a("#variable_product_options").trigger("woocommerce_variations_input_changed")},defaults_changed:function(){a(this).closest("#variable_product_options").find(".woocommerce_variation:first").addClass("variation-needs-update"),a("button.cancel-variation-changes, button.save-variation-changes").removeAttr("disabled"),a("#variable_product_options").trigger("woocommerce_variations_defaults_changed")},do_variation_action:function(){var e,i=a("select.variation_actions").val(),n={},r=0;switch(i){case"add_variation":return void o.add_variation();case"link_all_variations":return void o.link_all_variations();case"delete_all":window.confirm(woocommerce_admin_meta_boxes_variations.i18n_delete_all_variations)&&window.confirm(woocommerce_admin_meta_boxes_variations.i18n_last_warning)&&(n.allowed=!0,r=-1*parseInt(a("#variable_product_options").find(".woocommerce_variations").attr("data-total"),10));break;case"variable_regular_price_increase":case"variable_regular_price_decrease":case"variable_sale_price_increase":case"variable_sale_price_decrease":if(null==(e=window.prompt(woocommerce_admin_meta_boxes_variations.i18n_enter_a_value_fixed_or_percent)))return;e.indexOf("%")>=0?n.value=accounting.unformat(e.replace(/\%/,""),woocommerce_admin.mon_decimal_point)+"%":n.value=accounting.unformat(e,woocommerce_admin.mon_decimal_point);break;case"variable_regular_price":case"variable_sale_price":case"variable_stock":case"variable_weight":case"variable_length":case"variable_width":case"variable_height":case"variable_download_limit":case"variable_download_expiry":if(null==(e=window.prompt(woocommerce_admin_meta_boxes_variations.i18n_enter_a_value)))return;n.value=e;break;case"variable_sale_schedule":if(n.date_from=window.prompt(woocommerce_admin_meta_boxes_variations.i18n_scheduled_sale_start),n.date_to=window.prompt(woocommerce_admin_meta_boxes_variations.i18n_scheduled_sale_end),null===n.date_from&&(n.date_from=!1),null===n.date_to&&(n.date_to=!1),!1===n.date_to&&!1===n.date_from)return;break;default:a("select.variation_actions").trigger(i),n=a("select.variation_actions").triggerHandler(i+"_ajax_data",n)}"delete_all"===i&&n.allowed?a("#variable_product_options").find(".variation-needs-update").removeClass("variation-needs-update"):o.check_for_changes(),o.block(),a.ajax({url:woocommerce_admin_meta_boxes_variations.ajax_url,data:{action:"woocommerce_bulk_edit_variations",security:woocommerce_admin_meta_boxes_variations.bulk_edit_variations_nonce,product_id:woocommerce_admin_meta_boxes_variations.post_id,product_type:a("#product-type").val(),bulk_action:i,data:n},type:"POST",success:function(){t.go_to_page(1,r)}})}},t={init:function(){a(document.body).on("woocommerce_variations_added",this.update_single_quantity).on("change",".variations-pagenav .page-selector",this.page_selector).on("click",".variations-pagenav .first-page",this.first_page).on("click",".variations-pagenav .prev-page",this.prev_page).on("click",".variations-pagenav .next-page",this.next_page).on("click",".variations-pagenav .last-page",this.last_page)},update_variations_count:function(e){var i=a("#variable_product_options").find(".woocommerce_variations"),o=parseInt(i.attr("data-total"),10)+e,t=a(".variations-pagenav .displaying-num");return i.attr("data-total",o),1===o?t.text(woocommerce_admin_meta_boxes_variations.i18n_variation_count_single.replace("%qty%",o)):t.text(woocommerce_admin_meta_boxes_variations.i18n_variation_count_plural.replace("%qty%",o)),o},update_single_quantity:function(e,i){if(1===i){var o=a(".variations-pagenav");t.update_variations_count(i),o.is(":hidden")&&(a("option, optgroup",".variation_actions").show(),a(".variation_actions").val("add_variation"),a("#variable_product_options").find(".toolbar").show(),o.show(),a(".pagination-links",o).hide())}},set_paginav:function(e){var i=a("#variable_product_options").find(".woocommerce_variations"),o=t.update_variations_count(e),n=a("#variable_product_options").find(".toolbar"),r=a(".variation_actions"),_=a(".variations-pagenav"),s=a(".pagination-links",_),c=Math.ceil(o/woocommerce_admin_meta_boxes_variations.variations_per_page),d="";i.attr("data-total_pages",c),a(".total-pages",_).text(c);for(var m=1;m<=c;m++)d+=''+m+" ";a(".page-selector",_).empty().html(d),0===o?(n.not(".toolbar-top, .toolbar-buttons").hide(),_.hide(),a("option, optgroup",r).hide(),a(".variation_actions").val("add_variation"),a('option[data-global="true"]',r).show()):(n.show(),_.show(),a("option, optgroup",r).show(),a(".variation_actions").val("add_variation"),1===c?s.hide():s.show())},check_is_enabled:function(e){return!a(e).hasClass("disabled")},change_classes:function(e,i){var o=a(".variations-pagenav .first-page"),t=a(".variations-pagenav .prev-page"),n=a(".variations-pagenav .next-page"),r=a(".variations-pagenav .last-page");1===e?(o.addClass("disabled"),t.addClass("disabled")):(o.removeClass("disabled"),t.removeClass("disabled")),i===e?(n.addClass("disabled"),r.addClass("disabled")):(n.removeClass("disabled"),r.removeClass("disabled"))},set_page:function(e){a(".variations-pagenav .page-selector").val(e).first().change()},go_to_page:function(a,e){a=a||1,e=e||0,t.set_paginav(e),t.set_page(a)},page_selector:function(){var e=parseInt(a(this).val(),10),i=a("#variable_product_options").find(".woocommerce_variations");a(".variations-pagenav .page-selector").val(e),o.check_for_changes(),t.change_classes(e,parseInt(i.attr("data-total_pages"),10)),o.load_variations(e)},first_page:function(){return t.check_is_enabled(this)&&t.set_page(1),!1},prev_page:function(){if(t.check_is_enabled(this)){var e=a("#variable_product_options").find(".woocommerce_variations"),i=parseInt(e.attr("data-page"),10)-1,o=0=o?o:i;t.set_page(n)}return!1},last_page:function(){if(t.check_is_enabled(this)){var e=a("#variable_product_options").find(".woocommerce_variations").attr("data-total_pages");t.set_page(e)}return!1}};e.init(),i.init(),o.init(),t.init()});
\ No newline at end of file
+jQuery(function(d){"use strict";var o={init:function(){d("#variable_product_options").on("change","input.variable_is_downloadable",this.variable_is_downloadable).on("change","input.variable_is_virtual",this.variable_is_virtual).on("change","input.variable_manage_stock",this.variable_manage_stock).on("click","button.notice-dismiss",this.notice_dismiss).on("click","h3 .sort",this.set_menu_order).on("reload",this.reload),d("input.variable_is_downloadable, input.variable_is_virtual, input.variable_manage_stock").change(),d("#woocommerce-product-data").on("woocommerce_variations_loaded",this.variations_loaded),d(document.body).on("woocommerce_variations_added",this.variation_added)},reload:function(){n.load_variations(1),m.set_paginav(0)},variable_is_downloadable:function(){d(this).closest(".woocommerce_variation").find(".show_if_variation_downloadable").hide(),d(this).is(":checked")&&d(this).closest(".woocommerce_variation").find(".show_if_variation_downloadable").show()},variable_is_virtual:function(){d(this).closest(".woocommerce_variation").find(".hide_if_variation_virtual").show(),d(this).is(":checked")&&d(this).closest(".woocommerce_variation").find(".hide_if_variation_virtual").hide()},variable_manage_stock:function(){d(this).closest(".woocommerce_variation").find(".show_if_variation_manage_stock").hide(),d(this).closest(".woocommerce_variation").find(".hide_if_variation_manage_stock").show(),d(this).is(":checked")&&(d(this).closest(".woocommerce_variation").find(".show_if_variation_manage_stock").show(),d(this).closest(".woocommerce_variation").find(".hide_if_variation_manage_stock").hide())},notice_dismiss:function(){d(this).closest("div.notice").remove()},variations_loaded:function(a,e){e=e||!1;var i=d("#woocommerce-product-data");e||(d("input.variable_is_downloadable, input.variable_is_virtual, input.variable_manage_stock",i).change(),d(".woocommerce_variation",i).each(function(a,e){var i=d(e),o=d(".sale_price_dates_from",i).val(),t=d(".sale_price_dates_to",i).val();""===o&&""===t||d("a.sale_schedule",i).click()}),d(".woocommerce_variations .variation-needs-update",i).removeClass("variation-needs-update"),d("button.cancel-variation-changes, button.save-variation-changes",i).attr("disabled","disabled")),d("#tiptip_holder").removeAttr("style"),d("#tiptip_arrow").removeAttr("style"),d(".woocommerce_variations .tips, .woocommerce_variations .help_tip, .woocommerce_variations .woocommerce-help-tip",i).tipTip({attribute:"data-tip",fadeIn:50,fadeOut:50,delay:200}),d(".sale_price_dates_fields",i).find("input").datepicker({defaultDate:"",dateFormat:"yy-mm-dd",numberOfMonths:1,showButtonPanel:!0,onSelect:function(){var a=d(this).is(".sale_price_dates_from")?"minDate":"maxDate",e=d(this).closest(".sale_price_dates_fields").find("input"),i=d(this).datepicker("getDate");e.not(this).datepicker("option",a,i),d(this).change()}}),d(".woocommerce_variations",i).sortable({items:".woocommerce_variation",cursor:"move",axis:"y",handle:".sort",scrollSensitivity:40,forcePlaceholderSize:!0,helper:"clone",opacity:.65,stop:function(){o.variation_row_indexes()}}),d(document.body).trigger("wc-enhanced-select-init")},variation_added:function(a,e){1===e&&o.variations_loaded(null,!0)},set_menu_order:function(a){a.preventDefault();var e=d(this).closest(".woocommerce_variation").find(".variation_menu_order"),i=window.prompt(woocommerce_admin_meta_boxes_variations.i18n_enter_menu_order,e.val());null!=i&&(e.val(parseInt(i,10)).change(),n.save_variations())},variation_row_indexes:function(){var a=d("#variable_product_options").find(".woocommerce_variations"),e=parseInt(a.attr("data-page"),10),i=parseInt((e-1)*woocommerce_admin_meta_boxes_variations.variations_per_page,10);d(".woocommerce_variations .woocommerce_variation").each(function(a,e){d(".variation_menu_order",e).val(parseInt(d(e).index(".woocommerce_variations .woocommerce_variation"),10)+1+i).change()})}},t={variable_image_frame:null,setting_variation_image_id:null,setting_variation_image:null,wp_media_post_id:wp.media.model.settings.post.id,init:function(){d("#variable_product_options").on("click",".upload_image_button",this.add_image),d("a.add_media").on("click",this.restore_wp_media_post_id)},add_image:function(a){var e=d(this),i=e.attr("rel"),o=e.closest(".upload_image");if(t.setting_variation_image=o,t.setting_variation_image_id=i,a.preventDefault(),e.is(".remove"))d(".upload_image_id",t.setting_variation_image).val("").change(),t.setting_variation_image.find("img").eq(0).attr("src",woocommerce_admin_meta_boxes_variations.woocommerce_placeholder_img_src),t.setting_variation_image.find(".upload_image_button").removeClass("remove");else{if(t.variable_image_frame)return t.variable_image_frame.uploader.uploader.param("post_id",t.setting_variation_image_id),void t.variable_image_frame.open();wp.media.model.settings.post.id=t.setting_variation_image_id,t.variable_image_frame=wp.media.frames.variable_image=wp.media({title:woocommerce_admin_meta_boxes_variations.i18n_choose_image,button:{text:woocommerce_admin_meta_boxes_variations.i18n_set_image},states:[new wp.media.controller.Library({title:woocommerce_admin_meta_boxes_variations.i18n_choose_image,filterable:"all"})]}),t.variable_image_frame.on("select",function(){var a=t.variable_image_frame.state().get("selection").first().toJSON(),e=a.sizes&&a.sizes.thumbnail?a.sizes.thumbnail.url:a.url;d(".upload_image_id",t.setting_variation_image).val(a.id).change(),t.setting_variation_image.find(".upload_image_button").addClass("remove"),t.setting_variation_image.find("img").eq(0).attr("src",e),wp.media.model.settings.post.id=t.wp_media_post_id}),t.variable_image_frame.open()}},restore_wp_media_post_id:function(){wp.media.model.settings.post.id=t.wp_media_post_id}},n={init:function(){d("li.variations_tab a").on("click",this.initial_load),d("#variable_product_options").on("click","button.save-variation-changes",this.save_variations).on("click","button.cancel-variation-changes",this.cancel_variations).on("click",".remove_variation",this.remove_variation),d(document.body).on("change","#variable_product_options .woocommerce_variations :input",this.input_changed).on("change",".variations-defaults select",this.defaults_changed),d("form#post").on("submit",this.save_on_submit),d(".wc-metaboxes-wrapper").on("click","a.do_variation_action",this.do_variation_action)},check_for_changes:function(){var a=d("#variable_product_options").find(".woocommerce_variations .variation-needs-update");if(0'+c+"";d(".page-selector",n).empty().html(s),0===i?(o.not(".toolbar-top, .toolbar-buttons").hide(),n.hide(),d("option, optgroup",t).hide(),d(".variation_actions").val("add_variation"),d('option[data-global="true"]',t).show()):(o.show(),n.show(),d("option, optgroup",t).show(),d(".variation_actions").val("add_variation"),1===_?r.hide():r.show())},check_is_enabled:function(a){return!d(a).hasClass("disabled")},change_classes:function(a,e){var i=d(".variations-pagenav .first-page"),o=d(".variations-pagenav .prev-page"),t=d(".variations-pagenav .next-page"),n=d(".variations-pagenav .last-page");1===a?(i.addClass("disabled"),o.addClass("disabled")):(i.removeClass("disabled"),o.removeClass("disabled")),e===a?(t.addClass("disabled"),n.addClass("disabled")):(t.removeClass("disabled"),n.removeClass("disabled"))},set_page:function(a){d(".variations-pagenav .page-selector").val(a).first().change()},go_to_page:function(a,e){a=a||1,e=e||0,m.set_paginav(e),m.set_page(a)},page_selector:function(){var a=parseInt(d(this).val(),10),e=d("#variable_product_options").find(".woocommerce_variations");d(".variations-pagenav .page-selector").val(a),n.check_for_changes(),m.change_classes(a,parseInt(e.attr("data-total_pages"),10)),n.load_variations(a)},first_page:function(){return m.check_is_enabled(this)&&m.set_page(1),!1},prev_page:function(){if(m.check_is_enabled(this)){var a=d("#variable_product_options").find(".woocommerce_variations"),e=parseInt(a.attr("data-page"),10)-1,i=0 ul.categorychecklist').each(function(){var e=t(this),i=e.find(":checked").first();if(i.length){var o=e.find("input").position().top,a=i.position().top;e.closest(".tabs-panel").scrollTop(a-o+5)}})}),t("#upsell_product_data").bind("keypress",function(t){if(13===t.keyCode)return!1}),t(".type_box").appendTo("#woocommerce-product-data .hndle span"),t(function(){t("#woocommerce-product-data").find(".hndle").unbind("click.postboxes"),t("#woocommerce-product-data").on("click",".hndle",function(e){t(e.target).filter("input, option, label, select").length||t("#woocommerce-product-data").toggleClass("closed")})}),t("#catalog-visibility").find(".edit-catalog-visibility").click(function(){return t("#catalog-visibility-select").is(":hidden")&&(t("#catalog-visibility-select").slideDown("fast"),t(this).hide()),!1}),t("#catalog-visibility").find(".save-post-visibility").click(function(){t("#catalog-visibility-select").slideUp("fast"),t("#catalog-visibility").find(".edit-catalog-visibility").show();var e=t("input[name=_visibility]:checked").attr("data-label");return t("input[name=_featured]").is(":checked")&&(e=e+", "+woocommerce_admin_meta_boxes.featured_label,t("input[name=_featured]").attr("checked","checked")),t("#catalog-visibility-display").text(e),!1}),t("#catalog-visibility").find(".cancel-post-visibility").click(function(){t("#catalog-visibility-select").slideUp("fast"),t("#catalog-visibility").find(".edit-catalog-visibility").show();var e=t("#current_visibility").val(),i=t("#current_featured").val();t("input[name=_visibility]").removeAttr("checked"),t("input[name=_visibility][value="+e+"]").attr("checked","checked");var o=t("input[name=_visibility]:checked").attr("data-label");return"yes"===i?(o=o+", "+woocommerce_admin_meta_boxes.featured_label,t("input[name=_featured]").attr("checked","checked")):t("input[name=_featured]").removeAttr("checked"),t("#catalog-visibility-display").text(o),!1}),t("select#product-type").change(function(){var i=t(this).val();"variable"===i?(t("input#_manage_stock").change(),t("input#_downloadable").prop("checked",!1),t("input#_virtual").removeAttr("checked")):"grouped"===i?(t("input#_downloadable").prop("checked",!1),t("input#_virtual").removeAttr("checked")):"external"===i&&(t("input#_downloadable").prop("checked",!1),t("input#_virtual").removeAttr("checked")),e(),t("ul.wc-tabs li:visible").eq(0).find("a").click(),t(document.body).trigger("woocommerce-product-type-change",i,t(this))}).change(),t("input#_downloadable, input#_virtual").change(function(){e()}),t(".sale_price_dates_fields").each(function(){var e=t(this),i=!1,o=e.closest("div, table");e.find("input").each(function(){""!==t(this).val()&&(i=!0)}),i?(o.find(".sale_schedule").hide(),o.find(".sale_price_dates_fields").show()):(o.find(".sale_schedule").show(),o.find(".sale_price_dates_fields").hide())}),t("#woocommerce-product-data").on("click",".sale_schedule",function(){var e=t(this).closest("div, table");return t(this).hide(),e.find(".cancel_sale_schedule").show(),e.find(".sale_price_dates_fields").show(),!1}),t("#woocommerce-product-data").on("click",".cancel_sale_schedule",function(){var e=t(this).closest("div, table");return t(this).hide(),e.find(".sale_schedule").show(),e.find(".sale_price_dates_fields").hide(),e.find(".sale_price_dates_fields").find("input").val(""),!1}),t("#woocommerce-product-data").on("click",".downloadable_files a.insert",function(){return t(this).closest(".downloadable_files").find("tbody").append(t(this).data("row")),!1}),t("#woocommerce-product-data").on("click",".downloadable_files a.delete",function(){return t(this).closest("tr").remove(),!1}),t("input#_manage_stock").change(function(){if(t(this).is(":checked"))t("div.stock_fields").show(),t("p.stock_status_field").hide();else{var e=t("select#product-type").val();t("div.stock_fields").hide(),t("p.stock_status_field:not( .hide_if_"+e+" )").show()}}).change(),t(".sale_price_dates_fields").each(function(){t(this).find("input").datepicker({defaultDate:"",dateFormat:"yy-mm-dd",numberOfMonths:1,showButtonPanel:!0,onSelect:function(){i(t(this))}}),t(this).find("input").each(function(){i(t(this))})});var a=t(".product_attributes").find(".woocommerce_attribute").get();a.sort(function(e,i){var o=parseInt(t(e).attr("rel"),10),a=parseInt(t(i).attr("rel"),10);return oa?1:0}),t(a).each(function(e,i){t(".product_attributes").append(i)}),t(".product_attributes .woocommerce_attribute").each(function(e,i){"none"!==t(i).css("display")&&t(i).is(".taxonomy")&&t("select.attribute_taxonomy").find('option[value="'+t(i).data("taxonomy")+'"]').attr("disabled","disabled")}),t("button.add_attribute").on("click",function(){var e=t(".product_attributes .woocommerce_attribute").length,i=t("select.attribute_taxonomy").val(),a=t(this).closest("#product_attributes"),c=a.find(".product_attributes"),n=t("select#product-type").val(),r={action:"woocommerce_add_attribute",taxonomy:i,i:e,security:woocommerce_admin_meta_boxes.add_attribute_nonce};return a.block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),t.post(woocommerce_admin_meta_boxes.ajax_url,r,function(e){c.append(e),"variable"!==n&&c.find(".enable_variation").hide(),t(document.body).trigger("wc-enhanced-select-init"),o(),a.unblock(),t(document.body).trigger("woocommerce_added_attribute")}),i&&(t("select.attribute_taxonomy").find('option[value="'+i+'"]').attr("disabled","disabled"),t("select.attribute_taxonomy").val("")),!1}),t(".product_attributes").on("blur","input.attribute_name",function(){t(this).closest(".woocommerce_attribute").find("strong.attribute_name").text(t(this).val())}),t(".product_attributes").on("click","button.select_all_attributes",function(){return t(this).closest("td").find("select option").attr("selected","selected"),t(this).closest("td").find("select").change(),!1}),t(".product_attributes").on("click","button.select_no_attributes",function(){return t(this).closest("td").find("select option").removeAttr("selected"),t(this).closest("td").find("select").change(),!1}),t(".product_attributes").on("click",".remove_row",function(){if(window.confirm(woocommerce_admin_meta_boxes.remove_attribute)){var e=t(this).parent().parent();e.is(".taxonomy")?(e.find("select, input[type=text]").val(""),e.hide(),t("select.attribute_taxonomy").find('option[value="'+e.data("taxonomy")+'"]').removeAttr("disabled")):(e.find("select, input[type=text]").val(""),e.hide(),o())}return!1}),t(".product_attributes").sortable({items:".woocommerce_attribute",cursor:"move",axis:"y",handle:"h3",scrollSensitivity:40,forcePlaceholderSize:!0,helper:"clone",opacity:.65,placeholder:"wc-metabox-sortable-placeholder",start:function(t,e){e.item.css("background-color","#f6f6f6")},stop:function(t,e){e.item.removeAttr("style"),o()}}),t(".product_attributes").on("click","button.add_new_attribute",function(){t(".product_attributes").block({message:null,overlayCSS:{background:"#fff",opacity:.6}});var e=t(this).closest(".woocommerce_attribute"),i=e.data("taxonomy"),o=window.prompt(woocommerce_admin_meta_boxes.new_attribute_prompt);if(o){var a={action:"woocommerce_add_new_attribute",taxonomy:i,term:o,security:woocommerce_admin_meta_boxes.add_attribute_nonce};t.post(woocommerce_admin_meta_boxes.ajax_url,a,function(i){i.error?window.alert(i.error):i.slug&&(e.find("select.attribute_values").append(''+i.name+" "),e.find("select.attribute_values").change()),t(".product_attributes").unblock()})}else t(".product_attributes").unblock();return!1}),t(".save_attributes").on("click",function(){t("#woocommerce-product-data").block({message:null,overlayCSS:{background:"#fff",opacity:.6}});var e={post_id:woocommerce_admin_meta_boxes.post_id,product_type:t("#product-type").val(),data:t(".product_attributes").find("input, select, textarea").serialize(),action:"woocommerce_save_attributes",security:woocommerce_admin_meta_boxes.save_attributes_nonce};t.post(woocommerce_admin_meta_boxes.ajax_url,e,function(){var e=window.location.toString();e=e.replace("post-new.php?","post.php?post="+woocommerce_admin_meta_boxes.post_id+"&action=edit&"),t("#variable_product_options").load(e+" #variable_product_options_inner",function(){t("#variable_product_options").trigger("reload")})})});var c,n;t(document.body).on("click",".upload_file_button",function(e){var i=t(this);if(n=i.closest("tr").find("td.file_url input"),e.preventDefault(),c)c.open();else{var o=[new wp.media.controller.Library({library:wp.media.query(),multiple:!0,title:i.data("choose"),priority:20,filterable:"uploaded"})];(c=wp.media.frames.downloadable_file=wp.media({title:i.data("choose"),library:{type:""},button:{text:i.data("update")},multiple:!0,states:o})).on("select",function(){var t="";c.state().get("selection").map(function(e){(e=e.toJSON()).url&&(t=e.url)}),n.val(t).change()}),c.on("ready",function(){c.uploader.options.uploader.params={type:"downloadable_product"}}),c.open()}}),t(".downloadable_files tbody").sortable({items:"tr",cursor:"move",axis:"y",handle:"td.sort",scrollSensitivity:40,forcePlaceholderSize:!0,helper:"clone",opacity:.65});var r,l=t("#product_image_gallery"),s=t("#product_images_container").find("ul.product_images");t(".add_product_images").on("click","a",function(e){var i=t(this);e.preventDefault(),r?r.open():((r=wp.media.frames.product_gallery=wp.media({title:i.data("choose"),button:{text:i.data("update")},states:[new wp.media.controller.Library({title:i.data("choose"),filterable:"all",multiple:!0})]})).on("select",function(){var t=r.state().get("selection"),e=l.val();t.map(function(t){if((t=t.toJSON()).id){e=e?e+","+t.id:t.id;var o=t.sizes&&t.sizes.thumbnail?t.sizes.thumbnail.url:t.url;s.append(' ")}}),l.val(e)}),r.open())}),s.sortable({items:"li.image",cursor:"move",scrollSensitivity:40,forcePlaceholderSize:!0,forceHelperSize:!1,helper:"clone",opacity:.65,placeholder:"wc-metabox-sortable-placeholder",start:function(t,e){e.item.css("background-color","#f6f6f6")},stop:function(t,e){e.item.removeAttr("style")},update:function(){var e="";t("#product_images_container").find("ul li.image").css("cursor","default").each(function(){var i=t(this).attr("data-attachment_id");e=e+i+","}),l.val(e)}}),t("#product_images_container").on("click","a.delete",function(){t(this).closest("li.image").remove();var e="";return t("#product_images_container").find("ul li.image").css("cursor","default").each(function(){var i=t(this).attr("data-attachment_id");e=e+i+","}),l.val(e),t("#tiptip_holder").removeAttr("style"),t("#tiptip_arrow").removeAttr("style"),!1})});
\ No newline at end of file
+jQuery(function(n){function e(){var t=n("select#product-type").val(),e=n("input#_virtual:checked").length,i=n("input#_downloadable:checked").length,o=".hide_if_downloadable, .hide_if_virtual",a=".show_if_downloadable, .show_if_virtual";n.each(woocommerce_admin_meta_boxes.product_types,function(t,e){o=o+", .hide_if_"+e,a=a+", .show_if_"+e}),n(o).show(),n(a).hide(),i&&n(".show_if_downloadable").show(),e&&n(".show_if_virtual").show(),n(".show_if_"+t).show(),i&&n(".hide_if_downloadable").hide(),e&&n(".hide_if_virtual").hide(),n(".hide_if_"+t).hide(),n("input#_manage_stock").change(),n(".woocommerce_options_panel").each(function(){var t=n(this).children(".options_group");if(0!==t.length&&t.filter(function(){return"none"===n(this).css("display")}).length===t.length){var e=n(this).prop("id");n(".product_data_tabs").find('li a[href="#'+e+'"]').parent().hide()}})}function t(t){var e=n(t).next().is(".hasDatepicker")?"minDate":"maxDate",i="minDate"===e?n(t).next():n(t).prev(),o=n(t).datepicker("getDate");n(i).datepicker("option",e,o),n(t).change()}n(function(){n('[id$="-all"] > ul.categorychecklist').each(function(){var t=n(this),e=t.find(":checked").first();if(e.length){var i=t.find("input").position().top,o=e.position().top;t.closest(".tabs-panel").scrollTop(o-i+5)}})}),n("#upsell_product_data").bind("keypress",function(t){if(13===t.keyCode)return!1}),n(".type_box").appendTo("#woocommerce-product-data .hndle span"),n(function(){n("#woocommerce-product-data").find(".hndle").unbind("click.postboxes"),n("#woocommerce-product-data").on("click",".hndle",function(t){n(t.target).filter("input, option, label, select").length||n("#woocommerce-product-data").toggleClass("closed")})}),n("#catalog-visibility").find(".edit-catalog-visibility").click(function(){return n("#catalog-visibility-select").is(":hidden")&&(n("#catalog-visibility-select").slideDown("fast"),n(this).hide()),!1}),n("#catalog-visibility").find(".save-post-visibility").click(function(){n("#catalog-visibility-select").slideUp("fast"),n("#catalog-visibility").find(".edit-catalog-visibility").show();var t=n("input[name=_visibility]:checked").attr("data-label");return n("input[name=_featured]").is(":checked")&&(t=t+", "+woocommerce_admin_meta_boxes.featured_label,n("input[name=_featured]").attr("checked","checked")),n("#catalog-visibility-display").text(t),!1}),n("#catalog-visibility").find(".cancel-post-visibility").click(function(){n("#catalog-visibility-select").slideUp("fast"),n("#catalog-visibility").find(".edit-catalog-visibility").show();var t=n("#current_visibility").val(),e=n("#current_featured").val();n("input[name=_visibility]").removeAttr("checked"),n("input[name=_visibility][value="+t+"]").attr("checked","checked");var i=n("input[name=_visibility]:checked").attr("data-label");return"yes"===e?(i=i+", "+woocommerce_admin_meta_boxes.featured_label,n("input[name=_featured]").attr("checked","checked")):n("input[name=_featured]").removeAttr("checked"),n("#catalog-visibility-display").text(i),!1}),n("select#product-type").change(function(){var t=n(this).val();"variable"===t?(n("input#_manage_stock").change(),n("input#_downloadable").prop("checked",!1),n("input#_virtual").removeAttr("checked")):"grouped"===t?(n("input#_downloadable").prop("checked",!1),n("input#_virtual").removeAttr("checked")):"external"===t&&(n("input#_downloadable").prop("checked",!1),n("input#_virtual").removeAttr("checked")),e(),n("ul.wc-tabs li:visible").eq(0).find("a").click(),n(document.body).trigger("woocommerce-product-type-change",t,n(this))}).change(),n("input#_downloadable, input#_virtual").change(function(){e()}),n(".sale_price_dates_fields").each(function(){var t=n(this),e=!1,i=t.closest("div, table");t.find("input").each(function(){""!==n(this).val()&&(e=!0)}),e?(i.find(".sale_schedule").hide(),i.find(".sale_price_dates_fields").show()):(i.find(".sale_schedule").show(),i.find(".sale_price_dates_fields").hide())}),n("#woocommerce-product-data").on("click",".sale_schedule",function(){var t=n(this).closest("div, table");return n(this).hide(),t.find(".cancel_sale_schedule").show(),t.find(".sale_price_dates_fields").show(),!1}),n("#woocommerce-product-data").on("click",".cancel_sale_schedule",function(){var t=n(this).closest("div, table");return n(this).hide(),t.find(".sale_schedule").show(),t.find(".sale_price_dates_fields").hide(),t.find(".sale_price_dates_fields").find("input").val(""),!1}),n("#woocommerce-product-data").on("click",".downloadable_files a.insert",function(){return n(this).closest(".downloadable_files").find("tbody").append(n(this).data("row")),!1}),n("#woocommerce-product-data").on("click",".downloadable_files a.delete",function(){return n(this).closest("tr").remove(),!1}),n("input#_manage_stock").change(function(){if(n(this).is(":checked"))n("div.stock_fields").show(),n("p.stock_status_field").hide();else{var t=n("select#product-type").val();n("div.stock_fields").hide(),n("p.stock_status_field:not( .hide_if_"+t+" )").show()}}).change(),n(".sale_price_dates_fields").each(function(){n(this).find("input").datepicker({defaultDate:"",dateFormat:"yy-mm-dd",numberOfMonths:1,showButtonPanel:!0,onSelect:function(){t(n(this))}}),n(this).find("input").each(function(){t(n(this))})});var o,a,c,i=n(".product_attributes").find(".woocommerce_attribute").get();function r(){n(".product_attributes .woocommerce_attribute").each(function(t,e){n(".attribute_position",e).val(parseInt(n(e).index(".product_attributes .woocommerce_attribute"),10))})}i.sort(function(t,e){var i=parseInt(n(t).attr("rel"),10),o=parseInt(n(e).attr("rel"),10);return i'+t.name+""),e.find("select.attribute_values").change()),n(".product_attributes").unblock()})}else n(".product_attributes").unblock();return!1}),n(".save_attributes").on("click",function(){n(".product_attributes").block({message:null,overlayCSS:{background:"#fff",opacity:.6}});var a=n(".product_attributes").find("input, select, textarea"),t={post_id:woocommerce_admin_meta_boxes.post_id,product_type:n("#product-type").val(),data:a.serialize(),action:"woocommerce_save_attributes",security:woocommerce_admin_meta_boxes.save_attributes_nonce};n.post(woocommerce_admin_meta_boxes.ajax_url,t,function(t){if(t.error)window.alert(t.error);else if(t.data){n(".product_attributes").html(t.data.html),n(".product_attributes").unblock();for(var e=a.length/6,i=0;i ")}}),l.val(i)}),c.open()}),d.sortable({items:"li.image",cursor:"move",scrollSensitivity:40,forcePlaceholderSize:!0,forceHelperSize:!1,helper:"clone",opacity:.65,placeholder:"wc-metabox-sortable-placeholder",start:function(t,e){e.item.css("background-color","#f6f6f6")},stop:function(t,e){e.item.removeAttr("style")},update:function(){var e="";n("#product_images_container").find("ul li.image").css("cursor","default").each(function(){var t=n(this).attr("data-attachment_id");e=e+t+","}),l.val(e)}}),n("#product_images_container").on("click","a.delete",function(){n(this).closest("li.image").remove();var e="";return n("#product_images_container").find("ul li.image").css("cursor","default").each(function(){var t=n(this).attr("data-attachment_id");e=e+t+","}),l.val(e),n("#tiptip_holder").removeAttr("style"),n("#tiptip_arrow").removeAttr("style"),!1})});
\ No newline at end of file
diff --git a/assets/js/admin/meta-boxes.min.js b/assets/js/admin/meta-boxes.min.js
index ba877db4323..3ea38578642 100644
--- a/assets/js/admin/meta-boxes.min.js
+++ b/assets/js/admin/meta-boxes.min.js
@@ -1 +1 @@
-jQuery(function(t){t("#tiptip_holder").removeAttr("style"),t("#tiptip_arrow").removeAttr("style"),t(".tips").tipTip({attribute:"data-tip",fadeIn:50,fadeOut:50,delay:200}),t("#titlediv").find("#title").keyup(function(e){if("9"===(e.keyCode||e.which)&&t("#woocommerce-coupon-description").length>0)return e.stopPropagation(),t("#woocommerce-coupon-description").focus(),!1}),t(".wc-metaboxes-wrapper").on("click",".wc-metabox > h3",function(){t(this).parent(".wc-metabox").toggleClass("closed").toggleClass("open")}),t(document.body).on("wc-init-tabbed-panels",function(){t("ul.wc-tabs").show(),t("ul.wc-tabs a").click(function(e){e.preventDefault();var o=t(this).closest("div.panel-wrap");t("ul.wc-tabs li",o).removeClass("active"),t(this).parent().addClass("active"),t("div.panel",o).hide(),t(t(this).attr("href")).show()}),t("div.panel-wrap").each(function(){t(this).find("ul.wc-tabs li").eq(0).find("a").click()})}).trigger("wc-init-tabbed-panels"),t(document.body).on("wc-init-datepickers",function(){t(".date-picker-field, .date-picker").datepicker({dateFormat:"yy-mm-dd",numberOfMonths:1,showButtonPanel:!0})}).trigger("wc-init-datepickers"),t(".wc-metaboxes-wrapper").on("click",".wc-metabox h3",function(e){t(e.target).filter(":input, option, .sort").length||t(this).next(".wc-metabox-content").stop().slideToggle()}).on("click",".expand_all",function(){return t(this).closest(".wc-metaboxes-wrapper").find(".wc-metabox > .wc-metabox-content").show(),!1}).on("click",".close_all",function(){return t(this).closest(".wc-metaboxes-wrapper").find(".wc-metabox > .wc-metabox-content").hide(),!1}),t(".wc-metabox.closed").each(function(){t(this).find(".wc-metabox-content").hide()})});
\ No newline at end of file
+jQuery(function(o){o("#tiptip_holder").removeAttr("style"),o("#tiptip_arrow").removeAttr("style"),o(".tips").tipTip({attribute:"data-tip",fadeIn:50,fadeOut:50,delay:200}),o("#titlediv").find("#title").keyup(function(t){if("9"===(t.keyCode||t.which)&&0 h3",function(){o(this).parent(".wc-metabox").toggleClass("closed").toggleClass("open")}),o(document.body).on("wc-init-tabbed-panels",function(){o("ul.wc-tabs").show(),o("ul.wc-tabs a").click(function(t){t.preventDefault();var e=o(this).closest("div.panel-wrap");o("ul.wc-tabs li",e).removeClass("active"),o(this).parent().addClass("active"),o("div.panel",e).hide(),o(o(this).attr("href")).show()}),o("div.panel-wrap").each(function(){o(this).find("ul.wc-tabs li").eq(0).find("a").click()})}).trigger("wc-init-tabbed-panels"),o(document.body).on("wc-init-datepickers",function(){o(".date-picker-field, .date-picker").datepicker({dateFormat:"yy-mm-dd",numberOfMonths:1,showButtonPanel:!0})}).trigger("wc-init-datepickers"),o(".wc-metaboxes-wrapper").on("click",".wc-metabox h3",function(t){o(t.target).filter(":input, option, .sort").length||o(this).next(".wc-metabox-content").stop().slideToggle()}).on("click",".expand_all",function(){return o(this).closest(".wc-metaboxes-wrapper").find(".wc-metabox > .wc-metabox-content").show(),!1}).on("click",".close_all",function(){return o(this).closest(".wc-metaboxes-wrapper").find(".wc-metabox > .wc-metabox-content").hide(),!1}),o(".wc-metabox.closed").each(function(){o(this).find(".wc-metabox-content").hide()})});
\ No newline at end of file
diff --git a/assets/js/admin/network-orders.min.js b/assets/js/admin/network-orders.min.js
index 0d197c57f1e..e283ac2d35c 100644
--- a/assets/js/admin/network-orders.min.js
+++ b/assets/js/admin/network-orders.min.js
@@ -1 +1 @@
-!function(e,o,r){if("undefined"!=typeof woocommerce_network_orders){var t=[],n=[],s=[],a=e(document.getElementById("network-orders-tbody")),d=o.template(e(document.getElementById("network-orders-row-template")).text()),c=e(document.getElementById("woocommerce-network-order-table-loading")),i=e(document.getElementById("woocommerce-network-order-table")),m=e(document.getElementById("woocommerce-network-orders-no-orders"));if(!woocommerce_network_orders.sites.length)return c.removeClass("is-active"),i.removeClass("is-active"),void m.addClass("is-active");e.each(woocommerce_network_orders.sites,function(o,r){n[o]=e.Deferred(),s.push(e.ajax({url:woocommerce_network_orders.order_endpoint,data:{_wpnonce:woocommerce_network_orders.nonce,network_orders:!0,blog_id:r},type:"GET"}).success(function(e){var r;for(r in e)t.push(e[r]);n[o].resolve()}).fail(function(){n[o].resolve()}))}),n.length>0&&e.when.apply(e,n).done(function(){var e,o;if(t.sort(function(e,o){var r,t;return r=Date.parse(e.date_created_gmt),t=Date.parse(o.date_created_gmt),r===t?0:r0){for(e in t)o=t[e],a.append(d(o));m.removeClass("is-active"),c.removeClass("is-active"),i.addClass("is-active")}else m.addClass("is-active"),c.removeClass("is-active"),i.removeClass("is-active")})}}(jQuery,_);
\ No newline at end of file
+!function(o,e,r){if("undefined"!=typeof woocommerce_network_orders){var t=[],n=[],s=[],a=o(document.getElementById("network-orders-tbody")),c=e.template(o(document.getElementById("network-orders-row-template")).text()),d=o(document.getElementById("woocommerce-network-order-table-loading")),i=o(document.getElementById("woocommerce-network-order-table")),m=o(document.getElementById("woocommerce-network-orders-no-orders"));if(!woocommerce_network_orders.sites.length)return d.removeClass("is-active"),i.removeClass("is-active"),m.addClass("is-active");o.each(woocommerce_network_orders.sites,function(r,e){n[r]=o.Deferred(),s.push(o.ajax({url:woocommerce_network_orders.order_endpoint,data:{_wpnonce:woocommerce_network_orders.nonce,network_orders:!0,blog_id:e},type:"GET"}).success(function(e){var o;for(o in e)t.push(e[o]);n[r].resolve()}).fail(function(){n[r].resolve()}))}),0 '),t.post(ajaxurl,{action:"woocommerce_product_ordering",id:o,previd:n,nextid:d},function(e){t.each(e,function(e,i){t("#inline_"+e+" .menu_order").html(i)}),i.item.find(".check-column input").show().siblings("img").remove(),t("table.widefat tbody th, table.widefat tbody td").css("cursor","move"),t("table.widefat tbody").sortable("enable")}),t("table.widefat tbody tr").each(function(){t("table.widefat tbody tr").index(this)%2==0?t(this).addClass("alternate"):t(this).removeClass("alternate")})}})});
\ No newline at end of file
+jQuery(function(d){d("table.widefat tbody th, table.widefat tbody td").css("cursor","move"),d("table.widefat tbody").sortable({items:"tr:not(.inline-edit-row)",cursor:"move",axis:"y",containment:"table.widefat",scrollSensitivity:40,helper:function(t,e){return e.each(function(){d(this).width(d(this).width())}),e},start:function(t,e){e.item.css("background-color","#ffffff"),e.item.children("td, th").css("border-bottom-width","0"),e.item.css("outline","1px solid #dfdfdf")},stop:function(t,e){e.item.removeAttr("style"),e.item.children("td,th").css("border-bottom-width","1px")},update:function(t,e){d("table.widefat tbody th, table.widefat tbody td").css("cursor","default"),d("table.widefat tbody").sortable("disable");var i=e.item.find(".check-column input").val(),o=e.item.prev().find(".check-column input").val(),n=e.item.next().find(".check-column input").val();e.item.find(".check-column input").hide().after(' '),d.post(ajaxurl,{action:"woocommerce_product_ordering",id:i,previd:o,nextid:n},function(t){d.each(t,function(t,e){d("#inline_"+t+" .menu_order").html(e)}),e.item.find(".check-column input").show().siblings("img").remove(),d("table.widefat tbody th, table.widefat tbody td").css("cursor","move"),d("table.widefat tbody").sortable("enable")}),d("table.widefat tbody tr").each(function(){d("table.widefat tbody tr").index(this)%2==0?d(this).addClass("alternate"):d(this).removeClass("alternate")})}})});
\ No newline at end of file
diff --git a/assets/js/admin/quick-edit.js b/assets/js/admin/quick-edit.js
index a35b54ace50..74f2f94c866 100644
--- a/assets/js/admin/quick-edit.js
+++ b/assets/js/admin/quick-edit.js
@@ -70,11 +70,11 @@ jQuery(function( $ ) {
if ( product_supports_stock_fields ) {
if ( 'yes' === manage_stock ) {
- $( '.stock_fields' ).show().removeAttr( 'style' );
+ $( '.stock_qty_field, .backorder_field', '.inline-edit-row' ).show().removeAttr( 'style' );
$( '.stock_status_field' ).hide();
$( '.manage_stock_field input' ).prop( 'checked', true );
} else {
- $( '.stock_qty_field', '.inline-edit-row' ).hide();
+ $( '.stock_qty_field, .backorder_field', '.inline-edit-row' ).hide();
$( '.stock_status_field' ).show().removeAttr( 'style' );
$( '.manage_stock_field input' ).prop( 'checked', false );
}
@@ -103,10 +103,10 @@ jQuery(function( $ ) {
$( '#the-list' ).on( 'change', '.inline-edit-row input[name="_manage_stock"]', function() {
if ( $( this ).is( ':checked' ) ) {
- $( '.stock_qty_field', '.inline-edit-row' ).show().removeAttr( 'style' );
+ $( '.stock_qty_field, .backorder_field', '.inline-edit-row' ).show().removeAttr( 'style' );
$( '.stock_status_field' ).hide();
} else {
- $( '.stock_qty_field', '.inline-edit-row' ).hide();
+ $( '.stock_qty_field, .backorder_field', '.inline-edit-row' ).hide();
$( '.stock_status_field' ).show().removeAttr( 'style' );
}
diff --git a/assets/js/admin/quick-edit.min.js b/assets/js/admin/quick-edit.min.js
index ce1e25a749f..48828de40db 100644
--- a/assets/js/admin/quick-edit.min.js
+++ b/assets/js/admin/quick-edit.min.js
@@ -1 +1 @@
-jQuery(function(e){e("#the-list").on("click",".editinline",function(){inlineEditPost.revert();var t=e(this).closest("tr").attr("id");t=t.replace("post-","");var i=e("#woocommerce_inline_"+t),n=i.find(".sku").text(),o=i.find(".regular_price").text(),s=i.find(".sale_price ").text(),d=i.find(".weight").text(),l=i.find(".length").text(),c=i.find(".width").text(),a=i.find(".height").text(),r=i.find(".shipping_class").text(),_=i.find(".visibility").text(),m=i.find(".stock_status").text(),p=i.find(".stock").text(),u=i.find(".featured").text(),f=i.find(".manage_stock").text(),h=i.find(".menu_order").text(),w=i.find(".tax_status").text(),k=i.find(".tax_class").text(),v=i.find(".backorders").text(),x=o.replace(".",woocommerce_admin.mon_decimal_point),g=s.replace(".",woocommerce_admin.mon_decimal_point);e('input[name="_sku"]',".inline-edit-row").val(n),e('input[name="_regular_price"]',".inline-edit-row").val(x),e('input[name="_sale_price"]',".inline-edit-row").val(g),e('input[name="_weight"]',".inline-edit-row").val(d),e('input[name="_length"]',".inline-edit-row").val(l),e('input[name="_width"]',".inline-edit-row").val(c),e('input[name="_height"]',".inline-edit-row").val(a),e('select[name="_shipping_class"] option:selected',".inline-edit-row").attr("selected",!1).change(),e('select[name="_shipping_class"] option[value="'+r+'"]').attr("selected","selected").change(),e('input[name="_stock"]',".inline-edit-row").val(p),e('input[name="menu_order"]',".inline-edit-row").val(h),e('select[name="_tax_status"] option, select[name="_tax_class"] option, select[name="_visibility"] option, select[name="_stock_status"] option, select[name="_backorders"] option').removeAttr("selected"),e('select[name="_tax_status"] option[value="'+w+'"]',".inline-edit-row").attr("selected","selected"),e('select[name="_tax_class"] option[value="'+k+'"]',".inline-edit-row").attr("selected","selected"),e('select[name="_visibility"] option[value="'+_+'"]',".inline-edit-row").attr("selected","selected"),e('select[name="_stock_status"] option[value="'+m+'"]',".inline-edit-row").attr("selected","selected"),e('select[name="_backorders"] option[value="'+v+'"]',".inline-edit-row").attr("selected","selected"),"yes"===u?e('input[name="_featured"]',".inline-edit-row").attr("checked","checked"):e('input[name="_featured"]',".inline-edit-row").removeAttr("checked");var y=i.find(".product_type").text(),b=i.find(".product_is_virtual").text(),A="external"!==y,q="external"!==y&&"grouped"!==y;e(".stock_fields, .manage_stock_field, .stock_status_field, .backorder_field").show(),q?"yes"===f?(e(".stock_fields").show().removeAttr("style"),e(".stock_status_field").hide(),e(".manage_stock_field input").prop("checked",!0)):(e(".stock_qty_field",".inline-edit-row").hide(),e(".stock_status_field").show().removeAttr("style"),e(".manage_stock_field input").prop("checked",!1)):A?e(".stock_fields, .manage_stock_field, .backorder_field").hide():e(".stock_fields, .manage_stock_field, .stock_status_field, .backorder_field").hide(),"simple"===y||"external"===y?e(".price_fields",".inline-edit-row").show().removeAttr("style"):e(".price_fields",".inline-edit-row").hide(),"yes"===b?e(".dimension_fields",".inline-edit-row").hide():e(".dimension_fields",".inline-edit-row").show().removeAttr("style"),e('input[name="comment_status"]').parent().find(".checkbox-title").text(woocommerce_quick_edit.strings.allow_reviews)}),e("#the-list").on("change",'.inline-edit-row input[name="_manage_stock"]',function(){e(this).is(":checked")?(e(".stock_qty_field",".inline-edit-row").show().removeAttr("style"),e(".stock_status_field").hide()):(e(".stock_qty_field",".inline-edit-row").hide(),e(".stock_status_field").show().removeAttr("style"))}),e("#wpbody").on("click","#doaction, #doaction2",function(){e("input.text",".inline-edit-row").val(""),e("#woocommerce-fields").find("select").prop("selectedIndex",0),e("#woocommerce-fields-bulk").find(".inline-edit-group .change-input").hide()}),e("#wpbody").on("change","#woocommerce-fields-bulk .inline-edit-group .change_to",function(){0'+n+"").css({top:a-16,left:e+20}).appendTo("body").fadeIn(200)}var a=null,n=null;t(".chart-placeholder").bind("plothover",function(i,r,o){if(o){if((a!==o.dataIndex||n!==o.seriesIndex)&&(a=o.dataIndex,n=o.seriesIndex,t(".chart-tooltip").remove(),o.series.points.show||o.series.enable_tooltip)){var s=o.series.data[o.dataIndex][1],l="";o.series.prepend_label&&(l=l+o.series.label+": "),o.series.prepend_tooltip&&(l+=o.series.prepend_tooltip),l+=s,o.series.append_tooltip&&(l+=o.series.append_tooltip),o.series.pie.show?e(r.pageX,r.pageY,l):e(o.pageX,o.pageY,l)}}else t(".chart-tooltip").remove(),a=null}),t(".wc_sparkline.bars").each(function(){var e={grid:{show:!1}},a=[{data:t(this).data("sparkline"),color:t(this).data("color"),bars:{fillColor:t(this).data("color"),fill:!0,show:!0,lineWidth:1,barWidth:t(this).data("barwidth"),align:"center"},shadowSize:0}];t.plot(t(this),a,e)}),t(".wc_sparkline.lines").each(function(){var e={grid:{show:!1}},a=[{data:t(this).data("sparkline"),color:t(this).data("color"),lines:{fill:!1,show:!0,lineWidth:1,align:"center"},shadowSize:0}];t.plot(t(this),a,e)});var i=t(".range_datepicker").datepicker({changeMonth:!0,changeYear:!0,defaultDate:"",dateFormat:"yy-mm-dd",numberOfMonths:1,minDate:"-20Y",maxDate:"+1D",showButtonPanel:!0,showOn:"focus",buttonImageOnly:!0,onSelect:function(){var e=t(this).is(".from")?"minDate":"maxDate",a=t(this).datepicker("getDate");i.not(this).datepicker("option",e,a)}});"undefined"==typeof document.createElement("a").download&&t(".export_csv").hide(),t(".export_csv").click(function(){var e=t(this).data("exclude_series")||"";e=e.toString(),e=e.split(",");var a,n,i,r=t(this).data("xaxes"),o=t(this).data("groupby"),s=t(this).data("index_type"),l="data:text/csv;charset=utf-8,\ufeff";if("table"===t(this).data("export"))t(this).offsetParent().find("thead tr,tbody tr").each(function(){t(this).find("th, td").each(function(){var e=t(this).text();e=e.replace("[?]","").replace("#",""),l+='"'+e+'",'}),l=l.substring(0,l.length-1),l+="\n"}),t(this).offsetParent().find("tfoot tr").each(function(){t(this).find("th, td").each(function(){var e=t(this).text();if(e=e.replace("[?]","").replace("#",""),l+='"'+e+'",',t(this).attr("colspan")>0)for(p=1;p'+a+"").css({top:e-16,left:t+20}).appendTo("body").fadeIn(200)}var o=null,s=null;f(".chart-placeholder").bind("plothover",function(t,e,a){if(a){if((o!==a.dataIndex||s!==a.seriesIndex)&&(o=a.dataIndex,s=a.seriesIndex,f(".chart-tooltip").remove(),a.series.points.show||a.series.enable_tooltip)){var n=a.series.data[a.dataIndex][1],i="";a.series.prepend_label&&(i=i+a.series.label+": "),a.series.prepend_tooltip&&(i+=a.series.prepend_tooltip),i+=n,a.series.append_tooltip&&(i+=a.series.append_tooltip),a.series.pie.show?r(e.pageX,e.pageY,i):r(a.pageX,a.pageY,i)}}else f(".chart-tooltip").remove(),o=null}),f(".wc_sparkline.bars").each(function(){var t=[{data:f(this).data("sparkline"),color:f(this).data("color"),bars:{fillColor:f(this).data("color"),fill:!0,show:!0,lineWidth:1,barWidth:f(this).data("barwidth"),align:"center"},shadowSize:0}];f.plot(f(this),t,{grid:{show:!1}})}),f(".wc_sparkline.lines").each(function(){var t=[{data:f(this).data("sparkline"),color:f(this).data("color"),lines:{fill:!1,show:!0,lineWidth:1,align:"center"},shadowSize:0}];f.plot(f(this),t,{grid:{show:!1}})});var a=f(".range_datepicker").datepicker({changeMonth:!0,changeYear:!0,defaultDate:"",dateFormat:"yy-mm-dd",numberOfMonths:1,minDate:"-20Y",maxDate:"+1D",showButtonPanel:!0,showOn:"focus",buttonImageOnly:!0,onSelect:function(){var t=f(this).is(".from")?"minDate":"maxDate",e=f(this).datepicker("getDate");a.not(this).datepicker("option",t,e)}});"undefined"==typeof document.createElement("a").download&&f(".export_csv").hide(),f(".export_csv").click(function(){var a=f(this).data("exclude_series")||"";a=(a=a.toString()).split(",");var t,e,n,i=f(this).data("xaxes"),r=f(this).data("groupby"),o=f(this).data("index_type"),s=f(this).data("export"),l="data:text/csv;charset=utf-8,\ufeff";if("table"===s)f(this).offsetParent().find("thead tr,tbody tr").each(function(){f(this).find("th, td").each(function(){var t=f(this).text();t=t.replace("[?]","").replace("#",""),l+='"'+t+'",'}),l=l.substring(0,l.length-1),l+="\n"}),f(this).offsetParent().find("tfoot tr").each(function(){f(this).find("th, td").each(function(){var t=f(this).text();if(t=t.replace("[?]","").replace("#",""),l+='"'+t+'",',00?"&":"?")+"action=woocommerce_tax_rates_save_changes",data:{current_class:e.current_class,wc_tax_nonce:e.wc_tax_nonce,changes:t.changes},success:function(e,a){"success"===a&&e.success&&(f.set("rates",e.data.rates),f.trigger("change:rates"),f.changes={},f.trigger("saved:rates"),m.render()),t.unblock()}})}}),g=Backbone.View.extend({rowTemplate:i,per_page:e.limit,page:e.page,initialize:function(){var a=Math.ceil(_.toArray(this.model.get("rates")).length/this.per_page);this.qty_pages=0===a?1:a,this.page=this.sanitizePage(e.page),this.listenTo(this.model,"change:rates",this.setUnloadConfirmation),this.listenTo(this.model,"saved:rates",this.clearUnloadConfirmation),c.on("change autocompletechange",":input",{view:this},this.updateModelOnChange),u.on("keyup search",{view:this},this.onSearchField),l.on("click","a",{view:this},this.onPageChange),l.on("change","input",{view:this},this.onPageChange),t(window).on("beforeunload",{view:this},this.unloadConfirmation),h.on("click",{view:this},this.onSubmit),d.prop("disabled",!0),s.find(".insert").on("click",{view:this},this.onAddNewRow),s.find(".remove_tax_rates").on("click",{view:this},this.onDeleteRow),s.find(".export").on("click",{view:this},this.onExport)},render:function(){var a=this.model.getFilteredRates(),n=_.size(a),i=Math.ceil(n/this.per_page),s=0===n?0:this.per_page*(this.page-1),c=this.per_page*this.page,d=_.toArray(a).slice(s,c),u=this;this.$el.empty(),d.length?t.each(d,function(t,e){u.$el.append(u.rowTemplate(e))}):u.$el.append(r()),this.$el.find("td.country input").autocomplete({source:e.countries,minLength:2}),this.$el.find("td.state input").autocomplete({source:e.states,minLength:3}),this.$el.find("td.postcode input, td.city input").change(function(){t(this).attr("name",t(this).data("name"))}),i>1?l.html(o({qty_rates:n,current_page:this.page,qty_pages:i})):(l.empty(),u.page=1)},updateUrl:function(){if(window.history.replaceState){var t=e.base_url,a=u.val();1i}),_.map(r,function(t){return t.tax_rate_order++,l[t.tax_rate_id]=_.extend(l[t.tax_rate_id]||{},{tax_rate_order:t.tax_rate_order}),t})):(h.tax_rate_order=1+_.max(_.pluck(d,"tax_rate_order"),function(t){return parseInt(t,10)}),o.page=o.qty_pages),d[h.tax_rate_id]=h,l[h.tax_rate_id]=h,s.set("rates",d),s.logChanges(l),o.render()},onDeleteRow:function(a){var n,i,r=a.data.view,o=r.model,s=_.indexBy(o.get("rates"),"tax_rate_id"),d={};a.preventDefault(),(n=c.children(".current"))?(n.each(function(){i=t(this).data("id"),delete s[i],d[i]=_.extend(d[i]||{},{deleted:"deleted"})}),o.set("rates",s),o.logChanges(d),r.render()):window.alert(e.strings.no_rows_selected)},onSearchField:function(t){t.data.view.updateUrl(),t.data.view.render()},onPageChange:function(e){var a=t(e.currentTarget);e.preventDefault(),e.data.view.page=a.data("goto")?a.data("goto"):a.val(),e.data.view.render(),e.data.view.updateUrl()},onExport:function(a){var n="data:application/csv;charset=utf-8,"+e.strings.csv_data_cols.join(",")+"\n";return t.each(a.data.view.model.getFilteredRates(),function(t,a){var i="";i+=a.tax_rate_country+",",i+=a.tax_rate_state+",",i+=(a.postcode?a.postcode.join("; "):"")+",",i+=(a.city?a.city.join("; "):"")+",",i+=a.tax_rate+",",i+=a.tax_rate_name+",",i+=a.tax_rate_priority+",",i+=a.tax_rate_compound+",",i+=a.tax_rate_shipping+",",i+=e.current_class,n+=i+"\n"}),t(this).attr("href",encodeURI(n)),!0},setUnloadConfirmation:function(){this.needsUnloadConfirm=!0,d.prop("disabled",!1)},clearUnloadConfirmation:function(){this.needsUnloadConfirm=!1,d.prop("disabled",!0)},unloadConfirmation:function(t){if(t.data.view.needsUnloadConfirm)return t.returnValue=e.strings.unload_confirmation_msg,window.event.returnValue=e.strings.unload_confirmation_msg,e.strings.unload_confirmation_msg},updateModelOnChange:function(e){var a=e.data.view.model,n=t(e.target),i=n.closest("tr").data("id"),r=n.data("attribute"),o=n.val();"city"!==r&&"postcode"!==r||(o=o.split(";"),o=t.map(o,function(t){return t.trim()})),"tax_rate_compound"!==r&&"tax_rate_shipping"!==r||(o=n.is(":checked")?1:0),a.setRateAttribute(i,r,o)},sanitizePage:function(t){return(t=parseInt(t,10))<1?t=1:t>this.qty_pages&&(t=this.qty_pages),t}}),f=new p({rates:e.rates}),m=new g({model:f,el:"#rates"});m.render()})}(jQuery,htmlSettingsTaxLocalizeScript,wp,ajaxurl);
\ No newline at end of file
+!function(p,g,f,m){p(function(){String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")});var t=f.template("wc-tax-table-row"),s=f.template("wc-tax-table-row-empty"),c=f.template("wc-tax-table-pagination"),e=p(".wc_tax_rates"),u=p("#rates"),a=p(':input[name="save"]'),d=p("#rates-pagination"),n=p("#rates-search .wc-tax-rates-search-field"),i=p(".submit .button-primary[type=submit]"),r=Backbone.Model.extend({changes:{},setRateAttribute:function(t,e,a){var n=_.indexBy(this.get("rates"),"tax_rate_id"),i={};n[t][e]!==a&&(i[t]={},i[t][e]=a,n[t][e]=a),this.logChanges(i)},logChanges:function(t){var a=this.changes||{};_.each(t,function(t,e){a[e]=_.extend(a[e]||{tax_rate_id:e},t)}),this.changes=a,this.trigger("change:rates")},getFilteredRates:function(){var t=this.get("rates"),e=n.val().toLowerCase();return e.length&&(t=_.filter(t,function(t){return-1!==_.toArray(t).join(" ").toLowerCase().indexOf(e)})),t=_.sortBy(t,function(t){return parseInt(t.tax_rate_order,10)})},block:function(){p(".wc_tax_rates").block({message:null,overlayCSS:{background:"#fff",opacity:.6}})},unblock:function(){p(".wc_tax_rates").unblock()},save:function(){var a=this;a.block(),Backbone.ajax({method:"POST",dataType:"json",url:m+(0n}),_.map(i,function(t){return t.tax_rate_order++,c[t.tax_rate_id]=_.extend(c[t.tax_rate_id]||{},{tax_rate_order:t.tax_rate_order}),t})):(l.tax_rate_order=1+_.max(_.pluck(s,"tax_rate_order"),function(t){return parseInt(t,10)}),r.page=r.qty_pages),s[l.tax_rate_id]=l,c[l.tax_rate_id]=l,o.set("rates",s),o.logChanges(c),r.render()},onDeleteRow:function(t){var e,a,n=t.data.view,i=n.model,r=_.indexBy(i.get("rates"),"tax_rate_id"),o={};t.preventDefault(),(e=u.children(".current"))?(e.each(function(){a=p(this).data("id"),delete r[a],o[a]=_.extend(o[a]||{},{deleted:"deleted"})}),i.set("rates",r),i.logChanges(o),n.render()):window.alert(g.strings.no_rows_selected)},onSearchField:function(t){t.data.view.updateUrl(),t.data.view.render()},onPageChange:function(t){var e=p(t.currentTarget);t.preventDefault(),t.data.view.page=e.data("goto")?e.data("goto"):e.val(),t.data.view.render(),t.data.view.updateUrl()},onExport:function(t){var n="data:application/csv;charset=utf-8,"+g.strings.csv_data_cols.join(",")+"\n";return p.each(t.data.view.model.getFilteredRates(),function(t,e){var a="";a+=e.tax_rate_country+",",a+=e.tax_rate_state+",",a+=(e.postcode?e.postcode.join("; "):"")+",",a+=(e.city?e.city.join("; "):"")+",",a+=e.tax_rate+",",a+=e.tax_rate_name+",",a+=e.tax_rate_priority+",",a+=e.tax_rate_compound+",",a+=e.tax_rate_shipping+",",a+=g.current_class,n+=a+"\n"}),p(this).attr("href",encodeURI(n)),!0},setUnloadConfirmation:function(){this.needsUnloadConfirm=!0,a.prop("disabled",!1)},clearUnloadConfirmation:function(){this.needsUnloadConfirm=!1,a.prop("disabled",!0)},unloadConfirmation:function(t){if(t.data.view.needsUnloadConfirm)return t.returnValue=g.strings.unload_confirmation_msg,window.event.returnValue=g.strings.unload_confirmation_msg,g.strings.unload_confirmation_msg},updateModelOnChange:function(t){var e=t.data.view.model,a=p(t.target),n=a.closest("tr").data("id"),i=a.data("attribute"),r=a.val();"city"!==i&&"postcode"!==i||(r=r.split(";"),r=p.map(r,function(t){return t.trim()})),"tax_rate_compound"!==i&&"tax_rate_shipping"!==i||(r=a.is(":checked")?1:0),e.setRateAttribute(n,i,r)},sanitizePage:function(t){return(t=parseInt(t,10))<1?t=1:t>this.qty_pages&&(t=this.qty_pages),t}}),l=new r({rates:g.rates}),h=new o({model:l,el:"#rates"});h.render()})}(jQuery,htmlSettingsTaxLocalizeScript,wp,ajaxurl);
\ No newline at end of file
diff --git a/assets/js/admin/settings.min.js b/assets/js/admin/settings.min.js
index 175ca3663e9..1d37c18b678 100644
--- a/assets/js/admin/settings.min.js
+++ b/assets/js/admin/settings.min.js
@@ -1 +1 @@
-!function(t,e,i){t(function(){t("select#woocommerce_allowed_countries").change(function(){"specific"===t(this).val()?(t(this).closest("tr").next("tr").hide(),t(this).closest("tr").next().next("tr").show()):"all_except"===t(this).val()?(t(this).closest("tr").next("tr").show(),t(this).closest("tr").next().next("tr").hide()):(t(this).closest("tr").next("tr").hide(),t(this).closest("tr").next().next("tr").hide())}).change(),t("select#woocommerce_ship_to_countries").change(function(){"specific"===t(this).val()?t(this).closest("tr").next("tr").show():t(this).closest("tr").next("tr").hide()}).change(),t("input#woocommerce_manage_stock").change(function(){t(this).is(":checked")?t(this).closest("tbody").find(".manage_stock_field").closest("tr").show():t(this).closest("tbody").find(".manage_stock_field").closest("tr").hide()}).change(),t(".colorpick").iris({change:function(e,i){t(this).parent().find(".colorpickpreview").css({backgroundColor:i.color.toString()})},hide:!0,border:!0}).on("click focus",function(e){e.stopPropagation(),t(".iris-picker").hide(),t(this).closest("td").find(".iris-picker").show(),t(this).data("original-value",t(this).val())}).on("change",function(){t(this).is(".iris-error")&&(t(this).data("original-value").match(/^\#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/)?t(this).val(t(this).data("original-value")).change():t(this).val("").change())}),t("body").on("click",function(){t(".iris-picker").hide()}),t(function(){var i=!1;t("input, textarea, select, checkbox").change(function(){i=!0}),t(".woo-nav-tab-wrapper a").click(function(){window.onbeforeunload=i?function(){return e.i18n_nav_warning}:""}),t(".submit :input").click(function(){window.onbeforeunload=""})}),t("table.wc_gateways tbody, table.wc_shipping tbody").sortable({items:"tr",cursor:"move",axis:"y",handle:"td.sort",scrollSensitivity:40,helper:function(e,i){return i.children().each(function(){t(this).width(t(this).width())}),i.css("left","0"),i},start:function(t,e){e.item.css("background-color","#f6f6f6")},stop:function(t,e){e.item.removeAttr("style"),e.item.trigger("updateMoveButtons")}}),t(".woocommerce").on("click",".select_all",function(){return t(this).closest("td").find("select option").attr("selected","selected"),t(this).closest("td").find("select").trigger("change"),!1}),t(".woocommerce").on("click",".select_none",function(){return t(this).closest("td").find("select option").removeAttr("selected"),t(this).closest("td").find("select").trigger("change"),!1}),t(".wc-item-reorder-nav").find(".wc-move-up, .wc-move-down").on("click",function(){var o=t(this),s=o.closest("tr");o.focus();var n=o.is(".wc-move-up"),c=o.is(".wc-move-down");if(n){var r=s.prev("tr");r&&r.length&&(r.before(s),i.a11y.speak(e.i18n_moved_up))}else if(c){var a=s.next("tr");a&&a.length&&(a.after(s),i.a11y.speak(e.i18n_moved_down))}o.focus(),o.closest("table").trigger("updateMoveButtons")}),t(".wc-item-reorder-nav").closest("table").on("updateMoveButtons",function(){var e=t(this),i=t(this).find("tbody tr:last"),o=t(this).find("tbody tr:first");e.find(".wc-item-reorder-nav .wc-move-disabled").removeClass("wc-move-disabled").attr({tabindex:"0","aria-hidden":"false"}),o.find(".wc-item-reorder-nav .wc-move-up").addClass("wc-move-disabled").attr({tabindex:"-1","aria-hidden":"true"}),i.find(".wc-item-reorder-nav .wc-move-down").addClass("wc-move-disabled").attr({tabindex:"-1","aria-hidden":"true"})}),t(".wc-item-reorder-nav").closest("table").trigger("updateMoveButtons")})}(jQuery,woocommerce_settings_params,wp);
\ No newline at end of file
+!function(c,r,a){c(function(){c("select#woocommerce_allowed_countries").change(function(){"specific"===c(this).val()?(c(this).closest("tr").next("tr").hide(),c(this).closest("tr").next().next("tr").show()):("all_except"===c(this).val()?c(this).closest("tr").next("tr").show():c(this).closest("tr").next("tr").hide(),c(this).closest("tr").next().next("tr").hide())}).change(),c("select#woocommerce_ship_to_countries").change(function(){"specific"===c(this).val()?c(this).closest("tr").next("tr").show():c(this).closest("tr").next("tr").hide()}).change(),c("input#woocommerce_manage_stock").change(function(){c(this).is(":checked")?c(this).closest("tbody").find(".manage_stock_field").closest("tr").show():c(this).closest("tbody").find(".manage_stock_field").closest("tr").hide()}).change(),c(".colorpick").iris({change:function(t,e){c(this).parent().find(".colorpickpreview").css({backgroundColor:e.color.toString()})},hide:!0,border:!0}).on("click focus",function(t){t.stopPropagation(),c(".iris-picker").hide(),c(this).closest("td").find(".iris-picker").show(),c(this).data("original-value",c(this).val())}).on("change",function(){c(this).is(".iris-error")&&(c(this).data("original-value").match(/^\#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/)?c(this).val(c(this).data("original-value")).change():c(this).val("").change())}),c("body").on("click",function(){c(".iris-picker").hide()}),c(function(){var t=!1;c("input, textarea, select, checkbox").change(function(){t=!0}),c(".woo-nav-tab-wrapper a").click(function(){window.onbeforeunload=t?function(){return r.i18n_nav_warning}:""}),c(".submit :input").click(function(){window.onbeforeunload=""})}),c("table.wc_gateways tbody, table.wc_shipping tbody").sortable({items:"tr",cursor:"move",axis:"y",handle:"td.sort",scrollSensitivity:40,helper:function(t,e){return e.children().each(function(){c(this).width(c(this).width())}),e.css("left","0"),e},start:function(t,e){e.item.css("background-color","#f6f6f6")},stop:function(t,e){e.item.removeAttr("style"),e.item.trigger("updateMoveButtons")}}),c(".woocommerce").on("click",".select_all",function(){return c(this).closest("td").find("select option").attr("selected","selected"),c(this).closest("td").find("select").trigger("change"),!1}),c(".woocommerce").on("click",".select_none",function(){return c(this).closest("td").find("select option").removeAttr("selected"),c(this).closest("td").find("select").trigger("change"),!1}),c(".wc-item-reorder-nav").find(".wc-move-up, .wc-move-down").on("click",function(){var t=c(this),e=t.closest("tr");t.focus();var i=t.is(".wc-move-up"),o=t.is(".wc-move-down");if(i){var n=e.prev("tr");n&&n.length&&(n.before(e),a.a11y.speak(r.i18n_moved_up))}else if(o){var s=e.next("tr");s&&s.length&&(s.after(e),a.a11y.speak(r.i18n_moved_down))}t.focus(),t.closest("table").trigger("updateMoveButtons")}),c(".wc-item-reorder-nav").closest("table").on("updateMoveButtons",function(){var t=c(this),e=c(this).find("tbody tr:last"),i=c(this).find("tbody tr:first");t.find(".wc-item-reorder-nav .wc-move-disabled").removeClass("wc-move-disabled").attr({tabindex:"0","aria-hidden":"false"}),i.find(".wc-item-reorder-nav .wc-move-up").addClass("wc-move-disabled").attr({tabindex:"-1","aria-hidden":"true"}),e.find(".wc-item-reorder-nav .wc-move-down").addClass("wc-move-disabled").attr({tabindex:"-1","aria-hidden":"true"})}),c(".wc-item-reorder-nav").closest("table").trigger("updateMoveButtons")})}(jQuery,woocommerce_settings_params,wp);
\ No newline at end of file
diff --git a/assets/js/admin/system-status.min.js b/assets/js/admin/system-status.min.js
index 32bdf164f61..d8b7164956a 100644
--- a/assets/js/admin/system-status.min.js
+++ b/assets/js/admin/system-status.min.js
@@ -1 +1 @@
-jQuery(function(t){({init:function(){t(document.body).on("click","a.help_tip, a.woocommerce-help-tip",this.preventTipTipClick).on("click","a.debug-report",this.generateReport).on("click","#copy-for-support",this.copyReport).on("aftercopy","#copy-for-support",this.copySuccess).on("aftercopyfailure","#copy-for-support",this.copyFail)},preventTipTipClick:function(){return!1},generateReport:function(){var e="";t(".wc_status_table thead, .wc_status_table tbody").each(function(){if(t(this).is("thead")){var i=t(this).find("th:eq(0)").data("export-label")||t(this).text();e=e+"\n### "+t.trim(i)+" ###\n\n"}else t("tr",t(this)).each(function(){var i=t(this).find("td:eq(0)").data("export-label")||t(this).find("td:eq(0)").text(),o=t.trim(i).replace(/(<([^>]+)>)/gi,""),n=t(this).find("td:eq(2)").clone();n.find(".private").remove(),n.find(".dashicons-yes").replaceWith("✔"),n.find(".dashicons-no-alt, .dashicons-warning").replaceWith("❌");var r=t.trim(n.text()),a=r.split(", ");if(a.length>1){var c="";t.each(a,function(t,e){c=c+e+"\n"}),r=c}e=e+""+o+": "+r+"\n"})});try{return t("#debug-report").slideDown(),t("#debug-report").find("textarea").val("`"+e+"`").focus().select(),t(this).fadeOut(),!1}catch(i){console.log(i)}return!1},copyReport:function(e){wcClearClipboard(),wcSetClipboard(t("#debug-report").find("textarea").val(),t(this)),e.preventDefault()},copySuccess:function(){t("#copy-for-support").tipTip({attribute:"data-tip",activation:"focus",fadeIn:50,fadeOut:50,delay:0}).focus()},copyFail:function(){t(".copy-error").removeClass("hidden"),t("#debug-report").find("textarea").focus().select()}}).init(),t("#log-viewer-select").on("click","h2 a.page-title-action",function(t){return t.stopImmediatePropagation(),window.confirm(woocommerce_admin_system_status.delete_log_confirmation)})});
\ No newline at end of file
+jQuery(function(c){({init:function(){c(document.body).on("click","a.help_tip, a.woocommerce-help-tip",this.preventTipTipClick).on("click","a.debug-report",this.generateReport).on("click","#copy-for-support",this.copyReport).on("aftercopy","#copy-for-support",this.copySuccess).on("aftercopyfailure","#copy-for-support",this.copyFail)},preventTipTipClick:function(){return!1},generateReport:function(){var a="";c(".wc_status_table thead, .wc_status_table tbody").each(function(){if(c(this).is("thead")){var t=c(this).find("th:eq(0)").data("export-label")||c(this).text();a=a+"\n### "+c.trim(t)+" ###\n\n"}else c("tr",c(this)).each(function(){var t=c(this).find("td:eq(0)").data("export-label")||c(this).find("td:eq(0)").text(),e=c.trim(t).replace(/(<([^>]+)>)/gi,""),i=c(this).find("td:eq(2)").clone();i.find(".private").remove(),i.find(".dashicons-yes").replaceWith("✔"),i.find(".dashicons-no-alt, .dashicons-warning").replaceWith("❌");var o=c.trim(i.text()),n=o.split(", ");if(1'),n=".check-column input"),e(t).find(".column-handle").show(),e.wc_add_missing_sort_handles=function(){var n=e(t).find("tbody > tr"),i=e(t).find("tbody > tr > td.column-handle").parent();n.length!==i.length&&n.each(function(t,n){i.is(n)||e(n).append(' ')}),e(t).find(".column-handle").show()},e(document).ajaxComplete(function(t,n,i){n&&4===n.readyState&&200===n.status&&i.data&&(0<=i.data.indexOf("_inline_edit")||0<=i.data.indexOf("add-tag"))&&(e.wc_add_missing_sort_handles(),e(document.body).trigger("init_tooltips"))}),e(t).sortable({items:"tbody tr:not(.inline-edit-row)",cursor:"move",handle:".column-handle",axis:"y",forcePlaceholderSize:!0,helper:"clone",opacity:.65,placeholder:"product-cat-placeholder",scrollSensitivity:40,start:function(e,t){t.item.hasClass("alternate")||t.item.css("background-color","#ffffff"),t.item.children("td, th").css("border-bottom-width","0"),t.item.css("outline","1px solid #aaa")},stop:function(e,t){t.item.removeAttr("style"),t.item.children("td, th").css("border-bottom-width","1px")},update:function(i,d){var a,o,l=d.item.find(n).val(),c=d.item.find(".parent").html(),r=d.item.prev().find(n).val(),m=d.item.next().find(n).val();r!==undefined&&(a=d.item.prev().find(".parent").html())!==c&&(r=undefined),m!==undefined&&(o=d.item.next().find(".parent").html())!==c&&(m=undefined),r===undefined&&m===undefined||m===undefined&&o===r||m!==undefined&&a===l?e(t).sortable("cancel"):(d.item.find(".check-column input").hide(),d.item.find(".check-column").append(' '),e.post(ajaxurl,{action:"woocommerce_term_ordering",id:l,nextid:m,thetaxonomy:woocommerce_term_ordering_params.taxonomy},function(e){"children"===e?window.location.reload():(d.item.find(".check-column input").show(),d.item.find(".check-column").find("img").remove())}),e("table.widefat tbody tr").each(function(){jQuery("table.widefat tbody tr").index(this)%2==0?jQuery(this).addClass("alternate"):jQuery(this).removeClass("alternate")}))}})});
\ No newline at end of file
+jQuery(function(r){var c="table.wp-list-table",m='.column-handle input[name="term_id"]',i=' ';0===r(c).find(".column-handle").length&&(r(c).find("tr:not(.inline-edit-row)").append(i),m=".check-column input"),r(c).find(".column-handle").show(),r.wc_add_missing_sort_handles=function(){var e=r(c).find("tbody > tr"),n=r(c).find("tbody > tr > td.column-handle").parent();e.length!==n.length&&e.each(function(e,t){n.is(t)||r(t).append(i)}),r(c).find(".column-handle").show()},r(document).ajaxComplete(function(e,t,n){t&&4===t.readyState&&200===t.status&&n.data&&(0<=n.data.indexOf("_inline_edit")||0<=n.data.indexOf("add-tag"))&&(r.wc_add_missing_sort_handles(),r(document.body).trigger("init_tooltips"))}),r(c).sortable({items:"tbody tr:not(.inline-edit-row)",cursor:"move",handle:".column-handle",axis:"y",forcePlaceholderSize:!0,helper:"clone",opacity:.65,placeholder:"product-cat-placeholder",scrollSensitivity:40,start:function(e,t){t.item.hasClass("alternate")||t.item.css("background-color","#ffffff"),t.item.children("td, th").css("border-bottom-width","0"),t.item.css("outline","1px solid #aaa")},stop:function(e,t){t.item.removeAttr("style"),t.item.children("td, th").css("border-bottom-width","1px")},update:function(e,t){var n,i,d=t.item.find(m).val(),a=t.item.find(".parent").html(),o=t.item.prev().find(m).val(),l=t.item.next().find(m).val();o!==undefined&&(n=t.item.prev().find(".parent").html())!==a&&(o=undefined),l!==undefined&&(i=t.item.next().find(".parent").html())!==a&&(l=undefined),o===undefined&&l===undefined||l===undefined&&i===o||l!==undefined&&n===d?r(c).sortable("cancel"):(t.item.find(".check-column input").hide(),t.item.find(".check-column").append(' '),r.post(ajaxurl,{action:"woocommerce_term_ordering",id:d,nextid:l,thetaxonomy:woocommerce_term_ordering_params.taxonomy},function(e){"children"===e?window.location.reload():(t.item.find(".check-column input").show(),t.item.find(".check-column").find("img").remove())}),r("table.widefat tbody tr").each(function(){jQuery("table.widefat tbody tr").index(this)%2==0?jQuery(this).addClass("alternate"):jQuery(this).removeClass("alternate")}))}})});
\ No newline at end of file
diff --git a/assets/js/admin/users.min.js b/assets/js/admin/users.min.js
index c03b105ce34..56cca99d5fd 100644
--- a/assets/js/admin/users.min.js
+++ b/assets/js/admin/users.min.js
@@ -1 +1 @@
-jQuery(function(e){var t={states:null,init:function(){"undefined"!=typeof wc_users_params.countries&&(this.states=e.parseJSON(wc_users_params.countries.replace(/"/g,'"'))),e(".js_field-country").selectWoo().change(this.change_country),e(".js_field-country").trigger("change",[!0]),e(document.body).on("change","select.js_field-state",this.change_state),e(document.body).on("click","button.js_copy-billing",this.copy_billing)},change_country:function(a,n){if(void 0===n&&(n=!1),null!==t.states){var i=e(this),c=i.val(),s=i.parents(".form-table").find(":input.js_field-state"),o=s.parent(),l=s.attr("name"),r=s.attr("id"),u=i.data("woocommerce.stickState-"+c)?i.data("woocommerce.stickState-"+c):s.val();if(n&&i.data("woocommerce.stickState-"+c,u),o.show().find(".select2-container").remove(),e.isEmptyObject(t.states[c]))s.replaceWith(' ');else{var d=e(' '),p=t.states[c];d.append(e(''+wc_users_params.i18n_select_state_text+" ")),e.each(p,function(t){d.append(e(''+p[t]+" "))}),d.val(u),s.replaceWith(d),d.show().selectWoo().hide().change()}e(document.body).trigger("contry-change.woocommerce",[c,e(this).closest("div")]),e(document.body).trigger("country-change.woocommerce",[c,e(this).closest("div")])}},change_state:function(){var t=e(this),a=t.val(),n=t.parents(".form-table").find(":input.js_field-country"),i=n.val();n.data("woocommerce.stickState-"+i,a)},copy_billing:function(t){t.preventDefault(),e("#fieldset-billing").find("input, select").each(function(t,a){var n=a.name.replace(/^billing_/,"shipping_"),i=e('[name="'+n+'"]');i.length&&i.val(a.value).trigger("change")})}};t.init()});
\ No newline at end of file
+jQuery(function(d){var p={states:null,init:function(){"undefined"!=typeof wc_users_params.countries&&(this.states=d.parseJSON(wc_users_params.countries.replace(/"/g,'"'))),d(".js_field-country").selectWoo().change(this.change_country),d(".js_field-country").trigger("change",[!0]),d(document.body).on("change","select.js_field-state",this.change_state),d(document.body).on("click","button.js_copy-billing",this.copy_billing)},change_country:function(e,t){if(void 0===t&&(t=!1),null!==p.states){var a=d(this),n=a.val(),i=a.parents(".form-table").find(":input.js_field-state"),c=i.parent(),s=i.attr("name"),o=i.attr("id"),l=a.data("woocommerce.stickState-"+n)?a.data("woocommerce.stickState-"+n):i.val();if(t&&a.data("woocommerce.stickState-"+n,l),c.show().find(".select2-container").remove(),d.isEmptyObject(p.states[n]))i.replaceWith(' ');else{var r=d(' '),u=p.states[n];r.append(d(''+wc_users_params.i18n_select_state_text+" ")),d.each(u,function(e){r.append(d(''+u[e]+" "))}),r.val(l),i.replaceWith(r),r.show().selectWoo().hide().change()}d(document.body).trigger("contry-change.woocommerce",[n,d(this).closest("div")]),d(document.body).trigger("country-change.woocommerce",[n,d(this).closest("div")])}},change_state:function(){var e=d(this),t=e.val(),a=e.parents(".form-table").find(":input.js_field-country"),n=a.val();a.data("woocommerce.stickState-"+n,t)},copy_billing:function(e){e.preventDefault(),d("#fieldset-billing").find("input, select").each(function(e,t){var a=t.name.replace(/^billing_/,"shipping_"),n=d('[name="'+a+'"]');n.length&&n.val(t.value).trigger("change")})}};p.init()});
\ No newline at end of file
diff --git a/assets/js/admin/wc-enhanced-select.min.js b/assets/js/admin/wc-enhanced-select.min.js
index f38a91814ee..f4ec43e0b6d 100644
--- a/assets/js/admin/wc-enhanced-select.min.js
+++ b/assets/js/admin/wc-enhanced-select.min.js
@@ -1 +1 @@
-jQuery(function(e){function t(){return{language:{errorLoading:function(){return wc_enhanced_select_params.i18n_searching},inputTooLong:function(e){var t=e.input.length-e.maximum;return 1===t?wc_enhanced_select_params.i18n_input_too_long_1:wc_enhanced_select_params.i18n_input_too_long_n.replace("%qty%",t)},inputTooShort:function(e){var t=e.minimum-e.input.length;return 1===t?wc_enhanced_select_params.i18n_input_too_short_1:wc_enhanced_select_params.i18n_input_too_short_n.replace("%qty%",t)},loadingMore:function(){return wc_enhanced_select_params.i18n_load_more},maximumSelected:function(e){return 1===e.maximum?wc_enhanced_select_params.i18n_selection_too_long_1:wc_enhanced_select_params.i18n_selection_too_long_n.replace("%qty%",e.maximum)},noResults:function(){return wc_enhanced_select_params.i18n_no_matches},searching:function(){return wc_enhanced_select_params.i18n_searching}}}}try{e(document.body).on("wc-enhanced-select-init",function(){e(":input.wc-enhanced-select, :input.chosen_select").filter(":not(.enhanced)").each(function(){var n=e.extend({minimumResultsForSearch:10,allowClear:!!e(this).data("allow_clear"),placeholder:e(this).data("placeholder")},t());e(this).selectWoo(n).addClass("enhanced")}),e(":input.wc-enhanced-select-nostd, :input.chosen_select_nostd").filter(":not(.enhanced)").each(function(){var n=e.extend({minimumResultsForSearch:10,allowClear:!0,placeholder:e(this).data("placeholder")},t());e(this).selectWoo(n).addClass("enhanced")}),e(":input.wc-product-search").filter(":not(.enhanced)").each(function(){var n={allowClear:!!e(this).data("allow_clear"),placeholder:e(this).data("placeholder"),minimumInputLength:e(this).data("minimum_input_length")?e(this).data("minimum_input_length"):"3",escapeMarkup:function(e){return e},ajax:{url:wc_enhanced_select_params.ajax_url,dataType:"json",delay:250,data:function(t){return{term:t.term,action:e(this).data("action")||"woocommerce_json_search_products_and_variations",security:wc_enhanced_select_params.search_products_nonce,exclude:e(this).data("exclude"),include:e(this).data("include"),limit:e(this).data("limit"),display_stock:e(this).data("display_stock")}},processResults:function(t){var n=[];return t&&e.each(t,function(e,t){n.push({id:e,text:t})}),{results:n}},cache:!0}};if(n=e.extend(n,t()),e(this).selectWoo(n).addClass("enhanced"),e(this).data("sortable")){var a=e(this),c=e(this).next(".select2-container").find("ul.select2-selection__rendered");c.sortable({placeholder:"ui-state-highlight select2-selection__choice",forcePlaceholderSize:!0,items:"li:not(.select2-search__field)",tolerance:"pointer",stop:function(){e(c.find(".select2-selection__choice").get().reverse()).each(function(){var t=e(this).data("data").id,n=a.find('option[value="'+t+'"]')[0];a.prepend(n)})}})}else e(this).prop("multiple")&&e(this).on("change",function(){var t=e(this).children();t.sort(function(e,t){var n=e.text.toLowerCase(),a=t.text.toLowerCase();return n>a?1:n 0 );
}
updatePluginInfo();
$( '.wc-setup-content' ).on( 'change', '[data-plugins]', updatePluginInfo );
+
+ $( document.body ).on( 'init_tooltips', function() {
+ $( '.help_tip' ).tipTip( {
+ 'attribute': 'data-tip',
+ 'fadeIn': 50,
+ 'fadeOut': 50,
+ 'delay': 200,
+ 'defaultPosition': 'top'
+ } );
+ } ).trigger( 'init_tooltips' );
} );
diff --git a/assets/js/admin/wc-setup.min.js b/assets/js/admin/wc-setup.min.js
index 355de166648..0ad93271518 100644
--- a/assets/js/admin/wc-setup.min.js
+++ b/assets/js/admin/wc-setup.min.js
@@ -1 +1 @@
-jQuery(function(e){function i(){e(".wc-setup-content").block({message:null,overlayCSS:{background:"#fff",opacity:.6}})}function t(){e("form.activate-jetpack").submit()}function s(){wp.ajax.post("setup_wizard_check_jetpack").then(function(e){if(!e||!e.is_active||"yes"===e.is_active)return t();setTimeout(s,3e3)}).fail(function(){t()})}function c(i,t,s){var c=t.data("plugins");for(var n in Array.isArray(c)?c:[]){var a=c[n].slug;i[a]=i[a]||e('').append(''+c[n].name+" "),i[a].find("a").on("mouseenter mouseleave",function(e,i){e.toggleClass("plugin-install-source","mouseenter"===i.type)}.bind(null,s?t.closest(s):t))}}function n(){var i={};e(".wc-wizard-service-enable input:checked").each(function(){c(i,e(this),".wc-wizard-service-item");var t=e(this).closest(".wc-wizard-service-item");t.find("input.payment-checkbox-input:checked").each(function(){c(i,e(this),".wc-wizard-service-settings")}),t.find(".wc-wizard-shipping-method-select .method").each(function(){var t=e(this);"live_rates"===t.val()&&c(i,t,".wc-wizard-service-item")})}),e(".recommended-item input:checked").each(function(){c(i,e(this),".recommended-item")});var t=e("span.plugin-install-info-list").empty();for(var s in i)t.append(i[s]);e("span.plugin-install-info").toggle(t.children().length>0)}e(".button-next").on("click",function(){var t=e(this).parents("form").get(0);return("function"!=typeof t.checkValidity||t.checkValidity())&&i(),!0}),e("#store_country").on("change",function(){if(null!==wc_setup_params.states){var i=e(this).val(),t=e("#store_state");if(e.isEmptyObject(wc_setup_params.states[i]))e(".store-state-container").hide(),t.empty().val("").change().prop("required",!1);else{var s=wc_setup_params.states[i];t.empty(),e.each(s,function(i){t.append(e(''+s[i]+" "))}),e(".store-state-container").show(),t.selectWoo().val(wc_base_state).change().prop("required",!0)}e("#currency_code").val(wc_setup_currencies[i]).change()}}),e("#store_country").change(),e(".wc-wizard-services").on("change",".wc-wizard-service-enable input",function(){e(this).is(":checked")?(e(this).closest(".wc-wizard-service-toggle").removeClass("disabled"),e(this).closest(".wc-wizard-service-item").addClass("checked"),e(this).closest(".wc-wizard-service-item").find(".wc-wizard-service-settings").removeClass("hide")):(e(this).closest(".wc-wizard-service-toggle").addClass("disabled"),e(this).closest(".wc-wizard-service-item").removeClass("checked"),e(this).closest(".wc-wizard-service-item").find(".wc-wizard-service-settings").addClass("hide"))}),e(".wc-wizard-services").on("click",".wc-wizard-service-enable",function(i){if(e(i.target).is("input"))i.stopPropagation();else{var t=e(this).find('input[type="checkbox"]');t.prop("checked",!t.prop("checked")).change()}}),e(".wc-wizard-services-list-toggle").on("click",function(){e(this).closest(".wc-wizard-services-list-toggle").toggleClass("closed"),e(this).closest(".wc-wizard-services").find(".wc-wizard-service-item").slideToggle().css("display","flex")}),e(".wc-wizard-services").on("change",".wc-wizard-shipping-method-select .method",function(i){var t=e(this).closest(".wc-wizard-service-description"),s=i.target.value,c=t.find(".shipping-method-descriptions");c.find(".shipping-method-description").addClass("hide"),c.find("."+s).removeClass("hide");var n=t.find(".shipping-method-settings");n.find(".shipping-method-setting").addClass("hide").find(".shipping-method-required-field").prop("required",!1),n.find("."+s).removeClass("hide").find(".shipping-method-required-field").prop("required",!0)}).find(".wc-wizard-shipping-method-select .method").change(),e(".wc-wizard-services").on("change",".wc-wizard-shipping-method-enable",function(){var i=e(this).is(":checked"),t=e(".wc-wizard-shipping-method-select .method").val();e(this).closest(".wc-wizard-service-item").find("."+t).find(".shipping-method-required-field").prop("required",i)}),e(".activate-jetpack").on("click",".button-primary",function(e){if(i(),"no"===wc_setup_params.pending_jetpack_install)return!0;e.preventDefault(),s()}),e(".wc-wizard-services").on("change","input#stripe_create_account, input#ppec_paypal_reroute_requests",function(){e(this).is(":checked")?(e(this).closest(".wc-wizard-service-settings").find("input.payment-email-input").prop("required",!0),e(this).closest(".wc-wizard-service-settings").find(".wc-wizard-service-setting-stripe_email, .wc-wizard-service-setting-ppec_paypal_email").show()):(e(this).closest(".wc-wizard-service-settings").find("input.payment-email-input").prop("required",!1),e(this).closest(".wc-wizard-service-settings").find(".wc-wizard-service-setting-stripe_email, .wc-wizard-service-setting-ppec_paypal_email").hide())}).find("input#stripe_create_account, input#ppec_paypal_reroute_requests").change(),n(),e(".wc-setup-content").on("change","[data-plugins]",n)});
\ No newline at end of file
+jQuery(function(a){function i(){a(".wc-setup-content").block({message:null,overlayCSS:{background:"#fff",opacity:.6}})}function t(){a("form.activate-jetpack").submit()}function s(){wp.ajax.post("setup_wizard_check_jetpack").then(function(e){if(!e||!e.is_active||"yes"===e.is_active)return t();setTimeout(s,3e3)}).fail(function(){t()})}function n(e,i,t){var s=i.data("plugins");for(var n in Array.isArray(s)?s:[]){var c=s[n].slug;e[c]=e[c]||a('').append(''+s[n].name+" "),e[c].find("a").on("mouseenter mouseleave",function(e,i){e.toggleClass("plugin-install-source","mouseenter"===i.type)}.bind(null,t?i.closest(t):i))}}function e(){var i={},t=[];a(".wc-wizard-service-enable input:checked").each(function(){n(i,a(this),".wc-wizard-service-item");var e=a(this).closest(".wc-wizard-service-item");e.find("input.payment-checkbox-input:checked").each(function(){t.push(a(this).attr("id")),n(i,a(this),".wc-wizard-service-settings")}),e.find(".wc-wizard-shipping-method-select .method").each(function(){var e=a(this);"live_rates"===e.val()&&n(i,e,".wc-wizard-service-item")})}),a(".recommended-item input:checked").each(function(){n(i,a(this),".recommended-item")});var e=a("span.plugin-install-info-list").empty();for(var s in i)e.append(i[s]);t&&wc_setup_params.current_step&&wc_setup_params.i18n.extra_plugins[wc_setup_params.current_step]&&wc_setup_params.i18n.extra_plugins[wc_setup_params.current_step][t.join(",")]&&e.append(wc_setup_params.i18n.extra_plugins[wc_setup_params.current_step][t.join(",")]),a("span.plugin-install-info").toggle(0'+t[e]+""))}),a(".store-state-container").show(),i.selectWoo().val(wc_base_state).change().prop("required",!0)}a("#currency_code").val(wc_setup_currencies[e]).change()}}),a("#store_country").change(),a(".wc-wizard-services").on("change",".wc-wizard-service-enable input",function(){a(this).is(":checked")?(a(this).closest(".wc-wizard-service-toggle").removeClass("disabled"),a(this).closest(".wc-wizard-service-item").addClass("checked"),a(this).closest(".wc-wizard-service-item").find(".wc-wizard-service-settings").removeClass("hide")):(a(this).closest(".wc-wizard-service-toggle").addClass("disabled"),a(this).closest(".wc-wizard-service-item").removeClass("checked"),a(this).closest(".wc-wizard-service-item").find(".wc-wizard-service-settings").addClass("hide"))}),a(".wc-wizard-services").on("click",".wc-wizard-service-enable",function(e){if(a(e.target).is("input"))e.stopPropagation();else{var i=a(this).find('input[type="checkbox"]');i.prop("checked",!i.prop("checked")).change()}}),a(".wc-wizard-services-list-toggle").on("click",function(){a(this).closest(".wc-wizard-services-list-toggle").toggleClass("closed"),a(this).closest(".wc-wizard-services").find(".wc-wizard-service-item").slideToggle().css("display","flex")}),a(".wc-wizard-services").on("change",".wc-wizard-shipping-method-select .method",function(e){var i=a(this).closest(".wc-wizard-service-description"),t=e.target.value,s=i.find(".shipping-method-descriptions");s.find(".shipping-method-description").addClass("hide"),s.find("."+t).removeClass("hide");var n=i.find(".shipping-method-settings");n.find(".shipping-method-setting").addClass("hide").find(".shipping-method-required-field").prop("required",!1),n.find("."+t).removeClass("hide").find(".shipping-method-required-field").prop("required",!0)}).find(".wc-wizard-shipping-method-select .method").change(),a(".wc-wizard-services").on("change",".wc-wizard-shipping-method-enable",function(){var e=a(this).is(":checked"),i=a(".wc-wizard-shipping-method-select .method").val();a(this).closest(".wc-wizard-service-item").find("."+i).find(".shipping-method-required-field").prop("required",e)}),a(".activate-jetpack").on("click",".button-primary",function(e){if(i(),"no"===wc_setup_params.pending_jetpack_install)return!0;e.preventDefault(),s()}),a(".wc-wizard-services").on("change","input#stripe_create_account, input#ppec_paypal_reroute_requests",function(){a(this).is(":checked")?a(this).closest(".wc-wizard-service-settings").find("input.payment-email-input").attr("type","email").prop("disabled",!1).prop("required",!0):a(this).closest(".wc-wizard-service-settings").find("input.payment-email-input").attr("type",null).prop("disabled",!0).prop("required",!1)}).find("input#stripe_create_account, input#ppec_paypal_reroute_requests").change(),e(),a(".wc-setup-content").on("change","[data-plugins]",e),a(document.body).on("init_tooltips",function(){a(".help_tip").tipTip({attribute:"data-tip",fadeIn:50,fadeOut:50,delay:200,defaultPosition:"top"})}).trigger("init_tooltips")});
\ No newline at end of file
diff --git a/assets/js/admin/wc-shipping-classes.min.js b/assets/js/admin/wc-shipping-classes.min.js
index eac04c01c09..bbc759cb975 100644
--- a/assets/js/admin/wc-shipping-classes.min.js
+++ b/assets/js/admin/wc-shipping-classes.min.js
@@ -1 +1 @@
-!function(e,i,s,n){e(function(){var t=e(".wc-shipping-class-rows"),a=e(".wc-shipping-class-save"),o=s.template("wc-shipping-class-row"),d=s.template("wc-shipping-class-row-blank"),c=Backbone.Model.extend({changes:{},logChanges:function(e){var i=this.changes||{};_.each(e,function(e,s){i[s]=_.extend(i[s]||{term_id:s},e)}),this.changes=i,this.trigger("change:classes")},save:function(){_.size(this.changes)?e.post(n+(n.indexOf("?")>0?"&":"?")+"action=woocommerce_shipping_classes_save_changes",{wc_shipping_classes_nonce:i.wc_shipping_classes_nonce,changes:this.changes},this.onSaveResponse,"json"):r.trigger("saved:classes")},discardChanges:function(e){delete(this.changes||{})[e],0===_.size(this.changes)&&h.clearUnloadConfirmation()},onSaveResponse:function(e,s){"success"===s&&(e.success?(r.set("classes",e.data.shipping_classes),r.trigger("change:classes"),r.changes={},r.trigger("saved:classes")):e.data?window.alert(e.data):window.alert(i.strings.save_failed)),h.unblock()}}),l=Backbone.View.extend({rowTemplate:o,initialize:function(){this.listenTo(this.model,"change:classes",this.setUnloadConfirmation),this.listenTo(this.model,"saved:classes",this.clearUnloadConfirmation),this.listenTo(this.model,"saved:classes",this.render),t.on("change",{view:this},this.updateModelOnChange),e(window).on("beforeunload",{view:this},this.unloadConfirmation),a.on("click",{view:this},this.onSubmit),e(document.body).on("click",".wc-shipping-class-add",{view:this},this.onAddNewRow),e(document.body).on("click",".wc-shipping-class-save-changes",{view:this},this.onSubmit)},block:function(){e(this.el).block({message:null,overlayCSS:{background:"#fff",opacity:.6}})},unblock:function(){e(this.el).unblock()},render:function(){var i=_.indexBy(this.model.get("classes"),"term_id"),s=this;this.$el.empty(),this.unblock(),_.size(i)?(i=_.sortBy(i,function(e){return e.name}),e.each(i,function(e,i){s.renderRow(i)})):s.$el.append(d)},renderRow:function(e){var i=this;i.$el.append(i.rowTemplate(e)),i.initRow(e)},initRow:function(i){var s=this.$el.find('tr[data-id="'+i.term_id+'"]');s.find("select").each(function(){var s=e(this).data("attribute");e(this).find('option[value="'+i[s]+'"]').prop("selected",!0)}),s.find(".view").show(),s.find(".edit").hide(),s.find(".wc-shipping-class-edit").on("click",{view:this},this.onEditRow),s.find(".wc-shipping-class-delete").on("click",{view:this},this.onDeleteRow),s.find(".editing .wc-shipping-class-edit").trigger("click"),s.find(".wc-shipping-class-cancel-edit").on("click",{view:this},this.onCancelEditRow),!0===i.editing&&(s.addClass("editing"),s.find(".wc-shipping-class-edit").trigger("click"))},onSubmit:function(e){e.data.view.block(),e.data.view.model.save(),e.preventDefault()},onAddNewRow:function(s){s.preventDefault();var n=s.data.view,t=n.model,a=_.indexBy(t.get("classes"),"term_id"),o={},d=_.size(a),c=_.extend({},i.default_shipping_class,{term_id:"new-"+d+"-"+Date.now(),editing:!0,newRow:!0});o[c.term_id]=c,t.logChanges(o),n.renderRow(c),e(".wc-shipping-classes-blank-state").remove()},onEditRow:function(i){i.preventDefault(),e(this).closest("tr").addClass("editing"),e(this).closest("tr").find(".view").hide(),e(this).closest("tr").find(".edit").show(),i.data.view.model.trigger("change:classes")},onDeleteRow:function(i){var s=i.data.view,n=s.model,t=_.indexBy(n.get("classes"),"term_id"),a={},o=e(this).closest("tr").data("id");i.preventDefault(),t[o]&&(delete t[o],a[o]=_.extend(a[o]||{},{deleted:"deleted"}),n.set("classes",t),n.logChanges(a)),s.render()},onCancelEditRow:function(i){var s=i.data.view,n=s.model,t=e(this).closest("tr"),a=e(this).closest("tr").data("id"),o=_.indexBy(n.get("classes"),"term_id");i.preventDefault(),n.discardChanges(a),o[a]&&(o[a].editing=!1,t.after(s.rowTemplate(o[a])),s.initRow(o[a])),t.remove()},setUnloadConfirmation:function(){this.needsUnloadConfirm=!0,a.removeAttr("disabled")},clearUnloadConfirmation:function(){this.needsUnloadConfirm=!1,a.attr("disabled","disabled")},unloadConfirmation:function(e){if(e.data.view.needsUnloadConfirm)return e.returnValue=i.strings.unload_confirmation_msg,window.event.returnValue=i.strings.unload_confirmation_msg,i.strings.unload_confirmation_msg},updateModelOnChange:function(i){var s=i.data.view.model,n=e(i.target),t=n.closest("tr").data("id"),a=n.data("attribute"),o=n.val(),d=_.indexBy(s.get("classes"),"term_id"),c={};d[t]&&d[t][a]===o||(c[t]={},c[t][a]=o),s.logChanges(c)}}),r=new c({classes:i.classes}),h=new l({model:r,el:t});h.render()})}(jQuery,shippingClassesLocalizeScript,wp,ajaxurl);
\ No newline at end of file
+!function(c,l,r,h){c(function(){var e=c(".wc-shipping-class-rows"),i=c(".wc-shipping-class-save"),s=r.template("wc-shipping-class-row"),n=r.template("wc-shipping-class-row-blank"),t=Backbone.Model.extend({changes:{},logChanges:function(e){var s=this.changes||{};_.each(e,function(e,i){s[i]=_.extend(s[i]||{term_id:i},e)}),this.changes=s,this.trigger("change:classes")},save:function(){_.size(this.changes)?c.post(h+(00?"&":"?")+"action=woocommerce_shipping_zone_methods_save_changes",{wc_shipping_zones_nonce:n.wc_shipping_zones_nonce,changes:this.changes,zone_id:n.zone_id},this.onSaveResponse,"json")},onSaveResponse:function(e,t){"success"===t&&(e.success?(e.data.zone_id!==n.zone_id&&(n.zone_id=e.data.zone_id,window.history.pushState&&window.history.pushState({},"","admin.php?page=wc-settings&tab=shipping&zone_id="+e.data.zone_id)),p.set("methods",e.data.methods),p.trigger("change:methods"),p.changes={},p.trigger("saved:methods")):window.alert(n.strings.save_failed))}}),r=Backbone.View.extend({rowTemplate:a,initialize:function(){this.listenTo(this.model,"change:methods",this.setUnloadConfirmation),this.listenTo(this.model,"saved:methods",this.clearUnloadConfirmation),this.listenTo(this.model,"saved:methods",this.render),s.on("change",{view:this},this.updateModelOnChange),s.on("sortupdate",{view:this},this.updateModelOnSort),e(window).on("beforeunload",{view:this},this.unloadConfirmation),d.on("click",{view:this},this.onSubmit),e(document.body).on("input change","#zone_name, #zone_locations, #zone_postcodes",{view:this},this.onUpdateZone),e(document.body).on("click",".wc-shipping-zone-method-settings",{view:this},this.onConfigureShippingMethod),e(document.body).on("click",".wc-shipping-zone-add-method",{view:this},this.onAddShippingMethod),e(document.body).on("wc_backbone_modal_response",this.onConfigureShippingMethodSubmitted),e(document.body).on("wc_backbone_modal_response",this.onAddShippingMethodSubmitted),e(document.body).on("change",".wc-shipping-zone-method-selector select",this.onChangeShippingMethodSelector),e(document.body).on("click",".wc-shipping-zone-postcodes-toggle",this.onTogglePostcodes)},onUpdateZone:function(n){var t=n.data.view,o=t.model,i=e(this).val(),s=e(n.target).data("attribute"),d={};n.preventDefault(),d[s]=i,o.set(s,i),o.logChanges(d),t.render()},block:function(){e(this.el).block({message:null,overlayCSS:{background:"#fff",opacity:.6}})},unblock:function(){e(this.el).unblock()},render:function(){var t=_.indexBy(this.model.get("methods"),"instance_id"),o=this.model.get("zone_name"),i=this;e(".wc-shipping-zone-name").text(o||n.strings.default_zone_name),this.$el.empty(),this.unblock(),_.size(t)?(t=_.sortBy(t,function(e){return parseInt(e.method_order,10)}),e.each(t,function(e,t){"yes"===t.enabled?t.enabled_icon=''+n.strings.yes+" ":t.enabled_icon=''+n.strings.no+" ",i.$el.append(i.rowTemplate(t));var o=i.$el.find('tr[data-id="'+t.instance_id+'"]');if(!t.has_settings){o.find(".wc-shipping-zone-method-title > a").replaceWith(""+o.find(".wc-shipping-zone-method-title > a").text()+" ");var s=o.find(".wc-shipping-zone-method-delete");o.find(".wc-shipping-zone-method-title .row-actions").empty().html(s)}}),this.$el.find(".wc-shipping-zone-method-delete").on("click",{view:this},this.onDeleteRow),this.$el.find(".wc-shipping-zone-method-enabled a").on("click",{view:this},this.onToggleEnabled)):i.$el.append(h),this.initTooltips()},initTooltips:function(){e("#tiptip_holder").removeAttr("style"),e("#tiptip_arrow").removeAttr("style"),e(".tips").tipTip({attribute:"data-tip",fadeIn:50,fadeOut:50,delay:50})},onSubmit:function(e){e.data.view.block(),e.data.view.model.save(),e.preventDefault()},onDeleteRow:function(n){var t=n.data.view,o=t.model,i=_.indexBy(o.get("methods"),"instance_id"),s={},d=e(this).closest("tr").data("id");n.preventDefault(),delete i[d],s.methods=s.methods||{methods:{}},s.methods[d]=_.extend(s.methods[d]||{},{deleted:"deleted"}),o.set("methods",i),o.logChanges(s),t.render()},onToggleEnabled:function(n){var t=n.data.view,o=e(n.target),i=t.model,s=_.indexBy(i.get("methods"),"instance_id"),d=o.closest("tr").data("id"),a="yes"===o.closest("tr").data("enabled")?"no":"yes",h={};n.preventDefault(),s[d].enabled=a,h.methods=h.methods||{methods:{}},h.methods[d]=_.extend(h.methods[d]||{},{enabled:a}),i.set("methods",s),i.logChanges(h),t.render()},setUnloadConfirmation:function(){this.needsUnloadConfirm=!0,d.removeAttr("disabled")},clearUnloadConfirmation:function(){this.needsUnloadConfirm=!1,d.attr("disabled","disabled")},unloadConfirmation:function(e){if(e.data.view.needsUnloadConfirm)return e.returnValue=n.strings.unload_confirmation_msg,window.event.returnValue=n.strings.unload_confirmation_msg,n.strings.unload_confirmation_msg},updateModelOnChange:function(n){var t=n.data.view.model,o=e(n.target),i=o.closest("tr").data("id"),s=o.data("attribute"),d=o.val(),a=_.indexBy(t.get("methods"),"instance_id"),h={};a[i][s]!==d&&(h.methods[i]={},h.methods[i][s]=d,a[i][s]=d),t.logChanges(h)},updateModelOnSort:function(e){var n=e.data.view.model,t=_.indexBy(n.get("methods"),"instance_id"),o={};_.each(t,function(e){var n=parseInt(e.method_order,10),s=parseInt(i.find('tr[data-id="'+e.instance_id+'"]').index()+1,10);n!==s&&(t[e.instance_id].method_order=s,o.methods=o.methods||{methods:{}},o.methods[e.instance_id]=_.extend(o.methods[e.instance_id]||{},{method_order:s}))}),_.size(o)&&n.logChanges(o)},onConfigureShippingMethod:function(n){var t=e(this).closest("tr").data("id"),o=n.data.view.model,i=_.indexBy(o.get("methods"),"instance_id")[t];if(!i.settings_html)return!0;n.preventDefault(),e(this).WCBackboneModal({template:"wc-modal-shipping-method-settings",variable:{instance_id:t,method:i},data:{instance_id:t,method:i}}),e(document.body).trigger("init_tooltips")},onConfigureShippingMethodSubmitted:function(t,i,s){"wc-modal-shipping-method-settings"===i&&(l.block(),e.post(o+(o.indexOf("?")>0?"&":"?")+"action=woocommerce_shipping_zone_methods_save_settings",{wc_shipping_zones_nonce:n.wc_shipping_zones_nonce,instance_id:s.instance_id,data:s},function(t,o){"success"===o&&t.success?(e("table.wc-shipping-zone-methods").parent().find("#woocommerce_errors").remove(),t.data.errors.length>0&&l.showErrors(t.data.errors),_.size(l.model.changes)?l.model.save():l.model.onSaveResponse(t,o)):(window.alert(n.strings.save_failed),l.unblock())},"json"))},showErrors:function(n){var t='';e(n).each(function(e,n){t=t+"
"+n+"
"}),t+="
",e("table.wc-shipping-zone-methods").before(t)},onAddShippingMethod:function(t){t.preventDefault(),e(this).WCBackboneModal({template:"wc-modal-add-shipping-method",variable:{zone_id:n.zone_id}}),e(".wc-shipping-zone-method-selector select").change()},onAddShippingMethodSubmitted:function(t,i,s){"wc-modal-add-shipping-method"===i&&(l.block(),e.post(o+(o.indexOf("?")>0?"&":"?")+"action=woocommerce_shipping_zone_add_method",{wc_shipping_zones_nonce:n.wc_shipping_zones_nonce,method_id:s.add_method_id,zone_id:n.zone_id},function(e,t){"success"===t&&e.success&&(e.data.zone_id!==n.zone_id&&(n.zone_id=e.data.zone_id,window.history.pushState&&window.history.pushState({},"","admin.php?page=wc-settings&tab=shipping&zone_id="+e.data.zone_id)),_.size(l.model.changes)?l.model.save():(l.model.set("methods",e.data.methods),l.model.trigger("change:methods"),l.model.changes={},l.model.trigger("saved:methods"))),l.unblock()},"json"))},onChangeShippingMethodSelector:function(){var n=e(this).find("option:selected").data("description");e(this).parent().find(".wc-shipping-zone-method-description").remove(),e(this).after(''+n+"
"),e(this).closest("article").height(e(this).parent().height())},onTogglePostcodes:function(n){n.preventDefault();var t=e(this).closest("tr");t.find(".wc-shipping-zone-postcodes").show(),t.find(".wc-shipping-zone-postcodes-toggle").hide()}}),p=new c({methods:n.methods,zone_name:n.zone_name}),l=new r({model:p,el:s});l.render(),s.sortable({items:"tr",cursor:"move",axis:"y",handle:"td.wc-shipping-zone-method-sort",scrollSensitivity:40})})}(jQuery,shippingZoneMethodsLocalizeScript,wp,ajaxurl);
\ No newline at end of file
+!function(c,r,p,l){c(function(){var s=c(".wc-shipping-zone-methods"),e=c(".wc-shipping-zone-method-rows"),n=c(".wc-shipping-zone-method-save"),t=p.template("wc-shipping-zone-method-row"),o=p.template("wc-shipping-zone-method-row-blank"),i=Backbone.Model.extend({changes:{},logChanges:function(e){var t=this.changes||{};_.each(e.methods,function(e,n){t.methods=t.methods||{methods:{}},t.methods[n]=_.extend(t.methods[n]||{instance_id:n},e)}),"undefined"!=typeof e.zone_name&&(t.zone_name=e.zone_name),"undefined"!=typeof e.zone_locations&&(t.zone_locations=e.zone_locations),"undefined"!=typeof e.zone_postcodes&&(t.zone_postcodes=e.zone_postcodes),this.changes=t,this.trigger("change:methods")},save:function(){c.post(l+(0'+r.strings.yes+" ":n.enabled_icon=''+r.strings.no+" ",i.$el.append(i.rowTemplate(n));var t=i.$el.find('tr[data-id="'+n.instance_id+'"]');if(!n.has_settings){t.find(".wc-shipping-zone-method-title > a").replaceWith(""+t.find(".wc-shipping-zone-method-title > a").text()+" ");var o=t.find(".wc-shipping-zone-method-delete");t.find(".wc-shipping-zone-method-title .row-actions").empty().html(o)}}),this.$el.find(".wc-shipping-zone-method-delete").on("click",{view:this},this.onDeleteRow),this.$el.find(".wc-shipping-zone-method-enabled a").on("click",{view:this},this.onToggleEnabled)):i.$el.append(o),this.initTooltips()},initTooltips:function(){c("#tiptip_holder").removeAttr("style"),c("#tiptip_arrow").removeAttr("style"),c(".tips").tipTip({attribute:"data-tip",fadeIn:50,fadeOut:50,delay:50})},onSubmit:function(e){e.data.view.block(),e.data.view.model.save(),e.preventDefault()},onDeleteRow:function(e){var n=e.data.view,t=n.model,o=_.indexBy(t.get("methods"),"instance_id"),i={},s=c(this).closest("tr").data("id");e.preventDefault(),delete o[s],i.methods=i.methods||{methods:{}},i.methods[s]=_.extend(i.methods[s]||{},{deleted:"deleted"}),t.set("methods",o),t.logChanges(i),n.render()},onToggleEnabled:function(e){var n=e.data.view,t=c(e.target),o=n.model,i=_.indexBy(o.get("methods"),"instance_id"),s=t.closest("tr").data("id"),d="yes"===t.closest("tr").data("enabled")?"no":"yes",a={};e.preventDefault(),i[s].enabled=d,a.methods=a.methods||{methods:{}},a.methods[s]=_.extend(a.methods[s]||{},{enabled:d}),o.set("methods",i),o.logChanges(a),n.render()},setUnloadConfirmation:function(){this.needsUnloadConfirm=!0,n.removeAttr("disabled")},clearUnloadConfirmation:function(){this.needsUnloadConfirm=!1,n.attr("disabled","disabled")},unloadConfirmation:function(e){if(e.data.view.needsUnloadConfirm)return e.returnValue=r.strings.unload_confirmation_msg,window.event.returnValue=r.strings.unload_confirmation_msg,r.strings.unload_confirmation_msg},updateModelOnChange:function(e){var n=e.data.view.model,t=c(e.target),o=t.closest("tr").data("id"),i=t.data("attribute"),s=t.val(),d=_.indexBy(n.get("methods"),"instance_id"),a={};d[o][i]!==s&&(a.methods[o]={},a.methods[o][i]=s,d[o][i]=s),n.logChanges(a)},updateModelOnSort:function(e){var n=e.data.view.model,o=_.indexBy(n.get("methods"),"instance_id"),i={};_.each(o,function(e){var n=parseInt(e.method_order,10),t=parseInt(s.find('tr[data-id="'+e.instance_id+'"]').index()+1,10);n!==t&&(o[e.instance_id].method_order=t,i.methods=i.methods||{methods:{}},i.methods[e.instance_id]=_.extend(i.methods[e.instance_id]||{},{method_order:t}))}),_.size(i)&&n.logChanges(i)},onConfigureShippingMethod:function(e){var n=c(this).closest("tr").data("id"),t=e.data.view.model,o=_.indexBy(t.get("methods"),"instance_id")[n];if(!o.settings_html)return!0;e.preventDefault(),c(this).WCBackboneModal({template:"wc-modal-shipping-method-settings",variable:{instance_id:n,method:o},data:{instance_id:n,method:o}}),c(document.body).trigger("init_tooltips")},onConfigureShippingMethodSubmitted:function(e,n,t){"wc-modal-shipping-method-settings"===n&&(h.block(),c.post(l+(0"+n+""}),t+="",c("table.wc-shipping-zone-methods").before(t)},onAddShippingMethod:function(e){e.preventDefault(),c(this).WCBackboneModal({template:"wc-modal-add-shipping-method",variable:{zone_id:r.zone_id}}),c(".wc-shipping-zone-method-selector select").change()},onAddShippingMethodSubmitted:function(e,n,t){"wc-modal-add-shipping-method"===n&&(h.block(),c.post(l+(0'+e+""),c(this).closest("article").height(c(this).parent().height())},onTogglePostcodes:function(e){e.preventDefault();var n=c(this).closest("tr");n.find(".wc-shipping-zone-postcodes").show(),n.find(".wc-shipping-zone-postcodes-toggle").hide()}}),a=new i({methods:r.methods,zone_name:r.zone_name}),h=new d({model:a,el:e});h.render(),e.sortable({items:"tr",cursor:"move",axis:"y",handle:"td.wc-shipping-zone-method-sort",scrollSensitivity:40})})}(jQuery,shippingZoneMethodsLocalizeScript,wp,ajaxurl);
\ No newline at end of file
diff --git a/assets/js/admin/wc-shipping-zones.min.js b/assets/js/admin/wc-shipping-zones.min.js
index fbfdae5cc11..e402698606b 100644
--- a/assets/js/admin/wc-shipping-zones.min.js
+++ b/assets/js/admin/wc-shipping-zones.min.js
@@ -1 +1 @@
-!function(e,n,i,o){e(function(){var t=e(".wc-shipping-zones"),s=e(".wc-shipping-zone-rows"),d=e(".wc-shipping-zone-save"),a=i.template("wc-shipping-zone-row"),r=i.template("wc-shipping-zone-row-blank"),l=Backbone.Model.extend({changes:{},logChanges:function(e){var n=this.changes||{};_.each(e,function(e,i){n[i]=_.extend(n[i]||{zone_id:i},e)}),this.changes=n,this.trigger("change:zones")},discardChanges:function(e){var n=this.changes||{},i=null,o=_.indexBy(this.get("zones"),"zone_id");n[e]&&n[e].zone_order!==undefined&&(i=n[e].zone_order),delete n[e],null!==i&&o[e]&&o[e].zone_order!==i&&(n[e]=_.extend(n[e]||{},{zone_id:e,zone_order:i})),this.changes=n,0===_.size(this.changes)&&p.clearUnloadConfirmation()},save:function(){_.size(this.changes)?e.post(o+(o.indexOf("?")>0?"&":"?")+"action=woocommerce_shipping_zones_save_changes",{wc_shipping_zones_nonce:n.wc_shipping_zones_nonce,changes:this.changes},this.onSaveResponse,"json"):h.trigger("saved:zones")},onSaveResponse:function(e,i){"success"===i&&(e.success?(h.set("zones",e.data.zones),h.trigger("change:zones"),h.changes={},h.trigger("saved:zones")):window.alert(n.strings.save_failed))}}),c=Backbone.View.extend({rowTemplate:a,initialize:function(){this.listenTo(this.model,"change:zones",this.setUnloadConfirmation),this.listenTo(this.model,"saved:zones",this.clearUnloadConfirmation),this.listenTo(this.model,"saved:zones",this.render),s.on("change",{view:this},this.updateModelOnChange),s.on("sortupdate",{view:this},this.updateModelOnSort),e(window).on("beforeunload",{view:this},this.unloadConfirmation),e(document.body).on("click",".wc-shipping-zone-add",{view:this},this.onAddNewRow)},block:function(){e(this.el).block({message:null,overlayCSS:{background:"#fff",opacity:.6}})},unblock:function(){e(this.el).unblock()},render:function(){var n=_.indexBy(this.model.get("zones"),"zone_id"),i=this;i.$el.empty(),i.unblock(),_.size(n)?(n=_(n).chain().sortBy(function(e){return parseInt(e.zone_id,10)}).sortBy(function(e){return parseInt(e.zone_order,10)}).value(),e.each(n,function(e,n){i.renderRow(n)})):i.$el.append(r),i.initRows()},renderRow:function(e){var n=this;n.$el.append(n.rowTemplate(e)),n.initRow(e)},initRow:function(e){var n=this,i=n.$el.find('tr[data-id="'+e.zone_id+'"]');n.renderShippingMethods(e.zone_id,e.shipping_methods),i.find(".wc-shipping-zone-delete").on("click",{view:this},this.onDeleteRow)},initRows:function(){0==e("tbody.wc-shipping-zone-rows tr").length%2?t.find("tbody.wc-shipping-zone-rows").next("tbody").find("tr").addClass("odd"):t.find("tbody.wc-shipping-zone-rows").next("tbody").find("tr").removeClass("odd"),e("#tiptip_holder").removeAttr("style"),e("#tiptip_arrow").removeAttr("style"),e(".tips").tipTip({attribute:"data-tip",fadeIn:50,fadeOut:50,delay:50})},renderShippingMethods:function(i,o){var t=e('.wc-shipping-zones tr[data-id="'+i+'"]').find(".wc-shipping-zone-methods ul");t.find(".wc-shipping-zone-method").remove(),_.size(o)?(o=_.sortBy(o,function(e){return parseInt(e.method_order,10)}),_.each(o,function(e){var n="method_disabled";"yes"===e.enabled&&(n="method_enabled"),t.append(''+e.title+" ")})):t.append(''+n.strings.no_shipping_methods_offered+" ")},onDeleteRow:function(i){var o=i.data.view.model,t=_.indexBy(o.get("zones"),"zone_id"),s={},d=e(this).closest("tr").data("id");i.preventDefault(),window.confirm(n.strings.delete_confirmation_msg)&&t[d]&&(delete t[d],s[d]=_.extend(s[d]||{},{deleted:"deleted"}),o.set("zones",t),o.logChanges(s),i.data.view.block(),i.data.view.model.save())},setUnloadConfirmation:function(){this.needsUnloadConfirm=!0,d.prop("disabled",!1)},clearUnloadConfirmation:function(){this.needsUnloadConfirm=!1,d.prop("disabled",!0)},unloadConfirmation:function(e){if(e.data.view.needsUnloadConfirm)return e.returnValue=n.strings.unload_confirmation_msg,window.event.returnValue=n.strings.unload_confirmation_msg,n.strings.unload_confirmation_msg},updateModelOnChange:function(n){var i=n.data.view.model,o=e(n.target),t=o.closest("tr").data("id"),s=o.data("attribute"),d=o.val(),a=_.indexBy(i.get("zones"),"zone_id"),r={};a[t]&&a[t][s]===d||(r[t]={},r[t][s]=d),i.logChanges(r)},updateModelOnSort:function(n){var i=n.data.view.model,o=_.indexBy(i.get("zones"),"zone_id"),t=e("tbody.wc-shipping-zone-rows tr"),s={};_.each(t,function(n){var i=e(n).data("id"),t=null,d=parseInt(e(n).index(),10);o[i]&&(t=parseInt(o[i].zone_order,10)),t!==d&&(s[i]=_.extend(s[i]||{},{zone_order:d}))}),_.size(s)&&(i.logChanges(s),n.data.view.block(),n.data.view.model.save())}}),h=new l({zones:n.zones}),p=new c({model:h,el:s});p.render(),s.sortable({items:"tr",cursor:"move",axis:"y",handle:"td.wc-shipping-zone-sort",scrollSensitivity:40})})}(jQuery,shippingZonesLocalizeScript,wp,ajaxurl);
\ No newline at end of file
+!function(l,c,h,p){l(function(){var e=l(".wc-shipping-zones"),n=l(".wc-shipping-zone-rows"),i=l(".wc-shipping-zone-save"),o=h.template("wc-shipping-zone-row"),t=h.template("wc-shipping-zone-row-blank"),s=Backbone.Model.extend({changes:{},logChanges:function(e){var i=this.changes||{};_.each(e,function(e,n){i[n]=_.extend(i[n]||{zone_id:n},e)}),this.changes=i,this.trigger("change:zones")},discardChanges:function(e){var n=this.changes||{},i=null,o=_.indexBy(this.get("zones"),"zone_id");n[e]&&n[e].zone_order!==undefined&&(i=n[e].zone_order),delete n[e],null!==i&&o[e]&&o[e].zone_order!==i&&(n[e]=_.extend(n[e]||{},{zone_id:e,zone_order:i})),this.changes=n,0===_.size(this.changes)&&r.clearUnloadConfirmation()},save:function(){_.size(this.changes)?l.post(p+(0'+e.title+"")})):i.append(''+c.strings.no_shipping_methods_offered+" ")},onDeleteRow:function(e){var n=e.data.view.model,i=_.indexBy(n.get("zones"),"zone_id"),o={},t=l(this).closest("tr").data("id");e.preventDefault(),window.confirm(c.strings.delete_confirmation_msg)&&i[t]&&(delete i[t],o[t]=_.extend(o[t]||{},{deleted:"deleted"}),n.set("zones",i),n.logChanges(o),e.data.view.block(),e.data.view.model.save())},setUnloadConfirmation:function(){this.needsUnloadConfirm=!0,i.prop("disabled",!1)},clearUnloadConfirmation:function(){this.needsUnloadConfirm=!1,i.prop("disabled",!0)},unloadConfirmation:function(e){if(e.data.view.needsUnloadConfirm)return e.returnValue=c.strings.unload_confirmation_msg,window.event.returnValue=c.strings.unload_confirmation_msg,c.strings.unload_confirmation_msg},updateModelOnChange:function(e){var n=e.data.view.model,i=l(e.target),o=i.closest("tr").data("id"),t=i.data("attribute"),s=i.val(),d=_.indexBy(n.get("zones"),"zone_id"),a={};d[o]&&d[o][t]===s||(a[o]={},a[o][t]=s),n.logChanges(a)},updateModelOnSort:function(e){var n=e.data.view.model,t=_.indexBy(n.get("zones"),"zone_id"),i=l("tbody.wc-shipping-zone-rows tr"),s={};_.each(i,function(e){var n=l(e).data("id"),i=null,o=parseInt(l(e).index(),10);t[n]&&(i=parseInt(t[n].zone_order,10)),i!==o&&(s[n]=_.extend(s[n]||{},{zone_order:o}))}),_.size(s)&&(n.logChanges(s),e.data.view.block(),e.data.view.model.save())}}),a=new s({zones:c.zones}),r=new d({model:a,el:n});r.render(),n.sortable({items:"tr",cursor:"move",axis:"y",handle:"td.wc-shipping-zone-sort",scrollSensitivity:40})})}(jQuery,shippingZonesLocalizeScript,wp,ajaxurl);
\ No newline at end of file
diff --git a/assets/js/admin/woocommerce_admin.min.js b/assets/js/admin/woocommerce_admin.min.js
index 93167e9eb27..56e6c31e069 100644
--- a/assets/js/admin/woocommerce_admin.min.js
+++ b/assets/js/admin/woocommerce_admin.min.js
@@ -1 +1 @@
-!function(e,t){e(function(){if(void 0!==t){var i=e(".edit-php.post-type-product"),o=i.find(".page-title-action:first");0===i.find(".woocommerce-BlankState").length?(t.urls.export_products&&o.after(''+t.strings.export_products+" "),t.urls.import_products&&o.after(''+t.strings.import_products+" ")):o.hide(),e(".woocommerce-progress-form-wrapper .button-next").on("click",function(){return e(".wc-progress-form-content").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),!0}),e(document.body).on("wc_add_error_tip",function(i,o,n){var r=o.position();0===o.parent().find(".wc_error_tip").length&&(o.after(''+t[n]+"
"),o.parent().find(".wc_error_tip").css("left",r.left+o.width()-o.width()/2-e(".wc_error_tip").width()/2).css("top",r.top+o.height()).fadeIn("100"))}).on("wc_remove_error_tip",function(t,i,o){i.parent().find(".wc_error_tip."+o).fadeOut("100",function(){e(this).remove()})}).on("click",function(){e(".wc_error_tip").fadeOut("100",function(){e(this).remove()})}).on("blur",".wc_input_decimal[type=text], .wc_input_price[type=text], .wc_input_country_iso[type=text]",function(){e(".wc_error_tip").fadeOut("100",function(){e(this).remove()})}).on("change",".wc_input_price[type=text], .wc_input_decimal[type=text], .wc-order-totals #refund_amount[type=text]",function(){var i;i=e(this).is(".wc_input_price")||e(this).is("#refund_amount")?new RegExp("[^-0-9%\\"+t.mon_decimal_point+"]+","gi"):new RegExp("[^-0-9%\\"+t.decimal_point+"]+","gi");var o=e(this).val(),n=o.replace(i,"");o!==n&&e(this).val(n)}).on("keyup",".wc_input_price[type=text], .wc_input_decimal[type=text], .wc_input_country_iso[type=text], .wc-order-totals #refund_amount[type=text]",function(){var i,o;e(this).is(".wc_input_price")||e(this).is("#refund_amount")?(i=new RegExp("[^-0-9%\\"+t.mon_decimal_point+"]+","gi"),o="i18n_mon_decimal_error"):e(this).is(".wc_input_country_iso")?(i=new RegExp("([^A-Z])+|(.){3,}","im"),o="i18n_country_iso_error"):(i=new RegExp("[^-0-9%\\"+t.decimal_point+"]+","gi"),o="i18n_decimal_error");var n=e(this).val();n!==n.replace(i,"")?e(document.body).triggerHandler("wc_add_error_tip",[e(this),o]):e(document.body).triggerHandler("wc_remove_error_tip",[e(this),o])}).on("change","#_sale_price.wc_input_price[type=text], .wc_input_price[name^=variable_sale_price]",function(){var i,o=e(this);i=-1!==o.attr("name").indexOf("variable")?o.parents(".variable_pricing").find(".wc_input_price[name^=variable_regular_price]"):e("#_regular_price"),parseFloat(window.accounting.unformat(o.val(),t.mon_decimal_point))>=parseFloat(window.accounting.unformat(i.val(),t.mon_decimal_point))&&e(this).val("")}).on("keyup","#_sale_price.wc_input_price[type=text], .wc_input_price[name^=variable_sale_price]",function(){var i,o=e(this);i=-1!==o.attr("name").indexOf("variable")?o.parents(".variable_pricing").find(".wc_input_price[name^=variable_regular_price]"):e("#_regular_price"),parseFloat(window.accounting.unformat(o.val(),t.mon_decimal_point))>=parseFloat(window.accounting.unformat(i.val(),t.mon_decimal_point))?e(document.body).triggerHandler("wc_add_error_tip",[e(this),"i18_sale_less_than_regular_error"]):e(document.body).triggerHandler("wc_remove_error_tip",[e(this),"i18_sale_less_than_regular_error"])}).on("init_tooltips",function(){e(".tips, .help_tip, .woocommerce-help-tip").tipTip({attribute:"data-tip",fadeIn:50,fadeOut:50,delay:200}),e(".column-wc_actions .wc-action-button").tipTip({fadeIn:50,fadeOut:50,delay:200}),e(".parent-tips").each(function(){e(this).closest("a, th").attr("data-tip",e(this).data("tip")).tipTip({attribute:"data-tip",fadeIn:50,fadeOut:50,delay:200}).css("cursor","help")})}),e(document.body).trigger("init_tooltips"),e(".wc_input_table.sortable tbody").sortable({items:"tr",cursor:"move",axis:"y",scrollSensitivity:40,forcePlaceholderSize:!0,helper:"clone",opacity:.65,placeholder:"wc-metabox-sortable-placeholder",start:function(e,t){t.item.css("background-color","#f6f6f6")},stop:function(e,t){t.item.removeAttr("style")}}),e(".wc_input_table.sortable tbody input").on("click",function(){e(this).focus()}),e(".wc_input_table .remove_rows").click(function(){var t=e(this).closest(".wc_input_table").find("tbody");return t.find("tr.current").length>0&&t.find("tr.current").each(function(){e(this).remove()}),!1});var n=!1,r=!1,c=!1;e(document.body).bind("keyup keydown",function(e){r=e.shiftKey,n=e.ctrlKey||e.metaKey}),e(".wc_input_table").on("focus click","input",function(t){var i=e(this).closest("table, tbody"),o=e(this).closest("tr");("focus"===t.type&&c!==o.index()||"click"===t.type&&e(this).is(":focus"))&&(c=o.index(),r||n?r?(e("tr",i).removeClass("current"),o.addClass("selected_now").addClass("current"),e("tr.last_selected",i).length>0&&(o.index()>e("tr.last_selected",i).index()?e("tr",i).slice(e("tr.last_selected",i).index(),o.index()).addClass("current"):e("tr",i).slice(o.index(),e("tr.last_selected",i).index()+1).addClass("current")),e("tr",i).removeClass("last_selected"),o.addClass("last_selected")):(e("tr",i).removeClass("last_selected"),n&&e(this).closest("tr").is(".current")?o.removeClass("current"):o.addClass("current").addClass("last_selected")):(e("tr",i).removeClass("current").removeClass("last_selected"),o.addClass("current").addClass("last_selected")),e("tr",i).removeClass("selected_now"))}).on("blur","input",function(){c=!1}),e(".woocommerce_page_wc-settings .shippingrows tbody tr:even, table.attributes-table tbody tr:nth-child(odd)").addClass("alternate"),e(document.body).on("click",".show_order_items",function(){return e(this).closest("td").find("table").toggle(),!1}),e("select.availability").change(function(){"all"===e(this).val()?e(this).closest("tr").next("tr").hide():e(this).closest("tr").next("tr").show()}).change(),e(".hide_options_if_checked").each(function(){e(this).find("input:eq(0)").change(function(){e(this).is(":checked")?e(this).closest("fieldset, tr").nextUntil(".hide_options_if_checked, .show_options_if_checked",".hidden_option").hide():e(this).closest("fieldset, tr").nextUntil(".hide_options_if_checked, .show_options_if_checked",".hidden_option").show()}).change()}),e(".show_options_if_checked").each(function(){e(this).find("input:eq(0)").change(function(){e(this).is(":checked")?e(this).closest("fieldset, tr").nextUntil(".hide_options_if_checked, .show_options_if_checked",".hidden_option").show():e(this).closest("fieldset, tr").nextUntil(".hide_options_if_checked, .show_options_if_checked",".hidden_option").hide()}).change()}),e("input#woocommerce_enable_reviews").change(function(){e(this).is(":checked")?e("#woocommerce_enable_review_rating").closest("tr").show():e("#woocommerce_enable_review_rating").closest("tr").hide()}).change(),e("table.attributes-table tbody tr:nth-child(odd)").addClass("alternate"),e(".wc_gateways").on("click",".wc-payment-gateway-method-toggle-enabled",function(){var i=e(this),o=i.closest("tr"),n=i.find(".woocommerce-input-toggle"),r={action:"woocommerce_toggle_gateway_enabled",security:t.nonces.gateway_toggle,gateway_id:o.data("gateway_id")};return n.addClass("woocommerce-input-toggle--loading"),e.ajax({url:t.ajax_url,data:r,dataType:"json",type:"POST",success:function(e){!0===e.data?(n.removeClass("woocommerce-input-toggle--enabled, woocommerce-input-toggle--disabled"),n.addClass("woocommerce-input-toggle--enabled"),n.removeClass("woocommerce-input-toggle--loading")):!1===e.data?(n.removeClass("woocommerce-input-toggle--enabled, woocommerce-input-toggle--disabled"),n.addClass("woocommerce-input-toggle--disabled"),n.removeClass("woocommerce-input-toggle--loading")):"needs_setup"===e.data&&(window.location.href=i.attr("href"))}}),!1})}})}(jQuery,woocommerce_admin);
\ No newline at end of file
+!function(c,a){c(function(){if(void 0!==a){var e=c(".edit-php.post-type-product"),t=e.find(".page-title-action:first");0===e.find(".woocommerce-BlankState").length?(a.urls.export_products&&t.after(''+a.strings.export_products+" "),a.urls.import_products&&t.after(''+a.strings.import_products+" ")):t.hide(),c(".woocommerce-progress-form-wrapper .button-next").on("click",function(){return c(".wc-progress-form-content").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),!0}),c(document.body).on("wc_add_error_tip",function(e,t,i){var o=t.position();0===t.parent().find(".wc_error_tip").length&&(t.after(''+a[i]+"
"),t.parent().find(".wc_error_tip").css("left",o.left+t.width()-t.width()/2-c(".wc_error_tip").width()/2).css("top",o.top+t.height()).fadeIn("100"))}).on("wc_remove_error_tip",function(e,t,i){t.parent().find(".wc_error_tip."+i).fadeOut("100",function(){c(this).remove()})}).on("click",function(){c(".wc_error_tip").fadeOut("100",function(){c(this).remove()})}).on("blur",".wc_input_decimal[type=text], .wc_input_price[type=text], .wc_input_country_iso[type=text]",function(){c(".wc_error_tip").fadeOut("100",function(){c(this).remove()})}).on("change",".wc_input_price[type=text], .wc_input_decimal[type=text], .wc-order-totals #refund_amount[type=text]",function(){var e;e=c(this).is(".wc_input_price")||c(this).is("#refund_amount")?new RegExp("[^-0-9%\\"+a.mon_decimal_point+"]+","gi"):new RegExp("[^-0-9%\\"+a.decimal_point+"]+","gi");var t=c(this).val(),i=t.replace(e,"");t!==i&&c(this).val(i)}).on("keyup",".wc_input_price[type=text], .wc_input_decimal[type=text], .wc_input_country_iso[type=text], .wc-order-totals #refund_amount[type=text]",function(){var e,t;c(this).is(".wc_input_price")||c(this).is("#refund_amount")?(e=new RegExp("[^-0-9%\\"+a.mon_decimal_point+"]+","gi"),t="i18n_mon_decimal_error"):c(this).is(".wc_input_country_iso")?(e=new RegExp("([^A-Z])+|(.){3,}","im"),t="i18n_country_iso_error"):(e=new RegExp("[^-0-9%\\"+a.decimal_point+"]+","gi"),t="i18n_decimal_error");var i=c(this).val(),o=i.replace(e,"");i!==o?c(document.body).triggerHandler("wc_add_error_tip",[c(this),t]):c(document.body).triggerHandler("wc_remove_error_tip",[c(this),t])}).on("change","#_sale_price.wc_input_price[type=text], .wc_input_price[name^=variable_sale_price]",function(){var e,t=c(this);e=-1!==t.attr("name").indexOf("variable")?t.parents(".variable_pricing").find(".wc_input_price[name^=variable_regular_price]"):c("#_regular_price");var i=parseFloat(window.accounting.unformat(t.val(),a.mon_decimal_point));parseFloat(window.accounting.unformat(e.val(),a.mon_decimal_point))<=i&&c(this).val("")}).on("keyup","#_sale_price.wc_input_price[type=text], .wc_input_price[name^=variable_sale_price]",function(){var e,t=c(this);e=-1!==t.attr("name").indexOf("variable")?t.parents(".variable_pricing").find(".wc_input_price[name^=variable_regular_price]"):c("#_regular_price");var i=parseFloat(window.accounting.unformat(t.val(),a.mon_decimal_point));parseFloat(window.accounting.unformat(e.val(),a.mon_decimal_point))<=i?c(document.body).triggerHandler("wc_add_error_tip",[c(this),"i18n_sale_less_than_regular_error"]):c(document.body).triggerHandler("wc_remove_error_tip",[c(this),"i18n_sale_less_than_regular_error"])}).on("init_tooltips",function(){c(".tips, .help_tip, .woocommerce-help-tip").tipTip({attribute:"data-tip",fadeIn:50,fadeOut:50,delay:200}),c(".column-wc_actions .wc-action-button").tipTip({fadeIn:50,fadeOut:50,delay:200}),c(".parent-tips").each(function(){c(this).closest("a, th").attr("data-tip",c(this).data("tip")).tipTip({attribute:"data-tip",fadeIn:50,fadeOut:50,delay:200}).css("cursor","help")})}),c(document.body).trigger("init_tooltips"),c(".wc_input_table.sortable tbody").sortable({items:"tr",cursor:"move",axis:"y",scrollSensitivity:40,forcePlaceholderSize:!0,helper:"clone",opacity:.65,placeholder:"wc-metabox-sortable-placeholder",start:function(e,t){t.item.css("background-color","#f6f6f6")},stop:function(e,t){t.item.removeAttr("style")}}),c(".wc_input_table.sortable tbody input").on("click",function(){c(this).focus()}),c(".wc_input_table .remove_rows").click(function(){var e=c(this).closest(".wc_input_table").find("tbody");0c("tr.last_selected",t).index()?c("tr",t).slice(c("tr.last_selected",t).index(),i.index()).addClass("current"):c("tr",t).slice(i.index(),c("tr.last_selected",t).index()+1).addClass("current")),c("tr",t).removeClass("last_selected"),i.addClass("last_selected")):(c("tr",t).removeClass("last_selected"),o&&c(this).closest("tr").is(".current")?i.removeClass("current"):i.addClass("current").addClass("last_selected")):(c("tr",t).removeClass("current").removeClass("last_selected"),i.addClass("current").addClass("last_selected")),c("tr",t).removeClass("selected_now"))}).on("blur","input",function(){r=!1}),c(".woocommerce_page_wc-settings .shippingrows tbody tr:even, table.attributes-table tbody tr:nth-child(odd)").addClass("alternate"),c(document.body).on("click",".show_order_items",function(){return c(this).closest("td").find("table").toggle(),!1}),c("select.availability").change(function(){"all"===c(this).val()?c(this).closest("tr").next("tr").hide():c(this).closest("tr").next("tr").show()}).change(),c(".hide_options_if_checked").each(function(){c(this).find("input:eq(0)").change(function(){c(this).is(":checked")?c(this).closest("fieldset, tr").nextUntil(".hide_options_if_checked, .show_options_if_checked",".hidden_option").hide():c(this).closest("fieldset, tr").nextUntil(".hide_options_if_checked, .show_options_if_checked",".hidden_option").show()}).change()}),c(".show_options_if_checked").each(function(){c(this).find("input:eq(0)").change(function(){c(this).is(":checked")?c(this).closest("fieldset, tr").nextUntil(".hide_options_if_checked, .show_options_if_checked",".hidden_option").show():c(this).closest("fieldset, tr").nextUntil(".hide_options_if_checked, .show_options_if_checked",".hidden_option").hide()}).change()}),c("input#woocommerce_enable_reviews").change(function(){c(this).is(":checked")?c("#woocommerce_enable_review_rating").closest("tr").show():c("#woocommerce_enable_review_rating").closest("tr").hide()}).change(),c("table.attributes-table tbody tr:nth-child(odd)").addClass("alternate"),c(".wc_gateways").on("click",".wc-payment-gateway-method-toggle-enabled",function(){var t=c(this),e=t.closest("tr"),i=t.find(".woocommerce-input-toggle"),o={action:"woocommerce_toggle_gateway_enabled",security:a.nonces.gateway_toggle,gateway_id:e.data("gateway_id")};return i.addClass("woocommerce-input-toggle--loading"),c.ajax({url:a.ajax_url,data:o,dataType:"json",type:"POST",success:function(e){!0===e.data?(i.removeClass("woocommerce-input-toggle--enabled, woocommerce-input-toggle--disabled"),i.addClass("woocommerce-input-toggle--enabled"),i.removeClass("woocommerce-input-toggle--loading")):!1===e.data?(i.removeClass("woocommerce-input-toggle--enabled, woocommerce-input-toggle--disabled"),i.addClass("woocommerce-input-toggle--disabled"),i.removeClass("woocommerce-input-toggle--loading")):"needs_setup"===e.data&&(window.location.href=t.attr("href"))}}),!1}),c("#wpbody").on("click","#doaction, #doaction2",function(){if("remove_personal_data"===(c(this).is("#doaction")?c("#bulk-action-selector-top").val():c("#bulk-action-selector-bottom").val()))return window.confirm(a.i18n_remove_personal_data_notice)})}})}(jQuery,woocommerce_admin);
\ No newline at end of file
diff --git a/assets/js/flexslider/jquery.flexslider.min.js b/assets/js/flexslider/jquery.flexslider.min.js
index abf2aa35d8a..10995d601ff 100644
--- a/assets/js/flexslider/jquery.flexslider.min.js
+++ b/assets/js/flexslider/jquery.flexslider.min.js
@@ -1 +1 @@
-!function(e){var t=!0;e.flexslider=function(a,n){var i=e(a);"undefined"==typeof n.rtl&&"rtl"==e("html").attr("dir")&&(n.rtl=!0),i.vars=e.extend({},e.flexslider.defaults,n);var r,s=i.vars.namespace,o=window.navigator&&window.navigator.msPointerEnabled&&window.MSGesture,l=("ontouchstart"in window||o||window.DocumentTouch&&document instanceof DocumentTouch)&&i.vars.touch,d="click touchend MSPointerUp keyup",c="",u="vertical"===i.vars.direction,v=i.vars.reverse,p=i.vars.itemWidth>0,m="fade"===i.vars.animation,f=""!==i.vars.asNavFor,g={};e.data(a,"flexslider",i),g={init:function(){i.animating=!1,i.currentSlide=parseInt(i.vars.startAt?i.vars.startAt:0,10),isNaN(i.currentSlide)&&(i.currentSlide=0),i.animatingTo=i.currentSlide,i.atEnd=0===i.currentSlide||i.currentSlide===i.last,i.containerSelector=i.vars.selector.substr(0,i.vars.selector.search(" ")),i.slides=e(i.vars.selector,i),i.container=e(i.containerSelector,i),i.count=i.slides.length,i.syncExists=e(i.vars.sync).length>0,"slide"===i.vars.animation&&(i.vars.animation="swing"),i.prop=u?"top":i.vars.rtl?"marginRight":"marginLeft",i.args={},i.manualPause=!1,i.stopped=!1,i.started=!1,i.startTimeout=null,i.transitions=!i.vars.video&&!m&&i.vars.useCSS&&function(){var e=document.createElement("div"),t=["perspectiveProperty","WebkitPerspective","MozPerspective","OPerspective","msPerspective"];for(var a in t)if(e.style[t[a]]!==undefined)return i.pfx=t[a].replace("Perspective","").toLowerCase(),i.prop="-"+i.pfx+"-transform",!0;return!1}(),i.isFirefox=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,i.ensureAnimationEnd="",""!==i.vars.controlsContainer&&(i.controlsContainer=e(i.vars.controlsContainer).length>0&&e(i.vars.controlsContainer)),""!==i.vars.manualControls&&(i.manualControls=e(i.vars.manualControls).length>0&&e(i.vars.manualControls)),""!==i.vars.customDirectionNav&&(i.customDirectionNav=2===e(i.vars.customDirectionNav).length&&e(i.vars.customDirectionNav)),i.vars.randomize&&(i.slides.sort(function(){return Math.round(Math.random())-.5}),i.container.empty().append(i.slides)),i.doMath(),i.setup("init"),i.vars.controlNav&&g.controlNav.setup(),i.vars.directionNav&&g.directionNav.setup(),i.vars.keyboard&&(1===e(i.containerSelector).length||i.vars.multipleKeyboard)&&e(document).bind("keyup",function(e){var t=e.keyCode;if(!i.animating&&(39===t||37===t)){var a=i.vars.rtl?37===t?i.getTarget("next"):39===t&&i.getTarget("prev"):39===t?i.getTarget("next"):37===t&&i.getTarget("prev");i.flexAnimate(a,i.vars.pauseOnAction)}}),i.vars.mousewheel&&i.bind("mousewheel",function(e,t,a,n){e.preventDefault();var r=t<0?i.getTarget("next"):i.getTarget("prev");i.flexAnimate(r,i.vars.pauseOnAction)}),i.vars.pausePlay&&g.pausePlay.setup(),i.vars.slideshow&&i.vars.pauseInvisible&&g.pauseInvisible.init(),i.vars.slideshow&&(i.vars.pauseOnHover&&i.hover(function(){i.manualPlay||i.manualPause||i.pause()},function(){i.manualPause||i.manualPlay||i.stopped||i.play()}),i.vars.pauseInvisible&&g.pauseInvisible.isHidden()||(i.vars.initDelay>0?i.startTimeout=setTimeout(i.play,i.vars.initDelay):i.play())),f&&g.asNav.setup(),l&&i.vars.touch&&g.touch(),(!m||m&&i.vars.smoothHeight)&&e(window).bind("resize orientationchange focus",g.resize),i.find("img").attr("draggable","false"),setTimeout(function(){i.vars.start(i)},200)},asNav:{setup:function(){i.asNav=!0,i.animatingTo=Math.floor(i.currentSlide/i.move),i.currentItem=i.currentSlide,i.slides.removeClass(s+"active-slide").eq(i.currentItem).addClass(s+"active-slide"),o?(a._slider=i,i.slides.each(function(){var t=this;t._gesture=new MSGesture,t._gesture.target=t,t.addEventListener("MSPointerDown",function(e){e.preventDefault(),e.currentTarget._gesture&&e.currentTarget._gesture.addPointer(e.pointerId)},!1),t.addEventListener("MSGestureTap",function(t){t.preventDefault();var a=e(this),n=a.index();e(i.vars.asNavFor).data("flexslider").animating||a.hasClass("active")||(i.direction=i.currentItem'),i.pagingCount>1)for(var o=0;o ":''+r+" ","thumbnails"===i.vars.controlNav&&!0===i.vars.thumbCaptions){var u=a.attr("data-thumbcaption");""!==u&&undefined!==u&&(t+=''+u+" ")}i.controlNavScaffold.append(""+t+" "),r++}i.controlsContainer?e(i.controlsContainer).append(i.controlNavScaffold):i.append(i.controlNavScaffold),g.controlNav.set(),g.controlNav.active(),i.controlNavScaffold.delegate("a, img",d,function(t){if(t.preventDefault(),""===c||c===t.type){var a=e(this),n=i.controlNav.index(a);a.hasClass(s+"active")||(i.direction=n>i.currentSlide?"next":"prev",i.flexAnimate(n,i.vars.pauseOnAction))}""===c&&(c=t.type),g.setToClearWatchedEvent()})},setupManual:function(){i.controlNav=i.manualControls,g.controlNav.active(),i.controlNav.bind(d,function(t){if(t.preventDefault(),""===c||c===t.type){var a=e(this),n=i.controlNav.index(a);a.hasClass(s+"active")||(n>i.currentSlide?i.direction="next":i.direction="prev",i.flexAnimate(n,i.vars.pauseOnAction))}""===c&&(c=t.type),g.setToClearWatchedEvent()})},set:function(){var t="thumbnails"===i.vars.controlNav?"img":"a";i.controlNav=e("."+s+"control-nav li "+t,i.controlsContainer?i.controlsContainer:i)},active:function(){i.controlNav.removeClass(s+"active").eq(i.animatingTo).addClass(s+"active")},update:function(t,a){i.pagingCount>1&&"add"===t?i.controlNavScaffold.append(e(''+i.count+" ")):1===i.pagingCount?i.controlNavScaffold.find("li").remove():i.controlNav.eq(a).closest("li").remove(),g.controlNav.set(),i.pagingCount>1&&i.pagingCount!==i.controlNav.length?i.update(a,t):g.controlNav.active()}},directionNav:{setup:function(){var t=e('");i.customDirectionNav?i.directionNav=i.customDirectionNav:i.controlsContainer?(e(i.controlsContainer).append(t),i.directionNav=e("."+s+"direction-nav li a",i.controlsContainer)):(i.append(t),i.directionNav=e("."+s+"direction-nav li a",i)),g.directionNav.update(),i.directionNav.bind(d,function(t){t.preventDefault();var a;""!==c&&c!==t.type||(a=e(this).hasClass(s+"next")?i.getTarget("next"):i.getTarget("prev"),i.flexAnimate(a,i.vars.pauseOnAction)),""===c&&(c=t.type),g.setToClearWatchedEvent()})},update:function(){var e=s+"disabled";1===i.pagingCount?i.directionNav.addClass(e).attr("tabindex","-1"):i.vars.animationLoop?i.directionNav.removeClass(e).removeAttr("tabindex"):0===i.animatingTo?i.directionNav.removeClass(e).filter("."+s+"prev").addClass(e).attr("tabindex","-1"):i.animatingTo===i.last?i.directionNav.removeClass(e).filter("."+s+"next").addClass(e).attr("tabindex","-1"):i.directionNav.removeClass(e).removeAttr("tabindex")}},pausePlay:{setup:function(){var t=e('');i.controlsContainer?(i.controlsContainer.append(t),i.pausePlay=e("."+s+"pauseplay a",i.controlsContainer)):(i.append(t),i.pausePlay=e("."+s+"pauseplay a",i)),g.pausePlay.update(i.vars.slideshow?s+"pause":s+"play"),i.pausePlay.bind(d,function(t){t.preventDefault(),""!==c&&c!==t.type||(e(this).hasClass(s+"pause")?(i.manualPause=!0,i.manualPlay=!1,i.pause()):(i.manualPause=!1,i.manualPlay=!0,i.play())),""===c&&(c=t.type),g.setToClearWatchedEvent()})},update:function(e){"play"===e?i.pausePlay.removeClass(s+"pause").addClass(s+"play").html(i.vars.playText):i.pausePlay.removeClass(s+"play").addClass(s+"pause").html(i.vars.pauseText)}},touch:function(){var e,t,n,r,s,l,d,c,f,g=!1,h=0,S=0,x=0;o?(a.style.msTouchAction="none",a._gesture=new MSGesture,a._gesture.target=a,a.addEventListener("MSPointerDown",function(e){e.stopPropagation(),i.animating?e.preventDefault():(i.pause(),a._gesture.addPointer(e.pointerId),x=0,r=u?i.h:i.w,l=Number(new Date),n=p&&v&&i.animatingTo===i.last?0:p&&v?i.limit-(i.itemW+i.vars.itemMargin)*i.move*i.animatingTo:p&&i.currentSlide===i.last?i.limit:p?(i.itemW+i.vars.itemMargin)*i.move*i.currentSlide:v?(i.last-i.currentSlide+i.cloneOffset)*r:(i.currentSlide+i.cloneOffset)*r)},!1),a._slider=i,a.addEventListener("MSGestureChange",function(e){e.stopPropagation();var t=e.target._slider;if(t){var i=-e.translationX,o=-e.translationY;x+=u?o:i,s=(t.vars.rtl?-1:1)*x,g=u?Math.abs(x)500)&&(e.preventDefault(),!m&&t.transitions&&(t.vars.animationLoop||(s=x/(0===t.currentSlide&&x<0||t.currentSlide===t.last&&x>0?Math.abs(x)/r+2:1)),t.setProps(n+s,"setTouch"))):setImmediate(function(){a._gesture.stop()})}},!1),a.addEventListener("MSGestureEnd",function(a){a.stopPropagation();var i=a.target._slider;if(i){if(i.animatingTo===i.currentSlide&&!g&&null!==s){var o=v?-s:s,d=o>0?i.getTarget("next"):i.getTarget("prev");i.canAdvance(d)&&(Number(new Date)-l<550&&Math.abs(o)>50||Math.abs(o)>r/2)?i.flexAnimate(d,i.vars.pauseOnAction):m||i.flexAnimate(i.currentSlide,i.vars.pauseOnAction,!0)}e=null,t=null,s=null,n=null,x=0}},!1)):(d=function(s){i.animating?s.preventDefault():(window.navigator.msPointerEnabled||1===s.touches.length)&&(i.pause(),r=u?i.h:i.w,l=Number(new Date),h=s.touches[0].pageX,S=s.touches[0].pageY,n=p&&v&&i.animatingTo===i.last?0:p&&v?i.limit-(i.itemW+i.vars.itemMargin)*i.move*i.animatingTo:p&&i.currentSlide===i.last?i.limit:p?(i.itemW+i.vars.itemMargin)*i.move*i.currentSlide:v?(i.last-i.currentSlide+i.cloneOffset)*r:(i.currentSlide+i.cloneOffset)*r,e=u?S:h,t=u?h:S,a.addEventListener("touchmove",c,!1),a.addEventListener("touchend",f,!1))},c=function(a){h=a.touches[0].pageX,S=a.touches[0].pageY,s=u?e-S:(i.vars.rtl?-1:1)*(e-h);(!(g=u?Math.abs(s)500)&&(a.preventDefault(),!m&&i.transitions&&(i.vars.animationLoop||(s/=0===i.currentSlide&&s<0||i.currentSlide===i.last&&s>0?Math.abs(s)/r+2:1),i.setProps(n+s,"setTouch")))},f=function(o){if(a.removeEventListener("touchmove",c,!1),i.animatingTo===i.currentSlide&&!g&&null!==s){var d=v?-s:s,u=d>0?i.getTarget("next"):i.getTarget("prev");i.canAdvance(u)&&(Number(new Date)-l<550&&Math.abs(d)>50||Math.abs(d)>r/2)?i.flexAnimate(u,i.vars.pauseOnAction):m||i.flexAnimate(i.currentSlide,i.vars.pauseOnAction,!0)}a.removeEventListener("touchend",f,!1),e=null,t=null,s=null,n=null},a.addEventListener("touchstart",d,!1))},resize:function(){!i.animating&&i.is(":visible")&&(p||i.doMath(),m?g.smoothHeight():p?(i.slides.width(i.computedW),i.update(i.pagingCount),i.setProps()):u?(i.viewport.height(i.h),i.setProps(i.h,"setTotal")):(i.vars.smoothHeight&&g.smoothHeight(),i.newSlides.width(i.computedW),i.setProps(i.computedW,"setTotal")))},smoothHeight:function(e){if(!u||m){var t=m?i:i.viewport;e?t.animate({height:i.slides.eq(i.animatingTo).innerHeight()},e):t.innerHeight(i.slides.eq(i.animatingTo).innerHeight())}},sync:function(t){var a=e(i.vars.sync).data("flexslider"),n=i.animatingTo;switch(t){case"animate":a.flexAnimate(n,i.vars.pauseOnAction,!1,!0);break;case"play":a.playing||a.asNav||a.play();break;case"pause":a.pause()}},uniqueID:function(t){return t.filter("[id]").add(t.find("[id]")).each(function(){var t=e(this);t.attr("id",t.attr("id")+"_clone")}),t},pauseInvisible:{visProp:null,init:function(){var e=g.pauseInvisible.getHiddenProp();if(e){var t=e.replace(/[H|h]idden/,"")+"visibilitychange";document.addEventListener(t,function(){g.pauseInvisible.isHidden()?i.startTimeout?clearTimeout(i.startTimeout):i.pause():i.started?i.play():i.vars.initDelay>0?setTimeout(i.play,i.vars.initDelay):i.play()})}},isHidden:function(){var e=g.pauseInvisible.getHiddenProp();return!!e&&document[e]},getHiddenProp:function(){var e=["webkit","moz","ms","o"];if("hidden"in document)return"hidden";for(var t=0;ti.currentSlide?"next":"prev"),f&&1===i.pagingCount&&(i.direction=i.currentItemi.limit&&1!==i.visible?i.limit:S):h=0===i.currentSlide&&t===i.count-1&&i.vars.animationLoop&&"next"!==i.direction?v?(i.count+i.cloneOffset)*x:0:i.currentSlide===i.last&&0===t&&i.vars.animationLoop&&"prev"!==i.direction?v?0:(i.count+1)*x:v?(i.count-1-t+i.cloneOffset)*x:(t+i.cloneOffset)*x,i.setProps(h,"",i.vars.animationSpeed),i.transitions?(i.vars.animationLoop&&i.atEnd||(i.animating=!1,i.currentSlide=i.animatingTo),i.container.unbind("webkitTransitionEnd transitionend"),i.container.bind("webkitTransitionEnd transitionend",function(){clearTimeout(i.ensureAnimationEnd),i.wrapup(x)}),clearTimeout(i.ensureAnimationEnd),i.ensureAnimationEnd=setTimeout(function(){i.wrapup(x)},i.vars.animationSpeed+100)):i.container.animate(i.args,i.vars.animationSpeed,i.vars.easing,function(){i.wrapup(x)})}i.vars.smoothHeight&&g.smoothHeight(i.vars.animationSpeed)}},i.wrapup=function(e){m||p||(0===i.currentSlide&&i.animatingTo===i.last&&i.vars.animationLoop?i.setProps(e,"jumpEnd"):i.currentSlide===i.last&&0===i.animatingTo&&i.vars.animationLoop&&i.setProps(e,"jumpStart")),i.animating=!1,i.currentSlide=i.animatingTo,i.vars.after(i)},i.animateSlides=function(){!i.animating&&t&&i.flexAnimate(i.getTarget("next"))},i.pause=function(){clearInterval(i.animatedSlides),i.animatedSlides=null,i.playing=!1,i.vars.pausePlay&&g.pausePlay.update("play"),i.syncExists&&g.sync("pause")},i.play=function(){i.playing&&clearInterval(i.animatedSlides),i.animatedSlides=i.animatedSlides||setInterval(i.animateSlides,i.vars.slideshowSpeed),i.started=i.playing=!0,i.vars.pausePlay&&g.pausePlay.update("pause"),i.syncExists&&g.sync("play")},i.stop=function(){i.pause(),i.stopped=!0},i.canAdvance=function(e,t){var a=f?i.pagingCount-1:i.last;return!!t||(!(!f||i.currentItem!==i.count-1||0!==e||"prev"!==i.direction)||(!f||0!==i.currentItem||e!==i.pagingCount-1||"next"===i.direction)&&(!(e===i.currentSlide&&!f)&&(!!i.vars.animationLoop||(!i.atEnd||0!==i.currentSlide||e!==a||"next"===i.direction)&&(!i.atEnd||i.currentSlide!==a||0!==e||"next"!==i.direction))))},i.getTarget=function(e){return i.direction=e,"next"===e?i.currentSlide===i.last?0:i.currentSlide+1:0===i.currentSlide?i.last:i.currentSlide-1},i.setProps=function(e,t,a){var n=function(){var a=e||(i.itemW+i.vars.itemMargin)*i.move*i.animatingTo;return function(){if(p)return"setTouch"===t?e:v&&i.animatingTo===i.last?0:v?i.limit-(i.itemW+i.vars.itemMargin)*i.move*i.animatingTo:i.animatingTo===i.last?i.limit:a;switch(t){case"setTotal":return v?(i.count-1-i.currentSlide+i.cloneOffset)*e:(i.currentSlide+i.cloneOffset)*e;case"setTouch":return e;case"jumpEnd":return v?e:i.count*e;case"jumpStart":return v?i.count*e:e;default:return e}}()*(i.vars.rtl?1:-1)+"px"}();i.transitions&&(n=u?"translate3d(0,"+n+",0)":"translate3d("+parseInt(n)+"px,0,0)",a=a!==undefined?a/1e3+"s":"0s",i.container.css("-"+i.pfx+"-transition-duration",a),i.container.css("transition-duration",a)),i.args[i.prop]=n,(i.transitions||a===undefined)&&i.container.css(i.args),i.container.css("transform",n)},i.setup=function(t){if(m)i.vars.rtl?i.slides.css({width:"100%","float":"right",marginLeft:"-100%",position:"relative"}):i.slides.css({width:"100%","float":"left",marginRight:"-100%",position:"relative"}),"init"===t&&(l?i.slides.css({opacity:0,display:"block",webkitTransition:"opacity "+i.vars.animationSpeed/1e3+"s ease",zIndex:1}).eq(i.currentSlide).css({opacity:1,zIndex:2}):0==i.vars.fadeFirstSlide?i.slides.css({opacity:0,display:"block",zIndex:1}).eq(i.currentSlide).css({zIndex:2}).css({opacity:1}):i.slides.css({opacity:0,display:"block",zIndex:1}).eq(i.currentSlide).css({zIndex:2}).animate({opacity:1},i.vars.animationSpeed,i.vars.easing)),i.vars.smoothHeight&&g.smoothHeight();else{var a,n;"init"===t&&(i.viewport=e('
').css({overflow:"hidden",position:"relative"}).appendTo(i).append(i.container),i.cloneCount=0,i.cloneOffset=0,v&&(n=e.makeArray(i.slides).reverse(),i.slides=e(n),i.container.empty().append(i.slides))),i.vars.animationLoop&&!p&&(i.cloneCount=2,i.cloneOffset=1,"init"!==t&&i.container.find(".clone").remove(),i.container.append(g.uniqueID(i.slides.first().clone().addClass("clone")).attr("aria-hidden","true")).prepend(g.uniqueID(i.slides.last().clone().addClass("clone")).attr("aria-hidden","true"))),i.newSlides=e(i.vars.selector,i),a=v?i.count-1-i.currentSlide+i.cloneOffset:i.currentSlide+i.cloneOffset,u&&!p?(i.container.height(200*(i.count+i.cloneCount)+"%").css("position","absolute").width("100%"),setTimeout(function(){i.newSlides.css({display:"block"}),i.doMath(),i.viewport.height(i.h),i.setProps(a*i.h,"init")},"init"===t?100:0)):(i.container.width(200*(i.count+i.cloneCount)+"%"),i.setProps(a*i.computedW,"init"),setTimeout(function(){i.doMath(),i.vars.rtl?i.newSlides.css({width:i.computedW,marginRight:i.computedM,"float":"right",display:"block"}):i.newSlides.css({width:i.computedW,marginRight:i.computedM,"float":"left",display:"block"}),i.vars.smoothHeight&&g.smoothHeight()},"init"===t?100:0))}p||i.slides.removeClass(s+"active-slide").eq(i.currentSlide).addClass(s+"active-slide"),i.vars.init(i)},i.doMath=function(){var e=i.slides.first(),t=i.vars.itemMargin,a=i.vars.minItems,n=i.vars.maxItems;i.w=i.viewport===undefined?i.width():i.viewport.width(),i.isFirefox&&(i.w=i.width()),i.h=e.height(),i.boxPadding=e.outerWidth()-e.width(),p?(i.itemT=i.vars.itemWidth+t,i.itemM=t,i.minW=a?a*i.itemT:i.w,i.maxW=n?n*i.itemT-t:i.w,i.itemW=i.minW>i.w?(i.w-t*(a-1))/a:i.maxWi.w?i.w:i.vars.itemWidth,i.visible=Math.floor(i.w/i.itemW),i.move=i.vars.move>0&&i.vars.movei.w?i.itemW*(i.count-1)+t*(i.count-1):(i.itemW+t)*i.count-i.w-t):(i.itemW=i.w,i.itemM=t,i.pagingCount=i.count,i.last=i.count-1),i.computedW=i.itemW-i.boxPadding,i.computedM=i.itemM},i.update=function(e,t){i.doMath(),p||(ei.controlNav.length?g.controlNav.update("add"):("remove"===t&&!p||i.pagingCounti.last&&(i.currentSlide-=1,i.animatingTo-=1),g.controlNav.update("remove",i.last))),i.vars.directionNav&&g.directionNav.update()},i.addSlide=function(t,a){var n=e(t);i.count+=1,i.last=i.count-1,u&&v?a!==undefined?i.slides.eq(i.count-a).after(n):i.container.prepend(n):a!==undefined?i.slides.eq(a).before(n):i.container.append(n),i.update(a,"add"),i.slides=e(i.vars.selector+":not(.clone)",i),i.setup(),i.vars.added(i)},i.removeSlide=function(t){var a=isNaN(t)?i.slides.index(e(t)):t;i.count-=1,i.last=i.count-1,isNaN(t)?e(t,i.slides).remove():u&&v?i.slides.eq(i.last).remove():i.slides.eq(t).remove(),i.doMath(),i.update(a,"remove"),i.slides=e(i.vars.selector+":not(.clone)",i),i.setup(),i.vars.removed(i)},g.init()},e(window).blur(function(e){t=!1}).focus(function(e){t=!0}),e.flexslider.defaults={namespace:"flex-",selector:".slides > li",animation:"fade",easing:"swing",direction:"horizontal",reverse:!1,animationLoop:!0,smoothHeight:!1,startAt:0,slideshow:!0,slideshowSpeed:7e3,animationSpeed:600,initDelay:0,randomize:!1,fadeFirstSlide:!0,thumbCaptions:!1,pauseOnAction:!0,pauseOnHover:!1,pauseInvisible:!0,useCSS:!0,touch:!0,video:!1,controlNav:!0,directionNav:!0,prevText:"Previous",nextText:"Next",keyboard:!0,multipleKeyboard:!1,mousewheel:!1,pausePlay:!1,pauseText:"Pause",playText:"Play",controlsContainer:"",manualControls:"",customDirectionNav:"",sync:"",asNavFor:"",itemWidth:0,itemMargin:0,minItems:1,maxItems:0,move:0,allowOneSlide:!0,isFirefox:!1,start:function(){},before:function(){},after:function(){},end:function(){},added:function(){},removed:function(){},init:function(){},rtl:!1},e.fn.flexslider=function(t){if(t===undefined&&(t={}),"object"==typeof t)return this.each(function(){var a=e(this),n=t.selector?t.selector:".slides > li",i=a.find(n);1===i.length&&!1===t.allowOneSlide||0===i.length?(i.fadeIn(400),t.start&&t.start(a)):a.data("flexslider")===undefined&&new e.flexslider(this,t)});var a=e(this).data("flexslider");switch(t){case"play":a.play();break;case"pause":a.pause();break;case"stop":a.stop();break;case"next":a.flexAnimate(a.getTarget("next"),!0);break;case"prev":case"previous":a.flexAnimate(a.getTarget("prev"),!0);break;default:"number"==typeof t&&a.flexAnimate(t,!0)}}}(jQuery);
\ No newline at end of file
+!function(b){var a=!0;b.flexslider=function(p,e){var m=b(p);"undefined"==typeof e.rtl&&"rtl"==b("html").attr("dir")&&(e.rtl=!0),m.vars=b.extend({},b.flexslider.defaults,e);var t,c=m.vars.namespace,f=window.navigator&&window.navigator.msPointerEnabled&&window.MSGesture,u=("ontouchstart"in window||f||window.DocumentTouch&&document instanceof DocumentTouch)&&m.vars.touch,o="click touchend MSPointerUp keyup",l="",g="vertical"===m.vars.direction,h=m.vars.reverse,S=0'),1 ":''+n+" ","thumbnails"===m.vars.controlNav&&!0===m.vars.thumbCaptions){var s=t.attr("data-thumbcaption");""!==s&&undefined!==s&&(e+=''+s+" ")}m.controlNavScaffold.append(""+e+" "),n++}m.controlsContainer?b(m.controlsContainer).append(m.controlNavScaffold):m.append(m.controlNavScaffold),y.controlNav.set(),y.controlNav.active(),m.controlNavScaffold.delegate("a, img",o,function(e){if(e.preventDefault(),""===l||l===e.type){var t=b(this),a=m.controlNav.index(t);t.hasClass(c+"active")||(m.direction=a>m.currentSlide?"next":"prev",m.flexAnimate(a,m.vars.pauseOnAction))}""===l&&(l=e.type),y.setToClearWatchedEvent()})},setupManual:function(){m.controlNav=m.manualControls,y.controlNav.active(),m.controlNav.bind(o,function(e){if(e.preventDefault(),""===l||l===e.type){var t=b(this),a=m.controlNav.index(t);t.hasClass(c+"active")||(a>m.currentSlide?m.direction="next":m.direction="prev",m.flexAnimate(a,m.vars.pauseOnAction))}""===l&&(l=e.type),y.setToClearWatchedEvent()})},set:function(){var e="thumbnails"===m.vars.controlNav?"img":"a";m.controlNav=b("."+c+"control-nav li "+e,m.controlsContainer?m.controlsContainer:m)},active:function(){m.controlNav.removeClass(c+"active").eq(m.animatingTo).addClass(c+"active")},update:function(e,t){1'+m.count+" ")):1===m.pagingCount?m.controlNavScaffold.find("li").remove():m.controlNav.eq(t).closest("li").remove(),y.controlNav.set(),1'+m.vars.prevText+' '+m.vars.nextText+" ");m.customDirectionNav?m.directionNav=m.customDirectionNav:m.controlsContainer?(b(m.controlsContainer).append(e),m.directionNav=b("."+c+"direction-nav li a",m.controlsContainer)):(m.append(e),m.directionNav=b("."+c+"direction-nav li a",m)),y.directionNav.update(),m.directionNav.bind(o,function(e){var t;e.preventDefault(),""!==l&&l!==e.type||(t=b(this).hasClass(c+"next")?m.getTarget("next"):m.getTarget("prev"),m.flexAnimate(t,m.vars.pauseOnAction)),""===l&&(l=e.type),y.setToClearWatchedEvent()})},update:function(){var e=c+"disabled";1===m.pagingCount?m.directionNav.addClass(e).attr("tabindex","-1"):m.vars.animationLoop?m.directionNav.removeClass(e).removeAttr("tabindex"):0===m.animatingTo?m.directionNav.removeClass(e).filter("."+c+"prev").addClass(e).attr("tabindex","-1"):m.animatingTo===m.last?m.directionNav.removeClass(e).filter("."+c+"next").addClass(e).attr("tabindex","-1"):m.directionNav.removeClass(e).removeAttr("tabindex")}},pausePlay:{setup:function(){var e=b('');m.controlsContainer?(m.controlsContainer.append(e),m.pausePlay=b("."+c+"pauseplay a",m.controlsContainer)):(m.append(e),m.pausePlay=b("."+c+"pauseplay a",m)),y.pausePlay.update(m.vars.slideshow?c+"pause":c+"play"),m.pausePlay.bind(o,function(e){e.preventDefault(),""!==l&&l!==e.type||(b(this).hasClass(c+"pause")?(m.manualPause=!0,m.manualPlay=!1,m.pause()):(m.manualPause=!1,m.manualPlay=!0,m.play())),""===l&&(l=e.type),y.setToClearWatchedEvent()})},update:function(e){"play"===e?m.pausePlay.removeClass(c+"pause").addClass(c+"play").html(m.vars.playText):m.pausePlay.removeClass(c+"play").addClass(c+"pause").html(m.vars.pauseText)}},touch:function(){var i,r,s,o,l,d,e,n,c,u=!1,t=0,a=0,v=0;if(f){p.style.msTouchAction="none",p._gesture=new MSGesture,(p._gesture.target=p).addEventListener("MSPointerDown",function(e){e.stopPropagation(),m.animating?e.preventDefault():(m.pause(),p._gesture.addPointer(e.pointerId),v=0,o=g?m.h:m.w,d=Number(new Date),s=S&&h&&m.animatingTo===m.last?0:S&&h?m.limit-(m.itemW+m.vars.itemMargin)*m.move*m.animatingTo:S&&m.currentSlide===m.last?m.limit:S?(m.itemW+m.vars.itemMargin)*m.move*m.currentSlide:h?(m.last-m.currentSlide+m.cloneOffset)*o:(m.currentSlide+m.cloneOffset)*o)},!1),p._slider=m,p.addEventListener("MSGestureChange",function(e){e.stopPropagation();var t=e.target._slider;if(!t)return;var a=-e.translationX,n=-e.translationY;if(v+=g?n:a,l=(t.vars.rtl?-1:1)*v,u=g?Math.abs(v)o/2)?t.flexAnimate(n,t.vars.pauseOnAction):x||t.flexAnimate(t.currentSlide,t.vars.pauseOnAction,!0)}s=l=r=i=null,v=0},!1)}else e=function(e){m.animating?e.preventDefault():(window.navigator.msPointerEnabled||1===e.touches.length)&&(m.pause(),o=g?m.h:m.w,d=Number(new Date),t=e.touches[0].pageX,a=e.touches[0].pageY,s=S&&h&&m.animatingTo===m.last?0:S&&h?m.limit-(m.itemW+m.vars.itemMargin)*m.move*m.animatingTo:S&&m.currentSlide===m.last?m.limit:S?(m.itemW+m.vars.itemMargin)*m.move*m.currentSlide:h?(m.last-m.currentSlide+m.cloneOffset)*o:(m.currentSlide+m.cloneOffset)*o,i=g?a:t,r=g?t:a,p.addEventListener("touchmove",n,!1),p.addEventListener("touchend",c,!1))},n=function(e){t=e.touches[0].pageX,a=e.touches[0].pageY,l=g?i-a:(m.vars.rtl?-1:1)*(i-t);(!(u=g?Math.abs(l)o/2)?m.flexAnimate(a,m.vars.pauseOnAction):x||m.flexAnimate(m.currentSlide,m.vars.pauseOnAction,!0)}p.removeEventListener("touchend",c,!1),s=l=r=i=null},p.addEventListener("touchstart",e,!1)},resize:function(){!m.animating&&m.is(":visible")&&(S||m.doMath(),x?y.smoothHeight():S?(m.slides.width(m.computedW),m.update(m.pagingCount),m.setProps()):g?(m.viewport.height(m.h),m.setProps(m.h,"setTotal")):(m.vars.smoothHeight&&y.smoothHeight(),m.newSlides.width(m.computedW),m.setProps(m.computedW,"setTotal")))},smoothHeight:function(e){if(!g||x){var t=x?m:m.viewport;e?t.animate({height:m.slides.eq(m.animatingTo).innerHeight()},e):t.innerHeight(m.slides.eq(m.animatingTo).innerHeight())}},sync:function(e){var t=b(m.vars.sync).data("flexslider"),a=m.animatingTo;switch(e){case"animate":t.flexAnimate(a,m.vars.pauseOnAction,!1,!0);break;case"play":t.playing||t.asNav||t.play();break;case"pause":t.pause()}},uniqueID:function(e){return e.filter("[id]").add(e.find("[id]")).each(function(){var e=b(this);e.attr("id",e.attr("id")+"_clone")}),e},pauseInvisible:{visProp:null,init:function(){var e=y.pauseInvisible.getHiddenProp();if(e){var t=e.replace(/[H|h]idden/,"")+"visibilitychange";document.addEventListener(t,function(){y.pauseInvisible.isHidden()?m.startTimeout?clearTimeout(m.startTimeout):m.pause():m.started?m.play():0m.currentSlide?"next":"prev"),v&&1===m.pagingCount&&(m.direction=m.currentItemm.limit&&1!==m.visible?m.limit:l):o=0===m.currentSlide&&e===m.count-1&&m.vars.animationLoop&&"next"!==m.direction?h?(m.count+m.cloneOffset)*d:0:m.currentSlide===m.last&&0===e&&m.vars.animationLoop&&"prev"!==m.direction?h?0:(m.count+1)*d:h?(m.count-1-e+m.cloneOffset)*d:(e+m.cloneOffset)*d,m.setProps(o,"",m.vars.animationSpeed),m.transitions?(m.vars.animationLoop&&m.atEnd||(m.animating=!1,m.currentSlide=m.animatingTo),m.container.unbind("webkitTransitionEnd transitionend"),m.container.bind("webkitTransitionEnd transitionend",function(){clearTimeout(m.ensureAnimationEnd),m.wrapup(d)}),clearTimeout(m.ensureAnimationEnd),m.ensureAnimationEnd=setTimeout(function(){m.wrapup(d)},m.vars.animationSpeed+100)):m.container.animate(m.args,m.vars.animationSpeed,m.vars.easing,function(){m.wrapup(d)})}m.vars.smoothHeight&&y.smoothHeight(m.vars.animationSpeed)}},m.wrapup=function(e){x||S||(0===m.currentSlide&&m.animatingTo===m.last&&m.vars.animationLoop?m.setProps(e,"jumpEnd"):m.currentSlide===m.last&&0===m.animatingTo&&m.vars.animationLoop&&m.setProps(e,"jumpStart")),m.animating=!1,m.currentSlide=m.animatingTo,m.vars.after(m)},m.animateSlides=function(){!m.animating&&a&&m.flexAnimate(m.getTarget("next"))},m.pause=function(){clearInterval(m.animatedSlides),m.animatedSlides=null,m.playing=!1,m.vars.pausePlay&&y.pausePlay.update("play"),m.syncExists&&y.sync("pause")},m.play=function(){m.playing&&clearInterval(m.animatedSlides),m.animatedSlides=m.animatedSlides||setInterval(m.animateSlides,m.vars.slideshowSpeed),m.started=m.playing=!0,m.vars.pausePlay&&y.pausePlay.update("pause"),m.syncExists&&y.sync("play")},m.stop=function(){m.pause(),m.stopped=!0},m.canAdvance=function(e,t){var a=v?m.pagingCount-1:m.last;return!!t||(!(!v||m.currentItem!==m.count-1||0!==e||"prev"!==m.direction)||(!v||0!==m.currentItem||e!==m.pagingCount-1||"next"===m.direction)&&(!(e===m.currentSlide&&!v)&&(!!m.vars.animationLoop||(!m.atEnd||0!==m.currentSlide||e!==a||"next"===m.direction)&&(!m.atEnd||m.currentSlide!==a||0!==e||"next"!==m.direction))))},m.getTarget=function(e){return"next"===(m.direction=e)?m.currentSlide===m.last?0:m.currentSlide+1:0===m.currentSlide?m.last:m.currentSlide-1},m.setProps=function(e,t,a){var n,i=(n=e||(m.itemW+m.vars.itemMargin)*m.move*m.animatingTo,function(){if(S)return"setTouch"===t?e:h&&m.animatingTo===m.last?0:h?m.limit-(m.itemW+m.vars.itemMargin)*m.move*m.animatingTo:m.animatingTo===m.last?m.limit:n;switch(t){case"setTotal":return h?(m.count-1-m.currentSlide+m.cloneOffset)*e:(m.currentSlide+m.cloneOffset)*e;case"setTouch":return e;case"jumpEnd":return h?e:m.count*e;case"jumpStart":return h?m.count*e:e;default:return e}}()*(m.vars.rtl?1:-1)+"px");m.transitions&&(i=g?"translate3d(0,"+i+",0)":"translate3d("+parseInt(i)+"px,0,0)",a=a!==undefined?a/1e3+"s":"0s",m.container.css("-"+m.pfx+"-transition-duration",a),m.container.css("transition-duration",a)),m.args[m.prop]=i,(m.transitions||a===undefined)&&m.container.css(m.args),m.container.css("transform",i)},m.setup=function(e){var t,a;x?(m.vars.rtl?m.slides.css({width:"100%","float":"right",marginLeft:"-100%",position:"relative"}):m.slides.css({width:"100%","float":"left",marginRight:"-100%",position:"relative"}),"init"===e&&(u?m.slides.css({opacity:0,display:"block",webkitTransition:"opacity "+m.vars.animationSpeed/1e3+"s ease",zIndex:1}).eq(m.currentSlide).css({opacity:1,zIndex:2}):0==m.vars.fadeFirstSlide?m.slides.css({opacity:0,display:"block",zIndex:1}).eq(m.currentSlide).css({zIndex:2}).css({opacity:1}):m.slides.css({opacity:0,display:"block",zIndex:1}).eq(m.currentSlide).css({zIndex:2}).animate({opacity:1},m.vars.animationSpeed,m.vars.easing)),m.vars.smoothHeight&&y.smoothHeight()):("init"===e&&(m.viewport=b('
').css({overflow:"hidden",position:"relative"}).appendTo(m).append(m.container),m.cloneCount=0,m.cloneOffset=0,h&&(a=b.makeArray(m.slides).reverse(),m.slides=b(a),m.container.empty().append(m.slides))),m.vars.animationLoop&&!S&&(m.cloneCount=2,m.cloneOffset=1,"init"!==e&&m.container.find(".clone").remove(),m.container.append(y.uniqueID(m.slides.first().clone().addClass("clone")).attr("aria-hidden","true")).prepend(y.uniqueID(m.slides.last().clone().addClass("clone")).attr("aria-hidden","true"))),m.newSlides=b(m.vars.selector,m),t=h?m.count-1-m.currentSlide+m.cloneOffset:m.currentSlide+m.cloneOffset,g&&!S?(m.container.height(200*(m.count+m.cloneCount)+"%").css("position","absolute").width("100%"),setTimeout(function(){m.newSlides.css({display:"block"}),m.doMath(),m.viewport.height(m.h),m.setProps(t*m.h,"init")},"init"===e?100:0)):(m.container.width(200*(m.count+m.cloneCount)+"%"),m.setProps(t*m.computedW,"init"),setTimeout(function(){m.doMath(),m.vars.rtl?m.newSlides.css({width:m.computedW,marginRight:m.computedM,"float":"right",display:"block"}):m.newSlides.css({width:m.computedW,marginRight:m.computedM,"float":"left",display:"block"}),m.vars.smoothHeight&&y.smoothHeight()},"init"===e?100:0)));S||m.slides.removeClass(c+"active-slide").eq(m.currentSlide).addClass(c+"active-slide"),m.vars.init(m)},m.doMath=function(){var e=m.slides.first(),t=m.vars.itemMargin,a=m.vars.minItems,n=m.vars.maxItems;m.w=m.viewport===undefined?m.width():m.viewport.width(),m.isFirefox&&(m.w=m.width()),m.h=e.height(),m.boxPadding=e.outerWidth()-e.width(),S?(m.itemT=m.vars.itemWidth+t,m.itemM=t,m.minW=a?a*m.itemT:m.w,m.maxW=n?n*m.itemT-t:m.w,m.itemW=m.minW>m.w?(m.w-t*(a-1))/a:m.maxWm.w?m.w:m.vars.itemWidth,m.visible=Math.floor(m.w/m.itemW),m.move=0m.w?m.itemW*(m.count-1)+t*(m.count-1):(m.itemW+t)*m.count-m.w-t):(m.itemW=m.w,m.itemM=t,m.pagingCount=m.count,m.last=m.count-1),m.computedW=m.itemW-m.boxPadding,m.computedM=m.itemM},m.update=function(e,t){m.doMath(),S||(em.controlNav.length?y.controlNav.update("add"):("remove"===t&&!S||m.pagingCountm.last&&(m.currentSlide-=1,m.animatingTo-=1),y.controlNav.update("remove",m.last))),m.vars.directionNav&&y.directionNav.update()},m.addSlide=function(e,t){var a=b(e);m.count+=1,m.last=m.count-1,g&&h?t!==undefined?m.slides.eq(m.count-t).after(a):m.container.prepend(a):t!==undefined?m.slides.eq(t).before(a):m.container.append(a),m.update(t,"add"),m.slides=b(m.vars.selector+":not(.clone)",m),m.setup(),m.vars.added(m)},m.removeSlide=function(e){var t=isNaN(e)?m.slides.index(b(e)):e;m.count-=1,m.last=m.count-1,isNaN(e)?b(e,m.slides).remove():g&&h?m.slides.eq(m.last).remove():m.slides.eq(e).remove(),m.doMath(),m.update(t,"remove"),m.slides=b(m.vars.selector+":not(.clone)",m),m.setup(),m.vars.removed(m)},y.init()},b(window).blur(function(e){a=!1}).focus(function(e){a=!0}),b.flexslider.defaults={namespace:"flex-",selector:".slides > li",animation:"fade",easing:"swing",direction:"horizontal",reverse:!1,animationLoop:!0,smoothHeight:!1,startAt:0,slideshow:!0,slideshowSpeed:7e3,animationSpeed:600,initDelay:0,randomize:!1,fadeFirstSlide:!0,thumbCaptions:!1,pauseOnAction:!0,pauseOnHover:!1,pauseInvisible:!0,useCSS:!0,touch:!0,video:!1,controlNav:!0,directionNav:!0,prevText:"Previous",nextText:"Next",keyboard:!0,multipleKeyboard:!1,mousewheel:!1,pausePlay:!1,pauseText:"Pause",playText:"Play",controlsContainer:"",manualControls:"",customDirectionNav:"",sync:"",asNavFor:"",itemWidth:0,itemMargin:0,minItems:1,maxItems:0,move:0,allowOneSlide:!0,isFirefox:!1,start:function(){},before:function(){},after:function(){},end:function(){},added:function(){},removed:function(){},init:function(){},rtl:!1},b.fn.flexslider=function(n){if(n===undefined&&(n={}),"object"==typeof n)return this.each(function(){var e=b(this),t=n.selector?n.selector:".slides > li",a=e.find(t);1===a.length&&!1===n.allowOneSlide||0===a.length?(a.fadeIn(400),n.start&&n.start(e)):e.data("flexslider")===undefined&&new b.flexslider(this,n)});var e=b(this).data("flexslider");switch(n){case"play":e.play();break;case"pause":e.pause();break;case"stop":e.stop();break;case"next":e.flexAnimate(e.getTarget("next"),!0);break;case"prev":case"previous":e.flexAnimate(e.getTarget("prev"),!0);break;default:"number"==typeof n&&e.flexAnimate(n,!0)}}}(jQuery);
\ No newline at end of file
diff --git a/assets/js/frontend/add-payment-method.min.js b/assets/js/frontend/add-payment-method.min.js
index 6cd2eaf9233..0a0c23e3213 100644
--- a/assets/js/frontend/add-payment-method.min.js
+++ b/assets/js/frontend/add-payment-method.min.js
@@ -1 +1 @@
-jQuery(function(e){if("undefined"==typeof woocommerce_params)return!1;e("#add_payment_method").on("click init_add_payment_method",".payment_methods input.input-radio",function(){if(e(".payment_methods input.input-radio").length>1){var t=e("div.payment_box."+e(this).attr("ID"));e(this).is(":checked")&&!t.is(":visible")&&(e("div.payment_box").filter(":visible").slideUp(250),e(this).is(":checked")&&e("div.payment_box."+e(this).attr("ID")).slideDown(250))}else e("div.payment_box").show()}).find("input[name=payment_method]:checked").click(),e("#add_payment_method").submit(function(){e("#add_payment_method").block({message:null,overlayCSS:{background:"#fff",opacity:.6}})}),e(document.body).trigger("init_add_payment_method")});
\ No newline at end of file
+jQuery(function(t){if("undefined"==typeof woocommerce_params)return!1;t("#add_payment_method").on("click init_add_payment_method",".payment_methods input.input-radio",function(){if(1'+wc_add_to_cart_variation_params.i18n_no_matching_variations_text+""),i.$form.find(".wc-no-matching-variations").slideDown(200)))},complete:function(){i.$form.unblock()}});else{i.$form.trigger("update_variation_values");var o=i.findMatchingVariations(i.variationData,e).shift();o?i.$form.trigger("found_variation",[o]):(i.$form.trigger("reset_data"),r.chosenCount=0,i.loading||(i.$form.find(".single_variation").after(''+wc_add_to_cart_variation_params.i18n_no_matching_variations_text+"
"),i.$form.find(".wc-no-matching-variations").slideDown(200)))}else i.$form.trigger("update_variation_values"),i.$form.trigger("reset_data");i.toggleResetLink(r.chosenCount>0)},e.prototype.onFoundVariation=function(a,i){var r=a.data.variationForm,e=r.$product.find(".product_meta").find(".sku"),n=r.$product.find(".product_weight"),s=r.$product.find(".product_dimensions"),_=r.$singleVariationWrap.find(".quantity"),c=!0,d=!1,m="";i.sku?e.wc_set_content(i.sku):e.wc_reset_content(),i.weight?n.wc_set_content(i.weight_html):n.wc_reset_content(),i.dimensions?s.wc_set_content(i.dimensions_html):s.wc_reset_content(),r.$form.wc_variations_image_update(i),i.variation_is_visible?(d=o("variation-template"),i.variation_id):d=o("unavailable-variation-template"),m=(m=(m=d({variation:i})).replace("/**/",""),r.$singleVariation.html(m),r.$form.find('input[name="variation_id"], input.variation_id').val(i.variation_id).change(),"yes"===i.is_sold_individually?(_.find("input.qty").val("1").attr("min","1").attr("max",""),_.hide()):(_.find("input.qty").attr("min",i.min_qty).attr("max",i.max_qty),_.show()),i.is_purchasable&&i.is_in_stock&&i.variation_is_visible||(c=!1),t.trim(r.$singleVariation.text())?r.$singleVariation.slideDown(200).trigger("show_variation",[i,c]):r.$singleVariation.show().trigger("show_variation",[i,c])},e.prototype.onChange=function(a){var i=a.data.variationForm;i.$form.find('input[name="variation_id"], input.variation_id').val("").change(),i.$form.find(".wc-no-matching-variations").remove(),i.useAjax?i.$form.trigger("check_variations"):(i.$form.trigger("woocommerce_variation_select_change"),i.$form.trigger("check_variations"),t(this).blur()),i.$form.trigger("woocommerce_variation_has_changed")},e.prototype.addSlashes=function(t){return t=t.replace(/'/g,"\\'"),t=t.replace(/"/g,'\\"')},e.prototype.onUpdateAttributes=function(a){var i=a.data.variationForm,r=i.getChosenAttributes().data;i.useAjax||(i.$attributeFields.each(function(a,e){var o=t(e),n=o.data("attribute_name")||o.attr("name"),s=t(e).data("show_option_none"),_=":gt(0)",c=0,d=t(" "),m=o.val()||"",v=!0;if(!o.data("attribute_html")){var l=o.clone();l.find("option").removeAttr("disabled attached").removeAttr("selected"),o.data("attribute_options",l.find("option"+_).get()),o.data("attribute_html",l.html())}d.html(o.data("attribute_html"));var g=t.extend(!0,{},r);g[n]="";var f=i.findMatchingVariations(i.variationData,g);for(var u in f)if("undefined"!=typeof f[u]){var h=f[u].attributes;for(var p in h)if(h.hasOwnProperty(p)){var w=h[p],b="";p===n&&(f[u].variation_is_active&&(b="enabled"),w?(w=t("
").html(w).text(),d.find('option[value="'+i.addSlashes(w)+'"]').addClass("attached "+b)):d.find("option:gt(0)").addClass("attached "+b))}}c=d.find("option.attached").length,!m||0!==c&&0!==d.find('option.attached.enabled[value="'+i.addSlashes(m)+'"]').length||(v=!1),c>0&&m&&v&&"no"===s&&(d.find("option:first").remove(),_=""),d.find("option"+_+":not(.attached)").remove(),o.html(d.html()),o.find("option"+_+":not(.enabled)").prop("disabled",!0),m?v?o.val(m):o.val("").change():o.val("")}),i.$form.trigger("woocommerce_update_variation_values"))},e.prototype.getChosenAttributes=function(){var a={},i=0,r=0;return this.$attributeFields.each(function(){var e=t(this).data("attribute_name")||t(this).attr("name"),o=t(this).val()||"";o.length>0&&r++,i++,a[e]=o}),{count:i,chosenCount:r,data:a}},e.prototype.findMatchingVariations=function(t,a){for(var i=[],r=0;r1){n.find('li img[data-o_src="'+i.image.gallery_thumbnail_src+'"]').length>0&&r.wc_variations_image_reset();var m=n.find('li img[src="'+i.image.gallery_thumbnail_src+'"]');if(m.length>0)return m.trigger("click"),r.attr("current-image",i.image_id),void a.setTimeout(function(){t(a).trigger("resize"),o.trigger("woocommerce_gallery_init_zoom")},20);c.wc_set_variation_attr("src",i.image.src),c.wc_set_variation_attr("height",i.image.src_h),c.wc_set_variation_attr("width",i.image.src_w),c.wc_set_variation_attr("srcset",i.image.srcset),c.wc_set_variation_attr("sizes",i.image.sizes),c.wc_set_variation_attr("title",i.image.title),c.wc_set_variation_attr("alt",i.image.alt),c.wc_set_variation_attr("data-src",i.image.full_src),c.wc_set_variation_attr("data-large_image",i.image.full_src),c.wc_set_variation_attr("data-large_image_width",i.image.full_src_w),c.wc_set_variation_attr("data-large_image_height",i.image.full_src_h),_.wc_set_variation_attr("data-thumb",i.image.src),s.wc_set_variation_attr("src",i.image.gallery_thumbnail_src),d.wc_set_variation_attr("href",i.image.full_src)}else r.wc_variations_image_reset();a.setTimeout(function(){t(a).trigger("resize"),r.wc_maybe_trigger_slide_position_reset(i),o.trigger("woocommerce_gallery_init_zoom")},20)},t.fn.wc_variations_image_reset=function(){var t=this.closest(".product"),a=t.find(".images"),i=t.find(".flex-control-nav").find("li:eq(0) img"),r=a.find(".woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder").eq(0),e=r.find(".wp-post-image"),o=r.find("a").eq(0);e.wc_reset_variation_attr("src"),e.wc_reset_variation_attr("width"),e.wc_reset_variation_attr("height"),e.wc_reset_variation_attr("srcset"),e.wc_reset_variation_attr("sizes"),e.wc_reset_variation_attr("title"),e.wc_reset_variation_attr("alt"),e.wc_reset_variation_attr("data-src"),e.wc_reset_variation_attr("data-large_image"),e.wc_reset_variation_attr("data-large_image_width"),e.wc_reset_variation_attr("data-large_image_height"),r.wc_reset_variation_attr("data-thumb"),i.wc_reset_variation_attr("src"),o.wc_reset_variation_attr("href")},t(function(){"undefined"!=typeof wc_add_to_cart_variation_params&&t(".variations_form").each(function(){t(this).wc_variation_form()})});var o=function(t){var r=i.getElementById("tmpl-"+t).textContent,e=!1;return e=e||/<#\s?data\./.test(r),e=e||/{{{?\s?data\.(?!variation\.).+}}}?/.test(r),(e=e||/{{{?\s?data\.variation\.[\w-]*[^\s}]/.test(r))?wp.template(t):function(t){var i=t.variation||{};return r.replace(/({{{?)\s?data\.variation\.([\w-]*)\s?(}}}?)/g,function(t,r,e,o){if(r.length!==o.length)return"";var n=i[e]||"";return 2===r.length?a.escape(n):n})}}}(jQuery,window,document);
\ No newline at end of file
+!function(b,d,r,n){var t=function(t){var a=this;a.$form=t,a.$attributeFields=t.find(".variations select"),a.$singleVariation=t.find(".single_variation"),a.$singleVariationWrap=t.find(".single_variation_wrap"),a.$resetVariations=t.find(".reset_variations"),a.$product=t.closest(".product"),a.variationData=t.data("product_variations"),a.useAjax=!1===a.variationData,a.xhr=!1,a.loading=!0,a.$singleVariationWrap.show(),a.$form.off(".wc-variation-form"),a.getChosenAttributes=a.getChosenAttributes.bind(a),a.findMatchingVariations=a.findMatchingVariations.bind(a),a.isMatch=a.isMatch.bind(a),a.toggleResetLink=a.toggleResetLink.bind(a),t.on("click.wc-variation-form",".reset_variations",{variationForm:a},a.onReset),t.on("reload_product_variations",{variationForm:a},a.onReload),t.on("hide_variation",{variationForm:a},a.onHide),t.on("show_variation",{variationForm:a},a.onShow),t.on("click",".single_add_to_cart_button",{variationForm:a},a.onAddToCart),t.on("reset_data",{variationForm:a},a.onResetDisplayedVariation),t.on("reset_image",{variationForm:a},a.onResetImage),t.on("change.wc-variation-form",".variations select",{variationForm:a},a.onChange),t.on("found_variation.wc-variation-form",{variationForm:a},a.onFoundVariation),t.on("check_variations.wc-variation-form",{variationForm:a},a.onFindVariation),t.on("update_variation_values.wc-variation-form",{variationForm:a},a.onUpdateAttributes),setTimeout(function(){t.trigger("check_variations"),t.trigger("wc_variation_form"),a.loading=!1},100)};t.prototype.onReset=function(t){t.preventDefault(),t.data.variationForm.$attributeFields.val("").change(),t.data.variationForm.$form.trigger("reset_data")},t.prototype.onReload=function(t){var a=t.data.variationForm;a.variationData=a.$form.data("product_variations"),a.useAjax=!1===a.variationData,a.$form.trigger("check_variations")},t.prototype.onHide=function(t){t.preventDefault(),t.data.variationForm.$form.find(".single_add_to_cart_button").removeClass("wc-variation-is-unavailable").addClass("disabled wc-variation-selection-needed"),t.data.variationForm.$form.find(".woocommerce-variation-add-to-cart").removeClass("woocommerce-variation-add-to-cart-enabled").addClass("woocommerce-variation-add-to-cart-disabled")},t.prototype.onShow=function(t,a,i){t.preventDefault(),i?(t.data.variationForm.$form.find(".single_add_to_cart_button").removeClass("disabled wc-variation-selection-needed wc-variation-is-unavailable"),t.data.variationForm.$form.find(".woocommerce-variation-add-to-cart").removeClass("woocommerce-variation-add-to-cart-disabled").addClass("woocommerce-variation-add-to-cart-enabled")):(t.data.variationForm.$form.find(".single_add_to_cart_button").removeClass("wc-variation-selection-needed").addClass("disabled wc-variation-is-unavailable"),t.data.variationForm.$form.find(".woocommerce-variation-add-to-cart").removeClass("woocommerce-variation-add-to-cart-enabled").addClass("woocommerce-variation-add-to-cart-disabled"))},t.prototype.onAddToCart=function(t){b(this).is(".disabled")&&(t.preventDefault(),b(this).is(".wc-variation-is-unavailable")?d.alert(wc_add_to_cart_variation_params.i18n_unavailable_text):b(this).is(".wc-variation-selection-needed")&&d.alert(wc_add_to_cart_variation_params.i18n_make_a_selection_text))},t.prototype.onResetDisplayedVariation=function(t){var a=t.data.variationForm;a.$product.find(".product_meta").find(".sku").wc_reset_content(),a.$product.find(".product_weight").wc_reset_content(),a.$product.find(".product_dimensions").wc_reset_content(),a.$form.trigger("reset_image"),a.$singleVariation.slideUp(200).trigger("hide_variation")},t.prototype.onResetImage=function(t){t.data.variationForm.$form.wc_variations_image_update(!1)},t.prototype.onFindVariation=function(t){var a=t.data.variationForm,i=a.getChosenAttributes(),r=i.data;if(i.count===i.chosenCount)if(a.useAjax)a.xhr&&a.xhr.abort(),a.$form.block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),r.product_id=parseInt(a.$form.data("product_id"),10),r.custom_data=a.$form.data("custom_data"),a.xhr=b.ajax({url:wc_add_to_cart_variation_params.wc_ajax_url.toString().replace("%%endpoint%%","get_variation"),type:"POST",data:r,success:function(t){t?a.$form.trigger("found_variation",[t]):(a.$form.trigger("reset_data"),i.chosenCount=0,a.loading||(a.$form.find(".single_variation").after(''+wc_add_to_cart_variation_params.i18n_no_matching_variations_text+"
"),a.$form.find(".wc-no-matching-variations").slideDown(200)))},complete:function(){a.$form.unblock()}});else{a.$form.trigger("update_variation_values");var e=a.findMatchingVariations(a.variationData,r).shift();e?a.$form.trigger("found_variation",[e]):(a.$form.trigger("reset_data"),i.chosenCount=0,a.loading||(a.$form.find(".single_variation").after(''+wc_add_to_cart_variation_params.i18n_no_matching_variations_text+"
"),a.$form.find(".wc-no-matching-variations").slideDown(200)))}else a.$form.trigger("update_variation_values"),a.$form.trigger("reset_data");a.toggleResetLink(0*/",""),i.$singleVariation.html(c),i.$form.find('input[name="variation_id"], input.variation_id').val(a.variation_id).change(),"yes"===a.is_sold_individually?(n.find("input.qty").val("1").attr("min","1").attr("max",""),n.hide()):(n.find("input.qty").attr("min",a.min_qty).attr("max",a.max_qty),n.show()),a.is_purchasable&&a.is_in_stock&&a.variation_is_visible||(s=!1),b.trim(i.$singleVariation.text())?i.$singleVariation.slideDown(200).trigger("show_variation",[a,s]):i.$singleVariation.show().trigger("show_variation",[a,s])},t.prototype.onChange=function(t){var a=t.data.variationForm;a.$form.find('input[name="variation_id"], input.variation_id').val("").change(),a.$form.find(".wc-no-matching-variations").remove(),a.useAjax?a.$form.trigger("check_variations"):(a.$form.trigger("woocommerce_variation_select_change"),a.$form.trigger("check_variations"),b(this).blur()),a.$form.trigger("woocommerce_variation_has_changed")},t.prototype.addSlashes=function(t){return t=(t=t.replace(/'/g,"\\'")).replace(/"/g,'\\"')},t.prototype.onUpdateAttributes=function(t){var p=t.data.variationForm,w=p.getChosenAttributes().data;p.useAjax||(p.$attributeFields.each(function(t,a){var i,r=b(a),e=r.data("attribute_name")||r.attr("name"),o=b(a).data("show_option_none"),n=":gt(0)",s=b(" "),_=r.val()||"",c=!0;if(!r.data("attribute_html")){var d=r.clone();d.find("option").removeAttr("disabled attached").removeAttr("selected"),r.data("attribute_options",d.find("option"+n).get()),r.data("attribute_html",d.html())}s.html(r.data("attribute_html"));var m=b.extend(!0,{},w);m[e]="";var v=p.findMatchingVariations(p.variationData,m);for(var l in v)if("undefined"!=typeof v[l]){var g=v[l].attributes;for(var f in g)if(g.hasOwnProperty(f)){var u=g[f],h="";f===e&&(v[l].variation_is_active&&(h="enabled"),u?(u=b("
").html(u).text(),s.find('option[value="'+p.addSlashes(u)+'"]').addClass("attached "+h)):s.find("option:gt(0)").addClass("attached "+h))}}i=s.find("option.attached").length,!_||0!==i&&0!==s.find('option.attached.enabled[value="'+p.addSlashes(_)+'"]').length||(c=!1),0'+wc_add_to_cart_params.i18n_view_cart+" "),t(document.body).trigger("wc_cart_button_updated",[e]))},a.prototype.updateCartPage=function(){var a=window.location.toString().replace("add-to-cart","added-to-cart");t(".shop_table.cart").load(a+" .shop_table.cart:eq(0) > *",function(){t(".shop_table.cart").stop(!0).css("opacity","1").unblock(),t(document.body).trigger("cart_page_refreshed")}),t(".cart_totals").load(a+" .cart_totals:eq(0) > *",function(){t(".cart_totals").stop(!0).css("opacity","1").unblock(),t(document.body).trigger("cart_totals_refreshed")})},a.prototype.updateFragments=function(a,o){o&&(t.each(o,function(a){t(a).addClass("updating").fadeTo("400","0.6").block({message:null,overlayCSS:{opacity:.6}})}),t.each(o,function(a,o){t(a).replaceWith(o),t(a).stop(!0).css("opacity","1").unblock()}),t(document.body).trigger("wc_fragments_loaded"))},new a});
\ No newline at end of file
+jQuery(function(e){if("undefined"==typeof wc_add_to_cart_params)return!1;var t=function(){e(document.body).on("click",".add_to_cart_button",this.onAddToCart).on("click",".remove_from_cart_button",this.onRemoveFromCart).on("added_to_cart",this.updateButton).on("added_to_cart",this.updateCartPage).on("added_to_cart removed_from_cart",this.updateFragments)};t.prototype.onAddToCart=function(t){var a=e(this);if(a.is(".ajax_add_to_cart")){if(!a.attr("data-product_id"))return!0;t.preventDefault(),a.removeClass("added"),a.addClass("loading");var o={};e.each(a.data(),function(t,a){o[t]=a}),e(document.body).trigger("adding_to_cart",[a,o]),e.post(wc_add_to_cart_params.wc_ajax_url.toString().replace("%%endpoint%%","add_to_cart"),o,function(t){t&&(t.error&&t.product_url?window.location=t.product_url:"yes"!==wc_add_to_cart_params.cart_redirect_after_add?e(document.body).trigger("added_to_cart",[t.fragments,t.cart_hash,a]):window.location=wc_add_to_cart_params.cart_url)})}},t.prototype.onRemoveFromCart=function(t){var a=e(this),o=a.closest(".woocommerce-mini-cart-item");t.preventDefault(),o.block({message:null,overlayCSS:{opacity:.6}}),e.post(wc_add_to_cart_params.wc_ajax_url.toString().replace("%%endpoint%%","remove_from_cart"),{cart_item_key:a.data("cart_item_key")},function(t){t&&t.fragments?e(document.body).trigger("removed_from_cart",[t.fragments,t.cart_hash,a]):window.location=a.attr("href")}).fail(function(){window.location=a.attr("href")})},t.prototype.updateButton=function(t,a,o,r){(r=void 0!==r&&r)&&(r.removeClass("loading"),r.addClass("added"),wc_add_to_cart_params.is_cart||0!==r.parent().find(".added_to_cart").length||r.after(' '+wc_add_to_cart_params.i18n_view_cart+" "),e(document.body).trigger("wc_cart_button_updated",[r]))},t.prototype.updateCartPage=function(){var t=window.location.toString().replace("add-to-cart","added-to-cart");e(".shop_table.cart").load(t+" .shop_table.cart:eq(0) > *",function(){e(".shop_table.cart").stop(!0).css("opacity","1").unblock(),e(document.body).trigger("cart_page_refreshed")}),e(".cart_totals").load(t+" .cart_totals:eq(0) > *",function(){e(".cart_totals").stop(!0).css("opacity","1").unblock(),e(document.body).trigger("cart_totals_refreshed")})},t.prototype.updateFragments=function(t,a){a&&(e.each(a,function(t){e(t).addClass("updating").fadeTo("400","0.6").block({message:null,overlayCSS:{opacity:.6}})}),e.each(a,function(t,a){e(t).replaceWith(a),e(t).stop(!0).css("opacity","1").unblock()}),e(document.body).trigger("wc_fragments_loaded"))},new t});
\ No newline at end of file
diff --git a/assets/js/frontend/address-i18n.js b/assets/js/frontend/address-i18n.js
index 04167773568..d50c149cd74 100644
--- a/assets/js/frontend/address-i18n.js
+++ b/assets/js/frontend/address-i18n.js
@@ -1,132 +1,128 @@
/*global wc_address_i18n_params */
jQuery( function( $ ) {
- // wc_address_i18n_params is required to continue, ensure the object exists
- if ( typeof wc_address_i18n_params === 'undefined' ) {
- return false;
+ // wc_address_i18n_params is required to continue, ensure the object exists
+ if ( typeof wc_address_i18n_params === 'undefined' ) {
+ return false;
+ }
+
+ var locale_json = wc_address_i18n_params.locale.replace( /"/g, '"' ), locale = $.parseJSON( locale_json );
+
+ function field_is_required( field, is_required ) {
+ if ( is_required ) {
+ field.find( 'label .optional' ).remove();
+ field.addClass( 'validate-required' );
+
+ if ( field.find( 'label .required' ).length === 0 ) {
+ field.find( 'label' ).append( ' * ' );
+ }
+ } else {
+ field.find( 'label .required' ).remove();
+ field.removeClass( 'validate-required' );
+
+ if ( field.find( 'label .optional' ).length === 0 ) {
+ field.find( 'label' ).append( ' (' + wc_address_i18n_params.i18n_optional_text + ') ' );
+ }
+ }
+ }
+
+ // Handle locale
+ $( document.body ).bind( 'country_to_state_changing', function( event, country, wrapper ) {
+ var thisform = wrapper, thislocale;
+
+ if ( typeof locale[ country ] !== 'undefined' ) {
+ thislocale = locale[ country ];
+ } else {
+ thislocale = locale['default'];
}
- var locale_json = wc_address_i18n_params.locale.replace( /"/g, '"' ),
- locale = $.parseJSON( locale_json );
+ var $postcodefield = thisform.find( '#billing_postcode_field, #shipping_postcode_field' ),
+ $cityfield = thisform.find( '#billing_city_field, #shipping_city_field' ),
+ $statefield = thisform.find( '#billing_state_field, #shipping_state_field' );
- function field_is_required( field, is_required ) {
- if ( is_required ) {
- field.find( 'label .optional' ).remove();
- field.addClass( 'validate-required' );
+ if ( ! $postcodefield.attr( 'data-o_class' ) ) {
+ $postcodefield.attr( 'data-o_class', $postcodefield.attr( 'class' ) );
+ $cityfield.attr( 'data-o_class', $cityfield.attr( 'class' ) );
+ $statefield.attr( 'data-o_class', $statefield.attr( 'class' ) );
+ }
- if ( field.find( 'label .required' ).length === 0 ) {
- field.find( 'label' ).append( ' * ' );
- }
- } else {
- field.find( 'label .required' ).remove();
- field.removeClass( 'validate-required' );
+ var locale_fields = $.parseJSON( wc_address_i18n_params.locale_fields );
- if ( field.find( 'label .optional' ).length === 0 ) {
- field.find( 'label' ).append( ' (' + wc_address_i18n_params.i18n_optional_text + ') ' );
- }
- }
+ $.each( locale_fields, function( key, value ) {
+
+ var field = thisform.find( value ),
+ fieldLocale = $.extend( true, {}, locale['default'][ key ], thislocale[ key ] );
+
+ // Labels.
+ if ( typeof fieldLocale.label !== 'undefined' ) {
+ field.find( 'label' ).html( fieldLocale.label );
}
- $( document.body )
+ // Placeholders.
+ if ( typeof fieldLocale.placeholder !== 'undefined' ) {
+ field.find( 'input' ).attr( 'placeholder', fieldLocale.placeholder );
+ field.find( '.select2-selection__placeholder' ).text( fieldLocale.placeholder );
+ }
- // Handle locale
- .bind( 'country_to_state_changing', function( event, country, wrapper ) {
+ // Use the i18n label as a placeholder if there is no label element and no i18n placeholder.
+ if ( typeof fieldLocale.placeholder === 'undefined' && typeof fieldLocale.label !== 'undefined' && ! field.find( 'label' ).length ) {
+ field.find( 'input' ).attr( 'placeholder', fieldLocale.label );
+ field.find( '.select2-selection__placeholder' ).text( fieldLocale.label );
+ }
- var thisform = wrapper, thislocale;
+ // Required.
+ if ( typeof fieldLocale.required !== 'undefined' ) {
+ field_is_required( field, fieldLocale.required );
+ } else {
+ field_is_required( field, false );
+ }
- if ( typeof locale[ country ] !== 'undefined' ) {
- thislocale = locale[ country ];
+ // Priority.
+ if ( typeof fieldLocale.priority !== 'undefined' ) {
+ field.data( 'priority', fieldLocale.priority );
+ }
+
+ // Hidden fields.
+ if ( 'state' !== key ) {
+ if ( typeof fieldLocale.hidden !== 'undefined' && true === fieldLocale.hidden ) {
+ field.hide().find( 'input' ).val( '' );
} else {
- thislocale = locale['default'];
+ field.show();
}
+ }
+ });
- var $postcodefield = thisform.find( '#billing_postcode_field, #shipping_postcode_field' ),
- $cityfield = thisform.find( '#billing_city_field, #shipping_city_field' ),
- $statefield = thisform.find( '#billing_state_field, #shipping_state_field' );
+ var fieldsets = $('.woocommerce-billing-fields__field-wrapper, .woocommerce-shipping-fields__field-wrapper, .woocommerce-address-fields__field-wrapper, .woocommerce-additional-fields__field-wrapper .woocommerce-account-fields');
- if ( ! $postcodefield.attr( 'data-o_class' ) ) {
- $postcodefield.attr( 'data-o_class', $postcodefield.attr( 'class' ) );
- $cityfield.attr( 'data-o_class', $cityfield.attr( 'class' ) );
- $statefield.attr( 'data-o_class', $statefield.attr( 'class' ) );
+ fieldsets.each( function( index, fieldset ) {
+ var rows = $( fieldset ).find( '.form-row' );
+ var wrapper = rows.first().parent();
+
+ // Before sorting, ensure all fields have a priority for bW compatibility.
+ var last_priority = 0;
+
+ rows.each( function() {
+ if ( ! $( this ).data( 'priority' ) ) {
+ $( this ).data( 'priority', last_priority + 1 );
}
+ last_priority = $( this ).data( 'priority' );
+ } );
- var locale_fields = $.parseJSON( wc_address_i18n_params.locale_fields );
+ // Sort the fields.
+ rows.sort( function( a, b ) {
+ var asort = $( a ).data( 'priority' ),
+ bsort = $( b ).data( 'priority' );
- $.each( locale_fields, function( key, value ) {
-
- var field = thisform.find( value ),
- fieldLocale = $.extend( true, {}, locale['default'][ key ], thislocale[ key ] );
-
- // Labels.
- if ( typeof fieldLocale.label !== 'undefined' ) {
- field.find( 'label' ).html( fieldLocale.label );
- }
-
- // Placeholders.
- if ( typeof fieldLocale.placeholder !== 'undefined' ) {
- field.find( 'input' ).attr( 'placeholder', fieldLocale.placeholder );
- field.find( '.select2-selection__placeholder' ).text( fieldLocale.placeholder );
- }
-
- // Use the i18n label as a placeholder if there is no label element and no i18n placeholder.
- if ( typeof fieldLocale.placeholder === 'undefined' && typeof fieldLocale.label !== 'undefined' && ! field.find( 'label' ).length ) {
- field.find( 'input' ).attr( 'placeholder', fieldLocale.label );
- field.find( '.select2-selection__placeholder' ).text( fieldLocale.label );
- }
-
- // Required.
- if ( typeof fieldLocale.required !== 'undefined' ) {
- field_is_required( field, fieldLocale.required );
- } else {
- field_is_required( field, false );
- }
-
- // Priority.
- if ( typeof fieldLocale.priority !== 'undefined' ) {
- field.data( 'priority', fieldLocale.priority );
- }
-
- // Hidden fields.
- if ( 'state' !== key ) {
- if ( typeof fieldLocale.hidden !== 'undefined' && true === fieldLocale.hidden ) {
- field.hide().find( 'input' ).val( '' );
- } else {
- field.show();
- }
- }
- });
-
- var fieldsets = $('.woocommerce-billing-fields__field-wrapper, .woocommerce-shipping-fields__field-wrapper, .woocommerce-address-fields__field-wrapper, .woocommerce-additional-fields__field-wrapper .woocommerce-account-fields');
-
- fieldsets.each( function( index, fieldset ) {
- var rows = $( fieldset ).find( '.form-row' );
- var wrapper = rows.first().parent();
-
- // Before sorting, ensure all fields have a priority for bW compatibility.
- var last_priority = 0;
-
- rows.each( function() {
- if ( ! $( this ).data( 'priority' ) ) {
- $( this ).data( 'priority', last_priority + 1 );
- }
- last_priority = $( this ).data( 'priority' );
- } );
-
- // Sort the fields.
- rows.sort( function( a, b ) {
- var asort = $( a ).data( 'priority' ),
- bsort = $( b ).data( 'priority' );
-
- if ( asort > bsort ) {
- return 1;
- }
- if ( asort < bsort ) {
- return -1;
- }
- return 0;
- });
-
- rows.detach().appendTo( wrapper );
- } );
+ if ( asort > bsort ) {
+ return 1;
+ }
+ if ( asort < bsort ) {
+ return -1;
+ }
+ return 0;
});
+
+ rows.detach().appendTo( wrapper );
+ } );
});
+});
diff --git a/assets/js/frontend/address-i18n.min.js b/assets/js/frontend/address-i18n.min.js
index aa9ab469378..1ca574f184a 100644
--- a/assets/js/frontend/address-i18n.min.js
+++ b/assets/js/frontend/address-i18n.min.js
@@ -1 +1 @@
-jQuery(function(e){function a(e,a){a?(e.find("label .optional").remove(),e.addClass("validate-required"),0===e.find("label .required").length&&e.find("label").append(' * ')):(e.find("label .required").remove(),e.removeClass("validate-required"),0===e.find("label .optional").length&&e.find("label").append(' ('+wc_address_i18n_params.i18n_optional_text+") "))}if("undefined"==typeof wc_address_i18n_params)return!1;var i=wc_address_i18n_params.locale.replace(/"/g,'"'),d=e.parseJSON(i);e(document.body).bind("country_to_state_changing",function(i,t,l){var r,n=l;r="undefined"!=typeof d[t]?d[t]:d["default"];var o=n.find("#billing_postcode_field, #shipping_postcode_field"),s=n.find("#billing_city_field, #shipping_city_field"),p=n.find("#billing_state_field, #shipping_state_field");o.attr("data-o_class")||(o.attr("data-o_class",o.attr("class")),s.attr("data-o_class",s.attr("class")),p.attr("data-o_class",p.attr("class")));var f=e.parseJSON(wc_address_i18n_params.locale_fields);e.each(f,function(i,t){var l=n.find(t),o=e.extend(!0,{},d["default"][i],r[i]);"undefined"!=typeof o.label&&l.find("label").html(o.label),"undefined"!=typeof o.placeholder&&(l.find("input").attr("placeholder",o.placeholder),l.find(".select2-selection__placeholder").text(o.placeholder)),"undefined"!=typeof o.placeholder||"undefined"==typeof o.label||l.find("label").length||(l.find("input").attr("placeholder",o.label),l.find(".select2-selection__placeholder").text(o.label)),"undefined"!=typeof o.required?a(l,o.required):a(l,!1),"undefined"!=typeof o.priority&&l.data("priority",o.priority),"state"!==i&&("undefined"!=typeof o.hidden&&!0===o.hidden?l.hide().find("input").val(""):l.show())}),e(".woocommerce-billing-fields__field-wrapper, .woocommerce-shipping-fields__field-wrapper, .woocommerce-address-fields__field-wrapper, .woocommerce-additional-fields__field-wrapper .woocommerce-account-fields").each(function(a,i){var d=e(i).find(".form-row"),t=d.first().parent(),l=0;d.each(function(){e(this).data("priority")||e(this).data("priority",l+1),l=e(this).data("priority")}),d.sort(function(a,i){var d=e(a).data("priority"),t=e(i).data("priority");return d>t?1:d*')):(e.find("label .required").remove(),e.removeClass("validate-required"),0===e.find("label .optional").length&&e.find("label").append(' ('+wc_address_i18n_params.i18n_optional_text+") "))}s(document.body).bind("country_to_state_changing",function(e,a,i){var t,l=i;t="undefined"!=typeof p[a]?p[a]:p["default"];var d=l.find("#billing_postcode_field, #shipping_postcode_field"),r=l.find("#billing_city_field, #shipping_city_field"),n=l.find("#billing_state_field, #shipping_state_field");d.attr("data-o_class")||(d.attr("data-o_class",d.attr("class")),r.attr("data-o_class",r.attr("class")),n.attr("data-o_class",n.attr("class")));var o=s.parseJSON(wc_address_i18n_params.locale_fields);s.each(o,function(e,a){var i=l.find(a),d=s.extend(!0,{},p["default"][e],t[e]);"undefined"!=typeof d.label&&i.find("label").html(d.label),"undefined"!=typeof d.placeholder&&(i.find("input").attr("placeholder",d.placeholder),i.find(".select2-selection__placeholder").text(d.placeholder)),"undefined"!=typeof d.placeholder||"undefined"==typeof d.label||i.find("label").length||(i.find("input").attr("placeholder",d.label),i.find(".select2-selection__placeholder").text(d.label)),"undefined"!=typeof d.required?f(i,d.required):f(i,!1),"undefined"!=typeof d.priority&&i.data("priority",d.priority),"state"!==e&&("undefined"!=typeof d.hidden&&!0===d.hidden?i.hide().find("input").val(""):i.show())}),s(".woocommerce-billing-fields__field-wrapper, .woocommerce-shipping-fields__field-wrapper, .woocommerce-address-fields__field-wrapper, .woocommerce-additional-fields__field-wrapper .woocommerce-account-fields").each(function(e,a){var i=s(a).find(".form-row"),d=i.first().parent(),t=0;i.each(function(){s(this).data("priority")||s(this).data("priority",t+1),t=s(this).data("priority")}),i.sort(function(e,a){var i=s(e).data("priority"),d=s(a).data("priority");return d0?e(".hide_cart_widget_if_empty").closest(".widget_shopping_cart").show():e(".hide_cart_widget_if_empty").closest(".widget_shopping_cart").hide(),e(document.body).on("adding_to_cart",function(){e(".hide_cart_widget_if_empty").closest(".widget_shopping_cart").show()})});
\ No newline at end of file
+jQuery(function(n){if("undefined"==typeof wc_cart_fragments_params)return!1;var t=!0,o=wc_cart_fragments_params.cart_hash_key;try{t="sessionStorage"in window&&null!==window.sessionStorage,window.sessionStorage.setItem("wc","test"),window.sessionStorage.removeItem("wc"),window.localStorage.setItem("wc","test"),window.localStorage.removeItem("wc")}catch(w){t=!1}function a(){t&&sessionStorage.setItem("wc_cart_created",(new Date).getTime())}function s(e){t&&(localStorage.setItem(o,e),sessionStorage.setItem(o,e))}var e={url:wc_cart_fragments_params.wc_ajax_url.toString().replace("%%endpoint%%","get_refreshed_fragments"),type:"POST",success:function(e){e&&e.fragments&&(n.each(e.fragments,function(e,t){n(e).replaceWith(t)}),t&&(sessionStorage.setItem(wc_cart_fragments_params.fragment_name,JSON.stringify(e.fragments)),s(e.cart_hash),e.cart_hash&&a()),n(document.body).trigger("wc_fragments_refreshed"))}};function r(){n.ajax(e)}if(t){var i=null;n(document.body).on("wc_fragment_refresh updated_wc_div",function(){r()}),n(document.body).on("added_to_cart removed_from_cart",function(e,t,n){var r=sessionStorage.getItem(o);null!==r&&r!==undefined&&""!==r||a(),sessionStorage.setItem(wc_cart_fragments_params.fragment_name,JSON.stringify(t)),s(n)}),n(document.body).on("wc_fragments_refreshed",function(){clearTimeout(i),i=setTimeout(r,864e5)}),n(window).on("storage onstorage",function(e){o===e.originalEvent.key&&localStorage.getItem(o)!==sessionStorage.getItem(o)&&r()}),n(window).on("pageshow",function(e){e.originalEvent.persisted&&(n(".widget_shopping_cart_content").empty(),n(document.body).trigger("wc_fragment_refresh"))});try{var c=n.parseJSON(sessionStorage.getItem(wc_cart_fragments_params.fragment_name)),_=sessionStorage.getItem(o),g=Cookies.get("woocommerce_cart_hash"),m=sessionStorage.getItem("wc_cart_created");if(null!==_&&_!==undefined&&""!==_||(_=""),null!==g&&g!==undefined&&""!==g||(g=""),_&&(null===m||m===undefined||""===m))throw"No cart_created";if(m){var d=1*m+864e5,f=(new Date).getTime();if(d0&&n(s)}else t(".woocommerce-checkout").length&&t(document.body).trigger("update_checkout"),t(".woocommerce-cart-form").replaceWith(i),t(".woocommerce-cart-form").find(':input[name="update_cart"]').prop("disabled",!0),s.length>0&&n(s),a(r);t(document.body).trigger("updated_wc_div")}else window.location.href=window.location.href},a=function(e){t(".cart_totals").replaceWith(e),t(document.body).trigger("updated_cart_totals")},n=function(e,o){o||(o=t(".woocommerce-notices-wrapper:first")||t(".cart-empty").closest(".woocommerce")||t(".woocommerce-cart-form")),o.prepend(e)},s={init:function(e){this.cart=e,this.toggle_shipping=this.toggle_shipping.bind(this),this.shipping_method_selected=this.shipping_method_selected.bind(this),this.shipping_calculator_submit=this.shipping_calculator_submit.bind(this),t(document).on("click",".shipping-calculator-button",this.toggle_shipping),t(document).on("change","select.shipping_method, :input[name^=shipping_method]",this.shipping_method_selected),t(document).on("submit","form.woocommerce-shipping-calculator",this.shipping_calculator_submit),t(".shipping-calculator-form").hide()},toggle_shipping:function(){return t(".shipping-calculator-form").slideToggle("slow"),t(document.body).trigger("country_to_state_changed"),!1},shipping_method_selected:function(){var o={};t("select.shipping_method, :input[name^=shipping_method][type=radio]:checked, :input[name^=shipping_method][type=hidden]").each(function(){o[t(this).data("index")]=t(this).val()}),c(t("div.cart_totals"));var r={security:wc_cart_params.update_shipping_method_nonce,shipping_method:o};t.ajax({type:"post",url:e("update_shipping_method"),data:r,dataType:"html",success:function(t){a(t)},complete:function(){i(t("div.cart_totals")),t(document.body).trigger("updated_shipping_method")}})},shipping_calculator_submit:function(e){e.preventDefault();var o=t(e.currentTarget);c(t("div.cart_totals")),c(o),t(" ").attr("type","hidden").attr("name","calc_shipping").attr("value","x").appendTo(o),t.ajax({type:o.attr("method"),url:o.attr("action"),data:o.serialize(),dataType:"html",success:function(t){r(t)},complete:function(){i(o),i(t("div.cart_totals"))}})}},p={init:function(){this.update_cart_totals=this.update_cart_totals.bind(this),this.input_keypress=this.input_keypress.bind(this),this.cart_submit=this.cart_submit.bind(this),this.submit_click=this.submit_click.bind(this),this.apply_coupon=this.apply_coupon.bind(this),this.remove_coupon_clicked=this.remove_coupon_clicked.bind(this),this.quantity_update=this.quantity_update.bind(this),this.item_remove_clicked=this.item_remove_clicked.bind(this),this.item_restore_clicked=this.item_restore_clicked.bind(this),this.update_cart=this.update_cart.bind(this),t(document).on("wc_update_cart",function(){p.update_cart.apply(p,[].slice.call(arguments,1))}),t(document).on("click",".woocommerce-cart-form :input[type=submit]",this.submit_click),t(document).on("keypress",".woocommerce-cart-form :input[type=number]",this.input_keypress),t(document).on("submit",".woocommerce-cart-form",this.cart_submit),t(document).on("click","a.woocommerce-remove-coupon",this.remove_coupon_clicked),t(document).on("click",".woocommerce-cart-form .product-remove > a",this.item_remove_clicked),t(document).on("click",".woocommerce-cart .restore-item",this.item_restore_clicked),t(document).on("change input",".woocommerce-cart-form .cart_item :input",this.input_changed),t('.woocommerce-cart-form :input[name="update_cart"]').prop("disabled",!0)},input_changed:function(){t('.woocommerce-cart-form :input[name="update_cart"]').prop("disabled",!1)},update_cart:function(e){var o=t(".woocommerce-cart-form");c(o),c(t("div.cart_totals")),t.ajax({type:o.attr("method"),url:o.attr("action"),data:o.serialize(),dataType:"html",success:function(t){r(t,e)},complete:function(){i(o),i(t("div.cart_totals")),t.scroll_to_notices(t('[role="alert"]'))}})},update_cart_totals:function(){c(t("div.cart_totals")),t.ajax({url:e("get_cart_totals"),dataType:"html",success:function(t){a(t)},complete:function(){i(t("div.cart_totals"))}})},input_keypress:function(e){if(13===e.keyCode){var o=t(e.currentTarget).parents("form");try{o[0].checkValidity()&&(e.preventDefault(),this.cart_submit(e))}catch(c){e.preventDefault(),this.cart_submit(e)}}},cart_submit:function(e){var c=t(document.activeElement),i=t(":input[type=submit][clicked=true]"),r=t(e.currentTarget);if(r.is("form")||(r=t(e.currentTarget).parents("form")),0!==r.find(".woocommerce-cart-form__contents").length)return!o(r)&&void(i.is(':input[name="update_cart"]')||c.is("input.qty")?(e.preventDefault(),this.quantity_update(r)):(i.is(':input[name="apply_coupon"]')||c.is("#coupon_code"))&&(e.preventDefault(),this.apply_coupon(r)))},submit_click:function(e){t(":input[type=submit]",t(e.target).parents("form")).removeAttr("clicked"),t(e.target).attr("clicked","true")},apply_coupon:function(o){c(o);var r=this,a=t("#coupon_code"),s=a.val(),p={security:wc_cart_params.apply_coupon_nonce,coupon_code:s};t.ajax({type:"POST",url:e("apply_coupon"),data:p,dataType:"html",success:function(e){t(".woocommerce-error, .woocommerce-message, .woocommerce-info").remove(),n(e),t(document.body).trigger("applied_coupon",[s])},complete:function(){i(o),a.val(""),r.update_cart(!0)}})},remove_coupon_clicked:function(o){o.preventDefault();var r=this,a=t(o.currentTarget).closest(".cart_totals"),s=t(o.currentTarget).attr("data-coupon");c(a);var p={security:wc_cart_params.remove_coupon_nonce,coupon:s};t.ajax({type:"POST",url:e("remove_coupon"),data:p,dataType:"html",success:function(e){t(".woocommerce-error, .woocommerce-message, .woocommerce-info").remove(),n(e),t(document.body).trigger("removed_coupon",[s]),i(a)},complete:function(){r.update_cart(!0)}})},quantity_update:function(e){c(e),c(t("div.cart_totals")),t(" ").attr("type","hidden").attr("name","update_cart").attr("value","Update Cart").appendTo(e),t.ajax({type:e.attr("method"),url:e.attr("action"),data:e.serialize(),dataType:"html",success:function(t){r(t)},complete:function(){i(e),i(t("div.cart_totals")),t.scroll_to_notices(t('[role="alert"]'))}})},item_remove_clicked:function(e){e.preventDefault();var o=t(e.currentTarget),a=o.parents("form");c(a),c(t("div.cart_totals")),t.ajax({type:"GET",url:o.attr("href"),dataType:"html",success:function(t){r(t)},complete:function(){i(a),i(t("div.cart_totals")),t.scroll_to_notices(t('[role="alert"]'))}})},item_restore_clicked:function(e){e.preventDefault();var o=t(e.currentTarget),a=t("form.woocommerce-cart-form");c(a),c(t("div.cart_totals")),t.ajax({type:"GET",url:o.attr("href"),dataType:"html",success:function(t){r(t)},complete:function(){i(a),i(t("div.cart_totals"))}})}};s.init(p),p.init()});
\ No newline at end of file
+jQuery(function(n){if("undefined"==typeof wc_cart_params)return!1;var r=function(t){return wc_cart_params.wc_ajax_url.toString().replace("%%endpoint%%",t)},i=function(t){return t.is(".processing")||t.parents(".processing").length},a=function(t){i(t)||t.addClass("processing").block({message:null,overlayCSS:{background:"#fff",opacity:.6}})},s=function(t){t.removeClass("processing").unblock()},c=function(t,e){var o=n.parseHTML(t),c=n(".woocommerce-cart-form",o),i=n(".cart_totals",o),r=n(".woocommerce-error, .woocommerce-message, .woocommerce-info",o);if(0!==n(".woocommerce-cart-form").length){if(e||n(".woocommerce-error, .woocommerce-message, .woocommerce-info").remove(),0===c.length){if(n(".woocommerce-checkout").length)return void(window.location.href=window.location.href);var a=n(".cart-empty",o).closest(".woocommerce");n(".woocommerce-cart-form__contents").closest(".woocommerce").replaceWith(a),0 a",this.item_remove_clicked),n(document).on("click",".woocommerce-cart .restore-item",this.item_restore_clicked),n(document).on("change input",".woocommerce-cart-form .cart_item :input",this.input_changed),n('.woocommerce-cart-form :input[name="update_cart"]').prop("disabled",!0)},input_changed:function(){n('.woocommerce-cart-form :input[name="update_cart"]').prop("disabled",!1)},update_cart:function(e){var t=n(".woocommerce-cart-form");a(t),a(n("div.cart_totals")),n.ajax({type:t.attr("method"),url:t.attr("action"),data:t.serialize(),dataType:"html",success:function(t){c(t,e)},complete:function(){s(t),s(n("div.cart_totals")),n.scroll_to_notices(n('[role="alert"]'))}})},update_cart_totals:function(){a(n("div.cart_totals")),n.ajax({url:r("get_cart_totals"),dataType:"html",success:function(t){p(t)},complete:function(){s(n("div.cart_totals"))}})},input_keypress:function(t){if(13===t.keyCode){var e=n(t.currentTarget).parents("form");try{e[0].checkValidity()&&(t.preventDefault(),this.cart_submit(t))}catch(o){t.preventDefault(),this.cart_submit(t)}}},cart_submit:function(t){var e=n(document.activeElement),o=n(":input[type=submit][clicked=true]"),c=n(t.currentTarget);if(c.is("form")||(c=n(t.currentTarget).parents("form")),0!==c.find(".woocommerce-cart-form__contents").length)return!i(c)&&void(o.is(':input[name="update_cart"]')||e.is("input.qty")?(t.preventDefault(),this.quantity_update(c)):(o.is(':input[name="apply_coupon"]')||e.is("#coupon_code"))&&(t.preventDefault(),this.apply_coupon(c)))},submit_click:function(t){n(":input[type=submit]",n(t.target).parents("form")).removeAttr("clicked"),n(t.target).attr("clicked","true")},apply_coupon:function(t){a(t);var e=this,o=n("#coupon_code"),c=o.val(),i={security:wc_cart_params.apply_coupon_nonce,coupon_code:c};n.ajax({type:"POST",url:r("apply_coupon"),data:i,dataType:"html",success:function(t){n(".woocommerce-error, .woocommerce-message, .woocommerce-info").remove(),m(t),n(document.body).trigger("applied_coupon",[c])},complete:function(){s(t),o.val(""),e.update_cart(!0)}})},remove_coupon_clicked:function(t){t.preventDefault();var e=this,o=n(t.currentTarget).closest(".cart_totals"),c=n(t.currentTarget).attr("data-coupon");a(o);var i={security:wc_cart_params.remove_coupon_nonce,coupon:c};n.ajax({type:"POST",url:r("remove_coupon"),data:i,dataType:"html",success:function(t){n(".woocommerce-error, .woocommerce-message, .woocommerce-info").remove(),m(t),n(document.body).trigger("removed_coupon",[c]),s(o)},complete:function(){e.update_cart(!0)}})},quantity_update:function(t){a(t),a(n("div.cart_totals")),n(" ").attr("type","hidden").attr("name","update_cart").attr("value","Update Cart").appendTo(t),n.ajax({type:t.attr("method"),url:t.attr("action"),data:t.serialize(),dataType:"html",success:function(t){c(t)},complete:function(){s(t),s(n("div.cart_totals")),n.scroll_to_notices(n('[role="alert"]'))}})},item_remove_clicked:function(t){t.preventDefault();var e=n(t.currentTarget),o=e.parents("form");a(o),a(n("div.cart_totals")),n.ajax({type:"GET",url:e.attr("href"),dataType:"html",success:function(t){c(t)},complete:function(){s(o),s(n("div.cart_totals")),n.scroll_to_notices(n('[role="alert"]'))}})},item_restore_clicked:function(t){t.preventDefault();var e=n(t.currentTarget),o=n("form.woocommerce-cart-form");a(o),a(n("div.cart_totals")),n.ajax({type:"GET",url:e.attr("href"),dataType:"html",success:function(t){c(t)},complete:function(){s(o),s(n("div.cart_totals"))}})}};({init:function(t){this.cart=t,this.toggle_shipping=this.toggle_shipping.bind(this),this.shipping_method_selected=this.shipping_method_selected.bind(this),this.shipping_calculator_submit=this.shipping_calculator_submit.bind(this),n(document).on("click",".shipping-calculator-button",this.toggle_shipping),n(document).on("change","select.shipping_method, :input[name^=shipping_method]",this.shipping_method_selected),n(document).on("submit","form.woocommerce-shipping-calculator",this.shipping_calculator_submit),n(".shipping-calculator-form").hide()},toggle_shipping:function(){return n(".shipping-calculator-form").slideToggle("slow"),n(document.body).trigger("country_to_state_changed"),!1},shipping_method_selected:function(){var t={};n("select.shipping_method, :input[name^=shipping_method][type=radio]:checked, :input[name^=shipping_method][type=hidden]").each(function(){t[n(this).data("index")]=n(this).val()}),a(n("div.cart_totals"));var e={security:wc_cart_params.update_shipping_method_nonce,shipping_method:t};n.ajax({type:"post",url:r("update_shipping_method"),data:e,dataType:"html",success:function(t){p(t)},complete:function(){s(n("div.cart_totals")),n(document.body).trigger("updated_shipping_method")}})},shipping_calculator_submit:function(t){t.preventDefault();var e=n(t.currentTarget);a(n("div.cart_totals")),a(e),n(" ").attr("type","hidden").attr("name","calc_shipping").attr("value","x").appendTo(e),n.ajax({type:e.attr("method"),url:e.attr("action"),data:e.serialize(),dataType:"html",success:function(t){c(t)},complete:function(){s(e),s(n("div.cart_totals"))}})}}).init(t),t.init()});
\ No newline at end of file
diff --git a/assets/js/frontend/checkout.js b/assets/js/frontend/checkout.js
index 0b039693259..75a5c7110c8 100644
--- a/assets/js/frontend/checkout.js
+++ b/assets/js/frontend/checkout.js
@@ -374,7 +374,7 @@ jQuery( function( $ ) {
if ( ID ) {
if ( $.inArray( $( this ).attr( 'type' ), [ 'checkbox', 'radio' ] ) !== -1 ) {
$( this ).prop( 'checked', paymentDetails[ ID ] ).change();
- } else if ( 0 === $( this ).val().length ) {
+ } else if ( null !== $( this ).val() && 0 === $( this ).val().length ) {
$( this ).val( paymentDetails[ ID ] ).change();
}
}
diff --git a/assets/js/frontend/checkout.min.js b/assets/js/frontend/checkout.min.js
index 9fd04b9b91c..1527d308e40 100644
--- a/assets/js/frontend/checkout.min.js
+++ b/assets/js/frontend/checkout.min.js
@@ -1 +1 @@
-jQuery(function(e){if("undefined"==typeof wc_checkout_params)return!1;e.blockUI.defaults.overlayCSS.cursor="default";var o={updateTimer:!1,dirtyInput:!1,selectedPaymentMethod:!1,xhr:!1,$order_review:e("#order_review"),$checkout_form:e("form.checkout"),init:function(){e(document.body).bind("update_checkout",this.update_checkout),e(document.body).bind("init_checkout",this.init_checkout),this.$checkout_form.on("click",'input[name="payment_method"]',this.payment_method_selected),e(document.body).hasClass("woocommerce-order-pay")&&this.$order_review.on("click",'input[name="payment_method"]',this.payment_method_selected),this.$checkout_form.attr("novalidate","novalidate"),this.$checkout_form.on("submit",this.submit),this.$checkout_form.on("input validate change",".input-text, select, input:checkbox",this.validate_field),this.$checkout_form.on("update",this.trigger_update_checkout),this.$checkout_form.on("change",'select.shipping_method, input[name^="shipping_method"], #ship-to-different-address input, .update_totals_on_change select, .update_totals_on_change input[type="radio"], .update_totals_on_change input[type="checkbox"]',this.trigger_update_checkout),this.$checkout_form.on("change",".address-field select",this.input_changed),this.$checkout_form.on("change",".address-field input.input-text, .update_totals_on_change input.input-text",this.maybe_input_changed),this.$checkout_form.on("keydown",".address-field input.input-text, .update_totals_on_change input.input-text",this.queue_update_checkout),this.$checkout_form.on("change","#ship-to-different-address input",this.ship_to_different_address),this.$checkout_form.find("#ship-to-different-address input").change(),this.init_payment_methods(),"1"===wc_checkout_params.is_checkout&&e(document.body).trigger("init_checkout"),"yes"===wc_checkout_params.option_guest_checkout&&e("input#createaccount").change(this.toggle_create_account).change()},init_payment_methods:function(){var t=e(".woocommerce-checkout").find('input[name="payment_method"]');1===t.length&&t.eq(0).hide(),o.selectedPaymentMethod&&e("#"+o.selectedPaymentMethod).prop("checked",!0),0===t.filter(":checked").length&&t.eq(0).prop("checked",!0),t.length>1&&e("div.payment_box").filter(":visible").slideUp(0),t.filter(":checked").eq(0).trigger("click")},get_payment_method:function(){return o.$checkout_form.find('input[name="payment_method"]:checked').val()},payment_method_selected:function(t){if(t.stopPropagation(),e(".payment_methods input.input-radio").length>1){var c=e("div.payment_box."+e(this).attr("ID")),i=e(this).is(":checked");i&&!c.is(":visible")&&(e("div.payment_box").filter(":visible").slideUp(230),i&&c.slideDown(230))}else e("div.payment_box").show();e(this).data("order_button_text")?e("#place_order").text(e(this).data("order_button_text")):e("#place_order").text(e("#place_order").data("value"));var r=e('.woocommerce-checkout input[name="payment_method"]:checked').attr("id");r!==o.selectedPaymentMethod&&e(document.body).trigger("payment_method_selected"),o.selectedPaymentMethod=r},toggle_create_account:function(){e("div.create-account").hide(),e(this).is(":checked")&&(e("#account_password").val("").change(),e("div.create-account").slideDown())},init_checkout:function(){e(document.body).trigger("update_checkout")},maybe_input_changed:function(e){o.dirtyInput&&o.input_changed(e)},input_changed:function(e){o.dirtyInput=e.target,o.maybe_update_checkout()},queue_update_checkout:function(e){if(9===(e.keyCode||e.which||0))return!0;o.dirtyInput=this,o.reset_update_checkout_timer(),o.updateTimer=setTimeout(o.maybe_update_checkout,"1000")},trigger_update_checkout:function(){o.reset_update_checkout_timer(),o.dirtyInput=!1,e(document.body).trigger("update_checkout")},maybe_update_checkout:function(){var t=!0;if(e(o.dirtyInput).length){var c=e(o.dirtyInput).closest("div").find(".address-field.validate-required");c.length&&c.each(function(){""===e(this).find("input.input-text").val()&&(t=!1)})}t&&o.trigger_update_checkout()},ship_to_different_address:function(){e("div.shipping_address").hide(),e(this).is(":checked")&&e("div.shipping_address").slideDown()},reset_update_checkout_timer:function(){clearTimeout(o.updateTimer)},is_valid_json:function(o){try{var t=e.parseJSON(o);return t&&"object"==typeof t}catch(c){return!1}},validate_field:function(o){var t=e(this),c=t.closest(".form-row"),i=!0,r=c.is(".validate-required"),n=c.is(".validate-email"),a=o.type;"input"===a&&c.removeClass("woocommerce-invalid woocommerce-invalid-required-field woocommerce-invalid-email woocommerce-validated"),"validate"!==a&&"change"!==a||(r&&("checkbox"!==t.attr("type")||t.is(":checked")?""===t.val()&&(c.removeClass("woocommerce-validated").addClass("woocommerce-invalid woocommerce-invalid-required-field"),i=!1):(c.removeClass("woocommerce-validated").addClass("woocommerce-invalid woocommerce-invalid-required-field"),i=!1)),n&&t.val()&&(new RegExp(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i).test(t.val())||(c.removeClass("woocommerce-validated").addClass("woocommerce-invalid woocommerce-invalid-email"),i=!1)),i&&c.removeClass("woocommerce-invalid woocommerce-invalid-required-field woocommerce-invalid-email").addClass("woocommerce-validated"))},update_checkout:function(e,t){o.reset_update_checkout_timer(),o.updateTimer=setTimeout(o.update_checkout_action,"5",t)},update_checkout_action:function(t){if(o.xhr&&o.xhr.abort(),0!==e("form.checkout").length){t=void 0!==t?t:{update_shipping_method:!0};var c=e("#billing_country").val(),i=e("#billing_state").val(),r=e("input#billing_postcode").val(),n=e("#billing_city").val(),a=e("input#billing_address_1").val(),u=e("input#billing_address_2").val(),d=c,s=i,m=r,p=n,l=a,h=u,_=e(o.$checkout_form).find(".address-field.validate-required:visible"),f=!0;_.length&&_.each(function(){""===e(this).find(":input").val()&&(f=!1)}),e("#ship-to-different-address").find("input").is(":checked")&&(d=e("#shipping_country").val(),s=e("#shipping_state").val(),m=e("input#shipping_postcode").val(),p=e("#shipping_city").val(),l=e("input#shipping_address_1").val(),h=e("input#shipping_address_2").val());var g={security:wc_checkout_params.update_order_review_nonce,payment_method:o.get_payment_method(),country:c,state:i,postcode:r,city:n,address:a,address_2:u,s_country:d,s_state:s,s_postcode:m,s_city:p,s_address:l,s_address_2:h,has_full_address:f,post_data:e("form.checkout").serialize()};if(!1!==t.update_shipping_method){var v={};e('select.shipping_method, input[name^="shipping_method"][type="radio"]:checked, input[name^="shipping_method"][type="hidden"]').each(function(){v[e(this).data("index")]=e(this).val()}),g.shipping_method=v}e(".woocommerce-checkout-payment, .woocommerce-checkout-review-order-table").block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),o.xhr=e.ajax({type:"POST",url:wc_checkout_params.wc_ajax_url.toString().replace("%%endpoint%%","update_order_review"),data:g,success:function(t){if(!0!==t.reload){e(".woocommerce-NoticeGroup-updateOrderReview").remove();var c=e("#terms").prop("checked"),i={};if(e(".payment_box :input").each(function(){var o=e(this).attr("id");o&&(-1!==e.inArray(e(this).attr("type"),["checkbox","radio"])?i[o]=e(this).prop("checked"):i[o]=e(this).val())}),t&&t.fragments&&e.each(t.fragments,function(o,t){e(o).replaceWith(t),e(o).unblock()}),c&&e("#terms").prop("checked",!0),e.isEmptyObject(i)||e(".payment_box :input").each(function(){var o=e(this).attr("id");o&&(-1!==e.inArray(e(this).attr("type"),["checkbox","radio"])?e(this).prop("checked",i[o]).change():0===e(this).val().length&&e(this).val(i[o]).change())}),"failure"===t.result){var r=e("form.checkout");e(".woocommerce-error, .woocommerce-message").remove(),t.messages?r.prepend(''+t.messages+"
"):r.prepend(t),r.find(".input-text, select, input:checkbox").trigger("validate").blur(),o.scroll_to_notices()}o.init_payment_methods(),e(document.body).trigger("updated_checkout",[t])}else window.location.reload()}})}},submit:function(){o.reset_update_checkout_timer();var t=e(this);return!t.is(".processing")&&(!1!==t.triggerHandler("checkout_place_order")&&!1!==t.triggerHandler("checkout_place_order_"+o.get_payment_method())&&(t.addClass("processing"),1!==t.data()["blockUI.isBlocked"]&&t.block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),e.ajaxSetup({dataFilter:function(e,t){if("json"!==t)return e;if(o.is_valid_json(e))return e;var c=e.match(/{"result.*}/);return null===c?console.log("Unable to fix malformed JSON"):o.is_valid_json(c[0])?(console.log("Fixed malformed JSON. Original:"),console.log(e),e=c[0]):console.log("Unable to fix malformed JSON"),e}}),e.ajax({type:"POST",url:wc_checkout_params.checkout_url,data:t.serialize(),dataType:"json",success:function(t){try{if("success"!==t.result)throw"failure"===t.result?"Result failure":"Invalid response";-1===t.redirect.indexOf("https://")||-1===t.redirect.indexOf("http://")?window.location=t.redirect:window.location=decodeURI(t.redirect)}catch(c){if(!0===t.reload)return void window.location.reload();!0===t.refresh&&e(document.body).trigger("update_checkout"),t.messages?o.submit_error(t.messages):o.submit_error(''+wc_checkout_params.i18n_checkout_error+"
")}},error:function(e,t,c){o.submit_error(''+c+"
")}})),!1)},submit_error:function(t){e(".woocommerce-NoticeGroup-checkout, .woocommerce-error, .woocommerce-message").remove(),o.$checkout_form.prepend(''+t+"
"),o.$checkout_form.removeClass("processing").unblock(),o.$checkout_form.find(".input-text, select, input:checkbox").trigger("validate").blur(),o.scroll_to_notices(),e(document.body).trigger("checkout_error")},scroll_to_notices:function(){var o=e(".woocommerce-NoticeGroup-updateOrderReview, .woocommerce-NoticeGroup-checkout");o.length||(o=e(".form.checkout")),e.scroll_to_notices(o)}},t={init:function(){e(document.body).on("click","a.showcoupon",this.show_coupon_form),e(document.body).on("click",".woocommerce-remove-coupon",this.remove_coupon),e("form.checkout_coupon").hide().submit(this.submit)},show_coupon_form:function(){return e(".checkout_coupon").slideToggle(400,function(){e(".checkout_coupon").find(":input:eq(0)").focus()}),!1},submit:function(){var o=e(this);if(o.is(".processing"))return!1;o.addClass("processing").block({message:null,overlayCSS:{background:"#fff",opacity:.6}});var t={security:wc_checkout_params.apply_coupon_nonce,coupon_code:o.find('input[name="coupon_code"]').val()};return e.ajax({type:"POST",url:wc_checkout_params.wc_ajax_url.toString().replace("%%endpoint%%","apply_coupon"),data:t,success:function(t){e(".woocommerce-error, .woocommerce-message").remove(),o.removeClass("processing").unblock(),t&&(o.before(t),o.slideUp(),e(document.body).trigger("update_checkout",{update_shipping_method:!1}))},dataType:"html"}),!1},remove_coupon:function(o){o.preventDefault();var t=e(this).parents(".woocommerce-checkout-review-order"),c=e(this).data("coupon");t.addClass("processing").block({message:null,overlayCSS:{background:"#fff",opacity:.6}});var i={security:wc_checkout_params.remove_coupon_nonce,coupon:c};e.ajax({type:"POST",url:wc_checkout_params.wc_ajax_url.toString().replace("%%endpoint%%","remove_coupon"),data:i,success:function(o){e(".woocommerce-error, .woocommerce-message").remove(),t.removeClass("processing").unblock(),o&&(e("form.woocommerce-checkout").before(o),e(document.body).trigger("update_checkout",{update_shipping_method:!1}),e("form.checkout_coupon").find('input[name="coupon_code"]').val(""))},error:function(e){wc_checkout_params.debug_mode&&console.log(e.responseText)},dataType:"html"})}},c={init:function(){e(document.body).on("click","a.showlogin",this.show_login_form)},show_login_form:function(){return e("form.login, form.woocommerce-form--login").slideToggle(),!1}},i={init:function(){e(document.body).on("click","a.woocommerce-terms-and-conditions-link",this.toggle_terms)},toggle_terms:function(){if(e(".woocommerce-terms-and-conditions").length)return e(".woocommerce-terms-and-conditions").slideToggle(function(){var o=e(".woocommerce-terms-and-conditions-link");e(".woocommerce-terms-and-conditions").is(":visible")?(o.addClass("woocommerce-terms-and-conditions-link--open"),o.removeClass("woocommerce-terms-and-conditions-link--closed")):(o.removeClass("woocommerce-terms-and-conditions-link--open"),o.addClass("woocommerce-terms-and-conditions-link--closed"))}),!1}};o.init(),t.init(),c.init(),i.init()});
\ No newline at end of file
+jQuery(function(g){if("undefined"==typeof wc_checkout_params)return!1;var v={updateTimer:!(g.blockUI.defaults.overlayCSS.cursor="default"),dirtyInput:!1,selectedPaymentMethod:!1,xhr:!1,$order_review:g("#order_review"),$checkout_form:g("form.checkout"),init:function(){g(document.body).bind("update_checkout",this.update_checkout),g(document.body).bind("init_checkout",this.init_checkout),this.$checkout_form.on("click",'input[name="payment_method"]',this.payment_method_selected),g(document.body).hasClass("woocommerce-order-pay")&&this.$order_review.on("click",'input[name="payment_method"]',this.payment_method_selected),this.$checkout_form.attr("novalidate","novalidate"),this.$checkout_form.on("submit",this.submit),this.$checkout_form.on("input validate change",".input-text, select, input:checkbox",this.validate_field),this.$checkout_form.on("update",this.trigger_update_checkout),this.$checkout_form.on("change",'select.shipping_method, input[name^="shipping_method"], #ship-to-different-address input, .update_totals_on_change select, .update_totals_on_change input[type="radio"], .update_totals_on_change input[type="checkbox"]',this.trigger_update_checkout),this.$checkout_form.on("change",".address-field select",this.input_changed),this.$checkout_form.on("change",".address-field input.input-text, .update_totals_on_change input.input-text",this.maybe_input_changed),this.$checkout_form.on("keydown",".address-field input.input-text, .update_totals_on_change input.input-text",this.queue_update_checkout),this.$checkout_form.on("change","#ship-to-different-address input",this.ship_to_different_address),this.$checkout_form.find("#ship-to-different-address input").change(),this.init_payment_methods(),"1"===wc_checkout_params.is_checkout&&g(document.body).trigger("init_checkout"),"yes"===wc_checkout_params.option_guest_checkout&&g("input#createaccount").change(this.toggle_create_account).change()},init_payment_methods:function(){var e=g(".woocommerce-checkout").find('input[name="payment_method"]');1===e.length&&e.eq(0).hide(),v.selectedPaymentMethod&&g("#"+v.selectedPaymentMethod).prop("checked",!0),0===e.filter(":checked").length&&e.eq(0).prop("checked",!0),1'+e.messages+""):c.prepend(e),c.find(".input-text, select, input:checkbox").trigger("validate").blur(),v.scroll_to_notices()}v.init_payment_methods(),g(document.body).trigger("updated_checkout",[e])}else window.location.reload()}})}},submit:function(){v.reset_update_checkout_timer();var e=g(this);if(e.is(".processing"))return!1;!1!==e.triggerHandler("checkout_place_order")&&!1!==e.triggerHandler("checkout_place_order_"+v.get_payment_method())&&(e.addClass("processing"),1!==e.data()["blockUI.isBlocked"]&&e.block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),g.ajaxSetup({dataFilter:function(e,t){if("json"!==t)return e;if(v.is_valid_json(e))return e;var o=e.match(/{"result.*}/);return null===o?console.log("Unable to fix malformed JSON"):v.is_valid_json(o[0])?(console.log("Fixed malformed JSON. Original:"),console.log(e),e=o[0]):console.log("Unable to fix malformed JSON"),e}}),g.ajax({type:"POST",url:wc_checkout_params.checkout_url,data:e.serialize(),dataType:"json",success:function(e){try{if("success"!==e.result)throw"failure"===e.result?"Result failure":"Invalid response";-1===e.redirect.indexOf("https://")||-1===e.redirect.indexOf("http://")?window.location=e.redirect:window.location=decodeURI(e.redirect)}catch(t){if(!0===e.reload)return void window.location.reload();!0===e.refresh&&g(document.body).trigger("update_checkout"),e.messages?v.submit_error(e.messages):v.submit_error(''+wc_checkout_params.i18n_checkout_error+"
")}},error:function(e,t,o){v.submit_error(''+o+"
")}}));return!1},submit_error:function(e){g(".woocommerce-NoticeGroup-checkout, .woocommerce-error, .woocommerce-message").remove(),v.$checkout_form.prepend(''+e+"
"),v.$checkout_form.removeClass("processing").unblock(),v.$checkout_form.find(".input-text, select, input:checkbox").trigger("validate").blur(),v.scroll_to_notices(),g(document.body).trigger("checkout_error")},scroll_to_notices:function(){var e=g(".woocommerce-NoticeGroup-updateOrderReview, .woocommerce-NoticeGroup-checkout");e.length||(e=g(".form.checkout")),g.scroll_to_notices(e)}},e={init:function(){g(document.body).on("click","a.showcoupon",this.show_coupon_form),g(document.body).on("click",".woocommerce-remove-coupon",this.remove_coupon),g("form.checkout_coupon").hide().submit(this.submit)},show_coupon_form:function(){return g(".checkout_coupon").slideToggle(400,function(){g(".checkout_coupon").find(":input:eq(0)").focus()}),!1},submit:function(){var t=g(this);if(t.is(".processing"))return!1;t.addClass("processing").block({message:null,overlayCSS:{background:"#fff",opacity:.6}});var e={security:wc_checkout_params.apply_coupon_nonce,coupon_code:t.find('input[name="coupon_code"]').val()};return g.ajax({type:"POST",url:wc_checkout_params.wc_ajax_url.toString().replace("%%endpoint%%","apply_coupon"),data:e,success:function(e){g(".woocommerce-error, .woocommerce-message").remove(),t.removeClass("processing").unblock(),e&&(t.before(e),t.slideUp(),g(document.body).trigger("update_checkout",{update_shipping_method:!1}))},dataType:"html"}),!1},remove_coupon:function(e){e.preventDefault();var t=g(this).parents(".woocommerce-checkout-review-order"),o=g(this).data("coupon");t.addClass("processing").block({message:null,overlayCSS:{background:"#fff",opacity:.6}});var c={security:wc_checkout_params.remove_coupon_nonce,coupon:o};g.ajax({type:"POST",url:wc_checkout_params.wc_ajax_url.toString().replace("%%endpoint%%","remove_coupon"),data:c,success:function(e){g(".woocommerce-error, .woocommerce-message").remove(),t.removeClass("processing").unblock(),e&&(g("form.woocommerce-checkout").before(e),g(document.body).trigger("update_checkout",{update_shipping_method:!1}),g("form.checkout_coupon").find('input[name="coupon_code"]').val(""))},error:function(e){wc_checkout_params.debug_mode&&console.log(e.responseText)},dataType:"html"})}},t={init:function(){g(document.body).on("click","a.showlogin",this.show_login_form)},show_login_form:function(){return g("form.login, form.woocommerce-form--login").slideToggle(),!1}},o={init:function(){g(document.body).on("click","a.woocommerce-terms-and-conditions-link",this.toggle_terms)},toggle_terms:function(){if(g(".woocommerce-terms-and-conditions").length)return g(".woocommerce-terms-and-conditions").slideToggle(function(){var e=g(".woocommerce-terms-and-conditions-link");g(".woocommerce-terms-and-conditions").is(":visible")?(e.addClass("woocommerce-terms-and-conditions-link--open"),e.removeClass("woocommerce-terms-and-conditions-link--closed")):(e.removeClass("woocommerce-terms-and-conditions-link--open"),e.addClass("woocommerce-terms-and-conditions-link--closed"))}),!1}};v.init(),e.init(),t.init(),o.init()});
\ No newline at end of file
diff --git a/assets/js/frontend/country-select.min.js b/assets/js/frontend/country-select.min.js
index 37c1a80a09d..ef358dfe5a2 100644
--- a/assets/js/frontend/country-select.min.js
+++ b/assets/js/frontend/country-select.min.js
@@ -1 +1 @@
-jQuery(function(t){function e(){return{language:{errorLoading:function(){return wc_country_select_params.i18n_searching},inputTooLong:function(t){var e=t.input.length-t.maximum;return 1===e?wc_country_select_params.i18n_input_too_long_1:wc_country_select_params.i18n_input_too_long_n.replace("%qty%",e)},inputTooShort:function(t){var e=t.minimum-t.input.length;return 1===e?wc_country_select_params.i18n_input_too_short_1:wc_country_select_params.i18n_input_too_short_n.replace("%qty%",e)},loadingMore:function(){return wc_country_select_params.i18n_load_more},maximumSelected:function(t){return 1===t.maximum?wc_country_select_params.i18n_selection_too_long_1:wc_country_select_params.i18n_selection_too_long_n.replace("%qty%",t.maximum)},noResults:function(){return wc_country_select_params.i18n_no_matches},searching:function(){return wc_country_select_params.i18n_searching}}}}if("undefined"==typeof wc_country_select_params)return!1;if(t().selectWoo){var n=function(){t("select.country_select:visible, select.state_select:visible").each(function(){var n=t.extend({placeholderOption:"first",width:"100%"},e());t(this).selectWoo(n),t(this).on("select2:select",function(){t(this).focus()})})};n(),t(document.body).bind("country_to_state_changed",function(){n()})}var o=wc_country_select_params.countries.replace(/"/g,'"'),c=t.parseJSON(o);t(document.body).on("change","select.country_to_state, input.country_to_state",function(){var e=t(this).closest(".woocommerce-billing-fields, .woocommerce-shipping-fields, .woocommerce-shipping-calculator");e.length||(e=t(this).closest(".form-row").parent());var n=t(this).val(),o=e.find("#billing_state, #shipping_state, #calc_shipping_state"),i=o.closest("p.form-row"),r=o.attr("name"),a=o.attr("id"),s=o.val(),_=o.attr("placeholder")||o.attr("data-placeholder")||"";if(c[n])if(t.isEmptyObject(c[n]))o.closest("p.form-row").hide().find(".select2-container").remove(),o.replaceWith(' '),t(document.body).trigger("country_to_state_changed",[n,e]);else{var l="",u=c[n];for(var p in u)u.hasOwnProperty(p)&&(l=l+''+u[p]+" ");o.closest("p.form-row").show(),o.is("input")&&(o.replaceWith(' '),o=e.find("#billing_state, #shipping_state, #calc_shipping_state")),o.html(''+wc_country_select_params.i18n_select_state_text+" "+l),o.val(s).change(),t(document.body).trigger("country_to_state_changed",[n,e])}else o.is("select")?(i.show().find(".select2-container").remove(),o.replaceWith(' '),t(document.body).trigger("country_to_state_changed",[n,e])):o.is('input[type="hidden"]')&&(i.show().find(".select2-container").remove(),o.replaceWith(' '),t(document.body).trigger("country_to_state_changed",[n,e]));t(document.body).trigger("country_to_state_changing",[n,e])})});
\ No newline at end of file
+jQuery(function(u){if("undefined"==typeof wc_country_select_params)return!1;if(u().selectWoo){var t=function(){u("select.country_select:visible, select.state_select:visible").each(function(){var t=u.extend({placeholderOption:"first",width:"100%"},{language:{errorLoading:function(){return wc_country_select_params.i18n_searching},inputTooLong:function(t){var e=t.input.length-t.maximum;return 1===e?wc_country_select_params.i18n_input_too_long_1:wc_country_select_params.i18n_input_too_long_n.replace("%qty%",e)},inputTooShort:function(t){var e=t.minimum-t.input.length;return 1===e?wc_country_select_params.i18n_input_too_short_1:wc_country_select_params.i18n_input_too_short_n.replace("%qty%",e)},loadingMore:function(){return wc_country_select_params.i18n_load_more},maximumSelected:function(t){return 1===t.maximum?wc_country_select_params.i18n_selection_too_long_1:wc_country_select_params.i18n_selection_too_long_n.replace("%qty%",t.maximum)},noResults:function(){return wc_country_select_params.i18n_no_matches},searching:function(){return wc_country_select_params.i18n_searching}}});u(this).selectWoo(t),u(this).on("select2:select",function(){u(this).focus()})})};t(),u(document.body).bind("country_to_state_changed",function(){t()})}var e=wc_country_select_params.countries.replace(/"/g,'"'),p=u.parseJSON(e);u(document.body).on("change","select.country_to_state, input.country_to_state",function(){var t=u(this).closest(".woocommerce-billing-fields, .woocommerce-shipping-fields, .woocommerce-shipping-calculator");t.length||(t=u(this).closest(".form-row").parent());var e=u(this).val(),n=t.find("#billing_state, #shipping_state, #calc_shipping_state"),o=n.closest("p.form-row"),c=n.attr("name"),i=n.attr("id"),r=n.val(),a=n.attr("placeholder")||n.attr("data-placeholder")||"";if(p[e])if(u.isEmptyObject(p[e]))n.closest("p.form-row").hide().find(".select2-container").remove(),n.replaceWith(' '),u(document.body).trigger("country_to_state_changed",[e,t]);else{var s="",_=p[e];for(var l in _)_.hasOwnProperty(l)&&(s=s+''+_[l]+" ");n.closest("p.form-row").show(),n.is("input")&&(n.replaceWith(' '),n=t.find("#billing_state, #shipping_state, #calc_shipping_state")),n.html(''+wc_country_select_params.i18n_select_state_text+" "+s),n.val(r).change(),u(document.body).trigger("country_to_state_changed",[e,t])}else n.is("select")?(o.show().find(".select2-container").remove(),n.replaceWith(' '),u(document.body).trigger("country_to_state_changed",[e,t])):n.is('input[type="hidden"]')&&(o.show().find(".select2-container").remove(),n.replaceWith(' '),u(document.body).trigger("country_to_state_changed",[e,t]));u(document.body).trigger("country_to_state_changing",[e,t])})});
\ No newline at end of file
diff --git a/assets/js/frontend/geolocation.min.js b/assets/js/frontend/geolocation.min.js
index bf6a4d6d5f3..2fbee5a8454 100644
--- a/assets/js/frontend/geolocation.min.js
+++ b/assets/js/frontend/geolocation.min.js
@@ -1 +1 @@
-jQuery(function(a){var o=window.location.toString(),t=function(){wc_geolocation_params.hash&&a('a[href^="'+wc_geolocation_params.home_url+'"]:not(a[href*="v="]), a[href^="/"]:not(a[href*="v="])').each(function(){var o=a(this),t=o.attr("href"),n=t.split("#");t=(t=n[0]).indexOf("?")>0?t+"&v="+wc_geolocation_params.hash:t+"?v="+wc_geolocation_params.hash,"undefined"!=typeof n[1]&&null!==n[1]&&(t=t+"#"+n[1]),o.attr("href",t)})},n=function(a){o=o.indexOf("?v=")>0||o.indexOf("&v=")>0?o.replace(/v=[^&]+/,"v="+a):o.indexOf("?")>0?o+"&v="+a:o+"?v="+a,window.location=o},e={url:wc_geolocation_params.wc_ajax_url.toString().replace("%%endpoint%%","get_customer_location"),type:"GET",success:function(a){a.success&&a.data.hash&&a.data.hash!==wc_geolocation_params.hash&&n(a.data.hash)}};"1"===wc_geolocation_params.is_available&&(a.ajax(e),a("form").each(function(){var o=a(this),t=o.attr("method"),n=o.find('input[name="v"]').length>0;if(t&&"get"===t.toLowerCase()&&!n)o.append(' ');else{var e=o.attr("action");e&&(e.indexOf("?")>0?o.attr("action",e+"&v="+wc_geolocation_params.hash):o.attr("action",e+"?v="+wc_geolocation_params.hash))}}),t()),a(document.body).on("added_to_cart",function(){t()})});
\ No newline at end of file
+jQuery(function(n){var t=window.location.toString(),a=function(){wc_geolocation_params.hash&&n('a[href^="'+wc_geolocation_params.home_url+'"]:not(a[href*="v="]), a[href^="/"]:not(a[href*="v="])').each(function(){var a=n(this),o=a.attr("href"),t=o.split("#");o=0<(o=t[0]).indexOf("?")?o+"&v="+wc_geolocation_params.hash:o+"?v="+wc_geolocation_params.hash,"undefined"!=typeof t[1]&&null!==t[1]&&(o=o+"#"+t[1]),a.attr("href",o)})},o={url:wc_geolocation_params.wc_ajax_url.toString().replace("%%endpoint%%","get_customer_location"),type:"GET",success:function(a){var o;a.success&&a.data.hash&&a.data.hash!==wc_geolocation_params.hash&&(o=a.data.hash,t=0 ');else{var e=a.attr("action");e&&(00&&a'),s(document.body).trigger("wc-password-strength-added")):(t.show(),s(document.body).trigger("wc-password-strength-show"))},checkPasswordStrength:function(s,r){var e=s.find(".woocommerce-password-strength"),t=s.find(".woocommerce-password-hint"),o=''+wc_password_strength_meter_params.i18n_password_hint+" ",a=wp.passwordStrength.meter(r.val(),wp.passwordStrength.userInputBlacklist()),d="";if(e.removeClass("short bad good strong"),t.remove(),e.is(":hidden"))return a;switch(a'),a(document.body).trigger("wc-password-strength-added")):(e.show(),a(document.body).trigger("wc-password-strength-show"))},checkPasswordStrength:function(s,r){var e=s.find(".woocommerce-password-strength"),t=s.find(".woocommerce-password-hint"),o=''+wc_password_strength_meter_params.i18n_password_hint+" ",a=wp.passwordStrength.meter(r.val(),wp.passwordStrength.userInputBlacklist()),d="";if(e.removeClass("short bad good strong"),t.remove(),e.is(":hidden"))return a;switch(a=0||"#reviews"===t||"#tab-reviews"===t?o.find("li.reviews_tab a").click():i.indexOf("comment-page-")>0||i.indexOf("cpage=")>0?o.find("li.reviews_tab a").click():"#tab-additional_information"===t?o.find("li.additional_information_tab a").click():o.find("li:first a").click()}).on("click",".wc-tabs li a, ul.tabs li a",function(t){t.preventDefault();var i=e(this),o=i.closest(".wc-tabs-wrapper, .woocommerce-tabs");o.find(".wc-tabs, ul.tabs").find("li").removeClass("active"),o.find(".wc-tab, .panel:not(.panel .panel)").hide(),i.closest("li").addClass("active"),o.find(i.attr("href")).show()}).on("click","a.woocommerce-review-link",function(){return e(".reviews_tab a").click(),!0}).on("init","#rating",function(){e("#rating").hide().before('1 2 3 4 5
')}).on("click","#respond p.stars a",function(){var t=e(this),i=e(this).closest("#respond").find("#rating"),o=e(this).closest(".stars");return i.val(t.text()),t.siblings("a").removeClass("active"),t.addClass("active"),o.addClass("selected"),!1}).on("click","#respond #submit",function(){var t=e(this).closest("#respond").find("#rating"),i=t.val();if(t.length>0&&!i&&"yes"===wc_single_product_params.review_rating_required)return window.alert(wc_single_product_params.i18n_required_rating_text),!1}),e(".wc-tabs-wrapper, .woocommerce-tabs, #rating").trigger("init");var t=function(t,i){this.$target=t,this.$images=e(".woocommerce-product-gallery__image",t),0!==this.$images.length?(t.data("product_gallery",this),this.flexslider_enabled=e.isFunction(e.fn.flexslider)&&wc_single_product_params.flexslider_enabled,this.zoom_enabled=e.isFunction(e.fn.zoom)&&wc_single_product_params.zoom_enabled,this.photoswipe_enabled="undefined"!=typeof PhotoSwipe&&wc_single_product_params.photoswipe_enabled,i&&(this.flexslider_enabled=!1!==i.flexslider_enabled&&this.flexslider_enabled,this.zoom_enabled=!1!==i.zoom_enabled&&this.zoom_enabled,this.photoswipe_enabled=!1!==i.photoswipe_enabled&&this.photoswipe_enabled),1===this.$images.length&&(this.flexslider_enabled=!1),this.initFlexslider=this.initFlexslider.bind(this),this.initZoom=this.initZoom.bind(this),this.initZoomForTarget=this.initZoomForTarget.bind(this),this.initPhotoswipe=this.initPhotoswipe.bind(this),this.onResetSlidePosition=this.onResetSlidePosition.bind(this),this.getGalleryItems=this.getGalleryItems.bind(this),this.openPhotoswipe=this.openPhotoswipe.bind(this),this.flexslider_enabled?(this.initFlexslider(),t.on("woocommerce_gallery_reset_slide_position",this.onResetSlidePosition)):this.$target.css("opacity",1),this.zoom_enabled&&(this.initZoom(),t.on("woocommerce_gallery_init_zoom",this.initZoom)),this.photoswipe_enabled&&this.initPhotoswipe()):this.$target.css("opacity",1)};t.prototype.initFlexslider=function(){var t=this.$target,i=this,o=e.extend({selector:".woocommerce-product-gallery__wrapper > .woocommerce-product-gallery__image",start:function(){t.css("opacity",1)},after:function(e){i.initZoomForTarget(i.$images.eq(e.currentSlide))}},wc_single_product_params.flexslider);t.flexslider(o),e(".woocommerce-product-gallery__wrapper .woocommerce-product-gallery__image:eq(0) .wp-post-image").one("load",function(){var t=e(this);t&&setTimeout(function(){var e=t.closest(".woocommerce-product-gallery__image").height(),i=t.closest(".flex-viewport");e&&i&&i.height(e)},100)}).each(function(){this.complete&&e(this).trigger("load")})},t.prototype.initZoom=function(){this.initZoomForTarget(this.$images.first())},t.prototype.initZoomForTarget=function(t){if(!this.zoom_enabled)return!1;var i=this.$target.width(),o=!1;if(e(t).each(function(t,a){if(e(a).find("img").data("large_image_width")>i)return o=!0,!1}),o){var a=e.extend({touch:!1},wc_single_product_params.zoom_options);"ontouchstart"in document.documentElement&&(a.on="click"),t.trigger("zoom.destroy"),t.zoom(a)}},t.prototype.initPhotoswipe=function(){this.zoom_enabled&&this.$images.length>0?(this.$target.prepend('🔍 '),this.$target.on("click",".woocommerce-product-gallery__trigger",this.openPhotoswipe),this.$target.on("click",".woocommerce-product-gallery__image a",function(e){e.preventDefault()}),this.flexslider_enabled||this.$target.on("click",".woocommerce-product-gallery__image a",this.openPhotoswipe)):this.$target.on("click",".woocommerce-product-gallery__image a",this.openPhotoswipe)},t.prototype.onResetSlidePosition=function(){this.$target.flexslider(0)},t.prototype.getGalleryItems=function(){var t=this.$images,i=[];return t.length>0&&t.each(function(t,o){var a=e(o).find("img");if(a.length){var s={src:a.attr("data-large_image"),w:a.attr("data-large_image_width"),h:a.attr("data-large_image_height"),title:a.attr("data-caption")?a.attr("data-caption"):a.attr("title")};i.push(s)}}),i},t.prototype.openPhotoswipe=function(t){t.preventDefault();var i,o=e(".pswp")[0],a=this.getGalleryItems(),s=e(t.target);i=s.is(".woocommerce-product-gallery__trigger")||s.is(".woocommerce-product-gallery__trigger img")?this.$target.find(".flex-active-slide"):s.closest(".woocommerce-product-gallery__image");var r=e.extend({index:e(i).index()},wc_single_product_params.photoswipe_options);new PhotoSwipe(o,PhotoSwipeUI_Default,a,r).init()},e.fn.wc_product_gallery=function(e){return new t(this,e),this},e(".woocommerce-product-gallery").each(function(){e(this).wc_product_gallery()})});
\ No newline at end of file
+jQuery(function(r){if("undefined"==typeof wc_single_product_params)return!1;r("body").on("init",".wc-tabs-wrapper, .woocommerce-tabs",function(){r(".wc-tab, .woocommerce-tabs .panel:not(.panel .panel)").hide();var e=window.location.hash,t=window.location.href,i=r(this).find(".wc-tabs, ul.tabs").first();0<=e.toLowerCase().indexOf("comment-")||"#reviews"===e||"#tab-reviews"===e?i.find("li.reviews_tab a").click():01 2 3 4 5 ')}).on("click","#respond p.stars a",function(){var e=r(this),t=r(this).closest("#respond").find("#rating"),i=r(this).closest(".stars");return t.val(e.text()),e.siblings("a").removeClass("active"),e.addClass("active"),i.addClass("selected"),!1}).on("click","#respond #submit",function(){var e=r(this).closest("#respond").find("#rating"),t=e.val();if(0 .woocommerce-product-gallery__image",start:function(){e.css("opacity",1)},after:function(e){t.initZoomForTarget(t.$images.eq(e.currentSlide))}},wc_single_product_params.flexslider);e.flexslider(i),r(".woocommerce-product-gallery__wrapper .woocommerce-product-gallery__image:eq(0) .wp-post-image").one("load",function(){var i=r(this);i&&setTimeout(function(){var e=i.closest(".woocommerce-product-gallery__image").height(),t=i.closest(".flex-viewport");e&&t&&t.height(e)},100)}).each(function(){this.complete&&r(this).trigger("load")})},t.prototype.initZoom=function(){this.initZoomForTarget(this.$images.first())},t.prototype.initZoomForTarget=function(e){if(!this.zoom_enabled)return!1;var i=this.$target.width(),o=!1;if(r(e).each(function(e,t){if(r(t).find("img").data("large_image_width")>i)return!(o=!0)}),o){var t=r.extend({touch:!1},wc_single_product_params.zoom_options);"ontouchstart"in document.documentElement&&(t.on="click"),e.trigger("zoom.destroy"),e.zoom(t)}},t.prototype.initPhotoswipe=function(){this.zoom_enabled&&0🔍 '),this.$target.on("click",".woocommerce-product-gallery__trigger",this.openPhotoswipe),this.$target.on("click",".woocommerce-product-gallery__image a",function(e){e.preventDefault()}),this.flexslider_enabled||this.$target.on("click",".woocommerce-product-gallery__image a",this.openPhotoswipe)):this.$target.on("click",".woocommerce-product-gallery__image a",this.openPhotoswipe)},t.prototype.onResetSlidePosition=function(){this.$target.flexslider(0)},t.prototype.getGalleryItems=function(){var e=this.$images,a=[];return 0=0&&parseFloat(o(this).val())=5.3.1"
+ "php": ">=5.6.0"
},
"conflict": {
"nette/nette": "<2.2"
},
"require-dev": {
- "nette/tester": "~1.0"
+ "nette/tester": "~2.0",
+ "tracy/tracy": "^2.3"
},
"suggest": {
"ext-gd": "to use Image",
@@ -1786,9 +1792,17 @@
"ext-xml": "to use Strings::length() etc. when mbstring is not available"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.5-dev"
+ }
+ },
"autoload": {
"classmap": [
"src/"
+ ],
+ "files": [
+ "src/loader.php"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -1807,9 +1821,25 @@
"homepage": "https://nette.org/contributors"
}
],
- "description": "Nette Utility Classes",
+ "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
"homepage": "https://nette.org",
- "time": "2016-12-12T12:20:10+00:00"
+ "keywords": [
+ "array",
+ "core",
+ "datetime",
+ "images",
+ "json",
+ "nette",
+ "paginator",
+ "password",
+ "slugify",
+ "string",
+ "unicode",
+ "utf-8",
+ "utility",
+ "validation"
+ ],
+ "time": "2018-09-18T10:22:16+00:00"
},
{
"name": "phar-io/manifest",
@@ -1913,6 +1943,164 @@
"description": "Library for handling version information and constraints",
"time": "2017-03-05T17:38:23+00:00"
},
+ {
+ "name": "phpcompatibility/php-compatibility",
+ "version": "9.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHPCompatibility/PHPCompatibility.git",
+ "reference": "e9f4047e5edf53c88f36f1dafc0d49454ce13e25"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibility/zipball/e9f4047e5edf53c88f36f1dafc0d49454ce13e25",
+ "reference": "e9f4047e5edf53c88f36f1dafc0d49454ce13e25",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3",
+ "squizlabs/php_codesniffer": "^2.3 || ^3.0.2"
+ },
+ "conflict": {
+ "squizlabs/php_codesniffer": "2.6.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.5 || ^5.0 || ^6.0 || ^7.0"
+ },
+ "suggest": {
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically.",
+ "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues."
+ },
+ "type": "phpcodesniffer-standard",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-3.0-or-later"
+ ],
+ "authors": [
+ {
+ "name": "Contributors",
+ "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors"
+ },
+ {
+ "name": "Wim Godden",
+ "homepage": "https://github.com/wimg",
+ "role": "lead"
+ },
+ {
+ "name": "Juliette Reinders Folmer",
+ "homepage": "https://github.com/jrfnl",
+ "role": "lead"
+ }
+ ],
+ "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility.",
+ "homepage": "http://techblog.wimgodden.be/tag/codesniffer/",
+ "keywords": [
+ "compatibility",
+ "phpcs",
+ "standards"
+ ],
+ "time": "2018-10-07T17:38:02+00:00"
+ },
+ {
+ "name": "phpcompatibility/phpcompatibility-paragonie",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git",
+ "reference": "67d89dcef47f351144d24b247aa968f2269162f7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/67d89dcef47f351144d24b247aa968f2269162f7",
+ "reference": "67d89dcef47f351144d24b247aa968f2269162f7",
+ "shasum": ""
+ },
+ "require": {
+ "phpcompatibility/php-compatibility": "^9.0"
+ },
+ "require-dev": {
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.4.4"
+ },
+ "suggest": {
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.4.4 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.",
+ "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues."
+ },
+ "type": "phpcodesniffer-standard",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-3.0-or-later"
+ ],
+ "authors": [
+ {
+ "name": "Wim Godden",
+ "role": "lead"
+ },
+ {
+ "name": "Juliette Reinders Folmer",
+ "role": "lead"
+ }
+ ],
+ "description": "A set of rulesets for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by the Paragonie polyfill libraries.",
+ "homepage": "http://phpcompatibility.com/",
+ "keywords": [
+ "compatibility",
+ "paragonie",
+ "phpcs",
+ "polyfill",
+ "standards"
+ ],
+ "time": "2018-10-07T17:59:30+00:00"
+ },
+ {
+ "name": "phpcompatibility/phpcompatibility-wp",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git",
+ "reference": "cb303f0067cd5b366a41d4fb0e254fb40ff02efd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/cb303f0067cd5b366a41d4fb0e254fb40ff02efd",
+ "reference": "cb303f0067cd5b366a41d4fb0e254fb40ff02efd",
+ "shasum": ""
+ },
+ "require": {
+ "phpcompatibility/php-compatibility": "^9.0",
+ "phpcompatibility/phpcompatibility-paragonie": "^1.0"
+ },
+ "require-dev": {
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3"
+ },
+ "suggest": {
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3 || This Composer plugin will sort out the PHP_CodeSniffer 'installed_paths' automatically.",
+ "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues."
+ },
+ "type": "phpcodesniffer-standard",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-3.0-or-later"
+ ],
+ "authors": [
+ {
+ "name": "Wim Godden",
+ "role": "lead"
+ },
+ {
+ "name": "Juliette Reinders Folmer",
+ "role": "lead"
+ }
+ ],
+ "description": "A ruleset for PHP_CodeSniffer to check for PHP cross-version compatibility issues in projects, while accounting for polyfills provided by WordPress.",
+ "homepage": "http://phpcompatibility.com/",
+ "keywords": [
+ "compatibility",
+ "phpcs",
+ "standards",
+ "wordpress"
+ ],
+ "time": "2018-10-07T18:31:37+00:00"
+ },
{
"name": "phpdocumentor/reflection-common",
"version": "1.0.1",
@@ -2067,16 +2255,16 @@
},
{
"name": "phpspec/prophecy",
- "version": "1.7.6",
+ "version": "1.8.0",
"source": {
"type": "git",
"url": "https://github.com/phpspec/prophecy.git",
- "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712"
+ "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpspec/prophecy/zipball/33a7e3c4fda54e912ff6338c48823bd5c0f0b712",
- "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06",
+ "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06",
"shasum": ""
},
"require": {
@@ -2088,12 +2276,12 @@
},
"require-dev": {
"phpspec/phpspec": "^2.5|^3.2",
- "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5"
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.7.x-dev"
+ "dev-master": "1.8.x-dev"
}
},
"autoload": {
@@ -2126,7 +2314,7 @@
"spy",
"stub"
],
- "time": "2018-04-18T13:57:24+00:00"
+ "time": "2018-08-05T17:53:17+00:00"
},
{
"name": "phpunit/php-code-coverage",
@@ -2379,16 +2567,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "6.5.8",
+ "version": "6.5.13",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "4f21a3c6b97c42952fd5c2837bb354ec0199b97b"
+ "reference": "0973426fb012359b2f18d3bd1e90ef1172839693"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4f21a3c6b97c42952fd5c2837bb354ec0199b97b",
- "reference": "4f21a3c6b97c42952fd5c2837bb354ec0199b97b",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0973426fb012359b2f18d3bd1e90ef1172839693",
+ "reference": "0973426fb012359b2f18d3bd1e90ef1172839693",
"shasum": ""
},
"require": {
@@ -2406,7 +2594,7 @@
"phpunit/php-file-iterator": "^1.4.3",
"phpunit/php-text-template": "^1.2.1",
"phpunit/php-timer": "^1.0.9",
- "phpunit/phpunit-mock-objects": "^5.0.5",
+ "phpunit/phpunit-mock-objects": "^5.0.9",
"sebastian/comparator": "^2.1",
"sebastian/diff": "^2.0",
"sebastian/environment": "^3.1",
@@ -2459,20 +2647,20 @@
"testing",
"xunit"
],
- "time": "2018-04-10T11:38:34+00:00"
+ "time": "2018-09-08T15:10:43+00:00"
},
{
"name": "phpunit/phpunit-mock-objects",
- "version": "5.0.7",
+ "version": "5.0.10",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
- "reference": "3eaf040f20154d27d6da59ca2c6e28ac8fd56dce"
+ "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/3eaf040f20154d27d6da59ca2c6e28ac8fd56dce",
- "reference": "3eaf040f20154d27d6da59ca2c6e28ac8fd56dce",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/cd1cf05c553ecfec36b170070573e540b67d3f1f",
+ "reference": "cd1cf05c553ecfec36b170070573e540b67d3f1f",
"shasum": ""
},
"require": {
@@ -2485,7 +2673,7 @@
"phpunit/phpunit": "<6.0"
},
"require-dev": {
- "phpunit/phpunit": "^6.5"
+ "phpunit/phpunit": "^6.5.11"
},
"suggest": {
"ext-soap": "*"
@@ -2518,7 +2706,7 @@
"mock",
"xunit"
],
- "time": "2018-05-29T13:50:43+00:00"
+ "time": "2018-08-09T05:50:03+00:00"
},
{
"name": "psr/log",
@@ -3177,16 +3365,16 @@
},
{
"name": "squizlabs/php_codesniffer",
- "version": "3.2.3",
+ "version": "3.3.2",
"source": {
"type": "git",
"url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
- "reference": "4842476c434e375f9d3182ff7b89059583aa8b27"
+ "reference": "6ad28354c04b364c3c71a34e4a18b629cc3b231e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/4842476c434e375f9d3182ff7b89059583aa8b27",
- "reference": "4842476c434e375f9d3182ff7b89059583aa8b27",
+ "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/6ad28354c04b364c3c71a34e4a18b629cc3b231e",
+ "reference": "6ad28354c04b364c3c71a34e4a18b629cc3b231e",
"shasum": ""
},
"require": {
@@ -3224,20 +3412,20 @@
"phpcs",
"standards"
],
- "time": "2018-02-20T21:35:23+00:00"
+ "time": "2018-09-23T23:08:17+00:00"
},
{
"name": "symfony/console",
- "version": "v2.8.41",
+ "version": "v2.8.47",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "e8e59b74ad1274714dad2748349b55e3e6e630c7"
+ "reference": "48ed63767c4add573fb3e9e127d3426db27f78e8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/e8e59b74ad1274714dad2748349b55e3e6e630c7",
- "reference": "e8e59b74ad1274714dad2748349b55e3e6e630c7",
+ "url": "https://api.github.com/repos/symfony/console/zipball/48ed63767c4add573fb3e9e127d3426db27f78e8",
+ "reference": "48ed63767c4add573fb3e9e127d3426db27f78e8",
"shasum": ""
},
"require": {
@@ -3285,7 +3473,7 @@
],
"description": "Symfony Console Component",
"homepage": "https://symfony.com",
- "time": "2018-05-15T21:17:45+00:00"
+ "time": "2018-10-30T14:26:34+00:00"
},
{
"name": "symfony/debug",
@@ -3401,25 +3589,28 @@
},
{
"name": "symfony/polyfill-ctype",
- "version": "v1.8.0",
+ "version": "v1.10.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae"
+ "reference": "e3d826245268269cd66f8326bd8bc066687b4a19"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/7cc359f1b7b80fc25ed7796be7d96adc9b354bae",
- "reference": "7cc359f1b7b80fc25ed7796be7d96adc9b354bae",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19",
+ "reference": "e3d826245268269cd66f8326bd8bc066687b4a19",
"shasum": ""
},
"require": {
"php": ">=5.3.3"
},
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.8-dev"
+ "dev-master": "1.9-dev"
}
},
"autoload": {
@@ -3452,20 +3643,20 @@
"polyfill",
"portable"
],
- "time": "2018-04-30T19:57:29+00:00"
+ "time": "2018-08-06T14:22:27+00:00"
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.8.0",
+ "version": "v1.10.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "3296adf6a6454a050679cde90f95350ad604b171"
+ "reference": "c79c051f5b3a46be09205c73b80b346e4153e494"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/3296adf6a6454a050679cde90f95350ad604b171",
- "reference": "3296adf6a6454a050679cde90f95350ad604b171",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/c79c051f5b3a46be09205c73b80b346e4153e494",
+ "reference": "c79c051f5b3a46be09205c73b80b346e4153e494",
"shasum": ""
},
"require": {
@@ -3477,7 +3668,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.8-dev"
+ "dev-master": "1.9-dev"
}
},
"autoload": {
@@ -3511,20 +3702,20 @@
"portable",
"shim"
],
- "time": "2018-04-26T10:06:28+00:00"
+ "time": "2018-09-21T13:07:52+00:00"
},
{
"name": "symfony/yaml",
- "version": "v2.8.41",
+ "version": "v2.8.47",
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
- "reference": "51356b7a2ff7c9fd06b2f1681cc463bb62b5c1ff"
+ "reference": "0e16589861f192dbffb19b06683ce3ef58f7f99d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/51356b7a2ff7c9fd06b2f1681cc463bb62b5c1ff",
- "reference": "51356b7a2ff7c9fd06b2f1681cc463bb62b5c1ff",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/0e16589861f192dbffb19b06683ce3ef58f7f99d",
+ "reference": "0e16589861f192dbffb19b06683ce3ef58f7f99d",
"shasum": ""
},
"require": {
@@ -3561,7 +3752,7 @@
],
"description": "Symfony Yaml Component",
"homepage": "https://symfony.com",
- "time": "2018-05-01T22:52:40+00:00"
+ "time": "2018-10-02T16:27:16+00:00"
},
{
"name": "theseer/tokenizer",
@@ -3605,16 +3796,16 @@
},
{
"name": "tracy/tracy",
- "version": "v2.5.0",
+ "version": "v2.5.5",
"source": {
"type": "git",
"url": "https://github.com/nette/tracy.git",
- "reference": "534d4e4f0f31da494026a3761fad020c20b8debf"
+ "reference": "35fa649b483b28e16f61de07110ea0585fc8d6ea"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nette/tracy/zipball/534d4e4f0f31da494026a3761fad020c20b8debf",
- "reference": "534d4e4f0f31da494026a3761fad020c20b8debf",
+ "url": "https://api.github.com/repos/nette/tracy/zipball/35fa649b483b28e16f61de07110ea0585fc8d6ea",
+ "reference": "35fa649b483b28e16f61de07110ea0585fc8d6ea",
"shasum": ""
},
"require": {
@@ -3624,7 +3815,8 @@
},
"require-dev": {
"nette/di": "~2.3",
- "nette/tester": "~1.7"
+ "nette/tester": "~1.7",
+ "nette/utils": "~2.3"
},
"suggest": {
"https://nette.org/donate": "Please support Tracy via a donation"
@@ -3666,7 +3858,7 @@
"nette",
"profiler"
],
- "time": "2018-05-25T09:33:08+00:00"
+ "time": "2018-11-05T15:10:59+00:00"
},
{
"name": "webmozart/assert",
@@ -3718,58 +3910,6 @@
],
"time": "2018-01-29T19:49:41+00:00"
},
- {
- "name": "wimg/php-compatibility",
- "version": "8.1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/wimg/PHPCompatibility.git",
- "reference": "4ac01e4fe8faaa4f8d3b3cd06ea92e5418ce472e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/wimg/PHPCompatibility/zipball/4ac01e4fe8faaa4f8d3b3cd06ea92e5418ce472e",
- "reference": "4ac01e4fe8faaa4f8d3b3cd06ea92e5418ce472e",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3",
- "squizlabs/php_codesniffer": "^2.2 || ^3.0.2"
- },
- "conflict": {
- "squizlabs/php_codesniffer": "2.6.2"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0"
- },
- "suggest": {
- "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3"
- },
- "type": "phpcodesniffer-standard",
- "autoload": {
- "psr-4": {
- "PHPCompatibility\\": "PHPCompatibility/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "LGPL-3.0"
- ],
- "authors": [
- {
- "name": "Wim Godden",
- "role": "lead"
- }
- ],
- "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP version compatibility.",
- "homepage": "http://techblog.wimgodden.be/tag/codesniffer/",
- "keywords": [
- "compatibility",
- "phpcs",
- "standards"
- ],
- "time": "2017-12-27T21:58:38+00:00"
- },
{
"name": "woocommerce/woocommerce-git-hooks",
"version": "1.0.5",
@@ -3805,24 +3945,23 @@
},
{
"name": "woocommerce/woocommerce-sniffs",
- "version": "0.0.2",
+ "version": "0.0.5",
"source": {
"type": "git",
"url": "https://github.com/woocommerce/woocommerce-sniffs.git",
- "reference": "2890fd5d98b318f62acb42f2b5cd6d02627cfd82"
+ "reference": "f91f940ea0dca2b67be7a8a35c1ded41257b372f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/woocommerce/woocommerce-sniffs/zipball/2890fd5d98b318f62acb42f2b5cd6d02627cfd82",
- "reference": "2890fd5d98b318f62acb42f2b5cd6d02627cfd82",
+ "url": "https://api.github.com/repos/woocommerce/woocommerce-sniffs/zipball/f91f940ea0dca2b67be7a8a35c1ded41257b372f",
+ "reference": "f91f940ea0dca2b67be7a8a35c1ded41257b372f",
"shasum": ""
},
"require": {
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0",
"php": ">=7.0",
- "squizlabs/php_codesniffer": "^3.0.2"
- },
- "suggest": {
- "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3"
+ "phpcompatibility/phpcompatibility-wp": "2.0.0",
+ "wp-coding-standards/wpcs": "^1.2"
},
"type": "phpcodesniffer-standard",
"notification-url": "https://packagist.org/downloads/",
@@ -3842,28 +3981,31 @@
"woocommerce",
"wordpress"
],
- "time": "2018-03-22T18:39:19+00:00"
+ "time": "2018-11-20T21:33:22+00:00"
},
{
"name": "wp-coding-standards/wpcs",
- "version": "0.14.1",
+ "version": "1.2.0",
"source": {
"type": "git",
"url": "https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards.git",
- "reference": "cf6b310caad735816caef7573295f8a534374706"
+ "reference": "7aa217ab38156c5cb4eae0f04ae376027c407a9b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/WordPress-Coding-Standards/WordPress-Coding-Standards/zipball/cf6b310caad735816caef7573295f8a534374706",
- "reference": "cf6b310caad735816caef7573295f8a534374706",
+ "url": "https://api.github.com/repos/WordPress-Coding-Standards/WordPress-Coding-Standards/zipball/7aa217ab38156c5cb4eae0f04ae376027c407a9b",
+ "reference": "7aa217ab38156c5cb4eae0f04ae376027c407a9b",
"shasum": ""
},
"require": {
"php": ">=5.3",
"squizlabs/php_codesniffer": "^2.9.0 || ^3.0.2"
},
+ "require-dev": {
+ "phpcompatibility/php-compatibility": "^9.0"
+ },
"suggest": {
- "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3"
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically."
},
"type": "phpcodesniffer-standard",
"notification-url": "https://packagist.org/downloads/",
@@ -3882,7 +4024,7 @@
"standards",
"wordpress"
],
- "time": "2018-02-16T01:57:48+00:00"
+ "time": "2018-11-12T10:13:12+00:00"
}
],
"aliases": [],
diff --git a/i18n/continents.php b/i18n/continents.php
index 351f8490320..da519983b17 100644
--- a/i18n/continents.php
+++ b/i18n/continents.php
@@ -205,7 +205,6 @@ return array(
'countries' => array(
'AG',
'AI',
- 'AN',
'AW',
'BB',
'BL',
diff --git a/i18n/languages/woocommerce.pot b/i18n/languages/woocommerce.pot
index 75a808bca2f..5b2b01a488f 100644
--- a/i18n/languages/woocommerce.pot
+++ b/i18n/languages/woocommerce.pot
@@ -2,16 +2,16 @@
# This file is distributed under the same license as the WooCommerce package.
msgid ""
msgstr ""
-"Project-Id-Version: WooCommerce 3.5.0-dev\n"
+"Project-Id-Version: WooCommerce 3.5.0-beta.1\n"
"Report-Msgid-Bugs-To: https://github.com/woocommerce/woocommerce/issues\n"
-"POT-Creation-Date: 2018-06-07 09:30:10+00:00\n"
+"POT-Creation-Date: 2018-09-28 15:28:33+00:00\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"PO-Revision-Date: 2018-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
-"X-Generator: grunt-wp-i18n1.0.1\n"
+"X-Generator: grunt-wp-i18n1.0.2\n"
#: i18n/continents.php:15
msgid "Africa"
@@ -33,11 +33,11 @@ msgstr ""
msgid "North America"
msgstr ""
-#: i18n/continents.php:251
+#: i18n/continents.php:250
msgid "Oceania"
msgstr ""
-#: i18n/continents.php:282
+#: i18n/continents.php:281
msgid "South America"
msgstr ""
@@ -1161,7 +1161,7 @@ msgstr ""
msgid "Mendoza"
msgstr ""
-#: i18n/states/AR.php:27
+#: i18n/states/AR.php:27 i18n/states/PY.php:22
msgid "Misiones"
msgstr ""
@@ -2834,7 +2834,7 @@ msgid "Razavi Khorasan (خراسان رضوی)"
msgstr ""
#: i18n/states/IR.php:33
-msgid "North Khorasan (خراسان جنوبی)"
+msgid "North Khorasan (خراسان شمالی)"
msgstr ""
#: i18n/states/IR.php:34
@@ -4609,6 +4609,74 @@ msgstr ""
msgid "Sindh"
msgstr ""
+#: i18n/states/PY.php:14
+msgid "Asunción"
+msgstr ""
+
+#: i18n/states/PY.php:15
+msgid "Concepción"
+msgstr ""
+
+#: i18n/states/PY.php:16
+msgid "San Pedro"
+msgstr ""
+
+#: i18n/states/PY.php:17
+msgid "Cordillera"
+msgstr ""
+
+#: i18n/states/PY.php:18
+msgid "Guairá"
+msgstr ""
+
+#: i18n/states/PY.php:19
+msgid "Caaguazú"
+msgstr ""
+
+#: i18n/states/PY.php:20
+msgid "Caazapá"
+msgstr ""
+
+#: i18n/states/PY.php:21
+msgid "Itapúa"
+msgstr ""
+
+#: i18n/states/PY.php:23
+msgid "Paraguarí"
+msgstr ""
+
+#: i18n/states/PY.php:24
+msgid "Alto Paraná"
+msgstr ""
+
+#: i18n/states/PY.php:25
+msgid "Central"
+msgstr ""
+
+#: i18n/states/PY.php:26
+msgid "Ñeembucú"
+msgstr ""
+
+#: i18n/states/PY.php:27
+msgid "Amambay"
+msgstr ""
+
+#: i18n/states/PY.php:28
+msgid "Canindeyú"
+msgstr ""
+
+#: i18n/states/PY.php:29
+msgid "Presidente Hayes"
+msgstr ""
+
+#: i18n/states/PY.php:30
+msgid "Alto Paraguay"
+msgstr ""
+
+#: i18n/states/PY.php:31
+msgid "Boquerón"
+msgstr ""
+
#: i18n/states/RO.php:17
msgid "Alba"
msgstr ""
@@ -5797,10 +5865,10 @@ msgstr ""
msgid "Coupon code already applied!"
msgstr ""
-#: includes/abstracts/abstract-wc-order.php:1720
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:251
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:303
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:320
+#: includes/abstracts/abstract-wc-order.php:1726
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:256
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:308
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:325
#. translators: %s: method
#. translators: %s: method
#. translators: %s: payment method
@@ -5808,26 +5876,26 @@ msgstr ""
msgid "via %s"
msgstr ""
-#: includes/abstracts/abstract-wc-order.php:1725
-#: includes/class-wc-cart.php:1434 includes/class-wc-product-grouped.php:120
+#: includes/abstracts/abstract-wc-order.php:1731
+#: includes/class-wc-cart.php:1392 includes/class-wc-product-grouped.php:120
msgid "Free!"
msgstr ""
-#: includes/abstracts/abstract-wc-order.php:1754
+#: includes/abstracts/abstract-wc-order.php:1760
msgid "Subtotal:"
msgstr ""
-#: includes/abstracts/abstract-wc-order.php:1769
-#: includes/admin/meta-boxes/views/html-order-items.php:151
+#: includes/abstracts/abstract-wc-order.php:1775
+#: includes/admin/meta-boxes/views/html-order-items.php:141
msgid "Discount:"
msgstr ""
-#: includes/abstracts/abstract-wc-order.php:1784
-#: includes/admin/meta-boxes/views/html-order-items.php:163
+#: includes/abstracts/abstract-wc-order.php:1790
+#: includes/admin/meta-boxes/views/html-order-items.php:153
msgid "Shipping:"
msgstr ""
-#: includes/abstracts/abstract-wc-order.php:1845
+#: includes/abstracts/abstract-wc-order.php:1851
#: includes/admin/meta-boxes/views/html-order-item.php:98
#: includes/admin/meta-boxes/views/html-order-item.php:144
#: templates/checkout/order-receipt.php:34 templates/checkout/thankyou.php:63
@@ -5838,99 +5906,99 @@ msgstr ""
msgid "Return to payments"
msgstr ""
-#: includes/abstracts/abstract-wc-payment-gateway.php:493
+#: includes/abstracts/abstract-wc-payment-gateway.php:500
msgid "Use a new payment method"
msgstr ""
-#: includes/abstracts/abstract-wc-payment-gateway.php:518
+#: includes/abstracts/abstract-wc-payment-gateway.php:525
msgid "Save to account"
msgstr ""
-#: includes/abstracts/abstract-wc-product.php:767
+#: includes/abstracts/abstract-wc-product.php:779
msgid "Invalid catalog visibility option."
msgstr ""
-#: includes/abstracts/abstract-wc-product.php:804
+#: includes/abstracts/abstract-wc-product.php:816
msgid "Invalid or duplicated SKU."
msgstr ""
-#: includes/abstracts/abstract-wc-product.php:888
+#: includes/abstracts/abstract-wc-product.php:900
msgid "Invalid product tax status."
msgstr ""
-#: includes/abstracts/abstract-wc-product.php:1194
+#: includes/abstracts/abstract-wc-product.php:1215
#. translators: %1$s: Downloadable file
msgid ""
"The downloadable file %1$s cannot be used as it does not have an allowed "
"file type. Allowed types include: %2$s"
msgstr ""
-#: includes/abstracts/abstract-wc-product.php:1203
+#: includes/abstracts/abstract-wc-product.php:1224
#. translators: %s: Downloadable file
msgid "The downloadable file %s cannot be used as it does not exist on the server."
msgstr ""
-#: includes/abstracts/abstract-wc-product.php:1770
+#: includes/abstracts/abstract-wc-product.php:1792
#: includes/class-wc-product-simple.php:53
msgid "Add to cart"
msgstr ""
-#: includes/abstracts/abstract-wc-product.php:1779
+#: includes/abstracts/abstract-wc-product.php:1801
#: includes/class-wc-embed.php:106 includes/class-wc-product-simple.php:53
#: includes/class-wc-product-variable.php:60
msgid "Read more"
msgstr ""
-#: includes/abstracts/abstract-wc-product.php:1790
+#: includes/abstracts/abstract-wc-product.php:1812
#: includes/class-wc-product-simple.php:66
#. translators: %s: Product title
msgid "Read more about “%s”"
msgstr ""
-#: includes/abstracts/abstract-wc-product.php:1945
+#: includes/abstracts/abstract-wc-product.php:1968
#: includes/admin/class-wc-admin-reports.php:108
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:265
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:267
#: includes/admin/reports/class-wc-report-stock.php:118
-#: includes/wc-product-functions.php:826
+#: includes/wc-product-functions.php:848
msgid "Out of stock"
msgstr ""
-#: includes/abstracts/abstract-wc-product.php:1947 templates/cart/cart.php:91
+#: includes/abstracts/abstract-wc-product.php:1970 templates/cart/cart.php:89
msgid "Available on backorder"
msgstr ""
-#: includes/abstracts/abstract-wc-rest-controller.php:103
+#: includes/abstracts/abstract-wc-rest-controller.php:113
#: includes/api/legacy/v2/class-wc-api-coupons.php:529
#: includes/api/legacy/v2/class-wc-api-customers.php:792
-#: includes/api/legacy/v2/class-wc-api-orders.php:1789
-#: includes/api/legacy/v2/class-wc-api-products.php:2306
+#: includes/api/legacy/v2/class-wc-api-orders.php:1782
+#: includes/api/legacy/v2/class-wc-api-products.php:2311
#: includes/api/legacy/v3/class-wc-api-coupons.php:529
#: includes/api/legacy/v3/class-wc-api-customers.php:782
-#: includes/api/legacy/v3/class-wc-api-orders.php:1836
-#: includes/api/legacy/v3/class-wc-api-products.php:3119
+#: includes/api/legacy/v3/class-wc-api-orders.php:1827
+#: includes/api/legacy/v3/class-wc-api-products.php:3124
#: includes/api/legacy/v3/class-wc-api-taxes.php:465
#. translators: %s: items limit
msgid "Unable to accept more than %s items for this request."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-controller.php:245
-#: includes/abstracts/abstract-wc-rest-controller.php:263
-#: includes/abstracts/abstract-wc-rest-controller.php:286
-#: includes/abstracts/abstract-wc-rest-controller.php:329
-#: includes/api/class-wc-rest-payment-gateways-controller.php:187
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:314
+#: includes/abstracts/abstract-wc-rest-controller.php:255
+#: includes/abstracts/abstract-wc-rest-controller.php:273
+#: includes/abstracts/abstract-wc-rest-controller.php:296
+#: includes/abstracts/abstract-wc-rest-controller.php:339
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:187
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:314
msgid "An invalid setting value was passed."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-controller.php:388
+#: includes/abstracts/abstract-wc-rest-controller.php:398
msgid "List of created resources."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-controller.php:396
+#: includes/abstracts/abstract-wc-rest-controller.php:406
msgid "List of updated resources."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-controller.php:404
+#: includes/abstracts/abstract-wc-rest-controller.php:414
msgid "List of delete resources."
msgstr ""
@@ -5944,9 +6012,8 @@ msgstr ""
#: includes/abstracts/abstract-wc-rest-crud-controller.php:56
#: includes/abstracts/abstract-wc-rest-posts-controller.php:87
#: includes/abstracts/abstract-wc-rest-terms-controller.php:164
-#: includes/api/class-wc-rest-payment-gateways-controller.php:98
-#: includes/api/class-wc-rest-shipping-methods-controller.php:92
-#: includes/api/class-wc-rest-system-status-tools-controller.php:96
+#: includes/api/class-wc-rest-data-controller.php:75
+#: includes/api/class-wc-rest-product-reviews-controller.php:156
#: includes/api/v1/class-wc-rest-customers-controller.php:166
#: includes/api/v1/class-wc-rest-order-notes-controller.php:152
#: includes/api/v1/class-wc-rest-product-attributes-controller.php:159
@@ -5954,6 +6021,9 @@ msgstr ""
#: includes/api/v1/class-wc-rest-taxes-controller.php:143
#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:105
#: includes/api/v1/class-wc-rest-webhooks-controller.php:159
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:98
+#: includes/api/v2/class-wc-rest-shipping-methods-v2-controller.php:92
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:96
msgid "Sorry, you cannot view this resource."
msgstr ""
@@ -5961,11 +6031,11 @@ msgstr ""
#: includes/abstracts/abstract-wc-rest-posts-controller.php:103
#: includes/abstracts/abstract-wc-rest-shipping-zones-controller.php:101
#: includes/abstracts/abstract-wc-rest-terms-controller.php:183
-#: includes/api/class-wc-rest-payment-gateways-controller.php:111
-#: includes/api/class-wc-rest-product-variations-controller.php:162
#: includes/api/v1/class-wc-rest-customers-controller.php:183
#: includes/api/v1/class-wc-rest-taxes-controller.php:158
#: includes/api/v1/class-wc-rest-webhooks-controller.php:174
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:111
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:162
msgid "Sorry, you are not allowed to edit this resource."
msgstr ""
@@ -5984,137 +6054,142 @@ msgstr ""
#: includes/abstracts/abstract-wc-rest-crud-controller.php:140
#: includes/abstracts/abstract-wc-rest-crud-controller.php:235
-#: includes/abstracts/abstract-wc-rest-crud-controller.php:404
+#: includes/abstracts/abstract-wc-rest-crud-controller.php:418
#: includes/abstracts/abstract-wc-rest-posts-controller.php:153
-#: includes/api/class-wc-rest-product-variations-controller.php:499
-#: includes/api/class-wc-rest-products-controller.php:1307
#: includes/api/v1/class-wc-rest-webhooks-controller.php:303
#: includes/api/v1/class-wc-rest-webhooks-controller.php:460
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:499
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1314
msgid "Invalid ID."
msgstr ""
#: includes/abstracts/abstract-wc-rest-crud-controller.php:188
#: includes/abstracts/abstract-wc-rest-posts-controller.php:175
+#: includes/api/class-wc-rest-order-notes-controller.php:73
#: includes/api/v1/class-wc-rest-coupons-controller.php:310
#: includes/api/v1/class-wc-rest-order-notes-controller.php:220
#: includes/api/v1/class-wc-rest-order-refunds-controller.php:281
-#: includes/api/v1/class-wc-rest-orders-controller.php:826
+#: includes/api/v1/class-wc-rest-orders-controller.php:831
#: includes/api/v1/class-wc-rest-products-controller.php:739
#: includes/api/v1/class-wc-rest-webhooks-controller.php:321
#. translators: %s: post type
msgid "Cannot create existing %s."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-crud-controller.php:421
+#: includes/abstracts/abstract-wc-rest-crud-controller.php:435
#: includes/abstracts/abstract-wc-rest-posts-controller.php:438
-#: includes/api/class-wc-rest-product-variations-controller.php:520
-#: includes/api/class-wc-rest-products-controller.php:1336
#: includes/api/v1/class-wc-rest-products-controller.php:1656
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:520
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1343
#. translators: %s: post type
msgid "Sorry, you are not allowed to delete %s."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-crud-controller.php:435
+#: includes/abstracts/abstract-wc-rest-crud-controller.php:449
#: includes/abstracts/abstract-wc-rest-posts-controller.php:451
-#: includes/api/class-wc-rest-product-variations-controller.php:538
-#: includes/api/class-wc-rest-products-controller.php:1367
-#: includes/api/v1/class-wc-rest-products-controller.php:1683
+#: includes/api/v1/class-wc-rest-products-controller.php:1688
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:538
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1379
#. translators: %s: post type
msgid "The %s does not support trashing."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-crud-controller.php:442
+#: includes/abstracts/abstract-wc-rest-crud-controller.php:456
#: includes/abstracts/abstract-wc-rest-posts-controller.php:457
-#: includes/api/class-wc-rest-product-variations-controller.php:549
-#: includes/api/class-wc-rest-products-controller.php:1378
-#: includes/api/v1/class-wc-rest-products-controller.php:1689
+#: includes/api/v1/class-wc-rest-products-controller.php:1694
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:549
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1390
#. translators: %s: post type
msgid "The %s has already been deleted."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-crud-controller.php:452
+#: includes/abstracts/abstract-wc-rest-crud-controller.php:466
#: includes/abstracts/abstract-wc-rest-posts-controller.php:467
-#: includes/api/class-wc-rest-product-variations-controller.php:563
-#: includes/api/class-wc-rest-products-controller.php:1392
#: includes/api/v1/class-wc-rest-order-notes-controller.php:316
-#: includes/api/v1/class-wc-rest-products-controller.php:1700
+#: includes/api/v1/class-wc-rest-products-controller.php:1705
#: includes/api/v1/class-wc-rest-webhooks-controller.php:469
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:563
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1404
#. translators: %s: post type
msgid "The %s cannot be deleted."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-crud-controller.php:498
+#: includes/abstracts/abstract-wc-rest-crud-controller.php:512
#: includes/api/v1/class-wc-rest-taxes-controller.php:658
msgid "Current page of the collection."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-crud-controller.php:506
+#: includes/abstracts/abstract-wc-rest-crud-controller.php:520
#: includes/api/v1/class-wc-rest-taxes-controller.php:666
msgid "Maximum number of items to be returned in result set."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-crud-controller.php:515
+#: includes/abstracts/abstract-wc-rest-crud-controller.php:529
msgid "Limit results to those matching a string."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-crud-controller.php:521
+#: includes/abstracts/abstract-wc-rest-crud-controller.php:535
#: includes/abstracts/abstract-wc-rest-posts-controller.php:622
#: includes/api/v1/class-wc-rest-webhooks-controller.php:702
msgid "Limit response to resources published after a given ISO8601 compliant date."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-crud-controller.php:527
+#: includes/abstracts/abstract-wc-rest-crud-controller.php:541
#: includes/abstracts/abstract-wc-rest-posts-controller.php:628
#: includes/api/v1/class-wc-rest-webhooks-controller.php:708
msgid "Limit response to resources published before a given ISO8601 compliant date."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-crud-controller.php:533
+#: includes/abstracts/abstract-wc-rest-crud-controller.php:547
#: includes/abstracts/abstract-wc-rest-posts-controller.php:634
+#: includes/api/class-wc-rest-product-reviews-controller.php:955
#: includes/api/v1/class-wc-rest-customers-controller.php:865
#: includes/api/v1/class-wc-rest-webhooks-controller.php:714
msgid "Ensure result set excludes specific IDs."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-crud-controller.php:542
+#: includes/abstracts/abstract-wc-rest-crud-controller.php:556
#: includes/abstracts/abstract-wc-rest-posts-controller.php:643
-#: includes/abstracts/abstract-wc-rest-terms-controller.php:697
+#: includes/abstracts/abstract-wc-rest-terms-controller.php:698
#: includes/api/v1/class-wc-rest-webhooks-controller.php:723
msgid "Limit result set to specific ids."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-crud-controller.php:551
+#: includes/abstracts/abstract-wc-rest-crud-controller.php:565
#: includes/abstracts/abstract-wc-rest-posts-controller.php:652
-#: includes/abstracts/abstract-wc-rest-terms-controller.php:707
+#: includes/abstracts/abstract-wc-rest-terms-controller.php:708
+#: includes/api/class-wc-rest-product-reviews-controller.php:971
#: includes/api/v1/class-wc-rest-customers-controller.php:883
#: includes/api/v1/class-wc-rest-taxes-controller.php:675
#: includes/api/v1/class-wc-rest-webhooks-controller.php:732
msgid "Offset the result set by a specific number of items."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-crud-controller.php:557
+#: includes/abstracts/abstract-wc-rest-crud-controller.php:571
#: includes/abstracts/abstract-wc-rest-posts-controller.php:658
-#: includes/abstracts/abstract-wc-rest-terms-controller.php:714
+#: includes/abstracts/abstract-wc-rest-terms-controller.php:715
+#: includes/api/class-wc-rest-product-reviews-controller.php:975
#: includes/api/v1/class-wc-rest-customers-controller.php:890
#: includes/api/v1/class-wc-rest-taxes-controller.php:682
#: includes/api/v1/class-wc-rest-webhooks-controller.php:738
msgid "Order sort attribute ascending or descending."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-crud-controller.php:564
+#: includes/abstracts/abstract-wc-rest-crud-controller.php:578
#: includes/abstracts/abstract-wc-rest-posts-controller.php:665
+#: includes/api/class-wc-rest-product-reviews-controller.php:984
#: includes/api/v1/class-wc-rest-customers-controller.php:898
#: includes/api/v1/class-wc-rest-taxes-controller.php:690
#: includes/api/v1/class-wc-rest-webhooks-controller.php:745
msgid "Sort collection by object attribute."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-crud-controller.php:579
+#: includes/abstracts/abstract-wc-rest-crud-controller.php:593
#: includes/abstracts/abstract-wc-rest-posts-controller.php:682
msgid "Limit result set to those of particular parent IDs."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-crud-controller.php:588
+#: includes/abstracts/abstract-wc-rest-crud-controller.php:602
#: includes/abstracts/abstract-wc-rest-posts-controller.php:691
msgid "Limit result set to all items except those of a particular parent ID."
msgstr ""
@@ -6122,12 +6197,8 @@ msgstr ""
#: includes/abstracts/abstract-wc-rest-posts-controller.php:57
#: includes/abstracts/abstract-wc-rest-shipping-zones-controller.php:65
#: includes/abstracts/abstract-wc-rest-terms-controller.php:126
-#: includes/api/class-wc-rest-payment-gateways-controller.php:85
-#: includes/api/class-wc-rest-setting-options-controller.php:376
-#: includes/api/class-wc-rest-settings-controller.php:179
-#: includes/api/class-wc-rest-shipping-methods-controller.php:79
-#: includes/api/class-wc-rest-system-status-controller.php:61
-#: includes/api/class-wc-rest-system-status-tools-controller.php:83
+#: includes/api/class-wc-rest-data-controller.php:61
+#: includes/api/class-wc-rest-product-reviews-controller.php:139
#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:74
#: includes/api/v1/class-wc-rest-customers-controller.php:135
#: includes/api/v1/class-wc-rest-order-notes-controller.php:121
@@ -6139,12 +6210,19 @@ msgstr ""
#: includes/api/v1/class-wc-rest-taxes-controller.php:114
#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:91
#: includes/api/v1/class-wc-rest-webhooks-controller.php:130
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:85
+#: includes/api/v2/class-wc-rest-setting-options-v2-controller.php:376
+#: includes/api/v2/class-wc-rest-settings-v2-controller.php:179
+#: includes/api/v2/class-wc-rest-shipping-methods-v2-controller.php:79
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:83
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:61
msgid "Sorry, you cannot list resources."
msgstr ""
#: includes/abstracts/abstract-wc-rest-posts-controller.php:71
#: includes/abstracts/abstract-wc-rest-shipping-zones-controller.php:83
#: includes/abstracts/abstract-wc-rest-terms-controller.php:145
+#: includes/api/class-wc-rest-product-reviews-controller.php:170
#: includes/api/v1/class-wc-rest-customers-controller.php:150
#: includes/api/v1/class-wc-rest-order-notes-controller.php:136
#: includes/api/v1/class-wc-rest-product-reviews-controller.php:165
@@ -6156,19 +6234,21 @@ msgstr ""
#: includes/abstracts/abstract-wc-rest-posts-controller.php:134
#: includes/abstracts/abstract-wc-rest-terms-controller.php:221
-#: includes/api/class-wc-rest-product-reviews-controller.php:68
+#: includes/api/class-wc-rest-product-reviews-controller.php:218
#: includes/api/v1/class-wc-rest-customers-controller.php:215
#: includes/api/v1/class-wc-rest-product-attributes-controller.php:210
#: includes/api/v1/class-wc-rest-taxes-controller.php:188
#: includes/api/v1/class-wc-rest-webhooks-controller.php:204
+#: includes/api/v2/class-wc-rest-product-reviews-v2-controller.php:68
msgid "Sorry, you are not allowed to batch manipulate this resource."
msgstr ""
#: includes/abstracts/abstract-wc-rest-posts-controller.php:151
#: includes/abstracts/abstract-wc-rest-posts-controller.php:258
-#: includes/api/class-wc-rest-products-controller.php:700
-#: includes/api/class-wc-rest-products-controller.php:1315
+#: includes/api/class-wc-rest-products-controller.php:314
#: includes/api/v1/class-wc-rest-products-controller.php:1637
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:700
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1322
msgid ""
"To manipulate product variations you should use the "
"/products/<product_id>/variations/<id> endpoint."
@@ -6176,12 +6256,12 @@ msgstr ""
#: includes/abstracts/abstract-wc-rest-posts-controller.php:260
#: includes/abstracts/abstract-wc-rest-posts-controller.php:421
-#: includes/api/class-wc-rest-webhooks-controller.php:39
#: includes/api/v1/class-wc-rest-coupons-controller.php:351
-#: includes/api/v1/class-wc-rest-orders-controller.php:865
+#: includes/api/v1/class-wc-rest-orders-controller.php:870
#: includes/api/v1/class-wc-rest-products-controller.php:784
#: includes/api/v1/class-wc-rest-webhooks-controller.php:383
#: includes/api/v1/class-wc-rest-webhooks-controller.php:549
+#: includes/api/v2/class-wc-rest-webhooks-v2-controller.php:39
msgid "ID is invalid."
msgstr ""
@@ -6193,17 +6273,17 @@ msgstr ""
#: includes/abstracts/abstract-wc-rest-shipping-zones-controller.php:47
#: includes/abstracts/abstract-wc-rest-terms-controller.php:247
-#: includes/api/class-wc-rest-payment-gateways-controller.php:144
-#: includes/api/class-wc-rest-payment-gateways-controller.php:161
-#: includes/api/class-wc-rest-shipping-methods-controller.php:124
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:121
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:215
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:269
#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:70
#: includes/api/v1/class-wc-rest-product-attributes-controller.php:155
#: includes/api/v1/class-wc-rest-product-attributes-controller.php:173
#: includes/api/v1/class-wc-rest-product-attributes-controller.php:191
#: includes/api/v1/class-wc-rest-product-attributes-controller.php:551
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:144
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:161
+#: includes/api/v2/class-wc-rest-shipping-methods-v2-controller.php:124
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:121
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:215
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:269
msgid "Resource does not exist."
msgstr ""
@@ -6221,25 +6301,13 @@ msgid "Name for the resource."
msgstr ""
#: includes/abstracts/abstract-wc-rest-terms-controller.php:66
-#: includes/api/class-wc-rest-coupons-controller.php:76
-#: includes/api/class-wc-rest-customers-controller.php:124
-#: includes/api/class-wc-rest-order-notes-controller.php:129
-#: includes/api/class-wc-rest-order-refunds-controller.php:92
-#: includes/api/class-wc-rest-order-refunds-controller.php:355
-#: includes/api/class-wc-rest-orders-controller.php:82
-#: includes/api/class-wc-rest-orders-controller.php:831
-#: includes/api/class-wc-rest-payment-gateways-controller.php:54
+#: includes/api/class-wc-rest-customers-controller.php:77
+#: includes/api/class-wc-rest-order-notes-controller.php:122
#: includes/api/class-wc-rest-product-categories-controller.php:103
-#: includes/api/class-wc-rest-product-reviews-controller.php:153
-#: includes/api/class-wc-rest-product-variations-controller.php:657
-#: includes/api/class-wc-rest-products-controller.php:82
-#: includes/api/class-wc-rest-products-controller.php:1429
-#: includes/api/class-wc-rest-setting-options-controller.php:84
-#: includes/api/class-wc-rest-shipping-methods-controller.php:54
-#: includes/api/class-wc-rest-shipping-zones-controller.php:281
-#: includes/api/class-wc-rest-system-status-tools-controller.php:55
-#: includes/api/class-wc-rest-webhook-deliveries-controller.php:70
-#: includes/api/class-wc-rest-webhooks-controller.php:98
+#: includes/api/class-wc-rest-product-reviews-controller.php:84
+#: includes/api/class-wc-rest-product-reviews-controller.php:831
+#: includes/api/class-wc-rest-product-variations-controller.php:408
+#: includes/api/class-wc-rest-products-controller.php:699
#: includes/api/v1/class-wc-rest-coupons-controller.php:82
#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:46
#: includes/api/v1/class-wc-rest-customers-controller.php:78
@@ -6249,7 +6317,7 @@ msgstr ""
#: includes/api/v1/class-wc-rest-order-refunds-controller.php:87
#: includes/api/v1/class-wc-rest-order-refunds-controller.php:344
#: includes/api/v1/class-wc-rest-orders-controller.php:76
-#: includes/api/v1/class-wc-rest-orders-controller.php:919
+#: includes/api/v1/class-wc-rest-orders-controller.php:924
#: includes/api/v1/class-wc-rest-product-attribute-terms-controller.php:74
#: includes/api/v1/class-wc-rest-product-attribute-terms-controller.php:195
#: includes/api/v1/class-wc-rest-product-attributes-controller.php:75
@@ -6260,7 +6328,7 @@ msgstr ""
#: includes/api/v1/class-wc-rest-product-shipping-classes-controller.php:94
#: includes/api/v1/class-wc-rest-product-tags-controller.php:94
#: includes/api/v1/class-wc-rest-products-controller.php:77
-#: includes/api/v1/class-wc-rest-products-controller.php:1734
+#: includes/api/v1/class-wc-rest-products-controller.php:1739
#: includes/api/v1/class-wc-rest-tax-classes-controller.php:334
#: includes/api/v1/class-wc-rest-taxes-controller.php:62
#: includes/api/v1/class-wc-rest-taxes-controller.php:576
@@ -6268,11 +6336,29 @@ msgstr ""
#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:226
#: includes/api/v1/class-wc-rest-webhooks-controller.php:78
#: includes/api/v1/class-wc-rest-webhooks-controller.php:615
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:76
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:124
+#: includes/api/v2/class-wc-rest-order-notes-v2-controller.php:129
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:92
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:355
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:82
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:842
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:54
+#: includes/api/v2/class-wc-rest-product-categories-v2-controller.php:103
+#: includes/api/v2/class-wc-rest-product-reviews-v2-controller.php:153
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:657
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:82
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1441
+#: includes/api/v2/class-wc-rest-setting-options-v2-controller.php:84
+#: includes/api/v2/class-wc-rest-shipping-methods-v2-controller.php:54
+#: includes/api/v2/class-wc-rest-shipping-zones-v2-controller.php:281
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:55
+#: includes/api/v2/class-wc-rest-webhook-deliveries-v2-controller.php:70
+#: includes/api/v2/class-wc-rest-webhooks-v2-controller.php:98
msgid "Unique identifier for the resource."
msgstr ""
#: includes/abstracts/abstract-wc-rest-terms-controller.php:92
-#: includes/api/class-wc-rest-order-refunds-controller.php:112
#: includes/api/v1/class-wc-rest-customers-controller.php:104
#: includes/api/v1/class-wc-rest-order-notes-controller.php:105
#: includes/api/v1/class-wc-rest-order-refunds-controller.php:107
@@ -6281,6 +6367,7 @@ msgstr ""
#: includes/api/v1/class-wc-rest-tax-classes-controller.php:74
#: includes/api/v1/class-wc-rest-taxes-controller.php:88
#: includes/api/v1/class-wc-rest-webhooks-controller.php:104
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:112
msgid "Required to be true, as resource does not support trashing."
msgstr ""
@@ -6288,49 +6375,49 @@ msgstr ""
msgid "Taxonomy does not exist."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-terms-controller.php:385
-#: includes/abstracts/abstract-wc-rest-terms-controller.php:482
+#: includes/abstracts/abstract-wc-rest-terms-controller.php:386
+#: includes/abstracts/abstract-wc-rest-terms-controller.php:483
msgid "Can not set resource parent, taxonomy is not hierarchical."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-terms-controller.php:531
+#: includes/abstracts/abstract-wc-rest-terms-controller.php:532
#: includes/api/v1/class-wc-rest-product-attributes-controller.php:357
msgid "Resource does not support trashing."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-terms-controller.php:540
+#: includes/abstracts/abstract-wc-rest-terms-controller.php:541
#: includes/api/v1/class-wc-rest-customers-controller.php:495
#: includes/api/v1/class-wc-rest-product-attributes-controller.php:372
#: includes/api/v1/class-wc-rest-taxes-controller.php:472
msgid "The resource cannot be deleted."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-terms-controller.php:688
+#: includes/abstracts/abstract-wc-rest-terms-controller.php:689
msgid "Ensure result set excludes specific ids."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-terms-controller.php:725
+#: includes/abstracts/abstract-wc-rest-terms-controller.php:726
msgid "Sort collection by resource attribute."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-terms-controller.php:741
+#: includes/abstracts/abstract-wc-rest-terms-controller.php:742
msgid "Whether to hide resources not assigned to any products."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-terms-controller.php:748
+#: includes/abstracts/abstract-wc-rest-terms-controller.php:749
msgid "Limit result set to resources assigned to a specific parent."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-terms-controller.php:755
+#: includes/abstracts/abstract-wc-rest-terms-controller.php:756
msgid "Limit result set to resources assigned to a specific product."
msgstr ""
-#: includes/abstracts/abstract-wc-rest-terms-controller.php:761
+#: includes/abstracts/abstract-wc-rest-terms-controller.php:762
msgid "Limit result set to resources with a specific slug."
msgstr ""
#: includes/abstracts/abstract-wc-settings-api.php:774
-#: includes/admin/class-wc-admin-menus.php:325
+#: includes/admin/class-wc-admin-menus.php:326
#: includes/admin/class-wc-admin-settings.php:621
#: includes/admin/meta-boxes/views/html-product-attribute.php:56
msgid "Select all"
@@ -6342,7 +6429,7 @@ msgstr ""
msgid "Select none"
msgstr ""
-#: includes/abstracts/abstract-wc-shipping-method.php:315
+#: includes/abstracts/abstract-wc-shipping-method.php:316
#: includes/admin/class-wc-admin-meta-boxes.php:128
msgid "Items"
msgstr ""
@@ -6366,8 +6453,8 @@ msgstr ""
#: includes/admin/class-wc-admin-addons.php:370
#: includes/admin/class-wc-admin-addons.php:545
-#: includes/admin/class-wc-admin-setup-wizard.php:688
-#: includes/admin/class-wc-admin-setup-wizard.php:703
+#: includes/admin/class-wc-admin-setup-wizard.php:714
+#: includes/admin/class-wc-admin-setup-wizard.php:729
msgid "WooCommerce Services"
msgstr ""
@@ -6411,20 +6498,20 @@ msgstr ""
#: includes/admin/class-wc-admin-api-keys-table-list.php:48
#: includes/admin/importers/class-wc-product-csv-importer-controller.php:470
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:628
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:629
#: includes/admin/list-tables/class-wc-admin-list-table-coupons.php:85
#: includes/admin/meta-boxes/views/html-variation-admin.php:341
#: includes/admin/settings/class-wc-settings-payment-gateways.php:118
#: includes/admin/settings/class-wc-settings-shipping.php:361
#: includes/admin/settings/views/html-admin-page-shipping-zone-methods.php:86
#: includes/admin/settings/views/html-keys-edit.php:17
-#: includes/export/class-wc-product-csv-exporter.php:90
+#: includes/export/class-wc-product-csv-exporter.php:108
#: includes/gateways/bacs/class-wc-gateway-bacs.php:95
#: includes/gateways/cheque/class-wc-gateway-cheque.php:71
#: includes/gateways/cod/class-wc-gateway-cod.php:122
#: includes/gateways/paypal/includes/settings-paypal.php:25
#: includes/gateways/simplify-commerce/class-wc-gateway-simplify-commerce.php:204
-#: includes/wc-template-functions.php:1651
+#: includes/wc-template-functions.php:1648
#: templates/single-product/tabs/description.php:25
msgid "Description"
msgstr ""
@@ -6457,8 +6544,8 @@ msgstr ""
#: includes/admin/class-wc-admin-api-keys-table-list.php:88
#: includes/admin/class-wc-admin-webhooks-table-list.php:81
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:73
-#: includes/admin/meta-boxes/views/html-order-refund.php:25
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:74
+#: includes/admin/meta-boxes/views/html-order-refund.php:29
#. translators: %s: API key ID.
#. translators: %s: webhook ID.
#. translators: %d: product ID.
@@ -6509,34 +6596,37 @@ msgstr ""
msgid "Unknown"
msgstr ""
-#: includes/admin/class-wc-admin-api-keys.php:75
-#: includes/admin/settings/class-wc-settings-advanced.php:43
+#: includes/admin/class-wc-admin-api-keys.php:91
+#: includes/admin/settings/class-wc-settings-advanced.php:41
msgid "REST API"
msgstr ""
-#: includes/admin/class-wc-admin-api-keys.php:75
+#: includes/admin/class-wc-admin-api-keys.php:91
msgid "Add key"
msgstr ""
-#: includes/admin/class-wc-admin-api-keys.php:88
+#: includes/admin/class-wc-admin-api-keys.php:104
msgid "Search key"
msgstr ""
-#: includes/admin/class-wc-admin-api-keys.php:93
+#: includes/admin/class-wc-admin-api-keys.php:109
msgid ""
"The WooCommerce REST API allows external apps to view and manage store "
"data. Access is granted only to those with valid API keys."
msgstr ""
-#: includes/admin/class-wc-admin-api-keys.php:94
+#: includes/admin/class-wc-admin-api-keys.php:110
msgid "Create an API key"
msgstr ""
-#: includes/admin/class-wc-admin-api-keys.php:160
-msgid "API key revoked successfully."
-msgstr ""
+#: includes/admin/class-wc-admin-api-keys.php:179
+#. translators: %d: count
+msgid "%d API key permanently revoked."
+msgid_plural "%d API keys permanently revoked."
+msgstr[0] ""
+msgstr[1] ""
-#: includes/admin/class-wc-admin-api-keys.php:189
+#: includes/admin/class-wc-admin-api-keys.php:208
msgid "You do not have permission to edit API Keys"
msgstr ""
@@ -6570,22 +6660,28 @@ msgid ""
"you sure you want to delete it?"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:174
+#: includes/admin/class-wc-admin-assets.php:170
+msgid ""
+"This action cannot be reversed. Are you sure you wish to erase personal "
+"data from the selected orders?"
+msgstr ""
+
+#: includes/admin/class-wc-admin-assets.php:175
#: includes/admin/importers/class-wc-product-csv-importer-controller.php:102
msgid "Import"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:175
+#: includes/admin/class-wc-admin-assets.php:176
msgid "Export"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:200
+#: includes/admin/class-wc-admin-assets.php:201
#: includes/admin/meta-boxes/views/html-product-data-advanced.php:47
-#: includes/admin/settings/class-wc-settings-products.php:410
+#: includes/admin/settings/class-wc-settings-products.php:419
msgid "Enable reviews"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:228
+#: includes/admin/class-wc-admin-assets.php:229
#. translators: %d: Number of variations
msgid ""
"Are you sure you want to link all variations? This will create a new "
@@ -6593,123 +6689,124 @@ msgid ""
"(max %d per run)."
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:229
+#: includes/admin/class-wc-admin-assets.php:230
msgid "Enter a value"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:230
+#: includes/admin/class-wc-admin-assets.php:231
msgid "Variation menu order (determines position in the list of variations)"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:231
+#: includes/admin/class-wc-admin-assets.php:232
msgid "Enter a value (fixed or %)"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:232
+#: includes/admin/class-wc-admin-assets.php:233
msgid "Are you sure you want to delete all variations? This cannot be undone."
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:233
+#: includes/admin/class-wc-admin-assets.php:234
msgid "Last warning, are you sure?"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:234
-#: includes/admin/class-wc-admin-taxonomies.php:135
-#: includes/admin/class-wc-admin-taxonomies.php:245
+#: includes/admin/class-wc-admin-assets.php:235
+#: includes/admin/class-wc-admin-taxonomies.php:148
+#: includes/admin/class-wc-admin-taxonomies.php:258
msgid "Choose an image"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:235
+#: includes/admin/class-wc-admin-assets.php:236
msgid "Set variation image"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:236
+#: includes/admin/class-wc-admin-assets.php:237
msgid "variation added"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:237
+#: includes/admin/class-wc-admin-assets.php:238
msgid "variations added"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:238
+#: includes/admin/class-wc-admin-assets.php:239
msgid "No variations added"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:239
+#: includes/admin/class-wc-admin-assets.php:240
msgid "Are you sure you want to remove this variation?"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:240
+#: includes/admin/class-wc-admin-assets.php:241
msgid "Sale start date (YYYY-MM-DD format or leave blank)"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:241
+#: includes/admin/class-wc-admin-assets.php:242
msgid "Sale end date (YYYY-MM-DD format or leave blank)"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:242
+#: includes/admin/class-wc-admin-assets.php:243
msgid "Save changes before changing page?"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:243
+#: includes/admin/class-wc-admin-assets.php:244
msgid "%qty% variation"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:244
+#: includes/admin/class-wc-admin-assets.php:245
msgid "%qty% variations"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:259
-#: includes/admin/class-wc-admin-assets.php:409
+#: includes/admin/class-wc-admin-assets.php:260
+#: includes/admin/class-wc-admin-assets.php:415
#: includes/admin/settings/views/html-webhooks-edit.php:67
#: includes/class-wc-frontend-scripts.php:566
msgid "Select an option…"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:262
-#: includes/admin/meta-boxes/views/html-order-item-meta.php:49
+#: includes/admin/class-wc-admin-assets.php:263
+#: includes/admin/meta-boxes/views/html-order-item-meta.php:50
msgid "Name (required)"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:263
-#: includes/admin/meta-boxes/views/html-order-item-meta.php:50
+#: includes/admin/class-wc-admin-assets.php:264
+#: includes/admin/meta-boxes/views/html-order-item-meta.php:51
msgid "Value (required)"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:282
-msgid ""
-"Are you sure you want to remove the selected items? If you have previously "
-"reduced this item's stock, or this order was submitted by a customer, you "
-"will need to manually restore the item's stock."
+#: includes/admin/class-wc-admin-assets.php:274
+msgid "Are you sure you want to remove the selected items?"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:283
+#: includes/admin/class-wc-admin-assets.php:282
+msgid "You may need to manually restore the item's stock."
+msgstr ""
+
+#: includes/admin/class-wc-admin-assets.php:289
msgid "Please select some items."
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:284
+#: includes/admin/class-wc-admin-assets.php:290
msgid "Are you sure you wish to process this refund? This action cannot be undone."
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:285
+#: includes/admin/class-wc-admin-assets.php:291
msgid "Are you sure you wish to delete this refund? This action cannot be undone."
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:286
+#: includes/admin/class-wc-admin-assets.php:292
msgid ""
"Are you sure you wish to delete this tax column? This action cannot be "
"undone."
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:287
+#: includes/admin/class-wc-admin-assets.php:293
msgid "Remove this item meta?"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:288
+#: includes/admin/class-wc-admin-assets.php:294
msgid "Remove this attribute?"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:289
+#: includes/admin/class-wc-admin-assets.php:295
#: includes/admin/class-wc-admin-attributes.php:187
#: includes/admin/class-wc-admin-attributes.php:254
#: includes/admin/class-wc-admin-attributes.php:289
@@ -6718,125 +6815,125 @@ msgstr ""
#: includes/admin/class-wc-admin-attributes.php:440
#: includes/admin/class-wc-admin-webhooks-table-list.php:48
#: includes/admin/importers/class-wc-product-csv-importer-controller.php:465
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:623
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:107
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:624
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:108
#: includes/admin/meta-boxes/views/html-product-attribute.php:17
#: includes/admin/meta-boxes/views/html-product-data-general.php:74
#: includes/admin/meta-boxes/views/html-variation-admin.php:355
#: includes/admin/settings/views/html-webhooks-edit.php:22
#: includes/admin/views/html-admin-page-status-report.php:732
-#: includes/export/class-wc-product-csv-exporter.php:85
+#: includes/export/class-wc-product-csv-exporter.php:103
#: includes/widgets/class-wc-widget-product-categories.php:52
#: templates/single-product-reviews.php:77
msgid "Name"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:290
+#: includes/admin/class-wc-admin-assets.php:296
#: includes/admin/meta-boxes/views/html-product-attribute.php:8
#: includes/admin/meta-boxes/views/html-variation-admin.php:16
#: includes/admin/settings/views/html-admin-page-shipping-classes.php:54
msgid "Remove"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:291
+#: includes/admin/class-wc-admin-assets.php:297
#: includes/admin/meta-boxes/views/html-order-download-permission.php:9
#: includes/admin/meta-boxes/views/html-product-attribute.php:9
#: includes/admin/meta-boxes/views/html-variation-admin.php:17
msgid "Click to toggle"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:292
+#: includes/admin/class-wc-admin-assets.php:298
#: includes/admin/meta-boxes/views/html-product-attribute.php:29
msgid "Value(s)"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:293
+#: includes/admin/class-wc-admin-assets.php:299
msgid "Enter some text, or some attributes by pipe (|) separating values."
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:294
+#: includes/admin/class-wc-admin-assets.php:300
#: includes/admin/meta-boxes/views/html-product-attribute.php:74
msgid "Visible on the product page"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:295
+#: includes/admin/class-wc-admin-assets.php:301
#: includes/admin/meta-boxes/views/html-product-attribute.php:80
msgid "Used for variations"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:296
+#: includes/admin/class-wc-admin-assets.php:302
msgid "Enter a name for the new attribute term:"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:297
+#: includes/admin/class-wc-admin-assets.php:303
msgid ""
"Recalculate totals? This will calculate taxes based on the customers "
"country (or the store base country) and update totals."
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:298
+#: includes/admin/class-wc-admin-assets.php:304
msgid ""
"Copy billing information to shipping information? This will remove any "
"currently entered shipping information."
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:299
+#: includes/admin/class-wc-admin-assets.php:305
msgid ""
"Load the customer's billing information? This will remove any currently "
"entered billing information."
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:300
+#: includes/admin/class-wc-admin-assets.php:306
msgid ""
"Load the customer's shipping information? This will remove any currently "
"entered shipping information."
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:301
-#: includes/admin/class-wc-admin-post-types.php:746
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:120
+#: includes/admin/class-wc-admin-assets.php:307
+#: includes/admin/class-wc-admin-post-types.php:747
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:121
#: includes/admin/views/html-bulk-edit-product.php:200
#: includes/admin/views/html-quick-edit-product.php:159
msgid "Featured"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:305
+#: includes/admin/class-wc-admin-assets.php:311
msgid "No customer selected"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:329
+#: includes/admin/class-wc-admin-assets.php:335
msgid ""
"Could not grant access - the user may already have permission for this file "
"or billing email is not set. Ensure the billing email is set, and the order "
"has been saved."
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:330
+#: includes/admin/class-wc-admin-assets.php:336
msgid "Are you sure you want to revoke access to this download?"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:331
+#: includes/admin/class-wc-admin-assets.php:337
msgid "You cannot add the same tax rate twice!"
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:332
+#: includes/admin/class-wc-admin-assets.php:338
msgid "Are you sure you wish to delete this note? This action cannot be undone."
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:333
+#: includes/admin/class-wc-admin-assets.php:339
msgid "Enter a coupon code to apply to this order."
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:334
+#: includes/admin/class-wc-admin-assets.php:340
msgid "Enter a fixed amount or percentage to apply as a fee."
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:383
+#: includes/admin/class-wc-admin-assets.php:389
#: includes/admin/views/html-admin-page-status-report.php:46
msgid "Copying to clipboard failed. Please press Ctrl/Cmd+C to copy."
msgstr ""
-#: includes/admin/class-wc-admin-assets.php:396
+#: includes/admin/class-wc-admin-assets.php:402
msgid "Are you sure you want to delete this log?"
msgstr ""
@@ -6889,8 +6986,8 @@ msgstr ""
#: includes/admin/class-wc-admin-attributes.php:292
#: includes/admin/class-wc-admin-attributes.php:415
#: includes/admin/importers/class-wc-product-csv-importer-controller.php:463
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:621
-#: includes/export/class-wc-product-csv-exporter.php:83
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:622
+#: includes/export/class-wc-product-csv-exporter.php:101
msgid "Type"
msgstr ""
@@ -6933,6 +7030,7 @@ msgstr ""
#: includes/admin/helper/class-wc-helper.php:180
#: includes/admin/helper/views/html-section-account.php:3
#: includes/admin/meta-boxes/class-wc-meta-box-order-actions.php:74
+#: templates/cart/shipping-calculator.php:86
msgid "Update"
msgstr ""
@@ -6947,18 +7045,20 @@ msgid "Terms"
msgstr ""
#: includes/admin/class-wc-admin-attributes.php:307
-#: includes/admin/class-wc-admin-post-types.php:751
+#: includes/admin/class-wc-admin-post-types.php:752
#: includes/admin/class-wc-admin-webhooks-table-list.php:82
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:401
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:406
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:313
-#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:425
+#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:429
#: includes/admin/reports/class-wc-report-customer-list.php:159
#: includes/admin/reports/class-wc-report-stock.php:135
#: includes/admin/settings/views/html-admin-page-shipping-classes.php:54
#: includes/admin/settings/views/html-admin-page-shipping-zone-methods.php:123
#: includes/admin/settings/views/html-admin-page-shipping-zones.php:78
#: includes/class-wc-post-types.php:308 includes/class-wc-post-types.php:374
-#: includes/class-wc-post-types.php:439 templates/myaccount/my-address.php:53
+#: includes/class-wc-post-types.php:439
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore_PostTypeRegistrar.php:35
+#: templates/myaccount/my-address.php:53
msgid "Edit"
msgstr ""
@@ -6970,6 +7070,7 @@ msgstr ""
#: includes/admin/meta-boxes/views/html-product-variation-download.php:13
#: includes/admin/settings/views/html-admin-page-shipping-zone-methods.php:123
#: includes/admin/settings/views/html-admin-page-shipping-zones.php:78
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:92
#: includes/wc-account-functions.php:351
msgid "Delete"
msgstr ""
@@ -7018,8 +7119,8 @@ msgid "WooCommerce Endpoint"
msgstr ""
#: includes/admin/class-wc-admin-customize.php:79
-#: includes/admin/class-wc-admin-menus.php:296
-#: includes/admin/settings/class-wc-settings-advanced.php:276
+#: includes/admin/class-wc-admin-menus.php:297
+#: includes/admin/settings/class-wc-settings-advanced.php:274
#: includes/class-wc-query.php:133
msgid "Lost password"
msgstr ""
@@ -7113,19 +7214,20 @@ msgstr ""
#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:116
#: includes/admin/meta-boxes/views/html-product-data-variations.php:58
#: includes/admin/settings/views/html-webhooks-edit.php:36
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:97
#: includes/wc-account-functions.php:192 templates/myaccount/my-orders.php:15
msgid "Status"
msgstr ""
#: includes/admin/class-wc-admin-dashboard.php:348
#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:119
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:440
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:446
#: includes/admin/meta-boxes/views/html-order-items.php:33
-#: includes/admin/meta-boxes/views/html-order-items.php:202
+#: includes/admin/meta-boxes/views/html-order-items.php:192
#: includes/admin/reports/class-wc-report-taxes-by-code.php:183
#: includes/wc-account-functions.php:193 templates/cart/cart-totals.php:92
-#: templates/cart/cart-totals.php:93 templates/cart/cart.php:35
-#: templates/cart/cart.php:120 templates/checkout/review-order.php:27
+#: templates/cart/cart-totals.php:93 templates/cart/cart.php:33
+#: templates/cart/cart.php:118 templates/checkout/review-order.php:27
#: templates/checkout/review-order.php:106 templates/myaccount/my-orders.php:16
#: templates/order/order-details.php:46
msgid "Total"
@@ -7364,7 +7466,7 @@ msgstr ""
#: includes/admin/class-wc-admin-log-table-list.php:103
#: includes/admin/reports/class-wc-report-downloads.php:214
-#: includes/class-wc-privacy-exporters.php:144
+#: includes/class-wc-privacy-exporters.php:142
msgid "Timestamp"
msgstr ""
@@ -7394,7 +7496,7 @@ msgid "All sources"
msgstr ""
#: includes/admin/class-wc-admin-menus.php:61
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:682
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:684
#: includes/admin/meta-boxes/class-wc-meta-box-product-data.php:111
#: includes/admin/views/html-admin-page-product-export.php:41
msgid "Attributes"
@@ -7414,7 +7516,7 @@ msgstr ""
#: includes/admin/class-wc-admin-menus.php:79
#: includes/admin/views/html-admin-page-status-report.php:604
-#: includes/class-wc-install.php:1071
+#: includes/class-wc-install.php:1159
msgid "Settings"
msgstr ""
@@ -7427,15 +7529,15 @@ msgstr ""
msgid "WooCommerce extensions"
msgstr ""
-#: includes/admin/class-wc-admin-menus.php:280
+#: includes/admin/class-wc-admin-menus.php:281
msgid "WooCommerce endpoints"
msgstr ""
-#: includes/admin/class-wc-admin-menus.php:328
+#: includes/admin/class-wc-admin-menus.php:329
msgid "Add to menu"
msgstr ""
-#: includes/admin/class-wc-admin-menus.php:362
+#: includes/admin/class-wc-admin-menus.php:363
msgid "Visit Store"
msgstr ""
@@ -7485,21 +7587,21 @@ msgid "Rating"
msgstr ""
#: includes/admin/class-wc-admin-meta-boxes.php:174
-#: includes/admin/settings/class-wc-settings-products.php:403
+#: includes/admin/settings/class-wc-settings-products.php:412
#: templates/single-product-reviews.php:36
msgid "Reviews"
msgstr ""
-#: includes/admin/class-wc-admin-notices.php:132
-#: includes/admin/class-wc-admin-status.php:271
-#: includes/admin/class-wc-admin-status.php:290
+#: includes/admin/class-wc-admin-notices.php:135
+#: includes/admin/class-wc-admin-status.php:287
#: includes/admin/class-wc-admin-status.php:306
-#: includes/emails/class-wc-email.php:809
+#: includes/admin/class-wc-admin-status.php:322
+#: includes/emails/class-wc-email.php:826
msgid "Action failed. Please refresh the page and retry."
msgstr ""
-#: includes/admin/class-wc-admin-notices.php:136
-#: includes/emails/class-wc-email.php:813
+#: includes/admin/class-wc-admin-notices.php:139
+#: includes/emails/class-wc-email.php:830
msgid "You don’t have permission to do this."
msgstr ""
@@ -7529,8 +7631,8 @@ msgid ""
msgstr ""
#: includes/admin/class-wc-admin-permalink-settings.php:118
-#: includes/admin/class-wc-admin-taxonomies.php:99
-#: includes/admin/class-wc-admin-taxonomies.php:207
+#: includes/admin/class-wc-admin-taxonomies.php:112
+#: includes/admin/class-wc-admin-taxonomies.php:220
msgid "Default"
msgstr ""
@@ -7553,7 +7655,7 @@ msgid ""
msgstr ""
#: includes/admin/class-wc-admin-pointers.php:60
-#: includes/admin/class-wc-admin-post-types.php:685
+#: includes/admin/class-wc-admin-post-types.php:686
msgid "Product name"
msgstr ""
@@ -7607,8 +7709,8 @@ msgstr ""
#: includes/admin/class-wc-admin-pointers.php:124
#: includes/admin/meta-boxes/views/html-product-data-variations.php:85
-#: includes/admin/settings/class-wc-settings-products.php:43
-#: includes/admin/settings/class-wc-settings-products.php:259
+#: includes/admin/settings/class-wc-settings-products.php:41
+#: includes/admin/settings/class-wc-settings-products.php:257
msgid "Downloadable products"
msgstr ""
@@ -7679,16 +7781,17 @@ msgstr ""
#: includes/admin/class-wc-admin-pointers.php:250
#: includes/admin/settings/class-wc-settings-general.php:331
-#: includes/admin/settings/class-wc-settings-products.php:74
+#: includes/admin/settings/class-wc-settings-products.php:72
#: includes/admin/views/html-notice-custom.php:12
#: includes/admin/views/html-notice-legacy-shipping.php:11
#: includes/admin/views/html-notice-no-shipping-methods.php:11
#: includes/admin/views/html-notice-secure-connection.php:12
#: includes/admin/views/html-notice-simplify-commerce.php:19
-#: includes/admin/views/html-notice-template-check.php:13
+#: includes/admin/views/html-notice-template-check.php:15
#: includes/admin/views/html-notice-theme-support.php:12
#: includes/admin/views/html-notice-updated.php:12
-#: includes/wc-template-functions.php:969
+#: includes/admin/views/html-notice-wootenberg.php:12
+#: includes/wc-template-functions.php:966
msgid "Dismiss"
msgstr ""
@@ -7697,281 +7800,284 @@ msgstr ""
msgid "Next"
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:121
-msgid "Product updated. View Product "
-msgstr ""
-
#: includes/admin/class-wc-admin-post-types.php:122
-#: includes/admin/class-wc-admin-post-types.php:143
-#: includes/admin/class-wc-admin-post-types.php:162
-msgid "Custom field updated."
+#. translators: %s: Product view URL.
+msgid "Product updated. View Product "
msgstr ""
#: includes/admin/class-wc-admin-post-types.php:123
#: includes/admin/class-wc-admin-post-types.php:144
#: includes/admin/class-wc-admin-post-types.php:163
-msgid "Custom field deleted."
+msgid "Custom field updated."
msgstr ""
#: includes/admin/class-wc-admin-post-types.php:124
-msgid "Product updated."
+#: includes/admin/class-wc-admin-post-types.php:145
+#: includes/admin/class-wc-admin-post-types.php:164
+msgid "Custom field deleted."
msgstr ""
#: includes/admin/class-wc-admin-post-types.php:125
-#: includes/admin/class-wc-admin-post-types.php:146
-#: includes/admin/class-wc-admin-post-types.php:165
+msgid "Product updated."
+msgstr ""
+
+#: includes/admin/class-wc-admin-post-types.php:126
+#: includes/admin/class-wc-admin-post-types.php:147
+#: includes/admin/class-wc-admin-post-types.php:166
msgid "Revision restored."
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:127
+#: includes/admin/class-wc-admin-post-types.php:128
#. translators: %s: product url
msgid "Product published. View Product "
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:128
+#: includes/admin/class-wc-admin-post-types.php:129
msgid "Product saved."
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:130
+#: includes/admin/class-wc-admin-post-types.php:131
#. translators: %s: product url
msgid "Product submitted. Preview product "
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:133
+#: includes/admin/class-wc-admin-post-types.php:134
#. translators: 1: date 2: product url
msgid ""
"Product scheduled for: %1$s. Preview "
"product "
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:134
-#: includes/admin/class-wc-admin-post-types.php:153
-#: includes/admin/class-wc-admin-post-types.php:172
-#: includes/admin/settings/views/html-webhooks-edit.php:159
-#: includes/admin/settings/views/html-webhooks-edit.php:168
-#: includes/admin/settings/views/html-webhooks-edit.php:176
+#: includes/admin/class-wc-admin-post-types.php:135
+#: includes/admin/class-wc-admin-post-types.php:154
+#: includes/admin/class-wc-admin-post-types.php:173
+#: includes/admin/settings/views/html-webhooks-edit.php:162
+#: includes/admin/settings/views/html-webhooks-edit.php:171
+#: includes/admin/settings/views/html-webhooks-edit.php:179
#: includes/class-wc-webhook.php:397
msgid "M j, Y @ G:i"
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:137
+#: includes/admin/class-wc-admin-post-types.php:138
#. translators: %s: product url
msgid "Product draft updated. Preview product "
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:142
-#: includes/admin/class-wc-admin-post-types.php:145
-#: includes/admin/class-wc-admin-post-types.php:147
+#: includes/admin/class-wc-admin-post-types.php:143
+#: includes/admin/class-wc-admin-post-types.php:146
+#: includes/admin/class-wc-admin-post-types.php:148
msgid "Order updated."
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:148
+#: includes/admin/class-wc-admin-post-types.php:149
msgid "Order saved."
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:149
+#: includes/admin/class-wc-admin-post-types.php:150
msgid "Order submitted."
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:152
+#: includes/admin/class-wc-admin-post-types.php:153
#. translators: %s: date
msgid "Order scheduled for: %s."
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:155
+#: includes/admin/class-wc-admin-post-types.php:156
msgid "Order draft updated."
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:156
+#: includes/admin/class-wc-admin-post-types.php:157
msgid "Order updated and sent."
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:161
-#: includes/admin/class-wc-admin-post-types.php:164
-#: includes/admin/class-wc-admin-post-types.php:166
+#: includes/admin/class-wc-admin-post-types.php:162
+#: includes/admin/class-wc-admin-post-types.php:165
+#: includes/admin/class-wc-admin-post-types.php:167
msgid "Coupon updated."
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:167
+#: includes/admin/class-wc-admin-post-types.php:168
msgid "Coupon saved."
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:168
+#: includes/admin/class-wc-admin-post-types.php:169
msgid "Coupon submitted."
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:171
+#: includes/admin/class-wc-admin-post-types.php:172
#. translators: %s: date
msgid "Coupon scheduled for: %s."
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:174
+#: includes/admin/class-wc-admin-post-types.php:175
msgid "Coupon draft updated."
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:190
+#: includes/admin/class-wc-admin-post-types.php:191
#. translators: %s: product count
msgid "%s product updated."
msgid_plural "%s products updated."
msgstr[0] ""
msgstr[1] ""
-#: includes/admin/class-wc-admin-post-types.php:192
+#: includes/admin/class-wc-admin-post-types.php:193
#. translators: %s: product count
msgid "%s product not updated, somebody is editing it."
msgid_plural "%s products not updated, somebody is editing them."
msgstr[0] ""
msgstr[1] ""
-#: includes/admin/class-wc-admin-post-types.php:194
+#: includes/admin/class-wc-admin-post-types.php:195
#. translators: %s: product count
msgid "%s product permanently deleted."
msgid_plural "%s products permanently deleted."
msgstr[0] ""
msgstr[1] ""
-#: includes/admin/class-wc-admin-post-types.php:196
+#: includes/admin/class-wc-admin-post-types.php:197
#. translators: %s: product count
msgid "%s product moved to the Trash."
msgid_plural "%s products moved to the Trash."
msgstr[0] ""
msgstr[1] ""
-#: includes/admin/class-wc-admin-post-types.php:198
+#: includes/admin/class-wc-admin-post-types.php:199
#. translators: %s: product count
msgid "%s product restored from the Trash."
msgid_plural "%s products restored from the Trash."
msgstr[0] ""
msgstr[1] ""
-#: includes/admin/class-wc-admin-post-types.php:203
+#: includes/admin/class-wc-admin-post-types.php:204
#. translators: %s: order count
msgid "%s order updated."
msgid_plural "%s orders updated."
msgstr[0] ""
msgstr[1] ""
-#: includes/admin/class-wc-admin-post-types.php:205
+#: includes/admin/class-wc-admin-post-types.php:206
#. translators: %s: order count
msgid "%s order not updated, somebody is editing it."
msgid_plural "%s orders not updated, somebody is editing them."
msgstr[0] ""
msgstr[1] ""
-#: includes/admin/class-wc-admin-post-types.php:207
+#: includes/admin/class-wc-admin-post-types.php:208
#. translators: %s: order count
msgid "%s order permanently deleted."
msgid_plural "%s orders permanently deleted."
msgstr[0] ""
msgstr[1] ""
-#: includes/admin/class-wc-admin-post-types.php:209
+#: includes/admin/class-wc-admin-post-types.php:210
#. translators: %s: order count
msgid "%s order moved to the Trash."
msgid_plural "%s orders moved to the Trash."
msgstr[0] ""
msgstr[1] ""
-#: includes/admin/class-wc-admin-post-types.php:211
+#: includes/admin/class-wc-admin-post-types.php:212
#. translators: %s: order count
msgid "%s order restored from the Trash."
msgid_plural "%s orders restored from the Trash."
msgstr[0] ""
msgstr[1] ""
-#: includes/admin/class-wc-admin-post-types.php:216
+#: includes/admin/class-wc-admin-post-types.php:217
#. translators: %s: coupon count
msgid "%s coupon updated."
msgid_plural "%s coupons updated."
msgstr[0] ""
msgstr[1] ""
-#: includes/admin/class-wc-admin-post-types.php:218
+#: includes/admin/class-wc-admin-post-types.php:219
#. translators: %s: coupon count
msgid "%s coupon not updated, somebody is editing it."
msgid_plural "%s coupons not updated, somebody is editing them."
msgstr[0] ""
msgstr[1] ""
-#: includes/admin/class-wc-admin-post-types.php:220
+#: includes/admin/class-wc-admin-post-types.php:221
#. translators: %s: coupon count
msgid "%s coupon permanently deleted."
msgid_plural "%s coupons permanently deleted."
msgstr[0] ""
msgstr[1] ""
-#: includes/admin/class-wc-admin-post-types.php:222
+#: includes/admin/class-wc-admin-post-types.php:223
#. translators: %s: coupon count
msgid "%s coupon moved to the Trash."
msgid_plural "%s coupons moved to the Trash."
msgstr[0] ""
msgstr[1] ""
-#: includes/admin/class-wc-admin-post-types.php:224
+#: includes/admin/class-wc-admin-post-types.php:225
#. translators: %s: coupon count
msgid "%s coupon restored from the Trash."
msgid_plural "%s coupons restored from the Trash."
msgstr[0] ""
msgstr[1] ""
-#: includes/admin/class-wc-admin-post-types.php:688 templates/cart/cart.php:138
+#: includes/admin/class-wc-admin-post-types.php:689 templates/cart/cart.php:136
#: templates/checkout/form-coupon.php:34
msgid "Coupon code"
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:702
+#: includes/admin/class-wc-admin-post-types.php:703
msgid "Description (optional)"
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:739
+#: includes/admin/class-wc-admin-post-types.php:740
msgid "Catalog visibility:"
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:759
+#: includes/admin/class-wc-admin-post-types.php:760
msgid "This setting determines which shop pages products will be listed on."
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:765
+#: includes/admin/class-wc-admin-post-types.php:766
msgid "This is a featured product"
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:768
+#: includes/admin/class-wc-admin-post-types.php:769
msgid "OK"
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:769
-#: includes/admin/meta-boxes/views/html-order-items.php:257
-#: includes/admin/meta-boxes/views/html-order-items.php:305
+#: includes/admin/class-wc-admin-post-types.php:770
+#: includes/admin/meta-boxes/views/html-order-items.php:247
+#: includes/admin/meta-boxes/views/html-order-items.php:295
#: includes/admin/meta-boxes/views/html-product-data-general.php:60
#: includes/admin/meta-boxes/views/html-product-data-variations.php:128
#: includes/admin/plugin-updates/views/html-notice-untested-extensions-modal.php:48
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:133
#: includes/wc-account-functions.php:281
msgid "Cancel"
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:848
+#: includes/admin/class-wc-admin-post-types.php:850
+#. translators: %s: URL to read more about the shop page.
msgid ""
"This is the WooCommerce shop page. The shop page is a special archive that "
"lists your products. You can read more about this here ."
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:861
+#: includes/admin/class-wc-admin-post-types.php:863
msgid "Shop Page"
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:865
+#: includes/admin/class-wc-admin-post-types.php:867
msgid "Cart Page"
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:869
+#: includes/admin/class-wc-admin-post-types.php:871
msgid "Checkout Page"
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:873
+#: includes/admin/class-wc-admin-post-types.php:875
msgid "My Account Page"
msgstr ""
-#: includes/admin/class-wc-admin-post-types.php:877
+#: includes/admin/class-wc-admin-post-types.php:879
msgid "Terms and Conditions Page"
msgstr ""
@@ -7984,7 +8090,7 @@ msgstr ""
#: includes/admin/class-wc-admin-profile.php:105
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:44
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:95
-#: includes/class-wc-countries.php:619 includes/class-wc-form-handler.php:240
+#: includes/class-wc-countries.php:627 includes/class-wc-form-handler.php:235
#: templates/myaccount/form-edit-account.php:27
msgid "First name"
msgstr ""
@@ -7993,7 +8099,7 @@ msgstr ""
#: includes/admin/class-wc-admin-profile.php:109
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:48
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:99
-#: includes/class-wc-countries.php:626 includes/class-wc-form-handler.php:241
+#: includes/class-wc-countries.php:634 includes/class-wc-form-handler.php:236
#: templates/myaccount/form-edit-account.php:31
msgid "Last name"
msgstr ""
@@ -8010,49 +8116,53 @@ msgstr ""
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:56
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:107
#: includes/admin/settings/class-wc-settings-general.php:64
-#: includes/api/class-wc-rest-customers-controller.php:215
-#: includes/api/class-wc-rest-customers-controller.php:278
-#: includes/api/class-wc-rest-orders-controller.php:995
-#: includes/api/class-wc-rest-orders-controller.php:1058
+#: includes/api/class-wc-rest-customers-controller.php:168
+#: includes/api/class-wc-rest-customers-controller.php:231
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:215
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:278
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1006
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1069
msgid "Address line 1"
msgstr ""
#: includes/admin/class-wc-admin-profile.php:61
#: includes/admin/class-wc-admin-profile.php:121
-#: includes/admin/class-wc-admin-setup-wizard.php:405
+#: includes/admin/class-wc-admin-setup-wizard.php:430
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:60
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:111
#: includes/admin/settings/class-wc-settings-general.php:73
-#: includes/api/class-wc-rest-customers-controller.php:220
-#: includes/api/class-wc-rest-customers-controller.php:283
-#: includes/api/class-wc-rest-orders-controller.php:1000
-#: includes/api/class-wc-rest-orders-controller.php:1063
+#: includes/api/class-wc-rest-customers-controller.php:173
+#: includes/api/class-wc-rest-customers-controller.php:236
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:220
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:283
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1011
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1074
#: includes/customizer/class-wc-shop-customizer.php:678
msgid "Address line 2"
msgstr ""
#: includes/admin/class-wc-admin-profile.php:65
#: includes/admin/class-wc-admin-profile.php:125
-#: includes/admin/class-wc-admin-setup-wizard.php:410
+#: includes/admin/class-wc-admin-setup-wizard.php:435
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:64
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:115
#: includes/admin/settings/class-wc-settings-general.php:82
#: includes/admin/settings/class-wc-settings-tax.php:196
#: includes/admin/settings/views/html-settings-tax.php:29
-#: templates/cart/shipping-calculator.php:87
+#: templates/cart/shipping-calculator.php:76
msgid "City"
msgstr ""
#: includes/admin/class-wc-admin-profile.php:69
#: includes/admin/class-wc-admin-profile.php:129
-#: includes/admin/class-wc-admin-setup-wizard.php:420
+#: includes/admin/class-wc-admin-setup-wizard.php:445
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:68
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:119
#: includes/admin/settings/class-wc-settings-general.php:100
#: includes/admin/settings/class-wc-settings-tax.php:195
#: includes/admin/settings/views/html-settings-tax.php:28
-#: includes/class-wc-countries.php:681
-#: templates/cart/shipping-calculator.php:95
+#: includes/class-wc-countries.php:690
+#: templates/cart/shipping-calculator.php:82
msgid "Postcode / ZIP"
msgstr ""
@@ -8060,10 +8170,10 @@ msgstr ""
#: includes/admin/class-wc-admin-profile.php:133
#: includes/admin/class-wc-admin-settings.php:588
#: includes/admin/class-wc-admin-settings.php:613
-#: includes/admin/class-wc-admin-setup-wizard.php:396
+#: includes/admin/class-wc-admin-setup-wizard.php:421
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:72
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:123
-#: includes/class-wc-countries.php:641
+#: includes/class-wc-countries.php:649
msgid "Country"
msgstr ""
@@ -8071,8 +8181,8 @@ msgstr ""
#: includes/admin/class-wc-admin-profile.php:137
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:76
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:127
-#: includes/wc-template-functions.php:2530
-#: templates/cart/shipping-calculator.php:38
+#: includes/wc-template-functions.php:2536
+#: templates/cart/shipping-calculator.php:31
msgid "Select a country…"
msgstr ""
@@ -8080,10 +8190,10 @@ msgstr ""
#: includes/admin/class-wc-admin-profile.php:140
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:79
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:130
-#: includes/class-wc-countries.php:673
-#: templates/cart/shipping-calculator.php:59
-#: templates/cart/shipping-calculator.php:64
-#: templates/cart/shipping-calculator.php:76
+#: includes/class-wc-countries.php:682
+#: templates/cart/shipping-calculator.php:50
+#: templates/cart/shipping-calculator.php:55
+#: templates/cart/shipping-calculator.php:67
msgid "State / County"
msgstr ""
@@ -8093,19 +8203,19 @@ msgid "State / County or state code"
msgstr ""
#: includes/admin/class-wc-admin-profile.php:85
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:360
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:365
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:87
-#: includes/class-wc-countries.php:1232
+#: includes/class-wc-countries.php:1257
#: includes/customizer/class-wc-shop-customizer.php:679
msgid "Phone"
msgstr ""
#: includes/admin/class-wc-admin-profile.php:89
-#: includes/admin/class-wc-admin-setup-wizard.php:2164
+#: includes/admin/class-wc-admin-setup-wizard.php:2258
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:84
-#: includes/class-wc-countries.php:1242 includes/class-wc-form-handler.php:243
+#: includes/class-wc-countries.php:1267 includes/class-wc-form-handler.php:238
#: templates/myaccount/form-edit-account.php:43
-#: templates/myaccount/form-login.php:90
+#: templates/myaccount/form-login.php:86
msgid "Email address"
msgstr ""
@@ -8126,9 +8236,9 @@ msgstr ""
#: includes/admin/class-wc-admin-reports.php:47
#: includes/admin/reports/class-wc-report-customer-list.php:215
-#: includes/admin/settings/class-wc-settings-advanced.php:222
+#: includes/admin/settings/class-wc-settings-advanced.php:220
#: includes/class-wc-post-types.php:370
-#: includes/class-wc-privacy-exporters.php:76 includes/class-wc-query.php:109
+#: includes/class-wc-privacy-exporters.php:75 includes/class-wc-query.php:109
#: includes/wc-account-functions.php:99
msgid "Orders"
msgstr ""
@@ -8168,9 +8278,9 @@ msgstr ""
#: includes/admin/class-wc-admin-reports.php:99
#: includes/admin/importers/class-wc-product-csv-importer-controller.php:476
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:114
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:115
#: includes/admin/meta-boxes/views/html-product-data-variations.php:74
-#: includes/export/class-wc-product-csv-exporter.php:96
+#: includes/export/class-wc-product-csv-exporter.php:114
msgid "Stock"
msgstr ""
@@ -8225,7 +8335,7 @@ msgid "Select a page…"
msgstr ""
#: includes/admin/class-wc-admin-settings.php:588
-#: includes/admin/class-wc-admin-setup-wizard.php:396
+#: includes/admin/class-wc-admin-setup-wizard.php:421
msgid "Choose a country…"
msgstr ""
@@ -8234,37 +8344,49 @@ msgid "Choose countries…"
msgstr ""
#: includes/admin/class-wc-admin-settings.php:630
-#: includes/wc-formatting-functions.php:1360
+#: includes/wc-formatting-functions.php:1363
msgid "Day(s)"
msgstr ""
#: includes/admin/class-wc-admin-settings.php:631
-#: includes/wc-formatting-functions.php:1361
+#: includes/wc-formatting-functions.php:1364
msgid "Week(s)"
msgstr ""
#: includes/admin/class-wc-admin-settings.php:632
-#: includes/wc-formatting-functions.php:1362
+#: includes/wc-formatting-functions.php:1365
msgid "Month(s)"
msgstr ""
#: includes/admin/class-wc-admin-settings.php:633
-#: includes/wc-formatting-functions.php:1363
+#: includes/wc-formatting-functions.php:1366
msgid "Year(s)"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:155
+#: includes/admin/class-wc-admin-setup-wizard.php:193
+msgid "Stripe setup is powered by Jetpack and WooCommerce Services."
+msgstr ""
+
+#: includes/admin/class-wc-admin-setup-wizard.php:194
+msgid "PayPal setup is powered by Jetpack and WooCommerce Services."
+msgstr ""
+
+#: includes/admin/class-wc-admin-setup-wizard.php:195
+msgid "Stripe and PayPal setup are powered by Jetpack and WooCommerce Services."
+msgstr ""
+
+#: includes/admin/class-wc-admin-setup-wizard.php:212
msgid "Store setup"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:160
-#: includes/admin/class-wc-admin-setup-wizard.php:1608
+#: includes/admin/class-wc-admin-setup-wizard.php:217
+#: includes/admin/class-wc-admin-setup-wizard.php:1702
msgid "Payment"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:165
-#: includes/admin/class-wc-admin-setup-wizard.php:881
-#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:424
+#: includes/admin/class-wc-admin-setup-wizard.php:222
+#: includes/admin/class-wc-admin-setup-wizard.php:913
+#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:428
#: includes/admin/meta-boxes/class-wc-meta-box-product-data.php:99
#: includes/admin/meta-boxes/views/html-order-shipping.php:17
#: includes/admin/meta-boxes/views/html-product-data-variations.php:79
@@ -8276,64 +8398,65 @@ msgstr ""
msgid "Shipping"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:170
+#: includes/admin/class-wc-admin-setup-wizard.php:227
msgid "Recommended"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:175
+#: includes/admin/class-wc-admin-setup-wizard.php:232
msgid "Activate"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:180
+#: includes/admin/class-wc-admin-setup-wizard.php:237
msgid "Ready!"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:289
+#: includes/admin/class-wc-admin-setup-wizard.php:313
msgid "WooCommerce › Setup Wizard"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:305
+#: includes/admin/class-wc-admin-setup-wizard.php:330
msgid "Not right now"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:307
+#: includes/admin/class-wc-admin-setup-wizard.php:332
msgid "Skip this step"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:391
+#: includes/admin/class-wc-admin-setup-wizard.php:416
msgid ""
"The following wizard will help you configure your store and get you started "
"quickly."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:395
+#: includes/admin/class-wc-admin-setup-wizard.php:420
msgid "Where is your store based?"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:402
+#: includes/admin/class-wc-admin-setup-wizard.php:427
msgid "Address"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:415
-#: includes/admin/class-wc-admin-setup-wizard.php:417
-#: includes/class-wc-countries.php:764 includes/class-wc-countries.php:1131
+#: includes/admin/class-wc-admin-setup-wizard.php:440
+#: includes/admin/class-wc-admin-setup-wizard.php:442
+#: includes/class-wc-countries.php:767 includes/class-wc-countries.php:1020
+#: includes/class-wc-countries.php:1156
msgid "State"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:417
+#: includes/admin/class-wc-admin-setup-wizard.php:442
msgid "Choose a state…"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:428
+#: includes/admin/class-wc-admin-setup-wizard.php:453
msgid "What currency do you accept payments in?"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:434
-#: includes/admin/class-wc-admin-setup-wizard.php:437
+#: includes/admin/class-wc-admin-setup-wizard.php:459
+#: includes/admin/class-wc-admin-setup-wizard.php:462
msgid "Choose a currency…"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:445
+#: includes/admin/class-wc-admin-setup-wizard.php:470
#: includes/admin/meta-boxes/views/html-order-items.php:41
#: includes/admin/views/html-bulk-edit-product.php:134
#. translators: 1: currency name 2: currency code
@@ -8341,36 +8464,36 @@ msgstr ""
msgid "%1$s (%2$s)"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:448
+#: includes/admin/class-wc-admin-setup-wizard.php:473
#. translators: 1: currency name 2: currency symbol, 3: currency code
msgid "%1$s (%2$s / %3$s)"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:462
+#: includes/admin/class-wc-admin-setup-wizard.php:487
msgid "What type of products do you plan to sell?"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:465
+#: includes/admin/class-wc-admin-setup-wizard.php:490
msgid "I plan to sell both physical and digital products"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:466
+#: includes/admin/class-wc-admin-setup-wizard.php:491
msgid "I plan to sell physical products"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:467
+#: includes/admin/class-wc-admin-setup-wizard.php:492
msgid "I plan to sell digital products"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:479
+#: includes/admin/class-wc-admin-setup-wizard.php:504
msgid "I will also be selling products or services in person."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:488
+#: includes/admin/class-wc-admin-setup-wizard.php:513
msgid "Help WooCommerce improve with usage tracking."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:492
+#: includes/admin/class-wc-admin-setup-wizard.php:517
msgid ""
"Gathering usage data allows us to make WooCommerce better — your "
"store will be considered as we evaluate new features, judge the quality of "
@@ -8379,41 +8502,33 @@ msgid ""
"we will not collect any usage data."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:493
+#: includes/admin/class-wc-admin-setup-wizard.php:518
msgid "Read more about what we collect."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:501
+#: includes/admin/class-wc-admin-setup-wizard.php:526
msgid "Let's go!"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:674
-#: includes/admin/class-wc-admin-setup-wizard.php:709
-#: includes/admin/class-wc-admin-setup-wizard.php:2104
+#: includes/admin/class-wc-admin-setup-wizard.php:700
+#: includes/admin/class-wc-admin-setup-wizard.php:735
+#: includes/admin/class-wc-admin-setup-wizard.php:2198
msgid "Jetpack"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:722
+#: includes/admin/class-wc-admin-setup-wizard.php:748
msgid "The following plugins will be installed and activated for you:"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:758
-msgid "Live Rates"
-msgstr ""
-
-#: includes/admin/class-wc-admin-setup-wizard.php:759
-msgid "Powered by WooCommerce Services and Jetpack."
-msgstr ""
-
-#: includes/admin/class-wc-admin-setup-wizard.php:762
+#: includes/admin/class-wc-admin-setup-wizard.php:764
msgid "Flat Rate"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:763
+#: includes/admin/class-wc-admin-setup-wizard.php:765
msgid "Set a fixed price to cover shipping costs."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:767
+#: includes/admin/class-wc-admin-setup-wizard.php:769
#: includes/admin/meta-boxes/views/html-order-items.php:31
#: includes/shipping/flat-rate/includes/settings-flat-rate.php:31
#: includes/shipping/legacy-flat-rate/includes/settings-flat-rate.php:63
@@ -8421,117 +8536,136 @@ msgstr ""
msgid "Cost"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:768
+#: includes/admin/class-wc-admin-setup-wizard.php:770
msgid "What would you like to charge for flat rate shipping?"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:774
+#: includes/admin/class-wc-admin-setup-wizard.php:776
#: includes/shipping/legacy-free-shipping/class-wc-shipping-legacy-free-shipping.php:106
msgid "Free Shipping"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:775
+#: includes/admin/class-wc-admin-setup-wizard.php:777
msgid "Don't charge for shipping."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:864
-msgid "How would you like units on your store displayed?"
+#: includes/admin/class-wc-admin-setup-wizard.php:856
+msgid "Kilograms"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:868
-#. translators: %1$s: country name including the 'the' prefix, %2$s: shipping
-#. carrier name
-msgid ""
-"You're all set up to ship anywhere in %1$s, and outside of it. We recommend "
-"using live rates (which are powered by our WooCommerce "
-"Services plugin and Jetpack) to get accurate %2$s shipping prices to cover "
-"the cost of order fulfillment."
+#: includes/admin/class-wc-admin-setup-wizard.php:857
+msgid "Grams"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:875
+#: includes/admin/class-wc-admin-setup-wizard.php:858
+msgid "Pounds"
+msgstr ""
+
+#: includes/admin/class-wc-admin-setup-wizard.php:859
+msgid "Ounces"
+msgstr ""
+
+#: includes/admin/class-wc-admin-setup-wizard.php:878
+msgid "Meters"
+msgstr ""
+
+#: includes/admin/class-wc-admin-setup-wizard.php:879
+msgid "Centimeters"
+msgstr ""
+
+#: includes/admin/class-wc-admin-setup-wizard.php:880
+msgid "Millimeters"
+msgstr ""
+
+#: includes/admin/class-wc-admin-setup-wizard.php:881
+msgid "Inches"
+msgstr ""
+
+#: includes/admin/class-wc-admin-setup-wizard.php:882
+msgid "Yards"
+msgstr ""
+
+#: includes/admin/class-wc-admin-setup-wizard.php:904
#. translators: %s: country name including the 'the' prefix if needed
msgid ""
-"You can choose which countries you'll be shipping to and with which "
-"methods. To get started, we've set you up with shipping inside and outside "
-"of %s."
+"We've created two Shipping Zones - for %s and for the rest of the world. "
+"Below you can set Flat Rate shipping costs for these Zones or offer Free "
+"Shipping."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:888
+#: includes/admin/class-wc-admin-setup-wizard.php:922
msgid "Shipping Zone"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:891
+#: includes/admin/class-wc-admin-setup-wizard.php:925
msgid "Shipping Method"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:910
+#: includes/admin/class-wc-admin-setup-wizard.php:944
#: includes/admin/settings/views/html-admin-page-shipping-zones.php:26
#: includes/data-stores/class-wc-shipping-zone-data-store.php:87
msgid "Locations not covered by your other zones"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:932
-msgid "Weight unit —used to calculate shipping rates, and more."
-msgstr ""
-
-#: includes/admin/class-wc-admin-setup-wizard.php:940
-#: includes/admin/settings/class-wc-settings-products.php:371
-msgid "kg"
-msgstr ""
-
-#: includes/admin/class-wc-admin-setup-wizard.php:941
-#: includes/admin/settings/class-wc-settings-products.php:372
-msgid "g"
-msgstr ""
-
-#: includes/admin/class-wc-admin-setup-wizard.php:942
-#: includes/admin/settings/class-wc-settings-products.php:373
-msgid "lbs"
-msgstr ""
-
-#: includes/admin/class-wc-admin-setup-wizard.php:943
-#: includes/admin/settings/class-wc-settings-products.php:374
-msgid "oz"
-msgstr ""
-
-#: includes/admin/class-wc-admin-setup-wizard.php:952
-msgid "Dimension unit —helps for accurate package selection."
-msgstr ""
-
-#: includes/admin/class-wc-admin-setup-wizard.php:960
-#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:237
-#: includes/admin/settings/class-wc-settings-products.php:388
-msgid "m"
-msgstr ""
-
-#: includes/admin/class-wc-admin-setup-wizard.php:961
-#: includes/admin/settings/class-wc-settings-products.php:389
-msgid "cm"
-msgstr ""
-
#: includes/admin/class-wc-admin-setup-wizard.php:962
-#: includes/admin/settings/class-wc-settings-products.php:390
-msgid "mm"
+#. translators: %1$s: live rates tooltip text, %2$s: shipping extensions URL
+msgid ""
+"If you'd like to offer live "
+"rates from a specific carrier (e.g. UPS) you can find a variety of "
+"extensions available for WooCommerce here ."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:963
-#: includes/admin/settings/class-wc-settings-products.php:391
-msgid "in"
+#: includes/admin/class-wc-admin-setup-wizard.php:974
+msgid ""
+"A live rate is the exact cost to ship an order, quoted directly from the "
+"shipping carrier."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:964
-#: includes/admin/settings/class-wc-settings-products.php:392
-msgid "yd"
+#: includes/admin/class-wc-admin-setup-wizard.php:989
+#: includes/admin/class-wc-admin-setup-wizard.php:998
+msgid "Print shipping labels at home"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:971
-#: includes/admin/class-wc-admin-setup-wizard.php:1666
-#: includes/admin/class-wc-admin-setup-wizard.php:1826
+#: includes/admin/class-wc-admin-setup-wizard.php:990
+msgid ""
+"We recommend WooCommerce Services & Jetpack. These plugins will save you "
+"time at the Post Office by enabling you to print your shipping labels at "
+"home."
+msgstr ""
+
+#: includes/admin/class-wc-admin-setup-wizard.php:992
+msgid "WooCommerce Services icon"
+msgstr ""
+
+#: includes/admin/class-wc-admin-setup-wizard.php:999
+msgid ""
+"We recommend using ShipStation to save time at the Post Office by printing "
+"your shipping labels at home. Try ShipStation free for 30 days."
+msgstr ""
+
+#: includes/admin/class-wc-admin-setup-wizard.php:1001
+msgid "ShipStation icon"
+msgstr ""
+
+#: includes/admin/class-wc-admin-setup-wizard.php:1004
+#: includes/admin/class-wc-admin-setup-wizard.php:1083
+msgid "ShipStation"
+msgstr ""
+
+#: includes/admin/class-wc-admin-setup-wizard.php:1020
+#. translators: %1$s: weight unit dropdown, %2$s: dimension unit dropdown
+msgid "We'll use %1$s for product weight and %2$s for product dimensions."
+msgstr ""
+
+#: includes/admin/class-wc-admin-setup-wizard.php:1045
+#: includes/admin/class-wc-admin-setup-wizard.php:1760
+#: includes/admin/class-wc-admin-setup-wizard.php:1920
#: includes/admin/importers/views/html-product-csv-import-form.php:101
msgid "Continue"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1237
+#: includes/admin/class-wc-admin-setup-wizard.php:1329
#. translators: %s: URL
msgid ""
"Accept debit and credit cards in 135+ currencies, methods such as Alipay, "
@@ -8539,14 +8673,14 @@ msgid ""
"target=\"_blank\">Learn more."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1242
+#: includes/admin/class-wc-admin-setup-wizard.php:1334
#. translators: %s: URL
msgid ""
"Safe and secure payments using credit cards or your customer's PayPal "
"account. Learn more ."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1247
+#: includes/admin/class-wc-admin-setup-wizard.php:1339
#. translators: %s: URL
msgid ""
"Full checkout experience with pay now, pay later and slice it. No credit "
@@ -8554,7 +8688,7 @@ msgid ""
"target=\"_blank\">Learn more about Klarna."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1252
+#: includes/admin/class-wc-admin-setup-wizard.php:1344
#. translators: %s: URL
msgid ""
"Choose the payment that you want, pay now, pay later or slice it. No credit "
@@ -8562,7 +8696,7 @@ msgid ""
"target=\"_blank\">Learn more about Klarna."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1257
+#: includes/admin/class-wc-admin-setup-wizard.php:1349
#. translators: %s: URL
msgid ""
"Securely accept credit and debit cards with one low rate, no surprise fees "
@@ -8571,157 +8705,145 @@ msgid ""
"Square."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1263
+#: includes/admin/class-wc-admin-setup-wizard.php:1355
msgid "WooCommerce Stripe Gateway"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1270
-msgid "Create a new Stripe account for me"
+#: includes/admin/class-wc-admin-setup-wizard.php:1362
+msgid "Set up Stripe for me using this email:"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1278
+#: includes/admin/class-wc-admin-setup-wizard.php:1371
msgid "Stripe email address:"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1281
+#: includes/admin/class-wc-admin-setup-wizard.php:1374
msgid "Stripe email address"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1282
-msgid ""
-"Enter your email address and we'll handle account creation. Powered by "
-"WooCommerce Services and Jetpack."
+#: includes/admin/class-wc-admin-setup-wizard.php:1380
+msgid "WooCommerce PayPal Checkout Gateway"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1288
-msgid "WooCommerce PayPal Express Checkout Gateway"
+#: includes/admin/class-wc-admin-setup-wizard.php:1388
+msgid "Set up PayPal for me using this email:"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1296
-msgid "Accept payments without linking a PayPal account"
-msgstr ""
-
-#: includes/admin/class-wc-admin-setup-wizard.php:1304
+#: includes/admin/class-wc-admin-setup-wizard.php:1397
msgid "Direct payments to email address:"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1307
+#: includes/admin/class-wc-admin-setup-wizard.php:1400
msgid "Email address to receive payments"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1308
-msgid ""
-"Enter your email address and we'll authenticate payments for you. Powered "
-"by WooCommerce Services and Jetpack."
-msgstr ""
-
-#: includes/admin/class-wc-admin-setup-wizard.php:1314
+#: includes/admin/class-wc-admin-setup-wizard.php:1406
msgid "PayPal Standard"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1315
+#: includes/admin/class-wc-admin-setup-wizard.php:1407
msgid "Accept payments via PayPal using account balance or credit card."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1319
+#: includes/admin/class-wc-admin-setup-wizard.php:1411
msgid "PayPal email address:"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1322
+#: includes/admin/class-wc-admin-setup-wizard.php:1414
msgid "PayPal email address"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1328
+#: includes/admin/class-wc-admin-setup-wizard.php:1420
msgid "Klarna Checkout for WooCommerce"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1336
+#: includes/admin/class-wc-admin-setup-wizard.php:1428
msgid "Klarna Payments for WooCommerce"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1344
+#: includes/admin/class-wc-admin-setup-wizard.php:1436
msgid "WooCommerce Square"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1352
+#: includes/admin/class-wc-admin-setup-wizard.php:1444
msgid "WooCommerce eWAY Gateway"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1353
+#: includes/admin/class-wc-admin-setup-wizard.php:1445
msgid ""
"The eWAY extension for WooCommerce allows you to take credit card payments "
"directly on your store without redirecting your customers to a third party "
"site to make payment."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1360
+#: includes/admin/class-wc-admin-setup-wizard.php:1452
msgid "WooCommerce PayFast Gateway"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1361
+#: includes/admin/class-wc-admin-setup-wizard.php:1453
msgid ""
"The PayFast extension for WooCommerce enables you to accept payments by "
"Credit Card and EFT via one of South Africa’s most popular payment "
"gateways. No setup fees or monthly subscription costs."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1456
+#: includes/admin/class-wc-admin-setup-wizard.php:1548
msgid "A simple offline gateway that lets you accept a check as method of payment."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1461
+#: includes/admin/class-wc-admin-setup-wizard.php:1553
msgid "Bank transfer (BACS) payments"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1462
+#: includes/admin/class-wc-admin-setup-wizard.php:1554
msgid "A simple offline gateway that lets you accept BACS payment."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1467
+#: includes/admin/class-wc-admin-setup-wizard.php:1559
#: includes/gateways/cod/class-wc-gateway-cod.php:56
#: includes/gateways/cod/class-wc-gateway-cod.php:118
msgid "Cash on delivery"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1468
+#: includes/admin/class-wc-admin-setup-wizard.php:1560
msgid "A simple offline gateway that lets you accept cash on delivery."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1615
+#: includes/admin/class-wc-admin-setup-wizard.php:1709
#. translators: %s: Link
msgid ""
"WooCommerce can accept both online and offline payments. Additional payment methods can be installed later."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1648
+#: includes/admin/class-wc-admin-setup-wizard.php:1742
msgid "Offline Payments"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1651
+#: includes/admin/class-wc-admin-setup-wizard.php:1745
msgid "Collect payments from customers offline."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1768
+#: includes/admin/class-wc-admin-setup-wizard.php:1862
msgid "Recommended for All WooCommerce Stores"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1778
+#: includes/admin/class-wc-admin-setup-wizard.php:1872
msgid ""
"Select from the list below to enable automated taxes and MailChimp’s "
"best-in-class email services — and design your store with our official, "
"free WooCommerce theme."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1780
+#: includes/admin/class-wc-admin-setup-wizard.php:1874
msgid "Enhance your store with these recommended features."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1791
+#: includes/admin/class-wc-admin-setup-wizard.php:1885
msgid "Storefront Theme"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1792
+#: includes/admin/class-wc-admin-setup-wizard.php:1886
msgid ""
"Design your store with deep WooCommerce integration. If toggled on, we’ll "
"install %s will be deactivated."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1797
+#: includes/admin/class-wc-admin-setup-wizard.php:1891
msgid "Storefront icon"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1804
+#: includes/admin/class-wc-admin-setup-wizard.php:1898
msgid "Automated Taxes"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1805
+#: includes/admin/class-wc-admin-setup-wizard.php:1899
msgid ""
"Save time and errors with automated tax calculation and collection at "
"checkout. Powered by WooCommerce Services and Jetpack."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1807
+#: includes/admin/class-wc-admin-setup-wizard.php:1901
msgid "automated taxes icon"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1815
+#: includes/admin/class-wc-admin-setup-wizard.php:1909
msgid "MailChimp"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1816
+#: includes/admin/class-wc-admin-setup-wizard.php:1910
msgid ""
"Join the 16 million customers who use MailChimp. Sync list and store data "
"to send automated emails, and targeted campaigns."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1818
+#: includes/admin/class-wc-admin-setup-wizard.php:1912
msgid "MailChimp icon"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1819
-#: includes/admin/class-wc-admin-setup-wizard.php:1861
+#: includes/admin/class-wc-admin-setup-wizard.php:1913
+#: includes/admin/class-wc-admin-setup-wizard.php:1955
msgid "MailChimp for WooCommerce"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1912
+#: includes/admin/class-wc-admin-setup-wizard.php:2006
msgid "payment setup, automated taxes, live rates and discounted shipping labels"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1914
+#: includes/admin/class-wc-admin-setup-wizard.php:2008
msgid "payment setup and automated taxes"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1916
+#: includes/admin/class-wc-admin-setup-wizard.php:2010
msgid "payment setup, live rates and discounted shipping labels"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1918
+#: includes/admin/class-wc-admin-setup-wizard.php:2012
msgid "payment setup"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1920
+#: includes/admin/class-wc-admin-setup-wizard.php:2014
msgid "automated taxes, live rates and discounted shipping labels"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1922
+#: includes/admin/class-wc-admin-setup-wizard.php:2016
msgid "automated taxes"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1924
+#: includes/admin/class-wc-admin-setup-wizard.php:2018
msgid "live rates and discounted shipping labels"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1941
+#: includes/admin/class-wc-admin-setup-wizard.php:2035
msgid "Sorry, we couldn't connect your store to Jetpack"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1953
+#: includes/admin/class-wc-admin-setup-wizard.php:2047
#. translators: %s: list of features, potentially comma separated
msgid ""
"Your store is almost ready! To activate services like %s, just connect with "
"Jetpack."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1955
+#: includes/admin/class-wc-admin-setup-wizard.php:2049
msgid ""
"Thanks for using Jetpack! Your store is almost ready: to activate services "
"like %s, just connect your store."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1962
+#: includes/admin/class-wc-admin-setup-wizard.php:2056
msgid "Connect your store to Jetpack"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1963
+#: includes/admin/class-wc-admin-setup-wizard.php:2057
msgid "Connect your store to Jetpack to enable extra features"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1964
+#: includes/admin/class-wc-admin-setup-wizard.php:2058
msgid "Continue with Jetpack"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1966
+#: includes/admin/class-wc-admin-setup-wizard.php:2060
msgid "Connect your store to activate WooCommerce Services"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1967
+#: includes/admin/class-wc-admin-setup-wizard.php:2061
msgid "Continue with WooCommerce Services"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2003
+#: includes/admin/class-wc-admin-setup-wizard.php:2097
msgid "Finish setting up your store"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2010
+#: includes/admin/class-wc-admin-setup-wizard.php:2104
msgid ""
"By connecting your site you agree to our fascinating Terms of Service and to share details with WordPress.com"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2027
+#: includes/admin/class-wc-admin-setup-wizard.php:2121
msgid "Bonus reasons you'll love Jetpack"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2028
+#: includes/admin/class-wc-admin-setup-wizard.php:2122
msgid "Reasons you'll love Jetpack"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2035
+#: includes/admin/class-wc-admin-setup-wizard.php:2129
msgid "Better security"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2038
+#: includes/admin/class-wc-admin-setup-wizard.php:2132
msgid "Protect your store from unauthorized access."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2043
+#: includes/admin/class-wc-admin-setup-wizard.php:2137
msgid "Store stats"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2046
+#: includes/admin/class-wc-admin-setup-wizard.php:2140
msgid ""
"Get insights on how your store is doing, including total sales, top "
"products, and more."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2051
+#: includes/admin/class-wc-admin-setup-wizard.php:2145
msgid "Store monitoring"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2054
+#: includes/admin/class-wc-admin-setup-wizard.php:2148
msgid "Get an alert if your store is down for even a few minutes."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2059
+#: includes/admin/class-wc-admin-setup-wizard.php:2153
msgid "Product promotion"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2062
+#: includes/admin/class-wc-admin-setup-wizard.php:2156
msgid "Share new items on social media the moment they're live in your store."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2073
+#: includes/admin/class-wc-admin-setup-wizard.php:2167
msgid ""
"Sorry! We tried, but we couldn't connect Jetpack just now 😭. Please go to "
"the Plugins tab to connect Jetpack, so that you can finish setting up your "
"store."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2074
+#: includes/admin/class-wc-admin-setup-wizard.php:2168
msgid ""
"Sorry! We tried, but we couldn't install Jetpack for you 😭. Please go to "
"the Plugins tab to install it, and finish setting up your store."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2075
+#: includes/admin/class-wc-admin-setup-wizard.php:2169
msgid ""
"Sorry! We couldn't contact Jetpack just now 😭. Please make sure that your "
"site is visible over the internet, and that it accepts incoming and "
@@ -8905,14 +9027,14 @@ msgid ""
"and if you run into any more issues, please contact support."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2076
+#: includes/admin/class-wc-admin-setup-wizard.php:2170
msgid ""
"Your site might be on a private network. Jetpack can only connect to public "
"sites. Please make sure your site is visible over the internet, and then "
"try connecting again 🙏."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2148
+#: includes/admin/class-wc-admin-setup-wizard.php:2242
#. translators: %1$s: link to videos, %2$s: link to docs
msgid ""
"Watch our guided tour videos to "
@@ -8920,122 +9042,122 @@ msgid ""
"getting started ."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2153
+#: includes/admin/class-wc-admin-setup-wizard.php:2247
msgid "You're ready to start selling!"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2156
+#: includes/admin/class-wc-admin-setup-wizard.php:2250
msgid ""
"We're here for you — get tips, product updates, and inspiration straight to "
"your mailbox."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2170
-#: includes/admin/class-wc-admin-setup-wizard.php:2174
+#: includes/admin/class-wc-admin-setup-wizard.php:2264
+#: includes/admin/class-wc-admin-setup-wizard.php:2268
msgid "Yes please!"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2183
+#: includes/admin/class-wc-admin-setup-wizard.php:2277
msgid "Next step"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2184
+#: includes/admin/class-wc-admin-setup-wizard.php:2278
msgid "Create some products"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2185
+#: includes/admin/class-wc-admin-setup-wizard.php:2279
msgid "You're ready to add products to your store."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2190
+#: includes/admin/class-wc-admin-setup-wizard.php:2284
msgid "Create a product"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2197
+#: includes/admin/class-wc-admin-setup-wizard.php:2291
msgid "Have an existing store?"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2198
-#: includes/admin/class-wc-admin-setup-wizard.php:2204
+#: includes/admin/class-wc-admin-setup-wizard.php:2292
+#: includes/admin/class-wc-admin-setup-wizard.php:2298
msgid "Import products"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2199
+#: includes/admin/class-wc-admin-setup-wizard.php:2293
msgid "Transfer existing products to your new store — just import a CSV file."
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2211
+#: includes/admin/class-wc-admin-setup-wizard.php:2305
msgid "You can also:"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2216
+#: includes/admin/class-wc-admin-setup-wizard.php:2310
msgid "Visit Dashboard"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2219
+#: includes/admin/class-wc-admin-setup-wizard.php:2313
msgid "Review Settings"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:2222
+#: includes/admin/class-wc-admin-setup-wizard.php:2316
msgid "View & Customize"
msgstr ""
-#: includes/admin/class-wc-admin-status.php:45
+#: includes/admin/class-wc-admin-status.php:61
msgid "Tool does not exist."
msgstr ""
-#: includes/admin/class-wc-admin-status.php:58
+#: includes/admin/class-wc-admin-status.php:74
msgid "Your changes have been saved."
msgstr ""
-#: includes/admin/class-wc-admin-taxonomies.php:97
-#: includes/admin/class-wc-admin-taxonomies.php:204
+#: includes/admin/class-wc-admin-taxonomies.php:110
+#: includes/admin/class-wc-admin-taxonomies.php:217
#: includes/widgets/class-wc-widget-layered-nav.php:84
msgid "Display type"
msgstr ""
-#: includes/admin/class-wc-admin-taxonomies.php:100
-#: includes/admin/class-wc-admin-taxonomies.php:208
+#: includes/admin/class-wc-admin-taxonomies.php:113
+#: includes/admin/class-wc-admin-taxonomies.php:221
#: includes/admin/meta-boxes/class-wc-meta-box-coupon-data.php:187
-#: includes/admin/settings/class-wc-settings-products.php:29
+#: includes/admin/settings/class-wc-settings-products.php:27
#: includes/class-wc-post-types.php:302
#: includes/widgets/class-wc-widget-products.php:23
#: includes/widgets/class-wc-widget-products.php:27
msgid "Products"
msgstr ""
-#: includes/admin/class-wc-admin-taxonomies.php:101
-#: includes/admin/class-wc-admin-taxonomies.php:209
+#: includes/admin/class-wc-admin-taxonomies.php:114
+#: includes/admin/class-wc-admin-taxonomies.php:222
msgid "Subcategories"
msgstr ""
-#: includes/admin/class-wc-admin-taxonomies.php:102
-#: includes/admin/class-wc-admin-taxonomies.php:210
+#: includes/admin/class-wc-admin-taxonomies.php:115
+#: includes/admin/class-wc-admin-taxonomies.php:223
msgid "Both"
msgstr ""
-#: includes/admin/class-wc-admin-taxonomies.php:106
-#: includes/admin/class-wc-admin-taxonomies.php:215
-#: includes/admin/class-wc-admin-taxonomies.php:419
+#: includes/admin/class-wc-admin-taxonomies.php:119
+#: includes/admin/class-wc-admin-taxonomies.php:228
+#: includes/admin/class-wc-admin-taxonomies.php:432
msgid "Thumbnail"
msgstr ""
-#: includes/admin/class-wc-admin-taxonomies.php:110
-#: includes/admin/class-wc-admin-taxonomies.php:220
+#: includes/admin/class-wc-admin-taxonomies.php:123
+#: includes/admin/class-wc-admin-taxonomies.php:233
msgid "Upload/Add image"
msgstr ""
-#: includes/admin/class-wc-admin-taxonomies.php:111
-#: includes/admin/class-wc-admin-taxonomies.php:221
+#: includes/admin/class-wc-admin-taxonomies.php:124
+#: includes/admin/class-wc-admin-taxonomies.php:234
msgid "Remove image"
msgstr ""
-#: includes/admin/class-wc-admin-taxonomies.php:137
-#: includes/admin/class-wc-admin-taxonomies.php:247
+#: includes/admin/class-wc-admin-taxonomies.php:150
+#: includes/admin/class-wc-admin-taxonomies.php:260
msgid "Use image"
msgstr ""
-#: includes/admin/class-wc-admin-taxonomies.php:300
+#: includes/admin/class-wc-admin-taxonomies.php:313
msgid ""
"Product categories for your store can be managed here. To change the order "
"of categories on the front-end you can drag and drop to sort them. To see "
@@ -9043,17 +9165,17 @@ msgid ""
"of this page."
msgstr ""
-#: includes/admin/class-wc-admin-taxonomies.php:313
-#: includes/api/class-wc-rest-system-status-tools-controller.php:162
-#: includes/api/class-wc-rest-system-status-tools-controller.php:171
-#: includes/api/class-wc-rest-system-status-tools-controller.php:180
+#: includes/admin/class-wc-admin-taxonomies.php:326
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:162
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:171
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:180
#: templates/emails/email-order-details.php:79
-#: templates/emails/plain/email-order-details.php:46
+#: templates/emails/plain/email-order-details.php:45
#: templates/order/order-details.php:84
msgid "Note:"
msgstr ""
-#: includes/admin/class-wc-admin-taxonomies.php:317
+#: includes/admin/class-wc-admin-taxonomies.php:330
#. translators: %s: default category
msgid ""
"Deleting a category does not delete the products in that category. Instead, "
@@ -9061,7 +9183,7 @@ msgid ""
"category %s."
msgstr ""
-#: includes/admin/class-wc-admin-taxonomies.php:330
+#: includes/admin/class-wc-admin-taxonomies.php:343
msgid ""
"Attribute terms can be assigned to products and "
"variations.Note : Deleting a term will remove it from all "
@@ -9069,22 +9191,22 @@ msgid ""
"will not automatically assign it back to products."
msgstr ""
-#: includes/admin/class-wc-admin-taxonomies.php:347
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:106
+#: includes/admin/class-wc-admin-taxonomies.php:360
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:107
msgid "Image"
msgstr ""
-#: includes/admin/class-wc-admin-taxonomies.php:370
+#: includes/admin/class-wc-admin-taxonomies.php:383
#. translators: %s: taxonomy term name
msgid "Make “%s” the default category"
msgstr ""
-#: includes/admin/class-wc-admin-taxonomies.php:371
+#: includes/admin/class-wc-admin-taxonomies.php:384
#: includes/wc-account-functions.php:360
msgid "Make default"
msgstr ""
-#: includes/admin/class-wc-admin-taxonomies.php:406
+#: includes/admin/class-wc-admin-taxonomies.php:419
msgid ""
"This is the default category and it cannot be deleted. It will be "
"automatically assigned to products with no category."
@@ -9100,7 +9222,7 @@ msgid "Topic"
msgstr ""
#: includes/admin/class-wc-admin-webhooks-table-list.php:51
-#: includes/admin/settings/views/html-webhooks-edit.php:108
+#: includes/admin/settings/views/html-webhooks-edit.php:111
msgid "Delivery URL"
msgstr ""
@@ -9112,10 +9234,14 @@ msgstr ""
#: includes/admin/class-wc-admin-webhooks-table-list.php:92
#: includes/admin/class-wc-admin-webhooks-table-list.php:206
#: includes/admin/meta-boxes/class-wc-meta-box-order-actions.php:63
-#: includes/admin/settings/views/html-webhooks-edit.php:195
+#: includes/admin/settings/views/html-webhooks-edit.php:198
msgid "Delete permanently"
msgstr ""
+#: includes/admin/class-wc-admin-webhooks-table-list.php:218
+msgid "You do not have permission to edit Webhooks"
+msgstr ""
+
#: includes/admin/class-wc-admin-webhooks.php:56
msgid "You do not have permission to update Webhooks"
msgstr ""
@@ -9132,45 +9258,41 @@ msgstr ""
msgid "Webhook topic unknown. Please select a valid topic."
msgstr ""
-#: includes/admin/class-wc-admin-webhooks.php:189
-msgid "You do not have permission to edit Webhooks"
-msgstr ""
-
-#: includes/admin/class-wc-admin-webhooks.php:251
+#: includes/admin/class-wc-admin-webhooks.php:225
#. translators: %d: count
msgid "%d webhook permanently deleted."
msgid_plural "%d webhooks permanently deleted."
msgstr[0] ""
msgstr[1] ""
-#: includes/admin/class-wc-admin-webhooks.php:255
+#: includes/admin/class-wc-admin-webhooks.php:229
msgid "Webhook updated successfully."
msgstr ""
-#: includes/admin/class-wc-admin-webhooks.php:259
+#: includes/admin/class-wc-admin-webhooks.php:233
msgid "Webhook created successfully."
msgstr ""
-#: includes/admin/class-wc-admin-webhooks.php:295
-#: includes/admin/settings/class-wc-settings-advanced.php:44
+#: includes/admin/class-wc-admin-webhooks.php:269
+#: includes/admin/settings/class-wc-settings-advanced.php:42
msgid "Webhooks"
msgstr ""
-#: includes/admin/class-wc-admin-webhooks.php:295
+#: includes/admin/class-wc-admin-webhooks.php:269
msgid "Add webhook"
msgstr ""
-#: includes/admin/class-wc-admin-webhooks.php:309
+#: includes/admin/class-wc-admin-webhooks.php:284
msgid "Search webhooks"
msgstr ""
-#: includes/admin/class-wc-admin-webhooks.php:314
+#: includes/admin/class-wc-admin-webhooks.php:289
msgid ""
"Webhooks are event notifications sent to URLs of your choice. They can be "
"used to integrate with third-party services which support them."
msgstr ""
-#: includes/admin/class-wc-admin-webhooks.php:315
+#: includes/admin/class-wc-admin-webhooks.php:290
msgid "Create a new webhook"
msgstr ""
@@ -9308,10 +9430,10 @@ msgstr ""
#: includes/admin/helper/class-wc-helper.php:346
#: includes/admin/helper/views/html-main.php:109
-#: includes/class-wc-emails.php:412
+#: includes/class-wc-emails.php:410
#: includes/legacy/abstract-wc-legacy-order.php:507
#: includes/wc-account-functions.php:214
-#: includes/wc-template-functions.php:3072
+#: includes/wc-template-functions.php:3080
msgid "Download"
msgstr ""
@@ -9560,63 +9682,63 @@ msgid "The file does not exist, please try again."
msgstr ""
#: includes/admin/importers/class-wc-product-csv-importer-controller.php:462
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:620
-#: includes/export/class-wc-product-csv-exporter.php:82
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:621
+#: includes/export/class-wc-product-csv-exporter.php:100
msgid "ID"
msgstr ""
#: includes/admin/importers/class-wc-product-csv-importer-controller.php:464
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:622
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:110
-#: includes/admin/meta-boxes/views/html-product-data-inventory.php:15
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:623
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:111
+#: includes/admin/meta-boxes/views/html-product-data-inventory.php:21
#: includes/admin/meta-boxes/views/html-variation-admin.php:67
#: includes/admin/views/html-quick-edit-product.php:21
-#: includes/export/class-wc-product-csv-exporter.php:84
+#: includes/export/class-wc-product-csv-exporter.php:102
msgid "SKU"
msgstr ""
#: includes/admin/importers/class-wc-product-csv-importer-controller.php:466
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:624
-#: includes/export/class-wc-product-csv-exporter.php:86
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:625
+#: includes/export/class-wc-product-csv-exporter.php:104
msgid "Published"
msgstr ""
#: includes/admin/importers/class-wc-product-csv-importer-controller.php:467
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:625
-#: includes/export/class-wc-product-csv-exporter.php:87
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:626
+#: includes/export/class-wc-product-csv-exporter.php:105
msgid "Is featured?"
msgstr ""
#: includes/admin/importers/class-wc-product-csv-importer-controller.php:468
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:626
-#: includes/export/class-wc-product-csv-exporter.php:88
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:627
+#: includes/export/class-wc-product-csv-exporter.php:106
msgid "Visibility in catalog"
msgstr ""
#: includes/admin/importers/class-wc-product-csv-importer-controller.php:469
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:627
-#: includes/export/class-wc-product-csv-exporter.php:89
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:628
+#: includes/export/class-wc-product-csv-exporter.php:107
msgid "Short description"
msgstr ""
#: includes/admin/importers/class-wc-product-csv-importer-controller.php:471
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:634
-#: includes/export/class-wc-product-csv-exporter.php:91
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:635
+#: includes/export/class-wc-product-csv-exporter.php:109
msgid "Date sale price starts"
msgstr ""
#: includes/admin/importers/class-wc-product-csv-importer-controller.php:472
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:635
-#: includes/export/class-wc-product-csv-exporter.php:92
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:636
+#: includes/export/class-wc-product-csv-exporter.php:110
msgid "Date sale price ends"
msgstr ""
#: includes/admin/importers/class-wc-product-csv-importer-controller.php:473
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:638
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:639
#: includes/admin/meta-boxes/views/html-product-data-general.php:151
#: includes/admin/views/html-bulk-edit-product.php:70
#: includes/admin/views/html-quick-edit-product.php:49
-#: includes/export/class-wc-product-csv-exporter.php:93
+#: includes/export/class-wc-product-csv-exporter.php:111
#: includes/shipping/flat-rate/includes/settings-flat-rate.php:21
#: includes/shipping/legacy-flat-rate/includes/settings-flat-rate.php:53
#: includes/shipping/local-pickup/class-wc-shipping-local-pickup.php:87
@@ -9624,42 +9746,48 @@ msgid "Tax status"
msgstr ""
#: includes/admin/importers/class-wc-product-csv-importer-controller.php:474
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:639
-#: includes/admin/meta-boxes/views/html-order-items.php:355
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:640
+#: includes/admin/meta-boxes/views/html-order-items.php:362
#: includes/admin/meta-boxes/views/html-product-data-general.php:166
#: includes/admin/meta-boxes/views/html-variation-admin.php:313
#: includes/admin/settings/class-wc-settings-tax.php:202
#: includes/admin/views/html-bulk-edit-product.php:89
#: includes/admin/views/html-quick-edit-product.php:67
-#: includes/export/class-wc-product-csv-exporter.php:94
+#: includes/export/class-wc-product-csv-exporter.php:112
msgid "Tax class"
msgstr ""
#: includes/admin/importers/class-wc-product-csv-importer-controller.php:475
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:640
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:641
#: includes/admin/views/html-bulk-edit-product.php:218
#: includes/admin/views/html-quick-edit-product.php:173
-#: includes/export/class-wc-product-csv-exporter.php:95
+#: includes/export/class-wc-product-csv-exporter.php:113
msgid "In stock?"
msgstr ""
#: includes/admin/importers/class-wc-product-csv-importer-controller.php:477
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:642
-#: includes/export/class-wc-product-csv-exporter.php:97
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:643
+#: includes/export/class-wc-product-csv-exporter.php:116
msgid "Backorders allowed?"
msgstr ""
#: includes/admin/importers/class-wc-product-csv-importer-controller.php:478
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:643
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:644
+#: includes/export/class-wc-product-csv-exporter.php:115
+msgid "Low stock amount"
+msgstr ""
+
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:479
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:645
#: includes/admin/views/html-bulk-edit-product.php:291
-#: includes/export/class-wc-product-csv-exporter.php:98
+#: includes/export/class-wc-product-csv-exporter.php:117
msgid "Sold individually?"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:480
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:645
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:481
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:647
#: includes/admin/meta-boxes/views/html-variation-admin.php:230
-#: includes/export/class-wc-product-csv-exporter.php:100
+#: includes/export/class-wc-product-csv-exporter.php:119
#. translators: %s: Weight unit
#. translators: %s: weight unit
#. translators: %s: weight unit
@@ -9667,238 +9795,238 @@ msgstr ""
msgid "Weight (%s)"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:482
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:650
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:483
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:652
#: includes/admin/views/html-bulk-edit-product.php:158
-#: includes/export/class-wc-product-csv-exporter.php:102
+#: includes/export/class-wc-product-csv-exporter.php:121
#. translators: %s: Length unit
#. translators: %s: dimension unit
#. translators: %s: length
msgid "Length (%s)"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:484
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:652
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:485
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:654
#: includes/admin/views/html-bulk-edit-product.php:159
-#: includes/export/class-wc-product-csv-exporter.php:104
+#: includes/export/class-wc-product-csv-exporter.php:123
#. translators: %s: Width unit
#. translators: %s: dimension unit
#. translators: %s: width
msgid "Width (%s)"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:486
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:654
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:487
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:656
#: includes/admin/views/html-bulk-edit-product.php:160
-#: includes/export/class-wc-product-csv-exporter.php:106
+#: includes/export/class-wc-product-csv-exporter.php:125
#. translators: %s: Height unit
#. translators: %s: dimension unit
#. translators: %s: Height
msgid "Height (%s)"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:487
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:691
-#: includes/export/class-wc-product-csv-exporter.php:107
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:488
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:693
+#: includes/export/class-wc-product-csv-exporter.php:126
msgid "Allow customer reviews?"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:488
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:692
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:489
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:694
#: includes/admin/meta-boxes/views/html-product-data-advanced.php:14
-#: includes/export/class-wc-product-csv-exporter.php:108
+#: includes/export/class-wc-product-csv-exporter.php:127
msgid "Purchase note"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:489
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:633
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:490
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:634
#: includes/admin/meta-boxes/views/html-product-data-general.php:48
#: includes/admin/views/html-quick-edit-product.php:41
-#: includes/export/class-wc-product-csv-exporter.php:109
+#: includes/export/class-wc-product-csv-exporter.php:128
msgid "Sale price"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:490
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:632
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:491
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:633
#: includes/admin/meta-boxes/views/html-product-data-general.php:38
#: includes/admin/views/html-quick-edit-product.php:34
-#: includes/export/class-wc-product-csv-exporter.php:110
+#: includes/export/class-wc-product-csv-exporter.php:129
msgid "Regular price"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:491
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:657
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:118
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:492
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:659
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:119
#: includes/admin/reports/class-wc-report-sales-by-category.php:201
#: includes/class-wc-post-types.php:86
-#: includes/export/class-wc-product-csv-exporter.php:111
+#: includes/export/class-wc-product-csv-exporter.php:130
msgid "Categories"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:492
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:658
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:119
-#: includes/export/class-wc-product-csv-exporter.php:112
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:493
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:660
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:120
+#: includes/export/class-wc-product-csv-exporter.php:131
msgid "Tags"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:493
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:659
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:494
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:661
#: includes/admin/meta-boxes/views/html-product-data-shipping.php:56
#: includes/admin/meta-boxes/views/html-variation-admin.php:291
#: includes/admin/settings/class-wc-settings-shipping.php:359
#: includes/admin/views/html-bulk-edit-product.php:166
#: includes/admin/views/html-quick-edit-product.php:123
#: includes/class-wc-post-types.php:168
-#: includes/export/class-wc-product-csv-exporter.php:113
+#: includes/export/class-wc-product-csv-exporter.php:132
msgid "Shipping class"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:494
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:660
-#: includes/export/class-wc-product-csv-exporter.php:114
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:495
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:662
+#: includes/export/class-wc-product-csv-exporter.php:133
msgid "Images"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:495
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:677
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:496
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:679
#: includes/admin/meta-boxes/views/html-product-data-general.php:114
#: includes/admin/meta-boxes/views/html-product-data-variations.php:86
#: includes/admin/meta-boxes/views/html-variation-admin.php:397
-#: includes/export/class-wc-product-csv-exporter.php:115
+#: includes/export/class-wc-product-csv-exporter.php:134
msgid "Download limit"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:496
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:678
-#: includes/export/class-wc-product-csv-exporter.php:116
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:497
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:680
+#: includes/export/class-wc-product-csv-exporter.php:135
msgid "Download expiry days"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:497
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:661
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:498
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:663
#: includes/admin/reports/class-wc-report-stock.php:174
-#: includes/export/class-wc-product-csv-exporter.php:117
+#: includes/export/class-wc-product-csv-exporter.php:136
msgid "Parent"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:498
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:662
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:499
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:664
#: includes/admin/meta-boxes/views/html-product-data-linked-products.php:32
-#: includes/export/class-wc-product-csv-exporter.php:119
+#: includes/export/class-wc-product-csv-exporter.php:138
msgid "Upsells"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:499
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:663
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:500
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:665
#: includes/admin/meta-boxes/views/html-product-data-linked-products.php:48
-#: includes/export/class-wc-product-csv-exporter.php:120
+#: includes/export/class-wc-product-csv-exporter.php:139
msgid "Cross-sells"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:500
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:664
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:501
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:666
#: includes/admin/meta-boxes/views/html-product-data-linked-products.php:14
-#: includes/export/class-wc-product-csv-exporter.php:118
+#: includes/export/class-wc-product-csv-exporter.php:137
msgid "Grouped products"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:501
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:668
-#: includes/export/class-wc-product-csv-exporter.php:121
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:502
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:670
+#: includes/export/class-wc-product-csv-exporter.php:140
msgid "External URL"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:502
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:669
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:503
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:671
#: includes/admin/meta-boxes/views/html-product-data-general.php:24
-#: includes/export/class-wc-product-csv-exporter.php:122
+#: includes/export/class-wc-product-csv-exporter.php:141
msgid "Button text"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:503
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:694
-#: includes/export/class-wc-product-csv-exporter.php:123
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:504
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:696
+#: includes/export/class-wc-product-csv-exporter.php:142
msgid "Position"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:514
-#: includes/export/class-wc-product-csv-exporter.php:510
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:515
+#: includes/export/class-wc-product-csv-exporter.php:579
#. translators: %d: Attribute number
#. translators: %s: attribute number
msgid "Attribute %d name"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:516
-#: includes/export/class-wc-product-csv-exporter.php:512
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:517
+#: includes/export/class-wc-product-csv-exporter.php:581
#. translators: %d: Attribute number
#. translators: %s: attribute number
msgid "Attribute %d value(s)"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:518
-#: includes/export/class-wc-product-csv-exporter.php:514
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:519
+#: includes/export/class-wc-product-csv-exporter.php:583
#. translators: %d: Attribute number
#. translators: %s: attribute number
msgid "Attribute %d visible"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:520
-#: includes/export/class-wc-product-csv-exporter.php:516
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:521
+#: includes/export/class-wc-product-csv-exporter.php:585
#. translators: %d: Attribute number
#. translators: %s: attribute number
msgid "Attribute %d global"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:522
-#: includes/export/class-wc-product-csv-exporter.php:554
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:523
+#: includes/export/class-wc-product-csv-exporter.php:623
#. translators: %d: Attribute number
#. translators: %s: attribute number
msgid "Attribute %d default"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:524
-#: includes/export/class-wc-product-csv-exporter.php:483
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:525
+#: includes/export/class-wc-product-csv-exporter.php:552
#. translators: %d: Download number
#. translators: %s: download number
msgid "Download %d name"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:526
-#: includes/export/class-wc-product-csv-exporter.php:485
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:527
+#: includes/export/class-wc-product-csv-exporter.php:554
#. translators: %d: Download number
#. translators: %s: download number
msgid "Download %d URL"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:528
-#: includes/export/class-wc-product-csv-exporter.php:599
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:529
+#: includes/export/class-wc-product-csv-exporter.php:668
#. translators: %d: Meta number
#. translators: %s: meta data name
msgid "Meta: %s"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:630
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:631
#: includes/admin/importers/mappings/generic.php:23
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:117
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:118
#: includes/admin/views/html-bulk-edit-product.php:21
#: includes/admin/views/html-quick-edit-product.php:32
-#: includes/widgets/class-wc-widget-products.php:54 templates/cart/cart.php:33
-#: templates/cart/cart.php:96 templates/emails/email-order-details.php:46
+#: includes/widgets/class-wc-widget-products.php:54 templates/cart/cart.php:31
+#: templates/cart/cart.php:94 templates/emails/email-order-details.php:46
msgid "Price"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:647
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:649
#: templates/single-product/product-attributes.php:35
msgid "Dimensions"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:666
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:668
msgid "External product"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:673
-#: includes/admin/settings/class-wc-settings-advanced.php:240
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:675
+#: includes/admin/settings/class-wc-settings-advanced.php:238
#: includes/admin/views/html-admin-page-product-export.php:40
#: includes/class-wc-query.php:118 includes/wc-account-functions.php:100
#: templates/emails/email-downloads.php:22
@@ -9907,35 +10035,35 @@ msgstr ""
msgid "Downloads"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:675
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:677
msgid "Download name"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:676
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:678
msgid "Download URL"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:684
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:686
msgid "Attribute name"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:685
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:687
msgid "Attribute value(s)"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:686
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:688
msgid "Is a global attribute?"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:687
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:689
msgid "Attribute visibility"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:688
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:690
msgid "Default attribute"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:693
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:695
msgid "Import as meta"
msgstr ""
@@ -10042,8 +10170,9 @@ msgid "Parent SKU"
msgstr ""
#: includes/admin/importers/mappings/generic.php:25
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:438
-#: templates/cart/cart.php:34 templates/cart/cart.php:102
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:444
+#: includes/admin/meta-boxes/views/html-order-items.php:318
+#: templates/cart/cart.php:32 templates/cart/cart.php:100
#: templates/emails/email-order-details.php:45
#: templates/global/quantity-input.php:31
msgid "Quantity"
@@ -10092,15 +10221,16 @@ msgid "Import complete!"
msgstr ""
#: includes/admin/importers/views/html-csv-import-done.php:61
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:437
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:443
+#: includes/admin/meta-boxes/views/html-order-items.php:317
#: includes/admin/reports/class-wc-report-downloads.php:84
#: includes/admin/reports/class-wc-report-downloads.php:215
#: includes/admin/reports/class-wc-report-stock.php:173
-#: includes/class-wc-emails.php:410 includes/class-wc-post-types.php:303
-#: includes/class-wc-privacy-exporters.php:341
-#: includes/data-stores/class-wc-product-data-store-cpt.php:105
-#: includes/wc-account-functions.php:211 templates/cart/cart.php:32
-#: templates/cart/cart.php:76 templates/checkout/form-pay.php:27
+#: includes/class-wc-emails.php:408 includes/class-wc-post-types.php:303
+#: includes/class-wc-privacy-exporters.php:338
+#: includes/data-stores/class-wc-product-data-store-cpt.php:106
+#: includes/wc-account-functions.php:211 templates/cart/cart.php:30
+#: templates/cart/cart.php:74 templates/checkout/form-pay.php:27
#: templates/checkout/review-order.php:26
#: templates/emails/email-order-details.php:44
#: templates/order/order-details.php:45
@@ -10160,7 +10290,7 @@ msgid "Your products are now being imported..."
msgstr ""
#: includes/admin/importers/views/html-product-csv-import-form.php:14
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:51
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:52
msgid "Import products from a CSV file"
msgstr ""
@@ -10262,9 +10392,9 @@ msgid "Learn more about orders"
msgstr ""
#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:115
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:121
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:122
#: includes/admin/reports/class-wc-report-coupon-usage.php:367
-#: includes/admin/reports/class-wc-report-customers.php:235
+#: includes/admin/reports/class-wc-report-customers.php:245
#: includes/admin/reports/class-wc-report-sales-by-category.php:274
#: includes/admin/reports/class-wc-report-sales-by-date.php:604
#: includes/admin/reports/class-wc-report-sales-by-product.php:406
@@ -10324,115 +10454,114 @@ msgid_plural "%d notes"
msgstr[0] ""
msgstr[1] ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:235
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:240
msgid "M j, Y"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:270
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:543
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:275
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:549
msgid "Processing"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:278
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:283
+#: includes/libraries/action-scheduler/classes/ActionScheduler_Store.php:181
msgid "Complete"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:341
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:346
#: includes/class-wc-query.php:115
#: includes/gateways/simplify-commerce/class-wc-gateway-simplify-commerce.php:628
-#: templates/emails/email-order-details.php:36
#. translators: %s: order ID
#. translators: %s: order number
-#. translators: %s: Order ID.
msgid "Order #%s"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:343
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:348
#: includes/admin/settings/views/html-admin-page-shipping-zone-methods.php:149
#: includes/admin/settings/views/html-admin-page-shipping-zone-methods.php:176
#: includes/admin/settings/views/html-admin-page-shipping-zones.php:97
msgid "Close modal panel"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:351
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:356
#: templates/checkout/form-billing.php:33
msgid "Billing details"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:355
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:360
#: includes/admin/reports/class-wc-report-customer-list.php:213
-#: includes/admin/settings/class-wc-settings-emails.php:263
+#: includes/admin/settings/class-wc-settings-emails.php:265
#: templates/single-product-reviews.php:79
msgid "Email"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:365
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:370
msgid "Payment via"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:371
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:376
#: includes/gateways/paypal/includes/settings-paypal.php:91
msgid "Shipping details"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:379
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:384
#: includes/admin/meta-boxes/views/html-order-shipping.php:23
msgid "Shipping method"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:387
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:392
msgid "Note"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:401
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:406
msgid "Edit this order"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:439
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:445
#: includes/admin/meta-boxes/views/html-order-items.php:38
#: includes/admin/meta-boxes/views/html-order-items.php:39
#: includes/admin/reports/class-wc-report-taxes-by-code.php:155
#: includes/admin/settings/class-wc-settings-tax.php:29
-#: includes/class-wc-countries.php:404 includes/class-wc-order-item-tax.php:159
+#: includes/class-wc-countries.php:405 includes/class-wc-order-item-tax.php:159
#: includes/class-wc-tax.php:762
msgid "Tax"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:534
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:540
msgid "On-hold"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:535
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:541
msgid "Change order status to on-hold"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:544
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:550
msgid "Change order status to processing"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:552
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:558
msgid "Completed"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:553
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:559
msgid "Change order status to completed"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:560
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:566
msgid "Change status: "
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:606
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:607
-#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:387
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:612
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:613
+#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:391
#: includes/admin/meta-boxes/views/html-order-shipping.php:24
#: includes/admin/settings/class-wc-settings-accounts.php:169
#: includes/admin/settings/class-wc-settings-accounts.php:181
#: includes/admin/settings/class-wc-settings-accounts.php:190
#: includes/admin/settings/class-wc-settings-accounts.php:199
#: includes/admin/settings/class-wc-settings-accounts.php:208
-#: includes/admin/settings/class-wc-settings-emails.php:121
-#: includes/admin/settings/class-wc-settings-emails.php:132
+#: includes/admin/settings/class-wc-settings-emails.php:122
+#: includes/admin/settings/class-wc-settings-emails.php:134
#: includes/admin/settings/views/settings-tax.php:103
#: includes/shipping/flat-rate/includes/settings-flat-rate.php:59
#: includes/shipping/flat-rate/includes/settings-flat-rate.php:70
@@ -10441,59 +10570,59 @@ msgstr ""
#: includes/shipping/legacy-flat-rate/includes/settings-flat-rate.php:99
#: includes/shipping/legacy-free-shipping/class-wc-shipping-legacy-free-shipping.php:136
#: includes/wc-account-functions.php:346
-#: includes/wc-formatting-functions.php:1204
-#: includes/wc-formatting-functions.php:1223
+#: includes/wc-formatting-functions.php:1207
+#: includes/wc-formatting-functions.php:1226
#: templates/emails/email-addresses.php:31
-#: templates/order/order-details-customer.php:36
-#: templates/order/order-details-customer.php:54
+#: templates/order/order-details-customer.php:35
+#: templates/order/order-details-customer.php:53
#: templates/single-product/meta.php:31
msgid "N/A"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:649
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:658
msgid "Order status changed by bulk edit:"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:689
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:698
#. translators: %d: orders count
msgid "%d order status changed."
msgid_plural "%d order statuses changed."
msgstr[0] ""
msgstr[1] ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:697
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:706
#. translators: %d: orders count
msgid "Removed personal data from %d order."
msgid_plural "Removed personal data from %d orders."
msgstr[0] ""
msgstr[1] ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:726
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:735
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:296
#: includes/admin/settings/views/html-keys-edit.php:39
-#: includes/class-wc-ajax.php:1517
+#: includes/class-wc-ajax.php:1473
#. translators: 1: user display name 2: user ID 3: user email
msgid "%1$s (#%2$s – %3$s)"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:733
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:742
msgid "Filter by registered customer"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:49
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:50
msgid "Ready to start selling something awesome?"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:50
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:51
msgid "Create your first product!"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:247
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:249
msgid "Toggle featured"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:249
-#: includes/admin/settings/class-wc-settings-emails.php:300
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:251
+#: includes/admin/settings/class-wc-settings-emails.php:302
#: includes/admin/settings/class-wc-settings-payment-gateways.php:186
#: includes/admin/settings/class-wc-settings-shipping.php:261
#: includes/admin/views/html-bulk-edit-product.php:206
@@ -10502,7 +10631,7 @@ msgstr ""
msgid "Yes"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:251
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:253
#: includes/admin/settings/class-wc-settings-payment-gateways.php:189
#: includes/admin/settings/class-wc-settings-shipping.php:262
#: includes/admin/views/html-bulk-edit-product.php:207
@@ -10511,65 +10640,45 @@ msgstr ""
msgid "No"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:261
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:263
#: includes/admin/reports/class-wc-report-stock.php:114
-#: includes/wc-product-functions.php:827
+#: includes/wc-product-functions.php:849
msgid "On backorder"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:263
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:265
#: includes/admin/reports/class-wc-report-stock.php:116
-#: includes/wc-formatting-functions.php:1130
-#: includes/wc-product-functions.php:825
+#: includes/wc-formatting-functions.php:1133
+#: includes/wc-product-functions.php:847
msgid "In stock"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:295
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:303
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:318
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:326
msgid "Filter by category"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:313
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:342
msgid "Filter by product type"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:322
-#: includes/wc-product-functions.php:520
-msgid "Grouped product"
-msgstr ""
-
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:325
-#: includes/wc-product-functions.php:521
-msgid "External/Affiliate product"
-msgstr ""
-
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:328
-#: includes/wc-product-functions.php:522
-msgid "Variable product"
-msgstr ""
-
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:331
-#: includes/wc-product-functions.php:519
-msgid "Simple product"
-msgstr ""
-
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:345
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:353
#: includes/admin/meta-boxes/class-wc-meta-box-product-data.php:70
#: includes/admin/meta-boxes/views/html-variation-admin.php:81
msgid "Downloadable"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:349
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:357
#: includes/admin/meta-boxes/class-wc-meta-box-product-data.php:63
#: includes/admin/meta-boxes/views/html-variation-admin.php:85
msgid "Virtual"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:357
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:373
msgid "Filter by stock status"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-products.php:465
+#: includes/admin/list-tables/class-wc-admin-list-table-products.php:480
msgid "Sorting"
msgstr ""
@@ -10577,7 +10686,7 @@ msgstr ""
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:230
#: includes/admin/meta-boxes/class-wc-meta-box-product-data.php:87
#: includes/admin/settings/class-wc-settings-general.php:24
-#: includes/admin/settings/class-wc-settings-products.php:41
+#: includes/admin/settings/class-wc-settings-products.php:39
msgid "General"
msgstr ""
@@ -10664,7 +10773,7 @@ msgstr ""
#: includes/admin/meta-boxes/class-wc-meta-box-coupon-data.php:188
#: includes/admin/meta-boxes/class-wc-meta-box-coupon-data.php:206
-#: includes/admin/meta-boxes/views/html-order-items.php:324
+#: includes/admin/meta-boxes/views/html-order-items.php:323
#: includes/admin/meta-boxes/views/html-product-data-linked-products.php:15
#: includes/admin/meta-boxes/views/html-product-data-linked-products.php:33
#: includes/admin/meta-boxes/views/html-product-data-linked-products.php:49
@@ -10832,6 +10941,11 @@ msgstr ""
msgid "h"
msgstr ""
+#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:237
+#: includes/admin/settings/class-wc-settings-products.php:397
+msgid "m"
+msgstr ""
+
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:244
msgid "Status:"
msgstr ""
@@ -10862,7 +10976,7 @@ msgid "Load billing address"
msgstr ""
#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:325
-#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:438
+#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:442
msgid "Address:"
msgstr ""
@@ -10870,50 +10984,50 @@ msgstr ""
msgid "No billing address set."
msgstr ""
-#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:385
-#: includes/class-wc-order.php:1954 templates/checkout/order-receipt.php:39
+#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:389
+#: includes/class-wc-order.php:1948 templates/checkout/order-receipt.php:39
#: templates/checkout/thankyou.php:69
msgid "Payment method:"
msgstr ""
-#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:401
-#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:403
+#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:405
+#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:407
#: includes/admin/meta-boxes/views/html-order-shipping.php:39
#: includes/admin/meta-boxes/views/html-order-shipping.php:41
msgid "Other"
msgstr ""
-#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:413
-#: includes/class-wc-privacy-exporters.php:295
+#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:417
+#: includes/class-wc-privacy-exporters.php:292
msgid "Transaction ID"
msgstr ""
-#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:427
+#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:431
msgid "Load shipping address"
msgstr ""
-#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:428
+#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:432
msgid "Copy billing address"
msgstr ""
-#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:438
+#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:442
msgid "No shipping address set."
msgstr ""
-#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:462
+#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:466
msgid "Customer provided note:"
msgstr ""
-#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:501
+#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:505
msgid "Customer provided note"
msgstr ""
-#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:502
+#: includes/admin/meta-boxes/class-wc-meta-box-order-data.php:506
msgid "Customer notes about the order"
msgstr ""
#: includes/admin/meta-boxes/class-wc-meta-box-order-downloads.php:57
-#: includes/class-wc-ajax.php:776
+#: includes/class-wc-ajax.php:805
msgid "File %d"
msgstr ""
@@ -10926,13 +11040,13 @@ msgid "Grant access"
msgstr ""
#: includes/admin/meta-boxes/class-wc-meta-box-order-notes.php:50
-#: includes/class-wc-ajax.php:1347
+#: includes/class-wc-ajax.php:1294
msgid "added on %1$s at %2$s"
msgstr ""
#: includes/admin/meta-boxes/class-wc-meta-box-order-notes.php:54
#: includes/admin/views/html-admin-page-status-report.php:590
-#: includes/class-wc-ajax.php:1352 templates/content-widget-reviews.php:31
+#: includes/class-wc-ajax.php:1299 templates/content-widget-reviews.php:31
#. translators: %s: note author
#. translators: %s: plugin author
#. translators: %s: note author
@@ -10940,7 +11054,7 @@ msgid "by %s"
msgstr ""
#: includes/admin/meta-boxes/class-wc-meta-box-order-notes.php:57
-#: includes/class-wc-ajax.php:1355
+#: includes/class-wc-ajax.php:1302
msgid "Delete note"
msgstr ""
@@ -10971,9 +11085,10 @@ msgid "Note to customer"
msgstr ""
#: includes/admin/meta-boxes/class-wc-meta-box-order-notes.php:79
-#: includes/admin/meta-boxes/views/html-order-items.php:329
-#: includes/admin/meta-boxes/views/html-order-items.php:386
+#: includes/admin/meta-boxes/views/html-order-items.php:336
+#: includes/admin/meta-boxes/views/html-order-items.php:393
#: includes/admin/meta-boxes/views/html-product-data-attributes.php:28
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore_PostTypeRegistrar.php:33
msgid "Add"
msgstr ""
@@ -10987,8 +11102,8 @@ msgstr ""
#: includes/admin/meta-boxes/class-wc-meta-box-product-data.php:93
#: includes/admin/meta-boxes/views/html-product-data-variations.php:72
-#: includes/admin/settings/class-wc-settings-products.php:42
-#: includes/admin/settings/class-wc-settings-products.php:130
+#: includes/admin/settings/class-wc-settings-products.php:40
+#: includes/admin/settings/class-wc-settings-products.php:128
msgid "Inventory"
msgstr ""
@@ -11007,7 +11122,7 @@ msgid "Advanced"
msgstr ""
#: includes/admin/meta-boxes/class-wc-meta-box-product-data.php:336
-#: includes/admin/meta-boxes/class-wc-meta-box-product-data.php:431
+#: includes/admin/meta-boxes/class-wc-meta-box-product-data.php:432
#. translators: 1: product ID 2: quantity in stock
msgid ""
"The stock has not been updated because the value has changed since editing. "
@@ -11042,7 +11157,7 @@ msgstr[0] ""
msgstr[1] ""
#: includes/admin/meta-boxes/views/html-order-download-permission.php:27
-#: includes/class-wc-privacy-exporters.php:349
+#: includes/class-wc-privacy-exporters.php:346
#: includes/wc-account-functions.php:212
msgid "Downloads remaining"
msgstr ""
@@ -11054,7 +11169,7 @@ msgid "Unlimited"
msgstr ""
#: includes/admin/meta-boxes/views/html-order-download-permission.php:32
-#: includes/class-wc-privacy-exporters.php:361
+#: includes/class-wc-privacy-exporters.php:358
msgid "Access expires"
msgstr ""
@@ -11105,7 +11220,7 @@ msgstr ""
msgid "Fee name"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-item-meta.php:59
+#: includes/admin/meta-boxes/views/html-order-item-meta.php:60
msgid "Add meta"
msgstr ""
@@ -11141,7 +11256,7 @@ msgid "Delete item"
msgstr ""
#: includes/admin/meta-boxes/views/html-order-items.php:29
-#: includes/class-wc-form-handler.php:558
+#: includes/class-wc-form-handler.php:553
#: includes/gateways/paypal/includes/class-wc-gateway-paypal-request.php:471
msgid "Item"
msgstr ""
@@ -11151,141 +11266,129 @@ msgstr ""
msgid "Qty"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:98
-msgid "Delete selected row(s)"
-msgstr ""
-
-#: includes/admin/meta-boxes/views/html-order-items.php:102
-msgid "Reduce stock"
-msgstr ""
-
-#: includes/admin/meta-boxes/views/html-order-items.php:103
-msgid "Increase stock"
-msgstr ""
-
-#: includes/admin/meta-boxes/views/html-order-items.php:115
+#: includes/admin/meta-boxes/views/html-order-items.php:105
msgid "Coupon(s)"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:213
+#: includes/admin/meta-boxes/views/html-order-items.php:203
msgid "Refunded"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:227
+#: includes/admin/meta-boxes/views/html-order-items.php:217
msgid "Add item(s)"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:229
-#: templates/cart/cart.php:138 templates/checkout/form-coupon.php:38
+#: includes/admin/meta-boxes/views/html-order-items.php:219
+#: templates/cart/cart.php:136 templates/checkout/form-coupon.php:38
msgid "Apply coupon"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:232
+#: includes/admin/meta-boxes/views/html-order-items.php:222
msgid "To edit this order change the status back to \"Pending\""
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:232
+#: includes/admin/meta-boxes/views/html-order-items.php:222
msgid "This order is no longer editable."
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:235
-#: includes/class-wc-order.php:1971
+#: includes/admin/meta-boxes/views/html-order-items.php:225
+#: includes/class-wc-order.php:1965
msgid "Refund"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:242
+#: includes/admin/meta-boxes/views/html-order-items.php:232
msgid "Recalculate"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:247
+#: includes/admin/meta-boxes/views/html-order-items.php:237
msgid "Add product(s)"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:248
+#: includes/admin/meta-boxes/views/html-order-items.php:238
msgid "Add fee"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:249
+#: includes/admin/meta-boxes/views/html-order-items.php:239
msgid "Add shipping"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:251
-#: includes/admin/meta-boxes/views/html-order-items.php:343
+#: includes/admin/meta-boxes/views/html-order-items.php:241
+#: includes/admin/meta-boxes/views/html-order-items.php:350
msgid "Add tax"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:258
+#: includes/admin/meta-boxes/views/html-order-items.php:248
#: templates/myaccount/form-reset-password.php:44
msgid "Save"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:265
+#: includes/admin/meta-boxes/views/html-order-items.php:255
msgid "Restock refunded items"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:270
+#: includes/admin/meta-boxes/views/html-order-items.php:260
msgid "Amount already refunded"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:274
+#: includes/admin/meta-boxes/views/html-order-items.php:264
msgid "Total available to refund"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:278
+#: includes/admin/meta-boxes/views/html-order-items.php:268
#: includes/admin/reports/class-wc-report-sales-by-date.php:766
msgid "Refund amount"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:285
+#: includes/admin/meta-boxes/views/html-order-items.php:275
msgid "Note: the refund reason will be visible by the customer."
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:285
+#: includes/admin/meta-boxes/views/html-order-items.php:275
msgid "Reason for refund (optional):"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:296
+#: includes/admin/meta-boxes/views/html-order-items.php:286
msgid "Payment gateway"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:300
+#: includes/admin/meta-boxes/views/html-order-items.php:290
#. translators: refund amount, gateway name
msgid "Refund %1$s via %2$s"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:304
+#: includes/admin/meta-boxes/views/html-order-items.php:294
#. translators: refund amount
msgid ""
"You will need to manually issue a refund through your payment gateway after "
"using this."
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:304
+#: includes/admin/meta-boxes/views/html-order-items.php:294
msgid "Refund %s manually"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:317
+#: includes/admin/meta-boxes/views/html-order-items.php:307
msgid "Add products"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:354
+#: includes/admin/meta-boxes/views/html-order-items.php:361
msgid "Rate name"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:356
+#: includes/admin/meta-boxes/views/html-order-items.php:363
msgid "Rate code"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:357
+#: includes/admin/meta-boxes/views/html-order-items.php:364
#: includes/admin/settings/class-wc-settings-tax.php:197
msgid "Rate %"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:378
+#: includes/admin/meta-boxes/views/html-order-items.php:385
msgid "Or, enter tax rate ID:"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-items.php:379
+#: includes/admin/meta-boxes/views/html-order-items.php:386
#: includes/customizer/class-wc-shop-customizer.php:701
#: includes/gateways/paypal/includes/settings-paypal.php:122
#: includes/gateways/paypal/includes/settings-paypal.php:130
@@ -11298,12 +11401,12 @@ msgstr ""
msgid "Optional"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-refund.php:19
+#: includes/admin/meta-boxes/views/html-order-refund.php:23
#. translators: 1: refund id 2: refund date 3: username
msgid "Refund #%1$s - %2$s by %3$s"
msgstr ""
-#: includes/admin/meta-boxes/views/html-order-refund.php:32
+#: includes/admin/meta-boxes/views/html-order-refund.php:36
#. translators: 1: refund id 2: refund date
msgid "Refund #%1$s - %2$s"
msgstr ""
@@ -11450,47 +11553,47 @@ msgid ""
"different tax rates specific to certain types of product."
msgstr ""
-#: includes/admin/meta-boxes/views/html-product-data-inventory.php:15
+#: includes/admin/meta-boxes/views/html-product-data-inventory.php:21
#: includes/admin/meta-boxes/views/html-variation-admin.php:67
msgid "Stock Keeping Unit"
msgstr ""
-#: includes/admin/meta-boxes/views/html-product-data-inventory.php:17
+#: includes/admin/meta-boxes/views/html-product-data-inventory.php:23
#: includes/admin/meta-boxes/views/html-variation-admin.php:69
msgid ""
"SKU refers to a Stock-keeping unit, a unique identifier for each distinct "
"product and service that can be purchased."
msgstr ""
-#: includes/admin/meta-boxes/views/html-product-data-inventory.php:31
+#: includes/admin/meta-boxes/views/html-product-data-inventory.php:37
#: includes/admin/meta-boxes/views/html-variation-admin.php:91
#: includes/admin/views/html-bulk-edit-product.php:234
#: includes/admin/views/html-quick-edit-product.php:167
msgid "Manage stock?"
msgstr ""
-#: includes/admin/meta-boxes/views/html-product-data-inventory.php:32
+#: includes/admin/meta-boxes/views/html-product-data-inventory.php:38
msgid "Enable stock management at product level"
msgstr ""
-#: includes/admin/meta-boxes/views/html-product-data-inventory.php:44
+#: includes/admin/meta-boxes/views/html-product-data-inventory.php:50
#: includes/admin/meta-boxes/views/html-variation-admin.php:171
msgid "Stock quantity"
msgstr ""
-#: includes/admin/meta-boxes/views/html-product-data-inventory.php:46
+#: includes/admin/meta-boxes/views/html-product-data-inventory.php:52
msgid ""
"Stock quantity. If this is a variable product this value will be used to "
"control stock for all variations, unless you define stock at variation "
"level."
msgstr ""
-#: includes/admin/meta-boxes/views/html-product-data-inventory.php:61
+#: includes/admin/meta-boxes/views/html-product-data-inventory.php:67
#: includes/admin/meta-boxes/views/html-variation-admin.php:190
msgid "Allow backorders?"
msgstr ""
-#: includes/admin/meta-boxes/views/html-product-data-inventory.php:64
+#: includes/admin/meta-boxes/views/html-product-data-inventory.php:70
#: includes/admin/meta-boxes/views/html-variation-admin.php:193
msgid ""
"If managing stock, this controls whether or not backorders are allowed. If "
@@ -11498,25 +11601,34 @@ msgid ""
msgstr ""
#: includes/admin/meta-boxes/views/html-product-data-inventory.php:78
+#: includes/admin/settings/class-wc-settings-products.php:191
+msgid "Low stock threshold"
+msgstr ""
+
+#: includes/admin/meta-boxes/views/html-product-data-inventory.php:80
+msgid "When product stock reaches this amount you will be notified by email"
+msgstr ""
+
+#: includes/admin/meta-boxes/views/html-product-data-inventory.php:98
#: includes/admin/meta-boxes/views/html-variation-admin.php:219
#: includes/admin/reports/class-wc-report-stock.php:176
msgid "Stock status"
msgstr ""
-#: includes/admin/meta-boxes/views/html-product-data-inventory.php:81
+#: includes/admin/meta-boxes/views/html-product-data-inventory.php:101
#: includes/admin/meta-boxes/views/html-variation-admin.php:222
-#: includes/api/class-wc-rest-products-controller.php:1662
-#: includes/api/v1/class-wc-rest-products-controller.php:1952
+#: includes/api/v1/class-wc-rest-products-controller.php:1957
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1674
msgid ""
"Controls whether or not the product is listed as \"in stock\" or \"out of "
"stock\" on the frontend."
msgstr ""
-#: includes/admin/meta-boxes/views/html-product-data-inventory.php:96
+#: includes/admin/meta-boxes/views/html-product-data-inventory.php:116
msgid "Sold individually"
msgstr ""
-#: includes/admin/meta-boxes/views/html-product-data-inventory.php:97
+#: includes/admin/meta-boxes/views/html-product-data-inventory.php:117
msgid "Enable this to only allow one of this item to be bought in a single order"
msgstr ""
@@ -11537,7 +11649,7 @@ msgid ""
"current product."
msgstr ""
-#: includes/admin/meta-boxes/views/html-product-data-panel.php:11
+#: includes/admin/meta-boxes/views/html-product-data-panel.php:20
msgid "Product Type"
msgstr ""
@@ -11784,7 +11896,7 @@ msgid "Upload an image"
msgstr ""
#: includes/admin/meta-boxes/views/html-variation-admin.php:77
-#: includes/admin/settings/class-wc-settings-emails.php:300
+#: includes/admin/settings/class-wc-settings-emails.php:302
#: includes/admin/settings/class-wc-settings-payment-gateways.php:117
#: includes/admin/settings/views/html-admin-page-shipping-zone-methods.php:85
msgid "Enabled"
@@ -11832,8 +11944,9 @@ msgstr ""
#: includes/admin/meta-boxes/views/html-variation-admin.php:173
msgid ""
-"Enter a quantity to enable stock management at variation level, or leave "
-"blank to use the parent product's options."
+"Enter a number to set stock quantity at the variation level. Use a "
+"variation's 'Manage stock?' check box above to enable/disable stock "
+"management at the variation level."
msgstr ""
#: includes/admin/meta-boxes/views/html-variation-admin.php:261
@@ -11944,7 +12057,7 @@ msgid "%s coupons used in total"
msgstr ""
#: includes/admin/reports/class-wc-report-coupon-usage.php:135
-#: includes/admin/reports/class-wc-report-customers.php:170
+#: includes/admin/reports/class-wc-report-customers.php:180
#: includes/admin/reports/class-wc-report-sales-by-category.php:119
#: includes/admin/reports/class-wc-report-sales-by-date.php:563
#: includes/admin/reports/class-wc-report-sales-by-product.php:140
@@ -11954,7 +12067,7 @@ msgid "Year"
msgstr ""
#: includes/admin/reports/class-wc-report-coupon-usage.php:136
-#: includes/admin/reports/class-wc-report-customers.php:171
+#: includes/admin/reports/class-wc-report-customers.php:181
#: includes/admin/reports/class-wc-report-sales-by-category.php:120
#: includes/admin/reports/class-wc-report-sales-by-date.php:564
#: includes/admin/reports/class-wc-report-sales-by-product.php:141
@@ -11964,7 +12077,7 @@ msgid "Last month"
msgstr ""
#: includes/admin/reports/class-wc-report-coupon-usage.php:137
-#: includes/admin/reports/class-wc-report-customers.php:172
+#: includes/admin/reports/class-wc-report-customers.php:182
#: includes/admin/reports/class-wc-report-sales-by-category.php:121
#: includes/admin/reports/class-wc-report-sales-by-date.php:565
#: includes/admin/reports/class-wc-report-sales-by-product.php:142
@@ -11974,7 +12087,7 @@ msgid "This month"
msgstr ""
#: includes/admin/reports/class-wc-report-coupon-usage.php:138
-#: includes/admin/reports/class-wc-report-customers.php:173
+#: includes/admin/reports/class-wc-report-customers.php:183
#: includes/admin/reports/class-wc-report-sales-by-category.php:122
#: includes/admin/reports/class-wc-report-sales-by-date.php:566
#: includes/admin/reports/class-wc-report-sales-by-product.php:143
@@ -12018,7 +12131,7 @@ msgid "Most discount"
msgstr ""
#: includes/admin/reports/class-wc-report-coupon-usage.php:370
-#: includes/admin/reports/class-wc-report-customers.php:238
+#: includes/admin/reports/class-wc-report-customers.php:248
#: includes/admin/reports/class-wc-report-sales-by-category.php:277
#: includes/admin/reports/class-wc-report-sales-by-date.php:608
#: includes/admin/reports/class-wc-report-sales-by-product.php:409
@@ -12071,7 +12184,7 @@ msgid "Name (Last, First)"
msgstr ""
#: includes/admin/reports/class-wc-report-customer-list.php:212
-#: includes/class-wc-checkout.php:229 templates/myaccount/form-login.php:83
+#: includes/class-wc-checkout.php:229 templates/myaccount/form-login.php:79
msgid "Username"
msgstr ""
@@ -12092,41 +12205,41 @@ msgstr ""
msgid "%s signups in this period"
msgstr ""
-#: includes/admin/reports/class-wc-report-customers.php:116
+#: includes/admin/reports/class-wc-report-customers.php:126
msgid "Customer sales"
msgstr ""
-#: includes/admin/reports/class-wc-report-customers.php:117
+#: includes/admin/reports/class-wc-report-customers.php:127
msgid "Guest sales"
msgstr ""
-#: includes/admin/reports/class-wc-report-customers.php:126
-#: includes/admin/reports/class-wc-report-customers.php:327
+#: includes/admin/reports/class-wc-report-customers.php:136
+#: includes/admin/reports/class-wc-report-customers.php:339
msgid "Customer orders"
msgstr ""
-#: includes/admin/reports/class-wc-report-customers.php:131
-#: includes/admin/reports/class-wc-report-customers.php:337
+#: includes/admin/reports/class-wc-report-customers.php:141
+#: includes/admin/reports/class-wc-report-customers.php:349
msgid "Guest orders"
msgstr ""
-#: includes/admin/reports/class-wc-report-customers.php:150
+#: includes/admin/reports/class-wc-report-customers.php:160
msgid "orders"
msgstr ""
-#: includes/admin/reports/class-wc-report-customers.php:333
+#: includes/admin/reports/class-wc-report-customers.php:345
msgid "customer orders"
msgstr ""
-#: includes/admin/reports/class-wc-report-customers.php:343
+#: includes/admin/reports/class-wc-report-customers.php:355
msgid "guest orders"
msgstr ""
-#: includes/admin/reports/class-wc-report-customers.php:347
+#: includes/admin/reports/class-wc-report-customers.php:359
msgid "Signups"
msgstr ""
-#: includes/admin/reports/class-wc-report-customers.php:354
+#: includes/admin/reports/class-wc-report-customers.php:366
msgid "new users"
msgstr ""
@@ -12320,7 +12433,7 @@ msgid "Showing reports for:"
msgstr ""
#: includes/admin/reports/class-wc-report-sales-by-product.php:206
-#: includes/api/class-wc-rest-system-status-tools-controller.php:186
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:186
msgid "Reset"
msgstr ""
@@ -12456,7 +12569,7 @@ msgstr ""
#: includes/admin/settings/class-wc-settings-accounts.php:51
#: includes/class-wc-download-handler.php:164 templates/auth/form-login.php:49
-#: templates/global/form-login.php:48 templates/myaccount/form-login.php:36
+#: templates/global/form-login.php:48 templates/myaccount/form-login.php:32
msgid "Login"
msgstr ""
@@ -12543,7 +12656,7 @@ msgid ""
msgstr ""
#: includes/admin/settings/class-wc-settings-accounts.php:140
-#: includes/wc-template-functions.php:760
+#: includes/wc-template-functions.php:757
#. translators: %s privacy policy page name and link
msgid ""
"Your personal data will be used to support your experience throughout this "
@@ -12564,7 +12677,7 @@ msgstr ""
#: includes/admin/settings/class-wc-settings-accounts.php:150
#: includes/customizer/class-wc-shop-customizer.php:736
-#: includes/wc-template-functions.php:756
+#: includes/wc-template-functions.php:753
#. translators: %s privacy policy page name and link
msgid ""
"Your personal data will be used to process your order, support your "
@@ -12634,200 +12747,200 @@ msgid ""
"personal data within them."
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:42
-#: includes/admin/settings/class-wc-settings-advanced.php:65
+#: includes/admin/settings/class-wc-settings-advanced.php:40
+#: includes/admin/settings/class-wc-settings-advanced.php:63
msgid "Page setup"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:45
-#: includes/admin/settings/class-wc-settings-advanced.php:313
+#: includes/admin/settings/class-wc-settings-advanced.php:43
+#: includes/admin/settings/class-wc-settings-advanced.php:311
msgid "Legacy API"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:66
+#: includes/admin/settings/class-wc-settings-advanced.php:64
msgid ""
"These pages need to be set so that WooCommerce knows where to send users to "
"checkout."
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:72
+#: includes/admin/settings/class-wc-settings-advanced.php:70
msgid "Cart page"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:74
-#: includes/admin/settings/class-wc-settings-advanced.php:86
-#: includes/admin/settings/class-wc-settings-advanced.php:98
+#: includes/admin/settings/class-wc-settings-advanced.php:72
+#: includes/admin/settings/class-wc-settings-advanced.php:84
+#: includes/admin/settings/class-wc-settings-advanced.php:96
#. Translators: %s Page contents.
msgid "Page contents: [%s]"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:84
+#: includes/admin/settings/class-wc-settings-advanced.php:82
msgid "Checkout page"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:96
+#: includes/admin/settings/class-wc-settings-advanced.php:94
msgid "My account page"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:108
+#: includes/admin/settings/class-wc-settings-advanced.php:106
#: includes/customizer/class-wc-shop-customizer.php:757
#: includes/customizer/class-wc-shop-customizer.php:811
msgid "Terms and conditions"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:109
+#: includes/admin/settings/class-wc-settings-advanced.php:107
msgid ""
"If you define a \"Terms\" page the customer will be asked if they accept "
"them when checking out."
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:132
+#: includes/admin/settings/class-wc-settings-advanced.php:130
msgid "Secure checkout"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:133
+#: includes/admin/settings/class-wc-settings-advanced.php:131
msgid "Force secure checkout"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:140
+#: includes/admin/settings/class-wc-settings-advanced.php:138
#. Translators: %s Docs URL.
msgid ""
"Force SSL (HTTPS) on the checkout pages (an SSL Certificate is required )."
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:144
+#: includes/admin/settings/class-wc-settings-advanced.php:142
msgid "Force HTTP when leaving the checkout"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:158
+#: includes/admin/settings/class-wc-settings-advanced.php:156
msgid "Checkout endpoints"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:160
+#: includes/admin/settings/class-wc-settings-advanced.php:158
msgid ""
"Endpoints are appended to your page URLs to handle specific actions during "
"the checkout process. They should be unique."
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:165
+#: includes/admin/settings/class-wc-settings-advanced.php:163
#: includes/wc-account-functions.php:273 templates/checkout/thankyou.php:33
msgid "Pay"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:166
+#: includes/admin/settings/class-wc-settings-advanced.php:164
msgid "Endpoint for the \"Checkout → Pay\" page."
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:174
+#: includes/admin/settings/class-wc-settings-advanced.php:172
#: includes/class-wc-query.php:102
msgid "Order received"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:175
+#: includes/admin/settings/class-wc-settings-advanced.php:173
msgid "Endpoint for the \"Checkout → Order received\" page."
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:183
+#: includes/admin/settings/class-wc-settings-advanced.php:181
#: includes/class-wc-query.php:130
#: templates/myaccount/form-add-payment-method.php:52
#: templates/myaccount/payment-methods.php:80
msgid "Add payment method"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:184
+#: includes/admin/settings/class-wc-settings-advanced.php:182
msgid "Endpoint for the \"Checkout → Add payment method\" page."
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:192
+#: includes/admin/settings/class-wc-settings-advanced.php:190
msgid "Delete payment method"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:193
+#: includes/admin/settings/class-wc-settings-advanced.php:191
msgid "Endpoint for the delete payment method page."
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:201
+#: includes/admin/settings/class-wc-settings-advanced.php:199
msgid "Set default payment method"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:202
+#: includes/admin/settings/class-wc-settings-advanced.php:200
msgid "Endpoint for the setting a default payment method page."
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:215
+#: includes/admin/settings/class-wc-settings-advanced.php:213
msgid "Account endpoints"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:217
+#: includes/admin/settings/class-wc-settings-advanced.php:215
msgid ""
"Endpoints are appended to your page URLs to handle specific actions on the "
"accounts pages. They should be unique and can be left blank to disable the "
"endpoint."
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:223
+#: includes/admin/settings/class-wc-settings-advanced.php:221
msgid "Endpoint for the \"My account → Orders\" page."
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:231
+#: includes/admin/settings/class-wc-settings-advanced.php:229
#: includes/class-wc-post-types.php:377
msgid "View order"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:232
+#: includes/admin/settings/class-wc-settings-advanced.php:230
msgid "Endpoint for the \"My account → View order\" page."
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:241
+#: includes/admin/settings/class-wc-settings-advanced.php:239
msgid "Endpoint for the \"My account → Downloads\" page."
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:249
+#: includes/admin/settings/class-wc-settings-advanced.php:247
msgid "Edit account"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:250
+#: includes/admin/settings/class-wc-settings-advanced.php:248
msgid "Endpoint for the \"My account → Edit account\" page."
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:258
+#: includes/admin/settings/class-wc-settings-advanced.php:256
#: includes/class-wc-query.php:124 includes/wc-account-functions.php:101
msgid "Addresses"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:259
+#: includes/admin/settings/class-wc-settings-advanced.php:257
msgid "Endpoint for the \"My account → Addresses\" page."
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:267
+#: includes/admin/settings/class-wc-settings-advanced.php:265
#: includes/admin/settings/class-wc-settings-payment-gateways.php:37
#: includes/admin/settings/class-wc-settings-payment-gateways.php:55
#: includes/class-wc-query.php:127 includes/wc-account-functions.php:102
msgid "Payment methods"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:268
+#: includes/admin/settings/class-wc-settings-advanced.php:266
msgid "Endpoint for the \"My account → Payment methods\" page."
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:277
+#: includes/admin/settings/class-wc-settings-advanced.php:275
msgid "Endpoint for the \"My account → Lost password\" page."
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:285
+#: includes/admin/settings/class-wc-settings-advanced.php:283
#: includes/wc-account-functions.php:104
#: templates/auth/form-grant-access.php:39
msgid "Logout"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:286
+#: includes/admin/settings/class-wc-settings-advanced.php:284
msgid ""
"Endpoint for the triggering logout. You can add this to your menus via a "
"custom link: yoursite.com/?customer-logout=true"
msgstr ""
-#: includes/admin/settings/class-wc-settings-advanced.php:314
+#: includes/admin/settings/class-wc-settings-advanced.php:312
msgid "Enable the legacy REST API"
msgstr ""
@@ -12873,118 +12986,120 @@ msgstr ""
msgid "Email template"
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:111
+#: includes/admin/settings/class-wc-settings-emails.php:112
+#. translators: %s: Nonced email preview link
msgid ""
"This section lets you customize the WooCommerce emails. Click here to preview your email template ."
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:116
+#: includes/admin/settings/class-wc-settings-emails.php:117
msgid "Header image"
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:117
+#: includes/admin/settings/class-wc-settings-emails.php:118
msgid ""
"URL to an image you want to show in the email header. Upload images using "
"the media uploader (Admin > Media)."
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:128
+#: includes/admin/settings/class-wc-settings-emails.php:129
msgid "Footer text"
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:129
+#: includes/admin/settings/class-wc-settings-emails.php:131
+#. translators: %s: Available placeholders for use
msgid "The text to appear in the footer of WooCommerce emails."
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:129
-#: includes/emails/class-wc-email-cancelled-order.php:158
-#: includes/emails/class-wc-email-cancelled-order.php:167
-#: includes/emails/class-wc-email-customer-completed-order.php:147
-#: includes/emails/class-wc-email-customer-completed-order.php:156
-#: includes/emails/class-wc-email-customer-invoice.php:184
-#: includes/emails/class-wc-email-customer-invoice.php:193
-#: includes/emails/class-wc-email-customer-invoice.php:202
-#: includes/emails/class-wc-email-customer-invoice.php:211
-#: includes/emails/class-wc-email-customer-refunded-order.php:239
-#: includes/emails/class-wc-email-customer-refunded-order.php:248
-#: includes/emails/class-wc-email-customer-refunded-order.php:257
-#: includes/emails/class-wc-email-customer-refunded-order.php:266
-#: includes/emails/class-wc-email-failed-order.php:158
-#: includes/emails/class-wc-email-failed-order.php:167
-#: includes/emails/class-wc-email-new-order.php:163
-#: includes/emails/class-wc-email-new-order.php:172
-#: includes/emails/class-wc-email.php:612
-#: includes/emails/class-wc-email.php:621
+#: includes/admin/settings/class-wc-settings-emails.php:131
+#: includes/emails/class-wc-email-cancelled-order.php:159
+#: includes/emails/class-wc-email-cancelled-order.php:168
+#: includes/emails/class-wc-email-customer-completed-order.php:146
+#: includes/emails/class-wc-email-customer-completed-order.php:155
+#: includes/emails/class-wc-email-customer-invoice.php:180
+#: includes/emails/class-wc-email-customer-invoice.php:189
+#: includes/emails/class-wc-email-customer-invoice.php:198
+#: includes/emails/class-wc-email-customer-invoice.php:207
+#: includes/emails/class-wc-email-customer-refunded-order.php:236
+#: includes/emails/class-wc-email-customer-refunded-order.php:245
+#: includes/emails/class-wc-email-customer-refunded-order.php:254
+#: includes/emails/class-wc-email-customer-refunded-order.php:263
+#: includes/emails/class-wc-email-failed-order.php:157
+#: includes/emails/class-wc-email-failed-order.php:166
+#: includes/emails/class-wc-email-new-order.php:164
+#: includes/emails/class-wc-email-new-order.php:173
+#: includes/emails/class-wc-email.php:629
+#: includes/emails/class-wc-email.php:638
#. translators: %s: list of placeholders
msgid "Available placeholders: %s"
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:140
+#: includes/admin/settings/class-wc-settings-emails.php:142
msgid "Base color"
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:142
+#: includes/admin/settings/class-wc-settings-emails.php:144
#. translators: %s: default color
msgid "The base color for WooCommerce email templates. Default %s."
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:152
+#: includes/admin/settings/class-wc-settings-emails.php:154
msgid "Background color"
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:154
+#: includes/admin/settings/class-wc-settings-emails.php:156
#. translators: %s: default color
msgid "The background color for WooCommerce email templates. Default %s."
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:164
+#: includes/admin/settings/class-wc-settings-emails.php:166
msgid "Body background color"
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:166
+#: includes/admin/settings/class-wc-settings-emails.php:168
#. translators: %s: default color
msgid "The main body background color. Default %s."
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:176
+#: includes/admin/settings/class-wc-settings-emails.php:178
msgid "Body text color"
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:178
+#: includes/admin/settings/class-wc-settings-emails.php:180
#. translators: %s: default color
msgid "The main body text color. Default %s."
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:264
+#: includes/admin/settings/class-wc-settings-emails.php:266
msgid "Content type"
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:265
-#: includes/emails/class-wc-email-cancelled-order.php:145
-#: includes/emails/class-wc-email-failed-order.php:145
-#: includes/emails/class-wc-email-new-order.php:150
+#: includes/admin/settings/class-wc-settings-emails.php:267
+#: includes/emails/class-wc-email-cancelled-order.php:146
+#: includes/emails/class-wc-email-failed-order.php:144
+#: includes/emails/class-wc-email-new-order.php:151
msgid "Recipient(s)"
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:291
+#: includes/admin/settings/class-wc-settings-emails.php:293
msgid "Customer"
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:298
+#: includes/admin/settings/class-wc-settings-emails.php:300
msgid "Manually sent"
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:298
+#: includes/admin/settings/class-wc-settings-emails.php:300
msgid "Manual"
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:302
+#: includes/admin/settings/class-wc-settings-emails.php:304
#: includes/wc-webhook-functions.php:90
msgid "Disabled"
msgstr ""
-#: includes/admin/settings/class-wc-settings-emails.php:314
+#: includes/admin/settings/class-wc-settings-emails.php:316
#: includes/admin/settings/class-wc-settings-payment-gateways.php:176
msgid "Manage"
msgstr ""
@@ -13278,103 +13393,99 @@ msgstr ""
msgid "The \"%s\" payment method is currently disabled"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:81
+#: includes/admin/settings/class-wc-settings-products.php:79
#. translators: %s: URL to customizer.
msgid ""
"Looking for the product display options? They can now be found in the "
"Customizer. Go see them in action here. "
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:137
+#: includes/admin/settings/class-wc-settings-products.php:135
msgid "Manage stock"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:138
+#: includes/admin/settings/class-wc-settings-products.php:136
msgid "Enable stock management"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:145
+#: includes/admin/settings/class-wc-settings-products.php:143
msgid "Hold stock (minutes)"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:146
+#: includes/admin/settings/class-wc-settings-products.php:144
msgid ""
"Hold stock (for unpaid orders) for x minutes. When this limit is reached, "
"the pending order will be cancelled. Leave blank to disable."
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:160
+#: includes/admin/settings/class-wc-settings-products.php:158
msgid "Notifications"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:161
+#: includes/admin/settings/class-wc-settings-products.php:159
msgid "Enable low stock notifications"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:171
+#: includes/admin/settings/class-wc-settings-products.php:169
msgid "Enable out of stock notifications"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:181
+#: includes/admin/settings/class-wc-settings-products.php:179
msgid "Notification recipient(s)"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:182
+#: includes/admin/settings/class-wc-settings-products.php:180
msgid "Enter recipients (comma separated) that will receive this notification."
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:193
-msgid "Low stock threshold"
-msgstr ""
-
-#: includes/admin/settings/class-wc-settings-products.php:194
+#: includes/admin/settings/class-wc-settings-products.php:192
msgid "When product stock reaches this amount you will be notified via email."
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:209
+#: includes/admin/settings/class-wc-settings-products.php:207
msgid "Out of stock threshold"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:210
+#: includes/admin/settings/class-wc-settings-products.php:208
msgid ""
"When product stock reaches this amount the stock status will change to "
"\"out of stock\" and you will be notified via email. This setting does not "
"affect existing \"in stock\" products."
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:224
+#: includes/admin/settings/class-wc-settings-products.php:222
msgid "Out of stock visibility"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:225
+#: includes/admin/settings/class-wc-settings-products.php:223
msgid "Hide out of stock items from the catalog"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:232
+#: includes/admin/settings/class-wc-settings-products.php:230
msgid "Stock display format"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:233
+#: includes/admin/settings/class-wc-settings-products.php:231
msgid "This controls how stock quantities are displayed on the frontend."
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:240
+#: includes/admin/settings/class-wc-settings-products.php:238
msgid "Always show quantity remaining in stock e.g. \"12 in stock\""
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:241
+#: includes/admin/settings/class-wc-settings-products.php:239
msgid "Only show quantity remaining in stock when low e.g. \"Only 2 left in stock\""
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:242
+#: includes/admin/settings/class-wc-settings-products.php:240
msgid "Never show quantity remaining in stock"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:265
+#: includes/admin/settings/class-wc-settings-products.php:263
msgid "File download method"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:268
+#: includes/admin/settings/class-wc-settings-products.php:266
#. translators: 1: X-Accel-Redirect 2: X-Sendfile 3: mod_xsendfile
msgid ""
"Forcing downloads will keep URLs hidden, but some servers may serve large "
@@ -13382,113 +13493,160 @@ msgid ""
"instead (server requires %3$s)."
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:280
+#: includes/admin/settings/class-wc-settings-products.php:278
msgid "Force downloads"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:281
+#: includes/admin/settings/class-wc-settings-products.php:279
msgid "X-Accel-Redirect/X-Sendfile"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:282
+#: includes/admin/settings/class-wc-settings-products.php:280
msgid "Redirect only"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:288
+#: includes/admin/settings/class-wc-settings-products.php:286
msgid "Access restriction"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:289
+#: includes/admin/settings/class-wc-settings-products.php:287
msgid "Downloads require login"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:293
+#: includes/admin/settings/class-wc-settings-products.php:291
msgid "This setting does not apply to guest purchases."
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:299
+#: includes/admin/settings/class-wc-settings-products.php:297
msgid "Grant access to downloadable products after payment"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:303
+#: includes/admin/settings/class-wc-settings-products.php:301
msgid ""
"Enable this option to grant access to downloads when orders are "
"\"processing\", rather than \"completed\"."
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:321
+#: includes/admin/settings/class-wc-settings-products.php:319
msgid "Shop pages"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:327
+#: includes/admin/settings/class-wc-settings-products.php:325
msgid "Shop page"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:328
+#: includes/admin/settings/class-wc-settings-products.php:327
+#. translators: %s: URL to settings.
msgid ""
"The base page can also be used in your product "
"permalinks ."
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:334
+#: includes/admin/settings/class-wc-settings-products.php:333
msgid ""
"This sets the base page of your shop - this is where your product archive "
"will be."
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:337
+#: includes/admin/settings/class-wc-settings-products.php:336
msgid "Add to cart behaviour"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:338
+#: includes/admin/settings/class-wc-settings-products.php:337
msgid "Redirect to the cart page after successful addition"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:345
+#: includes/admin/settings/class-wc-settings-products.php:344
msgid "Enable AJAX add to cart buttons on archives"
msgstr ""
+#: includes/admin/settings/class-wc-settings-products.php:351
+msgid "Placeholder image"
+msgstr ""
+
#: includes/admin/settings/class-wc-settings-products.php:357
+msgid "Enter attachment ID or URL to an image"
+msgstr ""
+
+#: includes/admin/settings/class-wc-settings-products.php:358
+msgid ""
+"This is the attachment ID, or image URL, used for placeholder images in the "
+"product catalog. Products with no image will use this."
+msgstr ""
+
+#: includes/admin/settings/class-wc-settings-products.php:366
msgid "Measurements"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:363
+#: includes/admin/settings/class-wc-settings-products.php:372
msgid "Weight unit"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:364
+#: includes/admin/settings/class-wc-settings-products.php:373
msgid "This controls what unit you will define weights in."
msgstr ""
#: includes/admin/settings/class-wc-settings-products.php:380
-msgid "Dimensions unit"
+msgid "kg"
msgstr ""
#: includes/admin/settings/class-wc-settings-products.php:381
+msgid "g"
+msgstr ""
+
+#: includes/admin/settings/class-wc-settings-products.php:382
+msgid "lbs"
+msgstr ""
+
+#: includes/admin/settings/class-wc-settings-products.php:383
+msgid "oz"
+msgstr ""
+
+#: includes/admin/settings/class-wc-settings-products.php:389
+msgid "Dimensions unit"
+msgstr ""
+
+#: includes/admin/settings/class-wc-settings-products.php:390
msgid "This controls what unit you will define lengths in."
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:411
-msgid "Enable product reviews"
+#: includes/admin/settings/class-wc-settings-products.php:398
+msgid "cm"
+msgstr ""
+
+#: includes/admin/settings/class-wc-settings-products.php:399
+msgid "mm"
+msgstr ""
+
+#: includes/admin/settings/class-wc-settings-products.php:400
+msgid "in"
+msgstr ""
+
+#: includes/admin/settings/class-wc-settings-products.php:401
+msgid "yd"
msgstr ""
#: includes/admin/settings/class-wc-settings-products.php:420
+msgid "Enable product reviews"
+msgstr ""
+
+#: includes/admin/settings/class-wc-settings-products.php:429
msgid "Show \"verified owner\" label on customer reviews"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:430
+#: includes/admin/settings/class-wc-settings-products.php:439
msgid "Reviews can only be left by \"verified owners\""
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:440
+#: includes/admin/settings/class-wc-settings-products.php:449
msgid "Product ratings"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:441
+#: includes/admin/settings/class-wc-settings-products.php:450
msgid "Enable star rating on reviews"
msgstr ""
-#: includes/admin/settings/class-wc-settings-products.php:450
+#: includes/admin/settings/class-wc-settings-products.php:459
msgid "Star ratings should be required, not optional"
msgstr ""
@@ -13859,7 +14017,7 @@ msgid "Generate API key"
msgstr ""
#: includes/admin/settings/views/html-keys-edit.php:115
-#: includes/class-wc-ajax.php:1858
+#: includes/class-wc-ajax.php:1814
msgid "Revoke key"
msgstr ""
@@ -13888,7 +14046,7 @@ msgstr ""
#: includes/admin/views/html-bulk-edit-product.php:95
#: includes/admin/views/html-quick-edit-product.php:72
#: includes/gateways/simplify-commerce/class-wc-gateway-simplify-commerce.php:217
-#: includes/wc-product-functions.php:807
+#: includes/wc-product-functions.php:829
msgid "Standard"
msgstr ""
@@ -14077,62 +14235,62 @@ msgstr ""
msgid "Action"
msgstr ""
-#: includes/admin/settings/views/html-webhooks-edit.php:97
+#: includes/admin/settings/views/html-webhooks-edit.php:100
msgid "Action event"
msgstr ""
-#: includes/admin/settings/views/html-webhooks-edit.php:98
+#: includes/admin/settings/views/html-webhooks-edit.php:101
msgid "Enter the action that will trigger this webhook."
msgstr ""
-#: includes/admin/settings/views/html-webhooks-edit.php:109
+#: includes/admin/settings/views/html-webhooks-edit.php:112
msgid "URL where the webhook payload is delivered."
msgstr ""
-#: includes/admin/settings/views/html-webhooks-edit.php:119
+#: includes/admin/settings/views/html-webhooks-edit.php:122
msgid "Secret"
msgstr ""
-#: includes/admin/settings/views/html-webhooks-edit.php:120
+#: includes/admin/settings/views/html-webhooks-edit.php:123
msgid ""
"The secret key is used to generate a hash of the delivered webhook and "
"provided in the request headers."
msgstr ""
-#: includes/admin/settings/views/html-webhooks-edit.php:130
+#: includes/admin/settings/views/html-webhooks-edit.php:133
msgid "API Version"
msgstr ""
-#: includes/admin/settings/views/html-webhooks-edit.php:131
+#: includes/admin/settings/views/html-webhooks-edit.php:134
msgid "REST API version used in the webhook deliveries."
msgstr ""
-#: includes/admin/settings/views/html-webhooks-edit.php:136
+#: includes/admin/settings/views/html-webhooks-edit.php:139
msgid "WP REST API Integration v2"
msgstr ""
-#: includes/admin/settings/views/html-webhooks-edit.php:137
+#: includes/admin/settings/views/html-webhooks-edit.php:140
msgid "WP REST API Integration v1"
msgstr ""
-#: includes/admin/settings/views/html-webhooks-edit.php:138
+#: includes/admin/settings/views/html-webhooks-edit.php:141
msgid "Legacy API v3 (deprecated)"
msgstr ""
-#: includes/admin/settings/views/html-webhooks-edit.php:149
+#: includes/admin/settings/views/html-webhooks-edit.php:152
msgid "Webhook actions"
msgstr ""
-#: includes/admin/settings/views/html-webhooks-edit.php:156
-#: includes/admin/settings/views/html-webhooks-edit.php:165
+#: includes/admin/settings/views/html-webhooks-edit.php:159
+#: includes/admin/settings/views/html-webhooks-edit.php:168
msgid "Created at"
msgstr ""
-#: includes/admin/settings/views/html-webhooks-edit.php:173
+#: includes/admin/settings/views/html-webhooks-edit.php:176
msgid "Updated at"
msgstr ""
-#: includes/admin/settings/views/html-webhooks-edit.php:184
+#: includes/admin/settings/views/html-webhooks-edit.php:187
msgid "Save webhook"
msgstr ""
@@ -14313,14 +14471,22 @@ msgid "Product variations"
msgstr ""
#: includes/admin/views/html-admin-page-product-export.php:62
-msgid "Export custom meta?"
+msgid "Which product category should be exported?"
msgstr ""
-#: includes/admin/views/html-admin-page-product-export.php:66
-msgid "Yes, export all custom meta"
+#: includes/admin/views/html-admin-page-product-export.php:65
+msgid "Export all categories"
msgstr ""
#: includes/admin/views/html-admin-page-product-export.php:75
+msgid "Export custom meta?"
+msgstr ""
+
+#: includes/admin/views/html-admin-page-product-export.php:79
+msgid "Yes, export all custom meta"
+msgstr ""
+
+#: includes/admin/views/html-admin-page-product-export.php:88
msgid "Generate CSV"
msgstr ""
@@ -14802,7 +14968,7 @@ msgid "Secure connection (HTTPS)"
msgstr ""
#: includes/admin/views/html-admin-page-status-report.php:522
-#: includes/api/class-wc-rest-system-status-controller.php:515
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:515
msgid "Is the connection to your store secure?"
msgstr ""
@@ -15150,7 +15316,7 @@ msgstr ""
#: includes/admin/views/html-bulk-edit-product.php:190
#: includes/admin/views/html-quick-edit-product.php:147
#: includes/customizer/class-wc-shop-customizer.php:700
-#: includes/wc-product-functions.php:753
+#: includes/wc-product-functions.php:774
msgid "Hidden"
msgstr ""
@@ -15259,19 +15425,35 @@ msgstr ""
msgid "Install our new Simplify Commerce plugin"
msgstr ""
-#: includes/admin/views/html-notice-template-check.php:15
+#: includes/admin/views/html-notice-template-check.php:19
+#. translators: %s: theme name
msgid ""
-"Your theme (%1$s) contains outdated copies of some WooCommerce "
+"Your theme (%s) contains outdated copies of some WooCommerce "
"template files. These files may need updating to ensure they are "
-"compatible with the current version of WooCommerce. You can see which files "
-"are affected from the system status page . If in doubt, "
-"check with the author of the theme."
+"compatible with the current version of WooCommerce. Suggestions to fix this:"
msgstr ""
-#: includes/admin/views/html-notice-template-check.php:16
+#: includes/admin/views/html-notice-template-check.php:21
+msgid ""
+"Update your theme to the latest version. If no update is available contact "
+"your theme author asking about compatibility with the current WooCommerce "
+"version."
+msgstr ""
+
+#: includes/admin/views/html-notice-template-check.php:22
+msgid ""
+"If you copied over a template file to change something, then you will need "
+"to copy the new version of the template and apply your changes again."
+msgstr ""
+
+#: includes/admin/views/html-notice-template-check.php:26
msgid "Learn more about templates"
msgstr ""
+#: includes/admin/views/html-notice-template-check.php:27
+msgid "View affected templates"
+msgstr ""
+
#: includes/admin/views/html-notice-theme-support.php:14
msgid ""
"Your theme does not declare WooCommerce support – "
@@ -15289,20 +15471,20 @@ msgstr ""
msgid "Theme integration guide"
msgstr ""
-#: includes/admin/views/html-notice-update.php:12
-#: includes/admin/views/html-notice-updating.php:12
+#: includes/admin/views/html-notice-update.php:21
+#: includes/admin/views/html-notice-updating.php:21
msgid "WooCommerce data update"
msgstr ""
-#: includes/admin/views/html-notice-update.php:12
+#: includes/admin/views/html-notice-update.php:21
msgid "We need to update your store database to the latest version."
msgstr ""
-#: includes/admin/views/html-notice-update.php:13
+#: includes/admin/views/html-notice-update.php:25
msgid "Run the updater"
msgstr ""
-#: includes/admin/views/html-notice-update.php:17
+#: includes/admin/views/html-notice-update.php:31
msgid ""
"It is strongly recommended that you backup your database before proceeding. "
"Are you sure you wish to run the updater now?"
@@ -15314,14 +15496,29 @@ msgid ""
"version!"
msgstr ""
-#: includes/admin/views/html-notice-updating.php:12
+#: includes/admin/views/html-notice-updating.php:21
msgid "Your database is being updated in the background."
msgstr ""
-#: includes/admin/views/html-notice-updating.php:12
+#: includes/admin/views/html-notice-updating.php:23
msgid "Taking a while? Click here to run it now."
msgstr ""
+#: includes/admin/views/html-notice-wootenberg.php:15
+msgid ""
+"We noticed you're experimenting with Gutenberg: Try the WooCommerce "
+"Gutenberg Products Block for a powerful new way to feature products in "
+"posts."
+msgstr ""
+
+#: includes/admin/views/html-notice-wootenberg.php:19
+msgid "Activate the Gutenberg Products Block"
+msgstr ""
+
+#: includes/admin/views/html-notice-wootenberg.php:30
+msgid "Install the WooCommerce Gutenberg Products Block"
+msgstr ""
+
#: includes/admin/views/html-report-by-date.php:22
#. translators: 1: start date 2: end date
msgid "From %1$s to %2$s"
@@ -15412,1173 +15609,601 @@ msgid ""
"secret in the password field."
msgstr ""
-#: includes/api/class-wc-rest-coupons-controller.php:61
-#: includes/api/class-wc-rest-coupons-controller.php:341
-#: includes/api/class-wc-rest-orders-controller.php:1564
-#: includes/api/v1/class-wc-rest-coupons-controller.php:70
-#: includes/api/v1/class-wc-rest-coupons-controller.php:421
-#: includes/api/v1/class-wc-rest-orders-controller.php:1535
-msgid "Coupon code."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:102
-#: includes/api/class-wc-rest-orders-controller.php:108
-#: includes/api/class-wc-rest-product-variations-controller.php:115
-#: includes/api/class-wc-rest-products-controller.php:111
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:87
-#: includes/api/class-wc-rest-shipping-zones-controller.php:77
-#: includes/api/v1/class-wc-rest-coupons-controller.php:108
-#: includes/api/v1/class-wc-rest-orders-controller.php:102
-#: includes/api/v1/class-wc-rest-product-reviews-controller.php:118
-#: includes/api/v1/class-wc-rest-products-controller.php:102
-msgid "Whether to bypass trash and force deletion."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:271
-#: includes/api/legacy/class-wc-rest-legacy-coupons-controller.php:113
-#: includes/api/v1/class-wc-rest-coupons-controller.php:253
-msgid "The coupon code cannot be empty."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:286
-#: includes/api/legacy/class-wc-rest-legacy-coupons-controller.php:129
-#: includes/api/legacy/v2/class-wc-api-coupons.php:233
-#: includes/api/legacy/v2/class-wc-api-coupons.php:344
-#: includes/api/legacy/v3/class-wc-api-coupons.php:231
-#: includes/api/legacy/v3/class-wc-api-coupons.php:342
-#: includes/api/v1/class-wc-rest-coupons-controller.php:269
-msgid "The coupon code already exists"
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:335
-#: includes/api/v1/class-wc-rest-coupons-controller.php:415
-msgid "Unique identifier for the object."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:346
-#: includes/api/v1/class-wc-rest-coupons-controller.php:450
-msgid ""
-"The amount of discount. Should always be numeric, even if setting a "
-"percentage."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:351
-#: includes/api/v1/class-wc-rest-coupons-controller.php:426
-msgid "The date the coupon was created, in the site's timezone."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:357
-msgid "The date the coupon was created, as GMT."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:363
-#: includes/api/v1/class-wc-rest-coupons-controller.php:432
-msgid "The date the coupon was last modified, in the site's timezone."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:369
-msgid "The date the coupon was last modified, as GMT."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:375
-#: includes/api/v1/class-wc-rest-coupons-controller.php:443
-msgid "Determines the type of discount that will be applied."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:382
-#: includes/api/v1/class-wc-rest-coupons-controller.php:438
-msgid "Coupon description."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:387
-msgid "The date the coupon expires, in the site's timezone."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:392
-msgid "The date the coupon expires, as GMT."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:397
-#: includes/api/v1/class-wc-rest-coupons-controller.php:460
-msgid "Number of times the coupon has been used already."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:403
-#: includes/api/v1/class-wc-rest-coupons-controller.php:466
-msgid ""
-"If true, the coupon can only be used individually. Other applied coupons "
-"will be removed from the cart."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:409
-#: includes/api/v1/class-wc-rest-coupons-controller.php:472
-msgid "List of product IDs the coupon can be used on."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:417
-#: includes/api/v1/class-wc-rest-coupons-controller.php:480
-msgid "List of product IDs the coupon cannot be used on."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:425
-#: includes/api/v1/class-wc-rest-coupons-controller.php:488
-msgid "How many times the coupon can be used in total."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:430
-#: includes/api/v1/class-wc-rest-coupons-controller.php:493
-msgid "How many times the coupon can be used per customer."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:435
-#: includes/api/v1/class-wc-rest-coupons-controller.php:498
-msgid "Max number of items in the cart the coupon can be applied to."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:440
-#: includes/api/v1/class-wc-rest-coupons-controller.php:503
-msgid ""
-"If true and if the free shipping method requires a coupon, this coupon will "
-"enable free shipping."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:446
-#: includes/api/v1/class-wc-rest-coupons-controller.php:509
-msgid "List of category IDs the coupon applies to."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:454
-#: includes/api/v1/class-wc-rest-coupons-controller.php:517
-msgid "List of category IDs the coupon does not apply to."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:462
-#: includes/api/v1/class-wc-rest-coupons-controller.php:525
-msgid "If true, this coupon will not be applied to items that have sale prices."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:468
-#: includes/api/v1/class-wc-rest-coupons-controller.php:531
-msgid "Minimum order amount that needs to be in the cart before coupon applies."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:473
-#: includes/api/v1/class-wc-rest-coupons-controller.php:536
-msgid "Maximum order amount allowed when using the coupon."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:478
-#: includes/api/v1/class-wc-rest-coupons-controller.php:541
-msgid "List of email addresses that can use this coupon."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:486
-#: includes/api/v1/class-wc-rest-coupons-controller.php:549
-msgid "List of user IDs (or guest email addresses) that have used the coupon."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:495
-#: includes/api/class-wc-rest-customers-controller.php:334
-#: includes/api/class-wc-rest-order-refunds-controller.php:393
-#: includes/api/class-wc-rest-order-refunds-controller.php:516
-#: includes/api/class-wc-rest-orders-controller.php:1135
-#: includes/api/class-wc-rest-orders-controller.php:1247
-#: includes/api/class-wc-rest-orders-controller.php:1338
-#: includes/api/class-wc-rest-orders-controller.php:1424
-#: includes/api/class-wc-rest-orders-controller.php:1522
-#: includes/api/class-wc-rest-orders-controller.php:1580
-#: includes/api/class-wc-rest-product-variations-controller.php:973
-#: includes/api/class-wc-rest-products-controller.php:2006
-msgid "Meta data."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:502
-#: includes/api/class-wc-rest-customers-controller.php:341
-#: includes/api/class-wc-rest-order-refunds-controller.php:400
-#: includes/api/class-wc-rest-order-refunds-controller.php:524
-#: includes/api/class-wc-rest-orders-controller.php:1142
-#: includes/api/class-wc-rest-orders-controller.php:1254
-#: includes/api/class-wc-rest-orders-controller.php:1345
-#: includes/api/class-wc-rest-orders-controller.php:1431
-#: includes/api/class-wc-rest-orders-controller.php:1529
-#: includes/api/class-wc-rest-orders-controller.php:1587
-#: includes/api/class-wc-rest-product-variations-controller.php:980
-#: includes/api/class-wc-rest-products-controller.php:2013
-msgid "Meta ID."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:508
-#: includes/api/class-wc-rest-customers-controller.php:347
-#: includes/api/class-wc-rest-order-refunds-controller.php:406
-#: includes/api/class-wc-rest-order-refunds-controller.php:530
-#: includes/api/class-wc-rest-orders-controller.php:1148
-#: includes/api/class-wc-rest-orders-controller.php:1260
-#: includes/api/class-wc-rest-orders-controller.php:1351
-#: includes/api/class-wc-rest-orders-controller.php:1437
-#: includes/api/class-wc-rest-orders-controller.php:1535
-#: includes/api/class-wc-rest-orders-controller.php:1593
-#: includes/api/class-wc-rest-product-variations-controller.php:986
-#: includes/api/class-wc-rest-products-controller.php:2019
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:483
-#: includes/api/v1/class-wc-rest-orders-controller.php:1314
-msgid "Meta key."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:513
-#: includes/api/class-wc-rest-customers-controller.php:352
-#: includes/api/class-wc-rest-order-refunds-controller.php:411
-#: includes/api/class-wc-rest-order-refunds-controller.php:536
-#: includes/api/class-wc-rest-orders-controller.php:1153
-#: includes/api/class-wc-rest-orders-controller.php:1265
-#: includes/api/class-wc-rest-orders-controller.php:1356
-#: includes/api/class-wc-rest-orders-controller.php:1442
-#: includes/api/class-wc-rest-orders-controller.php:1540
-#: includes/api/class-wc-rest-orders-controller.php:1598
-#: includes/api/class-wc-rest-product-variations-controller.php:991
-#: includes/api/class-wc-rest-products-controller.php:2024
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:495
-#: includes/api/v1/class-wc-rest-orders-controller.php:1326
-msgid "Meta value."
-msgstr ""
-
-#: includes/api/class-wc-rest-coupons-controller.php:534
-#: includes/api/v1/class-wc-rest-coupons-controller.php:572
-msgid "Limit result set to resources with a specific code."
-msgstr ""
-
-#: includes/api/class-wc-rest-customer-downloads-controller.php:81
-msgid "Download ID."
-msgstr ""
-
-#: includes/api/class-wc-rest-customer-downloads-controller.php:87
-#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:169
-msgid "Download file URL."
-msgstr ""
-
-#: includes/api/class-wc-rest-customer-downloads-controller.php:93
-#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:181
-msgid "Downloadable product ID."
-msgstr ""
-
-#: includes/api/class-wc-rest-customer-downloads-controller.php:99
-#: includes/api/class-wc-rest-order-refunds-controller.php:433
-#: includes/api/class-wc-rest-orders-controller.php:1174
-#: includes/api/class-wc-rest-products-controller.php:1435
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:380
-#: includes/api/v1/class-wc-rest-orders-controller.php:1218
-#: includes/api/v1/class-wc-rest-products-controller.php:1740
-#: includes/api/v1/class-wc-rest-report-top-sellers-controller.php:152
-msgid "Product name."
-msgstr ""
-
-#: includes/api/class-wc-rest-customer-downloads-controller.php:105
-#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:187
-msgid "Downloadable file name."
-msgstr ""
-
-#: includes/api/class-wc-rest-customer-downloads-controller.php:111
-#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:193
-#: includes/cli/class-wc-cli-runner.php:112
-msgid "Order ID."
-msgstr ""
-
-#: includes/api/class-wc-rest-customer-downloads-controller.php:117
-#: includes/api/class-wc-rest-orders-controller.php:848
-#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:199
-#: includes/api/v1/class-wc-rest-orders-controller.php:937
-msgid "Order key."
-msgstr ""
-
-#: includes/api/class-wc-rest-customer-downloads-controller.php:123
-#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:205
-msgid "Number of downloads remaining."
-msgstr ""
-
-#: includes/api/class-wc-rest-customer-downloads-controller.php:129
-#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:211
-msgid "The date when download access expires, in the site's timezone."
-msgstr ""
-
-#: includes/api/class-wc-rest-customer-downloads-controller.php:135
-msgid "The date when download access expires, as GMT."
-msgstr ""
-
-#: includes/api/class-wc-rest-customer-downloads-controller.php:141
-#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:217
-msgid "File details."
-msgstr ""
-
-#: includes/api/class-wc-rest-customer-downloads-controller.php:147
-#: includes/api/class-wc-rest-product-variations-controller.php:771
-#: includes/api/class-wc-rest-products-controller.php:1603
-#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:223
-#: includes/api/v1/class-wc-rest-products-controller.php:1886
-#: includes/api/v1/class-wc-rest-products-controller.php:2364
-msgid "File name."
-msgstr ""
-
-#: includes/api/class-wc-rest-customer-downloads-controller.php:153
-#: includes/api/class-wc-rest-product-variations-controller.php:776
-#: includes/api/class-wc-rest-products-controller.php:1608
-#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:229
-#: includes/api/v1/class-wc-rest-products-controller.php:1891
-#: includes/api/v1/class-wc-rest-products-controller.php:2369
-msgid "File URL."
-msgstr ""
-
-#: includes/api/class-wc-rest-customers-controller.php:130
+#: includes/api/class-wc-rest-customers-controller.php:83
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:130
msgid "The date the customer was created, in the site's timezone."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:136
-#: includes/api/class-wc-rest-orders-controller.php:886
-#: includes/api/v1/class-wc-rest-orders-controller.php:968
-msgid "The date the order was created, as GMT."
+#: includes/api/class-wc-rest-customers-controller.php:89
+#: includes/api/v1/class-wc-rest-customers-controller.php:638
+msgid "The date the customer was created, as GMT."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:142
+#: includes/api/class-wc-rest-customers-controller.php:95
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:142
msgid "The date the customer was last modified, in the site's timezone."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:148
+#: includes/api/class-wc-rest-customers-controller.php:101
#: includes/api/v1/class-wc-rest-customers-controller.php:644
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:148
msgid "The date the customer was last modified, as GMT."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:154
+#: includes/api/class-wc-rest-customers-controller.php:107
#: includes/api/v1/class-wc-rest-customers-controller.php:650
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:154
msgid "The email address for the customer."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:160
+#: includes/api/class-wc-rest-customers-controller.php:113
#: includes/api/v1/class-wc-rest-customers-controller.php:656
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:160
msgid "Customer first name."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:168
+#: includes/api/class-wc-rest-customers-controller.php:121
#: includes/api/v1/class-wc-rest-customers-controller.php:664
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:168
msgid "Customer last name."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:176
+#: includes/api/class-wc-rest-customers-controller.php:129
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:176
msgid "Customer role."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:182
+#: includes/api/class-wc-rest-customers-controller.php:135
#: includes/api/v1/class-wc-rest-customers-controller.php:672
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:182
msgid "Customer login name."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:190
+#: includes/api/class-wc-rest-customers-controller.php:143
#: includes/api/v1/class-wc-rest-customers-controller.php:680
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:190
msgid "Customer password."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:195
+#: includes/api/class-wc-rest-customers-controller.php:148
#: includes/api/v1/class-wc-rest-customers-controller.php:723
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:195
msgid "List of billing address data."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:200
-#: includes/api/class-wc-rest-customers-controller.php:263
-#: includes/api/class-wc-rest-orders-controller.php:980
-#: includes/api/class-wc-rest-orders-controller.php:1043
+#: includes/api/class-wc-rest-customers-controller.php:153
+#: includes/api/class-wc-rest-customers-controller.php:216
#: includes/api/v1/class-wc-rest-customers-controller.php:728
#: includes/api/v1/class-wc-rest-customers-controller.php:791
-#: includes/api/v1/class-wc-rest-orders-controller.php:1033
-#: includes/api/v1/class-wc-rest-orders-controller.php:1096
+#: includes/api/v1/class-wc-rest-orders-controller.php:1038
+#: includes/api/v1/class-wc-rest-orders-controller.php:1101
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:200
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:263
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:991
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1054
msgid "First name."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:205
-#: includes/api/class-wc-rest-customers-controller.php:268
-#: includes/api/class-wc-rest-orders-controller.php:985
-#: includes/api/class-wc-rest-orders-controller.php:1048
+#: includes/api/class-wc-rest-customers-controller.php:158
+#: includes/api/class-wc-rest-customers-controller.php:221
#: includes/api/v1/class-wc-rest-customers-controller.php:733
#: includes/api/v1/class-wc-rest-customers-controller.php:796
-#: includes/api/v1/class-wc-rest-orders-controller.php:1038
-#: includes/api/v1/class-wc-rest-orders-controller.php:1101
+#: includes/api/v1/class-wc-rest-orders-controller.php:1043
+#: includes/api/v1/class-wc-rest-orders-controller.php:1106
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:205
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:268
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:996
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1059
msgid "Last name."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:210
-#: includes/api/class-wc-rest-customers-controller.php:273
-#: includes/api/class-wc-rest-orders-controller.php:990
-#: includes/api/class-wc-rest-orders-controller.php:1053
+#: includes/api/class-wc-rest-customers-controller.php:163
+#: includes/api/class-wc-rest-customers-controller.php:226
#: includes/api/v1/class-wc-rest-customers-controller.php:738
#: includes/api/v1/class-wc-rest-customers-controller.php:801
-#: includes/api/v1/class-wc-rest-orders-controller.php:1043
-#: includes/api/v1/class-wc-rest-orders-controller.php:1106
+#: includes/api/v1/class-wc-rest-orders-controller.php:1048
+#: includes/api/v1/class-wc-rest-orders-controller.php:1111
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:210
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:273
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1001
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1064
msgid "Company name."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:225
-#: includes/api/class-wc-rest-customers-controller.php:288
-#: includes/api/class-wc-rest-orders-controller.php:1005
-#: includes/api/class-wc-rest-orders-controller.php:1068
+#: includes/api/class-wc-rest-customers-controller.php:178
+#: includes/api/class-wc-rest-customers-controller.php:241
#: includes/api/v1/class-wc-rest-customers-controller.php:753
#: includes/api/v1/class-wc-rest-customers-controller.php:816
-#: includes/api/v1/class-wc-rest-orders-controller.php:1058
-#: includes/api/v1/class-wc-rest-orders-controller.php:1121
+#: includes/api/v1/class-wc-rest-orders-controller.php:1063
+#: includes/api/v1/class-wc-rest-orders-controller.php:1126
#: includes/api/v1/class-wc-rest-taxes-controller.php:597
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:225
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:288
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1016
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1079
msgid "City name."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:230
-#: includes/api/class-wc-rest-customers-controller.php:293
-#: includes/api/class-wc-rest-orders-controller.php:1010
-#: includes/api/class-wc-rest-orders-controller.php:1073
+#: includes/api/class-wc-rest-customers-controller.php:183
+#: includes/api/class-wc-rest-customers-controller.php:246
#: includes/api/v1/class-wc-rest-customers-controller.php:758
#: includes/api/v1/class-wc-rest-customers-controller.php:821
-#: includes/api/v1/class-wc-rest-orders-controller.php:1063
-#: includes/api/v1/class-wc-rest-orders-controller.php:1126
+#: includes/api/v1/class-wc-rest-orders-controller.php:1068
+#: includes/api/v1/class-wc-rest-orders-controller.php:1131
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:230
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:293
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1021
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1084
msgid "ISO code or name of the state, province or district."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:235
-#: includes/api/class-wc-rest-customers-controller.php:298
-#: includes/api/class-wc-rest-orders-controller.php:1015
-#: includes/api/class-wc-rest-orders-controller.php:1078
+#: includes/api/class-wc-rest-customers-controller.php:188
+#: includes/api/class-wc-rest-customers-controller.php:251
#: includes/api/v1/class-wc-rest-customers-controller.php:763
#: includes/api/v1/class-wc-rest-customers-controller.php:826
-#: includes/api/v1/class-wc-rest-orders-controller.php:1068
-#: includes/api/v1/class-wc-rest-orders-controller.php:1131
+#: includes/api/v1/class-wc-rest-orders-controller.php:1073
+#: includes/api/v1/class-wc-rest-orders-controller.php:1136
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:235
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:298
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1026
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1089
msgid "Postal code."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:240
-#: includes/api/class-wc-rest-customers-controller.php:303
+#: includes/api/class-wc-rest-customers-controller.php:193
+#: includes/api/class-wc-rest-customers-controller.php:256
#: includes/api/v1/class-wc-rest-customers-controller.php:768
#: includes/api/v1/class-wc-rest-customers-controller.php:831
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:240
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:303
msgid "ISO code of the country."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:245
-#: includes/api/class-wc-rest-orders-controller.php:1025
+#: includes/api/class-wc-rest-customers-controller.php:198
#: includes/api/v1/class-wc-rest-customers-controller.php:773
-#: includes/api/v1/class-wc-rest-orders-controller.php:1078
+#: includes/api/v1/class-wc-rest-orders-controller.php:1083
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:245
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1036
msgid "Email address."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:251
-#: includes/api/class-wc-rest-orders-controller.php:1031
+#: includes/api/class-wc-rest-customers-controller.php:204
#: includes/api/v1/class-wc-rest-customers-controller.php:779
-#: includes/api/v1/class-wc-rest-orders-controller.php:1084
+#: includes/api/v1/class-wc-rest-orders-controller.php:1089
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:251
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1042
msgid "Phone number."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:258
+#: includes/api/class-wc-rest-customers-controller.php:211
#: includes/api/v1/class-wc-rest-customers-controller.php:786
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:258
msgid "List of shipping address data."
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:310
+#: includes/api/class-wc-rest-customers-controller.php:263
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:310
msgid "Is the customer a paying customer?"
msgstr ""
-#: includes/api/class-wc-rest-customers-controller.php:316
-#: includes/api/v1/class-wc-rest-customers-controller.php:705
-msgid "Quantity of orders made by the customer."
-msgstr ""
-
-#: includes/api/class-wc-rest-customers-controller.php:322
-#: includes/api/v1/class-wc-rest-customers-controller.php:711
-msgid "Total amount spent."
-msgstr ""
-
-#: includes/api/class-wc-rest-customers-controller.php:328
+#: includes/api/class-wc-rest-customers-controller.php:269
#: includes/api/v1/class-wc-rest-customers-controller.php:717
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:328
msgid "Avatar URL."
msgstr ""
-#: includes/api/class-wc-rest-network-orders-controller.php:51
-msgid "Blog id of the record on the multisite."
+#: includes/api/class-wc-rest-customers-controller.php:275
+#: includes/api/class-wc-rest-product-variations-controller.php:720
+#: includes/api/class-wc-rest-products-controller.php:1270
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:495
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:334
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:393
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:516
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1146
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1258
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1349
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1440
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1538
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1596
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:973
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2018
+msgid "Meta data."
msgstr ""
-#: includes/api/class-wc-rest-network-orders-controller.php:57
-msgid "URL to edit the order"
+#: includes/api/class-wc-rest-customers-controller.php:282
+#: includes/api/class-wc-rest-product-variations-controller.php:727
+#: includes/api/class-wc-rest-products-controller.php:1277
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:502
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:341
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:400
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:524
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1153
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1265
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1356
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1447
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1545
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1603
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:980
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2025
+msgid "Meta ID."
msgstr ""
-#: includes/api/class-wc-rest-network-orders-controller.php:63
-msgid "Name of the customer for the order"
+#: includes/api/class-wc-rest-customers-controller.php:288
+#: includes/api/class-wc-rest-product-variations-controller.php:733
+#: includes/api/class-wc-rest-products-controller.php:1283
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:483
+#: includes/api/v1/class-wc-rest-orders-controller.php:1319
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:508
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:347
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:406
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:530
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1159
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1271
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1362
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1453
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1551
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1609
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:986
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2031
+msgid "Meta key."
msgstr ""
-#: includes/api/class-wc-rest-network-orders-controller.php:69
-msgid "Order Status"
+#: includes/api/class-wc-rest-customers-controller.php:293
+#: includes/api/class-wc-rest-product-variations-controller.php:738
+#: includes/api/class-wc-rest-products-controller.php:1288
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:495
+#: includes/api/v1/class-wc-rest-orders-controller.php:1331
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:513
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:352
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:411
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:536
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1164
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1276
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1367
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1458
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1556
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1614
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:991
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2036
+msgid "Meta value."
msgstr ""
-#: includes/api/class-wc-rest-network-orders-controller.php:75
-msgid "Order total formatted for locale"
+#: includes/api/class-wc-rest-data-continents-controller.php:59
+#: includes/api/class-wc-rest-data-continents-controller.php:250
+msgid "2 character continent code."
msgstr ""
-#: includes/api/class-wc-rest-order-notes-controller.php:39
-#: includes/api/class-wc-rest-order-refunds-controller.php:191
-#: includes/api/class-wc-rest-order-refunds-controller.php:273
+#: includes/api/class-wc-rest-data-continents-controller.php:185
+#: includes/api/class-wc-rest-data-countries-controller.php:133
+msgid "There are no locations matching these parameters."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-continents-controller.php:256
+msgid "Full name of continent."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-continents-controller.php:262
+msgid "List of countries on this continent."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-continents-controller.php:272
+#: includes/api/class-wc-rest-data-countries-controller.php:59
+#: includes/api/class-wc-rest-data-countries-controller.php:200
+msgid "ISO3166 alpha-2 country code."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-continents-controller.php:278
+msgid "Default ISO4127 alpha-3 currency code for the country."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-continents-controller.php:284
+msgid "Currency symbol position for this country."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-continents-controller.php:290
+msgid "Decimal separator for displayed prices for this country."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-continents-controller.php:296
+msgid "The unit lengths are defined in for this country."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-continents-controller.php:302
+#: includes/api/class-wc-rest-data-countries-controller.php:206
+msgid "Full name of country."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-continents-controller.php:308
+msgid "Number of decimal points shown in displayed prices for this country."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-continents-controller.php:314
+#: includes/api/class-wc-rest-data-countries-controller.php:212
+msgid "List of states in this country."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-continents-controller.php:324
+#: includes/api/class-wc-rest-data-countries-controller.php:222
+#: includes/api/v1/class-wc-rest-taxes-controller.php:587
+msgid "State code."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-continents-controller.php:330
+#: includes/api/class-wc-rest-data-countries-controller.php:228
+msgid "Full name of state."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-continents-controller.php:339
+msgid "Thousands separator for displayed prices in this country."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-continents-controller.php:345
+msgid "The unit weights are defined in for this country."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-controller.php:93
+msgid "List of supported continents, countries, and states."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-controller.php:97
+msgid "List of supported states in a given country."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-controller.php:101
+msgid "Information about the amount of various objects on this site."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-controller.php:105
+msgid "List of supported currencies."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-controller.php:172
+msgid "Data resource ID."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-controller.php:178
+msgid "Data resource description."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-currencies-controller.php:66
+#: includes/api/class-wc-rest-data-currencies-controller.php:200
+msgid "ISO4217 currency code."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-currencies-controller.php:126
+msgid "There are no currencies matching these parameters."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-currencies-controller.php:206
+msgid "Full name of currency."
+msgstr ""
+
+#: includes/api/class-wc-rest-data-currencies-controller.php:212
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:453
+msgid "Currency symbol."
+msgstr ""
+
+#: includes/api/class-wc-rest-order-notes-controller.php:79
+#: includes/api/class-wc-rest-order-refunds-controller.php:40
#: includes/api/v1/class-wc-rest-order-notes-controller.php:186
#: includes/api/v1/class-wc-rest-order-notes-controller.php:226
#: includes/api/v1/class-wc-rest-order-notes-controller.php:268
#: includes/api/v1/class-wc-rest-order-notes-controller.php:301
#: includes/api/v1/class-wc-rest-order-refunds-controller.php:127
-#: includes/wc-core-functions.php:143 includes/wc-order-functions.php:486
-#: includes/wc-order-functions.php:1019
+#: includes/api/v2/class-wc-rest-order-notes-v2-controller.php:39
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:191
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:273
+#: includes/wc-core-functions.php:143 includes/wc-order-functions.php:488
+#: includes/wc-order-functions.php:1021
msgid "Invalid order ID."
msgstr ""
-#: includes/api/class-wc-rest-order-notes-controller.php:135
+#: includes/api/class-wc-rest-order-notes-controller.php:86
+#: includes/api/legacy/v2/class-wc-api-orders.php:1316
+#: includes/api/legacy/v3/class-wc-api-orders.php:1361
+#: includes/api/v1/class-wc-rest-order-notes-controller.php:233
+msgid "Cannot create order note, please try again."
+msgstr ""
+
+#: includes/api/class-wc-rest-order-notes-controller.php:128
+msgid "Order note author."
+msgstr ""
+
+#: includes/api/class-wc-rest-order-notes-controller.php:134
+#: includes/api/class-wc-rest-order-notes-controller.php:140
#: includes/api/v1/class-wc-rest-order-notes-controller.php:407
+#: includes/api/v2/class-wc-rest-order-notes-v2-controller.php:135
msgid "The date the order note was created, in the site's timezone."
msgstr ""
-#: includes/api/class-wc-rest-order-notes-controller.php:141
+#: includes/api/class-wc-rest-order-notes-controller.php:146
+#: includes/api/v2/class-wc-rest-order-notes-v2-controller.php:141
msgid "The date the order note was created, as GMT."
msgstr ""
-#: includes/api/class-wc-rest-order-notes-controller.php:147
+#: includes/api/class-wc-rest-order-notes-controller.php:152
#: includes/api/v1/class-wc-rest-order-notes-controller.php:70
+#: includes/api/v2/class-wc-rest-order-notes-v2-controller.php:147
msgid "Order note content."
msgstr ""
-#: includes/api/class-wc-rest-order-notes-controller.php:152
+#: includes/api/class-wc-rest-order-notes-controller.php:157
+#: includes/api/v2/class-wc-rest-order-notes-v2-controller.php:152
msgid ""
"If true, the note will be shown to customers and they will be notified. If "
"false, the note will be for admin reference only."
msgstr ""
-#: includes/api/class-wc-rest-order-notes-controller.php:173
-msgid "Limit result to customers or internal notes."
+#: includes/api/class-wc-rest-order-notes-controller.php:163
+msgid ""
+"If true, this note will be attributed to the current user. If false, the "
+"note will be attributed to the system."
msgstr ""
-#: includes/api/class-wc-rest-order-refunds-controller.php:64
-#: includes/api/class-wc-rest-order-refunds-controller.php:88
-#: includes/api/v1/class-wc-rest-order-notes-controller.php:53
-#: includes/api/v1/class-wc-rest-order-notes-controller.php:85
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:61
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:83
-msgid "The order ID."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:195
-#: includes/api/legacy/v2/class-wc-api-orders.php:1518
-#: includes/api/legacy/v2/class-wc-api-orders.php:1680
-#: includes/api/legacy/v2/class-wc-api-orders.php:1741
-#: includes/api/legacy/v3/class-wc-api-orders.php:1565
-#: includes/api/legacy/v3/class-wc-api-orders.php:1727
-#: includes/api/legacy/v3/class-wc-api-orders.php:1788
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:133
-msgid "Invalid order refund ID."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:277
+#: includes/api/class-wc-rest-order-refunds-controller.php:44
#: includes/api/v1/class-wc-rest-order-refunds-controller.php:291
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:277
msgid "Refund amount must be greater than zero."
msgstr ""
-#: includes/api/class-wc-rest-order-refunds-controller.php:296
-#: includes/api/legacy/v2/class-wc-api-orders.php:1617
-#: includes/api/legacy/v3/class-wc-api-orders.php:1664
+#: includes/api/class-wc-rest-order-refunds-controller.php:64
+#: includes/api/legacy/v2/class-wc-api-orders.php:1610
+#: includes/api/legacy/v3/class-wc-api-orders.php:1655
#: includes/api/v1/class-wc-rest-order-refunds-controller.php:308
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:296
msgid "Cannot create order refund, please try again."
msgstr ""
-#: includes/api/class-wc-rest-order-refunds-controller.php:361
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:350
-msgid "The date the order refund was created, in the site's timezone."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:367
-msgid "The date the order refund was created, as GMT."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:373
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:356
-msgid "Refund amount."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:378
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:361
-msgid "Reason for refund."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:383
-msgid "User ID of user who created the refund."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:388
-msgid "If the payment was refunded via the API."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:419
-#: includes/api/class-wc-rest-orders-controller.php:1161
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:366
-#: includes/api/v1/class-wc-rest-orders-controller.php:1205
-msgid "Line items data."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:427
-#: includes/api/class-wc-rest-orders-controller.php:1168
-#: includes/api/class-wc-rest-orders-controller.php:1296
-#: includes/api/class-wc-rest-orders-controller.php:1374
-#: includes/api/class-wc-rest-orders-controller.php:1460
-#: includes/api/class-wc-rest-orders-controller.php:1558
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:374
-#: includes/api/v1/class-wc-rest-orders-controller.php:1212
-#: includes/api/v1/class-wc-rest-orders-controller.php:1346
-#: includes/api/v1/class-wc-rest-orders-controller.php:1398
-#: includes/api/v1/class-wc-rest-orders-controller.php:1458
-#: includes/api/v1/class-wc-rest-orders-controller.php:1529
-msgid "Item ID."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:439
-#: includes/api/class-wc-rest-orders-controller.php:1179
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:392
-#: includes/api/v1/class-wc-rest-orders-controller.php:1230
-#: includes/api/v1/class-wc-rest-report-top-sellers-controller.php:158
-#: includes/cli/class-wc-cli-runner.php:110
-msgid "Product ID."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:445
-#: includes/api/class-wc-rest-orders-controller.php:1184
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:398
-#: includes/api/v1/class-wc-rest-orders-controller.php:1235
-msgid "Variation ID, if applicable."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:451
-#: includes/api/class-wc-rest-orders-controller.php:1189
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:404
-#: includes/api/v1/class-wc-rest-orders-controller.php:1240
-msgid "Quantity ordered."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:457
-#: includes/api/class-wc-rest-orders-controller.php:1194
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:410
-#: includes/api/v1/class-wc-rest-orders-controller.php:1245
-msgid "Tax class of product."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:463
-#: includes/api/class-wc-rest-orders-controller.php:1199
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:422
-#: includes/api/v1/class-wc-rest-orders-controller.php:1257
-msgid "Line subtotal (before discounts)."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:469
-#: includes/api/class-wc-rest-orders-controller.php:1204
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:428
-#: includes/api/v1/class-wc-rest-orders-controller.php:1262
-msgid "Line subtotal tax (before discounts)."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:475
-#: includes/api/class-wc-rest-orders-controller.php:1210
-#: includes/api/class-wc-rest-orders-controller.php:1390
-#: includes/api/class-wc-rest-orders-controller.php:1482
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:434
-#: includes/api/v1/class-wc-rest-orders-controller.php:1267
-#: includes/api/v1/class-wc-rest-orders-controller.php:1414
-#: includes/api/v1/class-wc-rest-orders-controller.php:1480
-msgid "Line total (after discounts)."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:481
-#: includes/api/class-wc-rest-orders-controller.php:1215
-#: includes/api/class-wc-rest-orders-controller.php:1395
-#: includes/api/class-wc-rest-orders-controller.php:1487
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:440
-#: includes/api/v1/class-wc-rest-orders-controller.php:1272
-#: includes/api/v1/class-wc-rest-orders-controller.php:1419
-#: includes/api/v1/class-wc-rest-orders-controller.php:1485
-msgid "Line total tax (after discounts)."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:487
-#: includes/api/class-wc-rest-orders-controller.php:1221
-#: includes/api/class-wc-rest-orders-controller.php:1401
-#: includes/api/class-wc-rest-orders-controller.php:1493
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:446
-#: includes/api/v1/class-wc-rest-orders-controller.php:1277
-#: includes/api/v1/class-wc-rest-orders-controller.php:1425
-#: includes/api/v1/class-wc-rest-orders-controller.php:1490
-msgid "Line taxes."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:495
-#: includes/api/class-wc-rest-orders-controller.php:1229
-#: includes/api/class-wc-rest-orders-controller.php:1308
-#: includes/api/class-wc-rest-orders-controller.php:1409
-#: includes/api/class-wc-rest-orders-controller.php:1501
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:454
-#: includes/api/v1/class-wc-rest-orders-controller.php:1285
-#: includes/api/v1/class-wc-rest-orders-controller.php:1358
-#: includes/api/v1/class-wc-rest-orders-controller.php:1433
-#: includes/api/v1/class-wc-rest-orders-controller.php:1498
-msgid "Tax rate ID."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:501
-#: includes/api/class-wc-rest-orders-controller.php:1234
-#: includes/api/class-wc-rest-orders-controller.php:1415
-#: includes/api/class-wc-rest-orders-controller.php:1507
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:460
-#: includes/api/v1/class-wc-rest-orders-controller.php:1291
-#: includes/api/v1/class-wc-rest-orders-controller.php:1439
-#: includes/api/v1/class-wc-rest-orders-controller.php:1504
-msgid "Tax total."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:507
-#: includes/api/class-wc-rest-orders-controller.php:1239
-#: includes/api/class-wc-rest-orders-controller.php:1513
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:466
-#: includes/api/v1/class-wc-rest-orders-controller.php:1297
-#: includes/api/v1/class-wc-rest-orders-controller.php:1510
-msgid "Tax subtotal."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:545
-#: includes/api/class-wc-rest-orders-controller.php:1273
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:386
-#: includes/api/v1/class-wc-rest-orders-controller.php:1224
-msgid "Product SKU."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:551
-#: includes/api/class-wc-rest-orders-controller.php:1279
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:416
-#: includes/api/v1/class-wc-rest-orders-controller.php:1251
-msgid "Product price."
-msgstr ""
-
-#: includes/api/class-wc-rest-order-refunds-controller.php:560
-msgid "When true, the payment gateway API is used to generate the refund."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:519
-#: includes/api/legacy/class-wc-rest-legacy-orders-controller.php:249
-#: includes/api/legacy/v2/class-wc-api-orders.php:390
-#: includes/api/legacy/v2/class-wc-api-orders.php:542
-#: includes/api/legacy/v3/class-wc-api-orders.php:427
-#: includes/api/legacy/v3/class-wc-api-orders.php:582
-#: includes/api/v1/class-wc-rest-orders-controller.php:534
-msgid "Customer ID is invalid."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:524
-#: includes/api/legacy/class-wc-rest-legacy-orders-controller.php:254
-#: includes/api/v1/class-wc-rest-orders-controller.php:539
-msgid "Customer ID does not belong to this site."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:591
-#: includes/api/v1/class-wc-rest-orders-controller.php:621
-msgid "Product ID or SKU is required."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:683
-#: includes/api/legacy/v2/class-wc-api-orders.php:1043
-#: includes/api/legacy/v3/class-wc-api-orders.php:1090
-#: includes/api/v1/class-wc-rest-orders-controller.php:693
-msgid "Shipping method ID is required."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:707
-#: includes/api/v1/class-wc-rest-orders-controller.php:716
-msgid "Fee name is required."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:731
-#: includes/api/legacy/v2/class-wc-api-orders.php:1166
-#: includes/api/legacy/v3/class-wc-api-orders.php:1213
-#: includes/api/v1/class-wc-rest-orders-controller.php:739
+#: includes/api/class-wc-rest-orders-controller.php:50
+#: includes/api/legacy/v2/class-wc-api-orders.php:1159
+#: includes/api/legacy/v3/class-wc-api-orders.php:1204
+#: includes/api/v1/class-wc-rest-orders-controller.php:744
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:742
msgid "Coupon code is required."
msgstr ""
-#: includes/api/class-wc-rest-orders-controller.php:768
-#: includes/api/legacy/v2/class-wc-api-orders.php:851
-#: includes/api/legacy/v3/class-wc-api-orders.php:897
-#: includes/api/v1/class-wc-rest-orders-controller.php:777
-msgid "Order item ID provided is not associated with order."
+#: includes/api/class-wc-rest-orders-controller.php:160
+#: includes/api/legacy/class-wc-rest-legacy-orders-controller.php:249
+#: includes/api/legacy/v2/class-wc-api-orders.php:388
+#: includes/api/legacy/v2/class-wc-api-orders.php:535
+#: includes/api/legacy/v3/class-wc-api-orders.php:423
+#: includes/api/legacy/v3/class-wc-api-orders.php:573
+#: includes/api/v1/class-wc-rest-orders-controller.php:539
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:530
+msgid "Customer ID is invalid."
msgstr ""
-#: includes/api/class-wc-rest-orders-controller.php:837
-#: includes/api/v1/class-wc-rest-orders-controller.php:925
-msgid "Parent order ID."
+#: includes/api/class-wc-rest-orders-controller.php:165
+#: includes/api/legacy/class-wc-rest-legacy-orders-controller.php:254
+#: includes/api/v1/class-wc-rest-orders-controller.php:544
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:535
+msgid "Customer ID does not belong to this site."
msgstr ""
-#: includes/api/class-wc-rest-orders-controller.php:842
-#: includes/api/v1/class-wc-rest-orders-controller.php:943
-msgid "Order number."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:854
-#: includes/api/v1/class-wc-rest-orders-controller.php:1176
-msgid "Shows where the order was created."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:860
-#: includes/api/v1/class-wc-rest-orders-controller.php:956
-msgid "Version of WooCommerce which last updated the order."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:866
-#: includes/api/v1/class-wc-rest-orders-controller.php:930
-msgid "Order status."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:873
-#: includes/api/v1/class-wc-rest-orders-controller.php:949
-msgid "Currency the order was created with, in ISO format."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:880
-msgid "The date the order was created, in the site's timezone."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:892
-msgid "The date the order was last modified, in the site's timezone."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:898
-#: includes/api/v1/class-wc-rest-orders-controller.php:974
-msgid "The date the order was last modified, as GMT."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:904
-#: includes/api/v1/class-wc-rest-orders-controller.php:986
-msgid "Total discount amount for the order."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:910
-#: includes/api/v1/class-wc-rest-orders-controller.php:992
-msgid "Total discount tax amount for the order."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:916
-#: includes/api/v1/class-wc-rest-orders-controller.php:998
-msgid "Total shipping amount for the order."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:922
-#: includes/api/v1/class-wc-rest-orders-controller.php:1004
-msgid "Total shipping tax amount for the order."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:928
-#: includes/api/v1/class-wc-rest-orders-controller.php:1010
-msgid "Sum of line item taxes only."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:934
-#: includes/api/v1/class-wc-rest-orders-controller.php:1016
-msgid "Grand total."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:940
-#: includes/api/v1/class-wc-rest-orders-controller.php:1022
-msgid "Sum of all taxes."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:946
-#: includes/api/v1/class-wc-rest-orders-controller.php:962
-msgid "True the prices included tax during checkout."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:952
-#: includes/api/v1/class-wc-rest-orders-controller.php:980
-msgid "User ID who owns the order. 0 for guests."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:958
-#: includes/api/v1/class-wc-rest-orders-controller.php:1164
-msgid "Customer's IP address."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:964
-#: includes/api/v1/class-wc-rest-orders-controller.php:1170
-msgid "User agent of the customer."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:970
-#: includes/api/v1/class-wc-rest-orders-controller.php:1182
-msgid "Note left by customer during checkout."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:975
-#: includes/api/v1/class-wc-rest-orders-controller.php:1028
-msgid "Billing address."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1020
-#: includes/api/class-wc-rest-orders-controller.php:1083
-#: includes/api/v1/class-wc-rest-orders-controller.php:1073
-#: includes/api/v1/class-wc-rest-orders-controller.php:1136
-msgid "Country code in ISO 3166-1 alpha-2 format."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1038
-#: includes/api/v1/class-wc-rest-orders-controller.php:1091
-msgid "Shipping address."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1090
-#: includes/api/v1/class-wc-rest-orders-controller.php:1143
-msgid "Payment method ID."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1095
-#: includes/api/v1/class-wc-rest-orders-controller.php:1148
-msgid "Payment method title."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1100
-#: includes/api/v1/class-wc-rest-orders-controller.php:1159
-msgid "Unique transaction ID."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1105
-#: includes/api/v1/class-wc-rest-orders-controller.php:1193
-msgid "The date the order was paid, in the site's timezone."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1111
-msgid "The date the order was paid, as GMT."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1117
-#: includes/api/v1/class-wc-rest-orders-controller.php:1187
-msgid "The date the order was completed, in the site's timezone."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1123
-msgid "The date the order was completed, as GMT."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1129
-#: includes/api/v1/class-wc-rest-orders-controller.php:1199
-msgid "MD5 hash of cart items to ensure orders are not modified."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1288
-#: includes/api/v1/class-wc-rest-orders-controller.php:1338
-msgid "Tax lines data."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1302
-#: includes/api/v1/class-wc-rest-orders-controller.php:1352
-msgid "Tax rate code."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1314
-#: includes/api/v1/class-wc-rest-orders-controller.php:1364
-msgid "Tax rate label."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1320
-#: includes/api/v1/class-wc-rest-orders-controller.php:1370
-msgid "Show if is a compound tax rate."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1326
-#: includes/api/v1/class-wc-rest-orders-controller.php:1376
-msgid "Tax total (not including shipping taxes)."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1332
-#: includes/api/v1/class-wc-rest-orders-controller.php:1382
-msgid "Shipping tax total."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1367
-#: includes/api/v1/class-wc-rest-orders-controller.php:1391
-msgid "Shipping lines data."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1380
-#: includes/api/v1/class-wc-rest-orders-controller.php:1404
-msgid "Shipping method name."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1385
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:47
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:464
-#: includes/api/v1/class-wc-rest-orders-controller.php:1409
-msgid "Shipping method ID."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1453
-#: includes/api/v1/class-wc-rest-orders-controller.php:1451
-msgid "Fee lines data."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1466
-#: includes/api/v1/class-wc-rest-orders-controller.php:1464
-msgid "Fee name."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1471
-#: includes/api/v1/class-wc-rest-orders-controller.php:1469
-msgid "Tax class of fee."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1476
-#: includes/api/v1/class-wc-rest-orders-controller.php:1474
-msgid "Tax status of fee."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1551
-#: includes/api/v1/class-wc-rest-orders-controller.php:1522
-msgid "Coupons line data."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1569
-#: includes/api/v1/class-wc-rest-orders-controller.php:1540
-msgid "Discount total."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1574
-#: includes/api/v1/class-wc-rest-orders-controller.php:1545
-msgid "Discount total tax."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1609
-#: includes/api/v1/class-wc-rest-orders-controller.php:1554
-msgid "List of refunds."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1617
-#: includes/api/v1/class-wc-rest-orders-controller.php:1562
-#: includes/cli/class-wc-cli-runner.php:113
-msgid "Refund ID."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1623
-#: includes/api/v1/class-wc-rest-orders-controller.php:1568
-msgid "Refund reason."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1629
-#: includes/api/v1/class-wc-rest-orders-controller.php:1574
-msgid "Refund total."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1638
-#: includes/api/v1/class-wc-rest-orders-controller.php:1153
-msgid ""
-"Define if the order is paid. It will set the status to processing and "
-"reduce stock items."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1659
-#: includes/api/v1/class-wc-rest-orders-controller.php:1598
+#: includes/api/class-wc-rest-orders-controller.php:254
+#: includes/api/v1/class-wc-rest-orders-controller.php:1603
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1675
msgid "Limit result set to orders assigned a specific status."
msgstr ""
-#: includes/api/class-wc-rest-orders-controller.php:1666
-#: includes/api/v1/class-wc-rest-orders-controller.php:1605
-msgid "Limit result set to orders assigned a specific customer."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1672
-#: includes/api/v1/class-wc-rest-orders-controller.php:1611
-msgid "Limit result set to orders assigned a specific product."
-msgstr ""
-
-#: includes/api/class-wc-rest-orders-controller.php:1679
-#: includes/api/v1/class-wc-rest-order-refunds-controller.php:522
-#: includes/api/v1/class-wc-rest-orders-controller.php:1618
-msgid "Number of decimal points to use in each resource."
-msgstr ""
-
-#: includes/api/class-wc-rest-payment-gateways-controller.php:354
+#: includes/api/class-wc-rest-payment-gateways-controller.php:117
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:354
msgid "Payment gateway ID."
msgstr ""
-#: includes/api/class-wc-rest-payment-gateways-controller.php:360
+#: includes/api/class-wc-rest-payment-gateways-controller.php:123
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:360
msgid "Payment gateway title on checkout."
msgstr ""
-#: includes/api/class-wc-rest-payment-gateways-controller.php:365
+#: includes/api/class-wc-rest-payment-gateways-controller.php:128
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:365
msgid "Payment gateway description on checkout."
msgstr ""
-#: includes/api/class-wc-rest-payment-gateways-controller.php:370
+#: includes/api/class-wc-rest-payment-gateways-controller.php:133
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:370
msgid "Payment gateway sort order."
msgstr ""
-#: includes/api/class-wc-rest-payment-gateways-controller.php:378
+#: includes/api/class-wc-rest-payment-gateways-controller.php:141
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:378
msgid "Payment gateway enabled status."
msgstr ""
-#: includes/api/class-wc-rest-payment-gateways-controller.php:383
+#: includes/api/class-wc-rest-payment-gateways-controller.php:146
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:383
msgid "Payment gateway method title."
msgstr ""
-#: includes/api/class-wc-rest-payment-gateways-controller.php:389
+#: includes/api/class-wc-rest-payment-gateways-controller.php:152
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:389
msgid "Payment gateway method description."
msgstr ""
-#: includes/api/class-wc-rest-payment-gateways-controller.php:395
+#: includes/api/class-wc-rest-payment-gateways-controller.php:158
+msgid "Supported features for this payment gateway."
+msgstr ""
+
+#: includes/api/class-wc-rest-payment-gateways-controller.php:167
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:395
msgid "Payment gateway settings."
msgstr ""
-#: includes/api/class-wc-rest-payment-gateways-controller.php:400
-#: includes/api/class-wc-rest-setting-options-controller.php:505
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:487
+#: includes/api/class-wc-rest-payment-gateways-controller.php:172
+#: includes/api/class-wc-rest-setting-options-controller.php:165
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:400
+#: includes/api/v2/class-wc-rest-setting-options-v2-controller.php:505
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:487
msgid "A unique identifier for the setting."
msgstr ""
-#: includes/api/class-wc-rest-payment-gateways-controller.php:406
-#: includes/api/class-wc-rest-setting-options-controller.php:514
-#: includes/api/class-wc-rest-settings-controller.php:204
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:493
+#: includes/api/class-wc-rest-payment-gateways-controller.php:178
+#: includes/api/class-wc-rest-setting-options-controller.php:183
+#: includes/api/class-wc-rest-settings-controller.php:88
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:406
+#: includes/api/v2/class-wc-rest-setting-options-v2-controller.php:514
+#: includes/api/v2/class-wc-rest-settings-v2-controller.php:204
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:493
msgid "A human readable label for the setting used in interfaces."
msgstr ""
-#: includes/api/class-wc-rest-payment-gateways-controller.php:412
-#: includes/api/class-wc-rest-setting-options-controller.php:523
-#: includes/api/class-wc-rest-settings-controller.php:210
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:499
+#: includes/api/class-wc-rest-payment-gateways-controller.php:184
+#: includes/api/class-wc-rest-setting-options-controller.php:192
+#: includes/api/class-wc-rest-settings-controller.php:93
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:412
+#: includes/api/v2/class-wc-rest-setting-options-v2-controller.php:523
+#: includes/api/v2/class-wc-rest-settings-v2-controller.php:210
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:499
msgid "A human readable description for the setting used in interfaces."
msgstr ""
-#: includes/api/class-wc-rest-payment-gateways-controller.php:418
-#: includes/api/class-wc-rest-setting-options-controller.php:561
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:505
+#: includes/api/class-wc-rest-payment-gateways-controller.php:190
+#: includes/api/class-wc-rest-setting-options-controller.php:230
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:418
+#: includes/api/v2/class-wc-rest-setting-options-v2-controller.php:561
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:505
msgid "Type of setting."
msgstr ""
-#: includes/api/class-wc-rest-payment-gateways-controller.php:425
-#: includes/api/class-wc-rest-setting-options-controller.php:532
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:512
+#: includes/api/class-wc-rest-payment-gateways-controller.php:197
+#: includes/api/class-wc-rest-setting-options-controller.php:201
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:425
+#: includes/api/v2/class-wc-rest-setting-options-v2-controller.php:532
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:512
msgid "Setting value."
msgstr ""
-#: includes/api/class-wc-rest-payment-gateways-controller.php:430
-#: includes/api/class-wc-rest-setting-options-controller.php:537
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:517
+#: includes/api/class-wc-rest-payment-gateways-controller.php:202
+#: includes/api/class-wc-rest-setting-options-controller.php:206
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:430
+#: includes/api/v2/class-wc-rest-setting-options-v2-controller.php:537
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:517
msgid "Default value for the setting."
msgstr ""
-#: includes/api/class-wc-rest-payment-gateways-controller.php:436
-#: includes/api/class-wc-rest-setting-options-controller.php:543
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:523
+#: includes/api/class-wc-rest-payment-gateways-controller.php:208
+#: includes/api/class-wc-rest-setting-options-controller.php:212
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:436
+#: includes/api/v2/class-wc-rest-setting-options-v2-controller.php:543
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:523
msgid "Additional help text shown to the user about the setting."
msgstr ""
-#: includes/api/class-wc-rest-payment-gateways-controller.php:442
-#: includes/api/class-wc-rest-setting-options-controller.php:552
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:529
+#: includes/api/class-wc-rest-payment-gateways-controller.php:214
+#: includes/api/class-wc-rest-setting-options-controller.php:221
+#: includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php:442
+#: includes/api/v2/class-wc-rest-setting-options-v2-controller.php:552
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:529
msgid "Placeholder text to be displayed in text inputs."
msgstr ""
#: includes/api/class-wc-rest-product-categories-controller.php:109
-#: includes/api/class-wc-rest-products-controller.php:1812
+#: includes/api/class-wc-rest-products-controller.php:1080
#: includes/api/v1/class-wc-rest-product-categories-controller.php:180
-#: includes/api/v1/class-wc-rest-products-controller.php:2102
+#: includes/api/v1/class-wc-rest-products-controller.php:2107
+#: includes/api/v2/class-wc-rest-product-categories-v2-controller.php:109
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1824
msgid "Category name."
msgstr ""
@@ -16588,11 +16213,13 @@ msgstr ""
#: includes/api/v1/class-wc-rest-product-categories-controller.php:188
#: includes/api/v1/class-wc-rest-product-shipping-classes-controller.php:108
#: includes/api/v1/class-wc-rest-product-tags-controller.php:108
+#: includes/api/v2/class-wc-rest-product-categories-v2-controller.php:117
msgid "An alphanumeric identifier for the resource unique to its type."
msgstr ""
#: includes/api/class-wc-rest-product-categories-controller.php:125
#: includes/api/v1/class-wc-rest-product-categories-controller.php:196
+#: includes/api/v2/class-wc-rest-product-categories-v2-controller.php:125
msgid "The ID for the parent of the resource."
msgstr ""
@@ -16601,88 +16228,116 @@ msgstr ""
#: includes/api/v1/class-wc-rest-product-categories-controller.php:201
#: includes/api/v1/class-wc-rest-product-shipping-classes-controller.php:116
#: includes/api/v1/class-wc-rest-product-tags-controller.php:116
+#: includes/api/v2/class-wc-rest-product-categories-v2-controller.php:130
msgid "HTML description of the resource."
msgstr ""
#: includes/api/class-wc-rest-product-categories-controller.php:138
#: includes/api/v1/class-wc-rest-product-categories-controller.php:209
+#: includes/api/v2/class-wc-rest-product-categories-v2-controller.php:138
msgid "Category archive display type."
msgstr ""
#: includes/api/class-wc-rest-product-categories-controller.php:145
#: includes/api/v1/class-wc-rest-product-categories-controller.php:216
+#: includes/api/v2/class-wc-rest-product-categories-v2-controller.php:145
msgid "Image data."
msgstr ""
#: includes/api/class-wc-rest-product-categories-controller.php:150
-#: includes/api/class-wc-rest-product-variations-controller.php:891
-#: includes/api/class-wc-rest-products-controller.php:1861
+#: includes/api/class-wc-rest-product-variations-controller.php:643
+#: includes/api/class-wc-rest-products-controller.php:1129
#: includes/api/v1/class-wc-rest-product-categories-controller.php:221
-#: includes/api/v1/class-wc-rest-products-controller.php:2151
-#: includes/api/v1/class-wc-rest-products-controller.php:2484
+#: includes/api/v1/class-wc-rest-products-controller.php:2156
+#: includes/api/v1/class-wc-rest-products-controller.php:2489
+#: includes/api/v2/class-wc-rest-product-categories-v2-controller.php:150
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:891
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1873
msgid "Image ID."
msgstr ""
#: includes/api/class-wc-rest-product-categories-controller.php:155
-#: includes/api/class-wc-rest-product-variations-controller.php:896
-#: includes/api/class-wc-rest-products-controller.php:1866
+#: includes/api/class-wc-rest-product-variations-controller.php:648
+#: includes/api/class-wc-rest-products-controller.php:1134
#: includes/api/v1/class-wc-rest-product-categories-controller.php:226
-#: includes/api/v1/class-wc-rest-products-controller.php:2156
-#: includes/api/v1/class-wc-rest-products-controller.php:2489
+#: includes/api/v1/class-wc-rest-products-controller.php:2161
+#: includes/api/v1/class-wc-rest-products-controller.php:2494
+#: includes/api/v2/class-wc-rest-product-categories-v2-controller.php:155
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:896
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1878
msgid "The date the image was created, in the site's timezone."
msgstr ""
#: includes/api/class-wc-rest-product-categories-controller.php:161
-#: includes/api/class-wc-rest-product-variations-controller.php:902
-#: includes/api/class-wc-rest-products-controller.php:1872
+#: includes/api/class-wc-rest-product-variations-controller.php:654
+#: includes/api/class-wc-rest-products-controller.php:1140
+#: includes/api/v2/class-wc-rest-product-categories-v2-controller.php:161
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:902
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1884
msgid "The date the image was created, as GMT."
msgstr ""
#: includes/api/class-wc-rest-product-categories-controller.php:167
-#: includes/api/class-wc-rest-product-variations-controller.php:908
-#: includes/api/class-wc-rest-products-controller.php:1878
+#: includes/api/class-wc-rest-product-variations-controller.php:660
+#: includes/api/class-wc-rest-products-controller.php:1146
#: includes/api/v1/class-wc-rest-product-categories-controller.php:232
-#: includes/api/v1/class-wc-rest-products-controller.php:2162
-#: includes/api/v1/class-wc-rest-products-controller.php:2495
+#: includes/api/v1/class-wc-rest-products-controller.php:2167
+#: includes/api/v1/class-wc-rest-products-controller.php:2500
+#: includes/api/v2/class-wc-rest-product-categories-v2-controller.php:167
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:908
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1890
msgid "The date the image was last modified, in the site's timezone."
msgstr ""
#: includes/api/class-wc-rest-product-categories-controller.php:173
-#: includes/api/class-wc-rest-product-variations-controller.php:914
-#: includes/api/class-wc-rest-products-controller.php:1884
+#: includes/api/class-wc-rest-product-variations-controller.php:666
+#: includes/api/class-wc-rest-products-controller.php:1152
+#: includes/api/v2/class-wc-rest-product-categories-v2-controller.php:173
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:914
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1896
msgid "The date the image was last modified, as GMT."
msgstr ""
#: includes/api/class-wc-rest-product-categories-controller.php:179
-#: includes/api/class-wc-rest-product-variations-controller.php:920
-#: includes/api/class-wc-rest-products-controller.php:1890
+#: includes/api/class-wc-rest-product-variations-controller.php:672
+#: includes/api/class-wc-rest-products-controller.php:1158
#: includes/api/v1/class-wc-rest-product-categories-controller.php:238
-#: includes/api/v1/class-wc-rest-products-controller.php:2168
-#: includes/api/v1/class-wc-rest-products-controller.php:2501
+#: includes/api/v1/class-wc-rest-products-controller.php:2173
+#: includes/api/v1/class-wc-rest-products-controller.php:2506
+#: includes/api/v2/class-wc-rest-product-categories-v2-controller.php:179
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:920
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1902
msgid "Image URL."
msgstr ""
#: includes/api/class-wc-rest-product-categories-controller.php:185
-#: includes/api/class-wc-rest-product-variations-controller.php:926
-#: includes/api/class-wc-rest-products-controller.php:1896
+#: includes/api/class-wc-rest-product-variations-controller.php:678
+#: includes/api/class-wc-rest-products-controller.php:1164
#: includes/api/v1/class-wc-rest-product-categories-controller.php:244
-#: includes/api/v1/class-wc-rest-products-controller.php:2174
-#: includes/api/v1/class-wc-rest-products-controller.php:2507
+#: includes/api/v1/class-wc-rest-products-controller.php:2179
+#: includes/api/v1/class-wc-rest-products-controller.php:2512
+#: includes/api/v2/class-wc-rest-product-categories-v2-controller.php:185
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:926
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1908
msgid "Image name."
msgstr ""
#: includes/api/class-wc-rest-product-categories-controller.php:190
-#: includes/api/class-wc-rest-product-variations-controller.php:931
-#: includes/api/class-wc-rest-products-controller.php:1901
+#: includes/api/class-wc-rest-product-variations-controller.php:683
+#: includes/api/class-wc-rest-products-controller.php:1169
#: includes/api/v1/class-wc-rest-product-categories-controller.php:249
-#: includes/api/v1/class-wc-rest-products-controller.php:2179
-#: includes/api/v1/class-wc-rest-products-controller.php:2512
+#: includes/api/v1/class-wc-rest-products-controller.php:2184
+#: includes/api/v1/class-wc-rest-products-controller.php:2517
+#: includes/api/v2/class-wc-rest-product-categories-v2-controller.php:190
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:931
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1913
msgid "Image alternative text."
msgstr ""
#: includes/api/class-wc-rest-product-categories-controller.php:197
#: includes/api/v1/class-wc-rest-product-attribute-terms-controller.php:225
#: includes/api/v1/class-wc-rest-product-categories-controller.php:256
+#: includes/api/v2/class-wc-rest-product-categories-v2-controller.php:197
msgid "Menu order, used to custom sort the resource."
msgstr ""
@@ -16691,1470 +16346,1061 @@ msgstr ""
#: includes/api/v1/class-wc-rest-product-categories-controller.php:261
#: includes/api/v1/class-wc-rest-product-shipping-classes-controller.php:124
#: includes/api/v1/class-wc-rest-product-tags-controller.php:124
+#: includes/api/v2/class-wc-rest-product-categories-v2-controller.php:202
msgid "Number of published products for the resource."
msgstr ""
-#: includes/api/class-wc-rest-product-reviews-controller.php:45
-#: includes/api/class-wc-rest-product-variations-controller.php:58
-#: includes/api/class-wc-rest-product-variations-controller.php:81
-#: includes/api/class-wc-rest-product-variations-controller.php:126
-#: includes/api/v1/class-wc-rest-product-reviews-controller.php:46
-#: includes/api/v1/class-wc-rest-product-reviews-controller.php:88
-msgid "Unique identifier for the variable product."
+#: includes/api/class-wc-rest-product-reviews-controller.php:55
+msgid "Unique identifier for the product."
msgstr ""
-#: includes/api/class-wc-rest-product-reviews-controller.php:159
-#: includes/api/v1/class-wc-rest-product-reviews-controller.php:532
-msgid "The content of the review."
+#: includes/api/class-wc-rest-product-reviews-controller.php:61
+#: includes/api/v1/class-wc-rest-product-reviews-controller.php:68
+msgid "Review content."
msgstr ""
-#: includes/api/class-wc-rest-product-reviews-controller.php:164
+#: includes/api/class-wc-rest-product-reviews-controller.php:66
+#: includes/api/v1/class-wc-rest-product-reviews-controller.php:73
+msgid "Name of the reviewer."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-reviews-controller.php:71
+#: includes/api/v1/class-wc-rest-product-reviews-controller.php:78
+msgid "Email of the reviewer."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-reviews-controller.php:110
+#: includes/api/v1/class-wc-rest-coupons-controller.php:108
+#: includes/api/v1/class-wc-rest-orders-controller.php:102
+#: includes/api/v1/class-wc-rest-product-reviews-controller.php:118
+#: includes/api/v1/class-wc-rest-products-controller.php:102
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:102
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:108
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:115
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:111
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:87
+#: includes/api/v2/class-wc-rest-shipping-zones-v2-controller.php:77
+msgid "Whether to bypass trash and force deletion."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-reviews-controller.php:187
+#: includes/api/class-wc-rest-settings-controller.php:51
+#: includes/api/v1/class-wc-rest-product-reviews-controller.php:179
+#: includes/api/v2/class-wc-rest-setting-options-v2-controller.php:391
+msgid "Sorry, you cannot edit this resource."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-reviews-controller.php:204
+#: includes/api/v1/class-wc-rest-product-reviews-controller.php:193
+msgid "Sorry, you cannot delete this resource."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-reviews-controller.php:374
+msgid "Cannot create existing product review."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-reviews-controller.php:380
+#: includes/api/class-wc-rest-product-reviews-controller.php:540
+#: includes/api/class-wc-rest-product-reviews-controller.php:1054
+#: includes/api/v1/class-wc-rest-product-reviews-controller.php:209
+#: includes/api/v1/class-wc-rest-product-reviews-controller.php:234
+#: includes/api/v1/class-wc-rest-product-reviews-controller.php:260
+#: includes/api/v1/class-wc-rest-product-reviews-controller.php:315
+msgid "Invalid product ID."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-reviews-controller.php:394
+msgid "Invalid product review content."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-reviews-controller.php:419
+#: includes/api/class-wc-rest-product-reviews-controller.php:565
+msgid "Product review field exceeds maximum length allowed."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-reviews-controller.php:460
+#: includes/api/v1/class-wc-rest-product-reviews-controller.php:277
+msgid "Creating product review failed."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-reviews-controller.php:530
+msgid "Sorry, you are not allowed to change the comment type."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-reviews-controller.php:549
+msgid "Updating review status failed."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-reviews-controller.php:557
+msgid "Invalid revivew content."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-reviews-controller.php:571
+msgid "Updating review failed."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-reviews-controller.php:642
+#. translators: %s: force=true
+msgid "The object does not support trashing. Set '%s' to delete."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-reviews-controller.php:646
+msgid "The object has already been trashed."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-reviews-controller.php:655
+msgid "The object cannot be deleted."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-reviews-controller.php:837
#: includes/api/v1/class-wc-rest-product-reviews-controller.php:537
+#: includes/api/v2/class-wc-rest-product-reviews-v2-controller.php:164
msgid "The date the review was created, in the site's timezone."
msgstr ""
-#: includes/api/class-wc-rest-product-reviews-controller.php:169
+#: includes/api/class-wc-rest-product-reviews-controller.php:843
+#: includes/api/v2/class-wc-rest-product-reviews-v2-controller.php:169
msgid "The date the review was created, as GMT."
msgstr ""
-#: includes/api/class-wc-rest-product-reviews-controller.php:174
-#: includes/api/v1/class-wc-rest-product-reviews-controller.php:542
-msgid "Review rating (0 to 5)."
+#: includes/api/class-wc-rest-product-reviews-controller.php:849
+msgid "Unique identifier for the product that the review belongs to."
msgstr ""
-#: includes/api/class-wc-rest-product-reviews-controller.php:179
+#: includes/api/class-wc-rest-product-reviews-controller.php:854
+msgid "Status of the review"
+msgstr ""
+
+#: includes/api/class-wc-rest-product-reviews-controller.php:861
#: includes/api/v1/class-wc-rest-product-reviews-controller.php:547
+#: includes/api/v2/class-wc-rest-product-reviews-v2-controller.php:179
msgid "Reviewer name."
msgstr ""
-#: includes/api/class-wc-rest-product-reviews-controller.php:184
+#: includes/api/class-wc-rest-product-reviews-controller.php:866
#: includes/api/v1/class-wc-rest-product-reviews-controller.php:552
+#: includes/api/v2/class-wc-rest-product-reviews-v2-controller.php:184
msgid "Reviewer email."
msgstr ""
-#: includes/api/class-wc-rest-product-reviews-controller.php:189
+#: includes/api/class-wc-rest-product-reviews-controller.php:871
+#: includes/api/v1/class-wc-rest-product-reviews-controller.php:532
+#: includes/api/v2/class-wc-rest-product-reviews-v2-controller.php:159
+msgid "The content of the review."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-reviews-controller.php:876
+#: includes/api/v1/class-wc-rest-product-reviews-controller.php:542
+#: includes/api/v2/class-wc-rest-product-reviews-v2-controller.php:174
+msgid "Review rating (0 to 5)."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-reviews-controller.php:881
#: includes/api/v1/class-wc-rest-product-reviews-controller.php:557
+#: includes/api/v2/class-wc-rest-product-reviews-v2-controller.php:189
msgid "Shows if the reviewer bought the product or not."
msgstr ""
-#: includes/api/class-wc-rest-product-variations-controller.php:85
-#: includes/api/v1/class-wc-rest-product-reviews-controller.php:50
-msgid "Unique identifier for the variation."
+#: includes/api/class-wc-rest-product-reviews-controller.php:896
+#. translators: %d: avatar image size in pixels
+msgid "Avatar URL with image size of %d pixels."
msgstr ""
-#: includes/api/class-wc-rest-product-variations-controller.php:167
-msgid "Parent product does not match current variation."
+#: includes/api/class-wc-rest-product-reviews-controller.php:903
+msgid "Avatar URLs for the object reviewer."
msgstr ""
-#: includes/api/class-wc-rest-product-variations-controller.php:663
-#: includes/api/v1/class-wc-rest-products-controller.php:2272
-msgid "The date the variation was created, in the site's timezone."
+#: includes/api/class-wc-rest-product-reviews-controller.php:925
+msgid "Limit response to reviews published after a given ISO8601 compliant date."
msgstr ""
-#: includes/api/class-wc-rest-product-variations-controller.php:669
-#: includes/api/v1/class-wc-rest-products-controller.php:2278
-msgid "The date the variation was last modified, in the site's timezone."
+#: includes/api/class-wc-rest-product-reviews-controller.php:930
+msgid "Limit result set to reviews assigned to specific user IDs."
msgstr ""
-#: includes/api/class-wc-rest-product-variations-controller.php:675
-msgid "Variation description."
+#: includes/api/class-wc-rest-product-reviews-controller.php:937
+msgid "Ensure result set excludes reviews assigned to specific user IDs."
msgstr ""
-#: includes/api/class-wc-rest-product-variations-controller.php:680
-#: includes/api/v1/class-wc-rest-products-controller.php:2284
-msgid "Variation URL."
+#: includes/api/class-wc-rest-product-reviews-controller.php:945
+msgid "Limit result set to that from a specific author email."
msgstr ""
-#: includes/api/class-wc-rest-product-variations-controller.php:687
-#: includes/api/class-wc-rest-products-controller.php:1513
-#: includes/api/v1/class-wc-rest-products-controller.php:1806
-#: includes/api/v1/class-wc-rest-products-controller.php:2291
-msgid "Unique identifier."
+#: includes/api/class-wc-rest-product-reviews-controller.php:950
+msgid "Limit response to reviews published before a given ISO8601 compliant date."
msgstr ""
-#: includes/api/class-wc-rest-product-variations-controller.php:692
-#: includes/api/v1/class-wc-rest-products-controller.php:2296
-msgid "Current variation price."
+#: includes/api/class-wc-rest-product-reviews-controller.php:963
+#: includes/api/v1/class-wc-rest-customers-controller.php:874
+msgid "Limit result set to specific IDs."
msgstr ""
-#: includes/api/class-wc-rest-product-variations-controller.php:698
-#: includes/api/v1/class-wc-rest-products-controller.php:2302
-msgid "Variation regular price."
+#: includes/api/class-wc-rest-product-reviews-controller.php:997
+msgid "Limit result set to reviews assigned to specific product IDs."
msgstr ""
-#: includes/api/class-wc-rest-product-variations-controller.php:703
-#: includes/api/v1/class-wc-rest-products-controller.php:2307
-msgid "Variation sale price."
+#: includes/api/class-wc-rest-product-reviews-controller.php:1005
+msgid "Limit result set to reviews assigned a specific status."
msgstr ""
-#: includes/api/class-wc-rest-product-variations-controller.php:708
-#: includes/api/class-wc-rest-products-controller.php:1534
-msgid "Start date of sale price, in the site's timezone."
+#: includes/api/class-wc-rest-product-reviews-controller.php:1039
+msgid "Invalid review ID."
msgstr ""
-#: includes/api/class-wc-rest-product-variations-controller.php:713
-#: includes/api/class-wc-rest-products-controller.php:1539
-msgid "Start date of sale price, as GMT."
+#: includes/api/class-wc-rest-product-variations-controller.php:237
+#. Translators: %d parent ID.
+msgid "Cannot set attributes due to invalid parent product."
msgstr ""
-#: includes/api/class-wc-rest-product-variations-controller.php:718
-#: includes/api/class-wc-rest-products-controller.php:1544
-msgid "End date of sale price, in the site's timezone."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:723
-#: includes/api/class-wc-rest-products-controller.php:1549
-msgid "End date of sale price, as GMT."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:728
-#: includes/api/v1/class-wc-rest-products-controller.php:2322
-msgid "Shows if the variation is on sale."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:734
-msgid "Define if the variation is visible on the product's page."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:740
-#: includes/api/v1/class-wc-rest-products-controller.php:2328
-msgid "Shows if the variation can be bought."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:746
-#: includes/api/v1/class-wc-rest-products-controller.php:2339
-msgid "If the variation is virtual."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:752
-#: includes/api/v1/class-wc-rest-products-controller.php:2345
-msgid "If the variation is downloadable."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:758
-#: includes/api/class-wc-rest-products-controller.php:1590
-#: includes/api/v1/class-wc-rest-products-controller.php:1873
-#: includes/api/v1/class-wc-rest-products-controller.php:2351
-msgid "List of downloadable files."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:765
-#: includes/api/class-wc-rest-products-controller.php:1597
-#: includes/api/v1/class-wc-rest-products-controller.php:1880
-#: includes/api/v1/class-wc-rest-products-controller.php:2358
-msgid "File MD5 hash."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:784
-#: includes/api/class-wc-rest-products-controller.php:1616
-#: includes/api/v1/class-wc-rest-products-controller.php:1899
-#: includes/api/v1/class-wc-rest-products-controller.php:2377
-msgid "Number of times downloadable files can be downloaded after purchase."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:790
-#: includes/api/class-wc-rest-products-controller.php:1622
-#: includes/api/v1/class-wc-rest-products-controller.php:1905
-#: includes/api/v1/class-wc-rest-products-controller.php:2383
-msgid "Number of days until access to downloadable files expires."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:796
-#: includes/api/class-wc-rest-products-controller.php:1639
-#: includes/api/v1/class-wc-rest-products-controller.php:1929
-#: includes/api/v1/class-wc-rest-products-controller.php:2389
-msgid "Tax status."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:803
-#: includes/api/class-wc-rest-products-controller.php:1646
-#: includes/api/v1/class-wc-rest-products-controller.php:1936
-#: includes/api/v1/class-wc-rest-products-controller.php:2396
-#: includes/api/v1/class-wc-rest-taxes-controller.php:635
-msgid "Tax class."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:808
-#: includes/api/v1/class-wc-rest-products-controller.php:2401
-msgid "Stock management at variation level."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:814
-#: includes/api/class-wc-rest-products-controller.php:1657
-#: includes/api/v1/class-wc-rest-products-controller.php:1947
-#: includes/api/v1/class-wc-rest-products-controller.php:2407
-msgid "Stock quantity."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:819
-#: includes/api/v1/class-wc-rest-products-controller.php:2412
-msgid ""
-"Controls whether or not the variation is listed as \"in stock\" or \"out of "
-"stock\" on the frontend."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:825
-#: includes/api/class-wc-rest-products-controller.php:1668
-#: includes/api/v1/class-wc-rest-products-controller.php:1958
-#: includes/api/v1/class-wc-rest-products-controller.php:2418
-msgid "If managing stock, this controls if backorders are allowed."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:832
-#: includes/api/class-wc-rest-products-controller.php:1675
-#: includes/api/v1/class-wc-rest-products-controller.php:1965
-#: includes/api/v1/class-wc-rest-products-controller.php:2425
-msgid "Shows if backorders are allowed."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:838
-#: includes/api/v1/class-wc-rest-products-controller.php:2431
-msgid "Shows if the variation is on backordered."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:845
-#: includes/api/v1/class-wc-rest-products-controller.php:2438
-#. translators: %s: weight unit
-msgid "Variation weight (%s)."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:850
-#: includes/api/v1/class-wc-rest-products-controller.php:2443
-msgid "Variation dimensions."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:856
-#: includes/api/v1/class-wc-rest-products-controller.php:2449
-#. translators: %s: dimension unit
-msgid "Variation length (%s)."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:862
-#: includes/api/v1/class-wc-rest-products-controller.php:2455
-#. translators: %s: dimension unit
-msgid "Variation width (%s)."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:868
-#: includes/api/v1/class-wc-rest-products-controller.php:2461
-#. translators: %s: dimension unit
-msgid "Variation height (%s)."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:875
-#: includes/api/class-wc-rest-products-controller.php:1736
-#: includes/api/v1/class-wc-rest-products-controller.php:2026
-#: includes/api/v1/class-wc-rest-products-controller.php:2468
-msgid "Shipping class slug."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:880
-#: includes/api/class-wc-rest-products-controller.php:1741
-#: includes/api/v1/class-wc-rest-products-controller.php:2031
-#: includes/api/v1/class-wc-rest-products-controller.php:2473
-msgid "Shipping class ID."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:886
-#: includes/api/v1/class-wc-rest-products-controller.php:2479
-msgid "Variation image data."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:936
-#: includes/api/class-wc-rest-products-controller.php:1906
-#: includes/api/v1/class-wc-rest-products-controller.php:2184
-#: includes/api/v1/class-wc-rest-products-controller.php:2517
-msgid "Image position. 0 means that the image is featured."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:943
-#: includes/api/class-wc-rest-products-controller.php:1914
-#: includes/api/v1/class-wc-rest-products-controller.php:2192
-#: includes/api/v1/class-wc-rest-products-controller.php:2524
-msgid "List of attributes."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:950
-#: includes/api/class-wc-rest-products-controller.php:1921
-#: includes/api/class-wc-rest-products-controller.php:1966
-#: includes/api/v1/class-wc-rest-products-controller.php:2199
-#: includes/api/v1/class-wc-rest-products-controller.php:2241
-#: includes/api/v1/class-wc-rest-products-controller.php:2531
-#: includes/cli/class-wc-cli-runner.php:114
-msgid "Attribute ID."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:955
-#: includes/api/class-wc-rest-products-controller.php:1926
-#: includes/api/class-wc-rest-products-controller.php:1971
-#: includes/api/v1/class-wc-rest-product-attributes-controller.php:462
-#: includes/api/v1/class-wc-rest-products-controller.php:2204
-#: includes/api/v1/class-wc-rest-products-controller.php:2246
-#: includes/api/v1/class-wc-rest-products-controller.php:2536
-msgid "Attribute name."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:960
-#: includes/api/class-wc-rest-products-controller.php:1976
-#: includes/api/v1/class-wc-rest-products-controller.php:2251
-#: includes/api/v1/class-wc-rest-products-controller.php:2541
-msgid "Selected attribute term name."
-msgstr ""
-
-#: includes/api/class-wc-rest-product-variations-controller.php:968
-#: includes/api/class-wc-rest-products-controller.php:2001
-#: includes/api/v1/class-wc-rest-products-controller.php:2561
-msgid "Menu order, used to custom sort products."
-msgstr ""
-
-#: includes/api/class-wc-rest-products-controller.php:411
-#: includes/api/class-wc-rest-products-controller.php:412
-#: includes/api/legacy/v1/class-wc-api-products.php:459
-#: includes/api/legacy/v1/class-wc-api-products.php:460
-#: includes/api/legacy/v2/class-wc-api-products.php:1615
-#: includes/api/legacy/v2/class-wc-api-products.php:1616
-#: includes/api/legacy/v3/class-wc-api-products.php:2119
-#: includes/api/legacy/v3/class-wc-api-products.php:2120
-#: includes/api/v1/class-wc-rest-products-controller.php:313
-#: includes/api/v1/class-wc-rest-products-controller.php:314
-#: includes/wc-product-functions.php:297
-msgid "Placeholder"
-msgstr ""
-
-#: includes/api/class-wc-rest-products-controller.php:1088
+#: includes/api/class-wc-rest-product-variations-controller.php:371
+#: includes/api/class-wc-rest-products-controller.php:251
#: includes/api/v1/class-wc-rest-products-controller.php:867
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1088
+#. translators: %s: attachment ID
+#. translators: %s: image ID
#. translators: %s: attachment id
msgid "#%s is an invalid image ID."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1440
+#: includes/api/class-wc-rest-product-variations-controller.php:414
+#: includes/api/v1/class-wc-rest-products-controller.php:2277
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:663
+msgid "The date the variation was created, in the site's timezone."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:420
+#: includes/api/v1/class-wc-rest-products-controller.php:2283
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:669
+msgid "The date the variation was last modified, in the site's timezone."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:426
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:675
+msgid "Variation description."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:431
+#: includes/api/v1/class-wc-rest-products-controller.php:2289
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:680
+msgid "Variation URL."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:438
+#: includes/api/class-wc-rest-products-controller.php:781
+#: includes/api/v1/class-wc-rest-products-controller.php:1811
+#: includes/api/v1/class-wc-rest-products-controller.php:2296
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:687
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1525
+msgid "Unique identifier."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:443
+#: includes/api/v1/class-wc-rest-products-controller.php:2301
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:692
+msgid "Current variation price."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:449
+#: includes/api/v1/class-wc-rest-products-controller.php:2307
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:698
+msgid "Variation regular price."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:454
+#: includes/api/v1/class-wc-rest-products-controller.php:2312
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:703
+msgid "Variation sale price."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:459
+#: includes/api/class-wc-rest-products-controller.php:802
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:708
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1546
+msgid "Start date of sale price, in the site's timezone."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:464
+#: includes/api/class-wc-rest-products-controller.php:807
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:713
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1551
+msgid "Start date of sale price, as GMT."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:469
+#: includes/api/class-wc-rest-product-variations-controller.php:474
+#: includes/api/class-wc-rest-products-controller.php:812
+#: includes/api/class-wc-rest-products-controller.php:817
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:718
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1556
+msgid "End date of sale price, in the site's timezone."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:479
+#: includes/api/v1/class-wc-rest-products-controller.php:2327
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:728
+msgid "Shows if the variation is on sale."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:485
+msgid "Variation status."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:492
+#: includes/api/v1/class-wc-rest-products-controller.php:2333
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:740
+msgid "Shows if the variation can be bought."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:498
+#: includes/api/v1/class-wc-rest-products-controller.php:2344
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:746
+msgid "If the variation is virtual."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:504
+#: includes/api/v1/class-wc-rest-products-controller.php:2350
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:752
+msgid "If the variation is downloadable."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:510
+#: includes/api/class-wc-rest-products-controller.php:858
+#: includes/api/v1/class-wc-rest-products-controller.php:1878
+#: includes/api/v1/class-wc-rest-products-controller.php:2356
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:758
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1602
+msgid "List of downloadable files."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:517
+#: includes/api/class-wc-rest-products-controller.php:865
+#: includes/api/v1/class-wc-rest-products-controller.php:1885
+#: includes/api/v1/class-wc-rest-products-controller.php:2363
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:765
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1609
+msgid "File MD5 hash."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:523
+#: includes/api/class-wc-rest-products-controller.php:871
+#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:223
+#: includes/api/v1/class-wc-rest-products-controller.php:1891
+#: includes/api/v1/class-wc-rest-products-controller.php:2369
+#: includes/api/v2/class-wc-rest-customer-downloads-v2-controller.php:147
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:771
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1615
+msgid "File name."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:528
+#: includes/api/class-wc-rest-products-controller.php:876
+#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:229
+#: includes/api/v1/class-wc-rest-products-controller.php:1896
+#: includes/api/v1/class-wc-rest-products-controller.php:2374
+#: includes/api/v2/class-wc-rest-customer-downloads-v2-controller.php:153
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:776
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1620
+msgid "File URL."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:536
+#: includes/api/class-wc-rest-products-controller.php:884
+#: includes/api/v1/class-wc-rest-products-controller.php:1904
+#: includes/api/v1/class-wc-rest-products-controller.php:2382
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:784
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1628
+msgid "Number of times downloadable files can be downloaded after purchase."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:542
+#: includes/api/class-wc-rest-products-controller.php:890
+#: includes/api/v1/class-wc-rest-products-controller.php:1910
+#: includes/api/v1/class-wc-rest-products-controller.php:2388
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:790
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1634
+msgid "Number of days until access to downloadable files expires."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:548
+#: includes/api/class-wc-rest-products-controller.php:907
+#: includes/api/v1/class-wc-rest-products-controller.php:1934
+#: includes/api/v1/class-wc-rest-products-controller.php:2394
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:796
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1651
+msgid "Tax status."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:555
+#: includes/api/class-wc-rest-products-controller.php:914
+#: includes/api/v1/class-wc-rest-products-controller.php:1941
+#: includes/api/v1/class-wc-rest-products-controller.php:2401
+#: includes/api/v1/class-wc-rest-taxes-controller.php:635
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:803
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1658
+msgid "Tax class."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:560
+#: includes/api/v1/class-wc-rest-products-controller.php:2406
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:808
+msgid "Stock management at variation level."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:566
+#: includes/api/class-wc-rest-products-controller.php:925
+#: includes/api/v1/class-wc-rest-products-controller.php:1952
+#: includes/api/v1/class-wc-rest-products-controller.php:2412
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:814
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1669
+msgid "Stock quantity."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:571
+#: includes/api/class-wc-rest-products-controller.php:930
+msgid ""
+"Controls the stock status of the product: \"instock\", \"outofstock\" or "
+"\"onbackorder\"."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:577
+#: includes/api/class-wc-rest-products-controller.php:936
+#: includes/api/v1/class-wc-rest-products-controller.php:1963
+#: includes/api/v1/class-wc-rest-products-controller.php:2423
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:825
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1680
+msgid "If managing stock, this controls if backorders are allowed."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:584
+#: includes/api/class-wc-rest-products-controller.php:943
+#: includes/api/v1/class-wc-rest-products-controller.php:1970
+#: includes/api/v1/class-wc-rest-products-controller.php:2430
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:832
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1687
+msgid "Shows if backorders are allowed."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:590
+#: includes/api/v1/class-wc-rest-products-controller.php:2436
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:838
+msgid "Shows if the variation is on backordered."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:597
+#: includes/api/v1/class-wc-rest-products-controller.php:2443
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:845
+#. translators: %s: weight unit
+msgid "Variation weight (%s)."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:602
+#: includes/api/v1/class-wc-rest-products-controller.php:2448
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:850
+msgid "Variation dimensions."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:608
+#: includes/api/v1/class-wc-rest-products-controller.php:2454
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:856
+#. translators: %s: dimension unit
+msgid "Variation length (%s)."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:614
+#: includes/api/v1/class-wc-rest-products-controller.php:2460
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:862
+#. translators: %s: dimension unit
+msgid "Variation width (%s)."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:620
+#: includes/api/v1/class-wc-rest-products-controller.php:2466
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:868
+#. translators: %s: dimension unit
+msgid "Variation height (%s)."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:627
+#: includes/api/class-wc-rest-products-controller.php:1004
+#: includes/api/v1/class-wc-rest-products-controller.php:2031
+#: includes/api/v1/class-wc-rest-products-controller.php:2473
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:875
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1748
+msgid "Shipping class slug."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:632
+#: includes/api/class-wc-rest-products-controller.php:1009
+#: includes/api/v1/class-wc-rest-products-controller.php:2036
+#: includes/api/v1/class-wc-rest-products-controller.php:2478
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:880
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1753
+msgid "Shipping class ID."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:638
+#: includes/api/v1/class-wc-rest-products-controller.php:2484
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:886
+msgid "Variation image data."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:690
+#: includes/api/class-wc-rest-products-controller.php:1177
+#: includes/api/v1/class-wc-rest-products-controller.php:2197
+#: includes/api/v1/class-wc-rest-products-controller.php:2529
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:943
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1926
+msgid "List of attributes."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:697
+#: includes/api/class-wc-rest-products-controller.php:1184
+#: includes/api/class-wc-rest-products-controller.php:1229
+#: includes/api/v1/class-wc-rest-products-controller.php:2204
+#: includes/api/v1/class-wc-rest-products-controller.php:2246
+#: includes/api/v1/class-wc-rest-products-controller.php:2536
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:950
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1933
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1978
+#: includes/cli/class-wc-cli-runner.php:114
+msgid "Attribute ID."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:702
+#: includes/api/class-wc-rest-products-controller.php:1189
+#: includes/api/class-wc-rest-products-controller.php:1234
+#: includes/api/v1/class-wc-rest-product-attributes-controller.php:462
+#: includes/api/v1/class-wc-rest-products-controller.php:2209
+#: includes/api/v1/class-wc-rest-products-controller.php:2251
+#: includes/api/v1/class-wc-rest-products-controller.php:2541
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:955
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1938
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1983
+msgid "Attribute name."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:707
+#: includes/api/class-wc-rest-products-controller.php:1239
+#: includes/api/v1/class-wc-rest-products-controller.php:2256
+#: includes/api/v1/class-wc-rest-products-controller.php:2546
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:960
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1988
+msgid "Selected attribute term name."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:715
+#: includes/api/class-wc-rest-products-controller.php:1265
+#: includes/api/v1/class-wc-rest-products-controller.php:2566
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:968
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2013
+msgid "Menu order, used to custom sort products."
+msgstr ""
+
+#: includes/api/class-wc-rest-product-variations-controller.php:894
+#: includes/api/class-wc-rest-products-controller.php:1311
+msgid "Limit result set to products with specified stock status."
+msgstr ""
+
+#: includes/api/class-wc-rest-products-controller.php:705
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:380
+#: includes/api/v1/class-wc-rest-orders-controller.php:1223
#: includes/api/v1/class-wc-rest-products-controller.php:1745
+#: includes/api/v1/class-wc-rest-report-top-sellers-controller.php:152
+#: includes/api/v2/class-wc-rest-customer-downloads-v2-controller.php:99
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:433
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1185
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1447
+msgid "Product name."
+msgstr ""
+
+#: includes/api/class-wc-rest-products-controller.php:710
+#: includes/api/v1/class-wc-rest-products-controller.php:1750
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1452
msgid "Product slug."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1445
-#: includes/api/v1/class-wc-rest-products-controller.php:1750
+#: includes/api/class-wc-rest-products-controller.php:715
+#: includes/api/v1/class-wc-rest-products-controller.php:1755
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1457
msgid "Product URL."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1452
-#: includes/api/v1/class-wc-rest-products-controller.php:1757
+#: includes/api/class-wc-rest-products-controller.php:722
+#: includes/api/v1/class-wc-rest-products-controller.php:1762
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1464
msgid "The date the product was created, in the site's timezone."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1458
+#: includes/api/class-wc-rest-products-controller.php:727
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1470
msgid "The date the product was created, as GMT."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1464
-#: includes/api/v1/class-wc-rest-products-controller.php:1763
+#: includes/api/class-wc-rest-products-controller.php:732
+#: includes/api/v1/class-wc-rest-products-controller.php:1768
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1476
msgid "The date the product was last modified, in the site's timezone."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1470
+#: includes/api/class-wc-rest-products-controller.php:738
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1482
msgid "The date the product was last modified, as GMT."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1476
-#: includes/api/v1/class-wc-rest-products-controller.php:1769
+#: includes/api/class-wc-rest-products-controller.php:744
+#: includes/api/v1/class-wc-rest-products-controller.php:1774
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1488
msgid "Product type."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1483
-#: includes/api/v1/class-wc-rest-products-controller.php:1776
+#: includes/api/class-wc-rest-products-controller.php:751
+#: includes/api/v1/class-wc-rest-products-controller.php:1781
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1495
msgid "Product status (post status)."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1490
-#: includes/api/v1/class-wc-rest-products-controller.php:1783
+#: includes/api/class-wc-rest-products-controller.php:758
+#: includes/api/v1/class-wc-rest-products-controller.php:1788
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1502
msgid "Featured product."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1496
-#: includes/api/v1/class-wc-rest-products-controller.php:1789
+#: includes/api/class-wc-rest-products-controller.php:764
+#: includes/api/v1/class-wc-rest-products-controller.php:1794
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1508
msgid "Catalog visibility."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1503
-#: includes/api/v1/class-wc-rest-products-controller.php:1796
+#: includes/api/class-wc-rest-products-controller.php:771
+#: includes/api/v1/class-wc-rest-products-controller.php:1801
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1515
msgid "Product description."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1508
-#: includes/api/v1/class-wc-rest-products-controller.php:1801
+#: includes/api/class-wc-rest-products-controller.php:776
+#: includes/api/v1/class-wc-rest-products-controller.php:1806
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1520
msgid "Product short description."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1518
-#: includes/api/v1/class-wc-rest-products-controller.php:1811
+#: includes/api/class-wc-rest-products-controller.php:786
+#: includes/api/v1/class-wc-rest-products-controller.php:1816
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1530
msgid "Current product price."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1524
-#: includes/api/v1/class-wc-rest-products-controller.php:1817
+#: includes/api/class-wc-rest-products-controller.php:792
+#: includes/api/v1/class-wc-rest-products-controller.php:1822
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1536
msgid "Product regular price."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1529
-#: includes/api/v1/class-wc-rest-products-controller.php:1822
+#: includes/api/class-wc-rest-products-controller.php:797
+#: includes/api/v1/class-wc-rest-products-controller.php:1827
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1541
msgid "Product sale price."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1554
-#: includes/api/v1/class-wc-rest-products-controller.php:1837
+#: includes/api/class-wc-rest-products-controller.php:822
+#: includes/api/v1/class-wc-rest-products-controller.php:1842
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1566
msgid "Price formatted in HTML."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1560
-#: includes/api/v1/class-wc-rest-products-controller.php:1843
+#: includes/api/class-wc-rest-products-controller.php:828
+#: includes/api/v1/class-wc-rest-products-controller.php:1848
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1572
msgid "Shows if the product is on sale."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1566
-#: includes/api/v1/class-wc-rest-products-controller.php:1849
+#: includes/api/class-wc-rest-products-controller.php:834
+#: includes/api/v1/class-wc-rest-products-controller.php:1854
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1578
msgid "Shows if the product can be bought."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1572
-#: includes/api/v1/class-wc-rest-products-controller.php:1855
+#: includes/api/class-wc-rest-products-controller.php:840
+#: includes/api/v1/class-wc-rest-products-controller.php:1860
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1584
msgid "Amount of sales."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1578
-#: includes/api/v1/class-wc-rest-products-controller.php:1861
+#: includes/api/class-wc-rest-products-controller.php:846
+#: includes/api/v1/class-wc-rest-products-controller.php:1866
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1590
msgid "If the product is virtual."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1584
-#: includes/api/v1/class-wc-rest-products-controller.php:1867
+#: includes/api/class-wc-rest-products-controller.php:852
+#: includes/api/v1/class-wc-rest-products-controller.php:1872
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1596
msgid "If the product is downloadable."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1628
-#: includes/api/v1/class-wc-rest-products-controller.php:1918
+#: includes/api/class-wc-rest-products-controller.php:896
+#: includes/api/v1/class-wc-rest-products-controller.php:1923
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1640
msgid "Product external URL. Only for external products."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1634
-#: includes/api/v1/class-wc-rest-products-controller.php:1924
+#: includes/api/class-wc-rest-products-controller.php:902
+#: includes/api/v1/class-wc-rest-products-controller.php:1929
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1646
msgid "Product external button text. Only for external products."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1651
-#: includes/api/v1/class-wc-rest-products-controller.php:1941
+#: includes/api/class-wc-rest-products-controller.php:919
+#: includes/api/v1/class-wc-rest-products-controller.php:1946
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1663
msgid "Stock management at product level."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1681
-#: includes/api/v1/class-wc-rest-products-controller.php:1971
+#: includes/api/class-wc-rest-products-controller.php:949
+#: includes/api/v1/class-wc-rest-products-controller.php:1976
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1693
msgid "Shows if the product is on backordered."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1687
-#: includes/api/v1/class-wc-rest-products-controller.php:1977
+#: includes/api/class-wc-rest-products-controller.php:955
+#: includes/api/v1/class-wc-rest-products-controller.php:1982
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1699
msgid "Allow one item to be bought in a single order."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1694
-#: includes/api/v1/class-wc-rest-products-controller.php:1984
+#: includes/api/class-wc-rest-products-controller.php:962
+#: includes/api/v1/class-wc-rest-products-controller.php:1989
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1706
#. translators: %s: weight unit
msgid "Product weight (%s)."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1699
-#: includes/api/v1/class-wc-rest-products-controller.php:1989
+#: includes/api/class-wc-rest-products-controller.php:967
+#: includes/api/v1/class-wc-rest-products-controller.php:1994
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1711
msgid "Product dimensions."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1705
-#: includes/api/v1/class-wc-rest-products-controller.php:1995
+#: includes/api/class-wc-rest-products-controller.php:973
+#: includes/api/v1/class-wc-rest-products-controller.php:2000
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1717
#. translators: %s: dimension unit
msgid "Product length (%s)."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1711
-#: includes/api/v1/class-wc-rest-products-controller.php:2001
+#: includes/api/class-wc-rest-products-controller.php:979
+#: includes/api/v1/class-wc-rest-products-controller.php:2006
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1723
#. translators: %s: dimension unit
msgid "Product width (%s)."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1717
-#: includes/api/v1/class-wc-rest-products-controller.php:2007
+#: includes/api/class-wc-rest-products-controller.php:985
+#: includes/api/v1/class-wc-rest-products-controller.php:2012
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1729
#. translators: %s: dimension unit
msgid "Product height (%s)."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1724
-#: includes/api/v1/class-wc-rest-products-controller.php:2014
+#: includes/api/class-wc-rest-products-controller.php:992
+#: includes/api/v1/class-wc-rest-products-controller.php:2019
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1736
msgid "Shows if the product need to be shipped."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1730
-#: includes/api/v1/class-wc-rest-products-controller.php:2020
+#: includes/api/class-wc-rest-products-controller.php:998
+#: includes/api/v1/class-wc-rest-products-controller.php:2025
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1742
msgid "Shows whether or not the product shipping is taxable."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1747
-#: includes/api/v1/class-wc-rest-products-controller.php:2037
+#: includes/api/class-wc-rest-products-controller.php:1015
+#: includes/api/v1/class-wc-rest-products-controller.php:2042
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1759
msgid "Allow reviews."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1753
-#: includes/api/v1/class-wc-rest-products-controller.php:2043
+#: includes/api/class-wc-rest-products-controller.php:1021
+#: includes/api/v1/class-wc-rest-products-controller.php:2048
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1765
msgid "Reviews average rating."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1759
-#: includes/api/v1/class-wc-rest-products-controller.php:2049
+#: includes/api/class-wc-rest-products-controller.php:1027
+#: includes/api/v1/class-wc-rest-products-controller.php:2054
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1771
msgid "Amount of reviews that the product have."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1765
-#: includes/api/v1/class-wc-rest-products-controller.php:2055
+#: includes/api/class-wc-rest-products-controller.php:1033
+#: includes/api/v1/class-wc-rest-products-controller.php:2060
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1777
msgid "List of related products IDs."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1774
+#: includes/api/class-wc-rest-products-controller.php:1042
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1786
msgid "List of up-sell products IDs."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1782
-#: includes/api/v1/class-wc-rest-products-controller.php:2072
+#: includes/api/class-wc-rest-products-controller.php:1050
+#: includes/api/v1/class-wc-rest-products-controller.php:2077
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1794
msgid "List of cross-sell products IDs."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1790
-#: includes/api/v1/class-wc-rest-products-controller.php:2080
+#: includes/api/class-wc-rest-products-controller.php:1058
+#: includes/api/v1/class-wc-rest-products-controller.php:2085
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1802
msgid "Product parent ID."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1795
-#: includes/api/v1/class-wc-rest-products-controller.php:2085
+#: includes/api/class-wc-rest-products-controller.php:1063
+#: includes/api/v1/class-wc-rest-products-controller.php:2090
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1807
msgid "Optional note to send the customer after purchase."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1800
-#: includes/api/v1/class-wc-rest-products-controller.php:2090
+#: includes/api/class-wc-rest-products-controller.php:1068
+#: includes/api/v1/class-wc-rest-products-controller.php:2095
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1812
msgid "List of categories."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1807
-#: includes/api/v1/class-wc-rest-products-controller.php:2097
+#: includes/api/class-wc-rest-products-controller.php:1075
+#: includes/api/v1/class-wc-rest-products-controller.php:2102
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1819
msgid "Category ID."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1818
-#: includes/api/v1/class-wc-rest-products-controller.php:2108
+#: includes/api/class-wc-rest-products-controller.php:1086
+#: includes/api/v1/class-wc-rest-products-controller.php:2113
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1830
msgid "Category slug."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1827
-#: includes/api/v1/class-wc-rest-products-controller.php:2117
+#: includes/api/class-wc-rest-products-controller.php:1095
+#: includes/api/v1/class-wc-rest-products-controller.php:2122
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1839
msgid "List of tags."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1834
-#: includes/api/v1/class-wc-rest-products-controller.php:2124
+#: includes/api/class-wc-rest-products-controller.php:1102
+#: includes/api/v1/class-wc-rest-products-controller.php:2129
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1846
msgid "Tag ID."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1839
+#: includes/api/class-wc-rest-products-controller.php:1107
#: includes/api/v1/class-wc-rest-product-tags-controller.php:100
-#: includes/api/v1/class-wc-rest-products-controller.php:2129
+#: includes/api/v1/class-wc-rest-products-controller.php:2134
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1851
msgid "Tag name."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1845
-#: includes/api/v1/class-wc-rest-products-controller.php:2135
+#: includes/api/class-wc-rest-products-controller.php:1113
+#: includes/api/v1/class-wc-rest-products-controller.php:2140
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1857
msgid "Tag slug."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1854
-#: includes/api/v1/class-wc-rest-products-controller.php:2144
+#: includes/api/class-wc-rest-products-controller.php:1122
+#: includes/api/v1/class-wc-rest-products-controller.php:2149
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1866
msgid "List of images."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1931
-#: includes/api/v1/class-wc-rest-products-controller.php:2209
+#: includes/api/class-wc-rest-products-controller.php:1194
+#: includes/api/v1/class-wc-rest-products-controller.php:2214
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1943
msgid "Attribute position."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1936
-#: includes/api/v1/class-wc-rest-products-controller.php:2214
+#: includes/api/class-wc-rest-products-controller.php:1199
+#: includes/api/v1/class-wc-rest-products-controller.php:2219
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1948
msgid ""
"Define if the attribute is visible on the \"Additional information\" tab in "
"the product's page."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1942
-#: includes/api/v1/class-wc-rest-products-controller.php:2220
+#: includes/api/class-wc-rest-products-controller.php:1205
+#: includes/api/v1/class-wc-rest-products-controller.php:2225
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1954
msgid "Define if the attribute can be used as variation."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1948
-#: includes/api/v1/class-wc-rest-products-controller.php:2226
+#: includes/api/class-wc-rest-products-controller.php:1211
+#: includes/api/v1/class-wc-rest-products-controller.php:2231
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1960
msgid "List of available term names of the attribute."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1959
-#: includes/api/v1/class-wc-rest-products-controller.php:2234
+#: includes/api/class-wc-rest-products-controller.php:1222
+#: includes/api/v1/class-wc-rest-products-controller.php:2239
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1971
msgid "Defaults variation attributes."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1984
+#: includes/api/class-wc-rest-products-controller.php:1247
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1996
msgid "List of variations IDs."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:1993
-#: includes/api/v1/class-wc-rest-products-controller.php:2552
+#: includes/api/class-wc-rest-products-controller.php:1256
+#: includes/api/v1/class-wc-rest-products-controller.php:2557
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2005
msgid "List of grouped products ID."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:2046
-#: includes/api/v1/class-wc-rest-products-controller.php:2580
-msgid "Limit result set to products with a specific slug."
+#: includes/api/class-wc-rest-report-coupons-totals-controller.php:121
+#: includes/api/class-wc-rest-report-customers-totals-controller.php:132
+#: includes/api/class-wc-rest-report-orders-totals-controller.php:105
+#: includes/api/class-wc-rest-report-products-totals-controller.php:111
+#: includes/api/class-wc-rest-report-reviews-totals-controller.php:110
+#: includes/api/v1/class-wc-rest-reports-controller.php:157
+msgid "An alphanumeric identifier for the resource."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:2052
-#: includes/api/v1/class-wc-rest-products-controller.php:2586
-msgid "Limit result set to products assigned a specific status."
+#: includes/api/class-wc-rest-report-coupons-totals-controller.php:127
+msgid "Coupon type name."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:2059
-#: includes/api/v1/class-wc-rest-products-controller.php:2593
-msgid "Limit result set to products assigned a specific type."
+#: includes/api/class-wc-rest-report-coupons-totals-controller.php:133
+msgid "Amount of coupons."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:2066
-msgid "Limit result set to products with specific SKU(s). Use commas to separate."
+#: includes/api/class-wc-rest-report-customers-totals-controller.php:74
+msgid "Paying customer"
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:2072
-msgid "Limit result set to featured products."
+#: includes/api/class-wc-rest-report-customers-totals-controller.php:79
+msgid "Non-paying customer"
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:2078
-#: includes/api/v1/class-wc-rest-products-controller.php:2600
-msgid "Limit result set to products assigned a specific category ID."
+#: includes/api/class-wc-rest-report-customers-totals-controller.php:138
+msgid "Customer type name."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:2084
-#: includes/api/v1/class-wc-rest-products-controller.php:2606
-msgid "Limit result set to products assigned a specific tag ID."
+#: includes/api/class-wc-rest-report-customers-totals-controller.php:144
+msgid "Amount of customers."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:2090
-#: includes/api/v1/class-wc-rest-products-controller.php:2612
-msgid "Limit result set to products assigned a specific shipping class ID."
+#: includes/api/class-wc-rest-report-orders-totals-controller.php:111
+msgid "Order status name."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:2096
-msgid ""
-"Limit result set to products with a specific attribute. Use the taxonomy "
-"name/attribute slug."
+#: includes/api/class-wc-rest-report-orders-totals-controller.php:117
+msgid "Amount of orders."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:2102
-#: includes/api/v1/class-wc-rest-products-controller.php:2624
-msgid ""
-"Limit result set to products with a specific attribute term ID (required an "
-"assigned attribute)."
+#: includes/api/class-wc-rest-report-products-totals-controller.php:117
+msgid "Product type name."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:2110
-msgid "Limit result set to products with a specific tax class."
+#: includes/api/class-wc-rest-report-products-totals-controller.php:123
+msgid "Amount of products."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:2119
-msgid "Limit result set to products in stock or out of stock."
+#: includes/api/class-wc-rest-report-reviews-totals-controller.php:57
+#: includes/class-wc-embed.php:130 includes/wc-template-functions.php:3186
+#: includes/widgets/class-wc-widget-layered-nav-filters.php:102
+#. translators: %s: average rating
+#. translators: %s: rating
+msgid "Rated %s out of 5"
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:2125
-msgid "Limit result set to products on sale."
+#: includes/api/class-wc-rest-report-reviews-totals-controller.php:116
+msgid "Review type name."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:2131
-msgid "Limit result set to products based on a minimum price."
+#: includes/api/class-wc-rest-report-reviews-totals-controller.php:122
+msgid "Amount of reviews."
msgstr ""
-#: includes/api/class-wc-rest-products-controller.php:2137
-msgid "Limit result set to products based on a maximum price."
+#: includes/api/class-wc-rest-reports-controller.php:39
+msgid "Orders totals."
msgstr ""
-#: includes/api/class-wc-rest-setting-options-controller.php:45
-#: includes/api/class-wc-rest-setting-options-controller.php:62
-#: includes/api/class-wc-rest-setting-options-controller.php:80
-msgid "Settings group ID."
+#: includes/api/class-wc-rest-reports-controller.php:43
+msgid "Products totals."
msgstr ""
-#: includes/api/class-wc-rest-setting-options-controller.php:159
-#: includes/api/class-wc-rest-setting-options-controller.php:165
+#: includes/api/class-wc-rest-reports-controller.php:47
+msgid "Customers totals."
+msgstr ""
+
+#: includes/api/class-wc-rest-reports-controller.php:51
+msgid "Coupons totals."
+msgstr ""
+
+#: includes/api/class-wc-rest-reports-controller.php:55
+msgid "Reviews totals."
+msgstr ""
+
+#: includes/api/class-wc-rest-reports-controller.php:59
+msgid "Categories totals."
+msgstr ""
+
+#: includes/api/class-wc-rest-reports-controller.php:63
+msgid "Tags totals."
+msgstr ""
+
+#: includes/api/class-wc-rest-reports-controller.php:67
+msgid "Attributes totals."
+msgstr ""
+
+#: includes/api/class-wc-rest-setting-options-controller.php:76
+#: includes/api/class-wc-rest-setting-options-controller.php:82
+#: includes/api/v2/class-wc-rest-setting-options-v2-controller.php:159
+#: includes/api/v2/class-wc-rest-setting-options-v2-controller.php:165
msgid "Invalid setting group."
msgstr ""
-#: includes/api/class-wc-rest-setting-options-controller.php:234
-#: includes/api/class-wc-rest-setting-options-controller.php:246
-#: includes/api/class-wc-rest-setting-options-controller.php:252
-msgid "Invalid setting."
+#: includes/api/class-wc-rest-setting-options-controller.php:174
+msgid "An identifier for the group this setting belongs to."
msgstr ""
-#: includes/api/class-wc-rest-setting-options-controller.php:391
-#: includes/api/v1/class-wc-rest-product-reviews-controller.php:179
-msgid "Sorry, you cannot edit this resource."
-msgstr ""
-
-#: includes/api/class-wc-rest-setting-options-controller.php:571
+#: includes/api/class-wc-rest-setting-options-controller.php:240
+#: includes/api/v2/class-wc-rest-setting-options-v2-controller.php:571
msgid ""
"Array of options (key value pairs) for inputs such as select, multiselect, "
"and radio buttons."
msgstr ""
-#: includes/api/class-wc-rest-settings-controller.php:63
-msgid "No setting groups have been registered."
-msgstr ""
-
-#: includes/api/class-wc-rest-settings-controller.php:198
+#: includes/api/class-wc-rest-settings-controller.php:83
+#: includes/api/v2/class-wc-rest-settings-v2-controller.php:198
msgid "A unique identifier that can be used to link settings together."
msgstr ""
-#: includes/api/class-wc-rest-settings-controller.php:216
+#: includes/api/class-wc-rest-settings-controller.php:98
+#: includes/api/v2/class-wc-rest-settings-v2-controller.php:216
msgid "ID of parent grouping."
msgstr ""
-#: includes/api/class-wc-rest-settings-controller.php:222
+#: includes/api/class-wc-rest-settings-controller.php:103
+#: includes/api/v2/class-wc-rest-settings-v2-controller.php:222
msgid "IDs for settings sub groups."
msgstr ""
-#: includes/api/class-wc-rest-shipping-methods-controller.php:198
-msgid "Method ID."
-msgstr ""
-
-#: includes/api/class-wc-rest-shipping-methods-controller.php:204
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:470
-msgid "Shipping method title."
-msgstr ""
-
-#: includes/api/class-wc-rest-shipping-methods-controller.php:210
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:476
-msgid "Shipping method description."
-msgstr ""
-
-#: includes/api/class-wc-rest-shipping-zone-locations-controller.php:29
-#: includes/api/class-wc-rest-shipping-zones-controller.php:54
-msgid "Unique ID for the resource."
-msgstr ""
-
-#: includes/api/class-wc-rest-shipping-zone-locations-controller.php:88
-#: includes/api/class-wc-rest-shipping-zones-controller.php:172
-msgid "The \"locations not covered by your other zones\" zone cannot be updated."
-msgstr ""
-
-#: includes/api/class-wc-rest-shipping-zone-locations-controller.php:169
-msgid "Shipping zone location code."
-msgstr ""
-
-#: includes/api/class-wc-rest-shipping-zone-locations-controller.php:174
-msgid "Shipping zone location type."
-msgstr ""
-
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:29
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:60
-msgid "Unique ID for the zone."
-msgstr ""
-
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:64
-msgid "Unique ID for the instance."
-msgstr ""
-
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:177
-msgid "Resource cannot be created."
-msgstr ""
-
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:230
-msgid "Shipping methods do not support trashing."
-msgstr ""
-
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:436
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:442
-msgid "Shipping method instance ID."
-msgstr ""
-
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:448
-msgid "Shipping method customer facing title."
-msgstr ""
-
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:454
-msgid "Shipping method sort order."
-msgstr ""
-
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:459
-msgid "Shipping method enabled status."
-msgstr ""
-
-#: includes/api/class-wc-rest-shipping-zone-methods-controller.php:482
-msgid "Shipping method settings."
-msgstr ""
-
-#: includes/api/class-wc-rest-shipping-zones-controller.php:41
-#: includes/api/class-wc-rest-shipping-zones-controller.php:287
-msgid "Shipping zone name."
-msgstr ""
-
-#: includes/api/class-wc-rest-shipping-zones-controller.php:154
-msgid ""
-"Resource cannot be created. Check to make sure 'order' and 'name' are "
-"present."
-msgstr ""
-
-#: includes/api/class-wc-rest-shipping-zones-controller.php:214
-msgid "Shipping zones do not support trashing."
-msgstr ""
-
-#: includes/api/class-wc-rest-shipping-zones-controller.php:295
-msgid "Shipping zone order."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:104
-msgid "Environment."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:110
-msgid "Home URL."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:117
-msgid "Site URL."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:124
-msgid "WooCommerce version."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:130
-msgid "Log directory."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:136
-msgid "Is log directory writable?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:142
-msgid "WordPress version."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:148
-msgid "Is WordPress multisite?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:154
-msgid "WordPress memory limit."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:160
-msgid "Is WordPress debug mode active?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:166
-msgid "Are WordPress cron jobs enabled?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:172
-msgid "WordPress language."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:178
-msgid "Server info."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:184
-msgid "PHP version."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:190
-msgid "PHP post max size."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:196
-msgid "PHP max execution time."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:202
-msgid "PHP max input vars."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:208
-msgid "cURL version."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:214
-msgid "Is SUHOSIN installed?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:220
-msgid "Max upload size."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:226
-msgid "MySQL version."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:232
-msgid "MySQL version string."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:238
-msgid "Default timezone."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:244
-msgid "Is fsockopen/cURL enabled?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:250
-msgid "Is SoapClient class enabled?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:256
-msgid "Is DomDocument class enabled?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:262
-msgid "Is GZip enabled?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:268
-msgid "Is mbstring enabled?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:274
-msgid "Remote POST successful?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:280
-msgid "Remote POST response."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:286
-msgid "Remote GET successful?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:292
-msgid "Remote GET response."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:300
-msgid "Database."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:306
-msgid "WC database version."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:312
-msgid "Database prefix."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:318
-msgid "MaxMind GeoIP database."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:324
-msgid "Database tables."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:335
-msgid "Active plugins."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:344
-msgid "Theme."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:350
-msgid "Theme name."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:356
-msgid "Theme version."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:362
-msgid "Latest version of theme."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:368
-msgid "Theme author URL."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:375
-msgid "Is this theme a child theme?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:381
-msgid "Does the theme declare WooCommerce support?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:387
-msgid "Does the theme have a woocommerce.php file?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:393
-msgid "Does this theme have outdated templates?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:399
-msgid "Template overrides."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:408
-msgid "Parent theme name."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:414
-msgid "Parent theme version."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:420
-msgid "Parent theme author URL."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:429
-msgid "Settings."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:435
-msgid "REST API enabled?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:441
-msgid "SSL forced?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:447
-msgid "Currency."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:453
-msgid "Currency symbol."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:459
-msgid "Currency position."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:465
-msgid "Thousand separator."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:471
-msgid "Decimal separator."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:477
-msgid "Number of decimals."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:483
-msgid "Geolocation enabled?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:489
-msgid "Taxonomy terms for product/order statuses."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:498
-msgid "Terms in the product visibility taxonomy."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:509
-msgid "Security."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:521
-msgid "Hide errors from visitors?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-controller.php:529
-msgid "WooCommerce pages."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:109
-#: includes/api/v1/class-wc-rest-product-attributes-controller.php:177
-msgid "Sorry, you cannot update resource."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:123
-msgid "WooCommerce transients"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:124
-#: includes/api/class-wc-rest-system-status-tools-controller.php:129
-msgid "Clear transients"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:125
-msgid "This tool will clear the product/shop transients cache."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:128
-msgid "Expired transients"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:130
-msgid "This tool will clear ALL expired transients from WordPress."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:133
-msgid "Orphaned variations"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:134
-msgid "Delete orphaned variations"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:135
-msgid "This tool will delete all variations which have no parent."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:138
-msgid "Used-up download permissions"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:139
-msgid "Clean up download permissions"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:140
-msgid ""
-"This tool will delete expired download permissions and permissions with 0 "
-"remaining downloads."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:143
-msgid "Order address indexes"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:144
-msgid "Index orders"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:145
-msgid ""
-"This tool will add address indexes to orders that do not have them yet. "
-"This improves order search results."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:148
-msgid "Term counts"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:149
-msgid "Recount terms"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:150
-msgid ""
-"This tool will recount product terms - useful when changing your settings "
-"in a way which hides products from the catalog."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:153
-msgid "Capabilities"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:154
-msgid "Reset capabilities"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:155
-msgid ""
-"This tool will reset the admin, customer and shop_manager roles to default. "
-"Use this if your users cannot access all of the WooCommerce admin pages."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:158
-msgid "Clear customer sessions"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:159
-#: templates/single-product/add-to-cart/variable.php:44
-msgid "Clear"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:163
-msgid ""
-"This tool will delete all customer session data from the database, "
-"including current carts and saved carts in the database."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:167
-msgid "Create default WooCommerce pages"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:168
-msgid "Create pages"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:172
-msgid ""
-"This tool will install all the missing WooCommerce pages. Pages already "
-"defined and set up will not be replaced."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:176
-msgid "Delete WooCommerce tax rates"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:177
-msgid "Delete tax rates"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:181
-msgid ""
-"This option will delete ALL of your tax rates, use with caution. This "
-"action cannot be reversed."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:185
-msgid "Reset usage tracking"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:187
-msgid ""
-"This will reset your usage tracking settings, causing it to show the opt-in "
-"banner again and not sending any data."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:190
-msgid "Regenerate shop thumbnails"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:191
-msgid "Regenerate"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:192
-msgid ""
-"This will regenerate all shop thumbnails to match your theme and/or image "
-"settings."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:238
-#: includes/api/class-wc-rest-system-status-tools-controller.php:262
-msgid "Invalid tool ID."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:320
-msgid "A unique identifier for the tool."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:328
-msgid "Tool name."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:336
-msgid "What running the tool will do."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:344
-msgid "Tool description."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:352
-msgid "Did the tool run successfully?"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:357
-msgid "Tool return message."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:413
-msgid "Product transients cleared"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:418
-#. translators: %d: amount of expired transients
-msgid "%d transients rows cleared"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:432
-#. translators: %d: amount of orphaned variations
-msgid "%d orphaned variations deleted"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:447
-#. translators: %d: amount of permissions
-msgid "%d permissions deleted"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:467
-#. translators: %d: amount of indexes
-msgid "%d indexes added"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:474
-msgid "Roles successfully reset"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:492
-msgid "Terms successfully recounted"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:500
-#. translators: %d: amount of sessions
-msgid "Deleted all active sessions, and %d saved carts."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:505
-msgid "All missing WooCommerce pages successfully installed"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:512
-msgid "Tax rates successfully deleted"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:522
-msgid "Usage tracking settings successfully reset."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:527
-msgid "Thumbnail regeneration has been scheduled to run in the background."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:541
-#. translators: %s: callback string
-msgid "There was an error calling %s"
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:543
-msgid "Tool ran."
-msgstr ""
-
-#: includes/api/class-wc-rest-system-status-tools-controller.php:547
-msgid "There was an error calling this tool. There is no callback present."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhook-deliveries-controller.php:76
-#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:232
-msgid "The delivery duration, in seconds."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhook-deliveries-controller.php:82
-#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:238
-msgid ""
-"A friendly summary of the response including the HTTP response code, "
-"message, and body."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhook-deliveries-controller.php:88
-#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:244
-msgid "The URL where the webhook was delivered."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhook-deliveries-controller.php:95
-#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:251
-msgid "Request headers."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhook-deliveries-controller.php:104
-#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:260
-msgid "Request body."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhook-deliveries-controller.php:110
-#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:266
-msgid "The HTTP response code from the receiving server."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhook-deliveries-controller.php:116
-#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:272
-msgid "The HTTP response message from the receiving server."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhook-deliveries-controller.php:122
-#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:278
-msgid "Array of the response headers from the receiving server."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhook-deliveries-controller.php:131
-#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:287
-msgid "The response body from the receiving server."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhook-deliveries-controller.php:137
-#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:293
-msgid "The date the webhook delivery was logged, in the site's timezone."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhook-deliveries-controller.php:143
-msgid "The date the webhook delivery was logged, as GMT."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhooks-controller.php:104
-#: includes/api/v1/class-wc-rest-webhooks-controller.php:621
-msgid "A friendly name for the webhook."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhooks-controller.php:109
-#: includes/api/v1/class-wc-rest-webhooks-controller.php:626
-msgid "Webhook status."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhooks-controller.php:119
-#: includes/api/v1/class-wc-rest-webhooks-controller.php:63
-#: includes/api/v1/class-wc-rest-webhooks-controller.php:636
-msgid "Webhook topic."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhooks-controller.php:124
-#: includes/api/v1/class-wc-rest-webhooks-controller.php:641
-msgid "Webhook resource."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhooks-controller.php:130
-#: includes/api/v1/class-wc-rest-webhooks-controller.php:647
-msgid "Webhook event."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhooks-controller.php:136
-#: includes/api/v1/class-wc-rest-webhooks-controller.php:653
-msgid "WooCommerce action names associated with the webhook."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhooks-controller.php:145
-#: includes/api/v1/class-wc-rest-webhooks-controller.php:662
-msgid "The URL where the webhook payload is delivered."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhooks-controller.php:152
-#: includes/api/v1/class-wc-rest-webhooks-controller.php:669
-msgid ""
-"Secret key used to generate a hash of the delivered webhook and provided in "
-"the request headers. This will default to a MD5 hash from the current "
-"user's ID|username if not provided."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhooks-controller.php:157
-#: includes/api/v1/class-wc-rest-webhooks-controller.php:674
-msgid "The date the webhook was created, in the site's timezone."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhooks-controller.php:163
-msgid "The date the webhook was created, as GMT."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhooks-controller.php:169
-#: includes/api/v1/class-wc-rest-webhooks-controller.php:680
-msgid "The date the webhook was last modified, in the site's timezone."
-msgstr ""
-
-#: includes/api/class-wc-rest-webhooks-controller.php:175
-msgid "The date the webhook was last modified, as GMT."
+#: includes/api/legacy/class-wc-rest-legacy-coupons-controller.php:113
+#: includes/api/v1/class-wc-rest-coupons-controller.php:253
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:271
+msgid "The coupon code cannot be empty."
+msgstr ""
+
+#: includes/api/legacy/class-wc-rest-legacy-coupons-controller.php:129
+#: includes/api/legacy/v2/class-wc-api-coupons.php:233
+#: includes/api/legacy/v2/class-wc-api-coupons.php:344
+#: includes/api/legacy/v3/class-wc-api-coupons.php:231
+#: includes/api/legacy/v3/class-wc-api-coupons.php:342
+#: includes/api/v1/class-wc-rest-coupons-controller.php:269
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:286
+msgid "The coupon code already exists"
msgstr ""
#: includes/api/legacy/class-wc-rest-legacy-products-controller.php:532
-#: includes/api/legacy/v2/class-wc-api-products.php:1288
-#: includes/api/legacy/v3/class-wc-api-products.php:1783
+#: includes/api/legacy/v2/class-wc-api-products.php:1293
+#: includes/api/legacy/v3/class-wc-api-products.php:1788
#: includes/api/v1/class-wc-rest-products-controller.php:1372
#. translators: 1: variation id 2: product name
msgid "Variation #%1$s of %2$s"
@@ -18261,6 +17507,20 @@ msgstr ""
msgid "You do not have permission to read the products count"
msgstr ""
+#: includes/api/legacy/v1/class-wc-api-products.php:459
+#: includes/api/legacy/v1/class-wc-api-products.php:460
+#: includes/api/legacy/v2/class-wc-api-products.php:1620
+#: includes/api/legacy/v2/class-wc-api-products.php:1621
+#: includes/api/legacy/v3/class-wc-api-products.php:2124
+#: includes/api/legacy/v3/class-wc-api-products.php:2125
+#: includes/api/v1/class-wc-rest-products-controller.php:313
+#: includes/api/v1/class-wc-rest-products-controller.php:314
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:411
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:412
+#: includes/wc-product-functions.php:309
+msgid "Placeholder"
+msgstr ""
+
#: includes/api/legacy/v1/class-wc-api-reports.php:475
#: includes/api/legacy/v2/class-wc-api-reports.php:322
#: includes/api/legacy/v3/class-wc-api-reports.php:326
@@ -18318,32 +17578,32 @@ msgid "The customer cannot be deleted"
msgstr ""
#: includes/api/legacy/v1/class-wc-api-resource.php:323
-#: includes/api/legacy/v2/class-wc-api-products.php:450
+#: includes/api/legacy/v2/class-wc-api-products.php:455
#: includes/api/legacy/v2/class-wc-api-resource.php:382
-#: includes/api/legacy/v3/class-wc-api-products.php:509
-#: includes/api/legacy/v3/class-wc-api-products.php:3057
+#: includes/api/legacy/v3/class-wc-api-products.php:514
+#: includes/api/legacy/v3/class-wc-api-products.php:3062
#: includes/api/legacy/v3/class-wc-api-resource.php:384
msgid "This %s cannot be deleted"
msgstr ""
#: includes/api/legacy/v1/class-wc-api-resource.php:327
-#: includes/api/legacy/v2/class-wc-api-products.php:459
+#: includes/api/legacy/v2/class-wc-api-products.php:464
#: includes/api/legacy/v2/class-wc-api-resource.php:386
-#: includes/api/legacy/v3/class-wc-api-products.php:518
+#: includes/api/legacy/v3/class-wc-api-products.php:523
#: includes/api/legacy/v3/class-wc-api-resource.php:388
msgid "Permanently deleted %s"
msgstr ""
#: includes/api/legacy/v1/class-wc-api-resource.php:333
-#: includes/api/legacy/v2/class-wc-api-products.php:463
-#: includes/api/legacy/v2/class-wc-api-products.php:2225
+#: includes/api/legacy/v2/class-wc-api-products.php:468
+#: includes/api/legacy/v2/class-wc-api-products.php:2230
#: includes/api/legacy/v2/class-wc-api-resource.php:390
-#: includes/api/legacy/v3/class-wc-api-products.php:522
-#: includes/api/legacy/v3/class-wc-api-products.php:866
-#: includes/api/legacy/v3/class-wc-api-products.php:1058
-#: includes/api/legacy/v3/class-wc-api-products.php:2786
-#: includes/api/legacy/v3/class-wc-api-products.php:3064
-#: includes/api/legacy/v3/class-wc-api-products.php:3375
+#: includes/api/legacy/v3/class-wc-api-products.php:527
+#: includes/api/legacy/v3/class-wc-api-products.php:871
+#: includes/api/legacy/v3/class-wc-api-products.php:1063
+#: includes/api/legacy/v3/class-wc-api-products.php:2791
+#: includes/api/legacy/v3/class-wc-api-products.php:3069
+#: includes/api/legacy/v3/class-wc-api-products.php:3380
#: includes/api/legacy/v3/class-wc-api-resource.php:394
#: includes/api/legacy/v3/class-wc-api-taxes.php:354
#: includes/api/legacy/v3/class-wc-api-taxes.php:665
@@ -18378,13 +17638,13 @@ msgstr ""
#: includes/api/legacy/v2/class-wc-api-coupons.php:226
#: includes/api/legacy/v2/class-wc-api-customers.php:363
#: includes/api/legacy/v2/class-wc-api-products.php:228
-#: includes/api/legacy/v2/class-wc-api-products.php:1981
+#: includes/api/legacy/v2/class-wc-api-products.php:1986
#: includes/api/legacy/v2/class-wc-api-server.php:430
#: includes/api/legacy/v3/class-wc-api-coupons.php:224
#: includes/api/legacy/v3/class-wc-api-customers.php:364
#: includes/api/legacy/v3/class-wc-api-products.php:277
-#: includes/api/legacy/v3/class-wc-api-products.php:2539
-#: includes/api/legacy/v3/class-wc-api-products.php:2938
+#: includes/api/legacy/v3/class-wc-api-products.php:2544
+#: includes/api/legacy/v3/class-wc-api-products.php:2943
#: includes/api/legacy/v3/class-wc-api-server.php:431
#: includes/api/legacy/v3/class-wc-api-taxes.php:575
#: includes/class-wc-auth.php:171
@@ -18394,23 +17654,23 @@ msgstr ""
#: includes/api/legacy/v2/class-wc-api-coupons.php:212
#: includes/api/legacy/v2/class-wc-api-customers.php:349
-#: includes/api/legacy/v2/class-wc-api-orders.php:367
-#: includes/api/legacy/v2/class-wc-api-orders.php:1292
-#: includes/api/legacy/v2/class-wc-api-orders.php:1585
+#: includes/api/legacy/v2/class-wc-api-orders.php:365
+#: includes/api/legacy/v2/class-wc-api-orders.php:1285
+#: includes/api/legacy/v2/class-wc-api-orders.php:1578
#: includes/api/legacy/v2/class-wc-api-products.php:214
-#: includes/api/legacy/v2/class-wc-api-products.php:2019
+#: includes/api/legacy/v2/class-wc-api-products.php:2024
#: includes/api/legacy/v2/class-wc-api-webhooks.php:171
#: includes/api/legacy/v3/class-wc-api-coupons.php:210
#: includes/api/legacy/v3/class-wc-api-customers.php:350
-#: includes/api/legacy/v3/class-wc-api-orders.php:404
-#: includes/api/legacy/v3/class-wc-api-orders.php:1339
-#: includes/api/legacy/v3/class-wc-api-orders.php:1632
+#: includes/api/legacy/v3/class-wc-api-orders.php:400
+#: includes/api/legacy/v3/class-wc-api-orders.php:1330
+#: includes/api/legacy/v3/class-wc-api-orders.php:1623
#: includes/api/legacy/v3/class-wc-api-products.php:263
-#: includes/api/legacy/v3/class-wc-api-products.php:702
-#: includes/api/legacy/v3/class-wc-api-products.php:959
-#: includes/api/legacy/v3/class-wc-api-products.php:2577
-#: includes/api/legacy/v3/class-wc-api-products.php:2918
-#: includes/api/legacy/v3/class-wc-api-products.php:3261
+#: includes/api/legacy/v3/class-wc-api-products.php:707
+#: includes/api/legacy/v3/class-wc-api-products.php:964
+#: includes/api/legacy/v3/class-wc-api-products.php:2582
+#: includes/api/legacy/v3/class-wc-api-products.php:2923
+#: includes/api/legacy/v3/class-wc-api-products.php:3266
#: includes/api/legacy/v3/class-wc-api-taxes.php:184
#: includes/api/legacy/v3/class-wc-api-taxes.php:564
#: includes/api/legacy/v3/class-wc-api-webhooks.php:171
@@ -18431,23 +17691,23 @@ msgstr ""
#: includes/api/legacy/v2/class-wc-api-coupons.php:324
#: includes/api/legacy/v2/class-wc-api-customers.php:404
-#: includes/api/legacy/v2/class-wc-api-orders.php:511
-#: includes/api/legacy/v2/class-wc-api-orders.php:1351
-#: includes/api/legacy/v2/class-wc-api-orders.php:1664
+#: includes/api/legacy/v2/class-wc-api-orders.php:504
+#: includes/api/legacy/v2/class-wc-api-orders.php:1344
+#: includes/api/legacy/v2/class-wc-api-orders.php:1657
#: includes/api/legacy/v2/class-wc-api-products.php:323
-#: includes/api/legacy/v2/class-wc-api-products.php:2102
+#: includes/api/legacy/v2/class-wc-api-products.php:2107
#: includes/api/legacy/v2/class-wc-api-webhooks.php:242
#: includes/api/legacy/v3/class-wc-api-coupons.php:322
#: includes/api/legacy/v3/class-wc-api-customers.php:405
-#: includes/api/legacy/v3/class-wc-api-orders.php:551
-#: includes/api/legacy/v3/class-wc-api-orders.php:1398
-#: includes/api/legacy/v3/class-wc-api-orders.php:1711
+#: includes/api/legacy/v3/class-wc-api-orders.php:542
+#: includes/api/legacy/v3/class-wc-api-orders.php:1389
+#: includes/api/legacy/v3/class-wc-api-orders.php:1702
#: includes/api/legacy/v3/class-wc-api-products.php:377
-#: includes/api/legacy/v3/class-wc-api-products.php:779
-#: includes/api/legacy/v3/class-wc-api-products.php:1004
-#: includes/api/legacy/v3/class-wc-api-products.php:2661
-#: includes/api/legacy/v3/class-wc-api-products.php:2983
-#: includes/api/legacy/v3/class-wc-api-products.php:3319
+#: includes/api/legacy/v3/class-wc-api-products.php:784
+#: includes/api/legacy/v3/class-wc-api-products.php:1009
+#: includes/api/legacy/v3/class-wc-api-products.php:2666
+#: includes/api/legacy/v3/class-wc-api-products.php:2988
+#: includes/api/legacy/v3/class-wc-api-products.php:3324
#: includes/api/legacy/v3/class-wc-api-taxes.php:254
#: includes/api/legacy/v3/class-wc-api-webhooks.php:242
msgid "No %1$s data specified to edit %1$s"
@@ -18462,12 +17722,12 @@ msgstr ""
#: includes/api/legacy/v2/class-wc-api-coupons.php:521
#: includes/api/legacy/v2/class-wc-api-customers.php:784
-#: includes/api/legacy/v2/class-wc-api-orders.php:1781
-#: includes/api/legacy/v2/class-wc-api-products.php:2298
+#: includes/api/legacy/v2/class-wc-api-orders.php:1774
+#: includes/api/legacy/v2/class-wc-api-products.php:2303
#: includes/api/legacy/v3/class-wc-api-coupons.php:521
#: includes/api/legacy/v3/class-wc-api-customers.php:774
-#: includes/api/legacy/v3/class-wc-api-orders.php:1828
-#: includes/api/legacy/v3/class-wc-api-products.php:3111
+#: includes/api/legacy/v3/class-wc-api-orders.php:1819
+#: includes/api/legacy/v3/class-wc-api-products.php:3116
#: includes/api/legacy/v3/class-wc-api-taxes.php:457
msgid "No %1$s data specified to create/edit %1$s"
msgstr ""
@@ -18485,192 +17745,211 @@ msgstr ""
msgid "This resource cannot be created."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:374
-#: includes/api/legacy/v3/class-wc-api-orders.php:411
+#: includes/api/legacy/v2/class-wc-api-orders.php:372
+#: includes/api/legacy/v3/class-wc-api-orders.php:407
msgid "You do not have permission to create orders"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:400
-#: includes/api/legacy/v3/class-wc-api-orders.php:437
+#: includes/api/legacy/v2/class-wc-api-orders.php:398
+#: includes/api/legacy/v3/class-wc-api-orders.php:433
msgid "Cannot create order: %s"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:434
-#: includes/api/legacy/v3/class-wc-api-orders.php:476
+#: includes/api/legacy/v2/class-wc-api-orders.php:432
+#: includes/api/legacy/v3/class-wc-api-orders.php:472
msgid "Payment method ID and title are required"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:450
-#: includes/api/legacy/v2/class-wc-api-orders.php:607
-#: includes/api/legacy/v3/class-wc-api-orders.php:492
-#: includes/api/legacy/v3/class-wc-api-orders.php:646
+#: includes/api/legacy/v2/class-wc-api-orders.php:448
+#: includes/api/legacy/v2/class-wc-api-orders.php:600
+#: includes/api/legacy/v3/class-wc-api-orders.php:488
+#: includes/api/legacy/v3/class-wc-api-orders.php:637
msgid "Provided order currency is invalid."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:528
-#: includes/api/legacy/v2/class-wc-api-orders.php:1598
-#: includes/api/legacy/v3/class-wc-api-orders.php:568
-#: includes/api/legacy/v3/class-wc-api-orders.php:1645
+#: includes/api/legacy/v2/class-wc-api-orders.php:521
+#: includes/api/legacy/v2/class-wc-api-orders.php:1591
+#: includes/api/legacy/v3/class-wc-api-orders.php:559
+#: includes/api/legacy/v3/class-wc-api-orders.php:1636
msgid "Order ID is invalid"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:872
-#: includes/api/legacy/v3/class-wc-api-orders.php:918
+#: includes/api/legacy/v2/class-wc-api-orders.php:844
+#: includes/api/legacy/v3/class-wc-api-orders.php:888
+#: includes/api/v1/class-wc-rest-orders-controller.php:782
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:779
+msgid "Order item ID provided is not associated with order."
+msgstr ""
+
+#: includes/api/legacy/v2/class-wc-api-orders.php:865
+#: includes/api/legacy/v3/class-wc-api-orders.php:909
msgid "Product ID or SKU is required"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:882
-#: includes/api/legacy/v3/class-wc-api-orders.php:928
+#: includes/api/legacy/v2/class-wc-api-orders.php:875
+#: includes/api/legacy/v3/class-wc-api-orders.php:919
msgid "Product ID provided does not match this line item"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:897
-#: includes/api/legacy/v3/class-wc-api-orders.php:943
+#: includes/api/legacy/v2/class-wc-api-orders.php:890
+#: includes/api/legacy/v3/class-wc-api-orders.php:934
msgid "The product variation is invalid"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:907
-#: includes/api/legacy/v3/class-wc-api-orders.php:953
+#: includes/api/legacy/v2/class-wc-api-orders.php:900
+#: includes/api/legacy/v3/class-wc-api-orders.php:944
msgid "Product is invalid."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:912
-#: includes/api/legacy/v3/class-wc-api-orders.php:958
+#: includes/api/legacy/v2/class-wc-api-orders.php:905
+#: includes/api/legacy/v3/class-wc-api-orders.php:949
msgid "Product quantity must be a positive float."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:917
-#: includes/api/legacy/v3/class-wc-api-orders.php:963
+#: includes/api/legacy/v2/class-wc-api-orders.php:910
+#: includes/api/legacy/v3/class-wc-api-orders.php:954
msgid "Product quantity is required."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:960
-#: includes/api/legacy/v3/class-wc-api-orders.php:1007
+#: includes/api/legacy/v2/class-wc-api-orders.php:953
+#: includes/api/legacy/v3/class-wc-api-orders.php:998
msgid "Cannot create line item, try again."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:1036
-#: includes/api/legacy/v3/class-wc-api-orders.php:1083
+#: includes/api/legacy/v2/class-wc-api-orders.php:1029
+#: includes/api/legacy/v3/class-wc-api-orders.php:1074
msgid "Shipping total must be a positive amount."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:1070
-#: includes/api/legacy/v3/class-wc-api-orders.php:1117
+#: includes/api/legacy/v2/class-wc-api-orders.php:1036
+#: includes/api/legacy/v3/class-wc-api-orders.php:1081
+#: includes/api/v1/class-wc-rest-orders-controller.php:698
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:694
+msgid "Shipping method ID is required."
+msgstr ""
+
+#: includes/api/legacy/v2/class-wc-api-orders.php:1063
+#: includes/api/legacy/v3/class-wc-api-orders.php:1108
msgid "Cannot update shipping method, try again."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:1090
-#: includes/api/legacy/v3/class-wc-api-orders.php:1137
+#: includes/api/legacy/v2/class-wc-api-orders.php:1083
+#: includes/api/legacy/v3/class-wc-api-orders.php:1128
msgid "Fee title is required"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:1101
-#: includes/api/legacy/v3/class-wc-api-orders.php:1148
+#: includes/api/legacy/v2/class-wc-api-orders.php:1094
+#: includes/api/legacy/v3/class-wc-api-orders.php:1139
msgid "Fee tax class is required when fee is taxable."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:1141
-#: includes/api/legacy/v3/class-wc-api-orders.php:1188
+#: includes/api/legacy/v2/class-wc-api-orders.php:1134
+#: includes/api/legacy/v3/class-wc-api-orders.php:1179
msgid "Cannot update fee, try again."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:1159
-#: includes/api/legacy/v3/class-wc-api-orders.php:1206
+#: includes/api/legacy/v2/class-wc-api-orders.php:1152
+#: includes/api/legacy/v3/class-wc-api-orders.php:1197
msgid "Coupon discount total must be a positive amount."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:1192
-#: includes/api/legacy/v3/class-wc-api-orders.php:1239
+#: includes/api/legacy/v2/class-wc-api-orders.php:1185
+#: includes/api/legacy/v3/class-wc-api-orders.php:1230
msgid "Cannot update coupon, try again."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:1259
-#: includes/api/legacy/v2/class-wc-api-orders.php:1369
-#: includes/api/legacy/v2/class-wc-api-orders.php:1433
-#: includes/api/legacy/v3/class-wc-api-orders.php:1306
-#: includes/api/legacy/v3/class-wc-api-orders.php:1416
-#: includes/api/legacy/v3/class-wc-api-orders.php:1480
+#: includes/api/legacy/v2/class-wc-api-orders.php:1252
+#: includes/api/legacy/v2/class-wc-api-orders.php:1362
+#: includes/api/legacy/v2/class-wc-api-orders.php:1426
+#: includes/api/legacy/v3/class-wc-api-orders.php:1297
+#: includes/api/legacy/v3/class-wc-api-orders.php:1407
+#: includes/api/legacy/v3/class-wc-api-orders.php:1471
msgid "Invalid order note ID"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:1265
-#: includes/api/legacy/v2/class-wc-api-orders.php:1376
-#: includes/api/legacy/v2/class-wc-api-orders.php:1440
-#: includes/api/legacy/v3/class-wc-api-orders.php:1312
-#: includes/api/legacy/v3/class-wc-api-orders.php:1423
-#: includes/api/legacy/v3/class-wc-api-orders.php:1487
+#: includes/api/legacy/v2/class-wc-api-orders.php:1258
+#: includes/api/legacy/v2/class-wc-api-orders.php:1369
+#: includes/api/legacy/v2/class-wc-api-orders.php:1433
+#: includes/api/legacy/v3/class-wc-api-orders.php:1303
+#: includes/api/legacy/v3/class-wc-api-orders.php:1414
+#: includes/api/legacy/v3/class-wc-api-orders.php:1478
msgid "An order note with the provided ID could not be found"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:1299
-#: includes/api/legacy/v3/class-wc-api-orders.php:1346
+#: includes/api/legacy/v2/class-wc-api-orders.php:1292
+#: includes/api/legacy/v3/class-wc-api-orders.php:1337
msgid "You do not have permission to create order notes"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:1314
-#: includes/api/legacy/v3/class-wc-api-orders.php:1361
+#: includes/api/legacy/v2/class-wc-api-orders.php:1307
+#: includes/api/legacy/v3/class-wc-api-orders.php:1352
msgid "Order note is required"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:1323
-#: includes/api/legacy/v3/class-wc-api-orders.php:1370
-#: includes/api/v1/class-wc-rest-order-notes-controller.php:233
-msgid "Cannot create order note, please try again."
-msgstr ""
-
-#: includes/api/legacy/v2/class-wc-api-orders.php:1381
-#: includes/api/legacy/v2/class-wc-api-orders.php:1445
-#: includes/api/legacy/v3/class-wc-api-orders.php:1428
-#: includes/api/legacy/v3/class-wc-api-orders.php:1492
+#: includes/api/legacy/v2/class-wc-api-orders.php:1374
+#: includes/api/legacy/v2/class-wc-api-orders.php:1438
+#: includes/api/legacy/v3/class-wc-api-orders.php:1419
+#: includes/api/legacy/v3/class-wc-api-orders.php:1483
msgid "The order note ID provided is not associated with the order"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:1452
-#: includes/api/legacy/v3/class-wc-api-orders.php:1499
+#: includes/api/legacy/v2/class-wc-api-orders.php:1445
+#: includes/api/legacy/v3/class-wc-api-orders.php:1490
msgid "This order note cannot be deleted"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:1457
-#: includes/api/legacy/v3/class-wc-api-orders.php:1504
+#: includes/api/legacy/v2/class-wc-api-orders.php:1450
+#: includes/api/legacy/v3/class-wc-api-orders.php:1495
msgid "Permanently deleted order note"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:1525
-#: includes/api/legacy/v2/class-wc-api-orders.php:1687
-#: includes/api/legacy/v2/class-wc-api-orders.php:1748
-#: includes/api/legacy/v3/class-wc-api-orders.php:1572
-#: includes/api/legacy/v3/class-wc-api-orders.php:1734
-#: includes/api/legacy/v3/class-wc-api-orders.php:1795
+#: includes/api/legacy/v2/class-wc-api-orders.php:1511
+#: includes/api/legacy/v2/class-wc-api-orders.php:1673
+#: includes/api/legacy/v2/class-wc-api-orders.php:1734
+#: includes/api/legacy/v3/class-wc-api-orders.php:1556
+#: includes/api/legacy/v3/class-wc-api-orders.php:1718
+#: includes/api/legacy/v3/class-wc-api-orders.php:1779
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:133
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:195
+msgid "Invalid order refund ID."
+msgstr ""
+
+#: includes/api/legacy/v2/class-wc-api-orders.php:1518
+#: includes/api/legacy/v2/class-wc-api-orders.php:1680
+#: includes/api/legacy/v2/class-wc-api-orders.php:1741
+#: includes/api/legacy/v3/class-wc-api-orders.php:1563
+#: includes/api/legacy/v3/class-wc-api-orders.php:1725
+#: includes/api/legacy/v3/class-wc-api-orders.php:1786
msgid "An order refund with the provided ID could not be found."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:1592
-#: includes/api/legacy/v3/class-wc-api-orders.php:1639
+#: includes/api/legacy/v2/class-wc-api-orders.php:1585
+#: includes/api/legacy/v3/class-wc-api-orders.php:1630
msgid "You do not have permission to create order refunds"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:1605
-#: includes/api/legacy/v3/class-wc-api-orders.php:1652
+#: includes/api/legacy/v2/class-wc-api-orders.php:1598
+#: includes/api/legacy/v3/class-wc-api-orders.php:1643
msgid "Refund amount is required."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:1607
-#: includes/api/legacy/v3/class-wc-api-orders.php:1654
+#: includes/api/legacy/v2/class-wc-api-orders.php:1600
+#: includes/api/legacy/v3/class-wc-api-orders.php:1645
msgid "Refund amount must be positive."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:1634
-#: includes/api/legacy/v3/class-wc-api-orders.php:1681
-#: includes/wc-order-functions.php:642
+#: includes/api/legacy/v2/class-wc-api-orders.php:1627
+#: includes/api/legacy/v3/class-wc-api-orders.php:1672
+#: includes/wc-order-functions.php:644
msgid ""
"An error occurred while attempting to create the refund using the payment "
"gateway API."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-orders.php:1692
-#: includes/api/legacy/v2/class-wc-api-orders.php:1753
-#: includes/api/legacy/v3/class-wc-api-orders.php:1739
-#: includes/api/legacy/v3/class-wc-api-orders.php:1800
+#: includes/api/legacy/v2/class-wc-api-orders.php:1685
+#: includes/api/legacy/v2/class-wc-api-orders.php:1746
+#: includes/api/legacy/v3/class-wc-api-orders.php:1730
+#: includes/api/legacy/v3/class-wc-api-orders.php:1791
msgid "The order refund ID provided is not associated with the order."
msgstr ""
@@ -18686,154 +17965,154 @@ msgstr ""
msgid "Invalid product type - the product type must be any of these: %s"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:555
-#: includes/api/legacy/v2/class-wc-api-products.php:593
-#: includes/api/legacy/v3/class-wc-api-products.php:614
-#: includes/api/legacy/v3/class-wc-api-products.php:652
+#: includes/api/legacy/v2/class-wc-api-products.php:560
+#: includes/api/legacy/v2/class-wc-api-products.php:598
+#: includes/api/legacy/v3/class-wc-api-products.php:619
+#: includes/api/legacy/v3/class-wc-api-products.php:657
msgid "You do not have permission to read product categories"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:588
-#: includes/api/legacy/v3/class-wc-api-products.php:647
+#: includes/api/legacy/v2/class-wc-api-products.php:593
+#: includes/api/legacy/v3/class-wc-api-products.php:652
msgid "Invalid product category ID"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:599
-#: includes/api/legacy/v3/class-wc-api-products.php:658
+#: includes/api/legacy/v2/class-wc-api-products.php:604
+#: includes/api/legacy/v3/class-wc-api-products.php:663
msgid "A product category with the provided ID could not be found"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:944
-#: includes/api/legacy/v3/class-wc-api-products.php:1434
+#: includes/api/legacy/v2/class-wc-api-products.php:949
+#: includes/api/legacy/v3/class-wc-api-products.php:1439
msgid "The SKU already exists on another product."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:1699
-#: includes/api/legacy/v3/class-wc-api-products.php:2232
+#: includes/api/legacy/v2/class-wc-api-products.php:1704
+#: includes/api/legacy/v3/class-wc-api-products.php:2237
#: includes/wc-rest-functions.php:74
#. translators: %s: image URL
msgid "Invalid URL %s."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:1711
-#: includes/api/legacy/v2/class-wc-api-products.php:1713
-#: includes/api/legacy/v3/class-wc-api-products.php:2244
-#: includes/api/legacy/v3/class-wc-api-products.php:2246
+#: includes/api/legacy/v2/class-wc-api-products.php:1716
+#: includes/api/legacy/v2/class-wc-api-products.php:1718
+#: includes/api/legacy/v3/class-wc-api-products.php:2249
+#: includes/api/legacy/v3/class-wc-api-products.php:2251
#: includes/wc-rest-functions.php:90 includes/wc-rest-functions.php:96
#. translators: %s: image URL
msgid "Error getting remote image %s."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:1711
-#: includes/api/legacy/v3/class-wc-api-products.php:2244
-#: includes/class-wc-auth.php:406 includes/wc-rest-functions.php:92
+#: includes/api/legacy/v2/class-wc-api-products.php:1716
+#: includes/api/legacy/v3/class-wc-api-products.php:2249
+#: includes/class-wc-auth.php:402 includes/wc-rest-functions.php:92
#. translators: %s: error message
msgid "Error: %s."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:1734
-#: includes/api/legacy/v3/class-wc-api-products.php:2267
-#: includes/wc-rest-functions.php:117
+#: includes/api/legacy/v2/class-wc-api-products.php:1739
+#: includes/api/legacy/v3/class-wc-api-products.php:2272
+#: includes/wc-rest-functions.php:118
msgid "Invalid image type."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:1751
-#: includes/api/legacy/v3/class-wc-api-products.php:2284
-#: includes/wc-rest-functions.php:135
+#: includes/api/legacy/v2/class-wc-api-products.php:1756
+#: includes/api/legacy/v3/class-wc-api-products.php:2289
+#: includes/wc-rest-functions.php:136
msgid "Zero size file downloaded."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:1893
-#: includes/api/legacy/v2/class-wc-api-products.php:1939
-#: includes/api/legacy/v3/class-wc-api-products.php:2451
-#: includes/api/legacy/v3/class-wc-api-products.php:2497
+#: includes/api/legacy/v2/class-wc-api-products.php:1898
+#: includes/api/legacy/v2/class-wc-api-products.php:1944
+#: includes/api/legacy/v3/class-wc-api-products.php:2456
+#: includes/api/legacy/v3/class-wc-api-products.php:2502
msgid "You do not have permission to read product attributes"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:1934
-#: includes/api/legacy/v3/class-wc-api-products.php:2492
-#: includes/api/legacy/v3/class-wc-api-products.php:2870
+#: includes/api/legacy/v2/class-wc-api-products.php:1939
+#: includes/api/legacy/v3/class-wc-api-products.php:2497
+#: includes/api/legacy/v3/class-wc-api-products.php:2875
msgid "Invalid product attribute ID"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:1949
-#: includes/api/legacy/v2/class-wc-api-products.php:2197
-#: includes/api/legacy/v3/class-wc-api-products.php:2507
-#: includes/api/legacy/v3/class-wc-api-products.php:2757
-#: includes/api/legacy/v3/class-wc-api-products.php:2812
-#: includes/api/legacy/v3/class-wc-api-products.php:2881
-#: includes/api/legacy/v3/class-wc-api-products.php:2931
-#: includes/api/legacy/v3/class-wc-api-products.php:2997
-#: includes/api/legacy/v3/class-wc-api-products.php:3050
+#: includes/api/legacy/v2/class-wc-api-products.php:1954
+#: includes/api/legacy/v2/class-wc-api-products.php:2202
+#: includes/api/legacy/v3/class-wc-api-products.php:2512
+#: includes/api/legacy/v3/class-wc-api-products.php:2762
+#: includes/api/legacy/v3/class-wc-api-products.php:2817
+#: includes/api/legacy/v3/class-wc-api-products.php:2886
+#: includes/api/legacy/v3/class-wc-api-products.php:2936
+#: includes/api/legacy/v3/class-wc-api-products.php:3002
+#: includes/api/legacy/v3/class-wc-api-products.php:3055
msgid "A product attribute with the provided ID could not be found"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:1985
-#: includes/api/legacy/v3/class-wc-api-products.php:2543
+#: includes/api/legacy/v2/class-wc-api-products.php:1990
+#: includes/api/legacy/v3/class-wc-api-products.php:2548
#: includes/api/v1/class-wc-rest-product-attributes-controller.php:567
#: includes/wc-attribute-functions.php:449
#. translators: %s: attribute slug
msgid "Slug \"%s\" is too long (28 characters max). Shorten it, please."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:1987
-#: includes/api/legacy/v3/class-wc-api-products.php:2545
+#: includes/api/legacy/v2/class-wc-api-products.php:1992
+#: includes/api/legacy/v3/class-wc-api-products.php:2550
#: includes/api/v1/class-wc-rest-product-attributes-controller.php:569
#: includes/wc-attribute-functions.php:452
#. translators: %s: attribute slug
msgid "Slug \"%s\" is not allowed because it is a reserved term. Change it, please."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:1989
-#: includes/api/legacy/v3/class-wc-api-products.php:2547
+#: includes/api/legacy/v2/class-wc-api-products.php:1994
+#: includes/api/legacy/v3/class-wc-api-products.php:2552
#: includes/api/v1/class-wc-rest-product-attributes-controller.php:571
#: includes/wc-attribute-functions.php:455
#. translators: %s: attribute slug
msgid "Slug \"%s\" is already in use. Change it, please."
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:1994
-#: includes/api/legacy/v3/class-wc-api-products.php:2552
+#: includes/api/legacy/v2/class-wc-api-products.php:1999
+#: includes/api/legacy/v3/class-wc-api-products.php:2557
msgid ""
"Invalid product attribute type - the product attribute type must be any of "
"these: %s"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:1999
-#: includes/api/legacy/v3/class-wc-api-products.php:2557
+#: includes/api/legacy/v2/class-wc-api-products.php:2004
+#: includes/api/legacy/v3/class-wc-api-products.php:2562
msgid ""
"Invalid product attribute order_by type - the product attribute order_by "
"type must be any of these: %s"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:2026
-#: includes/api/legacy/v3/class-wc-api-products.php:2584
-#: includes/api/legacy/v3/class-wc-api-products.php:2925
+#: includes/api/legacy/v2/class-wc-api-products.php:2031
+#: includes/api/legacy/v3/class-wc-api-products.php:2589
+#: includes/api/legacy/v3/class-wc-api-products.php:2930
msgid "You do not have permission to create product attributes"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:2110
-#: includes/api/legacy/v3/class-wc-api-products.php:2669
-#: includes/api/legacy/v3/class-wc-api-products.php:2991
+#: includes/api/legacy/v2/class-wc-api-products.php:2115
+#: includes/api/legacy/v3/class-wc-api-products.php:2674
+#: includes/api/legacy/v3/class-wc-api-products.php:2996
msgid "You do not have permission to edit product attributes"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:2156
-#: includes/api/legacy/v3/class-wc-api-products.php:2715
+#: includes/api/legacy/v2/class-wc-api-products.php:2161
+#: includes/api/legacy/v3/class-wc-api-products.php:2720
msgid "Could not edit the attribute"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:2185
-#: includes/api/legacy/v3/class-wc-api-products.php:2745
+#: includes/api/legacy/v2/class-wc-api-products.php:2190
+#: includes/api/legacy/v3/class-wc-api-products.php:2750
msgid "You do not have permission to delete product attributes"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:2207
-#: includes/api/legacy/v3/class-wc-api-products.php:2767
+#: includes/api/legacy/v2/class-wc-api-products.php:2212
+#: includes/api/legacy/v3/class-wc-api-products.php:2772
msgid "Could not delete the attribute"
msgstr ""
-#: includes/api/legacy/v2/class-wc-api-products.php:2248
+#: includes/api/legacy/v2/class-wc-api-products.php:2253
msgid "Invalid product SKU"
msgstr ""
@@ -18887,110 +18166,110 @@ msgstr ""
msgid "Consumer Secret is invalid."
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:707
+#: includes/api/legacy/v3/class-wc-api-products.php:712
msgid "You do not have permission to create product categories"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:727
+#: includes/api/legacy/v3/class-wc-api-products.php:732
msgid "Product category parent is invalid"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:787
+#: includes/api/legacy/v3/class-wc-api-products.php:792
msgid "You do not have permission to edit product categories"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:817
+#: includes/api/legacy/v3/class-wc-api-products.php:822
msgid "Could not edit the category"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:850
+#: includes/api/legacy/v3/class-wc-api-products.php:855
msgid "You do not have permission to delete product category"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:856
+#: includes/api/legacy/v3/class-wc-api-products.php:861
msgid "Could not delete the category"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:885
-#: includes/api/legacy/v3/class-wc-api-products.php:923
+#: includes/api/legacy/v3/class-wc-api-products.php:890
+#: includes/api/legacy/v3/class-wc-api-products.php:928
msgid "You do not have permission to read product tags"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:918
+#: includes/api/legacy/v3/class-wc-api-products.php:923
msgid "Invalid product tag ID"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:929
+#: includes/api/legacy/v3/class-wc-api-products.php:934
msgid "A product tag with the provided ID could not be found"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:964
+#: includes/api/legacy/v3/class-wc-api-products.php:969
msgid "You do not have permission to create product tags"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:1012
+#: includes/api/legacy/v3/class-wc-api-products.php:1017
msgid "You do not have permission to edit product tags"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:1024
+#: includes/api/legacy/v3/class-wc-api-products.php:1029
msgid "Could not edit the tag"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:1047
+#: includes/api/legacy/v3/class-wc-api-products.php:1052
msgid "You do not have permission to delete product tag"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:1053
+#: includes/api/legacy/v3/class-wc-api-products.php:1058
msgid "Could not delete the tag"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:2806
-#: includes/api/legacy/v3/class-wc-api-products.php:2875
+#: includes/api/legacy/v3/class-wc-api-products.php:2811
+#: includes/api/legacy/v3/class-wc-api-products.php:2880
msgid "You do not have permission to read product attribute terms"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:2887
+#: includes/api/legacy/v3/class-wc-api-products.php:2892
msgid "A product attribute term with the provided ID could not be found"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:3044
+#: includes/api/legacy/v3/class-wc-api-products.php:3049
msgid "You do not have permission to delete product attribute terms"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:3187
-#: includes/api/legacy/v3/class-wc-api-products.php:3222
+#: includes/api/legacy/v3/class-wc-api-products.php:3192
+#: includes/api/legacy/v3/class-wc-api-products.php:3227
msgid "You do not have permission to read product shipping classes"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:3217
+#: includes/api/legacy/v3/class-wc-api-products.php:3222
msgid "Invalid product shipping class ID"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:3228
+#: includes/api/legacy/v3/class-wc-api-products.php:3233
msgid "A product shipping class with the provided ID could not be found"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:3266
+#: includes/api/legacy/v3/class-wc-api-products.php:3271
msgid "You do not have permission to create product shipping classes"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:3284
+#: includes/api/legacy/v3/class-wc-api-products.php:3289
msgid "Product shipping class parent is invalid"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:3327
+#: includes/api/legacy/v3/class-wc-api-products.php:3332
msgid "You do not have permission to edit product shipping classes"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:3339
+#: includes/api/legacy/v3/class-wc-api-products.php:3344
msgid "Could not edit the shipping class"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:3364
+#: includes/api/legacy/v3/class-wc-api-products.php:3369
msgid "You do not have permission to delete product shipping classes"
msgstr ""
-#: includes/api/legacy/v3/class-wc-api-products.php:3370
+#: includes/api/legacy/v3/class-wc-api-products.php:3375
msgid "Could not delete the shipping class"
msgstr ""
@@ -19051,14 +18330,182 @@ msgstr ""
msgid "You do not have permission to read the tax classes count"
msgstr ""
+#: includes/api/v1/class-wc-rest-coupons-controller.php:70
+#: includes/api/v1/class-wc-rest-coupons-controller.php:421
+#: includes/api/v1/class-wc-rest-orders-controller.php:1540
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:61
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:341
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1580
+msgid "Coupon code."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:415
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:335
+msgid "Unique identifier for the object."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:426
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:351
+msgid "The date the coupon was created, in the site's timezone."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:432
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:363
+msgid "The date the coupon was last modified, in the site's timezone."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:438
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:382
+msgid "Coupon description."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:443
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:375
+msgid "Determines the type of discount that will be applied."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:450
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:346
+msgid ""
+"The amount of discount. Should always be numeric, even if setting a "
+"percentage."
+msgstr ""
+
#: includes/api/v1/class-wc-rest-coupons-controller.php:455
msgid "UTC DateTime when the coupon expires."
msgstr ""
+#: includes/api/v1/class-wc-rest-coupons-controller.php:460
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:397
+msgid "Number of times the coupon has been used already."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:466
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:403
+msgid ""
+"If true, the coupon can only be used individually. Other applied coupons "
+"will be removed from the cart."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:472
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:409
+msgid "List of product IDs the coupon can be used on."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:480
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:417
+msgid "List of product IDs the coupon cannot be used on."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:488
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:425
+msgid "How many times the coupon can be used in total."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:493
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:430
+msgid "How many times the coupon can be used per customer."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:498
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:435
+msgid "Max number of items in the cart the coupon can be applied to."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:503
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:440
+msgid ""
+"If true and if the free shipping method requires a coupon, this coupon will "
+"enable free shipping."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:509
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:446
+msgid "List of category IDs the coupon applies to."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:517
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:454
+msgid "List of category IDs the coupon does not apply to."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:525
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:462
+msgid "If true, this coupon will not be applied to items that have sale prices."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:531
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:468
+msgid "Minimum order amount that needs to be in the cart before coupon applies."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:536
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:473
+msgid "Maximum order amount allowed when using the coupon."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:541
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:478
+msgid "List of email addresses that can use this coupon."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:549
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:486
+msgid "List of user IDs (or guest email addresses) that have used the coupon."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-coupons-controller.php:572
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:534
+msgid "Limit result set to resources with a specific code."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:169
+#: includes/api/v2/class-wc-rest-customer-downloads-v2-controller.php:87
+msgid "Download file URL."
+msgstr ""
+
#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:175
msgid "Download ID (MD5)."
msgstr ""
+#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:181
+#: includes/api/v2/class-wc-rest-customer-downloads-v2-controller.php:93
+msgid "Downloadable product ID."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:187
+#: includes/api/v2/class-wc-rest-customer-downloads-v2-controller.php:105
+msgid "Downloadable file name."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:193
+#: includes/api/v2/class-wc-rest-customer-downloads-v2-controller.php:111
+#: includes/cli/class-wc-cli-runner.php:112
+msgid "Order ID."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:199
+#: includes/api/v1/class-wc-rest-orders-controller.php:942
+#: includes/api/v2/class-wc-rest-customer-downloads-v2-controller.php:117
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:859
+msgid "Order key."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:205
+#: includes/api/v2/class-wc-rest-customer-downloads-v2-controller.php:123
+msgid "Number of downloads remaining."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:211
+#: includes/api/v2/class-wc-rest-customer-downloads-v2-controller.php:129
+msgid "The date when download access expires, in the site's timezone."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-customer-downloads-controller.php:217
+#: includes/api/v2/class-wc-rest-customer-downloads-v2-controller.php:141
+msgid "File details."
+msgstr ""
+
#: includes/api/v1/class-wc-rest-customers-controller.php:58
msgid "New user email address."
msgstr ""
@@ -19115,10 +18562,6 @@ msgstr ""
msgid "Invalid resource id for reassignment."
msgstr ""
-#: includes/api/v1/class-wc-rest-customers-controller.php:638
-msgid "The date the customer was created, as GMT."
-msgstr ""
-
#: includes/api/v1/class-wc-rest-customers-controller.php:685
msgid "Last order data."
msgstr ""
@@ -19131,24 +18574,30 @@ msgstr ""
msgid "The date of the customer last order, as GMT."
msgstr ""
+#: includes/api/v1/class-wc-rest-customers-controller.php:705
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:316
+msgid "Quantity of orders made by the customer."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-customers-controller.php:711
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:322
+msgid "Total amount spent."
+msgstr ""
+
#: includes/api/v1/class-wc-rest-customers-controller.php:743
#: includes/api/v1/class-wc-rest-customers-controller.php:806
-#: includes/api/v1/class-wc-rest-orders-controller.php:1048
-#: includes/api/v1/class-wc-rest-orders-controller.php:1111
+#: includes/api/v1/class-wc-rest-orders-controller.php:1053
+#: includes/api/v1/class-wc-rest-orders-controller.php:1116
msgid "Address line 1."
msgstr ""
#: includes/api/v1/class-wc-rest-customers-controller.php:748
#: includes/api/v1/class-wc-rest-customers-controller.php:811
-#: includes/api/v1/class-wc-rest-orders-controller.php:1053
-#: includes/api/v1/class-wc-rest-orders-controller.php:1116
+#: includes/api/v1/class-wc-rest-orders-controller.php:1058
+#: includes/api/v1/class-wc-rest-orders-controller.php:1121
msgid "Address line 2."
msgstr ""
-#: includes/api/v1/class-wc-rest-customers-controller.php:874
-msgid "Limit result set to specific IDs."
-msgstr ""
-
#: includes/api/v1/class-wc-rest-customers-controller.php:910
msgid "Limit result set to resources with a specific email."
msgstr ""
@@ -19157,6 +18606,15 @@ msgstr ""
msgid "Limit result set to resources with a specific role."
msgstr ""
+#: includes/api/v1/class-wc-rest-order-notes-controller.php:53
+#: includes/api/v1/class-wc-rest-order-notes-controller.php:85
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:61
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:83
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:64
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:88
+msgid "The order ID."
+msgstr ""
+
#: includes/api/v1/class-wc-rest-order-notes-controller.php:295
#: includes/api/v1/class-wc-rest-webhooks-controller.php:454
msgid "Webhooks do not support trashing."
@@ -19176,16 +18634,461 @@ msgstr ""
msgid "Order is invalid"
msgstr ""
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:350
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:361
+msgid "The date the order refund was created, in the site's timezone."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:356
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:373
+msgid "Refund amount."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:361
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:378
+msgid "Reason for refund."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:366
+#: includes/api/v1/class-wc-rest-orders-controller.php:1210
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:419
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1172
+msgid "Line items data."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:374
+#: includes/api/v1/class-wc-rest-orders-controller.php:1217
+#: includes/api/v1/class-wc-rest-orders-controller.php:1351
+#: includes/api/v1/class-wc-rest-orders-controller.php:1403
+#: includes/api/v1/class-wc-rest-orders-controller.php:1463
+#: includes/api/v1/class-wc-rest-orders-controller.php:1534
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:427
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1179
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1307
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1385
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1476
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1574
+msgid "Item ID."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:386
+#: includes/api/v1/class-wc-rest-orders-controller.php:1229
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:545
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1284
+msgid "Product SKU."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:392
+#: includes/api/v1/class-wc-rest-orders-controller.php:1235
+#: includes/api/v1/class-wc-rest-report-top-sellers-controller.php:158
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:439
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1190
+#: includes/cli/class-wc-cli-runner.php:110
+msgid "Product ID."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:398
+#: includes/api/v1/class-wc-rest-orders-controller.php:1240
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:445
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1195
+msgid "Variation ID, if applicable."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:404
+#: includes/api/v1/class-wc-rest-orders-controller.php:1245
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:451
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1200
+msgid "Quantity ordered."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:410
+#: includes/api/v1/class-wc-rest-orders-controller.php:1250
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:457
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1205
+msgid "Tax class of product."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:416
+#: includes/api/v1/class-wc-rest-orders-controller.php:1256
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:551
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1290
+msgid "Product price."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:422
+#: includes/api/v1/class-wc-rest-orders-controller.php:1262
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:463
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1210
+msgid "Line subtotal (before discounts)."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:428
+#: includes/api/v1/class-wc-rest-orders-controller.php:1267
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:469
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1215
+msgid "Line subtotal tax (before discounts)."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:434
+#: includes/api/v1/class-wc-rest-orders-controller.php:1272
+#: includes/api/v1/class-wc-rest-orders-controller.php:1419
+#: includes/api/v1/class-wc-rest-orders-controller.php:1485
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:475
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1221
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1406
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1498
+msgid "Line total (after discounts)."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:440
+#: includes/api/v1/class-wc-rest-orders-controller.php:1277
+#: includes/api/v1/class-wc-rest-orders-controller.php:1424
+#: includes/api/v1/class-wc-rest-orders-controller.php:1490
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:481
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1226
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1411
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1503
+msgid "Line total tax (after discounts)."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:446
+#: includes/api/v1/class-wc-rest-orders-controller.php:1282
+#: includes/api/v1/class-wc-rest-orders-controller.php:1430
+#: includes/api/v1/class-wc-rest-orders-controller.php:1495
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:487
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1232
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1417
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1509
+msgid "Line taxes."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:454
+#: includes/api/v1/class-wc-rest-orders-controller.php:1290
+#: includes/api/v1/class-wc-rest-orders-controller.php:1363
+#: includes/api/v1/class-wc-rest-orders-controller.php:1438
+#: includes/api/v1/class-wc-rest-orders-controller.php:1503
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:495
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1240
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1319
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1425
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1517
+msgid "Tax rate ID."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:460
+#: includes/api/v1/class-wc-rest-orders-controller.php:1296
+#: includes/api/v1/class-wc-rest-orders-controller.php:1444
+#: includes/api/v1/class-wc-rest-orders-controller.php:1509
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:501
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1245
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1431
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1523
+msgid "Tax total."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:466
+#: includes/api/v1/class-wc-rest-orders-controller.php:1302
+#: includes/api/v1/class-wc-rest-orders-controller.php:1515
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:507
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1250
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1529
+msgid "Tax subtotal."
+msgstr ""
+
#: includes/api/v1/class-wc-rest-order-refunds-controller.php:475
-#: includes/api/v1/class-wc-rest-orders-controller.php:1306
+#: includes/api/v1/class-wc-rest-orders-controller.php:1311
msgid "Line item meta data."
msgstr ""
#: includes/api/v1/class-wc-rest-order-refunds-controller.php:489
-#: includes/api/v1/class-wc-rest-orders-controller.php:1320
+#: includes/api/v1/class-wc-rest-orders-controller.php:1325
msgid "Meta label."
msgstr ""
+#: includes/api/v1/class-wc-rest-order-refunds-controller.php:522
+#: includes/api/v1/class-wc-rest-orders-controller.php:1623
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1695
+msgid "Number of decimal points to use in each resource."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:626
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:602
+msgid "Product ID or SKU is required."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:721
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:718
+msgid "Fee name is required."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:930
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:848
+msgid "Parent order ID."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:935
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:877
+msgid "Order status."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:948
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:853
+msgid "Order number."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:954
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:884
+msgid "Currency the order was created with, in ISO format."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:961
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:871
+msgid "Version of WooCommerce which last updated the order."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:967
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:957
+msgid "True the prices included tax during checkout."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:973
+#: includes/api/v2/class-wc-rest-customers-v2-controller.php:136
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:897
+msgid "The date the order was created, as GMT."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:979
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:909
+msgid "The date the order was last modified, as GMT."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:985
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:963
+msgid "User ID who owns the order. 0 for guests."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:991
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:915
+msgid "Total discount amount for the order."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:997
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:921
+msgid "Total discount tax amount for the order."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1003
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:927
+msgid "Total shipping amount for the order."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1009
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:933
+msgid "Total shipping tax amount for the order."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1015
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:939
+msgid "Sum of line item taxes only."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1021
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:945
+msgid "Grand total."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1027
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:951
+msgid "Sum of all taxes."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1033
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:986
+msgid "Billing address."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1078
+#: includes/api/v1/class-wc-rest-orders-controller.php:1141
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1031
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1094
+msgid "Country code in ISO 3166-1 alpha-2 format."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1096
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1049
+msgid "Shipping address."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1148
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1101
+msgid "Payment method ID."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1153
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1106
+msgid "Payment method title."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1158
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1654
+msgid ""
+"Define if the order is paid. It will set the status to processing and "
+"reduce stock items."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1164
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1111
+msgid "Unique transaction ID."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1169
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:969
+msgid "Customer's IP address."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1175
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:975
+msgid "User agent of the customer."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1181
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:865
+msgid "Shows where the order was created."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1187
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:981
+msgid "Note left by customer during checkout."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1192
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1128
+msgid "The date the order was completed, in the site's timezone."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1198
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1116
+msgid "The date the order was paid, in the site's timezone."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1204
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1140
+msgid "MD5 hash of cart items to ensure orders are not modified."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1343
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1299
+msgid "Tax lines data."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1357
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1313
+msgid "Tax rate code."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1369
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1325
+msgid "Tax rate label."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1375
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1331
+msgid "Show if is a compound tax rate."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1381
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1337
+msgid "Tax total (not including shipping taxes)."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1387
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1343
+msgid "Shipping tax total."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1396
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1378
+msgid "Shipping lines data."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1409
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1391
+msgid "Shipping method name."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1414
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1396
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:47
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:464
+msgid "Shipping method ID."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1456
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1469
+msgid "Fee lines data."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1469
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1482
+msgid "Fee name."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1474
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1487
+msgid "Tax class of fee."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1479
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1492
+msgid "Tax status of fee."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1527
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1567
+msgid "Coupons line data."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1545
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1585
+msgid "Discount total."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1550
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1590
+msgid "Discount total tax."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1559
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1625
+msgid "List of refunds."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1567
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1633
+#: includes/cli/class-wc-cli-runner.php:113
+msgid "Refund ID."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1573
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1639
+msgid "Refund reason."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1579
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1645
+msgid "Refund total."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1610
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1682
+msgid "Limit result set to orders assigned a specific customer."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-orders-controller.php:1616
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1688
+msgid "Limit result set to orders assigned a specific product."
+msgstr ""
+
#: includes/api/v1/class-wc-rest-product-attribute-terms-controller.php:46
#: includes/api/v1/class-wc-rest-product-attribute-terms-controller.php:78
#: includes/api/v1/class-wc-rest-product-attribute-terms-controller.php:114
@@ -19200,6 +19103,11 @@ msgstr ""
msgid "Sorry, you cannot create new resource."
msgstr ""
+#: includes/api/v1/class-wc-rest-product-attributes-controller.php:177
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:109
+msgid "Sorry, you cannot update resource."
+msgstr ""
+
#: includes/api/v1/class-wc-rest-product-attributes-controller.php:478
msgid "Type of attribute."
msgstr ""
@@ -19212,31 +19120,18 @@ msgstr ""
msgid "Enable/Disable attribute archives."
msgstr ""
-#: includes/api/v1/class-wc-rest-product-reviews-controller.php:68
-msgid "Review content."
+#: includes/api/v1/class-wc-rest-product-reviews-controller.php:46
+#: includes/api/v1/class-wc-rest-product-reviews-controller.php:88
+#: includes/api/v2/class-wc-rest-product-reviews-v2-controller.php:45
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:58
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:81
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:126
+msgid "Unique identifier for the variable product."
msgstr ""
-#: includes/api/v1/class-wc-rest-product-reviews-controller.php:73
-msgid "Name of the reviewer."
-msgstr ""
-
-#: includes/api/v1/class-wc-rest-product-reviews-controller.php:78
-msgid "Email of the reviewer."
-msgstr ""
-
-#: includes/api/v1/class-wc-rest-product-reviews-controller.php:193
-msgid "Sorry, you cannot delete this resource."
-msgstr ""
-
-#: includes/api/v1/class-wc-rest-product-reviews-controller.php:209
-#: includes/api/v1/class-wc-rest-product-reviews-controller.php:234
-#: includes/api/v1/class-wc-rest-product-reviews-controller.php:260
-#: includes/api/v1/class-wc-rest-product-reviews-controller.php:315
-msgid "Invalid product ID."
-msgstr ""
-
-#: includes/api/v1/class-wc-rest-product-reviews-controller.php:277
-msgid "Creating product review failed."
+#: includes/api/v1/class-wc-rest-product-reviews-controller.php:50
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:85
+msgid "Unique identifier for the variation."
msgstr ""
#: includes/api/v1/class-wc-rest-product-reviews-controller.php:328
@@ -19267,41 +19162,92 @@ msgstr ""
msgid "Invalid post ID."
msgstr ""
-#: includes/api/v1/class-wc-rest-products-controller.php:1827
-#: includes/api/v1/class-wc-rest-products-controller.php:2312
+#: includes/api/v1/class-wc-rest-products-controller.php:1832
+#: includes/api/v1/class-wc-rest-products-controller.php:2317
msgid "Start date of sale price."
msgstr ""
-#: includes/api/v1/class-wc-rest-products-controller.php:1832
-#: includes/api/v1/class-wc-rest-products-controller.php:2317
+#: includes/api/v1/class-wc-rest-products-controller.php:1837
+#: includes/api/v1/class-wc-rest-products-controller.php:2322
msgid "End date of sale price."
msgstr ""
-#: includes/api/v1/class-wc-rest-products-controller.php:1911
+#: includes/api/v1/class-wc-rest-products-controller.php:1916
msgid "Download type, this controls the schema on the front-end."
msgstr ""
-#: includes/api/v1/class-wc-rest-products-controller.php:2064
+#: includes/api/v1/class-wc-rest-products-controller.php:2069
msgid "List of upsell products IDs."
msgstr ""
-#: includes/api/v1/class-wc-rest-products-controller.php:2259
+#: includes/api/v1/class-wc-rest-products-controller.php:2189
+#: includes/api/v1/class-wc-rest-products-controller.php:2522
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:936
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1918
+msgid "Image position. 0 means that the image is featured."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-products-controller.php:2264
msgid "List of variations."
msgstr ""
-#: includes/api/v1/class-wc-rest-products-controller.php:2266
+#: includes/api/v1/class-wc-rest-products-controller.php:2271
msgid "Variation ID."
msgstr ""
-#: includes/api/v1/class-wc-rest-products-controller.php:2334
+#: includes/api/v1/class-wc-rest-products-controller.php:2339
msgid "If the variation is visible."
msgstr ""
-#: includes/api/v1/class-wc-rest-products-controller.php:2618
+#: includes/api/v1/class-wc-rest-products-controller.php:2417
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:819
+msgid ""
+"Controls whether or not the variation is listed as \"in stock\" or \"out of "
+"stock\" on the frontend."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-products-controller.php:2585
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2058
+msgid "Limit result set to products with a specific slug."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-products-controller.php:2591
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2064
+msgid "Limit result set to products assigned a specific status."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-products-controller.php:2598
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2071
+msgid "Limit result set to products assigned a specific type."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-products-controller.php:2605
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2090
+msgid "Limit result set to products assigned a specific category ID."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-products-controller.php:2611
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2096
+msgid "Limit result set to products assigned a specific tag ID."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-products-controller.php:2617
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2102
+msgid "Limit result set to products assigned a specific shipping class ID."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-products-controller.php:2623
msgid "Limit result set to products with a specific attribute."
msgstr ""
-#: includes/api/v1/class-wc-rest-products-controller.php:2630
+#: includes/api/v1/class-wc-rest-products-controller.php:2629
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2114
+msgid ""
+"Limit result set to products with a specific attribute term ID (required an "
+"assigned attribute)."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-products-controller.php:2635
msgid "Limit result set to products with a specific SKU."
msgstr ""
@@ -19369,19 +19315,15 @@ msgstr ""
msgid "Total number of purchases."
msgstr ""
-#: includes/api/v1/class-wc-rest-reports-controller.php:79
+#: includes/api/v1/class-wc-rest-reports-controller.php:78
msgid "List of sales reports."
msgstr ""
-#: includes/api/v1/class-wc-rest-reports-controller.php:83
+#: includes/api/v1/class-wc-rest-reports-controller.php:82
msgid "List of top sellers products."
msgstr ""
-#: includes/api/v1/class-wc-rest-reports-controller.php:147
-msgid "An alphanumeric identifier for the resource."
-msgstr ""
-
-#: includes/api/v1/class-wc-rest-reports-controller.php:153
+#: includes/api/v1/class-wc-rest-reports-controller.php:163
msgid "A human-readable description of the resource."
msgstr ""
@@ -19402,10 +19344,6 @@ msgstr ""
msgid "Country ISO 3166 code."
msgstr ""
-#: includes/api/v1/class-wc-rest-taxes-controller.php:587
-msgid "State code."
-msgstr ""
-
#: includes/api/v1/class-wc-rest-taxes-controller.php:592
msgid "Postcode / ZIP."
msgstr ""
@@ -19448,6 +19386,64 @@ msgstr ""
msgid "Invalid webhook ID."
msgstr ""
+#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:232
+#: includes/api/v2/class-wc-rest-webhook-deliveries-v2-controller.php:76
+msgid "The delivery duration, in seconds."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:238
+#: includes/api/v2/class-wc-rest-webhook-deliveries-v2-controller.php:82
+msgid ""
+"A friendly summary of the response including the HTTP response code, "
+"message, and body."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:244
+#: includes/api/v2/class-wc-rest-webhook-deliveries-v2-controller.php:88
+msgid "The URL where the webhook was delivered."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:251
+#: includes/api/v2/class-wc-rest-webhook-deliveries-v2-controller.php:95
+msgid "Request headers."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:260
+#: includes/api/v2/class-wc-rest-webhook-deliveries-v2-controller.php:104
+msgid "Request body."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:266
+#: includes/api/v2/class-wc-rest-webhook-deliveries-v2-controller.php:110
+msgid "The HTTP response code from the receiving server."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:272
+#: includes/api/v2/class-wc-rest-webhook-deliveries-v2-controller.php:116
+msgid "The HTTP response message from the receiving server."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:278
+#: includes/api/v2/class-wc-rest-webhook-deliveries-v2-controller.php:122
+msgid "Array of the response headers from the receiving server."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:287
+#: includes/api/v2/class-wc-rest-webhook-deliveries-v2-controller.php:131
+msgid "The response body from the receiving server."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-webhook-deliveries-controller.php:293
+#: includes/api/v2/class-wc-rest-webhook-deliveries-v2-controller.php:137
+msgid "The date the webhook delivery was logged, in the site's timezone."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-webhooks-controller.php:63
+#: includes/api/v1/class-wc-rest-webhooks-controller.php:636
+#: includes/api/v2/class-wc-rest-webhooks-v2-controller.php:119
+msgid "Webhook topic."
+msgstr ""
+
#: includes/api/v1/class-wc-rest-webhooks-controller.php:68
msgid "Webhook delivery URL."
msgstr ""
@@ -19457,10 +19453,817 @@ msgstr ""
msgid "Webhook delivery URL must be a valid URL starting with http:// or https://."
msgstr ""
+#: includes/api/v1/class-wc-rest-webhooks-controller.php:621
+#: includes/api/v2/class-wc-rest-webhooks-v2-controller.php:104
+msgid "A friendly name for the webhook."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-webhooks-controller.php:626
+#: includes/api/v2/class-wc-rest-webhooks-v2-controller.php:109
+msgid "Webhook status."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-webhooks-controller.php:641
+#: includes/api/v2/class-wc-rest-webhooks-v2-controller.php:124
+msgid "Webhook resource."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-webhooks-controller.php:647
+#: includes/api/v2/class-wc-rest-webhooks-v2-controller.php:130
+msgid "Webhook event."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-webhooks-controller.php:653
+#: includes/api/v2/class-wc-rest-webhooks-v2-controller.php:136
+msgid "WooCommerce action names associated with the webhook."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-webhooks-controller.php:662
+#: includes/api/v2/class-wc-rest-webhooks-v2-controller.php:145
+msgid "The URL where the webhook payload is delivered."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-webhooks-controller.php:669
+#: includes/api/v2/class-wc-rest-webhooks-v2-controller.php:152
+msgid ""
+"Secret key used to generate a hash of the delivered webhook and provided in "
+"the request headers. This will default to a MD5 hash from the current "
+"user's ID|username if not provided."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-webhooks-controller.php:674
+#: includes/api/v2/class-wc-rest-webhooks-v2-controller.php:157
+msgid "The date the webhook was created, in the site's timezone."
+msgstr ""
+
+#: includes/api/v1/class-wc-rest-webhooks-controller.php:680
+#: includes/api/v2/class-wc-rest-webhooks-v2-controller.php:169
+msgid "The date the webhook was last modified, in the site's timezone."
+msgstr ""
+
#: includes/api/v1/class-wc-rest-webhooks-controller.php:757
msgid "Limit result set to webhooks assigned a specific status."
msgstr ""
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:357
+msgid "The date the coupon was created, as GMT."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:369
+msgid "The date the coupon was last modified, as GMT."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:387
+msgid "The date the coupon expires, in the site's timezone."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-coupons-v2-controller.php:392
+msgid "The date the coupon expires, as GMT."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-customer-downloads-v2-controller.php:81
+msgid "Download ID."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-customer-downloads-v2-controller.php:135
+msgid "The date when download access expires, as GMT."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-network-orders-v2-controller.php:58
+msgid "Blog id of the record on the multisite."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-network-orders-v2-controller.php:64
+msgid "URL to edit the order"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-network-orders-v2-controller.php:70
+msgid "Name of the customer for the order"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-network-orders-v2-controller.php:76
+msgid "Order Status"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-network-orders-v2-controller.php:82
+msgid "Order total formatted for locale"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-order-notes-v2-controller.php:173
+msgid "Limit result to customers or internal notes."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:367
+msgid "The date the order refund was created, as GMT."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:383
+msgid "User ID of user who created the refund."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:388
+msgid "If the payment was refunded via the API."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-order-refunds-v2-controller.php:560
+msgid "When true, the payment gateway API is used to generate the refund."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:891
+msgid "The date the order was created, in the site's timezone."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:903
+msgid "The date the order was last modified, in the site's timezone."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1122
+msgid "The date the order was paid, as GMT."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1134
+msgid "The date the order was completed, as GMT."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-orders-v2-controller.php:1401
+msgid "Shipping instance ID."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:167
+msgid "Parent product does not match current variation."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:723
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:1561
+msgid "End date of sale price, as GMT."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-product-variations-v2-controller.php:734
+msgid "Define if the variation is visible on the product's page."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2078
+msgid "Limit result set to products with specific SKU(s). Use commas to separate."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2084
+msgid "Limit result set to featured products."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2108
+msgid ""
+"Limit result set to products with a specific attribute. Use the taxonomy "
+"name/attribute slug."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2122
+msgid "Limit result set to products with a specific tax class."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2131
+msgid "Limit result set to products in stock or out of stock."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2137
+msgid "Limit result set to products on sale."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2143
+msgid "Limit result set to products based on a minimum price."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-products-v2-controller.php:2149
+msgid "Limit result set to products based on a maximum price."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-setting-options-v2-controller.php:45
+#: includes/api/v2/class-wc-rest-setting-options-v2-controller.php:62
+#: includes/api/v2/class-wc-rest-setting-options-v2-controller.php:80
+msgid "Settings group ID."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-setting-options-v2-controller.php:234
+#: includes/api/v2/class-wc-rest-setting-options-v2-controller.php:246
+#: includes/api/v2/class-wc-rest-setting-options-v2-controller.php:252
+msgid "Invalid setting."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-settings-v2-controller.php:63
+msgid "No setting groups have been registered."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-shipping-methods-v2-controller.php:198
+msgid "Method ID."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-shipping-methods-v2-controller.php:204
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:470
+msgid "Shipping method title."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-shipping-methods-v2-controller.php:210
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:476
+msgid "Shipping method description."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-shipping-zone-locations-v2-controller.php:29
+#: includes/api/v2/class-wc-rest-shipping-zones-v2-controller.php:54
+msgid "Unique ID for the resource."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-shipping-zone-locations-v2-controller.php:88
+#: includes/api/v2/class-wc-rest-shipping-zones-v2-controller.php:172
+msgid "The \"locations not covered by your other zones\" zone cannot be updated."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-shipping-zone-locations-v2-controller.php:169
+msgid "Shipping zone location code."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-shipping-zone-locations-v2-controller.php:174
+msgid "Shipping zone location type."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:29
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:60
+msgid "Unique ID for the zone."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:64
+msgid "Unique ID for the instance."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:177
+msgid "Resource cannot be created."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:230
+msgid "Shipping methods do not support trashing."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:436
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:442
+msgid "Shipping method instance ID."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:448
+msgid "Shipping method customer facing title."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:454
+msgid "Shipping method sort order."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:459
+msgid "Shipping method enabled status."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php:482
+msgid "Shipping method settings."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-shipping-zones-v2-controller.php:41
+#: includes/api/v2/class-wc-rest-shipping-zones-v2-controller.php:287
+msgid "Shipping zone name."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-shipping-zones-v2-controller.php:154
+msgid ""
+"Resource cannot be created. Check to make sure 'order' and 'name' are "
+"present."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-shipping-zones-v2-controller.php:214
+msgid "Shipping zones do not support trashing."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-shipping-zones-v2-controller.php:295
+msgid "Shipping zone order."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:123
+msgid "WooCommerce transients"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:124
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:129
+msgid "Clear transients"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:125
+msgid "This tool will clear the product/shop transients cache."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:128
+msgid "Expired transients"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:130
+msgid "This tool will clear ALL expired transients from WordPress."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:133
+msgid "Orphaned variations"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:134
+msgid "Delete orphaned variations"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:135
+msgid "This tool will delete all variations which have no parent."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:138
+msgid "Used-up download permissions"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:139
+msgid "Clean up download permissions"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:140
+msgid ""
+"This tool will delete expired download permissions and permissions with 0 "
+"remaining downloads."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:143
+msgid "Order address indexes"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:144
+msgid "Index orders"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:145
+msgid ""
+"This tool will add address indexes to orders that do not have them yet. "
+"This improves order search results."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:148
+msgid "Term counts"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:149
+msgid "Recount terms"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:150
+msgid ""
+"This tool will recount product terms - useful when changing your settings "
+"in a way which hides products from the catalog."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:153
+msgid "Capabilities"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:154
+msgid "Reset capabilities"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:155
+msgid ""
+"This tool will reset the admin, customer and shop_manager roles to default. "
+"Use this if your users cannot access all of the WooCommerce admin pages."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:158
+msgid "Clear customer sessions"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:159
+#: templates/single-product/add-to-cart/variable.php:44
+msgid "Clear"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:163
+msgid ""
+"This tool will delete all customer session data from the database, "
+"including current carts and saved carts in the database."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:167
+msgid "Create default WooCommerce pages"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:168
+msgid "Create pages"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:172
+msgid ""
+"This tool will install all the missing WooCommerce pages. Pages already "
+"defined and set up will not be replaced."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:176
+msgid "Delete WooCommerce tax rates"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:177
+msgid "Delete tax rates"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:181
+msgid ""
+"This option will delete ALL of your tax rates, use with caution. This "
+"action cannot be reversed."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:185
+msgid "Reset usage tracking"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:187
+msgid ""
+"This will reset your usage tracking settings, causing it to show the opt-in "
+"banner again and not sending any data."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:190
+msgid "Regenerate shop thumbnails"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:191
+msgid "Regenerate"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:192
+msgid ""
+"This will regenerate all shop thumbnails to match your theme and/or image "
+"settings."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:238
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:262
+msgid "Invalid tool ID."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:320
+msgid "A unique identifier for the tool."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:328
+msgid "Tool name."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:336
+msgid "What running the tool will do."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:344
+msgid "Tool description."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:352
+msgid "Did the tool run successfully?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:357
+msgid "Tool return message."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:422
+msgid "Product transients cleared"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:427
+#. translators: %d: amount of expired transients
+msgid "%d transients rows cleared"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:441
+#. translators: %d: amount of orphaned variations
+msgid "%d orphaned variations deleted"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:456
+#. translators: %d: amount of permissions
+msgid "%d permissions deleted"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:476
+#. translators: %d: amount of indexes
+msgid "%d indexes added"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:483
+msgid "Roles successfully reset"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:501
+msgid "Terms successfully recounted"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:509
+#. translators: %d: amount of sessions
+msgid "Deleted all active sessions, and %d saved carts."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:514
+msgid "All missing WooCommerce pages successfully installed"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:521
+msgid "Tax rates successfully deleted"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:531
+msgid "Usage tracking settings successfully reset."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:536
+msgid "Thumbnail regeneration has been scheduled to run in the background."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:550
+#. translators: %s: callback string
+msgid "There was an error calling %s"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:552
+msgid "Tool ran."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php:556
+msgid "There was an error calling this tool. There is no callback present."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:104
+msgid "Environment."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:110
+msgid "Home URL."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:117
+msgid "Site URL."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:124
+msgid "WooCommerce version."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:130
+msgid "Log directory."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:136
+msgid "Is log directory writable?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:142
+msgid "WordPress version."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:148
+msgid "Is WordPress multisite?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:154
+msgid "WordPress memory limit."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:160
+msgid "Is WordPress debug mode active?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:166
+msgid "Are WordPress cron jobs enabled?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:172
+msgid "WordPress language."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:178
+msgid "Server info."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:184
+msgid "PHP version."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:190
+msgid "PHP post max size."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:196
+msgid "PHP max execution time."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:202
+msgid "PHP max input vars."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:208
+msgid "cURL version."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:214
+msgid "Is SUHOSIN installed?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:220
+msgid "Max upload size."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:226
+msgid "MySQL version."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:232
+msgid "MySQL version string."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:238
+msgid "Default timezone."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:244
+msgid "Is fsockopen/cURL enabled?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:250
+msgid "Is SoapClient class enabled?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:256
+msgid "Is DomDocument class enabled?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:262
+msgid "Is GZip enabled?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:268
+msgid "Is mbstring enabled?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:274
+msgid "Remote POST successful?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:280
+msgid "Remote POST response."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:286
+msgid "Remote GET successful?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:292
+msgid "Remote GET response."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:300
+msgid "Database."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:306
+msgid "WC database version."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:312
+msgid "Database prefix."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:318
+msgid "MaxMind GeoIP database."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:324
+msgid "Database tables."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:335
+msgid "Active plugins."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:344
+msgid "Theme."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:350
+msgid "Theme name."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:356
+msgid "Theme version."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:362
+msgid "Latest version of theme."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:368
+msgid "Theme author URL."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:375
+msgid "Is this theme a child theme?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:381
+msgid "Does the theme declare WooCommerce support?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:387
+msgid "Does the theme have a woocommerce.php file?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:393
+msgid "Does this theme have outdated templates?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:399
+msgid "Template overrides."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:408
+msgid "Parent theme name."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:414
+msgid "Parent theme version."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:420
+msgid "Parent theme author URL."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:429
+msgid "Settings."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:435
+msgid "REST API enabled?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:441
+msgid "SSL forced?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:447
+msgid "Currency."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:459
+msgid "Currency position."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:465
+msgid "Thousand separator."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:471
+msgid "Decimal separator."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:477
+msgid "Number of decimals."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:483
+msgid "Geolocation enabled?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:489
+msgid "Taxonomy terms for product/order statuses."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:498
+msgid "Terms in the product visibility taxonomy."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:509
+msgid "Security."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:521
+msgid "Hide errors from visitors?"
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:529
+msgid "WooCommerce pages."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-webhook-deliveries-v2-controller.php:143
+msgid "The date the webhook delivery was logged, as GMT."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-webhooks-v2-controller.php:163
+msgid "The date the webhook was created, as GMT."
+msgstr ""
+
+#: includes/api/v2/class-wc-rest-webhooks-v2-controller.php:175
+msgid "The date the webhook was last modified, as GMT."
+msgstr ""
+
#: includes/class-wc-ajax.php:213
msgid "Sorry there was a problem removing this coupon."
msgstr ""
@@ -19473,70 +20276,54 @@ msgstr ""
msgid "Sorry, your session has expired."
msgstr ""
-#: includes/class-wc-ajax.php:262 templates/cart/cart-empty.php:33
+#: includes/class-wc-ajax.php:262 templates/cart/cart-empty.php:28
msgid "Return to shop"
msgstr ""
-#: includes/class-wc-ajax.php:829 includes/class-wc-ajax.php:895
+#: includes/class-wc-ajax.php:852 includes/class-wc-ajax.php:859
+#: includes/class-wc-ajax.php:932
msgid "Invalid order"
msgstr ""
-#: includes/class-wc-ajax.php:910
+#: includes/class-wc-ajax.php:884 includes/class-wc-order-item-product.php:72
+msgid "Invalid product ID"
+msgstr ""
+
+#: includes/class-wc-ajax.php:947
msgid "%s fee"
msgstr ""
-#: includes/class-wc-ajax.php:1175 includes/wc-stock-functions.php:116
-#. translators: 1: item name 2: old stock quantity 3: new stock quantity
-msgid "%1$s stock reduced from %2$s to %3$s."
-msgstr ""
-
-#: includes/class-wc-ajax.php:1184
-msgid ""
-"No products had their stock reduced - they may not have stock management "
-"enabled."
-msgstr ""
-
-#: includes/class-wc-ajax.php:1221
-msgid "%1$s stock increased from %2$s to %3$s."
-msgstr ""
-
-#: includes/class-wc-ajax.php:1229
-msgid ""
-"No products had their stock increased - they may not have stock management "
-"enabled."
-msgstr ""
-
-#: includes/class-wc-ajax.php:1688
+#: includes/class-wc-ajax.php:1644
msgid "Invalid refund amount"
msgstr ""
-#: includes/class-wc-ajax.php:1692
+#: includes/class-wc-ajax.php:1648
msgid "Error processing refund. Please try again."
msgstr ""
-#: includes/class-wc-ajax.php:1792
+#: includes/class-wc-ajax.php:1748
msgid "Description is missing."
msgstr ""
-#: includes/class-wc-ajax.php:1795
+#: includes/class-wc-ajax.php:1751
msgid "User is missing."
msgstr ""
-#: includes/class-wc-ajax.php:1798
+#: includes/class-wc-ajax.php:1754
msgid "Permissions is missing."
msgstr ""
-#: includes/class-wc-ajax.php:1827
+#: includes/class-wc-ajax.php:1783
msgid "API Key updated successfully."
msgstr ""
-#: includes/class-wc-ajax.php:1857
+#: includes/class-wc-ajax.php:1813
msgid ""
"API Key generated successfully. Make sure to copy your new keys now as the "
"secret key will be hidden once you leave this page."
msgstr ""
-#: includes/class-wc-ajax.php:1941
+#: includes/class-wc-ajax.php:1897
msgid "Dismiss this notice."
msgstr ""
@@ -19613,19 +20400,15 @@ msgid ""
"consumer data"
msgstr ""
-#: includes/class-wc-auth.php:323
-msgid "API disabled!"
-msgstr ""
-
-#: includes/class-wc-auth.php:380
+#: includes/class-wc-auth.php:376
msgid "Invalid nonce verification"
msgstr ""
-#: includes/class-wc-auth.php:400
+#: includes/class-wc-auth.php:396
msgid "You do not have permission to access this page"
msgstr ""
-#: includes/class-wc-auth.php:406
+#: includes/class-wc-auth.php:402
msgid "Access denied"
msgstr ""
@@ -19633,34 +20416,34 @@ msgstr ""
msgid "Error 404"
msgstr ""
-#: includes/class-wc-breadcrumb.php:224
+#: includes/class-wc-breadcrumb.php:228
#. translators: %s: product tag
msgid "Products tagged “%s”"
msgstr ""
-#: includes/class-wc-breadcrumb.php:276
+#: includes/class-wc-breadcrumb.php:280
#. translators: %s: tag name
msgid "Posts tagged “%s”"
msgstr ""
-#: includes/class-wc-breadcrumb.php:319
+#: includes/class-wc-breadcrumb.php:323
#. translators: %s: author name
msgid "Author: %s"
msgstr ""
-#: includes/class-wc-breadcrumb.php:359
+#: includes/class-wc-breadcrumb.php:363
#. translators: %s: search term
msgid "Search results for “%s”"
msgstr ""
-#: includes/class-wc-breadcrumb.php:369
+#: includes/class-wc-breadcrumb.php:373
#: includes/class-wc-template-loader.php:410
#. translators: %d: page number
#. translators: %d: Page number.
msgid "Page %d"
msgstr ""
-#: includes/class-wc-cache-helper.php:206
+#: includes/class-wc-cache-helper.php:224
#. translators: 1: key 2: URL
msgid ""
"In order for database caching to work with WooCommerce you "
@@ -19686,6 +20469,21 @@ msgid ""
"You can add it back to your cart here ."
msgstr ""
+#: includes/class-wc-cart-session.php:353
+#. translators: %d item count
+msgid ""
+"%d item from your previous order is currently unavailable and could not be "
+"added to your cart."
+msgid_plural ""
+"%d items from your previous order are currently unavailable and could not "
+"be added to your cart."
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/class-wc-cart-session.php:366
+msgid "The cart has been filled with the items from your previous order."
+msgstr ""
+
#: includes/class-wc-cart.php:604
msgid "Get cart should not be called before the wp_loaded action."
msgstr ""
@@ -19694,7 +20492,7 @@ msgstr ""
msgid "An item which is no longer available was removed from your cart."
msgstr ""
-#: includes/class-wc-cart.php:773
+#: includes/class-wc-cart.php:771
#. translators: %s: product name
msgid ""
"Sorry, \"%s\" is not in stock. Please edit your cart and try again. We "
@@ -19702,54 +20500,43 @@ msgid ""
msgstr ""
#: includes/class-wc-cart.php:786
+#: includes/shortcodes/class-wc-shortcode-checkout.php:152
#. translators: 1: product name 2: quantity in stock
msgid ""
"Sorry, we do not have enough \"%1$s\" in stock to fulfill your order (%2$s "
-"in stock). Please edit your cart and try again. We apologize for any "
-"inconvenience caused."
+"available). We apologize for any inconvenience caused."
msgstr ""
-#: includes/class-wc-cart.php:816
-#. translators: 1: product name 2: minutes
-msgid ""
-"Sorry, we do not have enough \"%1$s\" in stock to fulfill your order right "
-"now. Please try again in %2$d minutes or edit your cart and try again. We "
-"apologize for any inconvenience caused."
-msgstr ""
-
-#: includes/class-wc-cart.php:1068 includes/class-wc-frontend-scripts.php:546
-#: includes/wc-cart-functions.php:123 includes/wc-template-functions.php:1963
+#: includes/class-wc-cart.php:1037 includes/class-wc-cart.php:1065
+#: includes/class-wc-frontend-scripts.php:546
+#: includes/wc-cart-functions.php:123 includes/wc-template-functions.php:1968
#. translators: %s: product name
msgid "View cart"
msgstr ""
-#: includes/class-wc-cart.php:1068
+#: includes/class-wc-cart.php:1037
msgid "You cannot add another \"%s\" to your cart."
msgstr ""
-#: includes/class-wc-cart.php:1073
+#: includes/class-wc-cart.php:1042
msgid "Sorry, this product cannot be purchased."
msgstr ""
-#: includes/class-wc-cart.php:1079
+#: includes/class-wc-cart.php:1048
#. translators: %s: product name
msgid ""
"You cannot add "%s" to the cart because the product is out of "
"stock."
msgstr ""
-#: includes/class-wc-cart.php:1084
+#: includes/class-wc-cart.php:1053
#. translators: 1: product name 2: quantity in stock
msgid ""
"You cannot add that amount of "%1$s" to the cart because there is "
"not enough stock (%2$s remaining)."
msgstr ""
-#: includes/class-wc-cart.php:1096
-msgid "View Cart"
-msgstr ""
-
-#: includes/class-wc-cart.php:1098
+#: includes/class-wc-cart.php:1067
#. translators: 1: quantity in stock 2: current quantity
msgid ""
"You cannot add that amount to the cart — we have %1$s in stock and "
@@ -19785,214 +20572,222 @@ msgid "Create account password"
msgstr ""
#: includes/class-wc-checkout.php:238 templates/auth/form-login.php:44
-#: templates/global/form-login.php:39 templates/myaccount/form-login.php:47
-#: templates/myaccount/form-login.php:97
+#: templates/global/form-login.php:39 templates/myaccount/form-login.php:43
+#: templates/myaccount/form-login.php:93
msgid "Password"
msgstr ""
-#: includes/class-wc-checkout.php:663
+#: includes/class-wc-checkout.php:675
#. translators: %s: field name
msgid "Shipping %s"
msgstr ""
-#: includes/class-wc-checkout.php:667
+#: includes/class-wc-checkout.php:679
#. translators: %s: field name
msgid "Billing %s"
msgstr ""
-#: includes/class-wc-checkout.php:679
+#: includes/class-wc-checkout.php:691
#. translators: %1$s: field name, %2$s finder.eircode.ie URL
msgid ""
-"%1$s is not a valid. You can look up the correct Eircode here ."
+"%1$s is not valid. You can look up the correct Eircode here ."
msgstr ""
-#: includes/class-wc-checkout.php:683
+#: includes/class-wc-checkout.php:695
#. translators: %s: field name
msgid "%s is not a valid postcode / ZIP."
msgstr ""
-#: includes/class-wc-checkout.php:694 includes/class-wc-form-handler.php:139
+#: includes/class-wc-checkout.php:704 includes/class-wc-form-handler.php:134
#. translators: %s: phone number
msgid "%s is not a valid phone number."
msgstr ""
-#: includes/class-wc-checkout.php:703 includes/class-wc-form-handler.php:146
+#: includes/class-wc-checkout.php:714 includes/class-wc-form-handler.php:141
#. translators: %s: email address
msgid "%s is not a valid email address."
msgstr ""
-#: includes/class-wc-checkout.php:723
+#: includes/class-wc-checkout.php:734
#. translators: 1: state field 2: valid states
msgid "%1$s is not valid. Please enter one of the following: %2$s"
msgstr ""
-#: includes/class-wc-checkout.php:730 includes/class-wc-form-handler.php:117
-#: includes/class-wc-form-handler.php:248
+#: includes/class-wc-checkout.php:741 includes/class-wc-form-handler.php:114
+#: includes/class-wc-form-handler.php:243
#. translators: %s: field name
msgid "%s is a required field."
msgstr ""
-#: includes/class-wc-checkout.php:748 includes/class-wc-form-handler.php:379
+#: includes/class-wc-checkout.php:759 includes/class-wc-form-handler.php:374
msgid "Please read and accept the terms and conditions to proceed with your order."
msgstr ""
-#: includes/class-wc-checkout.php:755
+#: includes/class-wc-checkout.php:766
msgid "Please enter an address to continue."
msgstr ""
-#: includes/class-wc-checkout.php:758
+#: includes/class-wc-checkout.php:769
#. translators: %s: shipping location
msgid ""
"Unfortunately we do not ship %s . Please enter an "
"alternative shipping address."
msgstr ""
-#: includes/class-wc-checkout.php:764
+#: includes/class-wc-checkout.php:775
msgid ""
"No shipping method has been selected. Please double check your address, or "
"contact us if you need any help."
msgstr ""
-#: includes/class-wc-checkout.php:774 includes/class-wc-form-handler.php:389
-#: includes/class-wc-form-handler.php:494
-#: includes/class-wc-form-handler.php:519
+#: includes/class-wc-checkout.php:785 includes/class-wc-form-handler.php:384
+#: includes/class-wc-form-handler.php:489
+#: includes/class-wc-form-handler.php:514
msgid "Invalid payment method."
msgstr ""
-#: includes/class-wc-checkout.php:1008
+#: includes/class-wc-checkout.php:1033
msgid "We were unable to process your order, please try again."
msgstr ""
-#: includes/class-wc-checkout.php:1018
+#: includes/class-wc-checkout.php:1043
#. translators: %s: shop cart url
msgid ""
"Sorry, your session has expired. Return to shop "
msgstr ""
-#: includes/class-wc-checkout.php:1046
+#: includes/class-wc-checkout.php:1071
msgid "Unable to create order."
msgstr ""
-#: includes/class-wc-comments.php:147
+#: includes/class-wc-comments.php:150
msgid "Please rate the product."
msgstr ""
-#: includes/class-wc-countries.php:379
+#: includes/class-wc-countries.php:380
msgid "to the"
msgstr ""
-#: includes/class-wc-countries.php:379
+#: includes/class-wc-countries.php:380
msgid "to"
msgstr ""
-#: includes/class-wc-countries.php:393
+#: includes/class-wc-countries.php:394
msgid "the"
msgstr ""
-#: includes/class-wc-countries.php:404
+#: includes/class-wc-countries.php:405
msgid "VAT"
msgstr ""
-#: includes/class-wc-countries.php:415
+#: includes/class-wc-countries.php:416
msgid "(incl. VAT)"
msgstr ""
-#: includes/class-wc-countries.php:415
+#: includes/class-wc-countries.php:416
msgid "(incl. tax)"
msgstr ""
-#: includes/class-wc-countries.php:426
+#: includes/class-wc-countries.php:427
msgid "(ex. VAT)"
msgstr ""
-#: includes/class-wc-countries.php:426
+#: includes/class-wc-countries.php:427
msgid "(ex. tax)"
msgstr ""
-#: includes/class-wc-countries.php:633
+#: includes/class-wc-countries.php:620
+msgid "Apartment, suite, unit etc. (optional)"
+msgstr ""
+
+#: includes/class-wc-countries.php:622
+msgid "Apartment, suite, unit etc."
+msgstr ""
+
+#: includes/class-wc-countries.php:641
#: includes/customizer/class-wc-shop-customizer.php:677
msgid "Company name"
msgstr ""
-#: includes/class-wc-countries.php:648
+#: includes/class-wc-countries.php:656
msgid "Street address"
msgstr ""
-#: includes/class-wc-countries.php:650
+#: includes/class-wc-countries.php:658
#. translators: use local order of street name and house number.
msgid "House number and street name"
msgstr ""
-#: includes/class-wc-countries.php:657
-msgid "Apartment, suite, unit etc. (optional)"
+#: includes/class-wc-countries.php:665
+msgid "Apartment, suite, or unit."
msgstr ""
-#: includes/class-wc-countries.php:665
+#: includes/class-wc-countries.php:674
msgid "Town / City"
msgstr ""
-#: includes/class-wc-countries.php:758
+#: includes/class-wc-countries.php:761
msgid "Suburb"
msgstr ""
-#: includes/class-wc-countries.php:761 includes/class-wc-countries.php:1004
-#: includes/class-wc-countries.php:1136
+#: includes/class-wc-countries.php:764 includes/class-wc-countries.php:1015
+#: includes/class-wc-countries.php:1025 includes/class-wc-countries.php:1161
msgid "Postcode"
msgstr ""
-#: includes/class-wc-countries.php:780
+#: includes/class-wc-countries.php:783
msgid "District"
msgstr ""
-#: includes/class-wc-countries.php:789 includes/class-wc-countries.php:816
-#: includes/class-wc-countries.php:841 includes/class-wc-countries.php:922
-#: includes/class-wc-countries.php:961 includes/class-wc-countries.php:999
-#: includes/class-wc-countries.php:1083 includes/class-wc-countries.php:1123
-#: includes/class-wc-countries.php:1170
+#: includes/class-wc-countries.php:792 includes/class-wc-countries.php:822
+#: includes/class-wc-countries.php:847 includes/class-wc-countries.php:928
+#: includes/class-wc-countries.php:967 includes/class-wc-countries.php:1010
+#: includes/class-wc-countries.php:1108 includes/class-wc-countries.php:1148
+#: includes/class-wc-countries.php:1195
msgid "Province"
msgstr ""
-#: includes/class-wc-countries.php:824
+#: includes/class-wc-countries.php:830
msgid "Canton"
msgstr ""
-#: includes/class-wc-countries.php:836 includes/class-wc-countries.php:912
-#: includes/class-wc-countries.php:1008
+#: includes/class-wc-countries.php:842 includes/class-wc-countries.php:918
+#: includes/class-wc-countries.php:1029
msgid "Region"
msgstr ""
-#: includes/class-wc-countries.php:909
+#: includes/class-wc-countries.php:915
msgid "Town / District"
msgstr ""
-#: includes/class-wc-countries.php:917 includes/class-wc-countries.php:931
-#: includes/class-wc-countries.php:1047 includes/class-wc-countries.php:1139
+#: includes/class-wc-countries.php:923 includes/class-wc-countries.php:937
+#: includes/class-wc-countries.php:1068 includes/class-wc-countries.php:1164
msgid "County"
msgstr ""
-#: includes/class-wc-countries.php:928
+#: includes/class-wc-countries.php:934
msgid "Eircode"
msgstr ""
-#: includes/class-wc-countries.php:966
+#: includes/class-wc-countries.php:972
msgid "Prefecture"
msgstr ""
-#: includes/class-wc-countries.php:1021
+#: includes/class-wc-countries.php:1042
msgid "State / Zone"
msgstr ""
-#: includes/class-wc-countries.php:1091
+#: includes/class-wc-countries.php:1116
msgid "Municipality"
msgstr ""
-#: includes/class-wc-countries.php:1107
+#: includes/class-wc-countries.php:1132
msgid "Municipality / District"
msgstr ""
-#: includes/class-wc-countries.php:1128
+#: includes/class-wc-countries.php:1153
msgid "ZIP"
msgstr ""
@@ -20016,11 +20811,11 @@ msgstr ""
msgid "Coupon code removed successfully."
msgstr ""
-#: includes/class-wc-coupon.php:950 includes/class-wc-discounts.php:937
+#: includes/class-wc-coupon.php:950 includes/class-wc-discounts.php:954
msgid "Coupon is not valid."
msgstr ""
-#: includes/class-wc-coupon.php:954 includes/class-wc-discounts.php:570
+#: includes/class-wc-coupon.php:954 includes/class-wc-discounts.php:587
#. translators: %s: coupon code
msgid "Coupon \"%s\" does not exist!"
msgstr ""
@@ -20046,21 +20841,21 @@ msgid ""
"conjunction with other coupons."
msgstr ""
-#: includes/class-wc-coupon.php:972 includes/class-wc-discounts.php:586
-#: includes/class-wc-discounts.php:617
+#: includes/class-wc-coupon.php:972 includes/class-wc-discounts.php:603
+#: includes/class-wc-discounts.php:634
msgid "Coupon usage limit has been reached."
msgstr ""
-#: includes/class-wc-coupon.php:975 includes/class-wc-discounts.php:634
+#: includes/class-wc-coupon.php:975 includes/class-wc-discounts.php:651
msgid "This coupon has expired."
msgstr ""
-#: includes/class-wc-coupon.php:979 includes/class-wc-discounts.php:652
+#: includes/class-wc-coupon.php:979 includes/class-wc-discounts.php:669
#. translators: %s: coupon minimum amount
msgid "The minimum spend for this coupon is %s."
msgstr ""
-#: includes/class-wc-coupon.php:983 includes/class-wc-discounts.php:670
+#: includes/class-wc-coupon.php:983 includes/class-wc-discounts.php:687
#. translators: %s: coupon maximum amount
msgid "The maximum spend for this coupon is %s."
msgstr ""
@@ -20069,17 +20864,17 @@ msgstr ""
msgid "Sorry, this coupon is not applicable to your cart contents."
msgstr ""
-#: includes/class-wc-coupon.php:1000 includes/class-wc-discounts.php:834
+#: includes/class-wc-coupon.php:1000 includes/class-wc-discounts.php:852
#. translators: %s: products list
msgid "Sorry, this coupon is not applicable to the products: %s."
msgstr ""
-#: includes/class-wc-coupon.php:1020 includes/class-wc-discounts.php:875
+#: includes/class-wc-coupon.php:1020 includes/class-wc-discounts.php:893
#. translators: %s: categories list
msgid "Sorry, this coupon is not applicable to the categories: %s."
msgstr ""
-#: includes/class-wc-coupon.php:1023 includes/class-wc-discounts.php:761
+#: includes/class-wc-coupon.php:1023 includes/class-wc-discounts.php:778
msgid "Sorry, this coupon is not valid for sale items."
msgstr ""
@@ -20103,7 +20898,7 @@ msgstr ""
msgid "Invalid role"
msgstr ""
-#: includes/class-wc-customer.php:962 includes/class-wc-order.php:1075
+#: includes/class-wc-customer.php:962 includes/class-wc-order.php:1069
msgid "Invalid billing email address"
msgstr ""
@@ -20113,8 +20908,8 @@ msgstr ""
msgid "Invalid data store."
msgstr ""
-#: includes/class-wc-discounts.php:696 includes/class-wc-discounts.php:734
-#: includes/class-wc-discounts.php:789
+#: includes/class-wc-discounts.php:713 includes/class-wc-discounts.php:751
+#: includes/class-wc-discounts.php:806
msgid "Sorry, this coupon is not applicable to selected products."
msgstr ""
@@ -20126,11 +20921,11 @@ msgid "Invalid download link."
msgstr ""
#: includes/class-wc-download-handler.php:125
-#: includes/class-wc-form-handler.php:774
+#: includes/class-wc-form-handler.php:688
#: includes/data-stores/abstract-wc-order-data-store-cpt.php:100
-#: includes/shortcodes/class-wc-shortcode-checkout.php:177
+#: includes/shortcodes/class-wc-shortcode-checkout.php:204
#: includes/shortcodes/class-wc-shortcode-my-account.php:134
-#: includes/wc-order-functions.php:623
+#: includes/wc-order-functions.php:625
msgid "Invalid order."
msgstr ""
@@ -20167,34 +20962,34 @@ msgstr ""
msgid "Go to shop"
msgstr ""
-#: includes/class-wc-emails.php:411 includes/wc-account-functions.php:213
+#: includes/class-wc-emails.php:409 includes/wc-account-functions.php:213
#: includes/wc-account-functions.php:236
msgid "Expires"
msgstr ""
-#: includes/class-wc-emails.php:573
+#: includes/class-wc-emails.php:571
msgid "Product low in stock"
msgstr ""
-#: includes/class-wc-emails.php:576
+#: includes/class-wc-emails.php:574
#. translators: 1: product name 2: items in stock
msgid "%1$s is low in stock. There are %2$d left."
msgstr ""
-#: includes/class-wc-emails.php:600
+#: includes/class-wc-emails.php:598
msgid "Product out of stock"
msgstr ""
-#: includes/class-wc-emails.php:602
+#: includes/class-wc-emails.php:600
#. translators: %s: product name
msgid "%s is out of stock."
msgstr ""
-#: includes/class-wc-emails.php:637
+#: includes/class-wc-emails.php:635
msgid "Product backorder"
msgstr ""
-#: includes/class-wc-emails.php:639
+#: includes/class-wc-emails.php:637
#. translators: 1: product quantity 2: product name 3: order number
msgid "%1$s units of %2$s have been backordered in order #%3$s."
msgstr ""
@@ -20203,167 +20998,146 @@ msgstr ""
msgid "Buy now"
msgstr ""
-#: includes/class-wc-embed.php:130 includes/wc-template-functions.php:3178
-#: includes/widgets/class-wc-widget-layered-nav-filters.php:102
-#. translators: %s: average rating
-#. translators: %s: rating
-msgid "Rated %s out of 5"
-msgstr ""
-
-#: includes/class-wc-form-handler.php:130
+#: includes/class-wc-form-handler.php:127
#: includes/shortcodes/class-wc-shortcode-cart.php:37
msgid "Please enter a valid postcode / ZIP."
msgstr ""
-#: includes/class-wc-form-handler.php:176
+#: includes/class-wc-form-handler.php:171
msgid "Address changed successfully."
msgstr ""
-#: includes/class-wc-form-handler.php:235
+#: includes/class-wc-form-handler.php:230
msgid "Display name cannot be changed to email address due to privacy concern."
msgstr ""
-#: includes/class-wc-form-handler.php:242
+#: includes/class-wc-form-handler.php:237
#: templates/myaccount/form-edit-account.php:37
msgid "Display name"
msgstr ""
-#: includes/class-wc-form-handler.php:255 includes/wc-user-functions.php:44
+#: includes/class-wc-form-handler.php:250 includes/wc-user-functions.php:44
msgid "Please provide a valid email address."
msgstr ""
-#: includes/class-wc-form-handler.php:257
+#: includes/class-wc-form-handler.php:252
msgid "This email address is already registered."
msgstr ""
-#: includes/class-wc-form-handler.php:263
+#: includes/class-wc-form-handler.php:258
msgid "Please fill out all password fields."
msgstr ""
-#: includes/class-wc-form-handler.php:266
+#: includes/class-wc-form-handler.php:261
msgid "Please enter your current password."
msgstr ""
-#: includes/class-wc-form-handler.php:269
+#: includes/class-wc-form-handler.php:264
msgid "Please re-enter your password."
msgstr ""
-#: includes/class-wc-form-handler.php:272
+#: includes/class-wc-form-handler.php:267
msgid "New passwords do not match."
msgstr ""
-#: includes/class-wc-form-handler.php:275
+#: includes/class-wc-form-handler.php:270
msgid "Your current password is incorrect."
msgstr ""
-#: includes/class-wc-form-handler.php:316
+#: includes/class-wc-form-handler.php:311
msgid "Account details changed successfully."
msgstr ""
-#: includes/class-wc-form-handler.php:453
+#: includes/class-wc-form-handler.php:448
msgid "Invalid payment gateway."
msgstr ""
-#: includes/class-wc-form-handler.php:466
+#: includes/class-wc-form-handler.php:461
msgid "Payment method successfully added."
msgstr ""
-#: includes/class-wc-form-handler.php:470
+#: includes/class-wc-form-handler.php:465
msgid "Unable to add payment method to your account."
msgstr ""
-#: includes/class-wc-form-handler.php:497
+#: includes/class-wc-form-handler.php:492
msgid "Payment method deleted."
msgstr ""
-#: includes/class-wc-form-handler.php:522
+#: includes/class-wc-form-handler.php:517
msgid "This payment method was successfully set as your default."
msgstr ""
-#: includes/class-wc-form-handler.php:563
-#: includes/class-wc-form-handler.php:567
+#: includes/class-wc-form-handler.php:558
+#: includes/class-wc-form-handler.php:562
#. Translators: %s Product title.
msgid "%s removed."
msgstr ""
-#: includes/class-wc-form-handler.php:564
+#: includes/class-wc-form-handler.php:559
msgid "Undo?"
msgstr ""
-#: includes/class-wc-form-handler.php:619
+#: includes/class-wc-form-handler.php:614
#. Translators: %s Product title.
msgid "You can only have 1 %s in your cart."
msgstr ""
-#: includes/class-wc-form-handler.php:641
+#: includes/class-wc-form-handler.php:636
msgid "Cart updated."
msgstr ""
-#: includes/class-wc-form-handler.php:720
-msgid ""
-"%d item from your previous order is currently unavailable and could not be "
-"added to your cart."
-msgid_plural ""
-"%d items from your previous order are currently unavailable and could not "
-"be added to your cart."
-msgstr[0] ""
-msgstr[1] ""
-
-#: includes/class-wc-form-handler.php:731
-msgid "The cart has been filled with the items from your previous order."
-msgstr ""
-
-#: includes/class-wc-form-handler.php:764
+#: includes/class-wc-form-handler.php:678
msgid "Order cancelled by customer."
msgstr ""
-#: includes/class-wc-form-handler.php:767
+#: includes/class-wc-form-handler.php:681
msgid "Your order was cancelled."
msgstr ""
-#: includes/class-wc-form-handler.php:772
+#: includes/class-wc-form-handler.php:686
msgid ""
"Your order can no longer be cancelled. Please contact us if you need "
"assistance."
msgstr ""
-#: includes/class-wc-form-handler.php:883
+#: includes/class-wc-form-handler.php:797
msgid "Please choose the quantity of items you wish to add to your cart…"
msgstr ""
-#: includes/class-wc-form-handler.php:891
+#: includes/class-wc-form-handler.php:805
msgid "Please choose a product to add to your cart…"
msgstr ""
-#: includes/class-wc-form-handler.php:955
+#: includes/class-wc-form-handler.php:869
msgid "Please choose product options…"
msgstr ""
-#: includes/class-wc-form-handler.php:985
+#: includes/class-wc-form-handler.php:899
msgid "Invalid value posted for %s"
msgstr ""
-#: includes/class-wc-form-handler.php:992
+#: includes/class-wc-form-handler.php:906
msgid "%s is a required field"
msgid_plural "%s are required fields"
msgstr[0] ""
msgstr[1] ""
-#: includes/class-wc-form-handler.php:1029
-#: includes/class-wc-form-handler.php:1033
-#: includes/class-wc-form-handler.php:1182 includes/wc-user-functions.php:109
+#: includes/class-wc-form-handler.php:943
+#: includes/class-wc-form-handler.php:947
+#: includes/class-wc-form-handler.php:1096
msgid "Error:"
msgstr ""
-#: includes/class-wc-form-handler.php:1033
+#: includes/class-wc-form-handler.php:947
msgid "Username is required."
msgstr ""
-#: includes/class-wc-form-handler.php:1116
+#: includes/class-wc-form-handler.php:1030
msgid "Please enter your password."
msgstr ""
-#: includes/class-wc-form-handler.php:1120
+#: includes/class-wc-form-handler.php:1034
msgid "Passwords do not match."
msgstr ""
@@ -20376,12 +21150,12 @@ msgid "Error processing checkout. Please try again."
msgstr ""
#: includes/class-wc-frontend-scripts.php:521
-#: includes/wc-template-functions.php:2468
+#: includes/wc-template-functions.php:2474
msgid "required"
msgstr ""
#: includes/class-wc-frontend-scripts.php:522
-#: includes/wc-template-functions.php:2470
+#: includes/wc-template-functions.php:2476
msgid "optional"
msgstr ""
@@ -20404,39 +21178,39 @@ msgstr ""
msgid "Please enter a stronger password."
msgstr ""
-#: includes/class-wc-install.php:345
+#: includes/class-wc-install.php:365
msgid "Monthly"
msgstr ""
-#: includes/class-wc-install.php:1071
+#: includes/class-wc-install.php:1159
msgid "View WooCommerce settings"
msgstr ""
-#: includes/class-wc-install.php:1087
+#: includes/class-wc-install.php:1175
msgid "View WooCommerce documentation"
msgstr ""
-#: includes/class-wc-install.php:1087
+#: includes/class-wc-install.php:1175
msgid "Docs"
msgstr ""
-#: includes/class-wc-install.php:1088
+#: includes/class-wc-install.php:1176
msgid "View WooCommerce API docs"
msgstr ""
-#: includes/class-wc-install.php:1088
+#: includes/class-wc-install.php:1176
msgid "API docs"
msgstr ""
-#: includes/class-wc-install.php:1089
+#: includes/class-wc-install.php:1177
msgid "Visit premium customer support"
msgstr ""
-#: includes/class-wc-install.php:1089
+#: includes/class-wc-install.php:1177
msgid "Premium support"
msgstr ""
-#: includes/class-wc-install.php:1216 includes/class-wc-install.php:1303
+#: includes/class-wc-install.php:1304 includes/class-wc-install.php:1406
#. translators: 1: plugin name, 2: error message, 3: URL to install plugin
#. manually.
#. translators: 1: theme slug, 2: error message, 3: URL to install theme
@@ -20446,7 +21220,7 @@ msgid ""
"manually by clicking here."
msgstr ""
-#: includes/class-wc-install.php:1243
+#: includes/class-wc-install.php:1332
#. translators: 1: plugin name, 2: URL to WP plugin page.
msgid ""
"%1$s was installed but could not be activated. Please "
@@ -20468,10 +21242,6 @@ msgstr ""
msgid "Invalid tax class"
msgstr ""
-#: includes/class-wc-order-item-product.php:72
-msgid "Invalid product ID"
-msgstr ""
-
#: includes/class-wc-order-item-product.php:84
msgid "Invalid variation ID"
msgstr ""
@@ -20491,35 +21261,35 @@ msgstr ""
msgid "Refund – %s"
msgstr ""
-#: includes/class-wc-order.php:139
+#: includes/class-wc-order.php:136
msgid "Payment complete event failed."
msgstr ""
-#: includes/class-wc-order.php:177 includes/wc-cart-functions.php:317
+#: includes/class-wc-order.php:173 includes/wc-cart-functions.php:319
#. translators: %s: taxes
#. translators: %s: tax information
msgid "(includes %s)"
msgstr ""
-#: includes/class-wc-order.php:243
+#: includes/class-wc-order.php:239
msgid "Error saving order."
msgstr ""
-#: includes/class-wc-order.php:339
+#: includes/class-wc-order.php:333
msgid "Update status event failed."
msgstr ""
-#: includes/class-wc-order.php:360
+#: includes/class-wc-order.php:354
#. translators: 1: old order status 2: new order status
msgid "Order status changed from %1$s to %2$s."
msgstr ""
-#: includes/class-wc-order.php:366
+#: includes/class-wc-order.php:360
#. translators: %s: new order status
msgid "Order status set to %s."
msgstr ""
-#: includes/class-wc-order.php:379
+#: includes/class-wc-order.php:373
msgid "Error during status transition."
msgstr ""
@@ -20924,6 +21694,7 @@ msgstr[0] ""
msgstr[1] ""
#: includes/class-wc-post-types.php:542
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore_PostStatusRegistrar.php:37
#. translators: %s: number of orders
msgid "Failed (%s) "
msgid_plural "Failed (%s) "
@@ -20931,104 +21702,104 @@ msgstr[0] ""
msgstr[1] ""
#: includes/class-wc-privacy-erasers.php:44
-#: includes/class-wc-privacy-exporters.php:182
+#: includes/class-wc-privacy-exporters.php:179
msgid "Billing First Name"
msgstr ""
#: includes/class-wc-privacy-erasers.php:45
-#: includes/class-wc-privacy-exporters.php:183
+#: includes/class-wc-privacy-exporters.php:180
msgid "Billing Last Name"
msgstr ""
#: includes/class-wc-privacy-erasers.php:46
-#: includes/class-wc-privacy-exporters.php:184
+#: includes/class-wc-privacy-exporters.php:181
msgid "Billing Company"
msgstr ""
#: includes/class-wc-privacy-erasers.php:47
-#: includes/class-wc-privacy-exporters.php:185
+#: includes/class-wc-privacy-exporters.php:182
msgid "Billing Address 1"
msgstr ""
#: includes/class-wc-privacy-erasers.php:48
-#: includes/class-wc-privacy-exporters.php:186
+#: includes/class-wc-privacy-exporters.php:183
msgid "Billing Address 2"
msgstr ""
#: includes/class-wc-privacy-erasers.php:49
-#: includes/class-wc-privacy-exporters.php:187
+#: includes/class-wc-privacy-exporters.php:184
msgid "Billing City"
msgstr ""
#: includes/class-wc-privacy-erasers.php:50
-#: includes/class-wc-privacy-exporters.php:188
+#: includes/class-wc-privacy-exporters.php:185
msgid "Billing Postal/Zip Code"
msgstr ""
#: includes/class-wc-privacy-erasers.php:51
-#: includes/class-wc-privacy-exporters.php:189
+#: includes/class-wc-privacy-exporters.php:186
msgid "Billing State"
msgstr ""
#: includes/class-wc-privacy-erasers.php:52
-#: includes/class-wc-privacy-exporters.php:190
+#: includes/class-wc-privacy-exporters.php:187
msgid "Billing Country"
msgstr ""
#: includes/class-wc-privacy-erasers.php:53
-#: includes/class-wc-privacy-exporters.php:191
-#: includes/class-wc-privacy-exporters.php:251
+#: includes/class-wc-privacy-exporters.php:188
+#: includes/class-wc-privacy-exporters.php:248
msgid "Phone Number"
msgstr ""
#: includes/class-wc-privacy-erasers.php:54
-#: includes/class-wc-privacy-exporters.php:192
-#: includes/class-wc-privacy-exporters.php:252
+#: includes/class-wc-privacy-exporters.php:189
+#: includes/class-wc-privacy-exporters.php:249
msgid "Email Address"
msgstr ""
#: includes/class-wc-privacy-erasers.php:55
-#: includes/class-wc-privacy-exporters.php:193
+#: includes/class-wc-privacy-exporters.php:190
msgid "Shipping First Name"
msgstr ""
#: includes/class-wc-privacy-erasers.php:56
-#: includes/class-wc-privacy-exporters.php:194
+#: includes/class-wc-privacy-exporters.php:191
msgid "Shipping Last Name"
msgstr ""
#: includes/class-wc-privacy-erasers.php:57
-#: includes/class-wc-privacy-exporters.php:195
+#: includes/class-wc-privacy-exporters.php:192
msgid "Shipping Company"
msgstr ""
#: includes/class-wc-privacy-erasers.php:58
-#: includes/class-wc-privacy-exporters.php:196
+#: includes/class-wc-privacy-exporters.php:193
msgid "Shipping Address 1"
msgstr ""
#: includes/class-wc-privacy-erasers.php:59
-#: includes/class-wc-privacy-exporters.php:197
+#: includes/class-wc-privacy-exporters.php:194
msgid "Shipping Address 2"
msgstr ""
#: includes/class-wc-privacy-erasers.php:60
-#: includes/class-wc-privacy-exporters.php:198
+#: includes/class-wc-privacy-exporters.php:195
msgid "Shipping City"
msgstr ""
#: includes/class-wc-privacy-erasers.php:61
-#: includes/class-wc-privacy-exporters.php:199
+#: includes/class-wc-privacy-exporters.php:196
msgid "Shipping Postal/Zip Code"
msgstr ""
#: includes/class-wc-privacy-erasers.php:62
-#: includes/class-wc-privacy-exporters.php:200
+#: includes/class-wc-privacy-exporters.php:197
msgid "Shipping State"
msgstr ""
#: includes/class-wc-privacy-erasers.php:63
-#: includes/class-wc-privacy-exporters.php:201
+#: includes/class-wc-privacy-exporters.php:198
msgid "Shipping Country"
msgstr ""
@@ -21064,108 +21835,111 @@ msgstr ""
msgid "Removed payment token \"%d\""
msgstr ""
-#: includes/class-wc-privacy-exporters.php:32 includes/class-wc-privacy.php:42
-#: includes/class-wc-privacy.php:48
+#: includes/class-wc-privacy-exporters.php:31
msgid "Customer Data"
msgstr ""
-#: includes/class-wc-privacy-exporters.php:125
+#: includes/class-wc-privacy-exporters.php:123
#. translators: This is the headline for a list of downloads purchased from the
#. store for a given user.
msgid "Purchased Downloads"
msgstr ""
-#: includes/class-wc-privacy-exporters.php:136
+#: includes/class-wc-privacy-exporters.php:134
#. translators: This is the headline for a list of access logs for downloads
#. purchased from the store for a given user.
msgid "Access to Purchased Downloads"
msgstr ""
-#: includes/class-wc-privacy-exporters.php:140
-#: includes/class-wc-privacy-exporters.php:333
+#: includes/class-wc-privacy-exporters.php:138
+#: includes/class-wc-privacy-exporters.php:330
msgid "Download ID"
msgstr ""
-#: includes/class-wc-privacy-exporters.php:148
-#: includes/class-wc-privacy-exporters.php:247
+#: includes/class-wc-privacy-exporters.php:146
+#: includes/class-wc-privacy-exporters.php:244
msgid "IP Address"
msgstr ""
-#: includes/class-wc-privacy-exporters.php:243
+#: includes/class-wc-privacy-exporters.php:240
msgid "Order Number"
msgstr ""
-#: includes/class-wc-privacy-exporters.php:244
+#: includes/class-wc-privacy-exporters.php:241
msgid "Order Date"
msgstr ""
-#: includes/class-wc-privacy-exporters.php:245
+#: includes/class-wc-privacy-exporters.php:242
msgid "Order Total"
msgstr ""
-#: includes/class-wc-privacy-exporters.php:246
+#: includes/class-wc-privacy-exporters.php:243
msgid "Items Purchased"
msgstr ""
-#: includes/class-wc-privacy-exporters.php:248
+#: includes/class-wc-privacy-exporters.php:245
msgid "Browser User Agent"
msgstr ""
-#: includes/class-wc-privacy-exporters.php:249
+#: includes/class-wc-privacy-exporters.php:246
msgid "Billing Address"
msgstr ""
-#: includes/class-wc-privacy-exporters.php:250
+#: includes/class-wc-privacy-exporters.php:247
msgid "Shipping Address"
msgstr ""
-#: includes/class-wc-privacy-exporters.php:292
+#: includes/class-wc-privacy-exporters.php:289
msgid "Payer first name"
msgstr ""
-#: includes/class-wc-privacy-exporters.php:293
+#: includes/class-wc-privacy-exporters.php:290
msgid "Payer last name"
msgstr ""
-#: includes/class-wc-privacy-exporters.php:294
+#: includes/class-wc-privacy-exporters.php:291
msgid "Payer PayPal address"
msgstr ""
-#: includes/class-wc-privacy-exporters.php:337
+#: includes/class-wc-privacy-exporters.php:334
#: templates/order/form-tracking.php:27
msgid "Order ID"
msgstr ""
-#: includes/class-wc-privacy-exporters.php:345
+#: includes/class-wc-privacy-exporters.php:342
msgid "User email"
msgstr ""
-#: includes/class-wc-privacy-exporters.php:353
+#: includes/class-wc-privacy-exporters.php:350
msgid "Download count"
msgstr ""
-#: includes/class-wc-privacy-exporters.php:357
+#: includes/class-wc-privacy-exporters.php:354
msgid "Access granted"
msgstr ""
-#: includes/class-wc-privacy-exporters.php:407
+#: includes/class-wc-privacy-exporters.php:404
msgid "Payment Tokens"
msgstr ""
-#: includes/class-wc-privacy-exporters.php:411
+#: includes/class-wc-privacy-exporters.php:408
msgid "Token"
msgstr ""
+#: includes/class-wc-privacy.php:42 includes/class-wc-privacy.php:48
+msgid "WooCommerce Customer Data"
+msgstr ""
+
#: includes/class-wc-privacy.php:43 includes/class-wc-privacy.php:49
-msgid "Customer Orders"
+msgid "WooCommerce Customer Orders"
msgstr ""
#: includes/class-wc-privacy.php:44 includes/class-wc-privacy.php:50
-msgid "Customer Downloads"
+msgid "WooCommerce Customer Downloads"
msgstr ""
#: includes/class-wc-privacy.php:45 includes/class-wc-privacy.php:51
-msgid "Customer Payment Tokens"
+msgid "WooCommerce Customer Payment Tokens"
msgstr ""
#: includes/class-wc-privacy.php:72
@@ -21380,7 +22154,7 @@ msgid "Select options for “%s”"
msgstr ""
#: includes/class-wc-query.php:99
-#: includes/shortcodes/class-wc-shortcode-checkout.php:150
+#: includes/shortcodes/class-wc-shortcode-checkout.php:177
msgid "Pay for order"
msgstr ""
@@ -21402,7 +22176,7 @@ msgstr ""
msgid "Completed product image regeneration job."
msgstr ""
-#: includes/class-wc-regenerate-images.php:163
+#: includes/class-wc-regenerate-images.php:156
msgid "Cancelled product image regeneration job."
msgstr ""
@@ -21426,6 +22200,11 @@ msgstr ""
msgid "Error: Delivery URL returned response code: %s"
msgstr ""
+#: includes/class-woocommerce.php:190
+#. translators: 1: error message 2: file name and path 3: line number
+msgid "%1$s in %2$s on line %3$s"
+msgstr ""
+
#: includes/cli/class-wc-cli-rest-command.php:149
msgid "Trashed"
msgstr ""
@@ -21542,7 +22321,7 @@ msgid "Store Notice"
msgstr ""
#: includes/customizer/class-wc-shop-customizer.php:311
-#: includes/wc-template-functions.php:966
+#: includes/wc-template-functions.php:963
msgid ""
"This is a demo store for testing purposes — no orders shall be "
"fulfilled."
@@ -21700,7 +22479,7 @@ msgid "Images will display using the aspect ratio in which they were uploaded"
msgstr ""
#: includes/customizer/class-wc-shop-customizer.php:668
-#: includes/wc-template-functions.php:1973
+#: includes/wc-template-functions.php:1978
msgid "Checkout"
msgstr ""
@@ -21718,7 +22497,7 @@ msgid "Required"
msgstr ""
#: includes/customizer/class-wc-shop-customizer.php:724
-#: includes/wc-template-functions.php:740
+#: includes/wc-template-functions.php:737
#. translators: %s terms and conditions page name and link
msgid "I have read and agree to the website %s"
msgstr ""
@@ -21740,7 +22519,7 @@ msgstr ""
msgid "Optionally add some text for the terms checkbox that customers must accept."
msgstr ""
-#: includes/data-stores/abstract-wc-order-data-store-cpt.php:230
+#: includes/data-stores/abstract-wc-order-data-store-cpt.php:246
#. translators: %s: Order date
msgid "Order – %s"
msgstr ""
@@ -21749,7 +22528,7 @@ msgstr ""
msgid "Invalid order item."
msgstr ""
-#: includes/data-stores/class-wc-coupon-data-store-cpt.php:106
+#: includes/data-stores/class-wc-coupon-data-store-cpt.php:107
msgid "Invalid coupon."
msgstr ""
@@ -21775,7 +22554,7 @@ msgstr ""
msgid "Invalid download log: not found."
msgstr ""
-#: includes/data-stores/class-wc-order-data-store-cpt.php:426
+#: includes/data-stores/class-wc-order-data-store-cpt.php:432
msgid "Invalid customer query."
msgstr ""
@@ -21788,7 +22567,7 @@ msgstr ""
msgid "Invalid payment token."
msgstr ""
-#: includes/data-stores/class-wc-product-data-store-cpt.php:149
+#: includes/data-stores/class-wc-product-data-store-cpt.php:150
msgid "Invalid product."
msgstr ""
@@ -21797,7 +22576,6 @@ msgid "Invalid webhook."
msgstr ""
#: includes/emails/class-wc-email-cancelled-order.php:31
-#: includes/emails/class-wc-email-cancelled-order.php:69
msgid "Cancelled order"
msgstr ""
@@ -21807,16 +22585,22 @@ msgid ""
"been marked cancelled (if they were previously processing or on-hold)."
msgstr ""
-#: includes/emails/class-wc-email-cancelled-order.php:59
-msgid "[{site_title}] Cancelled order ({order_number})"
+#: includes/emails/class-wc-email-cancelled-order.php:60
+msgid ""
+"[{site_title}]: {order_billing_full_name} has cancelled order "
+"#{order_number}"
msgstr ""
-#: includes/emails/class-wc-email-cancelled-order.php:139
-#: includes/emails/class-wc-email-customer-completed-order.php:137
-#: includes/emails/class-wc-email-customer-refunded-order.php:229
-#: includes/emails/class-wc-email-failed-order.php:139
-#: includes/emails/class-wc-email-new-order.php:144
-#: includes/emails/class-wc-email.php:602
+#: includes/emails/class-wc-email-cancelled-order.php:70
+msgid "Order Cancelled: #{order_number}"
+msgstr ""
+
+#: includes/emails/class-wc-email-cancelled-order.php:140
+#: includes/emails/class-wc-email-customer-completed-order.php:136
+#: includes/emails/class-wc-email-customer-refunded-order.php:226
+#: includes/emails/class-wc-email-failed-order.php:138
+#: includes/emails/class-wc-email-new-order.php:145
+#: includes/emails/class-wc-email.php:619
#: includes/gateways/bacs/class-wc-gateway-bacs.php:82
#: includes/gateways/cheque/class-wc-gateway-cheque.php:58
#: includes/gateways/cod/class-wc-gateway-cod.php:108
@@ -21827,59 +22611,59 @@ msgstr ""
msgid "Enable/Disable"
msgstr ""
-#: includes/emails/class-wc-email-cancelled-order.php:141
-#: includes/emails/class-wc-email-customer-completed-order.php:139
-#: includes/emails/class-wc-email-customer-refunded-order.php:231
-#: includes/emails/class-wc-email-failed-order.php:141
-#: includes/emails/class-wc-email-new-order.php:146
-#: includes/emails/class-wc-email.php:604
+#: includes/emails/class-wc-email-cancelled-order.php:142
+#: includes/emails/class-wc-email-customer-completed-order.php:138
+#: includes/emails/class-wc-email-customer-refunded-order.php:228
+#: includes/emails/class-wc-email-failed-order.php:140
+#: includes/emails/class-wc-email-new-order.php:147
+#: includes/emails/class-wc-email.php:621
msgid "Enable this email notification"
msgstr ""
-#: includes/emails/class-wc-email-cancelled-order.php:148
-#: includes/emails/class-wc-email-failed-order.php:148
-#: includes/emails/class-wc-email-new-order.php:153
+#: includes/emails/class-wc-email-cancelled-order.php:149
+#: includes/emails/class-wc-email-failed-order.php:147
+#: includes/emails/class-wc-email-new-order.php:154
#. translators: %s: admin email
#. translators: %s: WP admin email
#. translators: %s: WP admin email
msgid "Enter recipients (comma separated) for this email. Defaults to %s."
msgstr ""
-#: includes/emails/class-wc-email-cancelled-order.php:154
-#: includes/emails/class-wc-email-customer-completed-order.php:143
-#: includes/emails/class-wc-email-customer-invoice.php:180
-#: includes/emails/class-wc-email-failed-order.php:154
-#: includes/emails/class-wc-email-new-order.php:159
-#: includes/emails/class-wc-email.php:608
+#: includes/emails/class-wc-email-cancelled-order.php:155
+#: includes/emails/class-wc-email-customer-completed-order.php:142
+#: includes/emails/class-wc-email-customer-invoice.php:176
+#: includes/emails/class-wc-email-failed-order.php:153
+#: includes/emails/class-wc-email-new-order.php:160
+#: includes/emails/class-wc-email.php:625
msgid "Subject"
msgstr ""
-#: includes/emails/class-wc-email-cancelled-order.php:163
-#: includes/emails/class-wc-email-customer-completed-order.php:152
-#: includes/emails/class-wc-email-customer-invoice.php:189
-#: includes/emails/class-wc-email-failed-order.php:163
-#: includes/emails/class-wc-email-new-order.php:168
-#: includes/emails/class-wc-email.php:617
+#: includes/emails/class-wc-email-cancelled-order.php:164
+#: includes/emails/class-wc-email-customer-completed-order.php:151
+#: includes/emails/class-wc-email-customer-invoice.php:185
+#: includes/emails/class-wc-email-failed-order.php:162
+#: includes/emails/class-wc-email-new-order.php:169
+#: includes/emails/class-wc-email.php:634
msgid "Email heading"
msgstr ""
-#: includes/emails/class-wc-email-cancelled-order.php:172
-#: includes/emails/class-wc-email-customer-completed-order.php:161
-#: includes/emails/class-wc-email-customer-invoice.php:216
-#: includes/emails/class-wc-email-customer-refunded-order.php:271
-#: includes/emails/class-wc-email-failed-order.php:172
-#: includes/emails/class-wc-email-new-order.php:177
-#: includes/emails/class-wc-email.php:626
+#: includes/emails/class-wc-email-cancelled-order.php:173
+#: includes/emails/class-wc-email-customer-completed-order.php:160
+#: includes/emails/class-wc-email-customer-invoice.php:212
+#: includes/emails/class-wc-email-customer-refunded-order.php:268
+#: includes/emails/class-wc-email-failed-order.php:171
+#: includes/emails/class-wc-email-new-order.php:178
+#: includes/emails/class-wc-email.php:643
msgid "Email type"
msgstr ""
-#: includes/emails/class-wc-email-cancelled-order.php:174
-#: includes/emails/class-wc-email-customer-completed-order.php:163
-#: includes/emails/class-wc-email-customer-invoice.php:218
-#: includes/emails/class-wc-email-customer-refunded-order.php:273
-#: includes/emails/class-wc-email-failed-order.php:174
-#: includes/emails/class-wc-email-new-order.php:179
-#: includes/emails/class-wc-email.php:628
+#: includes/emails/class-wc-email-cancelled-order.php:175
+#: includes/emails/class-wc-email-customer-completed-order.php:162
+#: includes/emails/class-wc-email-customer-invoice.php:214
+#: includes/emails/class-wc-email-customer-refunded-order.php:270
+#: includes/emails/class-wc-email-failed-order.php:173
+#: includes/emails/class-wc-email-new-order.php:180
+#: includes/emails/class-wc-email.php:645
msgid "Choose which format of email to send."
msgstr ""
@@ -21894,11 +22678,11 @@ msgid ""
msgstr ""
#: includes/emails/class-wc-email-customer-completed-order.php:83
-msgid "Your {site_title} order from {order_date} is complete"
+msgid "Your {site_title} order is now complete"
msgstr ""
#: includes/emails/class-wc-email-customer-completed-order.php:93
-msgid "Your order is complete"
+msgid "Thanks for shopping with us"
msgstr ""
#: includes/emails/class-wc-email-customer-invoice.php:32
@@ -21912,23 +22696,26 @@ msgid ""
msgstr ""
#: includes/emails/class-wc-email-customer-invoice.php:57
-msgid "Your {site_title} order from {order_date}"
+msgid "Invoice for order #{order_number} on {site_title}"
msgstr ""
#: includes/emails/class-wc-email-customer-invoice.php:59
-#: includes/emails/class-wc-email-customer-invoice.php:74
-msgid "Invoice for order {order_number}"
+msgid "Your latest {site_title} invoice"
msgstr ""
#: includes/emails/class-wc-email-customer-invoice.php:72
-msgid "Your order details"
+msgid "Invoice for order #{order_number}"
msgstr ""
-#: includes/emails/class-wc-email-customer-invoice.php:198
+#: includes/emails/class-wc-email-customer-invoice.php:74
+msgid "Your invoice for order #{order_number}"
+msgstr ""
+
+#: includes/emails/class-wc-email-customer-invoice.php:194
msgid "Subject (paid)"
msgstr ""
-#: includes/emails/class-wc-email-customer-invoice.php:207
+#: includes/emails/class-wc-email-customer-invoice.php:203
msgid "Email heading (paid)"
msgstr ""
@@ -21943,7 +22730,7 @@ msgid ""
msgstr ""
#: includes/emails/class-wc-email-customer-new-account.php:76
-msgid "Your account on {site_title}"
+msgid "Your {site_title} account has been created!"
msgstr ""
#: includes/emails/class-wc-email-customer-new-account.php:86
@@ -21976,13 +22763,11 @@ msgid ""
"after an order is placed on-hold."
msgstr ""
-#: includes/emails/class-wc-email-customer-on-hold-order.php:57
-#: includes/emails/class-wc-email-customer-processing-order.php:59
-msgid "Your {site_title} order receipt from {order_date}"
+#: includes/emails/class-wc-email-customer-on-hold-order.php:58
+msgid "Your {site_title} order has been received!"
msgstr ""
-#: includes/emails/class-wc-email-customer-on-hold-order.php:67
-#: includes/emails/class-wc-email-customer-processing-order.php:69
+#: includes/emails/class-wc-email-customer-on-hold-order.php:68
msgid "Thank you for your order"
msgstr ""
@@ -21996,6 +22781,14 @@ msgid ""
"after payment."
msgstr ""
+#: includes/emails/class-wc-email-customer-processing-order.php:60
+msgid "Payment received for your order"
+msgstr ""
+
+#: includes/emails/class-wc-email-customer-processing-order.php:70
+msgid "Thank you for your payment"
+msgstr ""
+
#: includes/emails/class-wc-email-customer-refunded-order.php:46
msgid "Refunded order"
msgstr ""
@@ -22005,34 +22798,34 @@ msgid "Order refunded emails are sent to customers when their orders are refunde
msgstr ""
#: includes/emails/class-wc-email-customer-refunded-order.php:73
-msgid "Your {site_title} order from {order_date} has been partially refunded"
+msgid "Your {site_title} order #{order_number} has been partially refunded"
msgstr ""
#: includes/emails/class-wc-email-customer-refunded-order.php:75
-msgid "Your {site_title} order from {order_date} has been refunded"
+msgid "Your {site_title} order #{order_number} has been refunded"
msgstr ""
#: includes/emails/class-wc-email-customer-refunded-order.php:88
-msgid "Your order has been partially refunded"
+msgid "Partial Refund: Order {order_number}"
msgstr ""
#: includes/emails/class-wc-email-customer-refunded-order.php:90
-msgid "Order {order_number} details"
+msgid "Order Refunded: {order_number}"
msgstr ""
-#: includes/emails/class-wc-email-customer-refunded-order.php:235
+#: includes/emails/class-wc-email-customer-refunded-order.php:232
msgid "Full refund subject"
msgstr ""
-#: includes/emails/class-wc-email-customer-refunded-order.php:244
+#: includes/emails/class-wc-email-customer-refunded-order.php:241
msgid "Partial refund subject"
msgstr ""
-#: includes/emails/class-wc-email-customer-refunded-order.php:253
+#: includes/emails/class-wc-email-customer-refunded-order.php:250
msgid "Full refund email heading"
msgstr ""
-#: includes/emails/class-wc-email-customer-refunded-order.php:262
+#: includes/emails/class-wc-email-customer-refunded-order.php:259
msgid "Partial refund email heading"
msgstr ""
@@ -22048,15 +22841,14 @@ msgid ""
msgstr ""
#: includes/emails/class-wc-email-customer-reset-password.php:82
-msgid "Password reset for {site_title}"
+msgid "Password Reset Request for {site_title}"
msgstr ""
#: includes/emails/class-wc-email-customer-reset-password.php:92
-msgid "Password reset instructions"
+msgid "Password Reset Request"
msgstr ""
#: includes/emails/class-wc-email-failed-order.php:31
-#: includes/emails/class-wc-email-failed-order.php:69
msgid "Failed order"
msgstr ""
@@ -22067,7 +22859,11 @@ msgid ""
msgstr ""
#: includes/emails/class-wc-email-failed-order.php:59
-msgid "[{site_title}] Failed order ({order_number})"
+msgid "[{site_title}]: Order #{order_number} has failed"
+msgstr ""
+
+#: includes/emails/class-wc-email-failed-order.php:69
+msgid "Order Failed: #{order_number}"
msgstr ""
#: includes/emails/class-wc-email-new-order.php:32
@@ -22076,83 +22872,83 @@ msgid ""
"received."
msgstr ""
-#: includes/emails/class-wc-email-new-order.php:63
-msgid "[{site_title}] New customer order ({order_number}) - {order_date}"
+#: includes/emails/class-wc-email-new-order.php:66
+msgid "[{site_title}]: New order #{order_number}"
msgstr ""
-#: includes/emails/class-wc-email-new-order.php:73
-msgid "New customer order"
+#: includes/emails/class-wc-email-new-order.php:76
+msgid "New Order: #{order_number}"
msgstr ""
-#: includes/emails/class-wc-email.php:643
+#: includes/emails/class-wc-email.php:660
msgid "Plain text"
msgstr ""
-#: includes/emails/class-wc-email.php:646
+#: includes/emails/class-wc-email.php:663
msgid "HTML"
msgstr ""
-#: includes/emails/class-wc-email.php:647
+#: includes/emails/class-wc-email.php:664
msgid "Multipart"
msgstr ""
-#: includes/emails/class-wc-email.php:712
+#: includes/emails/class-wc-email.php:729
msgid "Could not write to template file."
msgstr ""
-#: includes/emails/class-wc-email.php:759
+#: includes/emails/class-wc-email.php:776
msgid "Template file copied to theme."
msgstr ""
-#: includes/emails/class-wc-email.php:790
+#: includes/emails/class-wc-email.php:807
msgid "Template file deleted from theme."
msgstr ""
-#: includes/emails/class-wc-email.php:838
+#: includes/emails/class-wc-email.php:855
msgid "Return to emails"
msgstr ""
-#: includes/emails/class-wc-email.php:871
+#: includes/emails/class-wc-email.php:888
msgid "HTML template"
msgstr ""
-#: includes/emails/class-wc-email.php:872
+#: includes/emails/class-wc-email.php:889
msgid "Plain text template"
msgstr ""
-#: includes/emails/class-wc-email.php:896
+#: includes/emails/class-wc-email.php:913
msgid "Delete template file"
msgstr ""
-#: includes/emails/class-wc-email.php:902
+#: includes/emails/class-wc-email.php:919
#. translators: %s: Path to template file
msgid "This template has been overridden by your theme and can be found in: %s."
msgstr ""
-#: includes/emails/class-wc-email.php:935
+#: includes/emails/class-wc-email.php:952
msgid "Copy file to theme"
msgstr ""
-#: includes/emails/class-wc-email.php:941
+#: includes/emails/class-wc-email.php:958
#. translators: 1: Path to template file 2: Path to theme folder
msgid ""
"To override and edit this email template copy %1$s to your theme folder: "
"%2$s."
msgstr ""
-#: includes/emails/class-wc-email.php:949
+#: includes/emails/class-wc-email.php:966
msgid "File was not found."
msgstr ""
-#: includes/emails/class-wc-email.php:973
+#: includes/emails/class-wc-email.php:990
msgid "View template"
msgstr ""
-#: includes/emails/class-wc-email.php:974
+#: includes/emails/class-wc-email.php:991
msgid "Hide template"
msgstr ""
-#: includes/emails/class-wc-email.php:985
+#: includes/emails/class-wc-email.php:1002
msgid "Are you sure you want to delete this template file?"
msgstr ""
@@ -22265,33 +23061,33 @@ msgstr ""
msgid "Awaiting BACS payment"
msgstr ""
-#: includes/gateways/bacs/class-wc-gateway-bacs.php:395
+#: includes/gateways/bacs/class-wc-gateway-bacs.php:392
msgid "BSB"
msgstr ""
-#: includes/gateways/bacs/class-wc-gateway-bacs.php:400
+#: includes/gateways/bacs/class-wc-gateway-bacs.php:397
msgid "Bank transit number"
msgstr ""
-#: includes/gateways/bacs/class-wc-gateway-bacs.php:405
+#: includes/gateways/bacs/class-wc-gateway-bacs.php:402
msgid "IFSC"
msgstr ""
-#: includes/gateways/bacs/class-wc-gateway-bacs.php:410
+#: includes/gateways/bacs/class-wc-gateway-bacs.php:407
msgid "Branch sort"
msgstr ""
-#: includes/gateways/bacs/class-wc-gateway-bacs.php:415
-#: includes/gateways/bacs/class-wc-gateway-bacs.php:420
+#: includes/gateways/bacs/class-wc-gateway-bacs.php:412
+#: includes/gateways/bacs/class-wc-gateway-bacs.php:417
msgid "Bank code"
msgstr ""
-#: includes/gateways/bacs/class-wc-gateway-bacs.php:425
+#: includes/gateways/bacs/class-wc-gateway-bacs.php:422
#: includes/gateways/class-wc-payment-gateway-echeck.php:47
msgid "Routing number"
msgstr ""
-#: includes/gateways/bacs/class-wc-gateway-bacs.php:430
+#: includes/gateways/bacs/class-wc-gateway-bacs.php:427
msgid "Branch code"
msgstr ""
@@ -22394,7 +23190,7 @@ msgstr ""
msgid "Accept COD if the order is virtual"
msgstr ""
-#: includes/gateways/cod/class-wc-gateway-cod.php:282
+#: includes/gateways/cod/class-wc-gateway-cod.php:279
msgid "Payment to be made upon delivery."
msgstr ""
@@ -22421,126 +23217,126 @@ msgid ""
"href=\"%s\">PayPal Sandbox Testing Guide for more details."
msgstr ""
-#: includes/gateways/paypal/class-wc-gateway-paypal.php:148
+#: includes/gateways/paypal/class-wc-gateway-paypal.php:153
msgid "PayPal acceptance mark"
msgstr ""
-#: includes/gateways/paypal/class-wc-gateway-paypal.php:151
+#: includes/gateways/paypal/class-wc-gateway-paypal.php:156
msgid "What is PayPal?"
msgstr ""
-#: includes/gateways/paypal/class-wc-gateway-paypal.php:275
+#: includes/gateways/paypal/class-wc-gateway-paypal.php:280
msgid "Gateway disabled"
msgstr ""
-#: includes/gateways/paypal/class-wc-gateway-paypal.php:275
+#: includes/gateways/paypal/class-wc-gateway-paypal.php:280
msgid "PayPal does not support your store currency."
msgstr ""
-#: includes/gateways/paypal/class-wc-gateway-paypal.php:364
+#: includes/gateways/paypal/class-wc-gateway-paypal.php:369
msgid "Refund failed."
msgstr ""
-#: includes/gateways/paypal/class-wc-gateway-paypal.php:383
+#: includes/gateways/paypal/class-wc-gateway-paypal.php:388
#. translators: 1: Refund amount, 2: Refund ID
msgid "Refunded %1$s - Refund ID: %2$s"
msgstr ""
-#: includes/gateways/paypal/class-wc-gateway-paypal.php:406
+#: includes/gateways/paypal/class-wc-gateway-paypal.php:411
#. translators: %s: Paypal gateway error message
msgid "Payment could not captured: %s"
msgstr ""
-#: includes/gateways/paypal/class-wc-gateway-paypal.php:417
+#: includes/gateways/paypal/class-wc-gateway-paypal.php:422
#. translators: 1: Amount, 2: Authorization ID, 3: Transaction ID
msgid "Payment of %1$s was captured - Auth ID: %2$s, Transaction ID: %3$s"
msgstr ""
-#: includes/gateways/paypal/class-wc-gateway-paypal.php:423
+#: includes/gateways/paypal/class-wc-gateway-paypal.php:428
#. translators: 1: Authorization ID, 2: Payment status
msgid "Payment could not captured - Auth ID: %1$s, Status: %2$s"
msgstr ""
-#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:144
+#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:143
#. translators: %s: currency code.
msgid "Validation error: PayPal currencies do not match (code %s)."
msgstr ""
-#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:160
+#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:159
#. translators: %s: Amount.
msgid "Validation error: PayPal amounts do not match (gross %s)."
msgstr ""
-#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:177
+#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:176
#. translators: %s: email address .
msgid "Validation error: PayPal IPN response from a different email address (%s)."
msgstr ""
-#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:205
+#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:204
msgid "IPN payment completed"
msgstr ""
-#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:213
+#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:212
#: includes/gateways/paypal/includes/class-wc-gateway-paypal-pdt-handler.php:126
msgid ""
"Payment authorized. Change payment status to processing or complete to "
"capture funds."
msgstr ""
-#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:216
+#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:215
#: includes/gateways/paypal/includes/class-wc-gateway-paypal-pdt-handler.php:129
#. translators: %s: pending reason.
#. translators: 1: Pending reason
msgid "Payment pending (%s)."
msgstr ""
-#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:239
-#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:298
-#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:317
+#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:238
+#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:297
+#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:316
#. translators: %s: payment status.
msgid "Payment %s via IPN."
msgstr ""
-#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:281
+#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:280
#. translators: %s: order link.
msgid "Payment for cancelled order %s received"
msgstr ""
-#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:283
+#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:282
#. translators: %s: order ID.
msgid ""
"Order #%s has been marked paid by PayPal IPN, but was previously cancelled. "
"Admin handling required."
msgstr ""
-#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:302
+#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:301
#. translators: %s: order link.
msgid "Payment for order %s refunded"
msgstr ""
-#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:304
+#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:303
#. translators: %1$s: order ID, %2$s: reason code.
msgid "Order #%1$s has been marked as refunded - PayPal reason code: %2$s"
msgstr ""
-#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:321
+#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:320
#. translators: %s: order link.
msgid "Payment for order %s reversed"
msgstr ""
-#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:323
+#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:322
#. translators: %1$s: order ID, %2$s: reason code.
msgid ""
"Order #%1$s has been marked on-hold due to a reversal - PayPal reason code: "
"%2$s"
msgstr ""
-#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:336
+#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:335
#. translators: %s: order link.
msgid "Reversal cancelled for order #%s"
msgstr ""
-#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:338
+#: includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php:337
#. translators: %1$s: order ID, %2$s: order link.
msgid ""
"Order #%1$s has had a reversal cancelled. Please check the status of "
@@ -22802,58 +23598,58 @@ msgid "Error creating user in Simplify Commerce."
msgstr ""
#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:183
-#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:293
+#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:290
#: includes/gateways/simplify-commerce/class-wc-gateway-simplify-commerce.php:504
msgid "Sorry, the minimum allowed order total is 0.50 to use this payment method."
msgstr ""
-#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:299
-#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:443
+#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:296
+#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:440
msgid "Customer not found."
msgstr ""
-#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:308
+#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:305
#: includes/gateways/simplify-commerce/class-wc-gateway-simplify-commerce.php:511
msgid "%1$s - Order #%2$s"
msgstr ""
-#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:325
+#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:322
#: includes/gateways/simplify-commerce/class-wc-gateway-simplify-commerce.php:530
msgid "Simplify payment error: %s."
msgstr ""
-#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:335
-#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:462
+#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:332
+#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:459
#: includes/gateways/simplify-commerce/class-wc-gateway-simplify-commerce.php:540
#: includes/gateways/simplify-commerce/class-wc-gateway-simplify-commerce.php:709
msgid "Simplify payment approved (ID: %1$s, Auth Code: %2$s)"
msgstr ""
-#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:339
+#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:336
#: includes/gateways/simplify-commerce/class-wc-gateway-simplify-commerce.php:544
msgid "Simplify payment declined"
msgstr ""
-#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:341
+#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:338
#: includes/gateways/simplify-commerce/class-wc-gateway-simplify-commerce.php:546
msgid "Payment was declined - please try another card."
msgstr ""
-#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:355
-#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:467
+#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:352
+#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:464
msgid "Simplify Transaction Failed (%s)"
msgstr ""
-#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:434
+#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:431
#. translators: 1: site name 2: product name 3: order number
msgid "%1$s - Pre-order for \"%2$s\" (Order #%3$s)"
msgstr ""
-#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:464
+#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:461
msgid "Payment was declined - the customer need to try another card."
msgstr ""
-#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:511
+#: includes/gateways/simplify-commerce/class-wc-addons-gateway-simplify-commerce.php:508
#: includes/gateways/simplify-commerce/class-wc-gateway-simplify-commerce.php:681
msgid "Payment was declined by Simplify Commerce."
msgstr ""
@@ -23051,30 +23847,30 @@ msgstr ""
msgid "Unable to use image \"%s\"."
msgstr ""
-#: includes/import/class-wc-product-csv-importer.php:858
+#: includes/import/class-wc-product-csv-importer.php:860
#. translators: %d: product ID
msgid "ID %d"
msgstr ""
-#: includes/import/class-wc-product-csv-importer.php:862
+#: includes/import/class-wc-product-csv-importer.php:864
#. translators: %s: product SKU
msgid "SKU %s"
msgstr ""
-#: includes/import/class-wc-product-csv-importer.php:908
+#: includes/import/class-wc-product-csv-importer.php:910
msgid "A product with this ID already exists."
msgstr ""
-#: includes/import/class-wc-product-csv-importer.php:916
+#: includes/import/class-wc-product-csv-importer.php:918
msgid "A product with this SKU already exists."
msgstr ""
-#: includes/import/class-wc-product-csv-importer.php:924
+#: includes/import/class-wc-product-csv-importer.php:926
msgid "No matching product exists to update."
msgstr ""
#: includes/legacy/abstract-wc-legacy-order.php:507
-#: includes/wc-template-functions.php:3072
+#: includes/wc-template-functions.php:3080
#. translators: 1: current item count
#. translators: %d: downloads count
msgid "Download %d"
@@ -23084,6 +23880,365 @@ msgstr ""
msgid "Product properties should not be accessed directly."
msgstr ""
+#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:48
+#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:63
+#: includes/libraries/action-scheduler/classes/ActionScheduler_AdminView.php:64
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:89
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore_PostTypeRegistrar.php:19
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore_PostTypeRegistrar.php:30
+msgid "Scheduled Actions"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_InvalidActionException.php:22
+msgid "Action [%s] has invalid arguments. It cannot be JSON decoded to an array."
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:96
+msgid "Hook"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:98
+msgid "Arguments"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:99
+msgid "Group"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:100
+msgid "Recurrence"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:101
+msgid "Scheduled Date"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:102
+msgid "Log"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:122
+msgid "Claim ID"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:129
+msgid "Run"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:130
+msgid "Process the action now as if it were run as part of a queue"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:134
+msgid "Cancel the action now to avoid it being run in future"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:143
+msgid "%s year"
+msgid_plural "%s years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:147
+msgid "%s month"
+msgid_plural "%s months"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:151
+msgid "%s week"
+msgid_plural "%s weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:155
+msgid "%s day"
+msgid_plural "%s days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:159
+msgid "%s hour"
+msgid_plural "%s hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:163
+msgid "%s minute"
+msgid_plural "%s minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:167
+msgid "%s second"
+msgid_plural "%s seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:194
+msgid "Now!"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:226
+msgid "Every %s"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:228
+msgid "Non-repeating"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:314
+msgid ""
+"Maximum simultaneous batches already in progress (%s queues). No actions "
+"will be processed until the current batches are complete."
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:329
+msgid "Successfully executed action: %s"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:332
+msgid "Successfully canceled action: %s"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:335
+msgid "Successfully processed change for action: %s"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:340
+msgid "Could not process change for action: \"%s\" (ID: %d). Error: %s"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:385
+msgid " (%s ago)"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:387
+msgid " (%s)"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_ListTable.php:524
+msgid "Search hook, args and claim ID"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_Logger.php:61
+msgid "action created"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_Logger.php:65
+msgid "action canceled"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_Logger.php:69
+msgid "action started"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_Logger.php:73
+msgid "action complete"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_Logger.php:77
+msgid "action failed: %s"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_Logger.php:81
+msgid "action timed out after %s seconds"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_Logger.php:86
+msgid "unexpected shutdown: PHP Fatal error %s in %s on line %s"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_Logger.php:91
+msgid "action reset"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_Logger.php:95
+msgid "action ignored"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_QueueRunner.php:110
+msgid "Every minute"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_Store.php:152
+#: includes/libraries/action-scheduler/classes/ActionScheduler_Store.php:169
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore.php:231
+msgid "Invalid schedule. Cannot save action."
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_Store.php:182
+msgid "Pending"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_Store.php:183
+msgid "In-progress"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_Store.php:184
+msgid "Failed"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_Store.php:185
+msgid "Canceled"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_WPCLI_QueueRunner.php:58
+msgid "There are too many concurrent batches, but the run is forced to continue."
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_WPCLI_QueueRunner.php:60
+msgid "There are too many concurrent batches."
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_WPCLI_QueueRunner.php:91
+msgid "Running %d action"
+msgid_plural "Running %d actions"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_WPCLI_QueueRunner.php:108
+msgid "The claim has been lost. Aborting current batch."
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_WPCLI_QueueRunner.php:138
+#. translators: %s refers to the action ID
+msgid "Started processing action %s"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_WPCLI_QueueRunner.php:150
+#. translators: %s refers to the action ID
+msgid "Completed processing action %s"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_WPCLI_QueueRunner.php:165
+#. translators: %1$s refers to the action ID, %2$s refers to the Exception
+#. message
+msgid "Error processing action %1$s: %2$s"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_WPCLI_QueueRunner.php:177
+msgid "second"
+msgid_plural "seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_WPCLI_QueueRunner.php:181
+msgid "Attempting to reduce used memory..."
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_WPCLI_Scheduler_command.php:87
+#. translators: %d refers to how many scheduled taks were found to run
+msgid "Found %d scheduled task"
+msgid_plural "Found %d scheduled tasks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_WPCLI_Scheduler_command.php:104
+#. translators: %d refers to the total number of batches executed
+msgid "%d batch executed."
+msgid_plural "%d batches executed."
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_WPCLI_Scheduler_command.php:123
+#. translators: %s refers to the exception error message.
+msgid "There was an error running the action scheduler: %s"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_WPCLI_Scheduler_command.php:140
+#. translators: %d refers to the total number of taskes completed
+msgid "%d scheduled task completed."
+msgid_plural "%d scheduled tasks completed."
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore.php:27
+msgid "Error saving action: %s"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore.php:49
+msgid "Unable to save action."
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore.php:404
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore.php:413
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore.php:439
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore.php:716
+msgid "Unidentified action %s"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore.php:551
+msgid "Unable to claim actions. Database error."
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore.php:571
+msgid "The group \"%s\" does not exist."
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore.php:639
+msgid "Unable to unlock claim %s. Database error."
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore.php:653
+msgid "Unable to unlock claim on action %s. Database error."
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore.php:664
+msgid "Unable to mark failure on action %s. Database error."
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore.php:688
+msgid "Invalid action ID. No status found."
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore_PostStatusRegistrar.php:51
+msgid "In-Progress (%s) "
+msgid_plural "In-Progress (%s) "
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore_PostTypeRegistrar.php:20
+msgid "Scheduled actions are hooks triggered on a cetain date and time."
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore_PostTypeRegistrar.php:31
+msgid "Scheduled Action"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore_PostTypeRegistrar.php:34
+msgid "Add New Scheduled Action"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore_PostTypeRegistrar.php:36
+msgid "Edit Scheduled Action"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore_PostTypeRegistrar.php:37
+msgid "New Scheduled Action"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore_PostTypeRegistrar.php:38
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore_PostTypeRegistrar.php:39
+msgid "View Action"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore_PostTypeRegistrar.php:40
+msgid "Search Scheduled Actions"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore_PostTypeRegistrar.php:41
+msgid "No actions found"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore_PostTypeRegistrar.php:42
+msgid "No actions found in trash"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore_TaxonomyRegistrar.php:14
+msgid "Action Group"
+msgstr ""
+
#: includes/libraries/wp-background-process.php:423
msgid "Every %d Minutes"
msgstr ""
@@ -23106,8 +24261,8 @@ msgstr[1] ""
msgid "Visit %s admin area:"
msgstr ""
-#: includes/log-handlers/class-wc-log-handler-file.php:350
-#: includes/log-handlers/class-wc-log-handler-file.php:370
+#: includes/log-handlers/class-wc-log-handler-file.php:348
+#: includes/log-handlers/class-wc-log-handler-file.php:368
msgid "This method should not be called before plugins_loaded."
msgstr ""
@@ -23123,6 +24278,17 @@ msgstr ""
msgid "eCheck ending in %1$s"
msgstr ""
+#: includes/queue/class-wc-queue.php:60
+msgid "This function should not be called before plugins_loaded."
+msgstr ""
+
+#: includes/queue/class-wc-queue.php:76
+#. translators: %s: Default class name
+msgid ""
+"The class attached to the \"woocommerce_queue_class\" does not implement "
+"the WC_Queue_Interface interface. The default %s class will be used instead."
+msgstr ""
+
#: includes/shipping/flat-rate/class-wc-shipping-flat-rate.php:31
#: includes/shipping/flat-rate/includes/settings-flat-rate.php:17
#: includes/shipping/legacy-flat-rate/includes/settings-flat-rate.php:28
@@ -23435,35 +24601,35 @@ msgstr ""
msgid "Shipping costs updated."
msgstr ""
-#: includes/shortcodes/class-wc-shortcode-checkout.php:94
-#: includes/shortcodes/class-wc-shortcode-checkout.php:174
+#: includes/shortcodes/class-wc-shortcode-checkout.php:92
+#: includes/shortcodes/class-wc-shortcode-checkout.php:201
msgid "Sorry, this order is invalid and cannot be paid for."
msgstr ""
-#: includes/shortcodes/class-wc-shortcode-checkout.php:99
+#: includes/shortcodes/class-wc-shortcode-checkout.php:97
msgid "Please log in to your account below to continue to the payment form."
msgstr ""
-#: includes/shortcodes/class-wc-shortcode-checkout.php:110
+#: includes/shortcodes/class-wc-shortcode-checkout.php:108
msgid "This order cannot be paid for. Please contact us if you need assistance."
msgstr ""
-#: includes/shortcodes/class-wc-shortcode-checkout.php:116
-#: includes/shortcodes/class-wc-shortcode-checkout.php:171
+#: includes/shortcodes/class-wc-shortcode-checkout.php:114
+#: includes/shortcodes/class-wc-shortcode-checkout.php:198
#. translators: %s: order status
msgid ""
"This order’s status is “%s”—it cannot be paid for. "
"Please contact us if you need assistance."
msgstr ""
-#: includes/shortcodes/class-wc-shortcode-checkout.php:126
+#: includes/shortcodes/class-wc-shortcode-checkout.php:143
#. translators: %s: product name
msgid ""
"Sorry, \"%s\" is no longer in stock so this order cannot be paid for. We "
"apologize for any inconvenience caused."
msgstr ""
-#: includes/shortcodes/class-wc-shortcode-checkout.php:247
+#: includes/shortcodes/class-wc-shortcode-checkout.php:271
msgid ""
"The order totals have been updated. Please confirm your order by pressing "
"the \"Place order\" button at the bottom of the page."
@@ -23556,20 +24722,20 @@ msgstr ""
msgid "and"
msgstr ""
-#: includes/wc-cart-functions.php:259
+#: includes/wc-cart-functions.php:261
#. translators: %s: coupon code
msgid "Coupon: %s"
msgstr ""
-#: includes/wc-cart-functions.php:284
+#: includes/wc-cart-functions.php:286
msgid "Free shipping coupon"
msgstr ""
-#: includes/wc-cart-functions.php:288
+#: includes/wc-cart-functions.php:290
msgid "[Remove]"
msgstr ""
-#: includes/wc-cart-functions.php:315
+#: includes/wc-cart-functions.php:317
#. translators: %s: country name
msgid "estimated for %s"
msgstr ""
@@ -24251,7 +25417,7 @@ msgstr ""
msgid "JCB"
msgstr ""
-#: includes/wc-core-functions.php:1650
+#: includes/wc-core-functions.php:1649
#. translators: 1: class name 2: woocommerce_logging_class 3:
#. WC_Logger_Interface
msgid "The class %1$s provided by %2$s filter must implement %3$s."
@@ -24269,49 +25435,49 @@ msgstr ""
msgid "Fixed product discount"
msgstr ""
-#: includes/wc-formatting-functions.php:1137
+#: includes/wc-formatting-functions.php:1140
#. translators: %s: stock amount
msgid "Only %s left in stock"
msgstr ""
-#: includes/wc-formatting-functions.php:1142
+#: includes/wc-formatting-functions.php:1145
#. translators: %s: stock amount
msgid "%s in stock"
msgstr ""
-#: includes/wc-formatting-functions.php:1147
+#: includes/wc-formatting-functions.php:1150
msgid "(can be backordered)"
msgstr ""
#: includes/wc-notice-functions.php:25 includes/wc-notice-functions.php:56
#: includes/wc-notice-functions.php:74 includes/wc-notice-functions.php:98
-#: includes/wc-notice-functions.php:112 includes/wc-notice-functions.php:125
-#: includes/wc-notice-functions.php:172
+#: includes/wc-notice-functions.php:112 includes/wc-notice-functions.php:127
+#: includes/wc-notice-functions.php:182
msgid "This function should not be called before woocommerce_init."
msgstr ""
-#: includes/wc-order-functions.php:495
+#: includes/wc-order-functions.php:497
msgid "Invalid refund amount."
msgstr ""
-#: includes/wc-order-functions.php:632
+#: includes/wc-order-functions.php:634
msgid "The payment gateway for this order does not exist."
msgstr ""
-#: includes/wc-order-functions.php:636
+#: includes/wc-order-functions.php:638
msgid "The payment gateway for this order does not support automatic refunds."
msgstr ""
-#: includes/wc-order-functions.php:677
+#: includes/wc-order-functions.php:679
#. translators: 1: product ID 2: old stock level 3: new stock level
msgid "Item #%1$s stock increased from %2$s to %3$s."
msgstr ""
-#: includes/wc-order-functions.php:738 includes/wc-update-functions.php:915
+#: includes/wc-order-functions.php:740 includes/wc-update-functions.php:915
msgid "Order fully refunded"
msgstr ""
-#: includes/wc-order-functions.php:868
+#: includes/wc-order-functions.php:870
msgid "Unpaid order cancelled - time limit reached."
msgstr ""
@@ -24320,131 +25486,166 @@ msgstr ""
msgid "%1$s should not be called before the %2$s action."
msgstr ""
-#: includes/wc-product-functions.php:750
+#: includes/wc-product-functions.php:534
+msgid "Simple product"
+msgstr ""
+
+#: includes/wc-product-functions.php:535
+msgid "Grouped product"
+msgstr ""
+
+#: includes/wc-product-functions.php:536
+msgid "External/Affiliate product"
+msgstr ""
+
+#: includes/wc-product-functions.php:537
+msgid "Variable product"
+msgstr ""
+
+#: includes/wc-product-functions.php:771
msgid "Shop and search results"
msgstr ""
-#: includes/wc-product-functions.php:751
+#: includes/wc-product-functions.php:772
msgid "Shop only"
msgstr ""
-#: includes/wc-product-functions.php:752
+#: includes/wc-product-functions.php:773
msgid "Search results only"
msgstr ""
-#: includes/wc-product-functions.php:839
+#: includes/wc-product-functions.php:861
msgid "Do not allow"
msgstr ""
-#: includes/wc-product-functions.php:840
+#: includes/wc-product-functions.php:862
msgid "Allow, but notify customer"
msgstr ""
-#: includes/wc-product-functions.php:841
+#: includes/wc-product-functions.php:863
msgid "Allow"
msgstr ""
-#: includes/wc-rest-functions.php:205
+#: includes/wc-rest-functions.php:206
#. translators: 1: param 2: type
msgid "%1$s is not of type %2$s"
msgstr ""
-#: includes/wc-rest-functions.php:212
+#: includes/wc-rest-functions.php:213
msgid "The date you provided is invalid."
msgstr ""
+#: includes/wc-stock-functions.php:174
+#. translators: %s item name.
+msgid "Unable to reduce stock for item %s."
+msgstr ""
+
+#: includes/wc-stock-functions.php:228
+msgid "Stock levels reduced:"
+msgstr ""
+
+#: includes/wc-stock-functions.php:269
+#. translators: %s item name.
+msgid "Unable to restore stock for item %s."
+msgstr ""
+
+#: includes/wc-stock-functions.php:280
+msgid "Stock levels increased:"
+msgstr ""
+
#: includes/wc-template-functions.php:28
msgid "Checkout is not available whilst your cart is empty."
msgstr ""
-#: includes/wc-template-functions.php:848
+#: includes/wc-template-functions.php:845
msgid "privacy policy"
msgstr ""
-#: includes/wc-template-functions.php:849
+#: includes/wc-template-functions.php:846
msgid "terms and conditions"
msgstr ""
-#: includes/wc-template-functions.php:989
+#: includes/wc-template-functions.php:986
#. translators: %s: search query
msgid "Search results: “%s”"
msgstr ""
-#: includes/wc-template-functions.php:993
+#: includes/wc-template-functions.php:990
#. translators: %s: page number
msgid " – Page %s"
msgstr ""
-#: includes/wc-template-functions.php:1298
+#: includes/wc-template-functions.php:1295
msgid "Default sorting"
msgstr ""
-#: includes/wc-template-functions.php:1299
+#: includes/wc-template-functions.php:1296
msgid "Sort by popularity"
msgstr ""
-#: includes/wc-template-functions.php:1300
+#: includes/wc-template-functions.php:1297
msgid "Sort by average rating"
msgstr ""
-#: includes/wc-template-functions.php:1301
-msgid "Sort by newness"
+#: includes/wc-template-functions.php:1298
+msgid "Sort by latest"
msgstr ""
-#: includes/wc-template-functions.php:1302
+#: includes/wc-template-functions.php:1299
msgid "Sort by price: low to high"
msgstr ""
-#: includes/wc-template-functions.php:1303
+#: includes/wc-template-functions.php:1300
msgid "Sort by price: high to low"
msgstr ""
-#: includes/wc-template-functions.php:1310
+#: includes/wc-template-functions.php:1307
msgid "Relevance"
msgstr ""
-#: includes/wc-template-functions.php:1660
+#: includes/wc-template-functions.php:1657
#: templates/checkout/form-shipping.php:63
#: templates/single-product/tabs/additional-information.php:25
msgid "Additional information"
msgstr ""
-#: includes/wc-template-functions.php:1670
+#: includes/wc-template-functions.php:1667
#. translators: %s: reviews count
msgid "Reviews (%d)"
msgstr ""
-#: includes/wc-template-functions.php:2099
+#: includes/wc-template-functions.php:2104
msgid "Place order"
msgstr ""
-#: includes/wc-template-functions.php:2538
+#: includes/wc-template-functions.php:2544
msgid "Update country"
msgstr ""
-#: includes/wc-template-functions.php:2557
-#: templates/cart/shipping-calculator.php:65
+#: includes/wc-template-functions.php:2563
+#: templates/cart/shipping-calculator.php:56
msgid "Select a state…"
msgstr ""
-#: includes/wc-template-functions.php:2605
-#: includes/wc-template-functions.php:2767
-#: includes/wc-template-functions.php:2783
+#: includes/wc-template-functions.php:2611
+#: includes/wc-template-functions.php:2773
+#: includes/wc-template-functions.php:2789
msgid "Choose an option"
msgstr ""
-#: includes/wc-template-functions.php:3175
+#: includes/wc-template-functions.php:3183
#. translators: 1: rating 2: rating count
msgid "Rated %1$s out of 5 based on %2$s customer rating"
msgid_plural "Rated %1$s out of 5 based on %2$s customer ratings"
msgstr[0] ""
msgstr[1] ""
-#: includes/wc-template-functions.php:3221
+#: includes/wc-template-functions.php:3229
msgid "Your cart is currently empty."
msgstr ""
-#: includes/wc-term-functions.php:190
+#: includes/wc-term-functions.php:188
+#: includes/widgets/class-wc-widget-product-categories.php:260
msgid "Select a category"
msgstr ""
@@ -24614,7 +25815,7 @@ msgstr ""
msgid "Maximum depth"
msgstr ""
-#: includes/widgets/class-wc-widget-product-categories.php:258
+#: includes/widgets/class-wc-widget-product-categories.php:281
msgid "No product categories exist."
msgstr ""
@@ -24756,7 +25957,7 @@ msgid ""
"cancel and return to %1$s "
msgstr ""
-#: templates/auth/form-login.php:40 templates/myaccount/form-login.php:43
+#: templates/auth/form-login.php:40 templates/myaccount/form-login.php:39
msgid "Username or email address"
msgstr ""
@@ -24764,14 +25965,36 @@ msgstr ""
msgid "Application authentication request"
msgstr ""
-#: templates/cart/cart-shipping.php:50 templates/cart/cart-shipping.php:52
+#: templates/cart/cart-shipping.php:51
+#. Translators: $s shipping destination.
+msgid "Estimate for %s."
+msgstr ""
+
+#: templates/cart/cart-shipping.php:52
+msgid "Change address"
+msgstr ""
+
+#: templates/cart/cart-shipping.php:54
+msgid "This is only an estimate. Prices will be updated during checkout."
+msgstr ""
+
+#: templates/cart/cart-shipping.php:61
+msgid "Enter your address to view shipping options."
+msgstr ""
+
+#: templates/cart/cart-shipping.php:63
msgid ""
"There are no shipping methods available. Please ensure that your address "
"has been entered correctly, or contact us if you need any help."
msgstr ""
-#: templates/cart/cart-shipping.php:56
-msgid "Enter your full address to see shipping costs."
+#: templates/cart/cart-shipping.php:66
+#. Translators: $s shipping destination.
+msgid "No shipping options were found for %s."
+msgstr ""
+
+#: templates/cart/cart-shipping.php:67
+msgid "Enter a different address"
msgstr ""
#: templates/cart/cart-totals.php:28
@@ -24779,7 +26002,7 @@ msgid "Cart totals"
msgstr ""
#: templates/cart/cart-totals.php:33 templates/cart/cart-totals.php:34
-#: templates/cart/mini-cart.php:72 templates/checkout/review-order.php:59
+#: templates/cart/mini-cart.php:71 templates/checkout/review-order.php:59
msgid "Subtotal"
msgstr ""
@@ -24787,15 +26010,15 @@ msgstr ""
msgid "(estimated for %s)"
msgstr ""
-#: templates/cart/cart.php:57 templates/cart/mini-cart.php:47
+#: templates/cart/cart.php:55 templates/cart/mini-cart.php:47
msgid "Remove this item"
msgstr ""
-#: templates/cart/cart.php:138
+#: templates/cart/cart.php:136
msgid "Coupon:"
msgstr ""
-#: templates/cart/cart.php:143
+#: templates/cart/cart.php:141
msgid "Update cart"
msgstr ""
@@ -24803,7 +26026,7 @@ msgstr ""
msgid "You may be interested in…"
msgstr ""
-#: templates/cart/mini-cart.php:80
+#: templates/cart/mini-cart.php:79
msgid "No products in the cart."
msgstr ""
@@ -24811,21 +26034,17 @@ msgstr ""
msgid "Proceed to checkout"
msgstr ""
-#: templates/cart/shipping-calculator.php:30
+#: templates/cart/shipping-calculator.php:24
msgid "Calculate shipping"
msgstr ""
-#: templates/cart/shipping-calculator.php:100 templates/checkout/payment.php:41
-msgid "Update totals"
-msgstr ""
-
-#: templates/checkout/cart-errors.php:27
+#: templates/checkout/cart-errors.php:21
msgid ""
-"There are some issues with the items in your cart (shown above). Please go "
-"back to the cart page and resolve these issues before checking out."
+"There are some issues with the items in your cart. Please go back to the "
+"cart page and resolve these issues before checking out."
msgstr ""
-#: templates/checkout/cart-errors.php:31
+#: templates/checkout/cart-errors.php:25
msgid "Return to cart"
msgstr ""
@@ -24837,11 +26056,11 @@ msgstr ""
msgid "Create an account?"
msgstr ""
-#: templates/checkout/form-checkout.php:29
+#: templates/checkout/form-checkout.php:26
msgid "You must be logged in to checkout."
msgstr ""
-#: templates/checkout/form-checkout.php:55
+#: templates/checkout/form-checkout.php:52
msgid "Your order"
msgstr ""
@@ -24909,6 +26128,10 @@ msgid ""
"do so."
msgstr ""
+#: templates/checkout/payment.php:41
+msgid "Update totals"
+msgstr ""
+
#: templates/checkout/thankyou.php:30
msgid ""
"Unfortunately your order cannot be processed as the originating "
@@ -24926,104 +26149,199 @@ msgstr ""
#: templates/emails/admin-cancelled-order.php:28
#: templates/emails/plain/admin-cancelled-order.php:25
-msgid "The order #%1$s from %2$s has been cancelled. The order was as follows:"
+#. translators: %1$s: Customer full name. %2$s: Order numer
+msgid "Alas. Just to let you know -- %1$s has cancelled order #%2$s:"
+msgstr ""
+
+#: templates/emails/admin-cancelled-order.php:52
+#: templates/emails/customer-invoice.php:88
+#: templates/emails/customer-note.php:57
+#: templates/emails/customer-reset-password.php:38
+#: templates/emails/plain/admin-cancelled-order.php:50
+#: templates/emails/plain/customer-invoice.php:75
+#: templates/emails/plain/customer-note.php:60
+#: templates/emails/plain/customer-reset-password.php:32
+msgid "Thanks for reading."
msgstr ""
#: templates/emails/admin-failed-order.php:28
#: templates/emails/plain/admin-failed-order.php:25
+#. translators: %1$s: Order number. %2$s: Customer full name.
msgid "Payment for order #%1$s from %2$s has failed. The order was as follows:"
msgstr ""
+#: templates/emails/admin-failed-order.php:52
+#: templates/emails/plain/admin-failed-order.php:50
+msgid ""
+"Hopefully they’ll be back. Read more about troubleshooting failed payments ."
+msgstr ""
+
#: templates/emails/admin-new-order.php:28
-msgid "You have received an order from %s. The order is as follows:"
+#: templates/emails/plain/admin-new-order.php:25
+#. translators: %s: Customer billing full name
+msgid "You’ve received the following order from %s:"
msgstr ""
#: templates/emails/customer-completed-order.php:28
+#: templates/emails/customer-invoice.php:30
+#: templates/emails/customer-new-account.php:27
+#: templates/emails/customer-note.php:28
+#: templates/emails/customer-on-hold-order.php:28
+#: templates/emails/customer-processing-order.php:28
+#: templates/emails/customer-refunded-order.php:28
+#: templates/emails/customer-reset-password.php:27
#: templates/emails/plain/customer-completed-order.php:25
+#: templates/emails/plain/customer-invoice.php:25
+#: templates/emails/plain/customer-new-account.php:25
+#: templates/emails/plain/customer-note.php:26
+#: templates/emails/plain/customer-on-hold-order.php:25
+#: templates/emails/plain/customer-processing-order.php:25
+#: templates/emails/plain/customer-refunded-order.php:25
+#: templates/emails/plain/customer-reset-password.php:25
+#. translators: %s: Customer first name
+#. translators: %s Customer first name
+#. translators: %s: Customer first name
+#. translators: %s: Customer first name
+#. translators: %s: Customer first name
+#. translators: %s: Customer first name
+#. translators: %s: Customer first name
+#. translators: %s: Customer first name
+#. translators: %s Customer first name
+#. translators: %s Customer first name
+#. translators: %s: Customer first name
+#. translators: %s: Customer first name
+#. translators: %s: Customer first name
+#. translators: %s: Customer first name
+msgid "Hi %s,"
+msgstr ""
+
+#: templates/emails/customer-completed-order.php:30
+#: templates/emails/plain/customer-completed-order.php:27
+#. translators: %s: Site title
+msgid "Your %s order has been marked complete on our side."
+msgstr ""
+
+#: templates/emails/customer-completed-order.php:54
+#: templates/emails/plain/customer-completed-order.php:52
+msgid "Thanks for shopping with us."
+msgstr ""
+
+#: templates/emails/customer-invoice.php:38
+#. translators: %1$s Site title, %2$s Order pay link
msgid ""
-"Hi there. Your recent order on %s has been completed. Your order details "
-"are shown below for your reference:"
+"An order has been created for you on %1$s. Your invoice is below, with a "
+"link to make payment when you’re ready: %2$s"
msgstr ""
-#: templates/emails/customer-invoice.php:36
-#: templates/emails/plain/customer-invoice.php:29
-#. translators: %1s item is the name of the site, %2s is a html link
-msgid "An order has been created for you on %1$s. %2$s"
-msgstr ""
-
-#: templates/emails/customer-invoice.php:44
+#: templates/emails/customer-invoice.php:46
+#: templates/emails/plain/customer-invoice.php:39
msgid "Pay for this order"
msgstr ""
-#: templates/emails/customer-new-account.php:27
-#: templates/emails/plain/customer-new-account.php:25
-msgid "Thanks for creating an account on %1$s. Your username is %2$s"
+#: templates/emails/customer-invoice.php:55
+#: templates/emails/plain/customer-invoice.php:44
+#. translators: %s Order date
+msgid "Here are the details of your order placed on %s:"
msgstr ""
-#: templates/emails/customer-new-account.php:31
+#: templates/emails/customer-new-account.php:29
+#: templates/emails/plain/customer-new-account.php:27
+#. translators: %1$s: Site title, %2$s: Username, %3$s: My account link
+msgid ""
+"Thanks for creating an account on %1$s. As a reminder, the username you "
+"chose is %2$s. You can access your account area to view orders, change your "
+"password, and more at: %3$s"
+msgstr ""
+
+#: templates/emails/customer-new-account.php:33
+#. translators: %s Auto generated password
msgid "Your password has been automatically generated: %s"
msgstr ""
-#: templates/emails/customer-new-account.php:35
-#: templates/emails/plain/customer-new-account.php:31
+#: templates/emails/customer-new-account.php:36
+#: templates/emails/plain/customer-new-account.php:34
+msgid "We look forward to seeing you soon."
+msgstr ""
+
+#: templates/emails/customer-note.php:29
+#: templates/emails/plain/customer-note.php:27
+msgid "The following note has been added to your order:"
+msgstr ""
+
+#: templates/emails/customer-note.php:33
+#: templates/emails/plain/customer-note.php:35
+msgid "As a reminder, here are your order details:"
+msgstr ""
+
+#: templates/emails/customer-on-hold-order.php:29
+#: templates/emails/plain/customer-on-hold-order.php:26
msgid ""
-"You can access your account area to view your orders and change your "
-"password here: %s."
+"Thanks for your order. It’s on-hold until we confirm that payment has been "
+"received. In the meantime, here’s a reminder of what you ordered:"
msgstr ""
-#: templates/emails/customer-note.php:28
-#: templates/emails/plain/customer-note.php:25
-msgid "Hello, a note has just been added to your order:"
+#: templates/emails/customer-on-hold-order.php:54
+#: templates/emails/plain/customer-on-hold-order.php:51
+msgid "We look forward to fulfilling your order soon."
msgstr ""
-#: templates/emails/customer-note.php:32
-#: templates/emails/plain/customer-note.php:33
-msgid "For your reference, your order details are shown below."
-msgstr ""
-
-#: templates/emails/customer-on-hold-order.php:28
-#: templates/emails/plain/customer-on-hold-order.php:25
+#: templates/emails/customer-processing-order.php:30
+#: templates/emails/plain/customer-processing-order.php:27
+#. translators: %s: Order number
msgid ""
-"Your order is on-hold until we confirm payment has been received. Your "
-"order details are shown below for your reference:"
+"Just to let you know -- your payment has been confirmed, and order #%s is "
+"now being processed:"
msgstr ""
-#: templates/emails/customer-processing-order.php:28
-#: templates/emails/plain/customer-processing-order.php:25
+#: templates/emails/customer-processing-order.php:55
+#: templates/emails/plain/customer-processing-order.php:52
+msgid "Thanks!"
+msgstr ""
+
+#: templates/emails/customer-refunded-order.php:34
+#: templates/emails/plain/customer-refunded-order.php:28
+#. translators: %s: Site title
msgid ""
-"Your order has been received and is now being processed. Your order details "
-"are shown below for your reference:"
+"Your order on %s has been partially refunded. There are more details below "
+"for your reference:"
msgstr ""
-#: templates/emails/customer-refunded-order.php:30
-msgid "Hi there. Your order on %s has been partially refunded."
+#: templates/emails/customer-refunded-order.php:37
+#: templates/emails/plain/customer-refunded-order.php:31
+#. translators: %s: Site title
+msgid ""
+"Your order on %s has been refunded. There are more details below for your "
+"reference:"
msgstr ""
-#: templates/emails/customer-refunded-order.php:32
-msgid "Hi there. Your order on %s has been refunded."
-msgstr ""
-
-#: templates/emails/customer-reset-password.php:27
-#: templates/emails/plain/customer-reset-password.php:25
-msgid "Someone requested that the password be reset for the following account:"
-msgstr ""
-
-#: templates/emails/customer-reset-password.php:28
-#: templates/emails/plain/customer-reset-password.php:27
-msgid "Username: %s"
+#: templates/emails/customer-refunded-order.php:64
+#: templates/emails/plain/customer-refunded-order.php:56
+msgid "We hope to see you again soon."
msgstr ""
#: templates/emails/customer-reset-password.php:29
-#: templates/emails/plain/customer-reset-password.php:28
-msgid "If this was a mistake, just ignore this email and nothing will happen."
+#: templates/emails/plain/customer-reset-password.php:27
+#. translators: %s: Store name
+msgid "Someone has requested a new password for the following account on %s:"
msgstr ""
-#: templates/emails/customer-reset-password.php:30
+#: templates/emails/customer-reset-password.php:31
#: templates/emails/plain/customer-reset-password.php:29
-msgid "To reset your password, visit the following address:"
+#. translators: %s Customer username
+#. translators: %s: Customer username
+msgid "Username: %s"
msgstr ""
-#: templates/emails/customer-reset-password.php:33
+#: templates/emails/customer-reset-password.php:32
+#: templates/emails/plain/customer-reset-password.php:30
+msgid ""
+"If you didn't make this request, just ignore this email. If you'd like to "
+"proceed:"
+msgstr ""
+
+#: templates/emails/customer-reset-password.php:35
msgid "Click here to reset your password"
msgstr ""
@@ -25031,7 +26349,7 @@ msgstr ""
#: templates/emails/plain/email-addresses.php:22
#: templates/myaccount/form-edit-address.php:20
#: templates/myaccount/my-address.php:27 templates/myaccount/my-address.php:32
-#: templates/order/order-details-customer.php:33
+#: templates/order/order-details-customer.php:32
msgid "Billing address"
msgstr ""
@@ -25039,7 +26357,7 @@ msgstr ""
#: templates/emails/plain/email-addresses.php:37
#: templates/myaccount/form-edit-address.php:20
#: templates/myaccount/my-address.php:28
-#: templates/order/order-details-customer.php:52
+#: templates/order/order-details-customer.php:51
msgid "Shipping address"
msgstr ""
@@ -25048,26 +26366,29 @@ msgstr ""
msgid "Customer details"
msgstr ""
-#: templates/emails/plain/admin-new-order.php:25
-msgid "You have received an order from %s."
+#: templates/emails/email-order-details.php:36
+#. translators: %s: Order ID.
+msgid "[Order #%s]"
msgstr ""
-#: templates/emails/plain/customer-new-account.php:28
-msgid "Your password is %s."
-msgstr ""
-
-#: templates/emails/plain/customer-refunded-order.php:25
+#: templates/emails/plain/customer-invoice.php:31
+#. translators: %1$s Site title, %2$s Order pay link
msgid ""
-"Hi there. Your order on %s has been refunded. Your order details are shown "
-"below for your reference:"
+"An order has been created for you on %1$s. Your invoice is below, with a "
+"link to make payment when you’re ready: %1$s"
+msgstr ""
+
+#: templates/emails/plain/customer-new-account.php:31
+#. translators: %s Auto generated password
+msgid "Your password has been automatically generated: %s."
msgstr ""
#: templates/emails/plain/email-order-details.php:25
-#. translators: %s: Order ID.
-msgid "Order number: %s"
+#. translators: %1$s: Order ID. %2$s: Order date
+msgid "[Order #%1$s] (%2$s)"
msgstr ""
-#: templates/emails/plain/email-order-details.php:51
+#: templates/emails/plain/email-order-details.php:50
#. translators: %s: Order link.
msgid "View order: %s"
msgstr ""
@@ -25077,11 +26398,11 @@ msgstr ""
msgid "Username or email"
msgstr ""
-#: templates/global/form-login.php:51 templates/myaccount/form-login.php:57
+#: templates/global/form-login.php:51 templates/myaccount/form-login.php:53
msgid "Remember me"
msgstr ""
-#: templates/global/form-login.php:55 templates/myaccount/form-login.php:61
+#: templates/global/form-login.php:55 templates/myaccount/form-login.php:57
msgid "Lost your password?"
msgstr ""
@@ -25158,11 +26479,11 @@ msgstr ""
msgid "Save address"
msgstr ""
-#: templates/myaccount/form-login.php:55
+#: templates/myaccount/form-login.php:51
msgid "Log in"
msgstr ""
-#: templates/myaccount/form-login.php:74 templates/myaccount/form-login.php:107
+#: templates/myaccount/form-login.php:70 templates/myaccount/form-login.php:103
msgid "Register"
msgstr ""
@@ -25184,11 +26505,11 @@ msgstr ""
msgid "Re-enter new password"
msgstr ""
-#: templates/myaccount/lost-password-confirmation.php:24
+#: templates/myaccount/lost-password-confirmation.php:22
msgid "Password reset email has been sent."
msgstr ""
-#: templates/myaccount/lost-password-confirmation.php:27
+#: templates/myaccount/lost-password-confirmation.php:25
msgid ""
"A password reset email has been sent to the email address on file for your "
"account, but may take several minutes to show up in your inbox. Please wait "
@@ -25277,7 +26598,7 @@ msgstr ""
msgid "Track"
msgstr ""
-#: templates/order/order-again.php:25
+#: templates/order/order-again.php:22
msgid "Order again"
msgstr ""
@@ -25475,71 +26796,72 @@ msgid "Georgia"
msgstr ""
#: includes/admin/class-wc-admin-assets.php:115
-#: includes/admin/class-wc-admin-setup-wizard.php:210
+#: includes/admin/class-wc-admin-setup-wizard.php:164
#: includes/class-wc-frontend-scripts.php:567
#: includes/widgets/class-wc-widget-layered-nav.php:302
+#: includes/widgets/class-wc-widget-product-categories.php:266
msgctxt "enhanced select"
msgid "No matches found"
msgstr ""
#: includes/admin/class-wc-admin-assets.php:116
-#: includes/admin/class-wc-admin-setup-wizard.php:211
+#: includes/admin/class-wc-admin-setup-wizard.php:165
#: includes/class-wc-frontend-scripts.php:568
msgctxt "enhanced select"
msgid "Loading failed"
msgstr ""
#: includes/admin/class-wc-admin-assets.php:117
-#: includes/admin/class-wc-admin-setup-wizard.php:212
+#: includes/admin/class-wc-admin-setup-wizard.php:166
#: includes/class-wc-frontend-scripts.php:569
msgctxt "enhanced select"
msgid "Please enter 1 or more characters"
msgstr ""
#: includes/admin/class-wc-admin-assets.php:118
-#: includes/admin/class-wc-admin-setup-wizard.php:213
+#: includes/admin/class-wc-admin-setup-wizard.php:167
#: includes/class-wc-frontend-scripts.php:570
msgctxt "enhanced select"
msgid "Please enter %qty% or more characters"
msgstr ""
#: includes/admin/class-wc-admin-assets.php:119
-#: includes/admin/class-wc-admin-setup-wizard.php:214
+#: includes/admin/class-wc-admin-setup-wizard.php:168
#: includes/class-wc-frontend-scripts.php:571
msgctxt "enhanced select"
msgid "Please delete 1 character"
msgstr ""
#: includes/admin/class-wc-admin-assets.php:120
-#: includes/admin/class-wc-admin-setup-wizard.php:215
+#: includes/admin/class-wc-admin-setup-wizard.php:169
#: includes/class-wc-frontend-scripts.php:572
msgctxt "enhanced select"
msgid "Please delete %qty% characters"
msgstr ""
#: includes/admin/class-wc-admin-assets.php:121
-#: includes/admin/class-wc-admin-setup-wizard.php:216
+#: includes/admin/class-wc-admin-setup-wizard.php:170
#: includes/class-wc-frontend-scripts.php:573
msgctxt "enhanced select"
msgid "You can only select 1 item"
msgstr ""
#: includes/admin/class-wc-admin-assets.php:122
-#: includes/admin/class-wc-admin-setup-wizard.php:217
+#: includes/admin/class-wc-admin-setup-wizard.php:171
#: includes/class-wc-frontend-scripts.php:574
msgctxt "enhanced select"
msgid "You can only select %qty% items"
msgstr ""
#: includes/admin/class-wc-admin-assets.php:123
-#: includes/admin/class-wc-admin-setup-wizard.php:218
+#: includes/admin/class-wc-admin-setup-wizard.php:172
#: includes/class-wc-frontend-scripts.php:575
msgctxt "enhanced select"
msgid "Loading more results…"
msgstr ""
#: includes/admin/class-wc-admin-assets.php:124
-#: includes/admin/class-wc-admin-setup-wizard.php:219
+#: includes/admin/class-wc-admin-setup-wizard.php:173
#: includes/class-wc-frontend-scripts.php:576
msgctxt "enhanced select"
msgid "Searching…"
@@ -25576,6 +26898,11 @@ msgctxt "Admin menu name"
msgid "Coupons"
msgstr ""
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore_PostTypeRegistrar.php:32
+msgctxt "Admin menu name"
+msgid "Scheduled Actions"
+msgstr ""
+
#: includes/admin/class-wc-admin-permalink-settings.php:76
#: includes/wc-core-functions.php:1810 includes/wc-update-functions.php:57
msgctxt "slug"
@@ -25611,7 +26938,7 @@ msgctxt "default-slug"
msgid "product"
msgstr ""
-#: includes/admin/class-wc-admin-setup-wizard.php:1455
+#: includes/admin/class-wc-admin-setup-wizard.php:1547
#: includes/gateways/cheque/class-wc-gateway-cheque.php:31
#: includes/gateways/cheque/class-wc-gateway-cheque.php:67
msgctxt "Check payment method"
@@ -25623,8 +26950,8 @@ msgctxt "Check payment method"
msgid "Awaiting check payment"
msgstr ""
-#: includes/admin/class-wc-admin-taxonomies.php:309
-#: includes/class-wc-install.php:488 includes/class-wc-install.php:494
+#: includes/admin/class-wc-admin-taxonomies.php:322
+#: includes/class-wc-install.php:508 includes/class-wc-install.php:514
msgctxt "Default category slug"
msgid "Uncategorized"
msgstr ""
@@ -25646,20 +26973,20 @@ msgctxt "Webhook created on date parsed by strftime"
msgid "%b %d, %Y @ %I:%M %p"
msgstr ""
-#: includes/admin/importers/class-wc-product-csv-importer-controller.php:641
+#: includes/admin/importers/class-wc-product-csv-importer-controller.php:642
msgctxt "Quantity in stock"
msgid "Stock"
msgstr ""
#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:168
-#: includes/api/class-wc-rest-network-orders-controller.php:127
-#: includes/class-wc-order.php:848 includes/class-wc-order.php:858
+#: includes/api/v2/class-wc-rest-network-orders-v2-controller.php:134
+#: includes/class-wc-order.php:842 includes/class-wc-order.php:852
#. translators: 1: first name 2: last name
msgctxt "full name"
msgid "%1$s %2$s"
msgstr ""
-#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:231
+#: includes/admin/list-tables/class-wc-admin-list-table-orders.php:236
#. translators: %s: human-readable time difference
msgctxt "%s = human-readable time difference"
msgid "%s ago"
@@ -25719,27 +27046,27 @@ msgctxt "Pagination"
msgid "%1$s of %2$s"
msgstr ""
-#: includes/api/class-wc-rest-system-status-controller.php:976
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:1005
msgctxt "Page setting"
msgid "Shop base"
msgstr ""
-#: includes/api/class-wc-rest-system-status-controller.php:980
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:1009
msgctxt "Page setting"
msgid "Cart"
msgstr ""
-#: includes/api/class-wc-rest-system-status-controller.php:984
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:1013
msgctxt "Page setting"
msgid "Checkout"
msgstr ""
-#: includes/api/class-wc-rest-system-status-controller.php:988
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:1017
msgctxt "Page setting"
msgid "My account"
msgstr ""
-#: includes/api/class-wc-rest-system-status-controller.php:992
+#: includes/api/v2/class-wc-rest-system-status-v2-controller.php:1021
msgctxt "Page setting"
msgid "Terms and conditions"
msgstr ""
@@ -25750,66 +27077,66 @@ msgctxt "display name"
msgid "%1$s %2$s"
msgstr ""
-#: includes/class-wc-form-handler.php:558 includes/wc-cart-functions.php:110
+#: includes/class-wc-form-handler.php:553 includes/wc-cart-functions.php:110
#. translators: %s: product name
msgctxt "Item name in quotes"
msgid "“%s”"
msgstr ""
-#: includes/class-wc-install.php:391
+#: includes/class-wc-install.php:411
msgctxt "Page slug"
msgid "shop"
msgstr ""
-#: includes/class-wc-install.php:396
+#: includes/class-wc-install.php:416
msgctxt "Page slug"
msgid "cart"
msgstr ""
-#: includes/class-wc-install.php:401
+#: includes/class-wc-install.php:421
msgctxt "Page slug"
msgid "checkout"
msgstr ""
-#: includes/class-wc-install.php:406
+#: includes/class-wc-install.php:426
msgctxt "Page slug"
msgid "my-account"
msgstr ""
-#: includes/class-wc-install.php:392
+#: includes/class-wc-install.php:412
msgctxt "Page title"
msgid "Shop"
msgstr ""
-#: includes/class-wc-install.php:397
+#: includes/class-wc-install.php:417
msgctxt "Page title"
msgid "Cart"
msgstr ""
-#: includes/class-wc-install.php:402
+#: includes/class-wc-install.php:422
msgctxt "Page title"
msgid "Checkout"
msgstr ""
-#: includes/class-wc-install.php:407
+#: includes/class-wc-install.php:427
msgctxt "Page title"
msgid "My account"
msgstr ""
-#: includes/class-wc-install.php:872
+#: includes/class-wc-install.php:907
#. translators: user role
msgctxt "User role"
msgid "Customer"
msgstr ""
-#: includes/class-wc-install.php:874
+#: includes/class-wc-install.php:909
#. translators: user role
msgctxt "User role"
msgid "Shop manager"
msgstr ""
#: includes/class-wc-order-refund.php:67
-#: includes/data-stores/abstract-wc-order-data-store-cpt.php:230
+#: includes/data-stores/abstract-wc-order-data-store-cpt.php:246
#: includes/data-stores/class-wc-order-refund-data-store-cpt.php:116
msgctxt "Order date parsed by strftime"
msgid "%b %d, %Y @ %I:%M %p"
@@ -25861,7 +27188,7 @@ msgctxt "Order status"
msgid "Failed"
msgstr ""
-#: includes/data-stores/class-wc-data-store-wp.php:483
+#: includes/data-stores/class-wc-data-store-wp.php:500
#. Translators: This is a comma-separated list of very common words that should
#. be excluded from a search, like a, an, and the. These are usually called
#. "stopwords". You should not simply translate these individual words into
@@ -25873,6 +27200,16 @@ msgid ""
"to,was,what,when,where,who,will,with,www"
msgstr ""
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore_PostStatusRegistrar.php:36
+msgctxt "post"
+msgid "Failed"
+msgstr ""
+
+#: includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore_PostStatusRegistrar.php:50
+msgctxt "post"
+msgid "In-Progress"
+msgstr ""
+
#: includes/wc-account-functions.php:65
msgctxt "edit-address-slug"
msgid "billing"
@@ -25890,22 +27227,22 @@ msgid "Shipping %d"
msgstr ""
#: includes/wc-cart-functions.php:228
-msgctxt "shipping package"
+msgctxt "shipping packages"
msgid "Shipping"
msgstr ""
-#: includes/wc-formatting-functions.php:1187
+#: includes/wc-formatting-functions.php:1190
#. translators: 1: price from 2: price to
msgctxt "Price range: from-to"
msgid "%1$s – %2$s"
msgstr ""
-#: includes/wc-template-functions.php:2047
+#: includes/wc-template-functions.php:2052
msgctxt "breadcrumb"
msgid "Home"
msgstr ""
-#: includes/wc-template-functions.php:3193
+#: includes/wc-template-functions.php:3201
msgctxt "min_price"
msgid "From:"
msgstr ""
diff --git a/i18n/states/GR.php b/i18n/states/GR.php
index 5c190e8817c..6e0f95d17b5 100644
--- a/i18n/states/GR.php
+++ b/i18n/states/GR.php
@@ -11,17 +11,17 @@ global $states;
defined( 'ABSPATH' ) || exit;
$states['GR'] = array(
- 'I' => __( 'Αττική', 'woocommerce' ),
- 'A' => __( 'Ανατολική Μακεδονία και Θράκη', 'woocommerce' ),
- 'B' => __( 'Κεντρική Μακεδονία', 'woocommerce' ),
- 'C' => __( 'Δυτική Μακεδονία', 'woocommerce' ),
- 'D' => __( 'Ήπειρος', 'woocommerce' ),
- 'E' => __( 'Θεσσαλία', 'woocommerce' ),
- 'F' => __( 'Ιόνιοι Νήσοι', 'woocommerce' ),
- 'G' => __( 'Δυτική Ελλάδα', 'woocommerce' ),
- 'H' => __( 'Στερεά Ελλάδα', 'woocommerce' ),
- 'J' => __( 'Πελοπόννησος', 'woocommerce' ),
- 'K' => __( 'Βόρειο Αιγαίο', 'woocommerce' ),
- 'L' => __( 'Νότιο Αιγαίο', 'woocommerce' ),
- 'M' => __( 'Κρήτη', 'woocommerce' ),
+ 'I' => __( 'Attiki', 'woocommerce' ),
+ 'A' => __( 'Anatoliki Makedonia kai Thraki', 'woocommerce' ),
+ 'B' => __( 'Kentriki Makedonia', 'woocommerce' ),
+ 'C' => __( 'Dytiki Makedonia', 'woocommerce' ),
+ 'D' => __( 'Ipeiros', 'woocommerce' ),
+ 'E' => __( 'Thessalia', 'woocommerce' ),
+ 'F' => __( 'Ionia Nisia', 'woocommerce' ),
+ 'G' => __( 'Dytiki Ellada', 'woocommerce' ),
+ 'H' => __( 'Sterea Ellada', 'woocommerce' ),
+ 'J' => __( 'Peloponnisos', 'woocommerce' ),
+ 'K' => __( 'Voreio Aigaio', 'woocommerce' ),
+ 'L' => __( 'Notio Aigaio', 'woocommerce' ),
+ 'M' => __( 'Kriti', 'woocommerce' ),
);
diff --git a/includes/abstracts/abstract-wc-data.php b/includes/abstracts/abstract-wc-data.php
index 15911176f80..7001af7b609 100644
--- a/includes/abstracts/abstract-wc-data.php
+++ b/includes/abstracts/abstract-wc-data.php
@@ -445,7 +445,7 @@ abstract class WC_Data {
}
}
- if ( $array_key ) {
+ if ( false !== $array_key ) {
$meta = $this->meta_data[ $array_key ];
$meta->key = $key;
$meta->value = $value;
diff --git a/includes/abstracts/abstract-wc-order.php b/includes/abstracts/abstract-wc-order.php
index 92a882f518f..cb16296a145 100644
--- a/includes/abstracts/abstract-wc-order.php
+++ b/includes/abstracts/abstract-wc-order.php
@@ -1702,7 +1702,7 @@ abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order {
public function get_shipping_to_display( $tax_display = '' ) {
$tax_display = $tax_display ? $tax_display : get_option( 'woocommerce_tax_display_cart' );
- if ( 0 < (float) $this->get_shipping_total() ) {
+ if ( 0 < abs( (float) $this->get_shipping_total() ) ) {
if ( 'excl' === $tax_display ) {
@@ -1731,7 +1731,7 @@ abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order {
$shipping = __( 'Free!', 'woocommerce' );
}
- return apply_filters( 'woocommerce_order_shipping_to_display', $shipping, $this );
+ return apply_filters( 'woocommerce_order_shipping_to_display', $shipping, $this, $tax_display );
}
/**
diff --git a/includes/abstracts/abstract-wc-product.php b/includes/abstracts/abstract-wc-product.php
index ebb0a052f99..d4441652c8e 100644
--- a/includes/abstracts/abstract-wc-product.php
+++ b/includes/abstracts/abstract-wc-product.php
@@ -20,8 +20,8 @@ require_once WC_ABSPATH . 'includes/legacy/abstract-wc-legacy-product.php';
*
* The WooCommerce product class handles individual product data.
*
- * @version 3.0.0
- * @package WooCommerce/Abstracts
+ * @version 3.0.0
+ * @package WooCommerce/Abstracts
*/
class WC_Product extends WC_Abstract_Legacy_Product {
@@ -140,25 +140,17 @@ class WC_Product extends WC_Abstract_Legacy_Product {
*
* The product_type property is deprecated but is used here for BW compatibility with child classes which may be defining product_type and not have a get_type method.
*
- * @since 3.0.0
+ * @since 3.0.0
* @return string
*/
public function get_type() {
return isset( $this->product_type ) ? $this->product_type : 'simple';
}
- /*
- |--------------------------------------------------------------------------
- | Getters
- |--------------------------------------------------------------------------
- |
- | Methods for getting data from the product object.
- */
-
/**
* Get product name.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return string
*/
@@ -169,7 +161,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get product slug.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return string
*/
@@ -180,7 +172,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get product created date.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return WC_DateTime|NULL object if the date is set or null if there is no date.
*/
@@ -191,7 +183,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get product modified date.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return WC_DateTime|NULL object if the date is set or null if there is no date.
*/
@@ -202,7 +194,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get product status.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return string
*/
@@ -213,7 +205,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* If the product is featured.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return boolean
*/
@@ -224,7 +216,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get catalog visibility.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return string
*/
@@ -235,7 +227,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get product description.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return string
*/
@@ -246,7 +238,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get product short description.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return string
*/
@@ -297,7 +289,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get date on sale from.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return WC_DateTime|NULL object if the date is set or null if there is no date.
*/
@@ -308,7 +300,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get date on sale to.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return WC_DateTime|NULL object if the date is set or null if there is no date.
*/
@@ -319,7 +311,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get number total of sales.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return int
*/
@@ -350,7 +342,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Return if product manage stock.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return boolean
*/
@@ -372,7 +364,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
* Return the stock status.
*
* @param string $context What the value is for. Valid values are view and edit.
- * @since 3.0.0
+ * @since 3.0.0
* @return string
*/
public function get_stock_status( $context = 'view' ) {
@@ -383,7 +375,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
* Get backorders.
*
* @param string $context What the value is for. Valid values are view and edit.
- * @since 3.0.0
+ * @since 3.0.0
* @return string yes no or notify
*/
public function get_backorders( $context = 'view' ) {
@@ -405,7 +397,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
* Return if should be sold individually.
*
* @param string $context What the value is for. Valid values are view and edit.
- * @since 3.0.0
+ * @since 3.0.0
* @return boolean
*/
public function get_sold_individually( $context = 'view' ) {
@@ -473,7 +465,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get upsell IDs.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return array
*/
@@ -484,7 +476,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get cross sell IDs.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return array
*/
@@ -495,7 +487,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get parent ID.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return int
*/
@@ -506,7 +498,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Return if reviews is allowed.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return bool
*/
@@ -517,7 +509,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get purchase note.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return string
*/
@@ -538,7 +530,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get default attributes.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return array
*/
@@ -549,7 +541,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get menu order.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return int
*/
@@ -560,7 +552,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get category ids.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return array
*/
@@ -571,7 +563,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get tag ids.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return array
*/
@@ -582,7 +574,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get virtual.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return bool
*/
@@ -603,7 +595,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get shipping class ID.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return int
*/
@@ -614,7 +606,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get downloads.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return array
*/
@@ -625,7 +617,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get download expiry.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return int
*/
@@ -636,7 +628,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get downloadable.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return bool
*/
@@ -647,7 +639,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get download limit.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return int
*/
@@ -658,7 +650,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get main image ID.
*
- * @since 3.0.0
+ * @since 3.0.0
* @param string $context What the value is for. Valid values are view and edit.
* @return string
*/
@@ -769,9 +761,9 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Set catalog visibility.
*
- * @since 3.0.0
+ * @since 3.0.0
* @throws WC_Data_Exception Throws exception when invalid data is found.
- * @param string $visibility Options: 'hidden', 'visible', 'search' and 'catalog'.
+ * @param string $visibility Options: 'hidden', 'visible', 'search' and 'catalog'.
*/
public function set_catalog_visibility( $visibility ) {
$options = array_keys( wc_get_product_visibility_options() );
@@ -804,9 +796,9 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Set SKU.
*
- * @since 3.0.0
+ * @since 3.0.0
* @throws WC_Data_Exception Throws exception when invalid data is found.
- * @param string $sku Product SKU.
+ * @param string $sku Product SKU.
*/
public function set_sku( $sku ) {
$sku = (string) $sku;
@@ -880,9 +872,9 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Set the tax status.
*
- * @since 3.0.0
+ * @since 3.0.0
* @throws WC_Data_Exception Throws exception when invalid data is found.
- * @param string $status Tax status.
+ * @param string $status Tax status.
*/
public function set_tax_status( $status ) {
$options = array(
@@ -1104,7 +1096,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
$attributes = array_fill_keys( array_keys( $this->get_attributes( 'edit' ) ), null );
foreach ( $raw_attributes as $attribute ) {
if ( is_a( $attribute, 'WC_Product_Attribute' ) ) {
- $attributes[ sanitize_text_field( $attribute->get_name() ) ] = $attribute;
+ $attributes[ sanitize_title( $attribute->get_name() ) ] = $attribute;
}
}
@@ -1344,7 +1336,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Save data (either create or update depending on if we are working on an existing product).
*
- * @since 3.0.0
+ * @since 3.0.0
* @return int
*/
public function save() {
@@ -1377,12 +1369,12 @@ class WC_Product extends WC_Abstract_Legacy_Product {
*
* Product classes should override this to declare support (or lack of support) for a feature.
*
- * @param string $feature string The name of a feature to test support for.
+ * @param string $feature string The name of a feature to test support for.
* @return bool True if the product supports the feature, false otherwise.
- * @since 2.5.0
+ * @since 2.5.0
*/
public function supports( $feature ) {
- return apply_filters( 'woocommerce_product_supports', in_array( $feature, $this->supports ), $feature, $this );
+ return apply_filters( 'woocommerce_product_supports', in_array( $feature, $this->supports, true ), $feature, $this );
}
/**
@@ -1399,11 +1391,11 @@ class WC_Product extends WC_Abstract_Legacy_Product {
*
* Backwards compatibility with downloadable/virtual.
*
- * @param string|array $type Array or string of types.
+ * @param string|array $type Array or string of types.
* @return bool
*/
public function is_type( $type ) {
- return ( $this->get_type() === $type || ( is_array( $type ) && in_array( $this->get_type(), $type ) ) );
+ return ( $this->get_type() === $type || ( is_array( $type ) && in_array( $this->get_type(), $type, true ) ) );
}
/**
@@ -1494,7 +1486,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
$on_sale = false;
}
- if ( $this->get_date_on_sale_to( $context ) && $this->get_date_on_sale_to( $context )->getTimestamp() < current_time( 'timestamp', true ) ) {
+ if ( $this->get_date_on_sale_to( $context ) && $this->get_date_on_sale_to( $context )->getTimestamp() + DAY_IN_SECONDS < current_time( 'timestamp', true ) ) {
$on_sale = false;
}
} else {
@@ -1591,7 +1583,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Check if a product is on backorder.
*
- * @param int $qty_in_cart (default: 0).
+ * @param int $qty_in_cart (default: 0).
* @return bool
*/
public function is_on_backorder( $qty_in_cart = 0 ) {
@@ -1605,7 +1597,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Returns whether or not the product has enough stock for the order.
*
- * @param mixed $quantity Quantity of a product added to an order.
+ * @param mixed $quantity Quantity of a product added to an order.
* @return bool
*/
public function has_enough_stock( $quantity ) {
@@ -1638,7 +1630,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Does a child have dimensions?
*
- * @since 3.0.0
+ * @since 3.0.0
* @return bool
*/
public function child_has_dimensions() {
@@ -1648,7 +1640,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Does a child have a weight?
*
- * @since 3.0.0
+ * @since 3.0.0
* @return boolean
*/
public function child_has_weight() {
@@ -1660,7 +1652,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
*
* @since 1.6.2
*
- * @param string $download_id file identifier.
+ * @param string $download_id file identifier.
* @return bool Whether downloadable product has a file attached.
*/
public function has_file( $download_id = '' ) {
@@ -1804,7 +1796,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get the add to cart button text description - used in aria tags.
*
- * @since 3.3.0
+ * @since 3.3.0
* @return string
*/
public function add_to_cart_description() {
@@ -1815,21 +1807,24 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Returns the main product image.
*
- * @param string $size (default: 'woocommerce_thumbnail').
- * @param array $attr Image attributes.
- * @param bool $placeholder True to return $placeholder if no image is found, or false to return an empty string.
+ * @param string $size (default: 'woocommerce_thumbnail').
+ * @param array $attr Image attributes.
+ * @param bool $placeholder True to return $placeholder if no image is found, or false to return an empty string.
* @return string
*/
public function get_image( $size = 'woocommerce_thumbnail', $attr = array(), $placeholder = true ) {
+ $image = '';
if ( $this->get_image_id() ) {
- $image = wp_get_attachment_image( $this->get_image_id(), $size );
+ $image = wp_get_attachment_image( $this->get_image_id(), $size, false, $attr );
} elseif ( $this->get_parent_id() ) {
$parent_product = wc_get_product( $this->get_parent_id() );
- $image = $parent_product->get_image();
- } elseif ( $placeholder ) {
+ if ( $parent_product ) {
+ $image = $parent_product->get_image( $size, $attr, $placeholder );
+ }
+ }
+
+ if ( ! $image && $placeholder ) {
$image = wc_placeholder_img( $size );
- } else {
- $image = '';
}
return apply_filters( 'woocommerce_product_get_image', $image, $this, $size, $attr, $placeholder, $image );
@@ -1841,7 +1836,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
* @return string
*/
public function get_shipping_class() {
- if ( $class_id = $this->get_shipping_class_id() ) { // @phpcs:ignore Squiz.PHP.DisallowMultipleAssignments.Found
+ if ( $class_id = $this->get_shipping_class_id() ) { // @phpcs:ignore Squiz.PHP.DisallowMultipleAssignments.Found, WordPress.CodeAnalysis.AssignmentInCondition.Found
$term = get_term_by( 'id', $class_id, 'product_shipping_class' );
if ( $term && ! is_wp_error( $term ) ) {
@@ -1892,7 +1887,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get a file by $download_id.
*
- * @param string $download_id file identifier.
+ * @param string $download_id file identifier.
* @return array|false if not found
*/
public function get_file( $download_id = '' ) {
@@ -1912,7 +1907,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
/**
* Get file download path identified by $download_id.
*
- * @param string $download_id file identifier.
+ * @param string $download_id file identifier.
* @return string
*/
public function get_file_download_path( $download_id ) {
@@ -1933,7 +1928,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
public function get_price_suffix( $price = '', $qty = 1 ) {
$html = '';
- if ( ( $suffix = get_option( 'woocommerce_price_display_suffix' ) ) && wc_tax_enabled() && 'taxable' === $this->get_tax_status() ) { // @phpcs:ignore Squiz.PHP.DisallowMultipleAssignments.Found
+ if ( ( $suffix = get_option( 'woocommerce_price_display_suffix' ) ) && wc_tax_enabled() && 'taxable' === $this->get_tax_status() ) { // @phpcs:ignore Squiz.PHP.DisallowMultipleAssignments.Found, WordPress.CodeAnalysis.AssignmentInCondition.Found
if ( '' === $price ) {
$price = $this->get_price();
}
@@ -1941,7 +1936,7 @@ class WC_Product extends WC_Abstract_Legacy_Product {
'{price_including_tax}' => wc_price( wc_get_price_including_tax( $this, array( 'qty' => $qty, 'price' => $price ) ) ), // @phpcs:ignore WordPress.Arrays.ArrayDeclarationSpacing.ArrayItemNoNewLine, WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
'{price_excluding_tax}' => wc_price( wc_get_price_excluding_tax( $this, array( 'qty' => $qty, 'price' => $price ) ) ), // @phpcs:ignore WordPress.Arrays.ArrayDeclarationSpacing.AssociativeArrayFound
);
- $html = str_replace( array_keys( $replacements ), array_values( $replacements ), ' ' . wp_kses_post( $suffix ) . ' ' );
+ $html = str_replace( array_keys( $replacements ), array_values( $replacements ), ' ' . wp_kses_post( $suffix ) . ' ' );
}
return apply_filters( 'woocommerce_get_price_suffix', $html, $this, $price, $qty );
}
@@ -1952,10 +1947,14 @@ class WC_Product extends WC_Abstract_Legacy_Product {
* @return string[]
*/
public function get_availability() {
- return apply_filters( 'woocommerce_get_availability', array(
- 'availability' => $this->get_availability_text(),
- 'class' => $this->get_availability_class(),
- ), $this );
+ return apply_filters(
+ 'woocommerce_get_availability',
+ array(
+ 'availability' => $this->get_availability_text(),
+ 'class' => $this->get_availability_class(),
+ ),
+ $this
+ );
}
/**
diff --git a/includes/abstracts/abstract-wc-rest-controller.php b/includes/abstracts/abstract-wc-rest-controller.php
index 077ad8fc225..987a4d78741 100644
--- a/includes/abstracts/abstract-wc-rest-controller.php
+++ b/includes/abstracts/abstract-wc-rest-controller.php
@@ -2,8 +2,18 @@
/**
* REST Controller
*
- * @class WC_REST_Controller
+ * This class extend `WP_REST_Controller` in order to include /batch endpoint
+ * for almost all endpoints in WooCommerce REST API.
+ *
+ * It's required to follow "Controller Classes" guide before extending this class:
+ *
+ *
+ * NOTE THAT ONLY CODE RELEVANT FOR MOST ENDPOINTS SHOULD BE INCLUDED INTO THIS CLASS.
+ * If necessary extend this class and create new abstract classes like `WC_REST_CRUD_Controller` or `WC_REST_Terms_Controller`.
+ *
+ * @class WC_REST_Controller
* @package WooCommerce/Abstracts
+ * @see https://developer.wordpress.org/rest-api/extending-the-rest-api/controller-classes/
*/
if ( ! defined( 'ABSPATH' ) ) {
@@ -193,10 +203,12 @@ abstract class WC_REST_Controller extends WP_REST_Controller {
}
$_item = new WP_REST_Request( 'DELETE' );
- $_item->set_query_params( array(
- 'id' => $id,
- 'force' => true,
- ) );
+ $_item->set_query_params(
+ array(
+ 'id' => $id,
+ 'force' => true,
+ )
+ );
$_response = $this->delete_item( $_item );
if ( is_wp_error( $_response ) ) {
@@ -340,7 +352,8 @@ abstract class WC_REST_Controller extends WP_REST_Controller {
*/
public function validate_setting_textarea_field( $value, $setting ) {
$value = is_null( $value ) ? '' : $value;
- return wp_kses( trim( stripslashes( $value ) ),
+ return wp_kses(
+ trim( stripslashes( $value ) ),
array_merge(
array(
'iframe' => array(
@@ -364,7 +377,7 @@ abstract class WC_REST_Controller extends WP_REST_Controller {
* @return array
*/
protected function add_meta_query( $args, $meta_query ) {
- if ( ! empty( $args['meta_query'] ) ) {
+ if ( empty( $args['meta_query'] ) ) {
$args['meta_query'] = array();
}
@@ -413,4 +426,42 @@ abstract class WC_REST_Controller extends WP_REST_Controller {
return $schema;
}
+
+ /**
+ * Gets an array of fields to be included on the response.
+ * Included fields are based on item schema and `_fields=` request argument.
+ * Introduced to support WordPress 4.9.6 changes.
+ *
+ * @since 3.5.0
+ * @param WP_REST_Request $request Full details about the request.
+ * @return array Fields to be included in the response.
+ */
+ public function get_fields_for_response( $request ) {
+ $schema = $this->get_item_schema();
+ $fields = isset( $schema['properties'] ) ? array_keys( $schema['properties'] ) : array();
+
+ $additional_fields = $this->get_additional_fields();
+ foreach ( $additional_fields as $field_name => $field_options ) {
+ // For back-compat, include any field with an empty schema
+ // because it won't be present in $this->get_item_schema().
+ if ( is_null( $field_options['schema'] ) ) {
+ $fields[] = $field_name;
+ }
+ }
+
+ if ( ! isset( $request['_fields'] ) ) {
+ return $fields;
+ }
+ $requested_fields = is_array( $request['_fields'] ) ? $request['_fields'] : preg_split( '/[\s,]+/', $request['_fields'] );
+ if ( 0 === count( $requested_fields ) ) {
+ return $fields;
+ }
+ // Trim off outside whitespace from the comma delimited list.
+ $requested_fields = array_map( 'trim', $requested_fields );
+ // Always persist 'id', because it can be needed for add_additional_fields_to_object().
+ if ( in_array( 'id', $fields, true ) ) {
+ $requested_fields[] = 'id';
+ }
+ return array_intersect( $fields, $requested_fields );
+ }
}
diff --git a/includes/abstracts/abstract-wc-rest-posts-controller.php b/includes/abstracts/abstract-wc-rest-posts-controller.php
index 1d24d2ba4bd..bffc4a6843e 100644
--- a/includes/abstracts/abstract-wc-rest-posts-controller.php
+++ b/includes/abstracts/abstract-wc-rest-posts-controller.php
@@ -530,6 +530,8 @@ abstract class WC_REST_Posts_Controller extends WC_REST_Controller {
$query_args['orderby'] = 'post__in';
} elseif ( 'id' === $query_args['orderby'] ) {
$query_args['orderby'] = 'ID'; // ID must be capitalized.
+ } elseif ( 'slug' === $query_args['orderby'] ) {
+ $query_args['orderby'] = 'name';
}
return $query_args;
diff --git a/includes/abstracts/abstract-wc-rest-terms-controller.php b/includes/abstracts/abstract-wc-rest-terms-controller.php
index 8f8cbccb213..7c6bbb65d14 100644
--- a/includes/abstracts/abstract-wc-rest-terms-controller.php
+++ b/includes/abstracts/abstract-wc-rest-terms-controller.php
@@ -533,6 +533,14 @@ abstract class WC_REST_Terms_Controller extends WC_REST_Controller {
}
$term = get_term( (int) $request['id'], $taxonomy );
+ // Get default category id.
+ $default_category_id = absint( get_option( 'default_product_cat', 0 ) );
+
+ // Prevent deleting the default product category.
+ if ( $default_category_id === (int) $request['id'] ) {
+ return new WP_Error( 'woocommerce_rest_cannot_delete', __( 'Default product category cannot be deleted.', 'woocommerce' ), array( 'status' => 500 ) );
+ }
+
$request->set_param( 'context', 'edit' );
$response = $this->prepare_item_for_response( $term, $request );
@@ -686,7 +694,7 @@ abstract class WC_REST_Terms_Controller extends WC_REST_Controller {
$params['context']['default'] = 'view';
$params['exclude'] = array(
- 'description' => __( 'Ensure result set excludes specific ids.', 'woocommerce' ),
+ 'description' => __( 'Ensure result set excludes specific IDs.', 'woocommerce' ),
'type' => 'array',
'items' => array(
'type' => 'integer',
diff --git a/includes/abstracts/abstract-wc-shipping-method.php b/includes/abstracts/abstract-wc-shipping-method.php
index a3a28e0dea5..c4657b39255 100644
--- a/includes/abstracts/abstract-wc-shipping-method.php
+++ b/includes/abstracts/abstract-wc-shipping-method.php
@@ -168,7 +168,7 @@ abstract class WC_Shipping_Method extends WC_Settings_API {
* @return boolean
*/
public function is_taxable() {
- return wc_tax_enabled() && 'taxable' === $this->tax_status && ! WC()->customer->get_is_vat_exempt();
+ return wc_tax_enabled() && 'taxable' === $this->tax_status && ( WC()->customer && ! WC()->customer->get_is_vat_exempt() );
}
/**
@@ -224,7 +224,7 @@ abstract class WC_Shipping_Method extends WC_Settings_API {
* Return calculated rates for a package.
*
* @since 2.6.0
- * @param object $package Package array.
+ * @param array $package Package array.
* @return array
*/
public function get_rates_for_package( $package ) {
diff --git a/includes/abstracts/abstract-wc-widget.php b/includes/abstracts/abstract-wc-widget.php
index 22dd2be276b..4e57fe4be1d 100644
--- a/includes/abstracts/abstract-wc-widget.php
+++ b/includes/abstracts/abstract-wc-widget.php
@@ -59,8 +59,8 @@ abstract class WC_Widget extends WP_Widget {
*/
public function __construct() {
$widget_ops = array(
- 'classname' => $this->widget_cssclass,
- 'description' => $this->widget_description,
+ 'classname' => $this->widget_cssclass,
+ 'description' => $this->widget_description,
'customize_selective_refresh' => true,
);
@@ -299,7 +299,7 @@ abstract class WC_Widget extends WP_Widget {
$link = get_term_link( get_query_var( 'product_tag' ), 'product_tag' );
} else {
$queried_object = get_queried_object();
- $link = get_term_link( $queried_object->slug, $queried_object->taxonomy );
+ $link = get_term_link( $queried_object->slug, $queried_object->taxonomy );
}
// Min/Max.
@@ -347,7 +347,7 @@ abstract class WC_Widget extends WP_Widget {
}
}
- return $link;
+ return apply_filters( 'woocommerce_widget_get_current_page_url', $link, $this );
}
/**
diff --git a/includes/abstracts/class-wc-background-process.php b/includes/abstracts/class-wc-background-process.php
index 0de4abe6ba7..6d9662208fc 100644
--- a/includes/abstracts/class-wc-background-process.php
+++ b/includes/abstracts/class-wc-background-process.php
@@ -146,10 +146,10 @@ abstract class WC_Background_Process extends WP_Background_Process {
if ( ! $memory_limit || -1 === intval( $memory_limit ) ) {
// Unlimited, set to 32GB.
- $memory_limit = '32000M';
+ $memory_limit = '32G';
}
- return intval( $memory_limit ) * 1024 * 1024;
+ return wp_convert_hr_to_bytes( $memory_limit );
}
/**
diff --git a/includes/admin/class-wc-admin-api-keys-table-list.php b/includes/admin/class-wc-admin-api-keys-table-list.php
index fb173ee721a..1406aed198e 100644
--- a/includes/admin/class-wc-admin-api-keys-table-list.php
+++ b/includes/admin/class-wc-admin-api-keys-table-list.php
@@ -70,24 +70,35 @@ class WC_Admin_API_Keys_Table_List extends WP_List_Table {
* @return string
*/
public function column_title( $key ) {
- $url = admin_url( 'admin.php?page=wc-settings&tab=advanced§ion=keys&edit-key=' . $key['key_id'] );
+ $url = admin_url( 'admin.php?page=wc-settings&tab=advanced§ion=keys&edit-key=' . $key['key_id'] );
+ $user_id = intval( $key['user_id'] );
- $output = '';
- $output .= '';
+ // Check if current user can edit other users or if it's the same user.
+ $can_edit = current_user_can( 'edit_user', $user_id ) || get_current_user_id() === $user_id;
+
+ $output = '';
+ if ( $can_edit ) {
+ $output .= '';
+ }
if ( empty( $key['description'] ) ) {
$output .= esc_html__( 'API key', 'woocommerce' );
} else {
$output .= esc_html( $key['description'] );
}
- $output .= ' ';
+ if ( $can_edit ) {
+ $output .= ' ';
+ }
$output .= ' ';
// Get actions.
$actions = array(
/* translators: %s: API key ID. */
- 'id' => sprintf( __( 'ID: %d', 'woocommerce' ), $key['key_id'] ),
- 'edit' => '' . __( 'View/Edit', 'woocommerce' ) . ' ',
- 'trash' => '' . __( 'View/Edit', 'woocommerce' ) . ' ';
+ $actions['trash'] = '' . esc_html__( 'Revoke', 'woocommerce' ) . ' ',
- );
+ ) . '">' . esc_html__( 'Revoke', 'woocommerce' ) . '';
+ }
$row_actions = array();
@@ -183,6 +194,10 @@ class WC_Admin_API_Keys_Table_List extends WP_List_Table {
* @return array
*/
protected function get_bulk_actions() {
+ if ( ! current_user_can( 'remove_users' ) ) {
+ return array();
+ }
+
return array(
'revoke' => __( 'Revoke', 'woocommerce' ),
);
diff --git a/includes/admin/class-wc-admin-api-keys.php b/includes/admin/class-wc-admin-api-keys.php
index 5e601fcc2c3..1e60075c54e 100644
--- a/includes/admin/class-wc-admin-api-keys.php
+++ b/includes/admin/class-wc-admin-api-keys.php
@@ -56,8 +56,15 @@ class WC_Admin_API_Keys {
if ( isset( $_GET['create-key'] ) || isset( $_GET['edit-key'] ) ) {
$key_id = isset( $_GET['edit-key'] ) ? absint( $_GET['edit-key'] ) : 0; // WPCS: input var okay, CSRF ok.
$key_data = self::get_key_data( $key_id );
+ $user_id = (int) $key_data['user_id'];
- include 'settings/views/html-keys-edit.php';
+ if ( $key_id && $user_id && ! current_user_can( 'edit_user', $user_id ) ) {
+ if ( get_current_user_id() !== $user_id ) {
+ wp_die( esc_html__( 'You do not have permission to edit this API Key', 'woocommerce' ) );
+ }
+ }
+
+ include dirname( __FILE__ ) . '/settings/views/html-keys-edit.php';
} else {
self::table_list_output();
}
@@ -184,13 +191,18 @@ class WC_Admin_API_Keys {
* Revoke key.
*/
private function revoke_key() {
+ global $wpdb;
+
check_admin_referer( 'revoke' );
if ( isset( $_REQUEST['revoke-key'] ) ) { // WPCS: input var okay, CSRF ok.
- $key_id = absint( $_REQUEST['revoke-key'] ); // WPCS: input var okay, CSRF ok.
+ $key_id = absint( $_REQUEST['revoke-key'] ); // WPCS: input var okay, CSRF ok.
+ $user_id = (int) $wpdb->get_var( $wpdb->prepare( "SELECT user_id FROM {$wpdb->prefix}woocommerce_api_keys WHERE key_id = %d", $key_id ) );
- if ( $key_id ) {
+ if ( $key_id && $user_id && ( current_user_can( 'edit_user', $user_id ) || get_current_user_id() === $user_id ) ) {
$this->remove_key( $key_id );
+ } else {
+ wp_die( esc_html__( 'You do not have permission to revoke this API Key', 'woocommerce' ) );
}
}
@@ -224,6 +236,10 @@ class WC_Admin_API_Keys {
* @param array $keys API Keys.
*/
private function bulk_revoke_key( $keys ) {
+ if ( ! current_user_can( 'remove_users' ) ) {
+ wp_die( esc_html__( 'You do not have permission to revoke API Keys', 'woocommerce' ) );
+ }
+
$qty = 0;
foreach ( $keys as $key_id ) {
$result = $this->remove_key( $key_id );
diff --git a/includes/admin/class-wc-admin-attributes.php b/includes/admin/class-wc-admin-attributes.php
index 22cafc4f77c..bd8467c50ad 100644
--- a/includes/admin/class-wc-admin-attributes.php
+++ b/includes/admin/class-wc-admin-attributes.php
@@ -173,7 +173,7 @@ class WC_Admin_Attributes {
echo '' . esc_html__( 'Error: non-existing attribute ID.', 'woocommerce' ) . '
';
} else {
$att_type = $attribute_to_edit->attribute_type;
- $att_label = $attribute_to_edit->attribute_label;
+ $att_label = format_to_edit( $attribute_to_edit->attribute_label );
$att_name = $attribute_to_edit->attribute_name;
$att_orderby = $attribute_to_edit->attribute_orderby;
$att_public = $attribute_to_edit->attribute_public;
diff --git a/includes/admin/class-wc-admin-dashboard.php b/includes/admin/class-wc-admin-dashboard.php
index 692fdea58eb..e203911d6f4 100644
--- a/includes/admin/class-wc-admin-dashboard.php
+++ b/includes/admin/class-wc-admin-dashboard.php
@@ -39,9 +39,9 @@ if ( ! class_exists( 'WC_Admin_Dashboard', false ) ) :
*/
public function init() {
if ( current_user_can( 'publish_shop_orders' ) && post_type_supports( 'product', 'comments' ) ) {
- wp_add_dashboard_widget( 'woocommerce_dashboard_recent_reviews', __( 'WooCommerce recent reviews', 'woocommerce' ), array( $this, 'recent_reviews' ) );
+ wp_add_dashboard_widget( 'woocommerce_dashboard_recent_reviews', __( 'WooCommerce Recent Reviews', 'woocommerce' ), array( $this, 'recent_reviews' ) );
}
- wp_add_dashboard_widget( 'woocommerce_dashboard_status', __( 'WooCommerce status', 'woocommerce' ), array( $this, 'status_widget' ) );
+ wp_add_dashboard_widget( 'woocommerce_dashboard_status', __( 'WooCommerce Status', 'woocommerce' ), array( $this, 'status_widget' ) );
// Network Order Widget.
if ( is_multisite() ) {
@@ -53,7 +53,7 @@ if ( ! class_exists( 'WC_Admin_Dashboard', false ) ) :
* Register the network order dashboard widget.
*/
public function register_network_order_widget() {
- wp_add_dashboard_widget( 'woocommerce_network_orders', __( 'WooCommerce network orders', 'woocommerce' ), array( $this, 'network_orders' ) );
+ wp_add_dashboard_widget( 'woocommerce_network_orders', __( 'WooCommerce Network Orders', 'woocommerce' ), array( $this, 'network_orders' ) );
}
/**
@@ -275,7 +275,7 @@ if ( ! class_exists( 'WC_Admin_Dashboard', false ) ) :
"FROM {$wpdb->comments} comments
LEFT JOIN {$wpdb->posts} posts ON (comments.comment_post_ID = posts.ID)
WHERE comments.comment_approved = '1'
- AND comments.comment_type = ''
+ AND comments.comment_type = 'review'
AND posts.post_password = ''
AND posts.post_type = 'product'
AND comments.comment_parent = 0
diff --git a/includes/admin/class-wc-admin-notices.php b/includes/admin/class-wc-admin-notices.php
index a96a6fd7812..b190b1caede 100644
--- a/includes/admin/class-wc-admin-notices.php
+++ b/includes/admin/class-wc-admin-notices.php
@@ -83,17 +83,16 @@ class WC_Admin_Notices {
public static function reset_admin_notices() {
$simplify_options = get_option( 'woocommerce_simplify_commerce_settings', array() );
$location = wc_get_base_location();
- $shop_page = 0 < wc_get_page_id( 'shop' ) ? get_permalink( wc_get_page_id( 'shop' ) ) : get_home_url();
if ( ! class_exists( 'WC_Gateway_Simplify_Commerce_Loader' ) && ! empty( $simplify_options['enabled'] ) && 'yes' === $simplify_options['enabled'] && in_array( $location['country'], apply_filters( 'woocommerce_gateway_simplify_commerce_supported_countries', array( 'US', 'IE' ) ), true ) ) {
- WC_Admin_Notices::add_notice( 'simplify_commerce' );
+ self::add_notice( 'simplify_commerce' );
}
- if ( ! is_ssl() || 'https' !== substr( $shop_page, 0, 5 ) ) {
- WC_Admin_Notices::add_notice( 'no_secure_connection' );
+ if ( ! self::is_ssl() ) {
+ self::add_notice( 'no_secure_connection' );
}
- WC_Admin_Notices::add_wootenberg_feature_plugin_notice();
+ self::add_wootenberg_feature_plugin_notice();
self::add_notice( 'template_files' );
}
@@ -119,7 +118,8 @@ class WC_Admin_Notices {
/**
* See if a notice is being shown.
*
- * @param string $name Notice name.
+ * @param string $name Notice name.
+ *
* @return boolean
*/
public static function has_notice( $name ) {
@@ -354,7 +354,7 @@ class WC_Admin_Notices {
* Notice about secure connection.
*/
public static function secure_connection_notice() {
- if ( get_user_meta( get_current_user_id(), 'dismissed_no_secure_connection_notice', true ) ) {
+ if ( self::is_ssl() || get_user_meta( get_current_user_id(), 'dismissed_no_secure_connection_notice', true ) ) {
return;
}
@@ -365,10 +365,10 @@ class WC_Admin_Notices {
* If Gutenberg is active, tell people about the Products block feature plugin.
*
* @since 3.4.3
- * @todo Remove this notice and associated code once the feature plugin has been merged into core.
+ * @todo Remove this notice and associated code once the feature plugin has been merged into core.
*/
public static function add_wootenberg_feature_plugin_notice() {
- if ( is_plugin_active( 'gutenberg/gutenberg.php' ) && ! is_plugin_active( 'woo-gutenberg-products-block/woocommerce-gutenberg-products-block.php' ) ) {
+ if ( ( is_plugin_active( 'gutenberg/gutenberg.php' ) || version_compare( get_bloginfo( 'version' ), '5.0', '>=' ) ) && ! is_plugin_active( 'woo-gutenberg-products-block/woocommerce-gutenberg-products-block.php' ) ) {
self::add_notice( 'wootenberg' );
}
}
@@ -377,10 +377,10 @@ class WC_Admin_Notices {
* Tell people about the Products block feature plugin when they activate Gutenberg.
*
* @since 3.4.3
- * @todo Remove this notice and associated code once the feature plugin has been merged into core.
+ * @todo Remove this notice and associated code once the feature plugin has been merged into core.
*/
public static function add_wootenberg_feature_plugin_notice_on_gutenberg_activate() {
- if ( ! is_plugin_active( 'woo-gutenberg-products-block/woocommerce-gutenberg-products-block.php' ) ) {
+ if ( ! is_plugin_active( 'woo-gutenberg-products-block/woocommerce-gutenberg-products-block.php' ) && version_compare( get_bloginfo( 'version' ), '5.0', '<' ) ) {
self::add_notice( 'wootenberg' );
}
}
@@ -396,6 +396,19 @@ class WC_Admin_Notices {
include dirname( __FILE__ ) . '/views/html-notice-wootenberg.php';
}
+
+ /**
+ * Determine if the store is running SSL.
+ *
+ * @return bool Flag SSL enabled.
+ * @since 3.5.1
+ */
+ protected static function is_ssl() {
+ $shop_page = 0 < wc_get_page_id( 'shop' ) ? get_permalink( wc_get_page_id( 'shop' ) ) : get_home_url();
+
+ return ( is_ssl() && 'https' === substr( $shop_page, 0, 5 ) );
+ }
+
}
WC_Admin_Notices::init();
diff --git a/includes/admin/class-wc-admin-post-types.php b/includes/admin/class-wc-admin-post-types.php
index 52f842cf96d..bb4a774e671 100644
--- a/includes/admin/class-wc-admin-post-types.php
+++ b/includes/admin/class-wc-admin-post-types.php
@@ -2,8 +2,6 @@
/**
* Post Types Admin
*
- * @author Automattic
- * @category Admin
* @package WooCommerce/admin
* @version 3.3.0
*/
@@ -120,6 +118,7 @@ class WC_Admin_Post_Types {
$messages['product'] = array(
0 => '', // Unused. Messages start at index 1.
+ /* translators: %s: Product view URL. */
1 => sprintf( __( 'Product updated. View Product ', 'woocommerce' ), esc_url( get_permalink( $post->ID ) ) ),
2 => __( 'Custom field updated.', 'woocommerce' ),
3 => __( 'Custom field deleted.', 'woocommerce' ),
@@ -405,7 +404,7 @@ class WC_Admin_Post_Types {
$manage_stock = ! empty( $_REQUEST['_manage_stock'] ) && 'grouped' !== $product->get_type() ? 'yes' : 'no'; // WPCS: input var ok, sanitization ok.
$backorders = ! empty( $_REQUEST['_backorders'] ) ? wc_clean( $_REQUEST['_backorders'] ) : 'no'; // WPCS: input var ok, sanitization ok.
$stock_status = ! empty( $_REQUEST['_stock_status'] ) ? wc_clean( $_REQUEST['_stock_status'] ) : 'instock'; // WPCS: input var ok, sanitization ok.
- $stock_amount = 'yes' === $manage_stock && ! empty( $_REQUEST['_stock'] ) ? wc_stock_amount( $_REQUEST['_stock'] ) : ''; // WPCS: input var ok, sanitization ok.
+ $stock_amount = 'yes' === $manage_stock && isset( $_REQUEST['_stock'] ) && is_numeric( wp_unslash( $_REQUEST['_stock'] ) ) ? wc_stock_amount( wp_unslash( $_REQUEST['_stock'] ) ) : ''; // WPCS: input var ok, sanitization ok.
$product->set_manage_stock( $manage_stock );
$product->set_backorders( $backorders );
@@ -823,14 +822,14 @@ class WC_Admin_Post_Types {
* When editing the shop page, we should hide templates.
*
* @param array $page_templates Templates array.
- * @param string $class Classname.
+ * @param string $theme Classname.
* @param WP_Post $post The current post object.
* @return array
*/
public function hide_cpt_archive_templates( $page_templates, $theme, $post ) {
$shop_page_id = wc_get_page_id( 'shop' );
- if ( $post && $shop_page_id === absint( $post->ID ) ) {
+ if ( $post && absint( $post->ID ) === $shop_page_id ) {
$page_templates = array();
}
@@ -845,8 +844,9 @@ class WC_Admin_Post_Types {
public function show_cpt_archive_notice( $post ) {
$shop_page_id = wc_get_page_id( 'shop' );
- if ( $post && $shop_page_id === absint( $post->ID ) ) {
+ if ( $post && absint( $post->ID ) === $shop_page_id ) {
echo '';
+ /* translators: %s: URL to read more about the shop page. */
echo '
' . sprintf( wp_kses_post( __( 'This is the WooCommerce shop page. The shop page is a special archive that lists your products. You can read more about this here .', 'woocommerce' ) ), 'https://docs.woocommerce.com/document/woocommerce-pages/#section-4' ) . '
';
echo '
';
}
diff --git a/includes/admin/class-wc-admin-reports.php b/includes/admin/class-wc-admin-reports.php
index c8594097dbc..541fe67cd1b 100644
--- a/includes/admin/class-wc-admin-reports.php
+++ b/includes/admin/class-wc-admin-reports.php
@@ -29,7 +29,7 @@ class WC_Admin_Reports {
public static function output() {
$reports = self::get_reports();
$first_tab = array_keys( $reports );
- $current_tab = ! empty( $_GET['tab'] ) ? sanitize_title( $_GET['tab'] ) : $first_tab[0];
+ $current_tab = ! empty( $_GET['tab'] ) && array_key_exists( $_GET['tab'], $reports ) ? sanitize_title( $_GET['tab'] ) : $first_tab[0];
$current_report = isset( $_GET['report'] ) ? sanitize_title( $_GET['report'] ) : current( array_keys( $reports[ $current_tab ]['reports'] ) );
include_once dirname( __FILE__ ) . '/reports/class-wc-admin-report.php';
diff --git a/includes/admin/class-wc-admin-setup-wizard.php b/includes/admin/class-wc-admin-setup-wizard.php
index aceb4c210d9..cee41915683 100644
--- a/includes/admin/class-wc-admin-setup-wizard.php
+++ b/includes/admin/class-wc-admin-setup-wizard.php
@@ -55,6 +55,7 @@ class WC_Admin_Setup_Wizard {
if ( apply_filters( 'woocommerce_enable_setup_wizard', true ) && current_user_can( 'manage_woocommerce' ) ) {
add_action( 'admin_menu', array( $this, 'admin_menus' ) );
add_action( 'admin_init', array( $this, 'setup_wizard' ) );
+ add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
}
}
@@ -143,6 +144,62 @@ class WC_Admin_Setup_Wizard {
|| $this->should_show_mailchimp();
}
+ /**
+ * Register/enqueue scripts and styles for the Setup Wizard.
+ *
+ * Hooked onto 'admin_enqueue_scripts'.
+ */
+ public function enqueue_scripts() {
+ // Whether or not there is a pending background install of Jetpack.
+ $pending_jetpack = ! class_exists( 'Jetpack' ) && get_option( 'woocommerce_setup_background_installing_jetpack' );
+ $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
+
+ wp_register_script( 'jquery-blockui', WC()->plugin_url() . '/assets/js/jquery-blockui/jquery.blockUI' . $suffix . '.js', array( 'jquery' ), '2.70', true );
+ wp_register_script( 'selectWoo', WC()->plugin_url() . '/assets/js/selectWoo/selectWoo.full' . $suffix . '.js', array( 'jquery' ), '1.0.0' );
+ wp_register_script( 'wc-enhanced-select', WC()->plugin_url() . '/assets/js/admin/wc-enhanced-select' . $suffix . '.js', array( 'jquery', 'selectWoo' ), WC_VERSION );
+ wp_localize_script(
+ 'wc-enhanced-select',
+ 'wc_enhanced_select_params',
+ array(
+ 'i18n_no_matches' => _x( 'No matches found', 'enhanced select', 'woocommerce' ),
+ 'i18n_ajax_error' => _x( 'Loading failed', 'enhanced select', 'woocommerce' ),
+ 'i18n_input_too_short_1' => _x( 'Please enter 1 or more characters', 'enhanced select', 'woocommerce' ),
+ 'i18n_input_too_short_n' => _x( 'Please enter %qty% or more characters', 'enhanced select', 'woocommerce' ),
+ 'i18n_input_too_long_1' => _x( 'Please delete 1 character', 'enhanced select', 'woocommerce' ),
+ 'i18n_input_too_long_n' => _x( 'Please delete %qty% characters', 'enhanced select', 'woocommerce' ),
+ 'i18n_selection_too_long_1' => _x( 'You can only select 1 item', 'enhanced select', 'woocommerce' ),
+ 'i18n_selection_too_long_n' => _x( 'You can only select %qty% items', 'enhanced select', 'woocommerce' ),
+ 'i18n_load_more' => _x( 'Loading more results…', 'enhanced select', 'woocommerce' ),
+ 'i18n_searching' => _x( 'Searching…', 'enhanced select', 'woocommerce' ),
+ 'ajax_url' => admin_url( 'admin-ajax.php' ),
+ 'search_products_nonce' => wp_create_nonce( 'search-products' ),
+ 'search_customers_nonce' => wp_create_nonce( 'search-customers' ),
+ )
+ );
+ wp_enqueue_style( 'woocommerce_admin_styles', WC()->plugin_url() . '/assets/css/admin.css', array(), WC_VERSION );
+ wp_enqueue_style( 'wc-setup', WC()->plugin_url() . '/assets/css/wc-setup.css', array( 'dashicons', 'install' ), WC_VERSION );
+
+ wp_register_script( 'wc-setup', WC()->plugin_url() . '/assets/js/admin/wc-setup' . $suffix . '.js', array( 'jquery', 'wc-enhanced-select', 'jquery-blockui', 'wp-util', 'jquery-tiptip' ), WC_VERSION );
+ wp_localize_script(
+ 'wc-setup',
+ 'wc_setup_params',
+ array(
+ 'pending_jetpack_install' => $pending_jetpack ? 'yes' : 'no',
+ 'states' => WC()->countries->get_states(),
+ 'current_step' => isset( $this->steps[ $this->step ] ) ? $this->step : false,
+ 'i18n' => array(
+ 'extra_plugins' => array(
+ 'payment' => array(
+ 'stripe_create_account' => __( 'Stripe setup is powered by Jetpack and WooCommerce Services.', 'woocommerce' ),
+ 'ppec_paypal_reroute_requests' => __( 'PayPal setup is powered by Jetpack and WooCommerce Services.', 'woocommerce' ),
+ 'stripe_create_account,ppec_paypal_reroute_requests' => __( 'Stripe and PayPal setup are powered by Jetpack and WooCommerce Services.', 'woocommerce' ),
+ ),
+ ),
+ ),
+ )
+ );
+ }
+
/**
* Show the setup wizard.
*/
@@ -198,47 +255,8 @@ class WC_Admin_Setup_Wizard {
unset( $default_steps['activate'] );
}
- // Whether or not there is a pending background install of Jetpack.
- $pending_jetpack = ! class_exists( 'Jetpack' ) && get_option( 'woocommerce_setup_background_installing_jetpack' );
-
$this->steps = apply_filters( 'woocommerce_setup_wizard_steps', $default_steps );
$this->step = isset( $_GET['step'] ) ? sanitize_key( $_GET['step'] ) : current( array_keys( $this->steps ) ); // WPCS: CSRF ok, input var ok.
- $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
-
- wp_register_script( 'jquery-blockui', WC()->plugin_url() . '/assets/js/jquery-blockui/jquery.blockUI' . $suffix . '.js', array( 'jquery' ), '2.70', true );
- wp_register_script( 'selectWoo', WC()->plugin_url() . '/assets/js/selectWoo/selectWoo.full' . $suffix . '.js', array( 'jquery' ), '1.0.0' );
- wp_register_script( 'wc-enhanced-select', WC()->plugin_url() . '/assets/js/admin/wc-enhanced-select' . $suffix . '.js', array( 'jquery', 'selectWoo' ), WC_VERSION );
- wp_localize_script(
- 'wc-enhanced-select',
- 'wc_enhanced_select_params',
- array(
- 'i18n_no_matches' => _x( 'No matches found', 'enhanced select', 'woocommerce' ),
- 'i18n_ajax_error' => _x( 'Loading failed', 'enhanced select', 'woocommerce' ),
- 'i18n_input_too_short_1' => _x( 'Please enter 1 or more characters', 'enhanced select', 'woocommerce' ),
- 'i18n_input_too_short_n' => _x( 'Please enter %qty% or more characters', 'enhanced select', 'woocommerce' ),
- 'i18n_input_too_long_1' => _x( 'Please delete 1 character', 'enhanced select', 'woocommerce' ),
- 'i18n_input_too_long_n' => _x( 'Please delete %qty% characters', 'enhanced select', 'woocommerce' ),
- 'i18n_selection_too_long_1' => _x( 'You can only select 1 item', 'enhanced select', 'woocommerce' ),
- 'i18n_selection_too_long_n' => _x( 'You can only select %qty% items', 'enhanced select', 'woocommerce' ),
- 'i18n_load_more' => _x( 'Loading more results…', 'enhanced select', 'woocommerce' ),
- 'i18n_searching' => _x( 'Searching…', 'enhanced select', 'woocommerce' ),
- 'ajax_url' => admin_url( 'admin-ajax.php' ),
- 'search_products_nonce' => wp_create_nonce( 'search-products' ),
- 'search_customers_nonce' => wp_create_nonce( 'search-customers' ),
- )
- );
- wp_enqueue_style( 'woocommerce_admin_styles', WC()->plugin_url() . '/assets/css/admin.css', array(), WC_VERSION );
- wp_enqueue_style( 'wc-setup', WC()->plugin_url() . '/assets/css/wc-setup.css', array( 'dashicons', 'install' ), WC_VERSION );
-
- wp_register_script( 'wc-setup', WC()->plugin_url() . '/assets/js/admin/wc-setup' . $suffix . '.js', array( 'jquery', 'wc-enhanced-select', 'jquery-blockui', 'wp-util' ), WC_VERSION );
- wp_localize_script(
- 'wc-setup',
- 'wc_setup_params',
- array(
- 'pending_jetpack_install' => $pending_jetpack ? 'yes' : 'no',
- 'states' => WC()->countries->get_states(),
- )
- );
// @codingStandardsIgnoreStart
if ( ! empty( $_POST['save_step'] ) && isset( $this->steps[ $this->step ]['handler'] ) ) {
@@ -285,6 +303,7 @@ class WC_Admin_Setup_Wizard {
* Setup Wizard Header.
*/
public function setup_wizard_header() {
+ set_current_screen();
?>
>
@@ -292,6 +311,7 @@ class WC_Admin_Setup_Wizard {
+
@@ -731,26 +751,6 @@ class WC_Admin_Setup_Wizard {
array(
- 'name' => __( 'Live Rates', 'woocommerce' ),
- 'description' => __( 'Powered by WooCommerce Services and Jetpack.', 'woocommerce' ),
- ),
'flat_rate' => array(
'name' => __( 'Flat Rate', 'woocommerce' ),
'description' => __( 'Set a fixed price to cover shipping costs.', 'woocommerce' ),
@@ -782,12 +778,6 @@ class WC_Admin_Setup_Wizard {
),
);
- $live_rate_carrier = $this->get_wcs_shipping_carrier( $country_code, $currency_code );
-
- if ( false === $live_rate_carrier || ! current_user_can( 'install_plugins' ) ) {
- unset( $shipping_methods['live_rates'] );
- }
-
return $shipping_methods;
}
@@ -799,8 +789,7 @@ class WC_Admin_Setup_Wizard {
* @param string $input_prefix Input prefix.
*/
protected function shipping_method_selection_form( $country_code, $currency_code, $input_prefix ) {
- $live_rate_carrier = $this->get_wcs_shipping_carrier( $country_code, $currency_code );
- $selected = $live_rate_carrier ? 'live_rates' : 'flat_rate';
+ $selected = 'flat_rate';
$shipping_methods = $this->get_wizard_shipping_methods( $country_code, $currency_code );
?>
@@ -853,6 +842,51 @@ class WC_Admin_Setup_Wizard {
+
+
+ >
+ >
+ >
+ >
+
+
+
+
+
+ >
+ >
+ >
+ >
+ >
+
+
+ countries->countries[ $country_code ];
$prefixed_country_name = WC()->countries->estimated_for_prefix( $country_code ) . $country_name;
$currency_code = get_woocommerce_currency();
- $wcs_carrier = $this->get_wcs_shipping_carrier( $country_code, $currency_code );
$existing_zones = WC_Shipping_Zones::get_zones();
- $dimension_unit = get_option( 'woocommerce_dimension_unit' );
- $weight_unit = get_option( 'woocommerce_weight_unit' );
+ $intro_text = '';
- if ( ! empty( $existing_zones ) ) {
- $intro_text = __( 'How would you like units on your store displayed?', 'woocommerce' );
- } elseif ( $wcs_carrier ) {
- $intro_text = sprintf(
- /* translators: %1$s: country name including the 'the' prefix, %2$s: shipping carrier name */
- __( "You're all set up to ship anywhere in %1\$s, and outside of it. We recommend using
live rates (which are powered by our WooCommerce Services plugin and Jetpack) to get accurate %2\$s shipping prices to cover the cost of order fulfillment.", 'woocommerce' ),
- $prefixed_country_name,
- $wcs_carrier
- );
- } else {
+ if ( empty( $existing_zones ) ) {
$intro_text = sprintf(
/* translators: %s: country name including the 'the' prefix if needed */
- __( "You can choose which countries you'll be shipping to and with which methods. To get started, we've set you up with shipping inside and outside of %s.", 'woocommerce' ),
+ __( "We've created two Shipping Zones - for %s and for the rest of the world. Below you can set Flat Rate shipping costs for these Zones or offer Free Shipping.", 'woocommerce' ),
$prefixed_country_name
);
}
+ $is_wcs_labels_supported = $this->is_wcs_shipping_labels_supported_country( $country_code );
+ $is_shipstation_supported = $this->is_shipstation_supported_country( $country_code );
+
?>
-
+
+
+
+
+
+ live rates from a specific carrier (e.g. UPS) you can find a variety of extensions available for WooCommerce here .', 'woocommerce' ),
+ array(
+ 'span' => array(
+ 'class' => array(),
+ 'data-tip' => array(),
+ ),
+ 'a' => array(
+ 'href' => array(),
+ 'target' => array(),
+ ),
+ )
+ ),
+ esc_attr__( 'A live rate is the exact cost to ship an order, quoted directly from the shipping carrier.', 'woocommerce' ),
+ 'https://woocommerce.com/product-category/woocommerce-extensions/shipping-methods/shipping-carriers/'
+ );
+ ?>
+
+
+
+
+ display_recommended_item( array(
+ 'type' => 'woocommerce_services',
+ 'title' => __( 'Print shipping labels at home', 'woocommerce' ),
+ 'description' => __( 'We recommend WooCommerce Services & Jetpack. These plugins will save you time at the Post Office by enabling you to print your shipping labels at home.', 'woocommerce' ),
+ 'img_url' => WC()->plugin_url() . '/assets/images/obw-woocommerce-services-icon.png',
+ 'img_alt' => __( 'WooCommerce Services icon', 'woocommerce' ),
+ 'plugins' => $this->get_wcs_requisite_plugins(),
+ ) );
+ elseif ( $is_shipstation_supported ) :
+ $this->display_recommended_item( array(
+ 'type' => 'shipstation',
+ 'title' => __( 'Print shipping labels at home', 'woocommerce' ),
+ 'description' => __( 'We recommend using ShipStation to save time at the Post Office by printing your shipping labels at home. Try ShipStation free for 30 days.', 'woocommerce' ),
+ 'img_url' => WC()->plugin_url() . '/assets/images/obw-shipstation-icon.png',
+ 'img_alt' => __( 'ShipStation icon', 'woocommerce' ),
+ 'plugins' => array(
+ array(
+ 'name' => __( 'ShipStation', 'woocommerce' ),
+ 'slug' => 'woocommerce-shipstation-integration',
+ ),
+ ),
+ ) );
+ endif;
+ endif;
+ ?>
+
+
-
-
-
- Weight unit—used to calculate shipping rates, and more.', 'woocommerce' ),
- array( 'strong' => array() )
- )
- );
- ?>
-
-
-
- >
- >
- >
- >
-
-
-
-
-
- Dimension unit—helps for accurate package selection.', 'woocommerce' ),
- array( 'strong' => array() )
- )
- );
- ?>
-
-
-
- >
- >
- >
- >
- >
-
-
+
+ get_product_weight_selection(),
+ $this->get_product_dimension_selection()
+ ),
+ array(
+ 'span' => array(
+ 'class' => array(),
+ ),
+ 'select' => array(
+ 'id' => array(),
+ 'name' => array(),
+ 'class' => array(),
+ ),
+ 'option' => array(
+ 'value' => array(),
+ 'selected' => array(),
+ ),
+ )
+ );
+ ?>
+
@@ -987,11 +1055,6 @@ class WC_Admin_Setup_Wizard {
public function wc_setup_shipping_save() {
check_admin_referer( 'wc-setup' );
- // If going through this step again, remove the live rates options.
- // in case the user saved different settings this time.
- delete_option( 'woocommerce_setup_domestic_live_rates_zone' );
- delete_option( 'woocommerce_setup_intl_live_rates_zone' );
-
// @codingStandardsIgnoreStart
$setup_domestic = isset( $_POST['shipping_zones']['domestic']['enabled'] ) && ( 'yes' === $_POST['shipping_zones']['domestic']['enabled'] );
$domestic_method = isset( $_POST['shipping_zones']['domestic']['method'] ) ? sanitize_text_field( wp_unslash( $_POST['shipping_zones']['domestic']['method'] ) ) : '';
@@ -1006,20 +1069,32 @@ class WC_Admin_Setup_Wizard {
update_option( 'woocommerce_weight_unit', $weight_unit );
update_option( 'woocommerce_dimension_unit', $dimension_unit );
+ $setup_wcs_labels = isset( $_POST['setup_woocommerce_services'] ) && 'yes' === $_POST['setup_woocommerce_services'];
+ $setup_shipstation = isset( $_POST['setup_shipstation'] ) && 'yes' === $_POST['setup_shipstation'];
+
+ update_option( 'woocommerce_setup_shipping_labels', $setup_wcs_labels );
+
+ if ( $setup_wcs_labels ) {
+ $this->install_woocommerce_services();
+ }
+
+ if ( $setup_shipstation ) {
+ $this->install_plugin(
+ 'woocommerce-shipstation-integration',
+ array(
+ 'name' => __( 'ShipStation', 'woocommerce' ),
+ 'repo-slug' => 'woocommerce-shipstation-integration',
+ 'file' => 'woocommerce-shipstation.php',
+ )
+ );
+ }
+
// For now, limit this setup to the first run.
if ( ! empty( $existing_zones ) ) {
wp_safe_redirect( esc_url_raw( $this->get_next_step_link() ) );
exit;
}
- // Install WooCommerce Services if live rates were selected.
- if (
- ( $setup_domestic && 'live_rates' === $domestic_method ) ||
- ( $setup_intl && 'live_rates' === $intl_method )
- ) {
- $this->install_woocommerce_services();
- }
-
/*
* If enabled, create a shipping zone containing the country the
* store is located in, with the selected method preconfigured.
@@ -1030,14 +1105,7 @@ class WC_Admin_Setup_Wizard {
$zone = new WC_Shipping_Zone( null );
$zone->set_zone_order( 0 );
$zone->add_location( $country, 'country' );
-
- if ( 'live_rates' === $domestic_method ) {
- // Signal WooCommerce Services to setup the domestic zone.
- update_option( 'woocommerce_setup_domestic_live_rates_zone', true, 'no' );
- } else {
- $instance_id = $zone->add_shipping_method( $domestic_method );
- }
-
+ $instance_id = $zone->add_shipping_method( $domestic_method );
$zone->save();
// Save chosen shipping method settings (using REST controller for convenience).
@@ -1055,15 +1123,10 @@ class WC_Admin_Setup_Wizard {
// If enabled, set the selected method for the "rest of world" zone.
if ( $setup_intl ) {
- if ( 'live_rates' === $intl_method ) {
- // Signal WooCommerce Services to setup the international zone.
- update_option( 'woocommerce_setup_intl_live_rates_zone', true, 'no' );
- } else {
- $zone = new WC_Shipping_Zone( 0 );
- $instance_id = $zone->add_shipping_method( $intl_method );
+ $zone = new WC_Shipping_Zone( 0 );
+ $instance_id = $zone->add_shipping_method( $intl_method );
- $zone->save();
- }
+ $zone->save();
// Save chosen shipping method settings (using REST controller for convenience).
if ( isset( $instance_id ) && ! empty( $_POST['shipping_zones']['intl'][ $intl_method ] ) ) { // WPCS: input var ok.
@@ -1218,6 +1281,32 @@ class WC_Admin_Setup_Wizard {
return in_array( $country_code, $supported_countries, true );
}
+ /**
+ * Is ShipStation country supported
+ *
+ * @param string $country_code Country code.
+ */
+ protected function is_shipstation_supported_country( $country_code ) {
+ $supported_countries = array(
+ 'AU', // Australia.
+ 'CA', // Canada.
+ 'GB', // United Kingdom.
+ );
+ return in_array( $country_code, $supported_countries, true );
+ }
+
+ /**
+ * Is WooCommerce Services shipping label country supported
+ *
+ * @param string $country_code Country code.
+ */
+ protected function is_wcs_shipping_labels_supported_country( $country_code ) {
+ $supported_countries = array(
+ 'US', // United States.
+ );
+ return in_array( $country_code, $supported_countries, true );
+ }
+
/**
* Helper method to retrieve the current user's email address.
*
@@ -1273,9 +1362,10 @@ class WC_Admin_Setup_Wizard {
'repo-slug' => 'woocommerce-gateway-stripe',
'settings' => array(
'create_account' => array(
- 'label' => __( 'Create a new Stripe account for me', 'woocommerce' ),
+ 'label' => __( 'Set up Stripe for me using this email:', 'woocommerce' ),
'type' => 'checkbox',
'value' => 'yes',
+ 'default' => 'yes',
'placeholder' => '',
'required' => false,
'plugins' => $this->get_wcs_requisite_plugins(),
@@ -1285,7 +1375,6 @@ class WC_Admin_Setup_Wizard {
'type' => 'email',
'value' => $user_email,
'placeholder' => __( 'Stripe email address', 'woocommerce' ),
- 'description' => __( "Enter your email address and we'll handle account creation. Powered by WooCommerce Services and Jetpack.", 'woocommerce' ),
'required' => true,
),
),
@@ -1299,9 +1388,10 @@ class WC_Admin_Setup_Wizard {
'repo-slug' => 'woocommerce-gateway-paypal-express-checkout',
'settings' => array(
'reroute_requests' => array(
- 'label' => __( 'Accept payments without linking a PayPal account', 'woocommerce' ),
+ 'label' => __( 'Set up PayPal for me using this email:', 'woocommerce' ),
'type' => 'checkbox',
'value' => 'yes',
+ 'default' => 'yes',
'placeholder' => '',
'required' => false,
'plugins' => $this->get_wcs_requisite_plugins(),
@@ -1311,7 +1401,6 @@ class WC_Admin_Setup_Wizard {
'type' => 'email',
'value' => $user_email,
'placeholder' => __( 'Email address to receive payments', 'woocommerce' ),
- 'description' => __( "Enter your email address and we'll authenticate payments for you. Powered by WooCommerce Services and Jetpack.", 'woocommerce' ),
'required' => true,
),
),
@@ -1532,6 +1621,8 @@ class WC_Admin_Setup_Wizard {
$checked = false;
if ( isset( $previously_saved_settings[ $setting_id ] ) ) {
$checked = 'yes' === $previously_saved_settings[ $setting_id ];
+ } elseif ( false === $previously_saved_settings && isset( $setting['default'] ) ) {
+ $checked = 'yes' === $setting['default'];
}
}
if ( 'email' === $setting['type'] ) {
@@ -1901,33 +1992,30 @@ class WC_Admin_Setup_Wizard {
$ppec_enabled = is_array( $ppec_settings )
&& isset( $ppec_settings['reroute_requests'] ) && 'yes' === $ppec_settings['reroute_requests']
&& isset( $ppec_settings['enabled'] ) && 'yes' === $ppec_settings['enabled'];
+
$features['payment'] = $stripe_enabled || $ppec_enabled;
-
- $features['taxes'] = (bool) get_option( 'woocommerce_setup_automated_taxes', false );
-
- $domestic_rates = (bool) get_option( 'woocommerce_setup_domestic_live_rates_zone', false );
- $intl_rates = (bool) get_option( 'woocommerce_setup_intl_live_rates_zone', false );
- $features['rates'] = $domestic_rates || $intl_rates;
+ $features['taxes'] = (bool) get_option( 'woocommerce_setup_automated_taxes', false );
+ $features['labels'] = (bool) get_option( 'woocommerce_setup_shipping_labels', false );
return $features;
}
protected function wc_setup_activate_get_feature_list_str() {
$features = $this->wc_setup_activate_get_feature_list();
- if ( $features['payment'] && $features['taxes'] && $features['rates'] ) {
- return __( 'payment setup, automated taxes, live rates and discounted shipping labels', 'woocommerce' );
+ if ( $features['payment'] && $features['taxes'] && $features['labels'] ) {
+ return __( 'payment setup, automated taxes and discounted shipping labels', 'woocommerce' );
} else if ( $features['payment'] && $features['taxes'] ) {
return __( 'payment setup and automated taxes', 'woocommerce' );
- } else if ( $features['payment'] && $features['rates'] ) {
- return __( 'payment setup, live rates and discounted shipping labels', 'woocommerce' );
+ } else if ( $features['payment'] && $features['labels'] ) {
+ return __( 'payment setup and discounted shipping labels', 'woocommerce' );
} else if ( $features['payment'] ) {
return __( 'payment setup', 'woocommerce' );
- } else if ( $features['taxes'] && $features['rates'] ) {
- return __( 'automated taxes, live rates and discounted shipping labels', 'woocommerce' );
+ } else if ( $features['taxes'] && $features['labels'] ) {
+ return __( 'automated taxes and discounted shipping labels', 'woocommerce' );
} else if ( $features['taxes'] ) {
return __( 'automated taxes', 'woocommerce' );
- } else if ( $features['rates'] ) {
- return __( 'live rates and discounted shipping labels', 'woocommerce' );
+ } else if ( $features['labels'] ) {
+ return __( 'discounted shipping labels', 'woocommerce' );
}
return false;
}
diff --git a/includes/admin/class-wc-admin-status.php b/includes/admin/class-wc-admin-status.php
index 5be05ea25f9..88dc02ce678 100644
--- a/includes/admin/class-wc-admin-status.php
+++ b/includes/admin/class-wc-admin-status.php
@@ -39,6 +39,22 @@ class WC_Admin_Status {
if ( array_key_exists( $action, $tools ) ) {
$response = $tools_controller->execute_tool( $action );
+
+ $tool = $tools[ $action ];
+ $tool = array(
+ 'id' => $action,
+ 'name' => $tool['name'],
+ 'action' => $tool['button'],
+ 'description' => $tool['desc'],
+ );
+ $tool = array_merge( $tool, $response );
+
+ /**
+ * Fires after a WooCommerce system status tool has been executed.
+ *
+ * @param array $tool Details about the tool that has been executed.
+ */
+ do_action( 'woocommerce_system_status_tool_executed', $tool );
} else {
$response = array(
'success' => false,
diff --git a/includes/admin/class-wc-admin-taxonomies.php b/includes/admin/class-wc-admin-taxonomies.php
index d8ee5a209eb..8b4e3e8bf41 100644
--- a/includes/admin/class-wc-admin-taxonomies.php
+++ b/includes/admin/class-wc-admin-taxonomies.php
@@ -18,10 +18,20 @@ if ( ! defined( 'ABSPATH' ) ) {
*/
class WC_Admin_Taxonomies {
+ /**
+ * Default category ID.
+ *
+ * @var int
+ */
+ private $default_cat_id = 0;
+
/**
* Constructor.
*/
public function __construct() {
+ // Default category ID.
+ $this->default_cat_id = get_option( 'default_product_cat', 0 );
+
// Category/term ordering
add_action( 'create_term', array( $this, 'create_term' ), 5, 3 );
add_action( 'delete_term', array( $this, 'delete_term' ), 5 );
@@ -54,6 +64,9 @@ class WC_Admin_Taxonomies {
// Maintain hierarchy of terms
add_filter( 'wp_terms_checklist_args', array( $this, 'disable_checked_ontop' ) );
+
+ // Admin footer scripts for this product categories admin screen
+ add_action( 'admin_footer', array( $this, 'scripts_at_product_cat_screen_footer' ) );
}
/**
@@ -436,6 +449,26 @@ class WC_Admin_Taxonomies {
}
return $args;
}
+
+ /**
+ * Admin footer scripts for the product categories admin screen
+ *
+ * @return void
+ */
+ public function scripts_at_product_cat_screen_footer() {
+ if ( ! isset( $_GET['taxonomy'] ) || 'product_cat' !== $_GET['taxonomy'] ) {
+ return;
+ }
+ // Ensure the tooltip is displayed when the image column is disabled on product categories
+ wc_enqueue_js("
+ (function( $ ) {
+ 'use strict';
+ var product_cat = $( 'tr#tag-" . absint( $this->default_cat_id ) . "' );
+ product_cat.find( 'th' ).empty();
+ product_cat.find( 'td.thumb span' ).detach( 'span' ).appendTo( product_cat.find( 'th' ) );
+ })( jQuery );
+ ");
+ }
}
new WC_Admin_Taxonomies();
diff --git a/includes/admin/class-wc-admin-webhooks.php b/includes/admin/class-wc-admin-webhooks.php
index abe82d2df79..c4216044c3e 100644
--- a/includes/admin/class-wc-admin-webhooks.php
+++ b/includes/admin/class-wc-admin-webhooks.php
@@ -119,7 +119,8 @@ class WC_Admin_Webhooks {
}
// API version.
- $webhook->set_api_version( ! empty( $_POST['webhook_api_version'] ) ? sanitize_text_field( wp_unslash( $_POST['webhook_api_version'] ) ) : 'wp_api_v2' ); // WPCS: input var okay, CSRF ok.
+ $rest_api_versions = wc_get_webhook_rest_api_versions();
+ $webhook->set_api_version( ! empty( $_POST['webhook_api_version'] ) ? sanitize_text_field( wp_unslash( $_POST['webhook_api_version'] ) ) : end( $rest_api_versions ) ); // WPCS: input var okay, CSRF ok.
$webhook->save();
diff --git a/includes/admin/class-wc-admin.php b/includes/admin/class-wc-admin.php
index 0d95cb3b097..da1bf7ac7f6 100644
--- a/includes/admin/class-wc-admin.php
+++ b/includes/admin/class-wc-admin.php
@@ -22,6 +22,7 @@ class WC_Admin {
* Constructor.
*/
public function __construct() {
+ add_action( 'plugins_loaded', array( $this, 'preload_helper' ), 9 );
add_action( 'init', array( $this, 'includes' ) );
add_action( 'current_screen', array( $this, 'conditional_includes' ) );
add_action( 'admin_init', array( $this, 'buffer' ), 1 );
@@ -86,6 +87,13 @@ class WC_Admin {
include_once dirname( __FILE__ ) . '/helper/class-wc-helper.php';
}
+ /**
+ * Preloads some functionality of the Helper to be loaded on the `plugins_loaded` hook
+ */
+ public function preload_helper() {
+ include_once dirname( __FILE__ ) . '/helper/class-wc-helper-file-headers.php';
+ }
+
/**
* Include admin files conditionally.
*/
diff --git a/includes/admin/helper/class-wc-helper-file-headers.php b/includes/admin/helper/class-wc-helper-file-headers.php
new file mode 100644
index 00000000000..7db9c72b2c1
--- /dev/null
+++ b/includes/admin/helper/class-wc-helper-file-headers.php
@@ -0,0 +1,44 @@
+plugin_url() . '/assets/images/woocommerce_logo.png' ); ?>" alt="WooCommerce" style="width:180px;">
-
Sorry to see you go
. Feel free to reconnect again using the button below.', 'woocommerce' ); ?>
+ ' . esc_html_e( 'Feel free to reconnect again using the button below.', 'woocommerce' ); ?>
-
+
diff --git a/includes/admin/importers/class-wc-product-csv-importer-controller.php b/includes/admin/importers/class-wc-product-csv-importer-controller.php
index 4711b5bb29e..f8cef598026 100644
--- a/includes/admin/importers/class-wc-product-csv-importer-controller.php
+++ b/includes/admin/importers/class-wc-product-csv-importer-controller.php
@@ -83,6 +83,42 @@ class WC_Product_CSV_Importer_Controller {
return new $importer_class( $file, $args );
}
+ /**
+ * Check whether a file is a valid CSV file.
+ *
+ * @param string $file File path.
+ * @param bool $check_path Whether to also check the file is located in a valid location (Default: true).
+ * @return bool
+ */
+ public static function is_file_valid_csv( $file, $check_path = true ) {
+ if ( $check_path && apply_filters( 'woocommerce_product_csv_importer_check_import_file_path', true ) && false !== stripos( $file, '://' ) ) {
+ return false;
+ }
+
+ $valid_filetypes = self::get_valid_csv_filetypes();
+ $filetype = wp_check_filetype( $file, $valid_filetypes );
+ if ( in_array( $filetype['type'], $valid_filetypes, true ) ) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Get all the valid filetypes for a CSV file.
+ *
+ * @return array
+ */
+ protected static function get_valid_csv_filetypes() {
+ return apply_filters(
+ 'woocommerce_csv_product_import_valid_filetypes',
+ array(
+ 'csv' => 'text/csv',
+ 'txt' => 'text/plain',
+ )
+ );
+ }
+
/**
* Constructor.
*/
@@ -112,7 +148,7 @@ class WC_Product_CSV_Importer_Controller {
$this->steps = apply_filters( 'woocommerce_product_csv_importer_steps', $default_steps );
- // phpcs:disable WordPress.CSRF.NonceVerification.NoNonceVerification
+ // phpcs:disable WordPress.Security.NonceVerification.NoNonceVerification
$this->step = isset( $_REQUEST['step'] ) ? sanitize_key( $_REQUEST['step'] ) : current( array_keys( $this->steps ) );
$this->file = isset( $_REQUEST['file'] ) ? wc_clean( wp_unslash( $_REQUEST['file'] ) ) : '';
$this->update_existing = isset( $_REQUEST['update_existing'] ) ? (bool) $_REQUEST['update_existing'] : false;
@@ -223,7 +259,7 @@ class WC_Product_CSV_Importer_Controller {
* Dispatch current step and show correct view.
*/
public function dispatch() {
- // phpcs:ignore WordPress.CSRF.NonceVerification.NoNonceVerification
+ // phpcs:ignore WordPress.Security.NonceVerification.NoNonceVerification
if ( ! empty( $_POST['save_step'] ) && ! empty( $this->steps[ $this->step ]['handler'] ) ) {
call_user_func( $this->steps[ $this->step ]['handler'], $this );
}
@@ -271,14 +307,7 @@ class WC_Product_CSV_Importer_Controller {
* @return string|WP_Error
*/
public function handle_upload() {
- $valid_filetypes = apply_filters(
- 'woocommerce_csv_product_import_valid_filetypes', array(
- 'csv' => 'text/csv',
- 'txt' => 'text/plain',
- )
- );
-
- // phpcs:disable WordPress.CSRF.NonceVerification.NoNonceVerification -- Nonce already verified in WC_Product_CSV_Importer_Controller::upload_form_handler()
+ // phpcs:disable WordPress.Security.NonceVerification.NoNonceVerification -- Nonce already verified in WC_Product_CSV_Importer_Controller::upload_form_handler()
$file_url = isset( $_POST['file_url'] ) ? wc_clean( wp_unslash( $_POST['file_url'] ) ) : '';
if ( empty( $file_url ) ) {
@@ -286,14 +315,13 @@ class WC_Product_CSV_Importer_Controller {
return new WP_Error( 'woocommerce_product_csv_importer_upload_file_empty', __( 'File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your php.ini or by post_max_size being defined as smaller than upload_max_filesize in php.ini.', 'woocommerce' ) );
}
- $filetype = wp_check_filetype( wc_clean( wp_unslash( $_FILES['import']['name'] ) ), $valid_filetypes );
- if ( ! in_array( $filetype['type'], $valid_filetypes, true ) ) {
+ if ( ! self::is_file_valid_csv( wc_clean( wp_unslash( $_FILES['import']['name'] ) ), false ) ) {
return new WP_Error( 'woocommerce_product_csv_importer_upload_file_invalid', __( 'Invalid file type. The importer supports CSV and TXT file formats.', 'woocommerce' ) );
}
$overrides = array(
'test_form' => false,
- 'mimes' => $valid_filetypes,
+ 'mimes' => self::get_valid_csv_filetypes(),
);
$import = $_FILES['import']; // WPCS: sanitization ok, input var ok.
$upload = wp_handle_upload( $import, $overrides );
@@ -323,8 +351,7 @@ class WC_Product_CSV_Importer_Controller {
return $upload['file'];
} elseif ( file_exists( ABSPATH . $file_url ) ) {
- $filetype = wp_check_filetype( ABSPATH . $file_url, $valid_filetypes );
- if ( ! in_array( $filetype['type'], $valid_filetypes, true ) ) {
+ if ( ! self::is_file_valid_csv( ABSPATH . $file_url ) ) {
return new WP_Error( 'woocommerce_product_csv_importer_upload_file_invalid', __( 'Invalid file type. The importer supports CSV and TXT file formats.', 'woocommerce' ) );
}
@@ -372,12 +399,19 @@ class WC_Product_CSV_Importer_Controller {
* Import the file if it exists and is valid.
*/
public function import() {
- if ( ! is_file( $this->file ) ) {
- $this->add_error( __( 'The file does not exist, please try again.', 'woocommerce' ) );
+ if ( ! self::is_file_valid_csv( $this->file ) ) {
+ $this->add_error( __( 'Invalid file type. The importer supports CSV and TXT file formats.', 'woocommerce' ) );
+ $this->output_errors();
return;
}
- // phpcs:disable WordPress.CSRF.NonceVerification.NoNonceVerification -- Nonce already verified in WC_Admin_Importers::do_ajax_product_import()
+ if ( ! is_file( $this->file ) ) {
+ $this->add_error( __( 'The file does not exist, please try again.', 'woocommerce' ) );
+ $this->output_errors();
+ return;
+ }
+
+ // phpcs:disable WordPress.Security.NonceVerification.NoNonceVerification -- Nonce already verified in WC_Admin_Importers::do_ajax_product_import()
if ( ! empty( $_POST['map_from'] ) && ! empty( $_POST['map_to'] ) ) {
$mapping_from = wc_clean( wp_unslash( $_POST['map_from'] ) );
$mapping_to = wc_clean( wp_unslash( $_POST['map_to'] ) );
@@ -391,7 +425,9 @@ class WC_Product_CSV_Importer_Controller {
// phpcs:enable
wp_localize_script(
- 'wc-product-import', 'wc_product_import_params', array(
+ 'wc-product-import',
+ 'wc_product_import_params',
+ array(
'import_nonce' => wp_create_nonce( 'wc-product-import' ),
'mapping' => array(
'from' => $mapping_from,
@@ -411,7 +447,7 @@ class WC_Product_CSV_Importer_Controller {
* Done step.
*/
protected function done() {
- // phpcs:disable WordPress.CSRF.NonceVerification.NoNonceVerification
+ // phpcs:disable WordPress.Security.NonceVerification.NoNonceVerification
$imported = isset( $_GET['products-imported'] ) ? absint( $_GET['products-imported'] ) : 0;
$updated = isset( $_GET['products-updated'] ) ? absint( $_GET['products-updated'] ) : 0;
$failed = isset( $_GET['products-failed'] ) ? absint( $_GET['products-failed'] ) : 0;
@@ -458,7 +494,8 @@ class WC_Product_CSV_Importer_Controller {
*/
$default_columns = $this->normalize_columns_names(
apply_filters(
- 'woocommerce_csv_product_import_mapping_default_columns', array(
+ 'woocommerce_csv_product_import_mapping_default_columns',
+ array(
__( 'ID', 'woocommerce' ) => 'id',
__( 'Type', 'woocommerce' ) => 'type',
__( 'SKU', 'woocommerce' ) => 'sku',
diff --git a/includes/admin/importers/class-wc-tax-rate-importer.php b/includes/admin/importers/class-wc-tax-rate-importer.php
index 839a10e8f12..32e49b53943 100644
--- a/includes/admin/importers/class-wc-tax-rate-importer.php
+++ b/includes/admin/importers/class-wc-tax-rate-importer.php
@@ -101,7 +101,7 @@ class WC_Tax_Rate_Importer extends WP_Importer {
*/
private function import_start() {
if ( function_exists( 'gc_enable' ) ) {
- gc_enable(); // phpcs:ignore PHPCompatibility.PHP.NewFunctions.gc_enableFound
+ gc_enable(); // phpcs:ignore PHPCompatibility.FunctionUse.NewFunctions.gc_enableFound
}
wc_set_time_limit( 0 );
@ob_flush();
@@ -200,8 +200,8 @@ class WC_Tax_Rate_Importer extends WP_Importer {
* @return bool False if error uploading or invalid file, true otherwise
*/
public function handle_upload() {
- // phpcs:disable WordPress.CSRF.NonceVerification.NoNonceVerification -- Nonce already verified in WC_Tax_Rate_Importer::dispatch()
- $file_url = isset( $_POST['file_url'] ) ? esc_url_raw( wp_unslash( $_POST['file_url'] ) ) : '';
+ // phpcs:disable WordPress.Security.NonceVerification.NoNonceVerification -- Nonce already verified in WC_Tax_Rate_Importer::dispatch()
+ $file_url = isset( $_POST['file_url'] ) ? wc_clean( wp_unslash( $_POST['file_url'] ) ) : '';
if ( empty( $file_url ) ) {
$file = wp_import_handle_upload();
diff --git a/includes/admin/list-tables/class-wc-admin-list-table-orders.php b/includes/admin/list-tables/class-wc-admin-list-table-orders.php
index f9babc8825b..4a64388e475 100644
--- a/includes/admin/list-tables/class-wc-admin-list-table-orders.php
+++ b/includes/admin/list-tables/class-wc-admin-list-table-orders.php
@@ -135,10 +135,13 @@ class WC_Admin_List_Table_Orders extends WC_Admin_List_Table {
unset( $actions['edit'] );
}
- $actions['mark_processing'] = __( 'Change status to processing', 'woocommerce' );
- $actions['mark_on-hold'] = __( 'Change status to on-hold', 'woocommerce' );
- $actions['mark_completed'] = __( 'Change status to completed', 'woocommerce' );
- $actions['remove_personal_data'] = __( 'Remove personal data', 'woocommerce' );
+ $actions['mark_processing'] = __( 'Change status to processing', 'woocommerce' );
+ $actions['mark_on-hold'] = __( 'Change status to on-hold', 'woocommerce' );
+ $actions['mark_completed'] = __( 'Change status to completed', 'woocommerce' );
+
+ if ( wc_string_to_bool( get_option( 'woocommerce_allow_bulk_remove_personal_data', 'no' ) ) ) {
+ $actions['remove_personal_data'] = __( 'Remove personal data', 'woocommerce' );
+ }
return $actions;
}
@@ -422,7 +425,8 @@ class WC_Admin_List_Table_Orders extends WC_Admin_List_Table {
*/
public static function get_order_preview_item_html( $order ) {
$hidden_order_itemmeta = apply_filters(
- 'woocommerce_hidden_order_itemmeta', array(
+ 'woocommerce_hidden_order_itemmeta',
+ array(
'_qty',
'_tax_class',
'_product_id',
@@ -439,12 +443,14 @@ class WC_Admin_List_Table_Orders extends WC_Admin_List_Table {
$line_items = apply_filters( 'woocommerce_admin_order_preview_line_items', $order->get_items(), $order );
$columns = apply_filters(
- 'woocommerce_admin_order_preview_line_item_columns', array(
+ 'woocommerce_admin_order_preview_line_item_columns',
+ array(
'product' => __( 'Product', 'woocommerce' ),
'quantity' => __( 'Quantity', 'woocommerce' ),
'tax' => __( 'Tax', 'woocommerce' ),
'total' => __( 'Total', 'woocommerce' ),
- ), $order
+ ),
+ $order
);
if ( ! wc_tax_enabled() ) {
@@ -602,11 +608,12 @@ class WC_Admin_List_Table_Orders extends WC_Admin_List_Table {
$shipping_address = $order->get_formatted_shipping_address();
return apply_filters(
- 'woocommerce_admin_order_preview_get_order_details', array(
+ 'woocommerce_admin_order_preview_get_order_details',
+ array(
'data' => $order->get_data(),
'order_number' => $order->get_order_number(),
- 'item_html' => WC_Admin_List_Table_Orders::get_order_preview_item_html( $order ),
- 'actions_html' => WC_Admin_List_Table_Orders::get_order_preview_actions_html( $order ),
+ 'item_html' => self::get_order_preview_item_html( $order ),
+ 'actions_html' => self::get_order_preview_actions_html( $order ),
'ship_to_billing' => wc_ship_to_billing_address_only(),
'needs_shipping' => $order->needs_shipping_address(),
'formatted_billing_address' => $billing_address ? $billing_address : __( 'N/A', 'woocommerce' ),
@@ -616,7 +623,8 @@ class WC_Admin_List_Table_Orders extends WC_Admin_List_Table {
'shipping_via' => $order->get_shipping_method(),
'status' => $order->get_status(),
'status_name' => wc_get_order_status_name( $order->get_status() ),
- ), $order
+ ),
+ $order
);
}
@@ -651,7 +659,7 @@ class WC_Admin_List_Table_Orders extends WC_Admin_List_Table {
// Sanity check: bail out if this is actually not a status, or is not a registered status.
if ( isset( $order_statuses[ 'wc-' . $new_status ] ) ) {
// Initialize payment gateways in case order has hooked status transition actions.
- wc()->payment_gateways();
+ WC()->payment_gateways();
foreach ( $ids as $id ) {
$order = wc_get_order( $id );
@@ -669,7 +677,8 @@ class WC_Admin_List_Table_Orders extends WC_Admin_List_Table {
'bulk_action' => $report_action,
'changed' => $changed,
'ids' => join( ',', $ids ),
- ), $redirect_to
+ ),
+ $redirect_to
);
}
@@ -726,7 +735,7 @@ class WC_Admin_List_Table_Orders extends WC_Admin_List_Table {
$user_string = '';
$user_id = '';
- if ( ! empty( $_GET['_customer_user'] ) ) { // WPCS: input var ok.
+ if ( ! empty( $_GET['_customer_user'] ) ) { // phpcs:disable WordPress.Security.NonceVerification.NoNonceVerification
$user_id = absint( $_GET['_customer_user'] ); // WPCS: input var ok, sanitization ok.
$user = get_user_by( 'id', $user_id );
@@ -772,22 +781,15 @@ class WC_Admin_List_Table_Orders extends WC_Admin_List_Table {
// Filter the orders by the posted customer.
if ( ! empty( $_GET['_customer_user'] ) ) { // WPCS: input var ok.
- $customer_id = (int) $_GET['_customer_user']; // WPCS: input var ok, sanitization ok.
-
- // On WC 3.5.0 the ID of the user that placed the order was moved from the post meta _customer_user to the post_author field in the wp_posts table.
- if ( version_compare( get_option( 'woocommerce_db_version' ), '3.5.0', '>=' ) ) {
- $query_vars['author'] = $customer_id;
- } else {
- // @codingStandardsIgnoreStart
- $query_vars['meta_query'] = array(
- array(
- 'key' => '_customer_user',
- 'value' => $customer_id,
- 'compare' => '=',
- ),
- );
- // @codingStandardsIgnoreEnd
- }
+ // @codingStandardsIgnoreStart.
+ $query_vars['meta_query'] = array(
+ array(
+ 'key' => '_customer_user',
+ 'value' => (int) $_GET['_customer_user'], // WPCS: input var ok, sanitization ok.
+ 'compare' => '=',
+ ),
+ );
+ // @codingStandardsIgnoreEnd
}
// Sorting.
@@ -803,7 +805,7 @@ class WC_Admin_List_Table_Orders extends WC_Admin_List_Table {
}
// Status.
- if ( ! isset( $query_vars['post_status'] ) ) {
+ if ( empty( $query_vars['post_status'] ) ) {
$post_statuses = wc_get_order_statuses();
foreach ( $post_statuses as $status => $value ) {
@@ -826,7 +828,7 @@ class WC_Admin_List_Table_Orders extends WC_Admin_List_Table {
public function search_label( $query ) {
global $pagenow, $typenow;
- if ( 'edit.php' !== $pagenow || 'shop_order' !== $typenow || ! get_query_var( 'shop_order_search' ) || ! isset( $_GET['s'] ) ) { // WPCS: input var ok.
+ if ( 'edit.php' !== $pagenow || 'shop_order' !== $typenow || ! get_query_var( 'shop_order_search' ) || ! isset( $_GET['s'] ) ) { // phpcs:disable WordPress.Security.NonceVerification.NoNonceVerification
return $query;
}
@@ -852,7 +854,7 @@ class WC_Admin_List_Table_Orders extends WC_Admin_List_Table {
public function search_custom_fields( $wp ) {
global $pagenow;
- if ( 'edit.php' !== $pagenow || empty( $wp->query_vars['s'] ) || 'shop_order' !== $wp->query_vars['post_type'] || ! isset( $_GET['s'] ) ) { // WPCS: input var ok.
+ if ( 'edit.php' !== $pagenow || empty( $wp->query_vars['s'] ) || 'shop_order' !== $wp->query_vars['post_type'] || ! isset( $_GET['s'] ) ) { // phpcs:disable WordPress.Security.NonceVerification.NoNonceVerification
return;
}
diff --git a/includes/admin/list-tables/class-wc-admin-list-table-products.php b/includes/admin/list-tables/class-wc-admin-list-table-products.php
index 646d91e868d..b87f8277a93 100644
--- a/includes/admin/list-tables/class-wc-admin-list-table-products.php
+++ b/includes/admin/list-tables/class-wc-admin-list-table-products.php
@@ -39,6 +39,7 @@ class WC_Admin_List_Table_Products extends WC_Admin_List_Table {
add_filter( 'query_vars', array( $this, 'add_custom_query_var' ) );
add_filter( 'views_edit-product', array( $this, 'product_views' ) );
add_filter( 'get_search_query', array( $this, 'search_label' ) );
+ add_filter( 'posts_clauses', array( $this, 'add_variation_parents_for_shipping_class' ), 10, 2 );
}
/**
@@ -160,7 +161,7 @@ class WC_Admin_List_Table_Products extends WC_Admin_List_Table {
echo '';
if ( $this->object->get_parent_id() > 0 ) {
- echo ' ← ' . get_the_title( $this->object->get_parent_id() ) . ' ';
+ echo ' ← ' . get_the_title( $this->object->get_parent_id() ) . ' '; // @codingStandardsIgnoreLine.
}
get_inline_data( $post );
@@ -168,7 +169,7 @@ class WC_Admin_List_Table_Products extends WC_Admin_List_Table {
/* Custom inline data for woocommerce. */
echo '
-
+
' . esc_html( $this->object->get_sku() ) . '
' . esc_html( $this->object->get_regular_price() ) . '
' . esc_html( $this->object->get_sale_price() ) . '
@@ -288,11 +289,14 @@ class WC_Admin_List_Table_Products extends WC_Admin_List_Table {
* Render any custom filters and search inputs for the list table.
*/
protected function render_filters() {
- $filters = apply_filters( 'woocommerce_products_admin_list_table_filters', array(
- 'product_category' => array( $this, 'render_products_category_filter' ),
- 'product_type' => array( $this, 'render_products_type_filter' ),
- 'stock_status' => array( $this, 'render_products_stock_status_filter' ),
- ) );
+ $filters = apply_filters(
+ 'woocommerce_products_admin_list_table_filters',
+ array(
+ 'product_category' => array( $this, 'render_products_category_filter' ),
+ 'product_type' => array( $this, 'render_products_type_filter' ),
+ 'stock_status' => array( $this, 'render_products_stock_status_filter' ),
+ )
+ );
ob_start();
foreach ( $filters as $filter_callback ) {
@@ -388,18 +392,24 @@ class WC_Admin_List_Table_Products extends WC_Admin_List_Table {
protected function query_filters( $query_vars ) {
if ( isset( $query_vars['orderby'] ) ) {
if ( 'price' === $query_vars['orderby'] ) {
- $query_vars = array_merge( $query_vars, array(
- // phpcs:ignore WordPress.VIP.SlowDBQuery.slow_db_query_meta_key
- 'meta_key' => '_price',
- 'orderby' => 'meta_value_num',
- ) );
+ $query_vars = array_merge(
+ $query_vars,
+ array(
+ // phpcs:ignore WordPress.VIP.SlowDBQuery.slow_db_query_meta_key
+ 'meta_key' => '_price',
+ 'orderby' => 'meta_value_num',
+ )
+ );
}
if ( 'sku' === $query_vars['orderby'] ) {
- $query_vars = array_merge( $query_vars, array(
- // phpcs:ignore WordPress.VIP.SlowDBQuery.slow_db_query_meta_key
- 'meta_key' => '_sku',
- 'orderby' => 'meta_value',
- ) );
+ $query_vars = array_merge(
+ $query_vars,
+ array(
+ // phpcs:ignore WordPress.VIP.SlowDBQuery.slow_db_query_meta_key
+ 'meta_key' => '_sku',
+ 'orderby' => 'meta_value',
+ )
+ );
}
}
@@ -497,4 +507,26 @@ class WC_Admin_List_Table_Products extends WC_Admin_List_Table {
return wc_clean( wp_unslash( $_GET['s'] ) ); // WPCS: input var ok, sanitization ok.
}
+
+ /**
+ * Modifies post query so that it includes parent products whose variations have particular shipping class assigned.
+ *
+ * @param array $pieces Array of SELECT statement pieces (from, where, etc).
+ * @param WP_Query $wp_query WP_Query instance.
+ * @return array Array of products, including parents of variations.
+ */
+ public function add_variation_parents_for_shipping_class( $pieces, $wp_query ) {
+ global $wpdb;
+ if ( isset( $_GET['product_shipping_class'] ) && '0' !== $_GET['product_shipping_class'] ) { // WPCS: input var ok.
+ $replaced_where = str_replace( ".post_type = 'product'", ".post_type = 'product_variation'", $pieces['where'] );
+ $pieces['where'] .= " OR {$wpdb->posts}.ID in (
+ SELECT {$wpdb->posts}.post_parent FROM
+ {$wpdb->posts} LEFT JOIN {$wpdb->term_relationships} ON ({$wpdb->posts}.ID = {$wpdb->term_relationships}.object_id)
+ WHERE 1=1 $replaced_where
+ )";
+ return $pieces;
+ }
+ return $pieces;
+ }
+
}
diff --git a/includes/admin/meta-boxes/class-wc-meta-box-order-notes.php b/includes/admin/meta-boxes/class-wc-meta-box-order-notes.php
index d3c62f85a56..52f4e7b5779 100644
--- a/includes/admin/meta-boxes/class-wc-meta-box-order-notes.php
+++ b/includes/admin/meta-boxes/class-wc-meta-box-order-notes.php
@@ -44,7 +44,7 @@ class WC_Meta_Box_Order_Notes {
?>
- content ) ) ); ?>
+ content ) ) ) ); ?>
date_created->date_i18n( wc_date_format() ), $note->date_created->date_i18n( wc_time_format() ) ); ?>
diff --git a/includes/admin/meta-boxes/views/html-order-item.php b/includes/admin/meta-boxes/views/html-order-item.php
index 3879f7b3ad6..f6c5e0b742b 100644
--- a/includes/admin/meta-boxes/views/html-order-item.php
+++ b/includes/admin/meta-boxes/views/html-order-item.php
@@ -19,7 +19,7 @@ $row_class = apply_filters( 'woocommerce_admin_html_order_item_class', ! empt
' . esc_html( $item->get_name() ) . '' : '' . esc_html( $item->get_name() ) . '
';
+ echo $product_link ? '' . wp_kses_post( $item->get_name() ) . ' ' : '' . wp_kses_post( $item->get_name() ) . '
';
if ( $product && $product->get_sku() ) {
echo '' . esc_html__( 'SKU:', 'woocommerce' ) . ' ' . esc_html( $product->get_sku() ) . '
';
diff --git a/includes/admin/meta-boxes/views/html-order-items.php b/includes/admin/meta-boxes/views/html-order-items.php
index 1a151407624..a641743ef66 100644
--- a/includes/admin/meta-boxes/views/html-order-items.php
+++ b/includes/admin/meta-boxes/views/html-order-items.php
@@ -66,7 +66,7 @@ if ( wc_tax_enabled() ) {
shipping() ? WC()->shipping->load_shipping_methods() : array();
+ $shipping_methods = WC()->shipping() ? WC()->shipping()->load_shipping_methods() : array();
foreach ( $line_items_shipping as $item_id => $item ) {
include 'html-order-shipping.php';
}
@@ -253,7 +253,7 @@ if ( wc_tax_enabled() ) {
:
-
+ />
diff --git a/includes/admin/meta-boxes/views/html-product-data-general.php b/includes/admin/meta-boxes/views/html-product-data-general.php
index 25d586155fe..4d536d27cf1 100644
--- a/includes/admin/meta-boxes/views/html-product-data-general.php
+++ b/includes/admin/meta-boxes/views/html-product-data-general.php
@@ -12,7 +12,7 @@ if ( ! defined( 'ABSPATH' ) ) {
'id' => '_product_url',
'value' => is_callable( array( $product_object, 'get_product_url' ) ) ? $product_object->get_product_url( 'edit' ) : '',
'label' => __( 'Product URL', 'woocommerce' ),
- 'placeholder' => 'http://',
+ 'placeholder' => 'https://',
'description' => __( 'Enter the external URL to the product.', 'woocommerce' ),
)
);
diff --git a/includes/admin/meta-boxes/views/html-product-data-inventory.php b/includes/admin/meta-boxes/views/html-product-data-inventory.php
index fe9834feb62..cb5d406b231 100644
--- a/includes/admin/meta-boxes/views/html-product-data-inventory.php
+++ b/includes/admin/meta-boxes/views/html-product-data-inventory.php
@@ -71,19 +71,20 @@ if ( ! defined( 'ABSPATH' ) ) {
)
);
- woocommerce_wp_text_input( array(
- 'id' => '_low_stock_amount',
- 'value' => $product_object->get_low_stock_amount( 'edit' ),
- 'placeholder' => get_option( 'woocommerce_notify_low_stock_amount' ),
- 'label' => __( 'Low stock threshold', 'woocommerce' ),
- 'desc_tip' => true,
- 'description' => __( 'When product stock reaches this amount you will be notified by email', 'woocommerce' ),
- 'type' => 'number',
- 'custom_attributes' => array(
- 'step' => 'any',
- ),
- 'data_type' => 'stock',
- ) );
+ woocommerce_wp_text_input(
+ array(
+ 'id' => '_low_stock_amount',
+ 'value' => $product_object->get_low_stock_amount( 'edit' ),
+ 'placeholder' => get_option( 'woocommerce_notify_low_stock_amount' ),
+ 'label' => __( 'Low stock threshold', 'woocommerce' ),
+ 'desc_tip' => true,
+ 'description' => __( 'When product stock reaches this amount you will be notified by email', 'woocommerce' ),
+ 'type' => 'number',
+ 'custom_attributes' => array(
+ 'step' => 'any',
+ ),
+ )
+ );
do_action( 'woocommerce_product_options_stock_fields' );
diff --git a/includes/admin/meta-boxes/views/html-product-data-panel.php b/includes/admin/meta-boxes/views/html-product-data-panel.php
index 6decb5c6046..5fd93719b65 100644
--- a/includes/admin/meta-boxes/views/html-product-data-panel.php
+++ b/includes/admin/meta-boxes/views/html-product-data-panel.php
@@ -9,9 +9,7 @@ if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
-
+
—
diff --git a/includes/admin/meta-boxes/views/html-product-data-shipping.php b/includes/admin/meta-boxes/views/html-product-data-shipping.php
index da8c23b34b6..72b82540271 100644
--- a/includes/admin/meta-boxes/views/html-product-data-shipping.php
+++ b/includes/admin/meta-boxes/views/html-product-data-shipping.php
@@ -52,7 +52,7 @@ if ( ! defined( 'ABSPATH' ) ) {
'class' => 'select short',
);
?>
-
+
diff --git a/includes/admin/meta-boxes/views/html-product-data-variations.php b/includes/admin/meta-boxes/views/html-product-data-variations.php
index 36c6a32d8b6..c6ebfac5006 100644
--- a/includes/admin/meta-boxes/views/html-product-data-variations.php
+++ b/includes/admin/meta-boxes/views/html-product-data-variations.php
@@ -33,11 +33,11 @@ if ( ! defined( 'ABSPATH' ) ) {
get_name() ) ) ); ?>
is_taxonomy() ) : ?>
get_terms() as $option ) : ?>
- slug ); ?> value="slug ); ?>">name ) ); ?>
+ slug ); ?> value="slug ); ?>">name, $option, $attribute->get_name(), $product_object ) ); ?>
get_options() as $option ) : ?>
- value="">
+ value="">get_name(), $product_object ) ); ?>
diff --git a/includes/admin/meta-boxes/views/html-variation-admin.php b/includes/admin/meta-boxes/views/html-variation-admin.php
index 06e3823884f..5e1cef7b3ea 100644
--- a/includes/admin/meta-boxes/views/html-variation-admin.php
+++ b/includes/admin/meta-boxes/views/html-variation-admin.php
@@ -35,11 +35,11 @@ if ( ! defined( 'ABSPATH' ) ) {
is_taxonomy() ) : ?>
get_terms() as $option ) : ?>
- slug ); ?> value="slug ); ?>">name ) ); ?>
+ slug ); ?> value="slug ); ?>">name, $option, $attribute->get_name(), $product_object ) ); ?>
get_options() as $option ) : ?>
- value="">
+ value="">get_name(), $product_object ) ); ?>
diff --git a/includes/admin/reports/class-wc-admin-report.php b/includes/admin/reports/class-wc-admin-report.php
index 9467e058837..60efaf696f2 100644
--- a/includes/admin/reports/class-wc-admin-report.php
+++ b/includes/admin/reports/class-wc-admin-report.php
@@ -129,7 +129,7 @@ class WC_Admin_Report {
$get_key = "order_items.{$key}";
break;
default:
- continue;
+ break;
}
if ( $value['function'] ) {
diff --git a/includes/admin/reports/class-wc-report-customer-list.php b/includes/admin/reports/class-wc-report-customer-list.php
index 1b1026f64f5..2e70569ceda 100644
--- a/includes/admin/reports/class-wc-report-customer-list.php
+++ b/includes/admin/reports/class-wc-report-customer-list.php
@@ -265,7 +265,7 @@ class WC_Report_Customer_List extends WP_List_Table {
*/
$admin_users = new WP_User_Query(
array(
- 'role' => 'administrator1',
+ 'role' => 'administrator',
'fields' => 'ID',
)
);
diff --git a/includes/admin/reports/class-wc-report-customers.php b/includes/admin/reports/class-wc-report-customers.php
index 326ad5334f5..503f470992f 100644
--- a/includes/admin/reports/class-wc-report-customers.php
+++ b/includes/admin/reports/class-wc-report-customers.php
@@ -69,56 +69,46 @@ class WC_Report_Customers extends WC_Admin_Report {
* Output customers vs guests chart.
*/
public function customers_vs_guests() {
- $customer_args = array(
- 'data' => array(
- 'ID' => array(
- 'type' => 'post_data',
- 'function' => 'COUNT',
- 'name' => 'total_orders',
+
+ $customer_order_totals = $this->get_order_report_data(
+ array(
+ 'data' => array(
+ 'ID' => array(
+ 'type' => 'post_data',
+ 'function' => 'COUNT',
+ 'name' => 'total_orders',
+ ),
),
- ),
- 'filter_range' => true,
+ 'where_meta' => array(
+ array(
+ 'meta_key' => '_customer_user',
+ 'meta_value' => '0',
+ 'operator' => '>',
+ ),
+ ),
+ 'filter_range' => true,
+ )
);
- $guest_args = $customer_args;
- // On WC 3.5.0 the ID of the user that placed the order was moved from the post meta _customer_user to the post_author field in the wp_posts table.
- if ( version_compare( get_option( 'woocommerce_db_version' ), '3.5.0', '>=' ) ) {
- $customer_args['where'] = array(
- array(
- 'key' => 'post_author',
- 'value' => '0',
- 'operator' => '>',
+ $guest_order_totals = $this->get_order_report_data(
+ array(
+ 'data' => array(
+ 'ID' => array(
+ 'type' => 'post_data',
+ 'function' => 'COUNT',
+ 'name' => 'total_orders',
+ ),
),
- );
-
- $guest_args['where'] = array(
- array(
- 'key' => 'post_author',
- 'value' => '0',
- 'operator' => '=',
+ 'where_meta' => array(
+ array(
+ 'meta_key' => '_customer_user',
+ 'meta_value' => '0',
+ 'operator' => '=',
+ ),
),
- );
- } else {
- $customer_args['where_meta'] = array(
- array(
- 'meta_key' => '_customer_user',
- 'meta_value' => '0',
- 'operator' => '>',
- ),
- );
-
- $guest_args['where_meta'] = array(
- array(
- 'meta_key' => '_customer_user',
- 'meta_value' => '0',
- 'operator' => '=',
- ),
- );
- }
-
- $customer_order_totals = $this->get_order_report_data( $customer_args );
- $guest_order_totals = $this->get_order_report_data( $guest_args );
-
+ 'filter_range' => true,
+ )
+ );
?>
@@ -256,63 +246,61 @@ class WC_Report_Customers extends WC_Admin_Report {
public function get_main_chart() {
global $wp_locale;
- $customer_args = array(
- 'data' => array(
- 'ID' => array(
- 'type' => 'post_data',
- 'function' => 'COUNT',
- 'name' => 'total_orders',
+ $customer_orders = $this->get_order_report_data(
+ array(
+ 'data' => array(
+ 'ID' => array(
+ 'type' => 'post_data',
+ 'function' => 'COUNT',
+ 'name' => 'total_orders',
+ ),
+ 'post_date' => array(
+ 'type' => 'post_data',
+ 'function' => '',
+ 'name' => 'post_date',
+ ),
),
- 'post_date' => array(
- 'type' => 'post_data',
- 'function' => '',
- 'name' => 'post_date',
+ 'where_meta' => array(
+ array(
+ 'meta_key' => '_customer_user',
+ 'meta_value' => '0',
+ 'operator' => '>',
+ ),
),
- ),
- 'group_by' => $this->group_by_query,
- 'order_by' => 'post_date ASC',
- 'query_type' => 'get_results',
- 'filter_range' => true,
+ 'group_by' => $this->group_by_query,
+ 'order_by' => 'post_date ASC',
+ 'query_type' => 'get_results',
+ 'filter_range' => true,
+ )
);
- $guest_args = $customer_args;
- // On WC 3.5.0 the ID of the user that placed the order was moved from the post meta _customer_user to the post_author field in the wp_posts table.
- if ( version_compare( get_option( 'woocommerce_db_version' ), '3.5.0', '>=' ) ) {
- $customer_args['where'] = array(
- array(
- 'key' => 'post_author',
- 'value' => '0',
- 'operator' => '>',
+ $guest_orders = $this->get_order_report_data(
+ array(
+ 'data' => array(
+ 'ID' => array(
+ 'type' => 'post_data',
+ 'function' => 'COUNT',
+ 'name' => 'total_orders',
+ ),
+ 'post_date' => array(
+ 'type' => 'post_data',
+ 'function' => '',
+ 'name' => 'post_date',
+ ),
),
- );
-
- $guest_args['where'] = array(
- array(
- 'key' => 'post_author',
- 'value' => '0',
- 'operator' => '=',
+ 'where_meta' => array(
+ array(
+ 'meta_key' => '_customer_user',
+ 'meta_value' => '0',
+ 'operator' => '=',
+ ),
),
- );
- } else {
- $customer_args['where_meta'] = array(
- array(
- 'meta_key' => '_customer_user',
- 'meta_value' => '0',
- 'operator' => '>',
- ),
- );
-
- $guest_args['where_meta'] = array(
- array(
- 'meta_key' => '_customer_user',
- 'meta_value' => '0',
- 'operator' => '=',
- ),
- );
- }
-
- $customer_orders = $this->get_order_report_data( $customer_args );
- $guest_orders = $this->get_order_report_data( $guest_args );
+ 'group_by' => $this->group_by_query,
+ 'order_by' => 'post_date ASC',
+ 'query_type' => 'get_results',
+ 'filter_range' => true,
+ )
+ );
$signups = $this->prepare_chart_data( $this->customers, 'user_registered', '', $this->chart_interval, $this->start_date, $this->chart_groupby );
$customer_orders = $this->prepare_chart_data( $customer_orders, 'post_date', 'total_orders', $this->chart_interval, $this->start_date, $this->chart_groupby );
diff --git a/includes/admin/settings/class-wc-settings-accounts.php b/includes/admin/settings/class-wc-settings-accounts.php
index cd52a60cbd2..bba9f5cfd26 100644
--- a/includes/admin/settings/class-wc-settings-accounts.php
+++ b/includes/admin/settings/class-wc-settings-accounts.php
@@ -31,8 +31,14 @@ class WC_Settings_Accounts extends WC_Settings_Page {
* @return array
*/
public function get_settings() {
+ $erasure_text = esc_html__( 'account erasure request', 'woocommerce' );
+ if ( current_user_can( 'manage_privacy_options' ) ) {
+ $erasure_text = sprintf( '
%s ', esc_url( admin_url( 'tools.php?page=remove_personal_data' ) ), $erasure_text );
+ }
+
$settings = apply_filters(
- 'woocommerce_' . $this->id . '_settings', array(
+ 'woocommerce_' . $this->id . '_settings',
+ array(
array(
'title' => '',
'type' => 'title',
@@ -91,9 +97,9 @@ class WC_Settings_Accounts extends WC_Settings_Page {
),
array(
'title' => __( 'Account erasure requests', 'woocommerce' ),
- 'desc' => __( 'Remove personal data from orders', 'woocommerce' ),
+ 'desc' => __( 'Remove personal data from orders on request', 'woocommerce' ),
/* Translators: %s URL to erasure request screen. */
- 'desc_tip' => sprintf( __( 'When handling an
account erasure request , should personal data within orders be retained or removed?', 'woocommerce' ), esc_url( admin_url( 'tools.php?page=remove_personal_data' ) ) ),
+ 'desc_tip' => sprintf( esc_html__( 'When handling an %s, should personal data within orders be retained or removed?', 'woocommerce' ), $erasure_text ),
'id' => 'woocommerce_erasure_request_removes_order_data',
'type' => 'checkbox',
'default' => 'no',
@@ -101,15 +107,25 @@ class WC_Settings_Accounts extends WC_Settings_Page {
'autoload' => false,
),
array(
- 'desc' => __( 'Remove access to downloads', 'woocommerce' ),
+ 'desc' => __( 'Remove access to downloads on request', 'woocommerce' ),
/* Translators: %s URL to erasure request screen. */
- 'desc_tip' => sprintf( __( 'When handling an
account erasure request , should access to downloadable files be revoked and download logs cleared?', 'woocommerce' ), esc_url( admin_url( 'tools.php?page=remove_personal_data' ) ) ),
+ 'desc_tip' => sprintf( esc_html__( 'When handling an %s, should access to downloadable files be revoked and download logs cleared?', 'woocommerce' ), $erasure_text ),
'id' => 'woocommerce_erasure_request_removes_download_data',
'type' => 'checkbox',
'default' => 'no',
'checkboxgroup' => 'end',
'autoload' => false,
),
+ array(
+ 'title' => __( 'Personal data removal', 'woocommerce' ),
+ 'desc' => __( 'Allow personal data to be removed in bulk from orders', 'woocommerce' ),
+ 'desc_tip' => __( 'Adds an option to the orders screen for removing personal in bulk. Note that removing personal data cannot be undone.', 'woocommerce' ),
+ 'id' => 'woocommerce_allow_bulk_remove_personal_data',
+ 'type' => 'checkbox',
+ 'checkboxgroup' => 'start',
+ 'default' => 'no',
+ 'autoload' => false,
+ ),
array(
'type' => 'sectionend',
'id' => 'account_registration_options',
diff --git a/includes/admin/settings/class-wc-settings-emails.php b/includes/admin/settings/class-wc-settings-emails.php
index 22fd8661197..44f7df15781 100644
--- a/includes/admin/settings/class-wc-settings-emails.php
+++ b/includes/admin/settings/class-wc-settings-emails.php
@@ -108,6 +108,7 @@ class WC_Settings_Emails extends WC_Settings_Page {
array(
'title' => __( 'Email template', 'woocommerce' ),
'type' => 'title',
+ /* translators: %s: Nonced email preview link */
'desc' => sprintf( __( 'This section lets you customize the WooCommerce emails.
Click here to preview your email template .', 'woocommerce' ), wp_nonce_url( admin_url( '?preview_woocommerce_mail=true' ), 'preview-mail' ) ),
'id' => 'email_template_options',
),
@@ -126,12 +127,13 @@ class WC_Settings_Emails extends WC_Settings_Page {
array(
'title' => __( 'Footer text', 'woocommerce' ),
+ /* translators: %s: Available placeholders for use */
'desc' => __( 'The text to appear in the footer of WooCommerce emails.', 'woocommerce' ) . ' ' . sprintf( __( 'Available placeholders: %s', 'woocommerce' ), '{site_title}' ),
'id' => 'woocommerce_email_footer_text',
'css' => 'width:300px; height: 75px;',
'placeholder' => __( 'N/A', 'woocommerce' ),
'type' => 'textarea',
- 'default' => '{site_title}',
+ 'default' => '{site_title}
Powered by
WooCommerce ',
'autoload' => false,
'desc_tip' => true,
),
@@ -282,7 +284,7 @@ class WC_Settings_Emails extends WC_Settings_Page {
switch ( $key ) {
case 'name':
echo '
- ' . $email->get_title() . '
+ ' . esc_html( $email->get_title() ) . '
' . wc_help_tip( $email->get_description() ) . '
';
break;
@@ -311,7 +313,7 @@ class WC_Settings_Emails extends WC_Settings_Page {
break;
case 'actions':
echo '
- ' . esc_html__( 'Manage', 'woocommerce' ) . '
+ ' . esc_html__( 'Manage', 'woocommerce' ) . '
';
break;
default:
diff --git a/includes/admin/settings/class-wc-settings-shipping.php b/includes/admin/settings/class-wc-settings-shipping.php
index efc2d90c9a0..a7627fac51a 100644
--- a/includes/admin/settings/class-wc-settings-shipping.php
+++ b/includes/admin/settings/class-wc-settings-shipping.php
@@ -51,7 +51,7 @@ class WC_Settings_Shipping extends WC_Settings_Page {
if ( ! defined( 'WC_INSTALLING' ) ) {
// Load shipping methods so we can show any global options they may have.
- $shipping_methods = WC()->shipping->load_shipping_methods();
+ $shipping_methods = WC()->shipping()->load_shipping_methods();
foreach ( $shipping_methods as $method ) {
if ( ! $method->has_settings() ) {
@@ -146,7 +146,7 @@ class WC_Settings_Shipping extends WC_Settings_Page {
global $current_section, $hide_save_button;
// Load shipping methods so we can show any global options they may have.
- $shipping_methods = WC()->shipping->load_shipping_methods();
+ $shipping_methods = WC()->shipping()->load_shipping_methods();
if ( '' === $current_section ) {
$this->output_zones_screen();
@@ -174,8 +174,11 @@ class WC_Settings_Shipping extends WC_Settings_Page {
switch ( $current_section ) {
case 'options':
WC_Admin_Settings::save_fields( $this->get_settings() );
+ do_action( 'woocommerce_update_options_' . $this->id . '_options' );
break;
case 'classes':
+ do_action( 'woocommerce_update_options_' . $this->id . '_classes' );
+ break;
case '':
break;
default:
@@ -189,10 +192,6 @@ class WC_Settings_Shipping extends WC_Settings_Page {
break;
}
- if ( $current_section ) {
- do_action( 'woocommerce_update_options_' . $this->id . '_' . $current_section );
- }
-
// Increments the transient version to invalidate cache.
WC_Cache_Helper::get_transient_version( 'shipping', true );
}
diff --git a/includes/admin/settings/views/html-admin-page-shipping-zone-methods.php b/includes/admin/settings/views/html-admin-page-shipping-zone-methods.php
index 9524a51a17d..5614902db20 100644
--- a/includes/admin/settings/views/html-admin-page-shipping-zone-methods.php
+++ b/includes/admin/settings/views/html-admin-page-shipping-zone-methods.php
@@ -183,7 +183,7 @@ if ( ! defined( 'ABSPATH' ) ) {
shipping->load_shipping_methods() as $method ) {
+ foreach ( WC()->shipping()->load_shipping_methods() as $method ) {
if ( ! $method->supports( 'shipping-zones' ) ) {
continue;
}
diff --git a/includes/admin/settings/views/html-admin-page-shipping-zones.php b/includes/admin/settings/views/html-admin-page-shipping-zones.php
index 339707bd669..0197312c6ad 100644
--- a/includes/admin/settings/views/html-admin-page-shipping-zones.php
+++ b/includes/admin/settings/views/html-admin-page-shipping-zones.php
@@ -104,7 +104,7 @@ if ( ! defined( 'ABSPATH' ) ) {
shipping->load_shipping_methods() as $method ) {
+ foreach ( WC()->shipping()->load_shipping_methods() as $method ) {
if ( ! $method->supports( 'shipping-zones' ) ) {
continue;
}
diff --git a/includes/admin/settings/views/html-keys-edit.php b/includes/admin/settings/views/html-keys-edit.php
index c98e3c89105..1f7d37952f1 100644
--- a/includes/admin/settings/views/html-keys-edit.php
+++ b/includes/admin/settings/views/html-keys-edit.php
@@ -1,7 +1,11 @@
@@ -34,8 +38,8 @@ if ( ! defined( 'ABSPATH' ) ) {
$curent_user_id = get_current_user_id();
$user_id = ! empty( $key_data['user_id'] ) ? absint( $key_data['user_id'] ) : $curent_user_id;
$user = get_user_by( 'id', $user_id );
- /* translators: 1: user display name 2: user ID 3: user email */
- $user_string = sprintf(
+ $user_string = sprintf(
+ /* translators: 1: user display name 2: user ID 3: user email */
esc_html__( '%1$s (#%2$s – %3$s)', 'woocommerce' ),
$user->display_name,
absint( $user->ID ),
@@ -43,7 +47,7 @@ if ( ! defined( 'ABSPATH' ) ) {
);
?>
-
+
@@ -91,7 +95,7 @@ if ( ! defined( 'ABSPATH' ) ) {
/* translators: 1: last access date 2: last access time */
$date = sprintf( __( '%1$s at %2$s', 'woocommerce' ), date_i18n( wc_date_format(), strtotime( $key_data['last_access'] ) ), date_i18n( wc_time_format(), strtotime( $key_data['last_access'] ) ) );
- echo apply_filters( 'woocommerce_api_key_last_access_datetime', $date, $key_data['last_access'] );
+ echo esc_html( apply_filters( 'woocommerce_api_key_last_access_datetime', $date, $key_data['last_access'] ) );
} else {
esc_html_e( 'Unknown', 'woocommerce' );
}
@@ -106,7 +110,7 @@ if ( ! defined( 'ABSPATH' ) ) {
diff --git a/includes/admin/settings/views/html-webhooks-edit.php b/includes/admin/settings/views/html-webhooks-edit.php
index 7eda686449e..831bfec2a33 100644
--- a/includes/admin/settings/views/html-webhooks-edit.php
+++ b/includes/admin/settings/views/html-webhooks-edit.php
@@ -136,8 +136,14 @@ if ( ! defined( 'ABSPATH' ) ) {
- get_api_version(), true ); ?>>
- get_api_version(), true ); ?>>
+
+ get_api_version(), true ); ?>>
+
+
+
get_api_version(), true ); ?>>
diff --git a/includes/admin/views/html-admin-page-status-logs.php b/includes/admin/views/html-admin-page-status-logs.php
index 6f501191c00..0f5810e79b4 100644
--- a/includes/admin/views/html-admin-page-status-logs.php
+++ b/includes/admin/views/html-admin-page-status-logs.php
@@ -16,7 +16,7 @@ if ( ! defined( 'ABSPATH' ) ) {
-
+
diff --git a/includes/admin/views/html-notice-wootenberg.php b/includes/admin/views/html-notice-wootenberg.php
index 1740215e047..da53d113e2c 100644
--- a/includes/admin/views/html-notice-wootenberg.php
+++ b/includes/admin/views/html-notice-wootenberg.php
@@ -12,11 +12,11 @@ if ( ! defined( 'ABSPATH' ) ) {
-
+
-
+
-
+
diff --git a/includes/admin/wc-admin-functions.php b/includes/admin/wc-admin-functions.php
index 6bba04d9e20..d56a72829c8 100644
--- a/includes/admin/wc-admin-functions.php
+++ b/includes/admin/wc-admin-functions.php
@@ -208,7 +208,7 @@ function wc_save_order_items( $order_id, $items ) {
$item_data = array();
foreach ( $data_keys as $key => $default ) {
- $item_data[ $key ] = isset( $items[ $key ][ $item_id ] ) ? wp_check_invalid_utf8( wp_unslash( $items[ $key ][ $item_id ] ) ) : $default;
+ $item_data[ $key ] = isset( $items[ $key ][ $item_id ] ) ? wc_check_invalid_utf8( wp_unslash( $items[ $key ][ $item_id ] ) ) : $default;
}
if ( '0' === $item_data['order_item_qty'] ) {
diff --git a/includes/api/class-wc-rest-authentication.php b/includes/api/class-wc-rest-authentication.php
index 52c10611c6f..7e620354e94 100644
--- a/includes/api/class-wc-rest-authentication.php
+++ b/includes/api/class-wc-rest-authentication.php
@@ -39,7 +39,7 @@ class WC_REST_Authentication {
*/
public function __construct() {
add_filter( 'determine_current_user', array( $this, 'authenticate' ), 15 );
- add_filter( 'rest_authentication_errors', array( $this, 'check_authentication_error' ) );
+ add_filter( 'rest_authentication_errors', array( $this, 'check_authentication_error' ), 15 );
add_filter( 'rest_post_dispatch', array( $this, 'send_unauthorized_headers' ), 50 );
add_filter( 'rest_pre_dispatch', array( $this, 'check_user_permissions' ), 10, 3 );
}
@@ -140,15 +140,15 @@ class WC_REST_Authentication {
$consumer_secret = '';
// If the $_GET parameters are present, use those first.
- if ( ! empty( $_GET['consumer_key'] ) && ! empty( $_GET['consumer_secret'] ) ) {
- $consumer_key = $_GET['consumer_key']; // WPCS: sanitization ok.
- $consumer_secret = $_GET['consumer_secret']; // WPCS: sanitization ok.
+ if ( ! empty( $_GET['consumer_key'] ) && ! empty( $_GET['consumer_secret'] ) ) { // WPCS: CSRF ok.
+ $consumer_key = $_GET['consumer_key']; // WPCS: CSRF ok, sanitization ok.
+ $consumer_secret = $_GET['consumer_secret']; // WPCS: CSRF ok, sanitization ok.
}
// If the above is not present, we will do full basic auth.
if ( ! $consumer_key && ! empty( $_SERVER['PHP_AUTH_USER'] ) && ! empty( $_SERVER['PHP_AUTH_PW'] ) ) {
- $consumer_key = $_SERVER['PHP_AUTH_USER']; // WPCS: sanitization ok.
- $consumer_secret = $_SERVER['PHP_AUTH_PW']; // WPCS: sanitization ok.
+ $consumer_key = $_SERVER['PHP_AUTH_USER']; // WPCS: CSRF ok, sanitization ok.
+ $consumer_secret = $_SERVER['PHP_AUTH_PW']; // WPCS: CSRF ok, sanitization ok.
}
// Stop if don't have any key.
@@ -353,7 +353,7 @@ class WC_REST_Authentication {
*/
private function check_oauth_signature( $user, $params ) {
$http_method = isset( $_SERVER['REQUEST_METHOD'] ) ? strtoupper( $_SERVER['REQUEST_METHOD'] ) : ''; // WPCS: sanitization ok.
- $request_path = isset( $_SERVER['REQUEST_URI'] ) ? parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ) : ''; // WPCS: sanitization ok.
+ $request_path = isset( $_SERVER['REQUEST_URI'] ) ? wp_parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ) : ''; // WPCS: sanitization ok.
$wp_base = get_home_url( null, '/', 'relative' );
if ( substr( $request_path, 0, strlen( $wp_base ) ) === $wp_base ) {
$request_path = substr( $request_path, strlen( $wp_base ) );
@@ -468,7 +468,7 @@ class WC_REST_Authentication {
$used_nonces = array();
}
- if ( in_array( $nonce, $used_nonces ) ) {
+ if ( in_array( $nonce, $used_nonces, true ) ) {
return new WP_Error( 'woocommerce_rest_authentication_error', __( 'Invalid nonce - nonce has already been used.', 'woocommerce' ), array( 'status' => 401 ) );
}
@@ -510,7 +510,8 @@ class WC_REST_Authentication {
SELECT key_id, user_id, permissions, consumer_key, consumer_secret, nonces
FROM {$wpdb->prefix}woocommerce_api_keys
WHERE consumer_key = %s
- ", $consumer_key
+ ",
+ $consumer_key
)
);
diff --git a/includes/api/class-wc-rest-coupons-controller.php b/includes/api/class-wc-rest-coupons-controller.php
index 1b8c8aad677..6fc216b11e9 100644
--- a/includes/api/class-wc-rest-coupons-controller.php
+++ b/includes/api/class-wc-rest-coupons-controller.php
@@ -14,529 +14,14 @@ defined( 'ABSPATH' ) || exit;
* REST API Coupons controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_CRUD_Controller
+ * @extends WC_REST_Coupons_V2_Controller
*/
-class WC_REST_Coupons_Controller extends WC_REST_Legacy_Coupons_Controller {
+class WC_REST_Coupons_Controller extends WC_REST_Coupons_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
-
- /**
- * Route base.
- *
- * @var string
- */
- protected $rest_base = 'coupons';
-
- /**
- * Post type.
- *
- * @var string
- */
- protected $post_type = 'shop_coupon';
-
- /**
- * Register the routes for coupons.
- */
- public function register_routes() {
- register_rest_route(
- $this->namespace, '/' . $this->rest_base, array(
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_items' ),
- 'permission_callback' => array( $this, 'get_items_permissions_check' ),
- 'args' => $this->get_collection_params(),
- ),
- array(
- 'methods' => WP_REST_Server::CREATABLE,
- 'callback' => array( $this, 'create_item' ),
- 'permission_callback' => array( $this, 'create_item_permissions_check' ),
- 'args' => array_merge(
- $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), array(
- 'code' => array(
- 'description' => __( 'Coupon code.', 'woocommerce' ),
- 'required' => true,
- 'type' => 'string',
- ),
- )
- ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
-
- register_rest_route(
- $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array(
- 'args' => array(
- 'id' => array(
- 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
- 'type' => 'integer',
- ),
- ),
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_item' ),
- 'permission_callback' => array( $this, 'get_item_permissions_check' ),
- 'args' => array(
- 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
- ),
- ),
- array(
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => array( $this, 'update_item' ),
- 'permission_callback' => array( $this, 'update_item_permissions_check' ),
- 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
- ),
- array(
- 'methods' => WP_REST_Server::DELETABLE,
- 'callback' => array( $this, 'delete_item' ),
- 'permission_callback' => array( $this, 'delete_item_permissions_check' ),
- 'args' => array(
- 'force' => array(
- 'default' => false,
- 'type' => 'boolean',
- 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ),
- ),
- ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
-
- register_rest_route(
- $this->namespace, '/' . $this->rest_base . '/batch', array(
- array(
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => array( $this, 'batch_items' ),
- 'permission_callback' => array( $this, 'batch_items_permissions_check' ),
- 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
- ),
- 'schema' => array( $this, 'get_public_batch_schema' ),
- )
- );
- }
-
- /**
- * Get object.
- *
- * @since 3.0.0
- * @param int $id Object ID.
- * @return WC_Data
- */
- protected function get_object( $id ) {
- return new WC_Coupon( $id );
- }
-
- /**
- * Get formatted item data.
- *
- * @since 3.0.0
- * @param WC_Data $object WC_Data instance.
- * @return array
- */
- protected function get_formatted_item_data( $object ) {
- $data = $object->get_data();
-
- $format_decimal = array( 'amount', 'minimum_amount', 'maximum_amount' );
- $format_date = array( 'date_created', 'date_modified', 'date_expires' );
- $format_null = array( 'usage_limit', 'usage_limit_per_user', 'limit_usage_to_x_items' );
-
- // Format decimal values.
- foreach ( $format_decimal as $key ) {
- $data[ $key ] = wc_format_decimal( $data[ $key ], 2 );
- }
-
- // Format date values.
- foreach ( $format_date as $key ) {
- $datetime = $data[ $key ];
- $data[ $key ] = wc_rest_prepare_date_response( $datetime, false );
- $data[ $key . '_gmt' ] = wc_rest_prepare_date_response( $datetime );
- }
-
- // Format null values.
- foreach ( $format_null as $key ) {
- $data[ $key ] = $data[ $key ] ? $data[ $key ] : null;
- }
-
- return array(
- 'id' => $object->get_id(),
- 'code' => $data['code'],
- 'amount' => $data['amount'],
- 'date_created' => $data['date_created'],
- 'date_created_gmt' => $data['date_created_gmt'],
- 'date_modified' => $data['date_modified'],
- 'date_modified_gmt' => $data['date_modified_gmt'],
- 'discount_type' => $data['discount_type'],
- 'description' => $data['description'],
- 'date_expires' => $data['date_expires'],
- 'date_expires_gmt' => $data['date_expires_gmt'],
- 'usage_count' => $data['usage_count'],
- 'individual_use' => $data['individual_use'],
- 'product_ids' => $data['product_ids'],
- 'excluded_product_ids' => $data['excluded_product_ids'],
- 'usage_limit' => $data['usage_limit'],
- 'usage_limit_per_user' => $data['usage_limit_per_user'],
- 'limit_usage_to_x_items' => $data['limit_usage_to_x_items'],
- 'free_shipping' => $data['free_shipping'],
- 'product_categories' => $data['product_categories'],
- 'excluded_product_categories' => $data['excluded_product_categories'],
- 'exclude_sale_items' => $data['exclude_sale_items'],
- 'minimum_amount' => $data['minimum_amount'],
- 'maximum_amount' => $data['maximum_amount'],
- 'email_restrictions' => $data['email_restrictions'],
- 'used_by' => $data['used_by'],
- 'meta_data' => $data['meta_data'],
- );
- }
-
- /**
- * Prepare a single coupon output for response.
- *
- * @since 3.0.0
- * @param WC_Data $object Object data.
- * @param WP_REST_Request $request Request object.
- * @return WP_REST_Response
- */
- public function prepare_object_for_response( $object, $request ) {
- $data = $this->get_formatted_item_data( $object );
- $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
- $data = $this->add_additional_fields_to_object( $data, $request );
- $data = $this->filter_response_by_context( $data, $context );
- $response = rest_ensure_response( $data );
- $response->add_links( $this->prepare_links( $object, $request ) );
-
- /**
- * Filter the data for a response.
- *
- * The dynamic portion of the hook name, $this->post_type,
- * refers to object type being prepared for the response.
- *
- * @param WP_REST_Response $response The response object.
- * @param WC_Data $object Object data.
- * @param WP_REST_Request $request Request object.
- */
- return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request );
- }
-
- /**
- * Prepare objects query.
- *
- * @since 3.0.0
- * @param WP_REST_Request $request Full details about the request.
- * @return array
- */
- protected function prepare_objects_query( $request ) {
- $args = parent::prepare_objects_query( $request );
-
- if ( ! empty( $request['code'] ) ) {
- $id = wc_get_coupon_id_by_code( $request['code'] );
- $args['post__in'] = array( $id );
- }
-
- // Get only ids.
- $args['fields'] = 'ids';
-
- return $args;
- }
-
- /**
- * Only return writable props from schema.
- *
- * @param array $schema Schema.
- * @return bool
- */
- protected function filter_writable_props( $schema ) {
- return empty( $schema['readonly'] );
- }
-
- /**
- * Prepare a single coupon for create or update.
- *
- * @param WP_REST_Request $request Request object.
- * @param bool $creating If is creating a new object.
- * @return WP_Error|WC_Data
- */
- protected function prepare_object_for_database( $request, $creating = false ) {
- $id = isset( $request['id'] ) ? absint( $request['id'] ) : 0;
- $coupon = new WC_Coupon( $id );
- $schema = $this->get_item_schema();
- $data_keys = array_keys( array_filter( $schema['properties'], array( $this, 'filter_writable_props' ) ) );
-
- // Validate required POST fields.
- if ( $creating && empty( $request['code'] ) ) {
- return new WP_Error( 'woocommerce_rest_empty_coupon_code', sprintf( __( 'The coupon code cannot be empty.', 'woocommerce' ), 'code' ), array( 'status' => 400 ) );
- }
-
- // Handle all writable props.
- foreach ( $data_keys as $key ) {
- $value = $request[ $key ];
-
- if ( ! is_null( $value ) ) {
- switch ( $key ) {
- case 'code':
- $coupon_code = wc_format_coupon_code( $value );
- $id = $coupon->get_id() ? $coupon->get_id() : 0;
- $id_from_code = wc_get_coupon_id_by_code( $coupon_code, $id );
-
- if ( $id_from_code ) {
- return new WP_Error( 'woocommerce_rest_coupon_code_already_exists', __( 'The coupon code already exists', 'woocommerce' ), array( 'status' => 400 ) );
- }
-
- $coupon->set_code( $coupon_code );
- break;
- case 'meta_data':
- if ( is_array( $value ) ) {
- foreach ( $value as $meta ) {
- $coupon->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' );
- }
- }
- break;
- case 'description':
- $coupon->set_description( wp_filter_post_kses( $value ) );
- break;
- default:
- if ( is_callable( array( $coupon, "set_{$key}" ) ) ) {
- $coupon->{"set_{$key}"}( $value );
- }
- break;
- }
- }
- }
-
- /**
- * Filters an object before it is inserted via the REST API.
- *
- * The dynamic portion of the hook name, `$this->post_type`,
- * refers to the object type slug.
- *
- * @param WC_Data $coupon Object object.
- * @param WP_REST_Request $request Request object.
- * @param bool $creating If is creating a new object.
- */
- return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $coupon, $request, $creating );
- }
-
- /**
- * Get the Coupon's schema, conforming to JSON Schema.
- *
- * @return array
- */
- public function get_item_schema() {
- $schema = array(
- '$schema' => 'http://json-schema.org/draft-04/schema#',
- 'title' => $this->post_type,
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Unique identifier for the object.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'code' => array(
- 'description' => __( 'Coupon code.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'amount' => array(
- 'description' => __( 'The amount of discount. Should always be numeric, even if setting a percentage.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'date_created' => array(
- 'description' => __( "The date the coupon was created, in the site's timezone.", 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'date_created_gmt' => array(
- 'description' => __( 'The date the coupon was created, as GMT.', 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'date_modified' => array(
- 'description' => __( "The date the coupon was last modified, in the site's timezone.", 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'date_modified_gmt' => array(
- 'description' => __( 'The date the coupon was last modified, as GMT.', 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'discount_type' => array(
- 'description' => __( 'Determines the type of discount that will be applied.', 'woocommerce' ),
- 'type' => 'string',
- 'default' => 'fixed_cart',
- 'enum' => array_keys( wc_get_coupon_types() ),
- 'context' => array( 'view', 'edit' ),
- ),
- 'description' => array(
- 'description' => __( 'Coupon description.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'date_expires' => array(
- 'description' => __( "The date the coupon expires, in the site's timezone.", 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'date_expires_gmt' => array(
- 'description' => __( 'The date the coupon expires, as GMT.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'usage_count' => array(
- 'description' => __( 'Number of times the coupon has been used already.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'individual_use' => array(
- 'description' => __( 'If true, the coupon can only be used individually. Other applied coupons will be removed from the cart.', 'woocommerce' ),
- 'type' => 'boolean',
- 'default' => false,
- 'context' => array( 'view', 'edit' ),
- ),
- 'product_ids' => array(
- 'description' => __( 'List of product IDs the coupon can be used on.', 'woocommerce' ),
- 'type' => 'array',
- 'items' => array(
- 'type' => 'integer',
- ),
- 'context' => array( 'view', 'edit' ),
- ),
- 'excluded_product_ids' => array(
- 'description' => __( 'List of product IDs the coupon cannot be used on.', 'woocommerce' ),
- 'type' => 'array',
- 'items' => array(
- 'type' => 'integer',
- ),
- 'context' => array( 'view', 'edit' ),
- ),
- 'usage_limit' => array(
- 'description' => __( 'How many times the coupon can be used in total.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- ),
- 'usage_limit_per_user' => array(
- 'description' => __( 'How many times the coupon can be used per customer.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- ),
- 'limit_usage_to_x_items' => array(
- 'description' => __( 'Max number of items in the cart the coupon can be applied to.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- ),
- 'free_shipping' => array(
- 'description' => __( 'If true and if the free shipping method requires a coupon, this coupon will enable free shipping.', 'woocommerce' ),
- 'type' => 'boolean',
- 'default' => false,
- 'context' => array( 'view', 'edit' ),
- ),
- 'product_categories' => array(
- 'description' => __( 'List of category IDs the coupon applies to.', 'woocommerce' ),
- 'type' => 'array',
- 'items' => array(
- 'type' => 'integer',
- ),
- 'context' => array( 'view', 'edit' ),
- ),
- 'excluded_product_categories' => array(
- 'description' => __( 'List of category IDs the coupon does not apply to.', 'woocommerce' ),
- 'type' => 'array',
- 'items' => array(
- 'type' => 'integer',
- ),
- 'context' => array( 'view', 'edit' ),
- ),
- 'exclude_sale_items' => array(
- 'description' => __( 'If true, this coupon will not be applied to items that have sale prices.', 'woocommerce' ),
- 'type' => 'boolean',
- 'default' => false,
- 'context' => array( 'view', 'edit' ),
- ),
- 'minimum_amount' => array(
- 'description' => __( 'Minimum order amount that needs to be in the cart before coupon applies.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'maximum_amount' => array(
- 'description' => __( 'Maximum order amount allowed when using the coupon.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'email_restrictions' => array(
- 'description' => __( 'List of email addresses that can use this coupon.', 'woocommerce' ),
- 'type' => 'array',
- 'items' => array(
- 'type' => 'string',
- ),
- 'context' => array( 'view', 'edit' ),
- ),
- 'used_by' => array(
- 'description' => __( 'List of user IDs (or guest email addresses) that have used the coupon.', 'woocommerce' ),
- 'type' => 'array',
- 'items' => array(
- 'type' => 'integer',
- ),
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'meta_data' => array(
- 'description' => __( 'Meta data.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Meta ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'key' => array(
- 'description' => __( 'Meta key.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'value' => array(
- 'description' => __( 'Meta value.', 'woocommerce' ),
- 'type' => 'mixed',
- 'context' => array( 'view', 'edit' ),
- ),
- ),
- ),
- ),
- ),
- );
- return $this->add_additional_fields_schema( $schema );
- }
-
- /**
- * Get the query params for collections of attachments.
- *
- * @return array
- */
- public function get_collection_params() {
- $params = parent::get_collection_params();
-
- $params['code'] = array(
- 'description' => __( 'Limit result set to resources with a specific code.', 'woocommerce' ),
- 'type' => 'string',
- 'sanitize_callback' => 'sanitize_text_field',
- 'validate_callback' => 'rest_validate_request_arg',
- );
-
- return $params;
- }
+ protected $namespace = 'wc/v3';
}
diff --git a/includes/api/class-wc-rest-customer-downloads-controller.php b/includes/api/class-wc-rest-customer-downloads-controller.php
index 3fd52f3827f..3fd89d4a4fb 100644
--- a/includes/api/class-wc-rest-customer-downloads-controller.php
+++ b/includes/api/class-wc-rest-customer-downloads-controller.php
@@ -14,152 +14,14 @@ defined( 'ABSPATH' ) || exit;
* REST API Customers controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Customer_Downloads_V1_Controller
+ * @extends WC_REST_Customer_Downloads_V2_Controller
*/
-class WC_REST_Customer_Downloads_Controller extends WC_REST_Customer_Downloads_V1_Controller {
+class WC_REST_Customer_Downloads_Controller extends WC_REST_Customer_Downloads_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
-
- /**
- * Prepare a single download output for response.
- *
- * @param stdClass $download Download object.
- * @param WP_REST_Request $request Request object.
- * @return WP_REST_Response $response Response data.
- */
- public function prepare_item_for_response( $download, $request ) {
- $data = array(
- 'download_id' => $download->download_id,
- 'download_url' => $download->download_url,
- 'product_id' => $download->product_id,
- 'product_name' => $download->product_name,
- 'download_name' => $download->download_name,
- 'order_id' => $download->order_id,
- 'order_key' => $download->order_key,
- 'downloads_remaining' => '' === $download->downloads_remaining ? 'unlimited' : $download->downloads_remaining,
- 'access_expires' => $download->access_expires ? wc_rest_prepare_date_response( $download->access_expires ) : 'never',
- 'access_expires_gmt' => $download->access_expires ? wc_rest_prepare_date_response( get_gmt_from_date( $download->access_expires ) ) : 'never',
- 'file' => $download->file,
- );
-
- $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
- $data = $this->add_additional_fields_to_object( $data, $request );
- $data = $this->filter_response_by_context( $data, $context );
-
- // Wrap the data in a response object.
- $response = rest_ensure_response( $data );
-
- $response->add_links( $this->prepare_links( $download, $request ) );
-
- /**
- * Filter customer download data returned from the REST API.
- *
- * @param WP_REST_Response $response The response object.
- * @param stdClass $download Download object used to create response.
- * @param WP_REST_Request $request Request object.
- */
- return apply_filters( 'woocommerce_rest_prepare_customer_download', $response, $download, $request );
- }
-
- /**
- * Get the Customer Download's schema, conforming to JSON Schema.
- *
- * @return array
- */
- public function get_item_schema() {
- $schema = array(
- '$schema' => 'http://json-schema.org/draft-04/schema#',
- 'title' => 'customer_download',
- 'type' => 'object',
- 'properties' => array(
- 'download_id' => array(
- 'description' => __( 'Download ID.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'download_url' => array(
- 'description' => __( 'Download file URL.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'product_id' => array(
- 'description' => __( 'Downloadable product ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'product_name' => array(
- 'description' => __( 'Product name.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'download_name' => array(
- 'description' => __( 'Downloadable file name.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'order_id' => array(
- 'description' => __( 'Order ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'order_key' => array(
- 'description' => __( 'Order key.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'downloads_remaining' => array(
- 'description' => __( 'Number of downloads remaining.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'access_expires' => array(
- 'description' => __( "The date when download access expires, in the site's timezone.", 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'access_expires_gmt' => array(
- 'description' => __( 'The date when download access expires, as GMT.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'file' => array(
- 'description' => __( 'File details.', 'woocommerce' ),
- 'type' => 'object',
- 'context' => array( 'view' ),
- 'readonly' => true,
- 'properties' => array(
- 'name' => array(
- 'description' => __( 'File name.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'file' => array(
- 'description' => __( 'File URL.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- ),
- ),
- ),
- );
-
- return $this->add_additional_fields_schema( $schema );
- }
+ protected $namespace = 'wc/v3';
}
diff --git a/includes/api/class-wc-rest-customers-controller.php b/includes/api/class-wc-rest-customers-controller.php
index b75d8e02a82..979a42e9ef0 100644
--- a/includes/api/class-wc-rest-customers-controller.php
+++ b/includes/api/class-wc-rest-customers-controller.php
@@ -14,16 +14,16 @@ defined( 'ABSPATH' ) || exit;
* REST API Customers controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Customers_V1_Controller
+ * @extends WC_REST_Customers_V2_Controller
*/
-class WC_REST_Customers_Controller extends WC_REST_Customers_V1_Controller {
+class WC_REST_Customers_Controller extends WC_REST_Customers_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
+ protected $namespace = 'wc/v3';
/**
* Get formatted item data.
@@ -57,58 +57,11 @@ class WC_REST_Customers_Controller extends WC_REST_Customers_V1_Controller {
'billing' => $data['billing'],
'shipping' => $data['shipping'],
'is_paying_customer' => $data['is_paying_customer'],
- 'orders_count' => $object->get_order_count(),
- 'total_spent' => $object->get_total_spent(),
'avatar_url' => $object->get_avatar_url(),
'meta_data' => $data['meta_data'],
);
}
- /**
- * Prepare a single customer output for response.
- *
- * @param WP_User $user_data User object.
- * @param WP_REST_Request $request Request object.
- * @return WP_REST_Response $response Response data.
- */
- public function prepare_item_for_response( $user_data, $request ) {
- $customer = new WC_Customer( $user_data->ID );
- $data = $this->get_formatted_item_data( $customer );
- $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
- $data = $this->add_additional_fields_to_object( $data, $request );
- $data = $this->filter_response_by_context( $data, $context );
- $response = rest_ensure_response( $data );
- $response->add_links( $this->prepare_links( $user_data ) );
-
- /**
- * Filter customer data returned from the REST API.
- *
- * @param WP_REST_Response $response The response object.
- * @param WP_User $user_data User object used to create response.
- * @param WP_REST_Request $request Request object.
- */
- return apply_filters( 'woocommerce_rest_prepare_customer', $response, $user_data, $request );
- }
-
- /**
- * Update customer meta fields.
- *
- * @param WC_Customer $customer Customer data.
- * @param WP_REST_Request $request Request data.
- */
- protected function update_customer_meta_fields( $customer, $request ) {
- parent::update_customer_meta_fields( $customer, $request );
-
- // Meta data.
- if ( isset( $request['meta_data'] ) ) {
- if ( is_array( $request['meta_data'] ) ) {
- foreach ( $request['meta_data'] as $meta ) {
- $customer->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' );
- }
- }
- }
- }
-
/**
* Get the Customer's schema, conforming to JSON Schema.
*
@@ -312,18 +265,6 @@ class WC_REST_Customers_Controller extends WC_REST_Customers_V1_Controller {
'context' => array( 'view', 'edit' ),
'readonly' => true,
),
- 'orders_count' => array(
- 'description' => __( 'Quantity of orders made by the customer.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'total_spent' => array(
- 'description' => __( 'Total amount spent.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
'avatar_url' => array(
'description' => __( 'Avatar URL.', 'woocommerce' ),
'type' => 'string',
diff --git a/includes/api/class-wc-rest-data-continents-controller.php b/includes/api/class-wc-rest-data-continents-controller.php
new file mode 100644
index 00000000000..56c82fcb2f3
--- /dev/null
+++ b/includes/api/class-wc-rest-data-continents-controller.php
@@ -0,0 +1,357 @@
+namespace, '/' . $this->rest_base, array(
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_items' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array(
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_item' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ 'args' => array(
+ 'continent' => array(
+ 'description' => __( '2 character continent code.', 'woocommerce' ),
+ 'type' => 'string',
+ ),
+ ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ }
+
+ /**
+ * Return the list of countries and states for a given continent.
+ *
+ * @since 3.5.0
+ * @param string $continent_code Continent code.
+ * @param WP_REST_Request $request Request data.
+ * @return array|mixed Response data, ready for insertion into collection data.
+ */
+ public function get_continent( $continent_code = false, $request ) {
+ $continents = WC()->countries->get_continents();
+ $countries = WC()->countries->get_countries();
+ $states = WC()->countries->get_states();
+ $locale_info = include WC()->plugin_path() . '/i18n/locale-info.php';
+ $data = array();
+
+ if ( ! array_key_exists( $continent_code, $continents ) ) {
+ return false;
+ }
+
+ $continent_list = $continents[ $continent_code ];
+
+ $continent = array(
+ 'code' => $continent_code,
+ 'name' => $continent_list['name'],
+ );
+
+ $local_countries = array();
+ foreach ( $continent_list['countries'] as $country_code ) {
+ if ( isset( $countries[ $country_code ] ) ) {
+ $country = array(
+ 'code' => $country_code,
+ 'name' => $countries[ $country_code ],
+ );
+
+ // If we have detailed locale information include that in the response.
+ if ( array_key_exists( $country_code, $locale_info ) ) {
+ // Defensive programming against unexpected changes in locale-info.php.
+ $country_data = wp_parse_args(
+ $locale_info[ $country_code ], array(
+ 'currency_code' => 'USD',
+ 'currency_pos' => 'left',
+ 'decimal_sep' => '.',
+ 'dimension_unit' => 'in',
+ 'num_decimals' => 2,
+ 'thousand_sep' => ',',
+ 'weight_unit' => 'lbs',
+ )
+ );
+
+ $country = array_merge( $country, $country_data );
+ }
+
+ $local_states = array();
+ if ( isset( $states[ $country_code ] ) ) {
+ foreach ( $states[ $country_code ] as $state_code => $state_name ) {
+ $local_states[] = array(
+ 'code' => $state_code,
+ 'name' => $state_name,
+ );
+ }
+ }
+ $country['states'] = $local_states;
+
+ // Allow only desired keys (e.g. filter out tax rates).
+ $allowed = array(
+ 'code',
+ 'currency_code',
+ 'currency_pos',
+ 'decimal_sep',
+ 'dimension_unit',
+ 'name',
+ 'num_decimals',
+ 'states',
+ 'thousand_sep',
+ 'weight_unit',
+ );
+ $country = array_intersect_key( $country, array_flip( $allowed ) );
+
+ $local_countries[] = $country;
+ }
+ }
+
+ $continent['countries'] = $local_countries;
+ return $continent;
+ }
+
+ /**
+ * Return the list of states for all continents.
+ *
+ * @since 3.5.0
+ * @param WP_REST_Request $request Request data.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function get_items( $request ) {
+ $continents = WC()->countries->get_continents();
+ $data = array();
+
+ foreach ( array_keys( $continents ) as $continent_code ) {
+ $continent = $this->get_continent( $continent_code, $request );
+ $response = $this->prepare_item_for_response( $continent, $request );
+ $data[] = $this->prepare_response_for_collection( $response );
+ }
+
+ return rest_ensure_response( $data );
+ }
+
+ /**
+ * Return the list of locations for a given continent.
+ *
+ * @since 3.5.0
+ * @param WP_REST_Request $request Request data.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function get_item( $request ) {
+ $data = $this->get_continent( strtoupper( $request['location'] ), $request );
+ if ( empty( $data ) ) {
+ return new WP_Error( 'woocommerce_rest_data_invalid_location', __( 'There are no locations matching these parameters.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+ return $this->prepare_item_for_response( $data, $request );
+ }
+
+ /**
+ * Prepare the data object for response.
+ *
+ * @since 3.5.0
+ * @param object $item Data object.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response Response data.
+ */
+ public function prepare_item_for_response( $item, $request ) {
+ $data = $this->add_additional_fields_to_object( $item, $request );
+ $data = $this->filter_response_by_context( $data, 'view' );
+ $response = rest_ensure_response( $data );
+
+ $response->add_links( $this->prepare_links( $item ) );
+
+ /**
+ * Filter the location list returned from the API.
+ *
+ * Allows modification of the loction data right before it is returned.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param array $item The original list of continent(s), countries, and states.
+ * @param WP_REST_Request $request Request used to generate the response.
+ */
+ return apply_filters( 'woocommerce_rest_prepare_data_continent', $response, $item, $request );
+ }
+
+ /**
+ * Prepare links for the request.
+ *
+ * @param object $item Data object.
+ * @return array Links for the given continent.
+ */
+ protected function prepare_links( $item ) {
+ $continent_code = strtolower( $item['code'] );
+ $links = array(
+ 'self' => array(
+ 'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $continent_code ) ),
+ ),
+ 'collection' => array(
+ 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
+ ),
+ );
+ return $links;
+ }
+
+ /**
+ * Get the location schema, conforming to JSON Schema.
+ *
+ * @since 3.5.0
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'data_continents',
+ 'type' => 'object',
+ 'properties' => array(
+ 'code' => array(
+ 'type' => 'string',
+ 'description' => __( '2 character continent code.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'name' => array(
+ 'type' => 'string',
+ 'description' => __( 'Full name of continent.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'countries' => array(
+ 'type' => 'array',
+ 'description' => __( 'List of countries on this continent.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ 'items' => array(
+ 'type' => 'object',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ 'properties' => array(
+ 'code' => array(
+ 'type' => 'string',
+ 'description' => __( 'ISO3166 alpha-2 country code.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'currency_code' => array(
+ 'type' => 'string',
+ 'description' => __( 'Default ISO4127 alpha-3 currency code for the country.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'currency_pos' => array(
+ 'type' => 'string',
+ 'description' => __( 'Currency symbol position for this country.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'decimal_sep' => array(
+ 'type' => 'string',
+ 'description' => __( 'Decimal separator for displayed prices for this country.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'dimension_unit' => array(
+ 'type' => 'string',
+ 'description' => __( 'The unit lengths are defined in for this country.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'name' => array(
+ 'type' => 'string',
+ 'description' => __( 'Full name of country.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'num_decimals' => array(
+ 'type' => 'integer',
+ 'description' => __( 'Number of decimal points shown in displayed prices for this country.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'states' => array(
+ 'type' => 'array',
+ 'description' => __( 'List of states in this country.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ 'items' => array(
+ 'type' => 'object',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ 'properties' => array(
+ 'code' => array(
+ 'type' => 'string',
+ 'description' => __( 'State code.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'name' => array(
+ 'type' => 'string',
+ 'description' => __( 'Full name of state.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ ),
+ ),
+ ),
+ 'thousand_sep' => array(
+ 'type' => 'string',
+ 'description' => __( 'Thousands separator for displayed prices in this country.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'weight_unit' => array(
+ 'type' => 'string',
+ 'description' => __( 'The unit weights are defined in for this country.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+}
diff --git a/includes/api/class-wc-rest-data-controller.php b/includes/api/class-wc-rest-data-controller.php
new file mode 100644
index 00000000000..216586510e6
--- /dev/null
+++ b/includes/api/class-wc-rest-data-controller.php
@@ -0,0 +1,184 @@
+namespace, '/' . $this->rest_base, array(
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_items' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ }
+
+ /**
+ * Check whether a given request has permission to read site data.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|boolean
+ */
+ public function get_items_permissions_check( $request ) {
+ if ( ! wc_rest_check_manager_permissions( 'settings', 'read' ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+
+ return true;
+ }
+
+ /**
+ * Check whether a given request has permission to read site settings.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|boolean
+ */
+ public function get_item_permissions_check( $request ) {
+ if ( ! wc_rest_check_manager_permissions( 'settings', 'read' ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+
+ return true;
+ }
+
+ /**
+ * Return the list of data resources.
+ *
+ * @since 3.5.0
+ * @param WP_REST_Request $request Request data.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function get_items( $request ) {
+ $data = array();
+ $resources = array(
+ array(
+ 'slug' => 'continents',
+ 'description' => __( 'List of supported continents, countries, and states.', 'woocommerce' ),
+ ),
+ array(
+ 'slug' => 'countries',
+ 'description' => __( 'List of supported states in a given country.', 'woocommerce' ),
+ ),
+ array(
+ 'slug' => 'currencies',
+ 'description' => __( 'List of supported currencies.', 'woocommerce' ),
+ ),
+ );
+
+ foreach ( $resources as $resource ) {
+ $item = $this->prepare_item_for_response( (object) $resource, $request );
+ $data[] = $this->prepare_response_for_collection( $item );
+ }
+
+ return rest_ensure_response( $data );
+ }
+
+ /**
+ * Prepare a data resource object for serialization.
+ *
+ * @param stdClass $resource Resource data.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response Response data.
+ */
+ public function prepare_item_for_response( $resource, $request ) {
+ $data = array(
+ 'slug' => $resource->slug,
+ 'description' => $resource->description,
+ );
+
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, 'view' );
+
+ // Wrap the data in a response object.
+ $response = rest_ensure_response( $data );
+ $response->add_links( $this->prepare_links( $resource ) );
+
+ return $response;
+ }
+
+ /**
+ * Prepare links for the request.
+ *
+ * @param object $item Data object.
+ * @return array Links for the given country.
+ */
+ protected function prepare_links( $item ) {
+ $links = array(
+ 'self' => array(
+ 'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $item->slug ) ),
+ ),
+ 'collection' => array(
+ 'href' => rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ),
+ ),
+ );
+
+ return $links;
+ }
+
+ /**
+ * Get the data index schema, conforming to JSON Schema.
+ *
+ * @since 3.5.0
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'data_index',
+ 'type' => 'object',
+ 'properties' => array(
+ 'slug' => array(
+ 'description' => __( 'Data resource ID.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'description' => array(
+ 'description' => __( 'Data resource description.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+}
diff --git a/includes/api/class-wc-rest-data-countries-controller.php b/includes/api/class-wc-rest-data-countries-controller.php
new file mode 100644
index 00000000000..3bc7cb65762
--- /dev/null
+++ b/includes/api/class-wc-rest-data-countries-controller.php
@@ -0,0 +1,240 @@
+namespace, '/' . $this->rest_base, array(
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_items' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array(
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_item' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ 'args' => array(
+ 'location' => array(
+ 'description' => __( 'ISO3166 alpha-2 country code.', 'woocommerce' ),
+ 'type' => 'string',
+ ),
+ ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ }
+
+ /**
+ * Get a list of countries and states.
+ *
+ * @param string $country_code Country code.
+ * @param WP_REST_Request $request Request data.
+ * @return array|mixed Response data, ready for insertion into collection data.
+ */
+ public function get_country( $country_code = false, $request ) {
+ $countries = WC()->countries->get_countries();
+ $states = WC()->countries->get_states();
+ $data = array();
+
+ if ( ! array_key_exists( $country_code, $countries ) ) {
+ return false;
+ }
+
+ $country = array(
+ 'code' => $country_code,
+ 'name' => $countries[ $country_code ],
+ );
+
+ $local_states = array();
+ if ( isset( $states[ $country_code ] ) ) {
+ foreach ( $states[ $country_code ] as $state_code => $state_name ) {
+ $local_states[] = array(
+ 'code' => $state_code,
+ 'name' => $state_name,
+ );
+ }
+ }
+ $country['states'] = $local_states;
+ return $country;
+ }
+
+ /**
+ * Return the list of states for all countries.
+ *
+ * @since 3.5.0
+ * @param WP_REST_Request $request Request data.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function get_items( $request ) {
+ $countries = WC()->countries->get_countries();
+ $data = array();
+
+ foreach ( array_keys( $countries ) as $country_code ) {
+ $country = $this->get_country( $country_code, $request );
+ $response = $this->prepare_item_for_response( $country, $request );
+ $data[] = $this->prepare_response_for_collection( $response );
+ }
+
+ return rest_ensure_response( $data );
+ }
+
+ /**
+ * Return the list of states for a given country.
+ *
+ * @since 3.5.0
+ * @param WP_REST_Request $request Request data.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function get_item( $request ) {
+ $data = $this->get_country( strtoupper( $request['location'] ), $request );
+ if ( empty( $data ) ) {
+ return new WP_Error( 'woocommerce_rest_data_invalid_location', __( 'There are no locations matching these parameters.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+ return $this->prepare_item_for_response( $data, $request );
+ }
+
+ /**
+ * Prepare the data object for response.
+ *
+ * @since 3.5.0
+ * @param object $item Data object.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response Response data.
+ */
+ public function prepare_item_for_response( $item, $request ) {
+ $data = $this->add_additional_fields_to_object( $item, $request );
+ $data = $this->filter_response_by_context( $data, 'view' );
+ $response = rest_ensure_response( $data );
+
+ $response->add_links( $this->prepare_links( $item ) );
+
+ /**
+ * Filter the states list for a country returned from the API.
+ *
+ * Allows modification of the loction data right before it is returned.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param array $data The original country's states list.
+ * @param WP_REST_Request $request Request used to generate the response.
+ */
+ return apply_filters( 'woocommerce_rest_prepare_data_country', $response, $item, $request );
+ }
+
+ /**
+ * Prepare links for the request.
+ *
+ * @param object $item Data object.
+ * @return array Links for the given country.
+ */
+ protected function prepare_links( $item ) {
+ $country_code = strtolower( $item['code'] );
+ $links = array(
+ 'self' => array(
+ 'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $country_code ) ),
+ ),
+ 'collection' => array(
+ 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
+ ),
+ );
+
+ return $links;
+ }
+
+
+ /**
+ * Get the location schema, conforming to JSON Schema.
+ *
+ * @since 3.5.0
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'data_countries',
+ 'type' => 'object',
+ 'properties' => array(
+ 'code' => array(
+ 'type' => 'string',
+ 'description' => __( 'ISO3166 alpha-2 country code.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'name' => array(
+ 'type' => 'string',
+ 'description' => __( 'Full name of country.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'states' => array(
+ 'type' => 'array',
+ 'description' => __( 'List of states in this country.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ 'items' => array(
+ 'type' => 'object',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ 'properties' => array(
+ 'code' => array(
+ 'type' => 'string',
+ 'description' => __( 'State code.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'name' => array(
+ 'type' => 'string',
+ 'description' => __( 'Full name of state.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+}
diff --git a/includes/api/class-wc-rest-data-currencies-controller.php b/includes/api/class-wc-rest-data-currencies-controller.php
new file mode 100644
index 00000000000..1b589c297fa
--- /dev/null
+++ b/includes/api/class-wc-rest-data-currencies-controller.php
@@ -0,0 +1,221 @@
+namespace, '/' . $this->rest_base, array(
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_items' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/current', array(
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_current_item' ),
+ 'permission_callback' => array( $this, 'get_item_permissions_check' ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/(?P[\w-]{3})', array(
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_item' ),
+ 'permission_callback' => array( $this, 'get_item_permissions_check' ),
+ 'args' => array(
+ 'location' => array(
+ 'description' => __( 'ISO4217 currency code.', 'woocommerce' ),
+ 'type' => 'string',
+ ),
+ ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ }
+
+ /**
+ * Get currency information.
+ *
+ * @param string $code Currency code.
+ * @param WP_REST_Request $request Request data.
+ * @return array|mixed Response data, ready for insertion into collection data.
+ */
+ public function get_currency( $code = false, $request ) {
+ $currencies = get_woocommerce_currencies();
+ $data = array();
+
+ if ( ! array_key_exists( $code, $currencies ) ) {
+ return false;
+ }
+
+ $currency = array(
+ 'code' => $code,
+ 'name' => $currencies[ $code ],
+ 'symbol' => get_woocommerce_currency_symbol( $code ),
+ );
+
+ return $currency;
+ }
+
+ /**
+ * Return the list of currencies.
+ *
+ * @param WP_REST_Request $request Request data.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function get_items( $request ) {
+ $currencies = get_woocommerce_currencies();
+ foreach ( array_keys( $currencies ) as $code ) {
+ $currency = $this->get_currency( $code, $request );
+ $response = $this->prepare_item_for_response( $currency, $request );
+ $data[] = $this->prepare_response_for_collection( $response );
+ }
+
+ return rest_ensure_response( $data );
+ }
+
+ /**
+ * Return information for a specific currency.
+ *
+ * @param WP_REST_Request $request Request data.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function get_item( $request ) {
+ $data = $this->get_currency( strtoupper( $request['currency'] ), $request );
+ if ( empty( $data ) ) {
+ return new WP_Error( 'woocommerce_rest_data_invalid_currency', __( 'There are no currencies matching these parameters.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+ return $this->prepare_item_for_response( $data, $request );
+ }
+
+ /**
+ * Return information for the current site currency.
+ *
+ * @param WP_REST_Request $request Request data.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function get_current_item( $request ) {
+ $currency = get_option( 'woocommerce_currency' );
+ return $this->prepare_item_for_response( $this->get_currency( $currency, $request ), $request );
+ }
+
+ /**
+ * Prepare the data object for response.
+ *
+ * @param object $item Data object.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response Response data.
+ */
+ public function prepare_item_for_response( $item, $request ) {
+ $data = $this->add_additional_fields_to_object( $item, $request );
+ $data = $this->filter_response_by_context( $data, 'view' );
+ $response = rest_ensure_response( $data );
+
+ $response->add_links( $this->prepare_links( $item ) );
+
+ /**
+ * Filter currency returned from the API.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param array $item Currency data.
+ * @param WP_REST_Request $request Request used to generate the response.
+ */
+ return apply_filters( 'woocommerce_rest_prepare_data_currency', $response, $item, $request );
+ }
+
+ /**
+ * Prepare links for the request.
+ *
+ * @param object $item Data object.
+ * @return array Links for the given currency.
+ */
+ protected function prepare_links( $item ) {
+ $code = strtoupper( $item['code'] );
+ $links = array(
+ 'self' => array(
+ 'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $code ) ),
+ ),
+ 'collection' => array(
+ 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
+ ),
+ );
+
+ return $links;
+ }
+
+
+ /**
+ * Get the currency schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'data_currencies',
+ 'type' => 'object',
+ 'properties' => array(
+ 'code' => array(
+ 'type' => 'string',
+ 'description' => __( 'ISO4217 currency code.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'name' => array(
+ 'type' => 'string',
+ 'description' => __( 'Full name of currency.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'symbol' => array(
+ 'type' => 'string',
+ 'description' => __( 'Currency symbol.', 'woocommerce' ),
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+}
diff --git a/includes/api/class-wc-rest-network-orders-controller.php b/includes/api/class-wc-rest-network-orders-controller.php
index 00c7ed2366a..070f95b0555 100644
--- a/includes/api/class-wc-rest-network-orders-controller.php
+++ b/includes/api/class-wc-rest-network-orders-controller.php
@@ -4,8 +4,8 @@
*
* Handles requests to the /orders/network endpoint
*
- * @package WooCommerce/API
- * @since 3.4.0
+ * @package WooCommerce/API
+ * @since 3.4.0
*/
defined( 'ABSPATH' ) || exit;
@@ -14,139 +14,14 @@ defined( 'ABSPATH' ) || exit;
* REST API Network Orders controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Orders_Controller
+ * @extends WC_REST_Network_Orders_V2_Controller
*/
-class WC_REST_Network_Orders_Controller extends WC_REST_Orders_Controller {
+class WC_REST_Network_Orders_Controller extends WC_REST_Network_Orders_V2_Controller {
/**
- * Register the routes for network orders.
+ * Endpoint namespace.
+ *
+ * @var string
*/
- public function register_routes() {
- if ( is_multisite() ) {
- register_rest_route(
- $this->namespace, '/' . $this->rest_base . '/network', array(
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'network_orders' ),
- 'permission_callback' => array( $this, 'network_orders_permissions_check' ),
- 'args' => $this->get_collection_params(),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
- }
- }
-
- /**
- * Retrieves the item's schema for display / public consumption purposes.
- *
- * @access public
- *
- * @return array Public item schema data.
- */
- public function get_public_item_schema() {
- $schema = parent::get_public_item_schema();
-
- $schema['properties']['blog'] = array(
- 'description' => __( 'Blog id of the record on the multisite.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view' ),
- 'readonly' => true,
- );
- $schema['properties']['edit_url'] = array(
- 'description' => __( 'URL to edit the order', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- );
- $schema['properties']['customer'][] = array(
- 'description' => __( 'Name of the customer for the order', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- );
- $schema['properties']['status_name'][] = array(
- 'description' => __( 'Order Status', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- );
- $schema['properties']['formatted_total'][] = array(
- 'description' => __( 'Order total formatted for locale', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- );
-
- return $schema;
- }
-
- /**
- * Does a permissions check for the proper requested blog
- *
- * @param WP_REST_Request $request Full details about the request.
- *
- * @return bool $permission
- */
- public function network_orders_permissions_check( $request ) {
- $blog_id = $request->get_param( 'blog_id' );
- $blog_id = ! empty( $blog_id ) ? $blog_id : get_current_blog_id();
-
- switch_to_blog( $blog_id );
-
- $permission = $this->get_items_permissions_check( $request );
-
- restore_current_blog();
-
- return $permission;
- }
-
- /**
- * Get a collection of orders from the requested blog id
- *
- * @param WP_REST_Request $request Full details about the request.
- *
- * @return WP_REST_Response
- */
- public function network_orders( $request ) {
- $blog_id = $request->get_param( 'blog_id' );
- $blog_id = ! empty( $blog_id ) ? $blog_id : get_current_blog_id();
-
- switch_to_blog( $blog_id );
-
- add_filter( 'woocommerce_rest_orders_prepare_object_query', array( $this, 'network_orders_filter_args' ) );
- $items = $this->get_items( $request );
- remove_filter( 'woocommerce_rest_orders_prepare_object_query', array( $this, 'network_orders_filter_args' ) );
-
- foreach ( $items->data as &$current_order ) {
- $order = wc_get_order( $current_order['id'] );
-
- $current_order['blog'] = get_blog_details( get_current_blog_id() );
- $current_order['edit_url'] = get_admin_url( $blog_id, 'post.php?post=' . absint( $order->get_id() ) . '&action=edit' );
- /* translators: 1: first name 2: last name */
- $current_order['customer'] = trim( sprintf( _x( '%1$s %2$s', 'full name', 'woocommerce' ), $order->get_billing_first_name(), $order->get_billing_last_name() ) );
- $current_order['status_name'] = wc_get_order_status_name( $order->get_status() );
- $current_order['formatted_total'] = $order->get_formatted_order_total();
- }
-
- restore_current_blog();
-
- return $items;
- }
-
- /**
- * Filters the post statuses to on hold and processing for the network order query.
- *
- * @param array $args Query args.
- *
- * @return array
- */
- public function network_orders_filter_args( $args ) {
- $args['post_status'] = array(
- 'wc-on-hold',
- 'wc-processing',
- );
-
- return $args;
- }
+ protected $namespace = 'wc/v3';
}
diff --git a/includes/api/class-wc-rest-order-notes-controller.php b/includes/api/class-wc-rest-order-notes-controller.php
index 870c4e17f19..3a50006586e 100644
--- a/includes/api/class-wc-rest-order-notes-controller.php
+++ b/includes/api/class-wc-rest-order-notes-controller.php
@@ -14,81 +14,28 @@ defined( 'ABSPATH' ) || exit;
* REST API Order Notes controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_ControllerWC_REST_Order_Notes_V1_Controller
+ * @extends WC_REST_Order_Notes_V2_Controller
*/
-class WC_REST_Order_Notes_Controller extends WC_REST_Order_Notes_V1_Controller {
+class WC_REST_Order_Notes_Controller extends WC_REST_Order_Notes_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
-
- /**
- * Get order notes from an order.
- *
- * @param WP_REST_Request $request Request data.
- *
- * @return array|WP_Error
- */
- public function get_items( $request ) {
- $order = wc_get_order( (int) $request['order_id'] );
-
- if ( ! $order || $this->post_type !== $order->get_type() ) {
- return new WP_Error( "woocommerce_rest_{$this->post_type}_invalid_id", __( 'Invalid order ID.', 'woocommerce' ), array( 'status' => 404 ) );
- }
-
- $args = array(
- 'post_id' => $order->get_id(),
- 'approve' => 'approve',
- 'type' => 'order_note',
- );
-
- // Allow filter by order note type.
- if ( 'customer' === $request['type'] ) {
- $args['meta_query'] = array( // WPCS: slow query ok.
- array(
- 'key' => 'is_customer_note',
- 'value' => 1,
- 'compare' => '=',
- ),
- );
- } elseif ( 'internal' === $request['type'] ) {
- $args['meta_query'] = array( // WPCS: slow query ok.
- array(
- 'key' => 'is_customer_note',
- 'compare' => 'NOT EXISTS',
- ),
- );
- }
-
- remove_filter( 'comments_clauses', array( 'WC_Comments', 'exclude_order_comments' ), 10, 1 );
-
- $notes = get_comments( $args );
-
- add_filter( 'comments_clauses', array( 'WC_Comments', 'exclude_order_comments' ), 10, 1 );
-
- $data = array();
- foreach ( $notes as $note ) {
- $order_note = $this->prepare_item_for_response( $note, $request );
- $order_note = $this->prepare_response_for_collection( $order_note );
- $data[] = $order_note;
- }
-
- return rest_ensure_response( $data );
- }
+ protected $namespace = 'wc/v3';
/**
* Prepare a single order note output for response.
*
- * @param WP_Comment $note Order note object.
+ * @param WP_Comment $note Order note object.
* @param WP_REST_Request $request Request object.
* @return WP_REST_Response $response Response data.
*/
public function prepare_item_for_response( $note, $request ) {
$data = array(
'id' => (int) $note->comment_ID,
+ 'author' => __( 'WooCommerce', 'woocommerce' ) === $note->comment_author ? 'system' : $note->comment_author,
'date_created' => wc_rest_prepare_date_response( $note->comment_date ),
'date_created_gmt' => wc_rest_prepare_date_response( $note->comment_date_gmt ),
'note' => $note->comment_content,
@@ -114,6 +61,52 @@ class WC_REST_Order_Notes_Controller extends WC_REST_Order_Notes_V1_Controller {
return apply_filters( 'woocommerce_rest_prepare_order_note', $response, $note, $request );
}
+ /**
+ * Create a single order note.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function create_item( $request ) {
+ if ( ! empty( $request['id'] ) ) {
+ /* translators: %s: post type */
+ return new WP_Error( "woocommerce_rest_{$this->post_type}_exists", sprintf( __( 'Cannot create existing %s.', 'woocommerce' ), $this->post_type ), array( 'status' => 400 ) );
+ }
+
+ $order = wc_get_order( (int) $request['order_id'] );
+
+ if ( ! $order || $this->post_type !== $order->get_type() ) {
+ return new WP_Error( 'woocommerce_rest_order_invalid_id', __( 'Invalid order ID.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+
+ // Create the note.
+ $note_id = $order->add_order_note( $request['note'], $request['customer_note'], $request['added_by_user'] );
+
+ if ( ! $note_id ) {
+ return new WP_Error( 'woocommerce_api_cannot_create_order_note', __( 'Cannot create order note, please try again.', 'woocommerce' ), array( 'status' => 500 ) );
+ }
+
+ $note = get_comment( $note_id );
+ $this->update_additional_fields_for_object( $note, $request );
+
+ /**
+ * Fires after a order note is created or updated via the REST API.
+ *
+ * @param WP_Comment $note New order note object.
+ * @param WP_REST_Request $request Request object.
+ * @param boolean $creating True when creating item, false when updating.
+ */
+ do_action( 'woocommerce_rest_insert_order_note', $note, $request, true );
+
+ $request->set_param( 'context', 'edit' );
+ $response = $this->prepare_item_for_response( $note, $request );
+ $response = rest_ensure_response( $response );
+ $response->set_status( 201 );
+ $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, str_replace( '(?P[\d]+)', $order->get_id(), $this->rest_base ), $note_id ) ) );
+
+ return $response;
+ }
+
/**
* Get the Order Notes schema, conforming to JSON Schema.
*
@@ -131,6 +124,12 @@ class WC_REST_Order_Notes_Controller extends WC_REST_Order_Notes_V1_Controller {
'context' => array( 'view', 'edit' ),
'readonly' => true,
),
+ 'author' => array(
+ 'description' => __( 'Order note author.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
'date_created' => array(
'description' => __( "The date the order note was created, in the site's timezone.", 'woocommerce' ),
'type' => 'date-time',
@@ -154,29 +153,15 @@ class WC_REST_Order_Notes_Controller extends WC_REST_Order_Notes_V1_Controller {
'default' => false,
'context' => array( 'view', 'edit' ),
),
+ 'added_by_user' => array(
+ 'description' => __( 'If true, this note will be attributed to the current user. If false, the note will be attributed to the system.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'default' => false,
+ 'context' => array( 'edit' ),
+ ),
),
);
return $this->add_additional_fields_schema( $schema );
}
-
- /**
- * Get the query params for collections.
- *
- * @return array
- */
- public function get_collection_params() {
- $params = array();
- $params['context'] = $this->get_context_param( array( 'default' => 'view' ) );
- $params['type'] = array(
- 'default' => 'any',
- 'description' => __( 'Limit result to customers or internal notes.', 'woocommerce' ),
- 'type' => 'string',
- 'enum' => array( 'any', 'customer', 'internal' ),
- 'sanitize_callback' => 'sanitize_key',
- 'validate_callback' => 'rest_validate_request_arg',
- );
-
- return $params;
- }
}
diff --git a/includes/api/class-wc-rest-order-refunds-controller.php b/includes/api/class-wc-rest-order-refunds-controller.php
index 1df6b936087..0834a2b9f04 100644
--- a/includes/api/class-wc-rest-order-refunds-controller.php
+++ b/includes/api/class-wc-rest-order-refunds-controller.php
@@ -14,249 +14,16 @@ defined( 'ABSPATH' ) || exit;
* REST API Order Refunds controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Orders_Controller
+ * @extends WC_REST_Order_Refunds_V2_Controller
*/
-class WC_REST_Order_Refunds_Controller extends WC_REST_Orders_Controller {
+class WC_REST_Order_Refunds_Controller extends WC_REST_Order_Refunds_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
-
- /**
- * Route base.
- *
- * @var string
- */
- protected $rest_base = 'orders/(?P[\d]+)/refunds';
-
- /**
- * Post type.
- *
- * @var string
- */
- protected $post_type = 'shop_order_refund';
-
- /**
- * Stores the request.
- *
- * @var array
- */
- protected $request = array();
-
- /**
- * Order refunds actions.
- */
- public function __construct() {
- add_filter( "woocommerce_rest_{$this->post_type}_object_trashable", '__return_false' );
- }
-
- /**
- * Register the routes for order refunds.
- */
- public function register_routes() {
- register_rest_route(
- $this->namespace, '/' . $this->rest_base, array(
- 'args' => array(
- 'order_id' => array(
- 'description' => __( 'The order ID.', 'woocommerce' ),
- 'type' => 'integer',
- ),
- ),
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_items' ),
- 'permission_callback' => array( $this, 'get_items_permissions_check' ),
- 'args' => $this->get_collection_params(),
- ),
- array(
- 'methods' => WP_REST_Server::CREATABLE,
- 'callback' => array( $this, 'create_item' ),
- 'permission_callback' => array( $this, 'create_item_permissions_check' ),
- 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
-
- register_rest_route(
- $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array(
- 'args' => array(
- 'order_id' => array(
- 'description' => __( 'The order ID.', 'woocommerce' ),
- 'type' => 'integer',
- ),
- 'id' => array(
- 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
- 'type' => 'integer',
- ),
- ),
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_item' ),
- 'permission_callback' => array( $this, 'get_item_permissions_check' ),
- 'args' => array(
- 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
- ),
- ),
- array(
- 'methods' => WP_REST_Server::DELETABLE,
- 'callback' => array( $this, 'delete_item' ),
- 'permission_callback' => array( $this, 'delete_item_permissions_check' ),
- 'args' => array(
- 'force' => array(
- 'default' => true,
- 'type' => 'boolean',
- 'description' => __( 'Required to be true, as resource does not support trashing.', 'woocommerce' ),
- ),
- ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
- }
-
- /**
- * Get object.
- *
- * @since 3.0.0
- * @param int $id Object ID.
- * @return WC_Data
- */
- protected function get_object( $id ) {
- return wc_get_order( $id );
- }
-
- /**
- * Get formatted item data.
- *
- * @since 3.0.0
- * @param WC_Data $object WC_Data instance.
- * @return array
- */
- protected function get_formatted_item_data( $object ) {
- $data = $object->get_data();
- $format_decimal = array( 'amount' );
- $format_date = array( 'date_created' );
- $format_line_items = array( 'line_items' );
-
- // Format decimal values.
- foreach ( $format_decimal as $key ) {
- $data[ $key ] = wc_format_decimal( $data[ $key ], $this->request['dp'] );
- }
-
- // Format date values.
- foreach ( $format_date as $key ) {
- $datetime = $data[ $key ];
- $data[ $key ] = wc_rest_prepare_date_response( $datetime, false );
- $data[ $key . '_gmt' ] = wc_rest_prepare_date_response( $datetime );
- }
-
- // Format line items.
- foreach ( $format_line_items as $key ) {
- $data[ $key ] = array_values( array_map( array( $this, 'get_order_item_data' ), $data[ $key ] ) );
- }
-
- return array(
- 'id' => $object->get_id(),
- 'date_created' => $data['date_created'],
- 'date_created_gmt' => $data['date_created_gmt'],
- 'amount' => $data['amount'],
- 'reason' => $data['reason'],
- 'refunded_by' => $data['refunded_by'],
- 'refunded_payment' => $data['refunded_payment'],
- 'meta_data' => $data['meta_data'],
- 'line_items' => $data['line_items'],
- );
- }
-
- /**
- * Prepare a single order output for response.
- *
- * @since 3.0.0
- *
- * @param WC_Data $object Object data.
- * @param WP_REST_Request $request Request object.
- *
- * @return WP_Error|WP_REST_Response
- */
- public function prepare_object_for_response( $object, $request ) {
- $this->request = $request;
- $this->request['dp'] = is_null( $this->request['dp'] ) ? wc_get_price_decimals() : absint( $this->request['dp'] );
- $order = wc_get_order( (int) $request['order_id'] );
-
- if ( ! $order ) {
- return new WP_Error( 'woocommerce_rest_invalid_order_id', __( 'Invalid order ID.', 'woocommerce' ), 404 );
- }
-
- if ( ! $object || $object->get_parent_id() !== $order->get_id() ) {
- return new WP_Error( 'woocommerce_rest_invalid_order_refund_id', __( 'Invalid order refund ID.', 'woocommerce' ), 404 );
- }
-
- $data = $this->get_formatted_item_data( $object );
- $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
- $data = $this->add_additional_fields_to_object( $data, $request );
- $data = $this->filter_response_by_context( $data, $context );
-
- // Wrap the data in a response object.
- $response = rest_ensure_response( $data );
-
- $response->add_links( $this->prepare_links( $object, $request ) );
-
- /**
- * Filter the data for a response.
- *
- * The dynamic portion of the hook name, $this->post_type,
- * refers to object type being prepared for the response.
- *
- * @param WP_REST_Response $response The response object.
- * @param WC_Data $object Object data.
- * @param WP_REST_Request $request Request object.
- */
- return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request );
- }
-
- /**
- * Prepare links for the request.
- *
- * @param WC_Data $object Object data.
- * @param WP_REST_Request $request Request object.
- * @return array Links for the given post.
- */
- protected function prepare_links( $object, $request ) {
- $base = str_replace( '(?P[\d]+)', $object->get_parent_id(), $this->rest_base );
- $links = array(
- 'self' => array(
- 'href' => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $base, $object->get_id() ) ),
- ),
- 'collection' => array(
- 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $base ) ),
- ),
- 'up' => array(
- 'href' => rest_url( sprintf( '/%s/orders/%d', $this->namespace, $object->get_parent_id() ) ),
- ),
- );
-
- return $links;
- }
-
- /**
- * Prepare objects query.
- *
- * @since 3.0.0
- * @param WP_REST_Request $request Full details about the request.
- * @return array
- */
- protected function prepare_objects_query( $request ) {
- $args = parent::prepare_objects_query( $request );
-
- $args['post_status'] = array_keys( wc_get_order_statuses() );
- $args['post_parent__in'] = array( absint( $request['order_id'] ) );
-
- return $args;
- }
+ protected $namespace = 'wc/v3';
/**
* Prepares one object for create or update operation.
@@ -283,6 +50,7 @@ class WC_REST_Order_Refunds_Controller extends WC_REST_Orders_Controller {
'order_id' => $order->get_id(),
'amount' => $request['amount'],
'reason' => empty( $request['reason'] ) ? null : $request['reason'],
+ 'line_items' => empty( $request['line_items'] ) ? array() : $request['line_items'],
'refund_payment' => is_bool( $request['api_refund'] ) ? $request['api_refund'] : true,
'restock_items' => true,
)
@@ -315,269 +83,4 @@ class WC_REST_Order_Refunds_Controller extends WC_REST_Orders_Controller {
*/
return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $refund, $request, $creating );
}
-
- /**
- * Save an object data.
- *
- * @since 3.0.0
- * @param WP_REST_Request $request Full details about the request.
- * @param bool $creating If is creating a new object.
- * @return WC_Data|WP_Error
- */
- protected function save_object( $request, $creating = false ) {
- try {
- $object = $this->prepare_object_for_database( $request, $creating );
-
- if ( is_wp_error( $object ) ) {
- return $object;
- }
-
- return $this->get_object( $object->get_id() );
- } catch ( WC_Data_Exception $e ) {
- return new WP_Error( $e->getErrorCode(), $e->getMessage(), $e->getErrorData() );
- } catch ( WC_REST_Exception $e ) {
- return new WP_Error( $e->getErrorCode(), $e->getMessage(), array( 'status' => $e->getCode() ) );
- }
- }
-
- /**
- * Get the Order's schema, conforming to JSON Schema.
- *
- * @return array
- */
- public function get_item_schema() {
- $schema = array(
- '$schema' => 'http://json-schema.org/draft-04/schema#',
- 'title' => $this->post_type,
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'date_created' => array(
- 'description' => __( "The date the order refund was created, in the site's timezone.", 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'date_created_gmt' => array(
- 'description' => __( 'The date the order refund was created, as GMT.', 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'amount' => array(
- 'description' => __( 'Refund amount.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'reason' => array(
- 'description' => __( 'Reason for refund.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'refunded_by' => array(
- 'description' => __( 'User ID of user who created the refund.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- ),
- 'refunded_payment' => array(
- 'description' => __( 'If the payment was refunded via the API.', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- ),
- 'meta_data' => array(
- 'description' => __( 'Meta data.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Meta ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'key' => array(
- 'description' => __( 'Meta key.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'value' => array(
- 'description' => __( 'Meta value.', 'woocommerce' ),
- 'type' => 'mixed',
- 'context' => array( 'view', 'edit' ),
- ),
- ),
- ),
- ),
- 'line_items' => array(
- 'description' => __( 'Line items data.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Item ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'name' => array(
- 'description' => __( 'Product name.', 'woocommerce' ),
- 'type' => 'mixed',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'product_id' => array(
- 'description' => __( 'Product ID.', 'woocommerce' ),
- 'type' => 'mixed',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'variation_id' => array(
- 'description' => __( 'Variation ID, if applicable.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'quantity' => array(
- 'description' => __( 'Quantity ordered.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'tax_class' => array(
- 'description' => __( 'Tax class of product.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'subtotal' => array(
- 'description' => __( 'Line subtotal (before discounts).', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'subtotal_tax' => array(
- 'description' => __( 'Line subtotal tax (before discounts).', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'total' => array(
- 'description' => __( 'Line total (after discounts).', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'total_tax' => array(
- 'description' => __( 'Line total tax (after discounts).', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'taxes' => array(
- 'description' => __( 'Line taxes.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Tax rate ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'total' => array(
- 'description' => __( 'Tax total.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'subtotal' => array(
- 'description' => __( 'Tax subtotal.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- ),
- ),
- ),
- 'meta_data' => array(
- 'description' => __( 'Meta data.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Meta ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'key' => array(
- 'description' => __( 'Meta key.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'value' => array(
- 'description' => __( 'Meta value.', 'woocommerce' ),
- 'type' => 'mixed',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- ),
- ),
- ),
- 'sku' => array(
- 'description' => __( 'Product SKU.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'price' => array(
- 'description' => __( 'Product price.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- ),
- ),
- ),
- 'api_refund' => array(
- 'description' => __( 'When true, the payment gateway API is used to generate the refund.', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'edit' ),
- 'default' => true,
- ),
- ),
- );
-
- return $this->add_additional_fields_schema( $schema );
- }
-
- /**
- * Get the query params for collections.
- *
- * @return array
- */
- public function get_collection_params() {
- $params = parent::get_collection_params();
-
- unset( $params['status'], $params['customer'], $params['product'] );
-
- return $params;
- }
}
diff --git a/includes/api/class-wc-rest-orders-controller.php b/includes/api/class-wc-rest-orders-controller.php
index c9121bb4465..72b7d0b7418 100644
--- a/includes/api/class-wc-rest-orders-controller.php
+++ b/includes/api/class-wc-rest-orders-controller.php
@@ -14,428 +14,58 @@ defined( 'ABSPATH' ) || exit;
* REST API Orders controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_CRUD_Controller
+ * @extends WC_REST_Orders_V2_Controller
*/
-class WC_REST_Orders_Controller extends WC_REST_Legacy_Orders_Controller {
+class WC_REST_Orders_Controller extends WC_REST_Orders_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
+ protected $namespace = 'wc/v3';
/**
- * Route base.
+ * Calculate coupons.
*
- * @var string
+ * @throws WC_REST_Exception When fails to set any item.
+ * @param WP_REST_Request $request Request object.
+ * @param WC_Order $order Order data.
+ * @return bool
*/
- protected $rest_base = 'orders';
-
- /**
- * Post type.
- *
- * @var string
- */
- protected $post_type = 'shop_order';
-
- /**
- * If object is hierarchical.
- *
- * @var bool
- */
- protected $hierarchical = true;
-
- /**
- * Stores the request.
- *
- * @var array
- */
- protected $request = array();
-
- /**
- * Register the routes for orders.
- */
- public function register_routes() {
- register_rest_route(
- $this->namespace, '/' . $this->rest_base, array(
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_items' ),
- 'permission_callback' => array( $this, 'get_items_permissions_check' ),
- 'args' => $this->get_collection_params(),
- ),
- array(
- 'methods' => WP_REST_Server::CREATABLE,
- 'callback' => array( $this, 'create_item' ),
- 'permission_callback' => array( $this, 'create_item_permissions_check' ),
- 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
-
- register_rest_route(
- $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array(
- 'args' => array(
- 'id' => array(
- 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
- 'type' => 'integer',
- ),
- ),
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_item' ),
- 'permission_callback' => array( $this, 'get_item_permissions_check' ),
- 'args' => array(
- 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
- ),
- ),
- array(
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => array( $this, 'update_item' ),
- 'permission_callback' => array( $this, 'update_item_permissions_check' ),
- 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
- ),
- array(
- 'methods' => WP_REST_Server::DELETABLE,
- 'callback' => array( $this, 'delete_item' ),
- 'permission_callback' => array( $this, 'delete_item_permissions_check' ),
- 'args' => array(
- 'force' => array(
- 'default' => false,
- 'type' => 'boolean',
- 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ),
- ),
- ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
-
- register_rest_route(
- $this->namespace, '/' . $this->rest_base . '/batch', array(
- array(
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => array( $this, 'batch_items' ),
- 'permission_callback' => array( $this, 'batch_items_permissions_check' ),
- 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
- ),
- 'schema' => array( $this, 'get_public_batch_schema' ),
- )
- );
- }
-
- /**
- * Get object. Return false if object is not of required type.
- *
- * @since 3.0.0
- * @param int $id Object ID.
- * @return WC_Data|bool
- */
- protected function get_object( $id ) {
- $order = wc_get_order( $id );
- // In case id is a refund's id (or it's not an order at all), don't expose it via /orders/ path.
- if ( ! $order || 'shop_order_refund' === $order->get_type() ) {
+ protected function calculate_coupons( $request, $order ) {
+ if ( ! isset( $request['coupon_lines'] ) || ! is_array( $request['coupon_lines'] ) ) {
return false;
}
- return $order;
- }
-
- /**
- * Expands an order item to get its data.
- *
- * @param WC_Order_item $item Order item data.
- * @return array
- */
- protected function get_order_item_data( $item ) {
- $data = $item->get_data();
- $format_decimal = array( 'subtotal', 'subtotal_tax', 'total', 'total_tax', 'tax_total', 'shipping_tax_total' );
-
- // Format decimal values.
- foreach ( $format_decimal as $key ) {
- if ( isset( $data[ $key ] ) ) {
- $data[ $key ] = wc_format_decimal( $data[ $key ], $this->request['dp'] );
- }
+ // Remove all coupons first to ensure calculation is correct.
+ foreach ( $order->get_items( 'coupon' ) as $coupon ) {
+ $order->remove_coupon( $coupon->get_code() );
}
- // Add SKU and PRICE to products.
- if ( is_callable( array( $item, 'get_product' ) ) ) {
- $data['sku'] = $item->get_product() ? $item->get_product()->get_sku() : null;
- $data['price'] = $item->get_quantity() ? $item->get_total() / $item->get_quantity() : 0;
- }
+ foreach ( $request['coupon_lines'] as $item ) {
+ if ( is_array( $item ) ) {
+ if ( empty( $item['id'] ) ) {
+ if ( empty( $item['code'] ) ) {
+ throw new WC_REST_Exception( 'woocommerce_rest_invalid_coupon', __( 'Coupon code is required.', 'woocommerce' ), 400 );
+ }
- // Format taxes.
- if ( ! empty( $data['taxes']['total'] ) ) {
- $taxes = array();
+ $results = $order->apply_coupon( wc_clean( $item['code'] ) );
- foreach ( $data['taxes']['total'] as $tax_rate_id => $tax ) {
- $taxes[] = array(
- 'id' => $tax_rate_id,
- 'total' => $tax,
- 'subtotal' => isset( $data['taxes']['subtotal'][ $tax_rate_id ] ) ? $data['taxes']['subtotal'][ $tax_rate_id ] : '',
- );
- }
- $data['taxes'] = $taxes;
- } elseif ( isset( $data['taxes'] ) ) {
- $data['taxes'] = array();
- }
-
- // Remove names for coupons, taxes and shipping.
- if ( isset( $data['code'] ) || isset( $data['rate_code'] ) || isset( $data['method_title'] ) ) {
- unset( $data['name'] );
- }
-
- // Remove props we don't want to expose.
- unset( $data['order_id'] );
- unset( $data['type'] );
-
- return $data;
- }
-
- /**
- * Get formatted item data.
- *
- * @since 3.0.0
- * @param WC_Data $object WC_Data instance.
- * @return array
- */
- protected function get_formatted_item_data( $object ) {
- $data = $object->get_data();
- $format_decimal = array( 'discount_total', 'discount_tax', 'shipping_total', 'shipping_tax', 'shipping_total', 'shipping_tax', 'cart_tax', 'total', 'total_tax' );
- $format_date = array( 'date_created', 'date_modified', 'date_completed', 'date_paid' );
- $format_line_items = array( 'line_items', 'tax_lines', 'shipping_lines', 'fee_lines', 'coupon_lines' );
-
- // Format decimal values.
- foreach ( $format_decimal as $key ) {
- $data[ $key ] = wc_format_decimal( $data[ $key ], $this->request['dp'] );
- }
-
- // Format date values.
- foreach ( $format_date as $key ) {
- $datetime = $data[ $key ];
- $data[ $key ] = wc_rest_prepare_date_response( $datetime, false );
- $data[ $key . '_gmt' ] = wc_rest_prepare_date_response( $datetime );
- }
-
- // Format the order status.
- $data['status'] = 'wc-' === substr( $data['status'], 0, 3 ) ? substr( $data['status'], 3 ) : $data['status'];
-
- // Format line items.
- foreach ( $format_line_items as $key ) {
- $data[ $key ] = array_values( array_map( array( $this, 'get_order_item_data' ), $data[ $key ] ) );
- }
-
- // Refunds.
- $data['refunds'] = array();
- foreach ( $object->get_refunds() as $refund ) {
- $data['refunds'][] = array(
- 'id' => $refund->get_id(),
- 'reason' => $refund->get_reason() ? $refund->get_reason() : '',
- 'total' => '-' . wc_format_decimal( $refund->get_amount(), $this->request['dp'] ),
- );
- }
-
- return array(
- 'id' => $object->get_id(),
- 'parent_id' => $data['parent_id'],
- 'number' => $data['number'],
- 'order_key' => $data['order_key'],
- 'created_via' => $data['created_via'],
- 'version' => $data['version'],
- 'status' => $data['status'],
- 'currency' => $data['currency'],
- 'date_created' => $data['date_created'],
- 'date_created_gmt' => $data['date_created_gmt'],
- 'date_modified' => $data['date_modified'],
- 'date_modified_gmt' => $data['date_modified_gmt'],
- 'discount_total' => $data['discount_total'],
- 'discount_tax' => $data['discount_tax'],
- 'shipping_total' => $data['shipping_total'],
- 'shipping_tax' => $data['shipping_tax'],
- 'cart_tax' => $data['cart_tax'],
- 'total' => $data['total'],
- 'total_tax' => $data['total_tax'],
- 'prices_include_tax' => $data['prices_include_tax'],
- 'customer_id' => $data['customer_id'],
- 'customer_ip_address' => $data['customer_ip_address'],
- 'customer_user_agent' => $data['customer_user_agent'],
- 'customer_note' => $data['customer_note'],
- 'billing' => $data['billing'],
- 'shipping' => $data['shipping'],
- 'payment_method' => $data['payment_method'],
- 'payment_method_title' => $data['payment_method_title'],
- 'transaction_id' => $data['transaction_id'],
- 'date_paid' => $data['date_paid'],
- 'date_paid_gmt' => $data['date_paid_gmt'],
- 'date_completed' => $data['date_completed'],
- 'date_completed_gmt' => $data['date_completed_gmt'],
- 'cart_hash' => $data['cart_hash'],
- 'meta_data' => $data['meta_data'],
- 'line_items' => $data['line_items'],
- 'tax_lines' => $data['tax_lines'],
- 'shipping_lines' => $data['shipping_lines'],
- 'fee_lines' => $data['fee_lines'],
- 'coupon_lines' => $data['coupon_lines'],
- 'refunds' => $data['refunds'],
- );
- }
-
- /**
- * Prepare a single order output for response.
- *
- * @since 3.0.0
- * @param WC_Data $object Object data.
- * @param WP_REST_Request $request Request object.
- * @return WP_REST_Response
- */
- public function prepare_object_for_response( $object, $request ) {
- $this->request = $request;
- $this->request['dp'] = is_null( $this->request['dp'] ) ? wc_get_price_decimals() : absint( $this->request['dp'] );
- $data = $this->get_formatted_item_data( $object );
- $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
- $data = $this->add_additional_fields_to_object( $data, $request );
- $data = $this->filter_response_by_context( $data, $context );
- $response = rest_ensure_response( $data );
- $response->add_links( $this->prepare_links( $object, $request ) );
-
- /**
- * Filter the data for a response.
- *
- * The dynamic portion of the hook name, $this->post_type,
- * refers to object type being prepared for the response.
- *
- * @param WP_REST_Response $response The response object.
- * @param WC_Data $object Object data.
- * @param WP_REST_Request $request Request object.
- */
- return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request );
- }
-
- /**
- * Prepare links for the request.
- *
- * @param WC_Data $object Object data.
- * @param WP_REST_Request $request Request object.
- * @return array Links for the given post.
- */
- protected function prepare_links( $object, $request ) {
- $links = array(
- 'self' => array(
- 'href' => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $object->get_id() ) ),
- ),
- 'collection' => array(
- 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
- ),
- );
-
- if ( 0 !== (int) $object->get_customer_id() ) {
- $links['customer'] = array(
- 'href' => rest_url( sprintf( '/%s/customers/%d', $this->namespace, $object->get_customer_id() ) ),
- );
- }
-
- if ( 0 !== (int) $object->get_parent_id() ) {
- $links['up'] = array(
- 'href' => rest_url( sprintf( '/%s/orders/%d', $this->namespace, $object->get_parent_id() ) ),
- );
- }
-
- return $links;
- }
-
- /**
- * Prepare objects query.
- *
- * @since 3.0.0
- * @param WP_REST_Request $request Full details about the request.
- * @return array
- */
- protected function prepare_objects_query( $request ) {
- global $wpdb;
-
- $args = parent::prepare_objects_query( $request );
-
- // Set post_status.
- if ( 'any' !== $request['status'] ) {
- $args['post_status'] = 'wc-' . $request['status'];
- } else {
- $args['post_status'] = 'any';
- }
-
- if ( isset( $request['customer'] ) ) {
- // On WC 3.5.0 the ID of the user that placed the order was moved from the post meta _customer_user to the post_author field in the wp_posts table.
- if ( version_compare( get_option( 'woocommerce_db_version' ), '3.5.0', '>=' ) ) {
- $args['author'] = $request['customer'];
- } else {
- if ( ! empty( $args['meta_query'] ) ) {
- $args['meta_query'] = array(); // WPCS: slow query ok.
+ if ( is_wp_error( $results ) ) {
+ throw new WC_REST_Exception( 'woocommerce_rest_' . $results->get_error_code(), $results->get_error_message(), 400 );
+ }
}
-
- $args['meta_query'][] = array(
- 'key' => '_customer_user',
- 'value' => $request['customer'],
- 'type' => 'NUMERIC',
- );
}
}
- // Search by product.
- if ( ! empty( $request['product'] ) ) {
- $order_ids = $wpdb->get_col(
- $wpdb->prepare(
- "
- SELECT order_id
- FROM {$wpdb->prefix}woocommerce_order_items
- WHERE order_item_id IN ( SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE meta_key = '_product_id' AND meta_value = %d )
- AND order_item_type = 'line_item'
- ", $request['product']
- )
- );
-
- // Force WP_Query return empty if don't found any order.
- $order_ids = ! empty( $order_ids ) ? $order_ids : array( 0 );
-
- $args['post__in'] = $order_ids;
- }
-
- // Search.
- if ( ! empty( $args['s'] ) ) {
- $order_ids = wc_order_search( $args['s'] );
-
- if ( ! empty( $order_ids ) ) {
- unset( $args['s'] );
- $args['post__in'] = array_merge( $order_ids, array( 0 ) );
- }
- }
-
- /**
- * Filter the query arguments for a request.
- *
- * Enables adding extra arguments or setting defaults for an order collection request.
- *
- * @param array $args Key value array of query var to query value.
- * @param WP_REST_Request $request The request used.
- */
- $args = apply_filters( 'woocommerce_rest_orders_prepare_object_query', $args, $request );
-
- return $args;
- }
-
- /**
- * Only return writable props from schema.
- *
- * @param array $schema Schema.
- * @return bool
- */
- protected function filter_writable_props( $schema ) {
- return empty( $schema['readonly'] );
+ return true;
}
/**
* Prepare a single order for create or update.
*
+ * @throws WC_REST_Exception When fails to set any item.
* @param WP_REST_Request $request Request object.
* @param bool $creating If is creating a new object.
* @return WP_Error|WC_Data
@@ -452,8 +82,9 @@ class WC_REST_Orders_Controller extends WC_REST_Legacy_Orders_Controller {
if ( ! is_null( $value ) ) {
switch ( $key ) {
+ case 'coupon_lines':
case 'status':
- // Status change should be done later so transitions have new data.
+ // Change should be done later so transitions have new data.
break;
case 'billing':
case 'shipping':
@@ -462,7 +93,6 @@ class WC_REST_Orders_Controller extends WC_REST_Legacy_Orders_Controller {
case 'line_items':
case 'shipping_lines':
case 'fee_lines':
- case 'coupon_lines':
if ( is_array( $value ) ) {
foreach ( $value as $item ) {
if ( is_array( $item ) ) {
@@ -547,6 +177,9 @@ class WC_REST_Orders_Controller extends WC_REST_Legacy_Orders_Controller {
}
}
+ // Set coupons.
+ $this->calculate_coupons( $request, $object );
+
// Set status.
if ( ! empty( $request['status'] ) ) {
$object->set_status( $request['status'] );
@@ -570,261 +203,32 @@ class WC_REST_Orders_Controller extends WC_REST_Legacy_Orders_Controller {
}
/**
- * Update address.
- *
- * @param WC_Order $order Order data.
- * @param array $posted Posted data.
- * @param string $type Address type.
- */
- protected function update_address( $order, $posted, $type = 'billing' ) {
- foreach ( $posted as $key => $value ) {
- if ( is_callable( array( $order, "set_{$type}_{$key}" ) ) ) {
- $order->{"set_{$type}_{$key}"}( $value );
- }
- }
- }
-
- /**
- * Gets the product ID from the SKU or posted ID.
- *
- * @throws WC_REST_Exception When SKU or ID is not valid.
- * @param array $posted Request data.
- * @return int
- */
- protected function get_product_id( $posted ) {
- if ( ! empty( $posted['sku'] ) ) {
- $product_id = (int) wc_get_product_id_by_sku( $posted['sku'] );
- } elseif ( ! empty( $posted['product_id'] ) && empty( $posted['variation_id'] ) ) {
- $product_id = (int) $posted['product_id'];
- } elseif ( ! empty( $posted['variation_id'] ) ) {
- $product_id = (int) $posted['variation_id'];
- } else {
- throw new WC_REST_Exception( 'woocommerce_rest_required_product_reference', __( 'Product ID or SKU is required.', 'woocommerce' ), 400 );
- }
- return $product_id;
- }
-
- /**
- * Maybe set an item prop if the value was posted.
- *
- * @param WC_Order_Item $item Order item.
- * @param string $prop Order property.
- * @param array $posted Request data.
- */
- protected function maybe_set_item_prop( $item, $prop, $posted ) {
- if ( isset( $posted[ $prop ] ) ) {
- $item->{"set_$prop"}( $posted[ $prop ] );
- }
- }
-
- /**
- * Maybe set item props if the values were posted.
- *
- * @param WC_Order_Item $item Order item data.
- * @param string[] $props Properties.
- * @param array $posted Request data.
- */
- protected function maybe_set_item_props( $item, $props, $posted ) {
- foreach ( $props as $prop ) {
- $this->maybe_set_item_prop( $item, $prop, $posted );
- }
- }
-
- /**
- * Maybe set item meta if posted.
- *
- * @param WC_Order_Item $item Order item data.
- * @param array $posted Request data.
- */
- protected function maybe_set_item_meta_data( $item, $posted ) {
- if ( ! empty( $posted['meta_data'] ) && is_array( $posted['meta_data'] ) ) {
- foreach ( $posted['meta_data'] as $meta ) {
- if ( isset( $meta['key'] ) ) {
- $value = isset( $meta['value'] ) ? $meta['value'] : null;
- $item->update_meta_data( $meta['key'], $value, isset( $meta['id'] ) ? $meta['id'] : '' );
- }
- }
- }
- }
-
- /**
- * Create or update a line item.
- *
- * @param array $posted Line item data.
- * @param string $action 'create' to add line item or 'update' to update it.
- * @param object $item Passed when updating an item. Null during creation.
- * @return WC_Order_Item_Product
- * @throws WC_REST_Exception Invalid data, server error.
- */
- protected function prepare_line_items( $posted, $action = 'create', $item = null ) {
- $item = is_null( $item ) ? new WC_Order_Item_Product( ! empty( $posted['id'] ) ? $posted['id'] : '' ) : $item;
- $product = wc_get_product( $this->get_product_id( $posted ) );
-
- if ( $product !== $item->get_product() ) {
- $item->set_product( $product );
-
- if ( 'create' === $action ) {
- $quantity = isset( $posted['quantity'] ) ? $posted['quantity'] : 1;
- $total = wc_get_price_excluding_tax( $product, array( 'qty' => $quantity ) );
- $item->set_total( $total );
- $item->set_subtotal( $total );
- }
- }
-
- $this->maybe_set_item_props( $item, array( 'name', 'quantity', 'total', 'subtotal', 'tax_class' ), $posted );
- $this->maybe_set_item_meta_data( $item, $posted );
-
- return $item;
- }
-
- /**
- * Create or update an order shipping method.
- *
- * @param array $posted $shipping Item data.
- * @param string $action 'create' to add shipping or 'update' to update it.
- * @param object $item Passed when updating an item. Null during creation.
- * @return WC_Order_Item_Shipping
- * @throws WC_REST_Exception Invalid data, server error.
- */
- protected function prepare_shipping_lines( $posted, $action = 'create', $item = null ) {
- $item = is_null( $item ) ? new WC_Order_Item_Shipping( ! empty( $posted['id'] ) ? $posted['id'] : '' ) : $item;
-
- if ( 'create' === $action ) {
- if ( empty( $posted['method_id'] ) ) {
- throw new WC_REST_Exception( 'woocommerce_rest_invalid_shipping_item', __( 'Shipping method ID is required.', 'woocommerce' ), 400 );
- }
- }
-
- $this->maybe_set_item_props( $item, array( 'method_id', 'method_title', 'total' ), $posted );
- $this->maybe_set_item_meta_data( $item, $posted );
-
- return $item;
- }
-
- /**
- * Create or update an order fee.
- *
- * @param array $posted Item data.
- * @param string $action 'create' to add fee or 'update' to update it.
- * @param object $item Passed when updating an item. Null during creation.
- * @return WC_Order_Item_Fee
- * @throws WC_REST_Exception Invalid data, server error.
- */
- protected function prepare_fee_lines( $posted, $action = 'create', $item = null ) {
- $item = is_null( $item ) ? new WC_Order_Item_Fee( ! empty( $posted['id'] ) ? $posted['id'] : '' ) : $item;
-
- if ( 'create' === $action ) {
- if ( empty( $posted['name'] ) ) {
- throw new WC_REST_Exception( 'woocommerce_rest_invalid_fee_item', __( 'Fee name is required.', 'woocommerce' ), 400 );
- }
- }
-
- $this->maybe_set_item_props( $item, array( 'name', 'tax_class', 'tax_status', 'total' ), $posted );
- $this->maybe_set_item_meta_data( $item, $posted );
-
- return $item;
- }
-
- /**
- * Create or update an order coupon.
- *
- * @param array $posted Item data.
- * @param string $action 'create' to add coupon or 'update' to update it.
- * @param object $item Passed when updating an item. Null during creation.
- * @return WC_Order_Item_Coupon
- * @throws WC_REST_Exception Invalid data, server error.
- */
- protected function prepare_coupon_lines( $posted, $action = 'create', $item = null ) {
- $item = is_null( $item ) ? new WC_Order_Item_Coupon( ! empty( $posted['id'] ) ? $posted['id'] : '' ) : $item;
-
- if ( 'create' === $action ) {
- if ( empty( $posted['code'] ) ) {
- throw new WC_REST_Exception( 'woocommerce_rest_invalid_coupon_coupon', __( 'Coupon code is required.', 'woocommerce' ), 400 );
- }
- }
-
- $this->maybe_set_item_props( $item, array( 'code', 'discount' ), $posted );
- $this->maybe_set_item_meta_data( $item, $posted );
-
- return $item;
- }
-
- /**
- * Wrapper method to create/update order items.
- * When updating, the item ID provided is checked to ensure it is associated
- * with the order.
- *
- * @param WC_Order $order order object.
- * @param string $item_type The item type.
- * @param array $posted item provided in the request body.
- * @throws WC_REST_Exception If item ID is not associated with order.
- */
- protected function set_item( $order, $item_type, $posted ) {
- global $wpdb;
-
- if ( ! empty( $posted['id'] ) ) {
- $action = 'update';
- } else {
- $action = 'create';
- }
-
- $method = 'prepare_' . $item_type;
- $item = null;
-
- // Verify provided line item ID is associated with order.
- if ( 'update' === $action ) {
- $item = $order->get_item( absint( $posted['id'] ), false );
-
- if ( ! $item ) {
- throw new WC_REST_Exception( 'woocommerce_rest_invalid_item_id', __( 'Order item ID provided is not associated with order.', 'woocommerce' ), 400 );
- }
- }
-
- // Prepare item data.
- $item = $this->$method( $posted, $action, $item );
-
- do_action( 'woocommerce_rest_set_order_item', $item, $posted );
-
- // If creating the order, add the item to it.
- if ( 'create' === $action ) {
- $order->add_item( $item );
- } else {
- $item->save();
- }
- }
-
- /**
- * Helper method to check if the resource ID associated with the provided item is null.
- * Items can be deleted by setting the resource ID to null.
- *
- * @param array $item Item provided in the request body.
- * @return bool True if the item resource ID is null, false otherwise.
- */
- protected function item_is_null( $item ) {
- $keys = array( 'product_id', 'method_id', 'method_title', 'name', 'code' );
-
- foreach ( $keys as $key ) {
- if ( array_key_exists( $key, $item ) && is_null( $item[ $key ] ) ) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Get order statuses without prefixes.
+ * Prepare objects query.
*
+ * @since 3.0.0
+ * @param WP_REST_Request $request Full details about the request.
* @return array
*/
- protected function get_order_statuses() {
- $order_statuses = array();
+ protected function prepare_objects_query( $request ) {
+ // This is needed to get around an array to string notice in WC_REST_Orders_Controller::prepare_objects_query.
+ $statuses = $request['status'];
+ unset( $request['status'] );
+ $args = parent::prepare_objects_query( $request );
- foreach ( array_keys( wc_get_order_statuses() ) as $status ) {
- $order_statuses[] = str_replace( 'wc-', '', $status );
+ $args['post_status'] = array();
+ foreach ( $statuses as $status ) {
+ if ( in_array( $status, $this->get_order_statuses(), true ) ) {
+ $args['post_status'][] = 'wc-' . $status;
+ } elseif ( 'any' === $status ) {
+ // Set status to "any" and short-circuit out.
+ $args['post_status'] = 'any';
+ break;
+ } else {
+ $args['post_status'][] = $status;
+ }
}
- return $order_statuses;
+ return $args;
}
/**
@@ -833,828 +237,11 @@ class WC_REST_Orders_Controller extends WC_REST_Legacy_Orders_Controller {
* @return array
*/
public function get_item_schema() {
- $schema = array(
- '$schema' => 'http://json-schema.org/draft-04/schema#',
- 'title' => $this->post_type,
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'parent_id' => array(
- 'description' => __( 'Parent order ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- ),
- 'number' => array(
- 'description' => __( 'Order number.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'order_key' => array(
- 'description' => __( 'Order key.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'created_via' => array(
- 'description' => __( 'Shows where the order was created.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'version' => array(
- 'description' => __( 'Version of WooCommerce which last updated the order.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'status' => array(
- 'description' => __( 'Order status.', 'woocommerce' ),
- 'type' => 'string',
- 'default' => 'pending',
- 'enum' => $this->get_order_statuses(),
- 'context' => array( 'view', 'edit' ),
- ),
- 'currency' => array(
- 'description' => __( 'Currency the order was created with, in ISO format.', 'woocommerce' ),
- 'type' => 'string',
- 'default' => get_woocommerce_currency(),
- 'enum' => array_keys( get_woocommerce_currencies() ),
- 'context' => array( 'view', 'edit' ),
- ),
- 'date_created' => array(
- 'description' => __( "The date the order was created, in the site's timezone.", 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'date_created_gmt' => array(
- 'description' => __( 'The date the order was created, as GMT.', 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'date_modified' => array(
- 'description' => __( "The date the order was last modified, in the site's timezone.", 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'date_modified_gmt' => array(
- 'description' => __( 'The date the order was last modified, as GMT.', 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'discount_total' => array(
- 'description' => __( 'Total discount amount for the order.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'discount_tax' => array(
- 'description' => __( 'Total discount tax amount for the order.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'shipping_total' => array(
- 'description' => __( 'Total shipping amount for the order.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'shipping_tax' => array(
- 'description' => __( 'Total shipping tax amount for the order.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'cart_tax' => array(
- 'description' => __( 'Sum of line item taxes only.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'total' => array(
- 'description' => __( 'Grand total.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'total_tax' => array(
- 'description' => __( 'Sum of all taxes.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'prices_include_tax' => array(
- 'description' => __( 'True the prices included tax during checkout.', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'customer_id' => array(
- 'description' => __( 'User ID who owns the order. 0 for guests.', 'woocommerce' ),
- 'type' => 'integer',
- 'default' => 0,
- 'context' => array( 'view', 'edit' ),
- ),
- 'customer_ip_address' => array(
- 'description' => __( "Customer's IP address.", 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'customer_user_agent' => array(
- 'description' => __( 'User agent of the customer.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'customer_note' => array(
- 'description' => __( 'Note left by customer during checkout.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'billing' => array(
- 'description' => __( 'Billing address.', 'woocommerce' ),
- 'type' => 'object',
- 'context' => array( 'view', 'edit' ),
- 'properties' => array(
- 'first_name' => array(
- 'description' => __( 'First name.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'last_name' => array(
- 'description' => __( 'Last name.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'company' => array(
- 'description' => __( 'Company name.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'address_1' => array(
- 'description' => __( 'Address line 1', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'address_2' => array(
- 'description' => __( 'Address line 2', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'city' => array(
- 'description' => __( 'City name.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'state' => array(
- 'description' => __( 'ISO code or name of the state, province or district.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'postcode' => array(
- 'description' => __( 'Postal code.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'country' => array(
- 'description' => __( 'Country code in ISO 3166-1 alpha-2 format.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'email' => array(
- 'description' => __( 'Email address.', 'woocommerce' ),
- 'type' => 'string',
- 'format' => 'email',
- 'context' => array( 'view', 'edit' ),
- ),
- 'phone' => array(
- 'description' => __( 'Phone number.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- ),
- ),
- 'shipping' => array(
- 'description' => __( 'Shipping address.', 'woocommerce' ),
- 'type' => 'object',
- 'context' => array( 'view', 'edit' ),
- 'properties' => array(
- 'first_name' => array(
- 'description' => __( 'First name.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'last_name' => array(
- 'description' => __( 'Last name.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'company' => array(
- 'description' => __( 'Company name.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'address_1' => array(
- 'description' => __( 'Address line 1', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'address_2' => array(
- 'description' => __( 'Address line 2', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'city' => array(
- 'description' => __( 'City name.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'state' => array(
- 'description' => __( 'ISO code or name of the state, province or district.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'postcode' => array(
- 'description' => __( 'Postal code.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'country' => array(
- 'description' => __( 'Country code in ISO 3166-1 alpha-2 format.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- ),
- ),
- 'payment_method' => array(
- 'description' => __( 'Payment method ID.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'payment_method_title' => array(
- 'description' => __( 'Payment method title.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'transaction_id' => array(
- 'description' => __( 'Unique transaction ID.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'date_paid' => array(
- 'description' => __( "The date the order was paid, in the site's timezone.", 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'date_paid_gmt' => array(
- 'description' => __( 'The date the order was paid, as GMT.', 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'date_completed' => array(
- 'description' => __( "The date the order was completed, in the site's timezone.", 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'date_completed_gmt' => array(
- 'description' => __( 'The date the order was completed, as GMT.', 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'cart_hash' => array(
- 'description' => __( 'MD5 hash of cart items to ensure orders are not modified.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'meta_data' => array(
- 'description' => __( 'Meta data.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Meta ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'key' => array(
- 'description' => __( 'Meta key.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'value' => array(
- 'description' => __( 'Meta value.', 'woocommerce' ),
- 'type' => 'mixed',
- 'context' => array( 'view', 'edit' ),
- ),
- ),
- ),
- ),
- 'line_items' => array(
- 'description' => __( 'Line items data.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Item ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'name' => array(
- 'description' => __( 'Product name.', 'woocommerce' ),
- 'type' => 'mixed',
- 'context' => array( 'view', 'edit' ),
- ),
- 'product_id' => array(
- 'description' => __( 'Product ID.', 'woocommerce' ),
- 'type' => 'mixed',
- 'context' => array( 'view', 'edit' ),
- ),
- 'variation_id' => array(
- 'description' => __( 'Variation ID, if applicable.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- ),
- 'quantity' => array(
- 'description' => __( 'Quantity ordered.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- ),
- 'tax_class' => array(
- 'description' => __( 'Tax class of product.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'subtotal' => array(
- 'description' => __( 'Line subtotal (before discounts).', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'subtotal_tax' => array(
- 'description' => __( 'Line subtotal tax (before discounts).', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'total' => array(
- 'description' => __( 'Line total (after discounts).', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'total_tax' => array(
- 'description' => __( 'Line total tax (after discounts).', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'taxes' => array(
- 'description' => __( 'Line taxes.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Tax rate ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- ),
- 'total' => array(
- 'description' => __( 'Tax total.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'subtotal' => array(
- 'description' => __( 'Tax subtotal.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- ),
- ),
- ),
- 'meta_data' => array(
- 'description' => __( 'Meta data.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Meta ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'key' => array(
- 'description' => __( 'Meta key.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'value' => array(
- 'description' => __( 'Meta value.', 'woocommerce' ),
- 'type' => 'mixed',
- 'context' => array( 'view', 'edit' ),
- ),
- ),
- ),
- ),
- 'sku' => array(
- 'description' => __( 'Product SKU.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'price' => array(
- 'description' => __( 'Product price.', 'woocommerce' ),
- 'type' => 'number',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- ),
- ),
- ),
- 'tax_lines' => array(
- 'description' => __( 'Tax lines data.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Item ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'rate_code' => array(
- 'description' => __( 'Tax rate code.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'rate_id' => array(
- 'description' => __( 'Tax rate ID.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'label' => array(
- 'description' => __( 'Tax rate label.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'compound' => array(
- 'description' => __( 'Show if is a compound tax rate.', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'tax_total' => array(
- 'description' => __( 'Tax total (not including shipping taxes).', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'shipping_tax_total' => array(
- 'description' => __( 'Shipping tax total.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'meta_data' => array(
- 'description' => __( 'Meta data.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Meta ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'key' => array(
- 'description' => __( 'Meta key.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'value' => array(
- 'description' => __( 'Meta value.', 'woocommerce' ),
- 'type' => 'mixed',
- 'context' => array( 'view', 'edit' ),
- ),
- ),
- ),
- ),
- ),
- ),
- ),
- 'shipping_lines' => array(
- 'description' => __( 'Shipping lines data.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Item ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'method_title' => array(
- 'description' => __( 'Shipping method name.', 'woocommerce' ),
- 'type' => 'mixed',
- 'context' => array( 'view', 'edit' ),
- ),
- 'method_id' => array(
- 'description' => __( 'Shipping method ID.', 'woocommerce' ),
- 'type' => 'mixed',
- 'context' => array( 'view', 'edit' ),
- ),
- 'total' => array(
- 'description' => __( 'Line total (after discounts).', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'total_tax' => array(
- 'description' => __( 'Line total tax (after discounts).', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'taxes' => array(
- 'description' => __( 'Line taxes.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Tax rate ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'total' => array(
- 'description' => __( 'Tax total.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- ),
- ),
- ),
- 'meta_data' => array(
- 'description' => __( 'Meta data.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Meta ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'key' => array(
- 'description' => __( 'Meta key.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'value' => array(
- 'description' => __( 'Meta value.', 'woocommerce' ),
- 'type' => 'mixed',
- 'context' => array( 'view', 'edit' ),
- ),
- ),
- ),
- ),
- ),
- ),
- ),
- 'fee_lines' => array(
- 'description' => __( 'Fee lines data.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Item ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'name' => array(
- 'description' => __( 'Fee name.', 'woocommerce' ),
- 'type' => 'mixed',
- 'context' => array( 'view', 'edit' ),
- ),
- 'tax_class' => array(
- 'description' => __( 'Tax class of fee.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'tax_status' => array(
- 'description' => __( 'Tax status of fee.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'enum' => array( 'taxable', 'none' ),
- ),
- 'total' => array(
- 'description' => __( 'Line total (after discounts).', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'total_tax' => array(
- 'description' => __( 'Line total tax (after discounts).', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'taxes' => array(
- 'description' => __( 'Line taxes.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Tax rate ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'total' => array(
- 'description' => __( 'Tax total.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'subtotal' => array(
- 'description' => __( 'Tax subtotal.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- ),
- ),
- ),
- 'meta_data' => array(
- 'description' => __( 'Meta data.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Meta ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'key' => array(
- 'description' => __( 'Meta key.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'value' => array(
- 'description' => __( 'Meta value.', 'woocommerce' ),
- 'type' => 'mixed',
- 'context' => array( 'view', 'edit' ),
- ),
- ),
- ),
- ),
- ),
- ),
- ),
- 'coupon_lines' => array(
- 'description' => __( 'Coupons line data.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Item ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'code' => array(
- 'description' => __( 'Coupon code.', 'woocommerce' ),
- 'type' => 'mixed',
- 'context' => array( 'view', 'edit' ),
- ),
- 'discount' => array(
- 'description' => __( 'Discount total.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'discount_tax' => array(
- 'description' => __( 'Discount total tax.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'meta_data' => array(
- 'description' => __( 'Meta data.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Meta ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'key' => array(
- 'description' => __( 'Meta key.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'value' => array(
- 'description' => __( 'Meta value.', 'woocommerce' ),
- 'type' => 'mixed',
- 'context' => array( 'view', 'edit' ),
- ),
- ),
- ),
- ),
- ),
- ),
- ),
- 'refunds' => array(
- 'description' => __( 'List of refunds.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- 'items' => array(
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Refund ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'reason' => array(
- 'description' => __( 'Refund reason.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'total' => array(
- 'description' => __( 'Refund total.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- ),
- ),
- ),
- 'set_paid' => array(
- 'description' => __( 'Define if the order is paid. It will set the status to processing and reduce stock items.', 'woocommerce' ),
- 'type' => 'boolean',
- 'default' => false,
- 'context' => array( 'edit' ),
- ),
- ),
- );
+ $schema = parent::get_item_schema();
- return $this->add_additional_fields_schema( $schema );
+ $schema['properties']['coupon_lines']['items']['properties']['discount']['readonly'] = true;
+
+ return $schema;
}
/**
@@ -1665,31 +252,14 @@ class WC_REST_Orders_Controller extends WC_REST_Legacy_Orders_Controller {
public function get_collection_params() {
$params = parent::get_collection_params();
- $params['status'] = array(
+ $params['status'] = array(
'default' => 'any',
'description' => __( 'Limit result set to orders assigned a specific status.', 'woocommerce' ),
- 'type' => 'string',
- 'enum' => array_merge( array( 'any' ), $this->get_order_statuses() ),
- 'sanitize_callback' => 'sanitize_key',
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['customer'] = array(
- 'description' => __( 'Limit result set to orders assigned a specific customer.', 'woocommerce' ),
- 'type' => 'integer',
- 'sanitize_callback' => 'absint',
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['product'] = array(
- 'description' => __( 'Limit result set to orders assigned a specific product.', 'woocommerce' ),
- 'type' => 'integer',
- 'sanitize_callback' => 'absint',
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['dp'] = array(
- 'default' => wc_get_price_decimals(),
- 'description' => __( 'Number of decimal points to use in each resource.', 'woocommerce' ),
- 'type' => 'integer',
- 'sanitize_callback' => 'absint',
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'string',
+ 'enum' => array_merge( array( 'any', 'trash' ), $this->get_order_statuses() ),
+ ),
'validate_callback' => 'rest_validate_request_arg',
);
diff --git a/includes/api/class-wc-rest-payment-gateways-controller.php b/includes/api/class-wc-rest-payment-gateways-controller.php
index 89f6a692632..88f09312425 100644
--- a/includes/api/class-wc-rest-payment-gateways-controller.php
+++ b/includes/api/class-wc-rest-payment-gateways-controller.php
@@ -14,232 +14,16 @@ defined( 'ABSPATH' ) || exit;
* Paymenga gateways controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Controller
+ * @extends WC_REST_Payment_Gateways_V2_Controller
*/
-class WC_REST_Payment_Gateways_Controller extends WC_REST_Controller {
+class WC_REST_Payment_Gateways_Controller extends WC_REST_Payment_Gateways_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
-
- /**
- * Route base.
- *
- * @var string
- */
- protected $rest_base = 'payment_gateways';
-
- /**
- * Register the route for /payment_gateways and /payment_gateways/
- */
- public function register_routes() {
- register_rest_route(
- $this->namespace, '/' . $this->rest_base, array(
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_items' ),
- 'permission_callback' => array( $this, 'get_items_permissions_check' ),
- 'args' => $this->get_collection_params(),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
- register_rest_route(
- $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array(
- 'args' => array(
- 'id' => array(
- 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
- 'type' => 'string',
- ),
- ),
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_item' ),
- 'permission_callback' => array( $this, 'get_item_permissions_check' ),
- 'args' => array(
- 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
- ),
- ),
- array(
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => array( $this, 'update_item' ),
- 'permission_callback' => array( $this, 'update_items_permissions_check' ),
- 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
- }
-
- /**
- * Check whether a given request has permission to view payment gateways.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_Error|boolean
- */
- public function get_items_permissions_check( $request ) {
- if ( ! wc_rest_check_manager_permissions( 'payment_gateways', 'read' ) ) {
- return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
- }
- return true;
- }
-
- /**
- * Check if a given request has access to read a payment gateway.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_Error|boolean
- */
- public function get_item_permissions_check( $request ) {
- if ( ! wc_rest_check_manager_permissions( 'payment_gateways', 'read' ) ) {
- return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
- }
- return true;
- }
-
- /**
- * Check whether a given request has permission to edit payment gateways.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_Error|boolean
- */
- public function update_items_permissions_check( $request ) {
- if ( ! wc_rest_check_manager_permissions( 'payment_gateways', 'edit' ) ) {
- return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you are not allowed to edit this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
- }
- return true;
- }
-
- /**
- * Get payment gateways.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_Error|WP_REST_Response
- */
- public function get_items( $request ) {
- $payment_gateways = WC()->payment_gateways->payment_gateways();
- $response = array();
- foreach ( $payment_gateways as $payment_gateway_id => $payment_gateway ) {
- $payment_gateway->id = $payment_gateway_id;
- $gateway = $this->prepare_item_for_response( $payment_gateway, $request );
- $gateway = $this->prepare_response_for_collection( $gateway );
- $response[] = $gateway;
- }
- return rest_ensure_response( $response );
- }
-
- /**
- * Get a single payment gateway.
- *
- * @param WP_REST_Request $request Request data.
- * @return WP_REST_Response|WP_Error
- */
- public function get_item( $request ) {
- $gateway = $this->get_gateway( $request );
-
- if ( is_null( $gateway ) ) {
- return new WP_Error( 'woocommerce_rest_payment_gateway_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) );
- }
-
- $gateway = $this->prepare_item_for_response( $gateway, $request );
- return rest_ensure_response( $gateway );
- }
-
- /**
- * Update A Single Payment Method.
- *
- * @param WP_REST_Request $request Request data.
- * @return WP_REST_Response|WP_Error
- */
- public function update_item( $request ) {
- $gateway = $this->get_gateway( $request );
-
- if ( is_null( $gateway ) ) {
- return new WP_Error( 'woocommerce_rest_payment_gateway_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) );
- }
-
- // Get settings.
- $gateway->init_form_fields();
- $settings = $gateway->settings;
-
- // Update settings.
- if ( isset( $request['settings'] ) ) {
- $errors_found = false;
- foreach ( $gateway->form_fields as $key => $field ) {
- if ( isset( $request['settings'][ $key ] ) ) {
- if ( is_callable( array( $this, 'validate_setting_' . $field['type'] . '_field' ) ) ) {
- $value = $this->{'validate_setting_' . $field['type'] . '_field'}( $request['settings'][ $key ], $field );
- } else {
- $value = $this->validate_setting_text_field( $request['settings'][ $key ], $field );
- }
- if ( is_wp_error( $value ) ) {
- $errors_found = true;
- break;
- }
- $settings[ $key ] = $value;
- }
- }
-
- if ( $errors_found ) {
- return new WP_Error( 'rest_setting_value_invalid', __( 'An invalid setting value was passed.', 'woocommerce' ), array( 'status' => 400 ) );
- }
- }
-
- // Update if this method is enabled or not.
- if ( isset( $request['enabled'] ) ) {
- $settings['enabled'] = wc_bool_to_string( $request['enabled'] );
- $gateway->enabled = $settings['enabled'];
- }
-
- // Update title.
- if ( isset( $request['title'] ) ) {
- $settings['title'] = $request['title'];
- $gateway->title = $settings['title'];
- }
-
- // Update description.
- if ( isset( $request['description'] ) ) {
- $settings['description'] = $request['description'];
- $gateway->description = $settings['description'];
- }
-
- // Update options.
- $gateway->settings = $settings;
- update_option( $gateway->get_option_key(), apply_filters( 'woocommerce_gateway_' . $gateway->id . '_settings_values', $settings, $gateway ) );
-
- // Update order.
- if ( isset( $request['order'] ) ) {
- $order = (array) get_option( 'woocommerce_gateway_order' );
- $order[ $gateway->id ] = $request['order'];
- update_option( 'woocommerce_gateway_order', $order );
- $gateway->order = absint( $request['order'] );
- }
-
- $gateway = $this->prepare_item_for_response( $gateway, $request );
- return rest_ensure_response( $gateway );
- }
-
- /**
- * Get a gateway based on the current request object.
- *
- * @param WP_REST_Request $request Request data.
- * @return WP_REST_Response|null
- */
- public function get_gateway( $request ) {
- $gateway = null;
- $payment_gateways = WC()->payment_gateways->payment_gateways();
- foreach ( $payment_gateways as $payment_gateway_id => $payment_gateway ) {
- if ( $request['id'] !== $payment_gateway_id ) {
- continue;
- }
- $payment_gateway->id = $payment_gateway_id;
- $gateway = $payment_gateway;
- }
- return $gateway;
- }
+ protected $namespace = 'wc/v3';
/**
* Prepare a payment gateway for response.
@@ -258,6 +42,7 @@ class WC_REST_Payment_Gateways_Controller extends WC_REST_Controller {
'enabled' => ( 'yes' === $gateway->enabled ),
'method_title' => $gateway->get_method_title(),
'method_description' => $gateway->get_method_description(),
+ 'method_supports' => $gateway->supports,
'settings' => $this->get_settings( $gateway ),
);
@@ -281,7 +66,7 @@ class WC_REST_Payment_Gateways_Controller extends WC_REST_Controller {
/**
* Return settings associated with this payment gateway.
*
- * @param WC_Payment_Gateway $gateway Gateway data.
+ * @param WC_Payment_Gateway $gateway Gateway instance.
*
* @return array
*/
@@ -293,14 +78,12 @@ class WC_REST_Payment_Gateways_Controller extends WC_REST_Controller {
if ( empty( $field['title'] ) || empty( $field['type'] ) ) {
continue;
}
- // Ignore 'title' settings/fields -- they are UI only.
- if ( 'title' === $field['type'] ) {
- continue;
- }
+
// Ignore 'enabled' and 'description' which get included elsewhere.
if ( in_array( $id, array( 'enabled', 'description' ), true ) ) {
continue;
}
+
$data = array(
'id' => $id,
'label' => empty( $field['label'] ) ? $field['title'] : $field['label'],
@@ -319,26 +102,6 @@ class WC_REST_Payment_Gateways_Controller extends WC_REST_Controller {
return $settings;
}
- /**
- * Prepare links for the request.
- *
- * @param WC_Payment_Gateway $gateway Payment gateway object.
- * @param WP_REST_Request $request Request object.
- * @return array
- */
- protected function prepare_links( $gateway, $request ) {
- $links = array(
- 'self' => array(
- 'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $gateway->id ) ),
- ),
- 'collection' => array(
- 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
- ),
- );
-
- return $links;
- }
-
/**
* Get the payment gateway schema, conforming to JSON Schema.
*
@@ -391,6 +154,15 @@ class WC_REST_Payment_Gateways_Controller extends WC_REST_Controller {
'context' => array( 'view', 'edit' ),
'readonly' => true,
),
+ 'method_supports' => array(
+ 'description' => __( 'Supported features for this payment gateway.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ 'items' => array(
+ 'type' => 'string',
+ ),
+ ),
'settings' => array(
'description' => __( 'Payment gateway settings.', 'woocommerce' ),
'type' => 'object',
@@ -451,16 +223,4 @@ class WC_REST_Payment_Gateways_Controller extends WC_REST_Controller {
return $this->add_additional_fields_schema( $schema );
}
-
- /**
- * Get any query params needed.
- *
- * @return array
- */
- public function get_collection_params() {
- return array(
- 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
- );
- }
-
}
diff --git a/includes/api/class-wc-rest-product-attribute-terms-controller.php b/includes/api/class-wc-rest-product-attribute-terms-controller.php
index 6d844ec62ec..3e652894d69 100644
--- a/includes/api/class-wc-rest-product-attribute-terms-controller.php
+++ b/includes/api/class-wc-rest-product-attribute-terms-controller.php
@@ -14,14 +14,14 @@ defined( 'ABSPATH' ) || exit;
* REST API Product Attribute Terms controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Product_Attribute_Terms_V1_Controller
+ * @extends WC_REST_Product_Attribute_Terms_V2_Controller
*/
-class WC_REST_Product_Attribute_Terms_Controller extends WC_REST_Product_Attribute_Terms_V1_Controller {
+class WC_REST_Product_Attribute_Terms_Controller extends WC_REST_Product_Attribute_Terms_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
+ protected $namespace = 'wc/v3';
}
diff --git a/includes/api/class-wc-rest-product-attributes-controller.php b/includes/api/class-wc-rest-product-attributes-controller.php
index 2ab17365c22..047e6e4e257 100644
--- a/includes/api/class-wc-rest-product-attributes-controller.php
+++ b/includes/api/class-wc-rest-product-attributes-controller.php
@@ -14,14 +14,14 @@ defined( 'ABSPATH' ) || exit;
* REST API Product Attributes controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Product_Attributes_V1_Controller
+ * @extends WC_REST_Product_Attributes_V2_Controller
*/
-class WC_REST_Product_Attributes_Controller extends WC_REST_Product_Attributes_V1_Controller {
+class WC_REST_Product_Attributes_Controller extends WC_REST_Product_Attributes_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
+ protected $namespace = 'wc/v3';
}
diff --git a/includes/api/class-wc-rest-product-categories-controller.php b/includes/api/class-wc-rest-product-categories-controller.php
index 5b1a5a5b8d1..329c87cd400 100644
--- a/includes/api/class-wc-rest-product-categories-controller.php
+++ b/includes/api/class-wc-rest-product-categories-controller.php
@@ -14,16 +14,16 @@ defined( 'ABSPATH' ) || exit;
* REST API Product Categories controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Product_Categories_V1_Controller
+ * @extends WC_REST_Product_Categories_V2_Controller
*/
-class WC_REST_Product_Categories_Controller extends WC_REST_Product_Categories_V1_Controller {
+class WC_REST_Product_Categories_Controller extends WC_REST_Product_Categories_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
+ protected $namespace = 'wc/v3';
/**
* Prepare a single product category output for response.
@@ -63,7 +63,7 @@ class WC_REST_Product_Categories_Controller extends WC_REST_Product_Categories_V
'date_modified' => wc_rest_prepare_date_response( $attachment->post_modified ),
'date_modified_gmt' => wc_rest_prepare_date_response( $attachment->post_modified_gmt ),
'src' => wp_get_attachment_url( $image_id ),
- 'title' => get_the_title( $attachment ),
+ 'name' => get_the_title( $attachment ),
'alt' => get_post_meta( $image_id, '_wp_attachment_image_alt', true ),
);
}
@@ -181,7 +181,7 @@ class WC_REST_Product_Categories_Controller extends WC_REST_Product_Categories_V
'format' => 'uri',
'context' => array( 'view', 'edit' ),
),
- 'title' => array(
+ 'name' => array(
'description' => __( 'Image name.', 'woocommerce' ),
'type' => 'string',
'context' => array( 'view', 'edit' ),
diff --git a/includes/api/class-wc-rest-product-reviews-controller.php b/includes/api/class-wc-rest-product-reviews-controller.php
index 47b2de99d4f..602b1b5f8dd 100644
--- a/includes/api/class-wc-rest-product-reviews-controller.php
+++ b/includes/api/class-wc-rest-product-reviews-controller.php
@@ -2,10 +2,10 @@
/**
* REST API Product Reviews Controller
*
- * Handles requests to /products//reviews.
+ * Handles requests to /products/reviews.
*
* @package WooCommerce/API
- * @since 2.6.0
+ * @since 3.5.0
*/
defined( 'ABSPATH' ) || exit;
@@ -14,38 +14,109 @@ defined( 'ABSPATH' ) || exit;
* REST API Product Reviews Controller Class.
*
* @package WooCommerce/API
- * @extends WC_REST_Product_Reviews_V1_Controller
+ * @extends WC_REST_Controller
*/
-class WC_REST_Product_Reviews_Controller extends WC_REST_Product_Reviews_V1_Controller {
+class WC_REST_Product_Reviews_Controller extends WC_REST_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
+ protected $namespace = 'wc/v3';
/**
* Route base.
*
* @var string
*/
- protected $rest_base = 'products/(?P[\d]+)/reviews';
+ protected $rest_base = 'products/reviews';
/**
* Register the routes for product reviews.
*/
public function register_routes() {
- parent::register_routes();
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base, array(
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_items' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ 'args' => $this->get_collection_params(),
+ ),
+ array(
+ 'methods' => WP_REST_Server::CREATABLE,
+ 'callback' => array( $this, 'create_item' ),
+ 'permission_callback' => array( $this, 'create_item_permissions_check' ),
+ 'args' => array_merge(
+ $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), array(
+ 'product_id' => array(
+ 'required' => true,
+ 'description' => __( 'Unique identifier for the product.', 'woocommerce' ),
+ 'type' => 'integer',
+ ),
+ 'review' => array(
+ 'required' => true,
+ 'type' => 'string',
+ 'description' => __( 'Review content.', 'woocommerce' ),
+ ),
+ 'reviewer' => array(
+ 'required' => true,
+ 'type' => 'string',
+ 'description' => __( 'Name of the reviewer.', 'woocommerce' ),
+ ),
+ 'reviewer_email' => array(
+ 'required' => true,
+ 'type' => 'string',
+ 'description' => __( 'Email of the reviewer.', 'woocommerce' ),
+ ),
+ )
+ ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
register_rest_route(
- $this->namespace, '/' . $this->rest_base . '/batch', array(
+ $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array(
'args' => array(
- 'product_id' => array(
- 'description' => __( 'Unique identifier for the variable product.', 'woocommerce' ),
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
'type' => 'integer',
),
),
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_item' ),
+ 'permission_callback' => array( $this, 'get_item_permissions_check' ),
+ 'args' => array(
+ 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => array( $this, 'update_item' ),
+ 'permission_callback' => array( $this, 'update_item_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::DELETABLE,
+ 'callback' => array( $this, 'delete_item' ),
+ 'permission_callback' => array( $this, 'delete_item_permissions_check' ),
+ 'args' => array(
+ 'force' => array(
+ 'default' => false,
+ 'type' => 'boolean',
+ 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ),
+ ),
+ ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/batch', array(
array(
'methods' => WP_REST_Server::EDITABLE,
'callback' => array( $this, 'batch_items' ),
@@ -58,18 +129,544 @@ class WC_REST_Product_Reviews_Controller extends WC_REST_Product_Reviews_V1_Cont
}
/**
- * Check if a given request has access to batch manage product reviews.
+ * Check whether a given request has permission to read webhook deliveries.
*
* @param WP_REST_Request $request Full details about the request.
* @return WP_Error|boolean
*/
- public function batch_items_permissions_check( $request ) {
- if ( ! wc_rest_check_post_permissions( 'product', 'batch' ) ) {
- return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you are not allowed to batch manipulate this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ public function get_items_permissions_check( $request ) {
+ if ( ! wc_rest_check_product_reviews_permissions( 'read' ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
}
+
return true;
}
+ /**
+ * Check if a given request has access to read a product review.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|boolean
+ */
+ public function get_item_permissions_check( $request ) {
+ $id = (int) $request['id'];
+ $review = get_comment( $id );
+
+ if ( $review && ! wc_rest_check_product_reviews_permissions( 'read', $review->comment_ID ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+
+ return true;
+ }
+
+ /**
+ * Check if a given request has access to create a new product review.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|boolean
+ */
+ public function create_item_permissions_check( $request ) {
+ if ( ! wc_rest_check_product_reviews_permissions( 'create' ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_create', __( 'Sorry, you are not allowed to create resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+
+ return true;
+ }
+
+ /**
+ * Check if a given request has access to update a product review.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|boolean
+ */
+ public function update_item_permissions_check( $request ) {
+ $id = (int) $request['id'];
+ $review = get_comment( $id );
+
+ if ( $review && ! wc_rest_check_product_reviews_permissions( 'edit', $review->comment_ID ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you cannot edit this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+
+ return true;
+ }
+
+ /**
+ * Check if a given request has access to delete a product review.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|boolean
+ */
+ public function delete_item_permissions_check( $request ) {
+ $id = (int) $request['id'];
+ $review = get_comment( $id );
+
+ if ( $review && ! wc_rest_check_product_reviews_permissions( 'delete', $review->comment_ID ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you cannot delete this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+
+ return true;
+ }
+
+ /**
+ * Check if a given request has access batch create, update and delete items.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return boolean|WP_Error
+ */
+ public function batch_items_permissions_check( $request ) {
+ if ( ! wc_rest_check_product_reviews_permissions( 'create' ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_batch', __( 'Sorry, you are not allowed to batch manipulate this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+
+ return true;
+ }
+
+ /**
+ * Get all reviews.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return array|WP_Error
+ */
+ public function get_items( $request ) {
+ // Retrieve the list of registered collection query parameters.
+ $registered = $this->get_collection_params();
+
+ /*
+ * This array defines mappings between public API query parameters whose
+ * values are accepted as-passed, and their internal WP_Query parameter
+ * name equivalents (some are the same). Only values which are also
+ * present in $registered will be set.
+ */
+ $parameter_mappings = array(
+ 'reviewer' => 'author__in',
+ 'reviewer_email' => 'author_email',
+ 'reviewer_exclude' => 'author__not_in',
+ 'exclude' => 'comment__not_in',
+ 'include' => 'comment__in',
+ 'offset' => 'offset',
+ 'order' => 'order',
+ 'per_page' => 'number',
+ 'product' => 'post__in',
+ 'search' => 'search',
+ 'status' => 'status',
+ );
+
+ $prepared_args = array();
+
+ /*
+ * For each known parameter which is both registered and present in the request,
+ * set the parameter's value on the query $prepared_args.
+ */
+ foreach ( $parameter_mappings as $api_param => $wp_param ) {
+ if ( isset( $registered[ $api_param ], $request[ $api_param ] ) ) {
+ $prepared_args[ $wp_param ] = $request[ $api_param ];
+ }
+ }
+
+ // Ensure certain parameter values default to empty strings.
+ foreach ( array( 'author_email', 'search' ) as $param ) {
+ if ( ! isset( $prepared_args[ $param ] ) ) {
+ $prepared_args[ $param ] = '';
+ }
+ }
+
+ if ( isset( $registered['orderby'] ) ) {
+ $prepared_args['orderby'] = $this->normalize_query_param( $request['orderby'] );
+ }
+
+ if ( isset( $prepared_args['status'] ) ) {
+ $prepared_args['status'] = 'approved' === $prepared_args['status'] ? 'approve' : $prepared_args['status'];
+ }
+
+ $prepared_args['no_found_rows'] = false;
+ $prepared_args['date_query'] = array();
+
+ // Set before into date query. Date query must be specified as an array of an array.
+ if ( isset( $registered['before'], $request['before'] ) ) {
+ $prepared_args['date_query'][0]['before'] = $request['before'];
+ }
+
+ // Set after into date query. Date query must be specified as an array of an array.
+ if ( isset( $registered['after'], $request['after'] ) ) {
+ $prepared_args['date_query'][0]['after'] = $request['after'];
+ }
+
+ if ( isset( $registered['page'] ) && empty( $request['offset'] ) ) {
+ $prepared_args['offset'] = $prepared_args['number'] * ( absint( $request['page'] ) - 1 );
+ }
+
+ /**
+ * Filters arguments, before passing to WP_Comment_Query, when querying reviews via the REST API.
+ *
+ * @since 3.5.0
+ * @link https://developer.wordpress.org/reference/classes/wp_comment_query/
+ * @param array $prepared_args Array of arguments for WP_Comment_Query.
+ * @param WP_REST_Request $request The current request.
+ */
+ $prepared_args = apply_filters( 'woocommerce_rest_product_review_query', $prepared_args, $request );
+
+ // Make sure that returns only reviews.
+ $prepared_args['type'] = 'review';
+
+ // Query reviews.
+ $query = new WP_Comment_Query();
+ $query_result = $query->query( $prepared_args );
+ $reviews = array();
+
+ foreach ( $query_result as $review ) {
+ if ( ! wc_rest_check_product_reviews_permissions( 'read', $review->comment_ID ) ) {
+ continue;
+ }
+
+ $data = $this->prepare_item_for_response( $review, $request );
+ $reviews[] = $this->prepare_response_for_collection( $data );
+ }
+
+ $total_reviews = (int) $query->found_comments;
+ $max_pages = (int) $query->max_num_pages;
+
+ if ( $total_reviews < 1 ) {
+ // Out-of-bounds, run the query again without LIMIT for total count.
+ unset( $prepared_args['number'], $prepared_args['offset'] );
+
+ $query = new WP_Comment_Query();
+ $prepared_args['count'] = true;
+
+ $total_reviews = $query->query( $prepared_args );
+ $max_pages = ceil( $total_reviews / $request['per_page'] );
+ }
+
+ $response = rest_ensure_response( $reviews );
+ $response->header( 'X-WP-Total', $total_reviews );
+ $response->header( 'X-WP-TotalPages', $max_pages );
+
+ $base = add_query_arg( $request->get_query_params(), rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ) );
+
+ if ( $request['page'] > 1 ) {
+ $prev_page = $request['page'] - 1;
+
+ if ( $prev_page > $max_pages ) {
+ $prev_page = $max_pages;
+ }
+
+ $prev_link = add_query_arg( 'page', $prev_page, $base );
+ $response->link_header( 'prev', $prev_link );
+ }
+
+ if ( $max_pages > $request['page'] ) {
+ $next_page = $request['page'] + 1;
+ $next_link = add_query_arg( 'page', $next_page, $base );
+
+ $response->link_header( 'next', $next_link );
+ }
+
+ return $response;
+ }
+
+ /**
+ * Create a single review.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function create_item( $request ) {
+ if ( ! empty( $request['id'] ) ) {
+ return new WP_Error( 'woocommerce_rest_review_exists', __( 'Cannot create existing product review.', 'woocommerce' ), array( 'status' => 400 ) );
+ }
+
+ $product_id = (int) $request['product_id'];
+
+ if ( 'product' !== get_post_type( $product_id ) ) {
+ return new WP_Error( 'woocommerce_rest_product_invalid_id', __( 'Invalid product ID.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+
+ $prepared_review = $this->prepare_item_for_database( $request );
+ if ( is_wp_error( $prepared_review ) ) {
+ return $prepared_review;
+ }
+
+ $prepared_review['comment_type'] = 'review';
+
+ /*
+ * Do not allow a comment to be created with missing or empty comment_content. See wp_handle_comment_submission().
+ */
+ if ( empty( $prepared_review['comment_content'] ) ) {
+ return new WP_Error( 'woocommerce_rest_review_content_invalid', __( 'Invalid review content.', 'woocommerce' ), array( 'status' => 400 ) );
+ }
+
+ // Setting remaining values before wp_insert_comment so we can use wp_allow_comment().
+ if ( ! isset( $prepared_review['comment_date_gmt'] ) ) {
+ $prepared_review['comment_date_gmt'] = current_time( 'mysql', true );
+ }
+
+ if ( ! empty( $_SERVER['REMOTE_ADDR'] ) && rest_is_ip_address( wp_unslash( $_SERVER['REMOTE_ADDR'] ) ) ) { // WPCS: input var ok, sanitization ok.
+ $prepared_review['comment_author_IP'] = wc_clean( wp_unslash( $_SERVER['REMOTE_ADDR'] ) ); // WPCS: input var ok.
+ } else {
+ $prepared_review['comment_author_IP'] = '127.0.0.1';
+ }
+
+ if ( ! empty( $request['author_user_agent'] ) ) {
+ $prepared_review['comment_agent'] = $request['author_user_agent'];
+ } elseif ( $request->get_header( 'user_agent' ) ) {
+ $prepared_review['comment_agent'] = $request->get_header( 'user_agent' );
+ } else {
+ $prepared_review['comment_agent'] = '';
+ }
+
+ $check_comment_lengths = wp_check_comment_data_max_lengths( $prepared_review );
+ if ( is_wp_error( $check_comment_lengths ) ) {
+ $error_code = str_replace( array( 'comment_author', 'comment_content' ), array( 'reviewer', 'review_content' ), $check_comment_lengths->get_error_code() );
+ return new WP_Error( 'woocommerce_rest_' . $error_code, __( 'Product review field exceeds maximum length allowed.', 'woocommerce' ), array( 'status' => 400 ) );
+ }
+
+ $prepared_review['comment_parent'] = 0;
+ $prepared_review['comment_author_url'] = '';
+ $prepared_review['comment_approved'] = wp_allow_comment( $prepared_review, true );
+
+ if ( is_wp_error( $prepared_review['comment_approved'] ) ) {
+ $error_code = $prepared_review['comment_approved']->get_error_code();
+ $error_message = $prepared_review['comment_approved']->get_error_message();
+
+ if ( 'comment_duplicate' === $error_code ) {
+ return new WP_Error( 'woocommerce_rest_' . $error_code, $error_message, array( 'status' => 409 ) );
+ }
+
+ if ( 'comment_flood' === $error_code ) {
+ return new WP_Error( 'woocommerce_rest_' . $error_code, $error_message, array( 'status' => 400 ) );
+ }
+
+ return $prepared_review['comment_approved'];
+ }
+
+ /**
+ * Filters a review before it is inserted via the REST API.
+ *
+ * Allows modification of the review right before it is inserted via wp_insert_comment().
+ * Returning a WP_Error value from the filter will shortcircuit insertion and allow
+ * skipping further processing.
+ *
+ * @since 3.5.0
+ * @param array|WP_Error $prepared_review The prepared review data for wp_insert_comment().
+ * @param WP_REST_Request $request Request used to insert the review.
+ */
+ $prepared_review = apply_filters( 'woocommerce_rest_pre_insert_product_review', $prepared_review, $request );
+ if ( is_wp_error( $prepared_review ) ) {
+ return $prepared_review;
+ }
+
+ $review_id = wp_insert_comment( wp_filter_comment( wp_slash( (array) $prepared_review ) ) );
+
+ if ( ! $review_id ) {
+ return new WP_Error( 'woocommerce_rest_review_failed_create', __( 'Creating product review failed.', 'woocommerce' ), array( 'status' => 500 ) );
+ }
+
+ if ( isset( $request['status'] ) ) {
+ $this->handle_status_param( $request['status'], $review_id );
+ }
+
+ update_comment_meta( $review_id, 'rating', ! empty( $request['rating'] ) ? $request['rating'] : '0' );
+
+ $review = get_comment( $review_id );
+
+ /**
+ * Fires after a comment is created or updated via the REST API.
+ *
+ * @param WP_Comment $review Inserted or updated comment object.
+ * @param WP_REST_Request $request Request object.
+ * @param bool $creating True when creating a comment, false when updating.
+ */
+ do_action( 'woocommerce_rest_insert_product_review', $review, $request, true );
+
+ $fields_update = $this->update_additional_fields_for_object( $review, $request );
+ if ( is_wp_error( $fields_update ) ) {
+ return $fields_update;
+ }
+
+ $context = current_user_can( 'moderate_comments' ) ? 'edit' : 'view';
+ $request->set_param( 'context', $context );
+
+ $response = $this->prepare_item_for_response( $review, $request );
+ $response = rest_ensure_response( $response );
+
+ $response->set_status( 201 );
+ $response->header( 'Location', rest_url( sprintf( '%s/%s/%d', $this->namespace, $this->rest_base, $review_id ) ) );
+
+ return $response;
+ }
+
+ /**
+ * Get a single product review.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function get_item( $request ) {
+ $review = $this->get_review( $request['id'] );
+ if ( is_wp_error( $review ) ) {
+ return $review;
+ }
+
+ $data = $this->prepare_item_for_response( $review, $request );
+ $response = rest_ensure_response( $data );
+
+ return $response;
+ }
+
+ /**
+ * Updates a review.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|WP_REST_Response Response object on success, or error object on failure.
+ */
+ public function update_item( $request ) {
+ $review = $this->get_review( $request['id'] );
+ if ( is_wp_error( $review ) ) {
+ return $review;
+ }
+
+ $id = (int) $review->comment_ID;
+
+ if ( isset( $request['type'] ) && 'review' !== get_comment_type( $id ) ) {
+ return new WP_Error( 'woocommerce_rest_review_invalid_type', __( 'Sorry, you are not allowed to change the comment type.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+
+ $prepared_args = $this->prepare_item_for_database( $request );
+ if ( is_wp_error( $prepared_args ) ) {
+ return $prepared_args;
+ }
+
+ if ( ! empty( $prepared_args['comment_post_ID'] ) ) {
+ if ( 'product' !== get_post_type( (int) $prepared_args['comment_post_ID'] ) ) {
+ return new WP_Error( 'woocommerce_rest_product_invalid_id', __( 'Invalid product ID.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+ }
+
+ if ( empty( $prepared_args ) && isset( $request['status'] ) ) {
+ // Only the comment status is being changed.
+ $change = $this->handle_status_param( $request['status'], $id );
+
+ if ( ! $change ) {
+ return new WP_Error( 'woocommerce_rest_review_failed_edit', __( 'Updating review status failed.', 'woocommerce' ), array( 'status' => 500 ) );
+ }
+ } elseif ( ! empty( $prepared_args ) ) {
+ if ( is_wp_error( $prepared_args ) ) {
+ return $prepared_args;
+ }
+
+ if ( isset( $prepared_args['comment_content'] ) && empty( $prepared_args['comment_content'] ) ) {
+ return new WP_Error( 'woocommerce_rest_review_content_invalid', __( 'Invalid review content.', 'woocommerce' ), array( 'status' => 400 ) );
+ }
+
+ $prepared_args['comment_ID'] = $id;
+
+ $check_comment_lengths = wp_check_comment_data_max_lengths( $prepared_args );
+ if ( is_wp_error( $check_comment_lengths ) ) {
+ $error_code = str_replace( array( 'comment_author', 'comment_content' ), array( 'reviewer', 'review_content' ), $check_comment_lengths->get_error_code() );
+ return new WP_Error( 'woocommerce_rest_' . $error_code, __( 'Product review field exceeds maximum length allowed.', 'woocommerce' ), array( 'status' => 400 ) );
+ }
+
+ $updated = wp_update_comment( wp_slash( (array) $prepared_args ) );
+
+ if ( false === $updated ) {
+ return new WP_Error( 'woocommerce_rest_comment_failed_edit', __( 'Updating review failed.', 'woocommerce' ), array( 'status' => 500 ) );
+ }
+
+ if ( isset( $request['status'] ) ) {
+ $this->handle_status_param( $request['status'], $id );
+ }
+ }
+
+ if ( ! empty( $request['rating'] ) ) {
+ update_comment_meta( $id, 'rating', $request['rating'] );
+ }
+
+ $review = get_comment( $id );
+
+ /** This action is documented in includes/api/class-wc-rest-product-reviews-controller.php */
+ do_action( 'woocommerce_rest_insert_product_review', $review, $request, false );
+
+ $fields_update = $this->update_additional_fields_for_object( $review, $request );
+
+ if ( is_wp_error( $fields_update ) ) {
+ return $fields_update;
+ }
+
+ $request->set_param( 'context', 'edit' );
+
+ $response = $this->prepare_item_for_response( $review, $request );
+
+ return rest_ensure_response( $response );
+ }
+
+ /**
+ * Deletes a review.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|WP_REST_Response Response object on success, or error object on failure.
+ */
+ public function delete_item( $request ) {
+ $review = $this->get_review( $request['id'] );
+ if ( is_wp_error( $review ) ) {
+ return $review;
+ }
+
+ $force = isset( $request['force'] ) ? (bool) $request['force'] : false;
+
+ /**
+ * Filters whether a review can be trashed.
+ *
+ * Return false to disable trash support for the post.
+ *
+ * @since 3.5.0
+ * @param bool $supports_trash Whether the post type support trashing.
+ * @param WP_Comment $review The review object being considered for trashing support.
+ */
+ $supports_trash = apply_filters( 'woocommerce_rest_product_review_trashable', ( EMPTY_TRASH_DAYS > 0 ), $review );
+
+ $request->set_param( 'context', 'edit' );
+
+ if ( $force ) {
+ $previous = $this->prepare_item_for_response( $review, $request );
+ $result = wp_delete_comment( $review->comment_ID, true );
+ $response = new WP_REST_Response();
+ $response->set_data(
+ array(
+ 'deleted' => true,
+ 'previous' => $previous->get_data(),
+ )
+ );
+ } else {
+ // If this type doesn't support trashing, error out.
+ if ( ! $supports_trash ) {
+ /* translators: %s: force=true */
+ return new WP_Error( 'woocommerce_rest_trash_not_supported', sprintf( __( "The object does not support trashing. Set '%s' to delete.", 'woocommerce' ), 'force=true' ), array( 'status' => 501 ) );
+ }
+
+ if ( 'trash' === $review->comment_approved ) {
+ return new WP_Error( 'woocommerce_rest_already_trashed', __( 'The object has already been trashed.', 'woocommerce' ), array( 'status' => 410 ) );
+ }
+
+ $result = wp_trash_comment( $review->comment_ID );
+ $review = get_comment( $review->comment_ID );
+ $response = $this->prepare_item_for_response( $review, $request );
+ }
+
+ if ( ! $result ) {
+ return new WP_Error( 'woocommerce_rest_cannot_delete', __( 'The object cannot be deleted.', 'woocommerce' ), array( 'status' => 500 ) );
+ }
+
+ /**
+ * Fires after a review is deleted via the REST API.
+ *
+ * @param WP_Comment $review The deleted review data.
+ * @param WP_REST_Response $response The response returned from the API.
+ * @param WP_REST_Request $request The request sent to the API.
+ */
+ do_action( 'woocommerce_rest_delete_review', $review, $response, $request );
+
+ return $response;
+ }
+
/**
* Prepare a single product review output for response.
*
@@ -78,25 +675,51 @@ class WC_REST_Product_Reviews_Controller extends WC_REST_Product_Reviews_V1_Cont
* @return WP_REST_Response $response Response data.
*/
public function prepare_item_for_response( $review, $request ) {
- $data = array(
- 'id' => (int) $review->comment_ID,
- 'date_created' => wc_rest_prepare_date_response( $review->comment_date ),
- 'date_created_gmt' => wc_rest_prepare_date_response( $review->comment_date_gmt ),
- 'review' => $review->comment_content,
- 'rating' => (int) get_comment_meta( $review->comment_ID, 'rating', true ),
- 'name' => $review->comment_author,
- 'email' => $review->comment_author_email,
- 'verified' => wc_review_is_from_verified_owner( $review->comment_ID ),
- );
-
$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
- $data = $this->add_additional_fields_to_object( $data, $request );
- $data = $this->filter_response_by_context( $data, $context );
+ $fields = $this->get_fields_for_response( $request );
+ $data = array();
+
+ if ( in_array( 'id', $fields, true ) ) {
+ $data['id'] = (int) $review->comment_ID;
+ }
+ if ( in_array( 'date_created', $fields, true ) ) {
+ $data['date_created'] = wc_rest_prepare_date_response( $review->comment_date );
+ }
+ if ( in_array( 'date_created_gmt', $fields, true ) ) {
+ $data['date_created_gmt'] = wc_rest_prepare_date_response( $review->comment_date_gmt );
+ }
+ if ( in_array( 'product_id', $fields, true ) ) {
+ $data['product_id'] = (int) $review->comment_post_ID;
+ }
+ if ( in_array( 'status', $fields, true ) ) {
+ $data['status'] = $this->prepare_status_response( (string) $review->comment_approved );
+ }
+ if ( in_array( 'reviewer', $fields, true ) ) {
+ $data['reviewer'] = $review->comment_author;
+ }
+ if ( in_array( 'reviewer_email', $fields, true ) ) {
+ $data['reviewer_email'] = $review->comment_author_email;
+ }
+ if ( in_array( 'review', $fields, true ) ) {
+ $data['review'] = 'view' === $context ? wpautop( $review->comment_content ) : $review->comment_content;
+ }
+ if ( in_array( 'rating', $fields, true ) ) {
+ $data['rating'] = (int) get_comment_meta( $review->comment_ID, 'rating', true );
+ }
+ if ( in_array( 'verified', $fields, true ) ) {
+ $data['verified'] = wc_review_is_from_verified_owner( $review->comment_ID );
+ }
+ if ( in_array( 'reviewer_avatar_urls', $fields, true ) ) {
+ $data['reviewer_avatar_urls'] = rest_get_avatar_urls( $review->comment_author_email );
+ }
+
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
// Wrap the data in a response object.
$response = rest_ensure_response( $data );
- $response->add_links( $this->prepare_links( $review, $request ) );
+ $response->add_links( $this->prepare_links( $review ) );
/**
* Filter product reviews object returned from the REST API.
@@ -108,34 +731,89 @@ class WC_REST_Product_Reviews_Controller extends WC_REST_Product_Reviews_V1_Cont
return apply_filters( 'woocommerce_rest_prepare_product_review', $response, $review, $request );
}
-
/**
- * Bulk create, update and delete items.
+ * Prepare a single product review to be inserted into the database.
*
- * @since 3.0.0
- * @param WP_REST_Request $request Full details about the request.
- * @return array Of WP_Error or WP_REST_Response.
+ * @param WP_REST_Request $request Request object.
+ * @return array|WP_Error $prepared_review
*/
- public function batch_items( $request ) {
- $items = array_filter( $request->get_params() );
- $params = $request->get_url_params();
- $product_id = $params['product_id'];
- $body_params = array();
+ protected function prepare_item_for_database( $request ) {
+ if ( isset( $request['id'] ) ) {
+ $prepared_review['comment_ID'] = (int) $request['id'];
+ }
- foreach ( array( 'update', 'create', 'delete' ) as $batch_type ) {
- if ( ! empty( $items[ $batch_type ] ) ) {
- $injected_items = array();
- foreach ( $items[ $batch_type ] as $item ) {
- $injected_items[] = is_array( $item ) ? array_merge( array( 'product_id' => $product_id ), $item ) : $item;
- }
- $body_params[ $batch_type ] = $injected_items;
+ if ( isset( $request['review'] ) ) {
+ $prepared_review['comment_content'] = $request['review'];
+ }
+
+ if ( isset( $request['product_id'] ) ) {
+ $prepared_review['comment_post_ID'] = (int) $request['product_id'];
+ }
+
+ if ( isset( $request['reviewer'] ) ) {
+ $prepared_review['comment_author'] = $request['reviewer'];
+ }
+
+ if ( isset( $request['reviewer_email'] ) ) {
+ $prepared_review['comment_author_email'] = $request['reviewer_email'];
+ }
+
+ if ( ! empty( $request['date_created'] ) ) {
+ $date_data = rest_get_date_with_gmt( $request['date_created'] );
+
+ if ( ! empty( $date_data ) ) {
+ list( $prepared_review['comment_date'], $prepared_review['comment_date_gmt'] ) = $date_data;
+ }
+ } elseif ( ! empty( $request['date_created_gmt'] ) ) {
+ $date_data = rest_get_date_with_gmt( $request['date_created_gmt'], true );
+
+ if ( ! empty( $date_data ) ) {
+ list( $prepared_review['comment_date'], $prepared_review['comment_date_gmt'] ) = $date_data;
}
}
- $request = new WP_REST_Request( $request->get_method() );
- $request->set_body_params( $body_params );
+ /**
+ * Filters a review after it is prepared for the database.
+ *
+ * Allows modification of the review right after it is prepared for the database.
+ *
+ * @since 3.5.0
+ * @param array $prepared_review The prepared review data for `wp_insert_comment`.
+ * @param WP_REST_Request $request The current request.
+ */
+ return apply_filters( 'woocommerce_rest_preprocess_product_review', $prepared_review, $request );
+ }
- return parent::batch_items( $request );
+ /**
+ * Prepare links for the request.
+ *
+ * @param WP_Comment $review Product review object.
+ * @return array Links for the given product review.
+ */
+ protected function prepare_links( $review ) {
+ $links = array(
+ 'self' => array(
+ 'href' => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $review->comment_ID ) ),
+ ),
+ 'collection' => array(
+ 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
+ ),
+ );
+
+ if ( 0 !== (int) $review->comment_post_ID ) {
+ $links['up'] = array(
+ 'href' => rest_url( sprintf( '/%s/products/%d', $this->namespace, $review->comment_post_ID ) ),
+ );
+ }
+
+ if ( 0 !== (int) $review->user_id ) {
+ $links['reviewer'] = array(
+ 'href' => rest_url( 'wp/v2/users/' . $review->user_id ),
+ 'embeddable' => true,
+ );
+ }
+
+ return $links;
}
/**
@@ -155,34 +833,52 @@ class WC_REST_Product_Reviews_Controller extends WC_REST_Product_Reviews_V1_Cont
'context' => array( 'view', 'edit' ),
'readonly' => true,
),
- 'review' => array(
- 'description' => __( 'The content of the review.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
'date_created' => array(
'description' => __( "The date the review was created, in the site's timezone.", 'woocommerce' ),
'type' => 'date-time',
'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
),
'date_created_gmt' => array(
'description' => __( 'The date the review was created, as GMT.', 'woocommerce' ),
'type' => 'date-time',
'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
),
- 'rating' => array(
- 'description' => __( 'Review rating (0 to 5).', 'woocommerce' ),
+ 'product_id' => array(
+ 'description' => __( 'Unique identifier for the product that the review belongs to.', 'woocommerce' ),
'type' => 'integer',
'context' => array( 'view', 'edit' ),
),
- 'name' => array(
+ 'status' => array(
+ 'description' => __( 'Status of the review.', 'woocommerce' ),
+ 'type' => 'string',
+ 'default' => 'approved',
+ 'enum' => array( 'approved', 'hold', 'spam', 'unspam', 'trash', 'untrash' ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'reviewer' => array(
'description' => __( 'Reviewer name.', 'woocommerce' ),
'type' => 'string',
'context' => array( 'view', 'edit' ),
),
- 'email' => array(
+ 'reviewer_email' => array(
'description' => __( 'Reviewer email.', 'woocommerce' ),
'type' => 'string',
+ 'format' => 'email',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'review' => array(
+ 'description' => __( 'The content of the review.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'arg_options' => array(
+ 'sanitize_callback' => 'wp_filter_post_kses',
+ ),
+ ),
+ 'rating' => array(
+ 'description' => __( 'Review rating (0 to 5).', 'woocommerce' ),
+ 'type' => 'integer',
'context' => array( 'view', 'edit' ),
),
'verified' => array(
@@ -194,6 +890,275 @@ class WC_REST_Product_Reviews_Controller extends WC_REST_Product_Reviews_V1_Cont
),
);
+ if ( get_option( 'show_avatars' ) ) {
+ $avatar_properties = array();
+ $avatar_sizes = rest_get_avatar_sizes();
+
+ foreach ( $avatar_sizes as $size ) {
+ $avatar_properties[ $size ] = array(
+ /* translators: %d: avatar image size in pixels */
+ 'description' => sprintf( __( 'Avatar URL with image size of %d pixels.', 'woocommerce' ), $size ),
+ 'type' => 'string',
+ 'format' => 'uri',
+ 'context' => array( 'embed', 'view', 'edit' ),
+ );
+ }
+ $schema['properties']['reviewer_avatar_urls'] = array(
+ 'description' => __( 'Avatar URLs for the object reviewer.', 'woocommerce' ),
+ 'type' => 'object',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ 'properties' => $avatar_properties,
+ );
+ }
+
return $this->add_additional_fields_schema( $schema );
}
+
+ /**
+ * Get the query params for collections.
+ *
+ * @return array
+ */
+ public function get_collection_params() {
+ $params = parent::get_collection_params();
+
+ $params['context']['default'] = 'view';
+
+ $params['after'] = array(
+ 'description' => __( 'Limit response to resources published after a given ISO8601 compliant date.', 'woocommerce' ),
+ 'type' => 'string',
+ 'format' => 'date-time',
+ );
+ $params['before'] = array(
+ 'description' => __( 'Limit response to reviews published before a given ISO8601 compliant date.', 'woocommerce' ),
+ 'type' => 'string',
+ 'format' => 'date-time',
+ );
+ $params['exclude'] = array(
+ 'description' => __( 'Ensure result set excludes specific IDs.', 'woocommerce' ),
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'integer',
+ ),
+ 'default' => array(),
+ );
+ $params['include'] = array(
+ 'description' => __( 'Limit result set to specific IDs.', 'woocommerce' ),
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'integer',
+ ),
+ 'default' => array(),
+ );
+ $params['offset'] = array(
+ 'description' => __( 'Offset the result set by a specific number of items.', 'woocommerce' ),
+ 'type' => 'integer',
+ );
+ $params['order'] = array(
+ 'description' => __( 'Order sort attribute ascending or descending.', 'woocommerce' ),
+ 'type' => 'string',
+ 'default' => 'desc',
+ 'enum' => array(
+ 'asc',
+ 'desc',
+ ),
+ );
+ $params['orderby'] = array(
+ 'description' => __( 'Sort collection by object attribute.', 'woocommerce' ),
+ 'type' => 'string',
+ 'default' => 'date_gmt',
+ 'enum' => array(
+ 'date',
+ 'date_gmt',
+ 'id',
+ 'include',
+ 'product',
+ ),
+ );
+ $params['reviewer'] = array(
+ 'description' => __( 'Limit result set to reviews assigned to specific user IDs.', 'woocommerce' ),
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'integer',
+ ),
+ );
+ $params['reviewer_exclude'] = array(
+ 'description' => __( 'Ensure result set excludes reviews assigned to specific user IDs.', 'woocommerce' ),
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'integer',
+ ),
+ );
+ $params['reviewer_email'] = array(
+ 'default' => null,
+ 'description' => __( 'Limit result set to that from a specific author email.', 'woocommerce' ),
+ 'format' => 'email',
+ 'type' => 'string',
+ );
+ $params['product'] = array(
+ 'default' => array(),
+ 'description' => __( 'Limit result set to reviews assigned to specific product IDs.', 'woocommerce' ),
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'integer',
+ ),
+ );
+ $params['status'] = array(
+ 'default' => 'approved',
+ 'description' => __( 'Limit result set to reviews assigned a specific status.', 'woocommerce' ),
+ 'sanitize_callback' => 'sanitize_key',
+ 'type' => 'string',
+ 'enum' => array(
+ 'all',
+ 'hold',
+ 'approved',
+ 'spam',
+ 'trash',
+ ),
+ );
+
+ /**
+ * Filter collection parameters for the reviews controller.
+ *
+ * This filter registers the collection parameter, but does not map the
+ * collection parameter to an internal WP_Comment_Query parameter. Use the
+ * `wc_rest_review_query` filter to set WP_Comment_Query parameters.
+ *
+ * @since 3.5.0
+ * @param array $params JSON Schema-formatted collection parameters.
+ */
+ return apply_filters( 'woocommerce_rest_product_review_collection_params', $params );
+ }
+
+ /**
+ * Get the reivew, if the ID is valid.
+ *
+ * @since 3.5.0
+ * @param int $id Supplied ID.
+ * @return WP_Comment|WP_Error Comment object if ID is valid, WP_Error otherwise.
+ */
+ protected function get_review( $id ) {
+ $id = (int) $id;
+ $error = new WP_Error( 'woocommerce_rest_review_invalid_id', __( 'Invalid review ID.', 'woocommerce' ), array( 'status' => 404 ) );
+
+ if ( 0 >= $id ) {
+ return $error;
+ }
+
+ $review = get_comment( $id );
+ if ( empty( $review ) ) {
+ return $error;
+ }
+
+ if ( ! empty( $review->comment_post_ID ) ) {
+ $post = get_post( (int) $review->comment_post_ID );
+
+ if ( 'product' !== get_post_type( (int) $review->comment_post_ID ) ) {
+ return new WP_Error( 'woocommerce_rest_product_invalid_id', __( 'Invalid product ID.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+ }
+
+ return $review;
+ }
+
+ /**
+ * Prepends internal property prefix to query parameters to match our response fields.
+ *
+ * @since 3.5.0
+ * @param string $query_param Query parameter.
+ * @return string
+ */
+ protected function normalize_query_param( $query_param ) {
+ $prefix = 'comment_';
+
+ switch ( $query_param ) {
+ case 'id':
+ $normalized = $prefix . 'ID';
+ break;
+ case 'product':
+ $normalized = $prefix . 'post_ID';
+ break;
+ case 'include':
+ $normalized = 'comment__in';
+ break;
+ default:
+ $normalized = $prefix . $query_param;
+ break;
+ }
+
+ return $normalized;
+ }
+
+ /**
+ * Checks comment_approved to set comment status for single comment output.
+ *
+ * @since 3.5.0
+ * @param string|int $comment_approved comment status.
+ * @return string Comment status.
+ */
+ protected function prepare_status_response( $comment_approved ) {
+ switch ( $comment_approved ) {
+ case 'hold':
+ case '0':
+ $status = 'hold';
+ break;
+ case 'approve':
+ case '1':
+ $status = 'approved';
+ break;
+ case 'spam':
+ case 'trash':
+ default:
+ $status = $comment_approved;
+ break;
+ }
+
+ return $status;
+ }
+
+ /**
+ * Sets the comment_status of a given review object when creating or updating a review.
+ *
+ * @since 3.5.0
+ * @param string|int $new_status New review status.
+ * @param int $id Review ID.
+ * @return bool Whether the status was changed.
+ */
+ protected function handle_status_param( $new_status, $id ) {
+ $old_status = wp_get_comment_status( $id );
+
+ if ( $new_status === $old_status ) {
+ return false;
+ }
+
+ switch ( $new_status ) {
+ case 'approved':
+ case 'approve':
+ case '1':
+ $changed = wp_set_comment_status( $id, 'approve' );
+ break;
+ case 'hold':
+ case '0':
+ $changed = wp_set_comment_status( $id, 'hold' );
+ break;
+ case 'spam':
+ $changed = wp_spam_comment( $id );
+ break;
+ case 'unspam':
+ $changed = wp_unspam_comment( $id );
+ break;
+ case 'trash':
+ $changed = wp_trash_comment( $id );
+ break;
+ case 'untrash':
+ $changed = wp_untrash_comment( $id );
+ break;
+ default:
+ $changed = false;
+ break;
+ }
+
+ return $changed;
+ }
}
diff --git a/includes/api/class-wc-rest-product-shipping-classes-controller.php b/includes/api/class-wc-rest-product-shipping-classes-controller.php
index daf3d1befc5..3a3aa7c0444 100644
--- a/includes/api/class-wc-rest-product-shipping-classes-controller.php
+++ b/includes/api/class-wc-rest-product-shipping-classes-controller.php
@@ -14,14 +14,14 @@ defined( 'ABSPATH' ) || exit;
* REST API Product Shipping Classes controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Product_Shipping_Classes_V1_Controller
+ * @extends WC_REST_Product_Shipping_Classes_V2_Controller
*/
-class WC_REST_Product_Shipping_Classes_Controller extends WC_REST_Product_Shipping_Classes_V1_Controller {
+class WC_REST_Product_Shipping_Classes_Controller extends WC_REST_Product_Shipping_Classes_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
+ protected $namespace = 'wc/v3';
}
diff --git a/includes/api/class-wc-rest-product-tags-controller.php b/includes/api/class-wc-rest-product-tags-controller.php
index 1110ada41de..121808721be 100644
--- a/includes/api/class-wc-rest-product-tags-controller.php
+++ b/includes/api/class-wc-rest-product-tags-controller.php
@@ -14,14 +14,14 @@ defined( 'ABSPATH' ) || exit;
* REST API Product Tags controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Product_Tags_V1_Controller
+ * @extends WC_REST_Product_Tags_V2_Controller
*/
-class WC_REST_Product_Tags_Controller extends WC_REST_Product_Tags_V1_Controller {
+class WC_REST_Product_Tags_Controller extends WC_REST_Product_Tags_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
+ protected $namespace = 'wc/v3';
}
diff --git a/includes/api/class-wc-rest-product-variations-controller.php b/includes/api/class-wc-rest-product-variations-controller.php
index f196b0e9497..f478269b48b 100644
--- a/includes/api/class-wc-rest-product-variations-controller.php
+++ b/includes/api/class-wc-rest-product-variations-controller.php
@@ -14,166 +14,20 @@ defined( 'ABSPATH' ) || exit;
* REST API variations controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Products_Controller
+ * @extends WC_REST_Product_Variations_V2_Controller
*/
-class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller {
+class WC_REST_Product_Variations_Controller extends WC_REST_Product_Variations_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
-
- /**
- * Route base.
- *
- * @var string
- */
- protected $rest_base = 'products/(?P[\d]+)/variations';
-
- /**
- * Post type.
- *
- * @var string
- */
- protected $post_type = 'product_variation';
-
- /**
- * Initialize product actions (parent).
- */
- public function __construct() {
- add_filter( "woocommerce_rest_{$this->post_type}_query", array( $this, 'add_product_id' ), 9, 2 );
- parent::__construct();
- }
-
- /**
- * Register the routes for products.
- */
- public function register_routes() {
- register_rest_route(
- $this->namespace, '/' . $this->rest_base, array(
- 'args' => array(
- 'product_id' => array(
- 'description' => __( 'Unique identifier for the variable product.', 'woocommerce' ),
- 'type' => 'integer',
- ),
- ),
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_items' ),
- 'permission_callback' => array( $this, 'get_items_permissions_check' ),
- 'args' => $this->get_collection_params(),
- ),
- array(
- 'methods' => WP_REST_Server::CREATABLE,
- 'callback' => array( $this, 'create_item' ),
- 'permission_callback' => array( $this, 'create_item_permissions_check' ),
- 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
- register_rest_route(
- $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array(
- 'args' => array(
- 'product_id' => array(
- 'description' => __( 'Unique identifier for the variable product.', 'woocommerce' ),
- 'type' => 'integer',
- ),
- 'id' => array(
- 'description' => __( 'Unique identifier for the variation.', 'woocommerce' ),
- 'type' => 'integer',
- ),
- ),
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_item' ),
- 'permission_callback' => array( $this, 'get_item_permissions_check' ),
- 'args' => array(
- 'context' => $this->get_context_param(
- array(
- 'default' => 'view',
- )
- ),
- ),
- ),
- array(
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => array( $this, 'update_item' ),
- 'permission_callback' => array( $this, 'update_item_permissions_check' ),
- 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
- ),
- array(
- 'methods' => WP_REST_Server::DELETABLE,
- 'callback' => array( $this, 'delete_item' ),
- 'permission_callback' => array( $this, 'delete_item_permissions_check' ),
- 'args' => array(
- 'force' => array(
- 'default' => false,
- 'type' => 'boolean',
- 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ),
- ),
- ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
- register_rest_route(
- $this->namespace, '/' . $this->rest_base . '/batch', array(
- 'args' => array(
- 'product_id' => array(
- 'description' => __( 'Unique identifier for the variable product.', 'woocommerce' ),
- 'type' => 'integer',
- ),
- ),
- array(
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => array( $this, 'batch_items' ),
- 'permission_callback' => array( $this, 'batch_items_permissions_check' ),
- 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
- ),
- 'schema' => array( $this, 'get_public_batch_schema' ),
- )
- );
- }
-
- /**
- * Get object.
- *
- * @since 3.0.0
- * @param int $id Object ID.
- * @return WC_Data
- */
- protected function get_object( $id ) {
- return wc_get_product( $id );
- }
-
- /**
- * Check if a given request has access to update an item.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_Error|boolean
- */
- public function update_item_permissions_check( $request ) {
- $object = $this->get_object( (int) $request['id'] );
-
- if ( $object && 0 !== $object->get_id() && ! wc_rest_check_post_permissions( $this->post_type, 'edit', $object->get_id() ) ) {
- return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you are not allowed to edit this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
- }
-
- // Check if variation belongs to the correct parent product.
- if ( $object && 0 !== $object->get_parent_id() && absint( $request['product_id'] ) !== $object->get_parent_id() ) {
- return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Parent product does not match current variation.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
- }
-
- return true;
- }
+ protected $namespace = 'wc/v3';
/**
* Prepare a single variation output for response.
*
- * @since 3.0.0
* @param WC_Data $object Object data.
* @param WP_REST_Request $request Request object.
* @return WP_REST_Response
@@ -196,7 +50,7 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller
'date_on_sale_to' => wc_rest_prepare_date_response( $object->get_date_on_sale_to(), false ),
'date_on_sale_to_gmt' => wc_rest_prepare_date_response( $object->get_date_on_sale_to() ),
'on_sale' => $object->is_on_sale(),
- 'visible' => $object->is_visible(),
+ 'status' => $object->get_status(),
'purchasable' => $object->is_purchasable(),
'virtual' => $object->is_virtual(),
'downloadable' => $object->is_downloadable(),
@@ -207,7 +61,7 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller
'tax_class' => $object->get_tax_class(),
'manage_stock' => $object->managing_stock(),
'stock_quantity' => $object->get_stock_quantity(),
- 'in_stock' => $object->is_in_stock(),
+ 'stock_status' => $object->get_stock_status(),
'backorders' => $object->get_backorders(),
'backorders_allowed' => $object->backorders_allowed(),
'backordered' => $object->is_on_backorder(),
@@ -219,7 +73,7 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller
),
'shipping_class' => $object->get_shipping_class(),
'shipping_class_id' => $object->get_shipping_class_id(),
- 'image' => current( $this->get_images( $object ) ),
+ 'image' => $this->get_image( $object ),
'attributes' => $this->get_attributes( $object ),
'menu_order' => $object->get_menu_order(),
'meta_data' => $object->get_meta_data(),
@@ -244,81 +98,6 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller
return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request );
}
- /**
- * Prepare objects query.
- *
- * @since 3.0.0
- * @param WP_REST_Request $request Full details about the request.
- * @return array
- */
- protected function prepare_objects_query( $request ) {
- $args = parent::prepare_objects_query( $request );
-
- $args['post_parent'] = $request['product_id'];
- $taxonomies = isset( $args['tax_query'] ) ? $args['tax_query'] : array();
-
- $parent_query = new WC_REST_Products_Controller();
- $parent_request = clone $request;
- $parent_request['include'] = array( $request['product_id'] );
- // Shipping class can be set separately for variations and parent product. Unlike for attributes, the parent
- // does not have all shipping classes of the variations assigned to it, so the parent filtering should ignore
- // shipping class.
- $parent_request['shipping_class'] = '';
- $query_args = $parent_query->prepare_objects_query( $parent_request );
- $query_results = $parent_query->get_objects( $query_args );
-
- // In case the parent does not fulfil the constraints, no variations should be returned.
- if ( 0 === $query_results['total'] ) {
- $args['post_parent'] = 0;
- }
-
- // Ignore taxonomy queries, as they were already matched against parent (or will be transformed to meta query
- // later on).
- unset( $args['tax_query'] );
-
- $GLOBALS['wpdb']->query( 'SET SESSION SQL_BIG_SELECTS=1' );
- // Attributes needs to be transformed to meta query, shipping class to taxonomy.
- foreach ( $taxonomies as $taxonomy ) {
- // Ignore taxonomies tied to parent product.
- if ( in_array( $taxonomy['taxonomy'], array( 'product_type', 'product_visibility', 'product_cat', 'product_tag' ), true ) ) {
- continue;
- }
- // Shipping class can be associated with either the parent or the individual variation.
- if ( 'product_shipping_class' === $taxonomy['taxonomy'] ) {
- // If requested shipping class is different from parent's shipping class, it's assigned to variation,
- // so passing the taxonomy query forward to check against variations.
- if ( $query_results['total'] > 0 && $taxonomy['terms'][0] !== $query_results['objects'][0]->get_shipping_class_id() ) {
- $args['tax_query'][] = $taxonomy;
- continue;
- } else {
- // In case the request should to return variations with shipping class equal to parent's shipping class,
- // there are no records in taxonomy relationship table.
- $args['tax_query'][] = array(
- 'taxonomy' => 'product_shipping_class',
- 'operator' => 'NOT EXISTS',
- );
- continue;
- }
- }
-
- // Attributes switched to meta query.
- if ( 'term_id' === $taxonomy['field'] ) {
- $terms = wc_get_product_terms( $request['product_id'], $taxonomy['taxonomy'], array( 'fields' => 'slugs' ) );
- $value = isset( $terms[ $taxonomy['terms'][0] ] ) ? $terms[ $taxonomy['terms'][0] ] : null;
- } else {
- $value = $taxonomy['terms'][0];
- }
- $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok.
- $args, array(
- 'key' => 'attribute_' . $taxonomy['taxonomy'],
- 'value' => $value,
- )
- );
- }
-
- return $args;
- }
-
/**
* Prepare a single variation for create or update.
*
@@ -333,14 +112,11 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller
$variation = new WC_Product_Variation();
}
- // Update parent ID just once.
- if ( 0 === $variation->get_parent_id() ) {
- $variation->set_parent_id( absint( $request['product_id'] ) );
- }
+ $variation->set_parent_id( absint( $request['product_id'] ) );
// Status.
- if ( isset( $request['visible'] ) ) {
- $variation->set_status( false === $request['visible'] ? 'private' : 'publish' );
+ if ( isset( $request['status'] ) ) {
+ $variation->set_status( get_post_status_object( $request['status'] ) ? $request['status'] : 'draft' );
}
// SKU.
@@ -350,13 +126,8 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller
// Thumbnail.
if ( isset( $request['image'] ) ) {
- if ( is_array( $request['image'] ) && ! empty( $request['image'] ) ) {
- $image = $request['image'];
- if ( is_array( $image ) ) {
- $image['position'] = 0;
- }
-
- $variation = $this->set_product_images( $variation, array( $image ) );
+ if ( is_array( $request['image'] ) ) {
+ $variation = $this->set_variation_image( $variation, $request['image'] );
} else {
$variation->set_image_id( '' );
}
@@ -395,15 +166,11 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller
// Stock handling.
if ( isset( $request['manage_stock'] ) ) {
- if ( 'parent' === $request['manage_stock'] ) {
- $variation->set_manage_stock( false ); // This just indicates the variation does not manage stock, but the parent does.
- } else {
- $variation->set_manage_stock( wc_string_to_bool( $request['manage_stock'] ) );
- }
+ $variation->set_manage_stock( $request['manage_stock'] );
}
- if ( isset( $request['in_stock'] ) ) {
- $variation->set_stock_status( true === $request['in_stock'] ? 'instock' : 'outofstock' );
+ if ( isset( $request['stock_status'] ) ) {
+ $variation->set_stock_status( $request['stock_status'] );
}
if ( isset( $request['backorders'] ) ) {
@@ -481,18 +248,16 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller
// Check ID for global attributes or name for product attributes.
if ( ! empty( $attribute['id'] ) ) {
- $attribute_id = absint( $attribute['id'] );
- $raw_attribute_name = wc_attribute_taxonomy_name_by_id( $attribute_id );
+ $attribute_id = absint( $attribute['id'] );
+ $attribute_name = wc_attribute_taxonomy_name_by_id( $attribute_id );
} elseif ( ! empty( $attribute['name'] ) ) {
- $raw_attribute_name = sanitize_title( $attribute['name'] );
+ $attribute_name = sanitize_title( $attribute['name'] );
}
- if ( ! $attribute_id && ! $raw_attribute_name ) {
+ if ( ! $attribute_id && ! $attribute_name ) {
continue;
}
- $attribute_name = sanitize_title( $raw_attribute_name );
-
if ( ! isset( $parent_attributes[ $attribute_name ] ) || ! $parent_attributes[ $attribute_name ]->get_variation() ) {
continue;
}
@@ -502,7 +267,7 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller
if ( $parent_attributes[ $attribute_name ]->is_taxonomy() ) {
// If dealing with a taxonomy, we need to get the slug from the name posted to the API.
- $term = get_term_by( 'name', $attribute_value, $raw_attribute_name ); // @codingStandardsIgnoreLine
+ $term = get_term_by( 'name', $attribute_value, $attribute_name );
if ( $term && ! is_wp_error( $term ) ) {
$attribute_value = $term->slug;
@@ -543,171 +308,87 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller
}
/**
- * Clear caches here so in sync with any new variations.
+ * Get the image for a product variation.
*
- * @param WC_Data $object Object data.
+ * @param WC_Product_Variation $variation Variation data.
+ * @return array
*/
- public function clear_transients( $object ) {
- wc_delete_product_transients( $object->get_parent_id() );
- wp_cache_delete( 'product-' . $object->get_parent_id(), 'products' );
+ protected function get_image( $variation ) {
+ if ( ! $variation->get_image_id() ) {
+ return;
+ }
+
+ $attachment_id = $variation->get_image_id();
+ $attachment_post = get_post( $attachment_id );
+ if ( is_null( $attachment_post ) ) {
+ return;
+ }
+
+ $attachment = wp_get_attachment_image_src( $attachment_id, 'full' );
+ if ( ! is_array( $attachment ) ) {
+ return;
+ }
+
+ if ( ! isset( $image ) ) {
+ return array(
+ 'id' => (int) $attachment_id,
+ 'date_created' => wc_rest_prepare_date_response( $attachment_post->post_date, false ),
+ 'date_created_gmt' => wc_rest_prepare_date_response( strtotime( $attachment_post->post_date_gmt ) ),
+ 'date_modified' => wc_rest_prepare_date_response( $attachment_post->post_modified, false ),
+ 'date_modified_gmt' => wc_rest_prepare_date_response( strtotime( $attachment_post->post_modified_gmt ) ),
+ 'src' => current( $attachment ),
+ 'name' => get_the_title( $attachment_id ),
+ 'alt' => get_post_meta( $attachment_id, '_wp_attachment_image_alt', true ),
+ );
+ }
}
/**
- * Delete a variation.
+ * Set variation image.
*
- * @param WP_REST_Request $request Full details about the request.
- *
- * @return bool|WP_Error|WP_REST_Response
+ * @throws WC_REST_Exception REST API exceptions.
+ * @param WC_Product_Variation $variation Variation instance.
+ * @param array $image Image data.
+ * @return WC_Product_Variation
*/
- public function delete_item( $request ) {
- $force = (bool) $request['force'];
- $object = $this->get_object( (int) $request['id'] );
- $result = false;
+ protected function set_variation_image( $variation, $image ) {
+ $attachment_id = isset( $image['id'] ) ? absint( $image['id'] ) : 0;
- if ( ! $object || 0 === $object->get_id() ) {
- return new WP_Error(
- "woocommerce_rest_{$this->post_type}_invalid_id", __( 'Invalid ID.', 'woocommerce' ), array(
- 'status' => 404,
- )
- );
- }
+ if ( 0 === $attachment_id && isset( $image['src'] ) ) {
+ $upload = wc_rest_upload_image_from_url( esc_url_raw( $image['src'] ) );
- $supports_trash = EMPTY_TRASH_DAYS > 0 && is_callable( array( $object, 'get_status' ) );
-
- /**
- * Filter whether an object is trashable.
- *
- * Return false to disable trash support for the object.
- *
- * @param boolean $supports_trash Whether the object type support trashing.
- * @param WC_Data $object The object being considered for trashing support.
- */
- $supports_trash = apply_filters( "woocommerce_rest_{$this->post_type}_object_trashable", $supports_trash, $object );
-
- if ( ! wc_rest_check_post_permissions( $this->post_type, 'delete', $object->get_id() ) ) {
- return new WP_Error(
- /* translators: %s: post type */
- "woocommerce_rest_user_cannot_delete_{$this->post_type}", sprintf( __( 'Sorry, you are not allowed to delete %s.', 'woocommerce' ), $this->post_type ), array(
- 'status' => rest_authorization_required_code(),
- )
- );
- }
-
- $request->set_param( 'context', 'edit' );
- $response = $this->prepare_object_for_response( $object, $request );
-
- // If we're forcing, then delete permanently.
- if ( $force ) {
- $object->delete( true );
- $result = 0 === $object->get_id();
- } else {
- // If we don't support trashing for this type, error out.
- if ( ! $supports_trash ) {
- return new WP_Error(
- /* translators: %s: post type */
- 'woocommerce_rest_trash_not_supported', sprintf( __( 'The %s does not support trashing.', 'woocommerce' ), $this->post_type ), array(
- 'status' => 501,
- )
- );
- }
-
- // Otherwise, only trash if we haven't already.
- if ( is_callable( array( $object, 'get_status' ) ) ) {
- if ( 'trash' === $object->get_status() ) {
- return new WP_Error(
- /* translators: %s: post type */
- 'woocommerce_rest_already_trashed', sprintf( __( 'The %s has already been deleted.', 'woocommerce' ), $this->post_type ), array(
- 'status' => 410,
- )
- );
+ if ( is_wp_error( $upload ) ) {
+ if ( ! apply_filters( 'woocommerce_rest_suppress_image_upload_error', false, $upload, $variation->get_id(), array( $image ) ) ) {
+ throw new WC_REST_Exception( 'woocommerce_variation_image_upload_error', $upload->get_error_message(), 400 );
}
-
- $object->delete();
- $result = 'trash' === $object->get_status();
}
+
+ $attachment_id = wc_rest_set_uploaded_image_as_attachment( $upload, $variation->get_id() );
}
- if ( ! $result ) {
- return new WP_Error(
- /* translators: %s: post type */
- 'woocommerce_rest_cannot_delete', sprintf( __( 'The %s cannot be deleted.', 'woocommerce' ), $this->post_type ), array(
- 'status' => 500,
+ if ( ! wp_attachment_is_image( $attachment_id ) ) {
+ /* translators: %s: attachment ID */
+ throw new WC_REST_Exception( 'woocommerce_variation_invalid_image_id', sprintf( __( '#%s is an invalid image ID.', 'woocommerce' ), $attachment_id ), 400 );
+ }
+
+ $variation->set_image_id( $attachment_id );
+
+ // Set the image alt if present.
+ if ( ! empty( $image['alt'] ) ) {
+ update_post_meta( $attachment_id, '_wp_attachment_image_alt', wc_clean( $image['alt'] ) );
+ }
+
+ // Set the image name if present.
+ if ( ! empty( $image['name'] ) ) {
+ wp_update_post(
+ array(
+ 'ID' => $attachment_id,
+ 'post_title' => $image['name'],
)
);
}
- // Delete parent product transients.
- if ( 0 !== $object->get_parent_id() ) {
- wc_delete_product_transients( $object->get_parent_id() );
- }
-
- /**
- * Fires after a single object is deleted or trashed via the REST API.
- *
- * @param WC_Data $object The deleted or trashed object.
- * @param WP_REST_Response $response The response data.
- * @param WP_REST_Request $request The request sent to the API.
- */
- do_action( "woocommerce_rest_delete_{$this->post_type}_object", $object, $response, $request );
-
- return $response;
- }
-
- /**
- * Bulk create, update and delete items.
- *
- * @since 3.0.0
- * @param WP_REST_Request $request Full details about the request.
- * @return array Of WP_Error or WP_REST_Response.
- */
- public function batch_items( $request ) {
- $items = array_filter( $request->get_params() );
- $params = $request->get_url_params();
- $product_id = $params['product_id'];
- $body_params = array();
-
- foreach ( array( 'update', 'create', 'delete' ) as $batch_type ) {
- if ( ! empty( $items[ $batch_type ] ) ) {
- $injected_items = array();
- foreach ( $items[ $batch_type ] as $item ) {
- $injected_items[] = is_array( $item ) ? array_merge(
- array(
- 'product_id' => $product_id,
- ), $item
- ) : $item;
- }
- $body_params[ $batch_type ] = $injected_items;
- }
- }
-
- $request = new WP_REST_Request( $request->get_method() );
- $request->set_body_params( $body_params );
-
- return parent::batch_items( $request );
- }
-
- /**
- * Prepare links for the request.
- *
- * @param WC_Data $object Object data.
- * @param WP_REST_Request $request Request object.
- * @return array Links for the given post.
- */
- protected function prepare_links( $object, $request ) {
- $product_id = (int) $request['product_id'];
- $base = str_replace( '(?P[\d]+)', $product_id, $this->rest_base );
- $links = array(
- 'self' => array(
- 'href' => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $base, $object->get_id() ) ),
- ),
- 'collection' => array(
- 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $base ) ),
- ),
- 'up' => array(
- 'href' => rest_url( sprintf( '/%s/products/%d', $this->namespace, $product_id ) ),
- ),
- );
- return $links;
+ return $variation;
}
/**
@@ -790,7 +471,7 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller
'context' => array( 'view', 'edit' ),
),
'date_on_sale_to_gmt' => array(
- 'description' => __( 'End date of sale price, as GMT.', 'woocommerce' ),
+ 'description' => __( "End date of sale price, in the site's timezone.", 'woocommerce' ),
'type' => 'date-time',
'context' => array( 'view', 'edit' ),
),
@@ -800,10 +481,11 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller
'context' => array( 'view', 'edit' ),
'readonly' => true,
),
- 'visible' => array(
- 'description' => __( "Define if the variation is visible on the product's page.", 'woocommerce' ),
- 'type' => 'boolean',
- 'default' => true,
+ 'status' => array(
+ 'description' => __( 'Variation status.', 'woocommerce' ),
+ 'type' => 'string',
+ 'default' => 'publish',
+ 'enum' => array_keys( get_post_statuses() ),
'context' => array( 'view', 'edit' ),
),
'purchasable' => array(
@@ -832,10 +514,9 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller
'type' => 'object',
'properties' => array(
'id' => array(
- 'description' => __( 'File MD5 hash.', 'woocommerce' ),
+ 'description' => __( 'File ID.', 'woocommerce' ),
'type' => 'string',
'context' => array( 'view', 'edit' ),
- 'readonly' => true,
),
'name' => array(
'description' => __( 'File name.', 'woocommerce' ),
@@ -876,7 +557,7 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller
),
'manage_stock' => array(
'description' => __( 'Stock management at variation level.', 'woocommerce' ),
- 'type' => 'mixed',
+ 'type' => 'boolean',
'default' => false,
'context' => array( 'view', 'edit' ),
),
@@ -885,10 +566,11 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller
'type' => 'integer',
'context' => array( 'view', 'edit' ),
),
- 'in_stock' => array(
- 'description' => __( 'Controls whether or not the variation is listed as "in stock" or "out of stock" on the frontend.', 'woocommerce' ),
- 'type' => 'boolean',
- 'default' => true,
+ 'stock_status' => array(
+ 'description' => __( 'Controls the stock status of the product.', 'woocommerce' ),
+ 'type' => 'string',
+ 'default' => 'instock',
+ 'enum' => array_keys( wc_get_product_stock_status_options() ),
'context' => array( 'view', 'edit' ),
),
'backorders' => array(
@@ -1002,11 +684,6 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller
'type' => 'string',
'context' => array( 'view', 'edit' ),
),
- 'position' => array(
- 'description' => __( 'Image position. 0 means that the image is featured.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- ),
),
),
'attributes' => array(
@@ -1067,7 +744,160 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller
),
),
);
-
return $this->add_additional_fields_schema( $schema );
}
+
+ /**
+ * Prepare objects query.
+ *
+ * @since 3.0.0
+ * @param WP_REST_Request $request Full details about the request.
+ * @return array
+ */
+ protected function prepare_objects_query( $request ) {
+ $args = WC_REST_CRUD_Controller::prepare_objects_query( $request );
+
+ // Set post_status.
+ $args['post_status'] = $request['status'];
+
+ // Taxonomy query to filter products by type, category,
+ // tag, shipping class, and attribute.
+ $tax_query = array();
+
+ // Map between taxonomy name and arg's key.
+ $taxonomies = array(
+ 'product_cat' => 'category',
+ 'product_tag' => 'tag',
+ 'product_shipping_class' => 'shipping_class',
+ );
+
+ // Set tax_query for each passed arg.
+ foreach ( $taxonomies as $taxonomy => $key ) {
+ if ( ! empty( $request[ $key ] ) ) {
+ $tax_query[] = array(
+ 'taxonomy' => $taxonomy,
+ 'field' => 'term_id',
+ 'terms' => $request[ $key ],
+ );
+ }
+ }
+
+ // Filter product type by slug.
+ if ( ! empty( $request['type'] ) ) {
+ $tax_query[] = array(
+ 'taxonomy' => 'product_type',
+ 'field' => 'slug',
+ 'terms' => $request['type'],
+ );
+ }
+
+ // Filter by attribute and term.
+ if ( ! empty( $request['attribute'] ) && ! empty( $request['attribute_term'] ) ) {
+ if ( in_array( $request['attribute'], wc_get_attribute_taxonomy_names(), true ) ) {
+ $tax_query[] = array(
+ 'taxonomy' => $request['attribute'],
+ 'field' => 'term_id',
+ 'terms' => $request['attribute_term'],
+ );
+ }
+ }
+
+ if ( ! empty( $tax_query ) ) {
+ $args['tax_query'] = $tax_query; // WPCS: slow query ok.
+ }
+
+ // Filter featured.
+ if ( is_bool( $request['featured'] ) ) {
+ $args['tax_query'][] = array(
+ 'taxonomy' => 'product_visibility',
+ 'field' => 'name',
+ 'terms' => 'featured',
+ 'operator' => true === $request['featured'] ? 'IN' : 'NOT IN',
+ );
+ }
+
+ // Filter by sku.
+ if ( ! empty( $request['sku'] ) ) {
+ $skus = explode( ',', $request['sku'] );
+ // Include the current string as a SKU too.
+ if ( 1 < count( $skus ) ) {
+ $skus[] = $request['sku'];
+ }
+
+ $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok.
+ $args, array(
+ 'key' => '_sku',
+ 'value' => $skus,
+ 'compare' => 'IN',
+ )
+ );
+ }
+
+ // Filter by tax class.
+ if ( ! empty( $request['tax_class'] ) ) {
+ $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok.
+ $args, array(
+ 'key' => '_tax_class',
+ 'value' => 'standard' !== $request['tax_class'] ? $request['tax_class'] : '',
+ )
+ );
+ }
+
+ // Price filter.
+ if ( ! empty( $request['min_price'] ) || ! empty( $request['max_price'] ) ) {
+ $args['meta_query'] = $this->add_meta_query( $args, wc_get_min_max_price_meta_query( $request ) ); // WPCS: slow query ok.
+ }
+
+ // Filter product based on stock_status.
+ if ( ! empty( $request['stock_status'] ) ) {
+ $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok.
+ $args, array(
+ 'key' => '_stock_status',
+ 'value' => $request['stock_status'],
+ )
+ );
+ }
+
+ // Filter by on sale products.
+ if ( is_bool( $request['on_sale'] ) ) {
+ $on_sale_key = $request['on_sale'] ? 'post__in' : 'post__not_in';
+ $on_sale_ids = wc_get_product_ids_on_sale();
+
+ // Use 0 when there's no on sale products to avoid return all products.
+ $on_sale_ids = empty( $on_sale_ids ) ? array( 0 ) : $on_sale_ids;
+
+ $args[ $on_sale_key ] += $on_sale_ids;
+ }
+
+ // Force the post_type argument, since it's not a user input variable.
+ if ( ! empty( $request['sku'] ) ) {
+ $args['post_type'] = array( 'product', 'product_variation' );
+ } else {
+ $args['post_type'] = $this->post_type;
+ }
+
+ $args['post_parent'] = $request['product_id'];
+
+ return $args;
+ }
+
+ /**
+ * Get the query params for collections of attachments.
+ *
+ * @return array
+ */
+ public function get_collection_params() {
+ $params = parent::get_collection_params();
+
+ unset( $params['in_stock'] );
+ $params['stock_status'] = array(
+ 'description' => __( 'Limit result set to products with specified stock status.', 'woocommerce' ),
+ 'type' => 'string',
+ 'enum' => array_keys( wc_get_product_stock_status_options() ),
+ 'sanitize_callback' => 'sanitize_text_field',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+
+ return $params;
+ }
}
diff --git a/includes/api/class-wc-rest-products-controller.php b/includes/api/class-wc-rest-products-controller.php
index 96cf07afe59..bfbd88115bb 100644
--- a/includes/api/class-wc-rest-products-controller.php
+++ b/includes/api/class-wc-rest-products-controller.php
@@ -14,182 +14,71 @@ defined( 'ABSPATH' ) || exit;
* REST API Products controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_CRUD_Controller
+ * @extends WC_REST_Products_V2_Controller
*/
-class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller {
+class WC_REST_Products_Controller extends WC_REST_Products_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
+ protected $namespace = 'wc/v3';
/**
- * Route base.
+ * Get the images for a product or product variation.
*
- * @var string
+ * @param WC_Product|WC_Product_Variation $product Product instance.
+ * @return array
*/
- protected $rest_base = 'products';
+ protected function get_images( $product ) {
+ $images = array();
+ $attachment_ids = array();
- /**
- * Post type.
- *
- * @var string
- */
- protected $post_type = 'product';
-
- /**
- * If object is hierarchical.
- *
- * @var bool
- */
- protected $hierarchical = true;
-
- /**
- * Initialize product actions.
- */
- public function __construct() {
- add_action( "woocommerce_rest_insert_{$this->post_type}_object", array( $this, 'clear_transients' ) );
- }
-
- /**
- * Register the routes for products.
- */
- public function register_routes() {
- register_rest_route(
- $this->namespace, '/' . $this->rest_base, array(
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_items' ),
- 'permission_callback' => array( $this, 'get_items_permissions_check' ),
- 'args' => $this->get_collection_params(),
- ),
- array(
- 'methods' => WP_REST_Server::CREATABLE,
- 'callback' => array( $this, 'create_item' ),
- 'permission_callback' => array( $this, 'create_item_permissions_check' ),
- 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
-
- register_rest_route(
- $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array(
- 'args' => array(
- 'id' => array(
- 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
- 'type' => 'integer',
- ),
- ),
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_item' ),
- 'permission_callback' => array( $this, 'get_item_permissions_check' ),
- 'args' => array(
- 'context' => $this->get_context_param(
- array(
- 'default' => 'view',
- )
- ),
- ),
- ),
- array(
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => array( $this, 'update_item' ),
- 'permission_callback' => array( $this, 'update_item_permissions_check' ),
- 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
- ),
- array(
- 'methods' => WP_REST_Server::DELETABLE,
- 'callback' => array( $this, 'delete_item' ),
- 'permission_callback' => array( $this, 'delete_item_permissions_check' ),
- 'args' => array(
- 'force' => array(
- 'default' => false,
- 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ),
- 'type' => 'boolean',
- ),
- ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
-
- register_rest_route(
- $this->namespace, '/' . $this->rest_base . '/batch', array(
- array(
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => array( $this, 'batch_items' ),
- 'permission_callback' => array( $this, 'batch_items_permissions_check' ),
- 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
- ),
- 'schema' => array( $this, 'get_public_batch_schema' ),
- )
- );
- }
-
- /**
- * Get object.
- *
- * @since 3.0.0
- * @param int $id Object ID.
- * @return WC_Data
- */
- protected function get_object( $id ) {
- return wc_get_product( $id );
- }
-
- /**
- * Prepare a single product output for response.
- *
- * @since 3.0.0
- * @param WC_Data $object Object data.
- * @param WP_REST_Request $request Request object.
- * @return WP_REST_Response
- */
- public function prepare_object_for_response( $object, $request ) {
- $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
- $data = $this->get_product_data( $object, $context );
-
- // Add variations to variable products.
- if ( $object->is_type( 'variable' ) && $object->has_child() ) {
- $data['variations'] = $object->get_children();
+ // Add featured image.
+ if ( $product->get_image_id() ) {
+ $attachment_ids[] = $product->get_image_id();
}
- // Add grouped products data.
- if ( $object->is_type( 'grouped' ) && $object->has_child() ) {
- $data['grouped_products'] = $object->get_children();
+ // Add gallery images.
+ $attachment_ids = array_merge( $attachment_ids, $product->get_gallery_image_ids() );
+
+ // Build image data.
+ foreach ( $attachment_ids as $attachment_id ) {
+ $attachment_post = get_post( $attachment_id );
+ if ( is_null( $attachment_post ) ) {
+ continue;
+ }
+
+ $attachment = wp_get_attachment_image_src( $attachment_id, 'full' );
+ if ( ! is_array( $attachment ) ) {
+ continue;
+ }
+
+ $images[] = array(
+ 'id' => (int) $attachment_id,
+ 'date_created' => wc_rest_prepare_date_response( $attachment_post->post_date, false ),
+ 'date_created_gmt' => wc_rest_prepare_date_response( strtotime( $attachment_post->post_date_gmt ) ),
+ 'date_modified' => wc_rest_prepare_date_response( $attachment_post->post_modified, false ),
+ 'date_modified_gmt' => wc_rest_prepare_date_response( strtotime( $attachment_post->post_modified_gmt ) ),
+ 'src' => current( $attachment ),
+ 'name' => get_the_title( $attachment_id ),
+ 'alt' => get_post_meta( $attachment_id, '_wp_attachment_image_alt', true ),
+ );
}
- $data = $this->add_additional_fields_to_object( $data, $request );
- $data = $this->filter_response_by_context( $data, $context );
- $response = rest_ensure_response( $data );
- $response->add_links( $this->prepare_links( $object, $request ) );
-
- /**
- * Filter the data for a response.
- *
- * The dynamic portion of the hook name, $this->post_type,
- * refers to object type being prepared for the response.
- *
- * @param WP_REST_Response $response The response object.
- * @param WC_Data $object Object data.
- * @param WP_REST_Request $request Request object.
- */
- return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request );
+ return $images;
}
/**
- * Prepare objects query.
+ * Make extra product orderby features supported by WooCommerce available to the WC API.
+ * This includes 'price', 'popularity', and 'rating'.
*
- * @since 3.0.0
- * @param WP_REST_Request $request Full details about the request.
+ * @param WP_REST_Request $request Request data.
* @return array
*/
protected function prepare_objects_query( $request ) {
- $args = parent::prepare_objects_query( $request );
+ $args = WC_REST_CRUD_Controller::prepare_objects_query( $request );
// Set post_status.
$args['post_status'] = $request['status'];
@@ -287,12 +176,12 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller {
$args['meta_query'] = $this->add_meta_query( $args, wc_get_min_max_price_meta_query( $request ) ); // WPCS: slow query ok.
}
- // Filter product in stock or out of stock.
- if ( is_bool( $request['in_stock'] ) ) {
+ // Filter product by stock_status.
+ if ( ! empty( $request['stock_status'] ) ) {
$args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok.
$args, array(
'key' => '_stock_status',
- 'value' => true === $request['in_stock'] ? 'instock' : 'outofstock',
+ 'value' => $request['stock_status'],
)
);
}
@@ -315,364 +204,84 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller {
$args['post_type'] = $this->post_type;
}
+ $orderby = $request->get_param( 'orderby' );
+ $order = $request->get_param( 'order' );
+
+ $ordering_args = WC()->query->get_catalog_ordering_args( $orderby, $order );
+ $args['orderby'] = $ordering_args['orderby'];
+ $args['order'] = $ordering_args['order'];
+ if ( $ordering_args['meta_key'] ) {
+ $args['meta_key'] = $ordering_args['meta_key']; // WPCS: slow query ok.
+ }
+
return $args;
}
/**
- * Get the downloads for a product or product variation.
- *
- * @param WC_Product|WC_Product_Variation $product Product instance.
- * @return array
- */
- protected function get_downloads( $product ) {
- $downloads = array();
-
- if ( $product->is_downloadable() ) {
- foreach ( $product->get_downloads() as $file_id => $file ) {
- $downloads[] = array(
- 'id' => $file_id, // MD5 hash.
- 'name' => $file['name'],
- 'file' => $file['file'],
- );
- }
- }
-
- return $downloads;
- }
-
- /**
- * Get taxonomy terms.
- *
- * @param WC_Product $product Product instance.
- * @param string $taxonomy Taxonomy slug.
- * @return array
- */
- protected function get_taxonomy_terms( $product, $taxonomy = 'cat' ) {
- $terms = array();
-
- foreach ( wc_get_object_terms( $product->get_id(), 'product_' . $taxonomy ) as $term ) {
- $terms[] = array(
- 'id' => $term->term_id,
- 'name' => $term->name,
- 'slug' => $term->slug,
- );
- }
-
- return $terms;
- }
-
- /**
- * Get the images for a product or product variation.
- *
- * @param WC_Product|WC_Product_Variation $product Product instance.
- * @return array
- */
- protected function get_images( $product ) {
- $images = array();
- $attachment_ids = array();
-
- // Add featured image.
- if ( has_post_thumbnail( $product->get_id() ) ) {
- $attachment_ids[] = $product->get_image_id();
- }
-
- // Add gallery images.
- $attachment_ids = array_merge( $attachment_ids, $product->get_gallery_image_ids() );
-
- // Build image data.
- foreach ( $attachment_ids as $position => $attachment_id ) {
- $attachment_post = get_post( $attachment_id );
- if ( is_null( $attachment_post ) ) {
- continue;
- }
-
- $attachment = wp_get_attachment_image_src( $attachment_id, 'full' );
- if ( ! is_array( $attachment ) ) {
- continue;
- }
-
- $images[] = array(
- 'id' => (int) $attachment_id,
- 'date_created' => wc_rest_prepare_date_response( $attachment_post->post_date, false ),
- 'date_created_gmt' => wc_rest_prepare_date_response( strtotime( $attachment_post->post_date_gmt ) ),
- 'date_modified' => wc_rest_prepare_date_response( $attachment_post->post_modified, false ),
- 'date_modified_gmt' => wc_rest_prepare_date_response( strtotime( $attachment_post->post_modified_gmt ) ),
- 'src' => current( $attachment ),
- 'name' => get_the_title( $attachment_id ),
- 'alt' => get_post_meta( $attachment_id, '_wp_attachment_image_alt', true ),
- 'position' => (int) $position,
- );
- }
-
- // Set a placeholder image if the product has no images set.
- if ( empty( $images ) ) {
- $images[] = array(
- 'id' => 0,
- 'date_created' => wc_rest_prepare_date_response( current_time( 'mysql' ), false ), // Default to now.
- 'date_created_gmt' => wc_rest_prepare_date_response( current_time( 'timestamp', true ) ), // Default to now.
- 'date_modified' => wc_rest_prepare_date_response( current_time( 'mysql' ), false ),
- 'date_modified_gmt' => wc_rest_prepare_date_response( current_time( 'timestamp', true ) ),
- 'src' => wc_placeholder_img_src(),
- 'name' => __( 'Placeholder', 'woocommerce' ),
- 'alt' => __( 'Placeholder', 'woocommerce' ),
- 'position' => 0,
- );
- }
-
- return $images;
- }
-
- /**
- * Get attribute taxonomy label.
- *
- * @deprecated 3.0.0
- *
- * @param string $name Taxonomy name.
- * @return string
- */
- protected function get_attribute_taxonomy_label( $name ) {
- $tax = get_taxonomy( $name );
- $labels = get_taxonomy_labels( $tax );
-
- return $labels->singular_name;
- }
-
- /**
- * Get product attribute taxonomy name.
- *
- * @since 3.0.0
- * @param string $slug Taxonomy name.
- * @param WC_Product $product Product data.
- * @return string
- */
- protected function get_attribute_taxonomy_name( $slug, $product ) {
- $attributes = $product->get_attributes();
-
- if ( ! isset( $attributes[ $slug ] ) ) {
- return str_replace( 'pa_', '', $slug );
- }
-
- $attribute = $attributes[ $slug ];
-
- // Taxonomy attribute name.
- if ( $attribute->is_taxonomy() ) {
- $taxonomy = $attribute->get_taxonomy_object();
- return $taxonomy->attribute_label;
- }
-
- // Custom product attribute name.
- return $attribute->get_name();
- }
-
- /**
- * Get default attributes.
+ * Set product images.
*
+ * @throws WC_REST_Exception REST API exceptions.
* @param WC_Product $product Product instance.
- * @return array
+ * @param array $images Images data.
+ * @return WC_Product
*/
- protected function get_default_attributes( $product ) {
- $default = array();
+ protected function set_product_images( $product, $images ) {
+ if ( is_array( $images ) ) {
+ $gallery = array();
- if ( $product->is_type( 'variable' ) ) {
- foreach ( array_filter( (array) $product->get_default_attributes(), 'strlen' ) as $key => $value ) {
- if ( 0 === strpos( $key, 'pa_' ) ) {
- $default[] = array(
- 'id' => wc_attribute_taxonomy_id_by_name( $key ),
- 'name' => $this->get_attribute_taxonomy_name( $key, $product ),
- 'option' => $value,
- );
+ foreach ( $images as $index => $image ) {
+ $attachment_id = isset( $image['id'] ) ? absint( $image['id'] ) : 0;
+
+ if ( 0 === $attachment_id && isset( $image['src'] ) ) {
+ $upload = wc_rest_upload_image_from_url( esc_url_raw( $image['src'] ) );
+
+ if ( is_wp_error( $upload ) ) {
+ if ( ! apply_filters( 'woocommerce_rest_suppress_image_upload_error', false, $upload, $product->get_id(), $images ) ) {
+ throw new WC_REST_Exception( 'woocommerce_product_image_upload_error', $upload->get_error_message(), 400 );
+ } else {
+ continue;
+ }
+ }
+
+ $attachment_id = wc_rest_set_uploaded_image_as_attachment( $upload, $product->get_id() );
+ }
+
+ if ( ! wp_attachment_is_image( $attachment_id ) ) {
+ /* translators: %s: image ID */
+ throw new WC_REST_Exception( 'woocommerce_product_invalid_image_id', sprintf( __( '#%s is an invalid image ID.', 'woocommerce' ), $attachment_id ), 400 );
+ }
+
+ $featured_image = $product->get_image_id();
+
+ if ( 0 === $index ) {
+ $product->set_image_id( $attachment_id );
} else {
- $default[] = array(
- 'id' => 0,
- 'name' => $this->get_attribute_taxonomy_name( $key, $product ),
- 'option' => $value,
+ $gallery[] = $attachment_id;
+ }
+
+ // Set the image alt if present.
+ if ( ! empty( $image['alt'] ) ) {
+ update_post_meta( $attachment_id, '_wp_attachment_image_alt', wc_clean( $image['alt'] ) );
+ }
+
+ // Set the image name if present.
+ if ( ! empty( $image['name'] ) ) {
+ wp_update_post(
+ array(
+ 'ID' => $attachment_id,
+ 'post_title' => $image['name'],
+ )
);
}
}
- }
- return $default;
- }
-
- /**
- * Get attribute options.
- *
- * @param int $product_id Product ID.
- * @param array $attribute Attribute data.
- * @return array
- */
- protected function get_attribute_options( $product_id, $attribute ) {
- if ( isset( $attribute['is_taxonomy'] ) && $attribute['is_taxonomy'] ) {
- return wc_get_product_terms(
- $product_id, $attribute['name'], array(
- 'fields' => 'names',
- )
- );
- } elseif ( isset( $attribute['value'] ) ) {
- return array_map( 'trim', explode( '|', $attribute['value'] ) );
- }
-
- return array();
- }
-
- /**
- * Get the attributes for a product or product variation.
- *
- * @param WC_Product|WC_Product_Variation $product Product instance.
- * @return array
- */
- protected function get_attributes( $product ) {
- $attributes = array();
-
- if ( $product->is_type( 'variation' ) ) {
- $_product = wc_get_product( $product->get_parent_id() );
- foreach ( $product->get_variation_attributes() as $attribute_name => $attribute ) {
- $name = str_replace( 'attribute_', '', $attribute_name );
-
- if ( ! $attribute ) {
- continue;
- }
-
- // Taxonomy-based attributes are prefixed with `pa_`, otherwise simply `attribute_`.
- if ( 0 === strpos( $attribute_name, 'attribute_pa_' ) ) {
- $option_term = get_term_by( 'slug', $attribute, $name );
- $attributes[] = array(
- 'id' => wc_attribute_taxonomy_id_by_name( $name ),
- 'name' => $this->get_attribute_taxonomy_name( $name, $_product ),
- 'option' => $option_term && ! is_wp_error( $option_term ) ? $option_term->name : $attribute,
- );
- } else {
- $attributes[] = array(
- 'id' => 0,
- 'name' => $this->get_attribute_taxonomy_name( $name, $_product ),
- 'option' => $attribute,
- );
- }
- }
+ $product->set_gallery_image_ids( $gallery );
} else {
- foreach ( $product->get_attributes() as $attribute ) {
- $attributes[] = array(
- 'id' => $attribute['is_taxonomy'] ? wc_attribute_taxonomy_id_by_name( $attribute['name'] ) : 0,
- 'name' => $this->get_attribute_taxonomy_name( $attribute['name'], $product ),
- 'position' => (int) $attribute['position'],
- 'visible' => (bool) $attribute['is_visible'],
- 'variation' => (bool) $attribute['is_variation'],
- 'options' => $this->get_attribute_options( $product->get_id(), $attribute ),
- );
- }
+ $product->set_image_id( '' );
+ $product->set_gallery_image_ids( array() );
}
- return $attributes;
- }
-
- /**
- * Get product data.
- *
- * @param WC_Product $product Product instance.
- * @param string $context Request context.
- * Options: 'view' and 'edit'.
- * @return array
- */
- protected function get_product_data( $product, $context = 'view' ) {
- $data = array(
- 'id' => $product->get_id(),
- 'name' => $product->get_name( $context ),
- 'slug' => $product->get_slug( $context ),
- 'permalink' => $product->get_permalink(),
- 'date_created' => wc_rest_prepare_date_response( $product->get_date_created( $context ), false ),
- 'date_created_gmt' => wc_rest_prepare_date_response( $product->get_date_created( $context ) ),
- 'date_modified' => wc_rest_prepare_date_response( $product->get_date_modified( $context ), false ),
- 'date_modified_gmt' => wc_rest_prepare_date_response( $product->get_date_modified( $context ) ),
- 'type' => $product->get_type(),
- 'status' => $product->get_status( $context ),
- 'featured' => $product->is_featured(),
- 'catalog_visibility' => $product->get_catalog_visibility( $context ),
- 'description' => 'view' === $context ? wpautop( do_shortcode( $product->get_description() ) ) : $product->get_description( $context ),
- 'short_description' => 'view' === $context ? apply_filters( 'woocommerce_short_description', $product->get_short_description() ) : $product->get_short_description( $context ),
- 'sku' => $product->get_sku( $context ),
- 'price' => $product->get_price( $context ),
- 'regular_price' => $product->get_regular_price( $context ),
- 'sale_price' => $product->get_sale_price( $context ) ? $product->get_sale_price( $context ) : '',
- 'date_on_sale_from' => wc_rest_prepare_date_response( $product->get_date_on_sale_from( $context ), false ),
- 'date_on_sale_from_gmt' => wc_rest_prepare_date_response( $product->get_date_on_sale_from( $context ) ),
- 'date_on_sale_to' => wc_rest_prepare_date_response( $product->get_date_on_sale_to( $context ), false ),
- 'date_on_sale_to_gmt' => wc_rest_prepare_date_response( $product->get_date_on_sale_to( $context ) ),
- 'price_html' => $product->get_price_html(),
- 'on_sale' => $product->is_on_sale( $context ),
- 'purchasable' => $product->is_purchasable(),
- 'total_sales' => $product->get_total_sales( $context ),
- 'virtual' => $product->is_virtual(),
- 'downloadable' => $product->is_downloadable(),
- 'downloads' => $this->get_downloads( $product ),
- 'download_limit' => $product->get_download_limit( $context ),
- 'download_expiry' => $product->get_download_expiry( $context ),
- 'external_url' => $product->is_type( 'external' ) ? $product->get_product_url( $context ) : '',
- 'button_text' => $product->is_type( 'external' ) ? $product->get_button_text( $context ) : '',
- 'tax_status' => $product->get_tax_status( $context ),
- 'tax_class' => $product->get_tax_class( $context ),
- 'manage_stock' => $product->managing_stock(),
- 'stock_quantity' => $product->get_stock_quantity( $context ),
- 'in_stock' => $product->is_in_stock(),
- 'backorders' => $product->get_backorders( $context ),
- 'backorders_allowed' => $product->backorders_allowed(),
- 'backordered' => $product->is_on_backorder(),
- 'sold_individually' => $product->is_sold_individually(),
- 'weight' => $product->get_weight( $context ),
- 'dimensions' => array(
- 'length' => $product->get_length( $context ),
- 'width' => $product->get_width( $context ),
- 'height' => $product->get_height( $context ),
- ),
- 'shipping_required' => $product->needs_shipping(),
- 'shipping_taxable' => $product->is_shipping_taxable(),
- 'shipping_class' => $product->get_shipping_class(),
- 'shipping_class_id' => $product->get_shipping_class_id( $context ),
- 'reviews_allowed' => $product->get_reviews_allowed( $context ),
- 'average_rating' => 'view' === $context ? wc_format_decimal( $product->get_average_rating(), 2 ) : $product->get_average_rating( $context ),
- 'rating_count' => $product->get_rating_count(),
- 'related_ids' => array_map( 'absint', array_values( wc_get_related_products( $product->get_id() ) ) ),
- 'upsell_ids' => array_map( 'absint', $product->get_upsell_ids( $context ) ),
- 'cross_sell_ids' => array_map( 'absint', $product->get_cross_sell_ids( $context ) ),
- 'parent_id' => $product->get_parent_id( $context ),
- 'purchase_note' => 'view' === $context ? wpautop( do_shortcode( wp_kses_post( $product->get_purchase_note() ) ) ) : $product->get_purchase_note( $context ),
- 'categories' => $this->get_taxonomy_terms( $product ),
- 'tags' => $this->get_taxonomy_terms( $product, 'tag' ),
- 'images' => $this->get_images( $product ),
- 'attributes' => $this->get_attributes( $product ),
- 'default_attributes' => $this->get_default_attributes( $product ),
- 'variations' => array(),
- 'grouped_products' => array(),
- 'menu_order' => $product->get_menu_order( $context ),
- 'meta_data' => $product->get_meta_data(),
- );
-
- return $data;
- }
-
- /**
- * Prepare links for the request.
- *
- * @param WC_Data $object Object data.
- * @param WP_REST_Request $request Request object.
- * @return array Links for the given post.
- */
- protected function prepare_links( $object, $request ) {
- $links = array(
- 'self' => array(
- 'href' => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $object->get_id() ) ),
- ),
- 'collection' => array(
- 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
- ),
- );
-
- if ( $object->get_parent_id() ) {
- $links['up'] = array(
- 'href' => rest_url( sprintf( '/%s/products/%d', $this->namespace, $object->get_parent_id() ) ),
- );
- }
-
- return $links;
+ return $product;
}
/**
@@ -892,9 +501,9 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller {
$product->set_sold_individually( $request['sold_individually'] );
}
- // Stock status.
- if ( isset( $request['in_stock'] ) ) {
- $stock_status = true === $request['in_stock'] ? 'instock' : 'outofstock';
+ // Stock status; stock_status has priority over in_stock.
+ if ( isset( $request['stock_status'] ) ) {
+ $stock_status = $request['stock_status'];
} else {
$stock_status = $product->get_stock_status();
}
@@ -1044,6 +653,22 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller {
}
}
+ if ( ! empty( $request['date_created'] ) ) {
+ $date = rest_parse_date( $request['date_created'] );
+
+ if ( $date ) {
+ $product->set_date_created( $date );
+ }
+ }
+
+ if ( ! empty( $request['date_created_gmt'] ) ) {
+ $date = rest_parse_date( $request['date_created_gmt'], true );
+
+ if ( $date ) {
+ $product->set_date_created( $date );
+ }
+ }
+
/**
* Filters an object before it is inserted via the REST API.
*
@@ -1057,378 +682,6 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller {
return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $product, $request, $creating );
}
- /**
- * Set product images.
- *
- * @throws WC_REST_Exception REST API exceptions.
- * @param WC_Product $product Product instance.
- * @param array $images Images data.
- * @return WC_Product
- */
- protected function set_product_images( $product, $images ) {
- $images = is_array( $images ) ? array_filter( $images ) : array();
-
- if ( ! empty( $images ) ) {
- $gallery_positions = array();
-
- foreach ( $images as $index => $image ) {
- $attachment_id = isset( $image['id'] ) ? absint( $image['id'] ) : 0;
-
- if ( 0 === $attachment_id && isset( $image['src'] ) ) {
- $upload = wc_rest_upload_image_from_url( esc_url_raw( $image['src'] ) );
-
- if ( is_wp_error( $upload ) ) {
- if ( ! apply_filters( 'woocommerce_rest_suppress_image_upload_error', false, $upload, $product->get_id(), $images ) ) {
- throw new WC_REST_Exception( 'woocommerce_product_image_upload_error', $upload->get_error_message(), 400 );
- } else {
- continue;
- }
- }
-
- $attachment_id = wc_rest_set_uploaded_image_as_attachment( $upload, $product->get_id() );
- }
-
- if ( ! wp_attachment_is_image( $attachment_id ) ) {
- /* translators: %s: attachment id */
- throw new WC_REST_Exception( 'woocommerce_product_invalid_image_id', sprintf( __( '#%s is an invalid image ID.', 'woocommerce' ), $attachment_id ), 400 );
- }
-
- $gallery_positions[ $attachment_id ] = absint( isset( $image['position'] ) ? $image['position'] : $index );
-
- // Set the image alt if present.
- if ( ! empty( $image['alt'] ) ) {
- update_post_meta( $attachment_id, '_wp_attachment_image_alt', wc_clean( $image['alt'] ) );
- }
-
- // Set the image name if present.
- if ( ! empty( $image['name'] ) ) {
- wp_update_post(
- array(
- 'ID' => $attachment_id,
- 'post_title' => $image['name'],
- )
- );
- }
-
- // Set the image source if present, for future reference.
- if ( ! empty( $image['src'] ) ) {
- update_post_meta( $attachment_id, '_wc_attachment_source', esc_url_raw( $image['src'] ) );
- }
- }
-
- // Sort images and get IDs in correct order.
- asort( $gallery_positions );
-
- // Get gallery in correct order.
- $gallery = array_keys( $gallery_positions );
-
- // Featured image is in position 0.
- $image_id = array_shift( $gallery );
-
- // Set images.
- $product->set_image_id( $image_id );
- $product->set_gallery_image_ids( $gallery );
- } else {
- $product->set_image_id( '' );
- $product->set_gallery_image_ids( array() );
- }
-
- return $product;
- }
-
- /**
- * Save product shipping data.
- *
- * @param WC_Product $product Product instance.
- * @param array $data Shipping data.
- * @return WC_Product
- */
- protected function save_product_shipping_data( $product, $data ) {
- // Virtual.
- if ( isset( $data['virtual'] ) && true === $data['virtual'] ) {
- $product->set_weight( '' );
- $product->set_height( '' );
- $product->set_length( '' );
- $product->set_width( '' );
- } else {
- if ( isset( $data['weight'] ) ) {
- $product->set_weight( $data['weight'] );
- }
-
- // Height.
- if ( isset( $data['dimensions']['height'] ) ) {
- $product->set_height( $data['dimensions']['height'] );
- }
-
- // Width.
- if ( isset( $data['dimensions']['width'] ) ) {
- $product->set_width( $data['dimensions']['width'] );
- }
-
- // Length.
- if ( isset( $data['dimensions']['length'] ) ) {
- $product->set_length( $data['dimensions']['length'] );
- }
- }
-
- // Shipping class.
- if ( isset( $data['shipping_class'] ) ) {
- $data_store = $product->get_data_store();
- $shipping_class_id = $data_store->get_shipping_class_id_by_slug( wc_clean( $data['shipping_class'] ) );
- $product->set_shipping_class_id( $shipping_class_id );
- }
-
- return $product;
- }
-
- /**
- * Save downloadable files.
- *
- * @param WC_Product $product Product instance.
- * @param array $downloads Downloads data.
- * @param int $deprecated Deprecated since 3.0.
- * @return WC_Product
- */
- protected function save_downloadable_files( $product, $downloads, $deprecated = 0 ) {
- if ( $deprecated ) {
- wc_deprecated_argument( 'variation_id', '3.0', 'save_downloadable_files() not requires a variation_id anymore.' );
- }
-
- $files = array();
- foreach ( $downloads as $key => $file ) {
- if ( empty( $file['file'] ) ) {
- continue;
- }
-
- $download = new WC_Product_Download();
- $download->set_id( $file['id'] ? $file['id'] : wp_generate_uuid4() );
- $download->set_name( $file['name'] ? $file['name'] : wc_get_filename_from_url( $file['file'] ) );
- $download->set_file( apply_filters( 'woocommerce_file_download_path', $file['file'], $product, $key ) );
- $files[] = $download;
- }
- $product->set_downloads( $files );
-
- return $product;
- }
-
- /**
- * Save taxonomy terms.
- *
- * @param WC_Product $product Product instance.
- * @param array $terms Terms data.
- * @param string $taxonomy Taxonomy name.
- * @return WC_Product
- */
- protected function save_taxonomy_terms( $product, $terms, $taxonomy = 'cat' ) {
- $term_ids = wp_list_pluck( $terms, 'id' );
-
- if ( 'cat' === $taxonomy ) {
- $product->set_category_ids( $term_ids );
- } elseif ( 'tag' === $taxonomy ) {
- $product->set_tag_ids( $term_ids );
- }
-
- return $product;
- }
-
- /**
- * Save default attributes.
- *
- * @since 3.0.0
- *
- * @param WC_Product $product Product instance.
- * @param WP_REST_Request $request Request data.
- * @return WC_Product
- */
- protected function save_default_attributes( $product, $request ) {
- if ( isset( $request['default_attributes'] ) && is_array( $request['default_attributes'] ) ) {
-
- $attributes = $product->get_attributes();
- $default_attributes = array();
-
- foreach ( $request['default_attributes'] as $attribute ) {
- $attribute_id = 0;
- $attribute_name = '';
-
- // Check ID for global attributes or name for product attributes.
- if ( ! empty( $attribute['id'] ) ) {
- $attribute_id = absint( $attribute['id'] );
- $attribute_name = wc_attribute_taxonomy_name_by_id( $attribute_id );
- } elseif ( ! empty( $attribute['name'] ) ) {
- $attribute_name = sanitize_title( $attribute['name'] );
- }
-
- if ( ! $attribute_id && ! $attribute_name ) {
- continue;
- }
-
- if ( isset( $attributes[ $attribute_name ] ) ) {
- $_attribute = $attributes[ $attribute_name ];
-
- if ( $_attribute['is_variation'] ) {
- $value = isset( $attribute['option'] ) ? wc_clean( stripslashes( $attribute['option'] ) ) : '';
-
- if ( ! empty( $_attribute['is_taxonomy'] ) ) {
- // If dealing with a taxonomy, we need to get the slug from the name posted to the API.
- $term = get_term_by( 'name', $value, $attribute_name );
-
- if ( $term && ! is_wp_error( $term ) ) {
- $value = $term->slug;
- } else {
- $value = sanitize_title( $value );
- }
- }
-
- if ( $value ) {
- $default_attributes[ $attribute_name ] = $value;
- }
- }
- }
- }
-
- $product->set_default_attributes( $default_attributes );
- }
-
- return $product;
- }
-
- /**
- * Clear caches here so in sync with any new variations/children.
- *
- * @param WC_Data $object Object data.
- */
- public function clear_transients( $object ) {
- wc_delete_product_transients( $object->get_id() );
- wp_cache_delete( 'product-' . $object->get_id(), 'products' );
- }
-
- /**
- * Delete a single item.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_REST_Response|WP_Error
- */
- public function delete_item( $request ) {
- $id = (int) $request['id'];
- $force = (bool) $request['force'];
- $object = $this->get_object( (int) $request['id'] );
- $result = false;
-
- if ( ! $object || 0 === $object->get_id() ) {
- return new WP_Error(
- "woocommerce_rest_{$this->post_type}_invalid_id", __( 'Invalid ID.', 'woocommerce' ), array(
- 'status' => 404,
- )
- );
- }
-
- if ( 'variation' === $object->get_type() ) {
- return new WP_Error(
- "woocommerce_rest_invalid_{$this->post_type}_id", __( 'To manipulate product variations you should use the /products/<product_id>/variations/<id> endpoint.', 'woocommerce' ), array(
- 'status' => 404,
- )
- );
- }
-
- $supports_trash = EMPTY_TRASH_DAYS > 0 && is_callable( array( $object, 'get_status' ) );
-
- /**
- * Filter whether an object is trashable.
- *
- * Return false to disable trash support for the object.
- *
- * @param boolean $supports_trash Whether the object type support trashing.
- * @param WC_Data $object The object being considered for trashing support.
- */
- $supports_trash = apply_filters( "woocommerce_rest_{$this->post_type}_object_trashable", $supports_trash, $object );
-
- if ( ! wc_rest_check_post_permissions( $this->post_type, 'delete', $object->get_id() ) ) {
- return new WP_Error(
- /* translators: %s: post type */
- "woocommerce_rest_user_cannot_delete_{$this->post_type}", sprintf( __( 'Sorry, you are not allowed to delete %s.', 'woocommerce' ), $this->post_type ), array(
- 'status' => rest_authorization_required_code(),
- )
- );
- }
-
- $request->set_param( 'context', 'edit' );
- $response = $this->prepare_object_for_response( $object, $request );
-
- // If we're forcing, then delete permanently.
- if ( $force ) {
- if ( $object->is_type( 'variable' ) ) {
- foreach ( $object->get_children() as $child_id ) {
- $child = wc_get_product( $child_id );
- if ( ! empty( $child ) ) {
- $child->delete( true );
- }
- }
- } else {
- // For other product types, if the product has children, remove the relationship.
- foreach ( $object->get_children() as $child_id ) {
- $child = wc_get_product( $child_id );
- if ( ! empty( $child ) ) {
- $child->set_parent_id( 0 );
- $child->save();
- }
- }
- }
-
- $object->delete( true );
- $result = 0 === $object->get_id();
- } else {
- // If we don't support trashing for this type, error out.
- if ( ! $supports_trash ) {
- return new WP_Error(
- /* translators: %s: post type */
- 'woocommerce_rest_trash_not_supported', sprintf( __( 'The %s does not support trashing.', 'woocommerce' ), $this->post_type ), array(
- 'status' => 501,
- )
- );
- }
-
- // Otherwise, only trash if we haven't already.
- if ( is_callable( array( $object, 'get_status' ) ) ) {
- if ( 'trash' === $object->get_status() ) {
- return new WP_Error(
- /* translators: %s: post type */
- 'woocommerce_rest_already_trashed', sprintf( __( 'The %s has already been deleted.', 'woocommerce' ), $this->post_type ), array(
- 'status' => 410,
- )
- );
- }
-
- $object->delete();
- $result = 'trash' === $object->get_status();
- }
- }
-
- if ( ! $result ) {
- return new WP_Error(
- /* translators: %s: post type */
- 'woocommerce_rest_cannot_delete', sprintf( __( 'The %s cannot be deleted.', 'woocommerce' ), $this->post_type ), array(
- 'status' => 500,
- )
- );
- }
-
- // Delete parent product transients.
- if ( 0 !== $object->get_parent_id() ) {
- wc_delete_product_transients( $object->get_parent_id() );
- }
-
- /**
- * Fires after a single object is deleted or trashed via the REST API.
- *
- * @param WC_Data $object The deleted or trashed object.
- * @param WP_REST_Response $response The response data.
- * @param WP_REST_Request $request The request sent to the API.
- */
- do_action( "woocommerce_rest_delete_{$this->post_type}_object", $object, $response, $request );
-
- return $response;
- }
-
/**
* Get the Product's schema, conforming to JSON Schema.
*
@@ -1469,13 +722,11 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller {
'description' => __( "The date the product was created, in the site's timezone.", 'woocommerce' ),
'type' => 'date-time',
'context' => array( 'view', 'edit' ),
- 'readonly' => true,
),
'date_created_gmt' => array(
'description' => __( 'The date the product was created, as GMT.', 'woocommerce' ),
'type' => 'date-time',
'context' => array( 'view', 'edit' ),
- 'readonly' => true,
),
'date_modified' => array(
'description' => __( "The date the product was last modified, in the site's timezone.", 'woocommerce' ),
@@ -1563,7 +814,7 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller {
'context' => array( 'view', 'edit' ),
),
'date_on_sale_to_gmt' => array(
- 'description' => __( 'End date of sale price, as GMT.', 'woocommerce' ),
+ 'description' => __( "End date of sale price, in the site's timezone.", 'woocommerce' ),
'type' => 'date-time',
'context' => array( 'view', 'edit' ),
),
@@ -1611,10 +862,9 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller {
'type' => 'object',
'properties' => array(
'id' => array(
- 'description' => __( 'File MD5 hash.', 'woocommerce' ),
+ 'description' => __( 'File ID.', 'woocommerce' ),
'type' => 'string',
'context' => array( 'view', 'edit' ),
- 'readonly' => true,
),
'name' => array(
'description' => __( 'File name.', 'woocommerce' ),
@@ -1675,10 +925,11 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller {
'type' => 'integer',
'context' => array( 'view', 'edit' ),
),
- 'in_stock' => array(
- 'description' => __( 'Controls whether or not the product is listed as "in stock" or "out of stock" on the frontend.', 'woocommerce' ),
- 'type' => 'boolean',
- 'default' => true,
+ 'stock_status' => array(
+ 'description' => __( 'Controls the stock status of the product.', 'woocommerce' ),
+ 'type' => 'string',
+ 'default' => 'instock',
+ 'enum' => array_keys( wc_get_product_stock_status_options() ),
'context' => array( 'view', 'edit' ),
),
'backorders' => array(
@@ -1756,7 +1007,7 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller {
),
'shipping_class_id' => array(
'description' => __( 'Shipping class ID.', 'woocommerce' ),
- 'type' => 'integer',
+ 'type' => 'string',
'context' => array( 'view', 'edit' ),
'readonly' => true,
),
@@ -1869,7 +1120,7 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller {
),
'images' => array(
'description' => __( 'List of images.', 'woocommerce' ),
- 'type' => 'array',
+ 'type' => 'object',
'context' => array( 'view', 'edit' ),
'items' => array(
'type' => 'object',
@@ -1919,11 +1170,6 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller {
'type' => 'string',
'context' => array( 'view', 'edit' ),
),
- 'position' => array(
- 'description' => __( 'Image position. 0 means that the image is featured.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- ),
),
),
),
@@ -1964,10 +1210,10 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller {
'options' => array(
'description' => __( 'List of available term names of the attribute.', 'woocommerce' ),
'type' => 'array',
- 'context' => array( 'view', 'edit' ),
'items' => array(
'type' => 'string',
),
+ 'context' => array( 'view', 'edit' ),
),
),
),
@@ -2013,6 +1259,7 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller {
'type' => 'integer',
),
'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
),
'menu_order' => array(
'description' => __( 'Menu order, used to custom sort products.', 'woocommerce' ),
@@ -2047,116 +1294,46 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller {
),
),
);
-
return $this->add_additional_fields_schema( $schema );
}
/**
- * Get the query params for collections of attachments.
+ * Add new options for 'orderby' to the collection params.
*
* @return array
*/
public function get_collection_params() {
- $params = parent::get_collection_params();
+ $params = parent::get_collection_params();
+ $params['orderby']['enum'] = array_merge( $params['orderby']['enum'], array( 'price', 'popularity', 'rating' ) );
- $params['slug'] = array(
- 'description' => __( 'Limit result set to products with a specific slug.', 'woocommerce' ),
- 'type' => 'string',
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['status'] = array(
- 'default' => 'any',
- 'description' => __( 'Limit result set to products assigned a specific status.', 'woocommerce' ),
- 'type' => 'string',
- 'enum' => array_merge( array( 'any' ), array_keys( get_post_statuses() ) ),
- 'sanitize_callback' => 'sanitize_key',
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['type'] = array(
- 'description' => __( 'Limit result set to products assigned a specific type.', 'woocommerce' ),
- 'type' => 'string',
- 'enum' => array_keys( wc_get_product_types() ),
- 'sanitize_callback' => 'sanitize_key',
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['sku'] = array(
- 'description' => __( 'Limit result set to products with specific SKU(s). Use commas to separate.', 'woocommerce' ),
- 'type' => 'string',
- 'sanitize_callback' => 'sanitize_text_field',
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['featured'] = array(
- 'description' => __( 'Limit result set to featured products.', 'woocommerce' ),
- 'type' => 'boolean',
- 'sanitize_callback' => 'wc_string_to_bool',
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['category'] = array(
- 'description' => __( 'Limit result set to products assigned a specific category ID.', 'woocommerce' ),
- 'type' => 'string',
- 'sanitize_callback' => 'wp_parse_id_list',
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['tag'] = array(
- 'description' => __( 'Limit result set to products assigned a specific tag ID.', 'woocommerce' ),
- 'type' => 'string',
- 'sanitize_callback' => 'wp_parse_id_list',
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['shipping_class'] = array(
- 'description' => __( 'Limit result set to products assigned a specific shipping class ID.', 'woocommerce' ),
- 'type' => 'string',
- 'sanitize_callback' => 'wp_parse_id_list',
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['attribute'] = array(
- 'description' => __( 'Limit result set to products with a specific attribute. Use the taxonomy name/attribute slug.', 'woocommerce' ),
- 'type' => 'string',
- 'sanitize_callback' => 'sanitize_text_field',
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['attribute_term'] = array(
- 'description' => __( 'Limit result set to products with a specific attribute term ID (required an assigned attribute).', 'woocommerce' ),
- 'type' => 'string',
- 'sanitize_callback' => 'wp_parse_id_list',
- 'validate_callback' => 'rest_validate_request_arg',
- );
-
- if ( wc_tax_enabled() ) {
- $params['tax_class'] = array(
- 'description' => __( 'Limit result set to products with a specific tax class.', 'woocommerce' ),
- 'type' => 'string',
- 'enum' => array_merge( array( 'standard' ), WC_Tax::get_tax_class_slugs() ),
- 'sanitize_callback' => 'sanitize_text_field',
- 'validate_callback' => 'rest_validate_request_arg',
- );
- }
-
- $params['in_stock'] = array(
- 'description' => __( 'Limit result set to products in stock or out of stock.', 'woocommerce' ),
- 'type' => 'boolean',
- 'sanitize_callback' => 'wc_string_to_bool',
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['on_sale'] = array(
- 'description' => __( 'Limit result set to products on sale.', 'woocommerce' ),
- 'type' => 'boolean',
- 'sanitize_callback' => 'wc_string_to_bool',
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['min_price'] = array(
- 'description' => __( 'Limit result set to products based on a minimum price.', 'woocommerce' ),
- 'type' => 'string',
- 'sanitize_callback' => 'sanitize_text_field',
- 'validate_callback' => 'rest_validate_request_arg',
- );
- $params['max_price'] = array(
- 'description' => __( 'Limit result set to products based on a maximum price.', 'woocommerce' ),
+ unset( $params['in_stock'] );
+ $params['stock_status'] = array(
+ 'description' => __( 'Limit result set to products with specified stock status.', 'woocommerce' ),
'type' => 'string',
+ 'enum' => array_keys( wc_get_product_stock_status_options() ),
'sanitize_callback' => 'sanitize_text_field',
'validate_callback' => 'rest_validate_request_arg',
);
return $params;
}
+
+ /**
+ * Get product data.
+ *
+ * @param WC_Product $product Product instance.
+ * @param string $context Request context.
+ * Options: 'view' and 'edit'.
+ * @return array
+ */
+ protected function get_product_data( $product, $context = 'view' ) {
+ $data = parent::get_product_data( $product, $context );
+
+ // Replace in_stock with stock_status.
+ $pos = array_search( 'in_stock', array_keys( $data ), true );
+ $array_section_1 = array_slice( $data, 0, $pos, true );
+ $array_section_2 = array_slice( $data, $pos + 1, null, true );
+
+ return $array_section_1 + array( 'stock_status' => $product->get_stock_status( $context ) ) + $array_section_2;
+ }
}
diff --git a/includes/api/class-wc-rest-report-coupons-totals-controller.php b/includes/api/class-wc-rest-report-coupons-totals-controller.php
new file mode 100644
index 00000000000..fa73796e3fe
--- /dev/null
+++ b/includes/api/class-wc-rest-report-coupons-totals-controller.php
@@ -0,0 +1,143 @@
+ $name ) {
+ $results = $wpdb->get_results(
+ $wpdb->prepare( "
+ SELECT count(meta_id) AS total
+ FROM $wpdb->postmeta
+ WHERE meta_key = 'discount_type'
+ AND meta_value = %s
+ ", $slug )
+ );
+
+ $total = isset( $results[0] ) ? (int) $results[0]->total : 0;
+
+ $data[] = array(
+ 'slug' => $slug,
+ 'name' => $name,
+ 'total' => $total,
+ );
+ }
+
+ set_transient( 'rest_api_coupons_type_count', $data, YEAR_IN_SECONDS );
+
+ return $data;
+ }
+
+ /**
+ * Prepare a report object for serialization.
+ *
+ * @param stdClass $report Report data.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response Response data.
+ */
+ public function prepare_item_for_response( $report, $request ) {
+ $data = array(
+ 'slug' => $report->slug,
+ 'name' => $report->name,
+ 'total' => $report->total,
+ );
+
+ $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+
+ // Wrap the data in a response object.
+ $response = rest_ensure_response( $data );
+
+ /**
+ * Filter a report returned from the API.
+ *
+ * Allows modification of the report data right before it is returned.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param object $report The original report object.
+ * @param WP_REST_Request $request Request used to generate the response.
+ */
+ return apply_filters( 'woocommerce_rest_prepare_report_coupons_count', $response, $report, $request );
+ }
+
+ /**
+ * Get the Report's schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'report_coupon_total',
+ 'type' => 'object',
+ 'properties' => array(
+ 'slug' => array(
+ 'description' => __( 'An alphanumeric identifier for the resource.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'name' => array(
+ 'description' => __( 'Coupon type name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'total' => array(
+ 'description' => __( 'Amount of coupons.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+}
diff --git a/includes/api/class-wc-rest-report-customers-totals-controller.php b/includes/api/class-wc-rest-report-customers-totals-controller.php
new file mode 100644
index 00000000000..e5459728414
--- /dev/null
+++ b/includes/api/class-wc-rest-report-customers-totals-controller.php
@@ -0,0 +1,154 @@
+ $total ) {
+ if ( in_array( $role, array( 'administrator', 'shop_manager' ), true ) ) {
+ continue;
+ }
+
+ $total_customers += (int) $total;
+ }
+
+ $customers_query = new WP_User_Query(
+ array(
+ 'role__not_in' => array( 'administrator', 'shop_manager' ),
+ 'number' => 0,
+ 'fields' => 'ID',
+ 'count_total' => true,
+ 'meta_query' => array( // WPCS: slow query ok.
+ array(
+ 'key' => 'paying_customer',
+ 'value' => 1,
+ 'compare' => '=',
+ ),
+ ),
+ )
+ );
+
+ $total_paying = (int) $customers_query->get_total();
+
+ $data = array(
+ array(
+ 'slug' => 'paying',
+ 'name' => __( 'Paying customer', 'woocommerce' ),
+ 'total' => $total_paying,
+ ),
+ array(
+ 'slug' => 'non_paying',
+ 'name' => __( 'Non-paying customer', 'woocommerce' ),
+ 'total' => $total_customers - $total_paying,
+ ),
+ );
+
+ return $data;
+ }
+
+ /**
+ * Prepare a report object for serialization.
+ *
+ * @param stdClass $report Report data.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response Response data.
+ */
+ public function prepare_item_for_response( $report, $request ) {
+ $data = array(
+ 'slug' => $report->slug,
+ 'name' => $report->name,
+ 'total' => $report->total,
+ );
+
+ $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+
+ // Wrap the data in a response object.
+ $response = rest_ensure_response( $data );
+
+ /**
+ * Filter a report returned from the API.
+ *
+ * Allows modification of the report data right before it is returned.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param object $report The original report object.
+ * @param WP_REST_Request $request Request used to generate the response.
+ */
+ return apply_filters( 'woocommerce_rest_prepare_report_customers_count', $response, $report, $request );
+ }
+
+ /**
+ * Get the Report's schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'report_customer_total',
+ 'type' => 'object',
+ 'properties' => array(
+ 'slug' => array(
+ 'description' => __( 'An alphanumeric identifier for the resource.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'name' => array(
+ 'description' => __( 'Customer type name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'total' => array(
+ 'description' => __( 'Amount of customers.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+}
diff --git a/includes/api/class-wc-rest-report-orders-totals-controller.php b/includes/api/class-wc-rest-report-orders-totals-controller.php
new file mode 100644
index 00000000000..4bfb773ba76
--- /dev/null
+++ b/includes/api/class-wc-rest-report-orders-totals-controller.php
@@ -0,0 +1,127 @@
+ $name ) {
+ if ( ! isset( $totals->$slug ) ) {
+ continue;
+ }
+
+ $data[] = array(
+ 'slug' => str_replace( 'wc-', '', $slug ),
+ 'name' => $name,
+ 'total' => (int) $totals->$slug,
+ );
+ }
+
+ return $data;
+ }
+
+ /**
+ * Prepare a report object for serialization.
+ *
+ * @param stdClass $report Report data.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response Response data.
+ */
+ public function prepare_item_for_response( $report, $request ) {
+ $data = array(
+ 'slug' => $report->slug,
+ 'name' => $report->name,
+ 'total' => $report->total,
+ );
+
+ $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+
+ // Wrap the data in a response object.
+ $response = rest_ensure_response( $data );
+
+ /**
+ * Filter a report returned from the API.
+ *
+ * Allows modification of the report data right before it is returned.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param object $report The original report object.
+ * @param WP_REST_Request $request Request used to generate the response.
+ */
+ return apply_filters( 'woocommerce_rest_prepare_report_orders_count', $response, $report, $request );
+ }
+
+ /**
+ * Get the Report's schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'report_order_total',
+ 'type' => 'object',
+ 'properties' => array(
+ 'slug' => array(
+ 'description' => __( 'An alphanumeric identifier for the resource.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'name' => array(
+ 'description' => __( 'Order status name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'total' => array(
+ 'description' => __( 'Amount of orders.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+}
diff --git a/includes/api/class-wc-rest-report-products-totals-controller.php b/includes/api/class-wc-rest-report-products-totals-controller.php
new file mode 100644
index 00000000000..63812219260
--- /dev/null
+++ b/includes/api/class-wc-rest-report-products-totals-controller.php
@@ -0,0 +1,133 @@
+ 'product_type',
+ 'hide_empty' => false,
+ )
+ );
+ $data = array();
+
+ foreach ( $terms as $product_type ) {
+ if ( ! isset( $types[ $product_type->name ] ) ) {
+ continue;
+ }
+
+ $data[] = array(
+ 'slug' => $product_type->name,
+ 'name' => $types[ $product_type->name ],
+ 'total' => (int) $product_type->count,
+ );
+ }
+
+ return $data;
+ }
+
+ /**
+ * Prepare a report object for serialization.
+ *
+ * @param stdClass $report Report data.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response Response data.
+ */
+ public function prepare_item_for_response( $report, $request ) {
+ $data = array(
+ 'slug' => $report->slug,
+ 'name' => $report->name,
+ 'total' => $report->total,
+ );
+
+ $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+
+ // Wrap the data in a response object.
+ $response = rest_ensure_response( $data );
+
+ /**
+ * Filter a report returned from the API.
+ *
+ * Allows modification of the report data right before it is returned.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param object $report The original report object.
+ * @param WP_REST_Request $request Request used to generate the response.
+ */
+ return apply_filters( 'woocommerce_rest_prepare_report_products_count', $response, $report, $request );
+ }
+
+ /**
+ * Get the Report's schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'report_product_total',
+ 'type' => 'object',
+ 'properties' => array(
+ 'slug' => array(
+ 'description' => __( 'An alphanumeric identifier for the resource.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'name' => array(
+ 'description' => __( 'Product type name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'total' => array(
+ 'description' => __( 'Amount of products.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+}
diff --git a/includes/api/class-wc-rest-report-reviews-totals-controller.php b/includes/api/class-wc-rest-report-reviews-totals-controller.php
new file mode 100644
index 00000000000..4bff520ee3d
--- /dev/null
+++ b/includes/api/class-wc-rest-report-reviews-totals-controller.php
@@ -0,0 +1,132 @@
+ true,
+ 'post_type' => 'product',
+ 'meta_key' => 'rating', // WPCS: slow query ok.
+ 'meta_value' => '', // WPCS: slow query ok.
+ );
+
+ for ( $i = 1; $i <= 5; $i++ ) {
+ $query_data['meta_value'] = $i;
+
+ $data[] = array(
+ 'slug' => 'rated_' . $i . '_out_of_5',
+ /* translators: %s: average rating */
+ 'name' => sprintf( __( 'Rated %s out of 5', 'woocommerce' ), $i ),
+ 'total' => (int) get_comments( $query_data ),
+ );
+ }
+
+ return $data;
+ }
+
+ /**
+ * Prepare a report object for serialization.
+ *
+ * @param stdClass $report Report data.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response Response data.
+ */
+ public function prepare_item_for_response( $report, $request ) {
+ $data = array(
+ 'slug' => $report->slug,
+ 'name' => $report->name,
+ 'total' => $report->total,
+ );
+
+ $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+
+ // Wrap the data in a response object.
+ $response = rest_ensure_response( $data );
+
+ /**
+ * Filter a report returned from the API.
+ *
+ * Allows modification of the report data right before it is returned.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param object $report The original report object.
+ * @param WP_REST_Request $request Request used to generate the response.
+ */
+ return apply_filters( 'woocommerce_rest_prepare_report_reviews_count', $response, $report, $request );
+ }
+
+ /**
+ * Get the Report's schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'report_review_total',
+ 'type' => 'object',
+ 'properties' => array(
+ 'slug' => array(
+ 'description' => __( 'An alphanumeric identifier for the resource.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'name' => array(
+ 'description' => __( 'Review type name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'total' => array(
+ 'description' => __( 'Amount of reviews.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+}
diff --git a/includes/api/class-wc-rest-report-sales-controller.php b/includes/api/class-wc-rest-report-sales-controller.php
index f4a787ece5c..165add54796 100644
--- a/includes/api/class-wc-rest-report-sales-controller.php
+++ b/includes/api/class-wc-rest-report-sales-controller.php
@@ -14,14 +14,14 @@ defined( 'ABSPATH' ) || exit;
* REST API Report Sales controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Report_Sales_V1_Controller
+ * @extends WC_REST_Report_Sales_V2_Controller
*/
-class WC_REST_Report_Sales_Controller extends WC_REST_Report_Sales_V1_Controller {
+class WC_REST_Report_Sales_Controller extends WC_REST_Report_Sales_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
+ protected $namespace = 'wc/v3';
}
diff --git a/includes/api/class-wc-rest-report-top-sellers-controller.php b/includes/api/class-wc-rest-report-top-sellers-controller.php
index 4ace0f3cdc5..f9d705bd8ff 100644
--- a/includes/api/class-wc-rest-report-top-sellers-controller.php
+++ b/includes/api/class-wc-rest-report-top-sellers-controller.php
@@ -14,14 +14,14 @@ defined( 'ABSPATH' ) || exit;
* REST API Report Top Sellers controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Report_Top_Sellers_V1_Controller
+ * @extends WC_REST_Report_Top_Sellers_V2_Controller
*/
-class WC_REST_Report_Top_Sellers_Controller extends WC_REST_Report_Top_Sellers_V1_Controller {
+class WC_REST_Report_Top_Sellers_Controller extends WC_REST_Report_Top_Sellers_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
+ protected $namespace = 'wc/v3';
}
diff --git a/includes/api/class-wc-rest-reports-controller.php b/includes/api/class-wc-rest-reports-controller.php
index c8f0193eb58..413b4995e93 100644
--- a/includes/api/class-wc-rest-reports-controller.php
+++ b/includes/api/class-wc-rest-reports-controller.php
@@ -14,14 +14,59 @@ defined( 'ABSPATH' ) || exit;
* REST API Reports controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Reports_V1_Controller
+ * @extends WC_REST_Reports_V2_Controller
*/
-class WC_REST_Reports_Controller extends WC_REST_Reports_V1_Controller {
+class WC_REST_Reports_Controller extends WC_REST_Reports_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
+ protected $namespace = 'wc/v3';
+
+ /**
+ * Get reports list.
+ *
+ * @since 3.5.0
+ * @return array
+ */
+ protected function get_reports() {
+ $reports = parent::get_reports();
+
+ $reports[] = array(
+ 'slug' => 'orders/totals',
+ 'description' => __( 'Orders totals.', 'woocommerce' ),
+ );
+ $reports[] = array(
+ 'slug' => 'products/totals',
+ 'description' => __( 'Products totals.', 'woocommerce' ),
+ );
+ $reports[] = array(
+ 'slug' => 'customers/totals',
+ 'description' => __( 'Customers totals.', 'woocommerce' ),
+ );
+ $reports[] = array(
+ 'slug' => 'coupons/totals',
+ 'description' => __( 'Coupons totals.', 'woocommerce' ),
+ );
+ $reports[] = array(
+ 'slug' => 'reviews/totals',
+ 'description' => __( 'Reviews totals.', 'woocommerce' ),
+ );
+ $reports[] = array(
+ 'slug' => 'categories/totals',
+ 'description' => __( 'Categories totals.', 'woocommerce' ),
+ );
+ $reports[] = array(
+ 'slug' => 'tags/totals',
+ 'description' => __( 'Tags totals.', 'woocommerce' ),
+ );
+ $reports[] = array(
+ 'slug' => 'attributes/totals',
+ 'description' => __( 'Attributes totals.', 'woocommerce' ),
+ );
+
+ return $reports;
+ }
}
diff --git a/includes/api/class-wc-rest-setting-options-controller.php b/includes/api/class-wc-rest-setting-options-controller.php
index 6cb1fdfbf98..9613ce818eb 100644
--- a/includes/api/class-wc-rest-setting-options-controller.php
+++ b/includes/api/class-wc-rest-setting-options-controller.php
@@ -14,143 +14,60 @@ defined( 'ABSPATH' ) || exit;
* REST API Setting Options controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Controller
+ * @extends WC_REST_Setting_Options_V2_Controller
*/
-class WC_REST_Setting_Options_Controller extends WC_REST_Controller {
+class WC_REST_Setting_Options_Controller extends WC_REST_Setting_Options_V2_Controller {
/**
- * WP REST API namespace/version.
+ * Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
+ protected $namespace = 'wc/v3';
/**
- * Route base.
+ * Get setting data.
*
- * @var string
+ * @param string $group_id Group ID.
+ * @param string $setting_id Setting ID.
+ * @return stdClass|WP_Error
*/
- protected $rest_base = 'settings/(?P[\w-]+)';
-
- /**
- * Register routes.
- *
- * @since 3.0.0
- */
- public function register_routes() {
- register_rest_route(
- $this->namespace, '/' . $this->rest_base, array(
- 'args' => array(
- 'group' => array(
- 'description' => __( 'Settings group ID.', 'woocommerce' ),
- 'type' => 'string',
- ),
- ),
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_items' ),
- 'permission_callback' => array( $this, 'get_items_permissions_check' ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
-
- register_rest_route(
- $this->namespace, '/' . $this->rest_base . '/batch', array(
- 'args' => array(
- 'group' => array(
- 'description' => __( 'Settings group ID.', 'woocommerce' ),
- 'type' => 'string',
- ),
- ),
- array(
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => array( $this, 'batch_items' ),
- 'permission_callback' => array( $this, 'update_items_permissions_check' ),
- 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
- ),
- 'schema' => array( $this, 'get_public_batch_schema' ),
- )
- );
-
- register_rest_route(
- $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array(
- 'args' => array(
- 'group' => array(
- 'description' => __( 'Settings group ID.', 'woocommerce' ),
- 'type' => 'string',
- ),
- 'id' => array(
- 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
- 'type' => 'string',
- ),
- ),
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_item' ),
- 'permission_callback' => array( $this, 'get_items_permissions_check' ),
- ),
- array(
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => array( $this, 'update_item' ),
- 'permission_callback' => array( $this, 'update_items_permissions_check' ),
- 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
- }
-
- /**
- * Return a single setting.
- *
- * @since 3.0.0
- * @param WP_REST_Request $request Request data.
- * @return WP_Error|WP_REST_Response
- */
- public function get_item( $request ) {
- $setting = $this->get_setting( $request['group_id'], $request['id'] );
-
+ public function get_setting( $group_id, $setting_id ) {
+ $setting = parent::get_setting( $group_id, $setting_id );
if ( is_wp_error( $setting ) ) {
return $setting;
}
-
- $response = $this->prepare_item_for_response( $setting, $request );
-
- return rest_ensure_response( $response );
+ $setting['group_id'] = $group_id;
+ return $setting;
}
/**
- * Return all settings in a group.
+ * Callback for allowed keys for each setting response.
*
- * @since 3.0.0
- * @param WP_REST_Request $request Request data.
- * @return WP_Error|WP_REST_Response
+ * @param string $key Key to check.
+ * @return boolean
*/
- public function get_items( $request ) {
- $settings = $this->get_group_settings( $request['group_id'] );
-
- if ( is_wp_error( $settings ) ) {
- return $settings;
- }
-
- $data = array();
-
- foreach ( $settings as $setting_obj ) {
- $setting = $this->prepare_item_for_response( $setting_obj, $request );
- $setting = $this->prepare_response_for_collection( $setting );
- if ( $this->is_setting_type_valid( $setting['type'] ) ) {
- $data[] = $setting;
- }
- }
-
- return rest_ensure_response( $data );
+ public function allowed_setting_keys( $key ) {
+ return in_array(
+ $key, array(
+ 'id',
+ 'group_id',
+ 'label',
+ 'description',
+ 'default',
+ 'tip',
+ 'placeholder',
+ 'type',
+ 'options',
+ 'value',
+ 'option_key',
+ ), true
+ );
}
/**
* Get all settings in a group.
*
- * @since 3.0.0
* @param string $group_id Group ID.
* @return array|WP_Error
*/
@@ -159,7 +76,7 @@ class WC_REST_Setting_Options_Controller extends WC_REST_Controller {
return new WP_Error( 'rest_setting_setting_group_invalid', __( 'Invalid setting group.', 'woocommerce' ), array( 'status' => 404 ) );
}
- $settings = apply_filters( 'woocommerce_settings-' . $group_id, array() );
+ $settings = apply_filters( 'woocommerce_settings-' . $group_id, array() ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
if ( empty( $settings ) ) {
return new WP_Error( 'rest_setting_setting_group_invalid', __( 'Invalid setting group.', 'woocommerce' ), array( 'status' => 404 ) );
@@ -185,6 +102,20 @@ class WC_REST_Setting_Options_Controller extends WC_REST_Controller {
} elseif ( 'single_select_country' === $setting['type'] ) {
$setting['type'] = 'select';
$setting['options'] = $this->get_countries_and_states();
+ } elseif ( 'single_select_page' === $setting['type'] ) {
+ $pages = get_pages(
+ array(
+ 'sort_column' => 'menu_order',
+ 'sort_order' => 'ASC',
+ 'hierarchical' => 0,
+ )
+ );
+ $options = array();
+ foreach ( $pages as $page ) {
+ $options[ $page->ID ] = ! empty( $page->post_title ) ? $page->post_title : '#' . $page->ID;
+ }
+ $setting['type'] = 'select';
+ $setting['options'] = $options;
}
$filtered_settings[] = $setting;
@@ -204,11 +135,10 @@ class WC_REST_Setting_Options_Controller extends WC_REST_Controller {
if ( ! $countries ) {
return array();
}
-
$output = array();
-
foreach ( $countries as $key => $value ) {
$states = WC()->countries->get_states( $key );
+
if ( $states ) {
foreach ( $states as $state_key => $state_value ) {
$output[ $key . ':' . $state_key ] = $value . ' - ' . $state_value;
@@ -217,282 +147,12 @@ class WC_REST_Setting_Options_Controller extends WC_REST_Controller {
$output[ $key ] = $value;
}
}
-
return $output;
}
- /**
- * Get setting data.
- *
- * @since 3.0.0
- * @param string $group_id Group ID.
- * @param string $setting_id Setting ID.
- * @return stdClass|WP_Error
- */
- public function get_setting( $group_id, $setting_id ) {
- if ( empty( $setting_id ) ) {
- return new WP_Error( 'rest_setting_setting_invalid', __( 'Invalid setting.', 'woocommerce' ), array( 'status' => 404 ) );
- }
-
- $settings = $this->get_group_settings( $group_id );
-
- if ( is_wp_error( $settings ) ) {
- return $settings;
- }
-
- $array_key = array_keys( wp_list_pluck( $settings, 'id' ), $setting_id );
-
- if ( empty( $array_key ) ) {
- return new WP_Error( 'rest_setting_setting_invalid', __( 'Invalid setting.', 'woocommerce' ), array( 'status' => 404 ) );
- }
-
- $setting = $settings[ $array_key[0] ];
-
- if ( ! $this->is_setting_type_valid( $setting['type'] ) ) {
- return new WP_Error( 'rest_setting_setting_invalid', __( 'Invalid setting.', 'woocommerce' ), array( 'status' => 404 ) );
- }
-
- return $setting;
- }
-
- /**
- * Bulk create, update and delete items.
- *
- * @since 3.0.0
- * @param WP_REST_Request $request Full details about the request.
- * @return array Of WP_Error or WP_REST_Response.
- */
- public function batch_items( $request ) {
- // Get the request params.
- $items = array_filter( $request->get_params() );
-
- /*
- * Since our batch settings update is group-specific and matches based on the route,
- * we inject the URL parameters (containing group) into the batch items
- */
- if ( ! empty( $items['update'] ) ) {
- $to_update = array();
- foreach ( $items['update'] as $item ) {
- $to_update[] = array_merge( $request->get_url_params(), $item );
- }
- $request = new WP_REST_Request( $request->get_method() );
- $request->set_body_params( array( 'update' => $to_update ) );
- }
-
- return parent::batch_items( $request );
- }
-
- /**
- * Update a single setting in a group.
- *
- * @since 3.0.0
- * @param WP_REST_Request $request Request data.
- * @return WP_Error|WP_REST_Response
- */
- public function update_item( $request ) {
- $setting = $this->get_setting( $request['group_id'], $request['id'] );
-
- if ( is_wp_error( $setting ) ) {
- return $setting;
- }
-
- if ( is_callable( array( $this, 'validate_setting_' . $setting['type'] . '_field' ) ) ) {
- $value = $this->{'validate_setting_' . $setting['type'] . '_field'}( $request['value'], $setting );
- } else {
- $value = $this->validate_setting_text_field( $request['value'], $setting );
- }
-
- if ( is_wp_error( $value ) ) {
- return $value;
- }
-
- if ( is_array( $setting['option_key'] ) ) {
- $setting['value'] = $value;
- $option_key = $setting['option_key'];
- $prev = get_option( $option_key[0] );
- $prev[ $option_key[1] ] = $request['value'];
- update_option( $option_key[0], $prev );
- } else {
- $update_data = array();
- $update_data[ $setting['option_key'] ] = $value;
- $setting['value'] = $value;
- WC_Admin_Settings::save_fields( array( $setting ), $update_data );
- }
-
- $response = $this->prepare_item_for_response( $setting, $request );
-
- return rest_ensure_response( $response );
- }
-
- /**
- * Prepare a single setting object for response.
- *
- * @since 3.0.0
- * @param object $item Setting object.
- * @param WP_REST_Request $request Request object.
- * @return WP_REST_Response $response Response data.
- */
- public function prepare_item_for_response( $item, $request ) {
- unset( $item['option_key'] );
- $data = $this->filter_setting( $item );
- $data = $this->add_additional_fields_to_object( $data, $request );
- $data = $this->filter_response_by_context( $data, empty( $request['context'] ) ? 'view' : $request['context'] );
- $response = rest_ensure_response( $data );
- $response->add_links( $this->prepare_links( $data['id'], $request['group_id'] ) );
- return $response;
- }
-
- /**
- * Prepare links for the request.
- *
- * @since 3.0.0
- * @param string $setting_id Setting ID.
- * @param string $group_id Group ID.
- * @return array Links for the given setting.
- */
- protected function prepare_links( $setting_id, $group_id ) {
- $base = str_replace( '(?P[\w-]+)', $group_id, $this->rest_base );
- $links = array(
- 'self' => array(
- 'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $base, $setting_id ) ),
- ),
- 'collection' => array(
- 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $base ) ),
- ),
- );
-
- return $links;
- }
-
- /**
- * Makes sure the current user has access to READ the settings APIs.
- *
- * @since 3.0.0
- * @param WP_REST_Request $request Full data about the request.
- * @return WP_Error|boolean
- */
- public function get_items_permissions_check( $request ) {
- if ( ! wc_rest_check_manager_permissions( 'settings', 'read' ) ) {
- return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
- }
-
- return true;
- }
-
- /**
- * Makes sure the current user has access to WRITE the settings APIs.
- *
- * @since 3.0.0
- * @param WP_REST_Request $request Full data about the request.
- * @return WP_Error|boolean
- */
- public function update_items_permissions_check( $request ) {
- if ( ! wc_rest_check_manager_permissions( 'settings', 'edit' ) ) {
- return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you cannot edit this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
- }
-
- return true;
- }
-
- /**
- * Filters out bad values from the settings array/filter so we
- * only return known values via the API.
- *
- * @since 3.0.0
- * @param array $setting Settings.
- * @return array
- */
- public function filter_setting( $setting ) {
- $setting = array_intersect_key(
- $setting,
- array_flip( array_filter( array_keys( $setting ), array( $this, 'allowed_setting_keys' ) ) )
- );
-
- if ( empty( $setting['options'] ) ) {
- unset( $setting['options'] );
- }
-
- if ( 'image_width' === $setting['type'] ) {
- $setting = $this->cast_image_width( $setting );
- }
-
- return $setting;
- }
-
- /**
- * For image_width, Crop can return "0" instead of false -- so we want
- * to make sure we return these consistently the same we accept them.
- *
- * @todo remove in 4.0
- * @since 3.0.0
- * @param array $setting Settings.
- * @return array
- */
- public function cast_image_width( $setting ) {
- foreach ( array( 'default', 'value' ) as $key ) {
- if ( isset( $setting[ $key ] ) ) {
- $setting[ $key ]['width'] = intval( $setting[ $key ]['width'] );
- $setting[ $key ]['height'] = intval( $setting[ $key ]['height'] );
- $setting[ $key ]['crop'] = (bool) $setting[ $key ]['crop'];
- }
- }
- return $setting;
- }
-
- /**
- * Callback for allowed keys for each setting response.
- *
- * @since 3.0.0
- * @param string $key Key to check.
- * @return boolean
- */
- public function allowed_setting_keys( $key ) {
- return in_array(
- $key, array(
- 'id',
- 'label',
- 'description',
- 'default',
- 'tip',
- 'placeholder',
- 'type',
- 'options',
- 'value',
- 'option_key',
- )
- );
- }
-
- /**
- * Boolean for if a setting type is a valid supported setting type.
- *
- * @since 3.0.0
- * @param string $type Type.
- * @return bool
- */
- public function is_setting_type_valid( $type ) {
- return in_array(
- $type, array(
- 'text', // Validates with validate_setting_text_field.
- 'email', // Validates with validate_setting_text_field.
- 'number', // Validates with validate_setting_text_field.
- 'color', // Validates with validate_setting_text_field.
- 'password', // Validates with validate_setting_text_field.
- 'textarea', // Validates with validate_setting_textarea_field.
- 'select', // Validates with validate_setting_select_field.
- 'multiselect', // Validates with validate_setting_multiselect_field.
- 'radio', // Validates with validate_setting_radio_field (-> validate_setting_select_field).
- 'checkbox', // Validates with validate_setting_checkbox_field.
- 'image_width', // Validates with validate_setting_image_width_field.
- 'thumbnail_cropping', // Validates with validate_setting_text_field.
- )
- );
- }
-
/**
* Get the settings schema, conforming to JSON Schema.
*
- * @since 3.0.0
* @return array
*/
public function get_item_schema() {
@@ -510,6 +170,15 @@ class WC_REST_Setting_Options_Controller extends WC_REST_Controller {
'context' => array( 'view', 'edit' ),
'readonly' => true,
),
+ 'group_id' => array(
+ 'description' => __( 'An identifier for the group this setting belongs to.', 'woocommerce' ),
+ 'type' => 'string',
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_title',
+ ),
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
'label' => array(
'description' => __( 'A human readable label for the setting used in interfaces.', 'woocommerce' ),
'type' => 'string',
@@ -564,7 +233,7 @@ class WC_REST_Setting_Options_Controller extends WC_REST_Controller {
'sanitize_callback' => 'sanitize_text_field',
),
'context' => array( 'view', 'edit' ),
- 'enum' => array( 'text', 'email', 'number', 'color', 'password', 'textarea', 'select', 'multiselect', 'radio', 'image_width', 'checkbox', 'thumbnail_cropping' ),
+ 'enum' => array( 'text', 'email', 'number', 'color', 'password', 'textarea', 'select', 'multiselect', 'radio', 'image_width', 'checkbox' ),
'readonly' => true,
),
'options' => array(
diff --git a/includes/api/class-wc-rest-settings-controller.php b/includes/api/class-wc-rest-settings-controller.php
index 35d012796ad..f3ad622e467 100644
--- a/includes/api/class-wc-rest-settings-controller.php
+++ b/includes/api/class-wc-rest-settings-controller.php
@@ -14,174 +14,59 @@ defined( 'ABSPATH' ) || exit;
* REST API Settings controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Controller
+ * @extends WC_REST_Settings_V2_Controller
*/
-class WC_REST_Settings_Controller extends WC_REST_Controller {
+class WC_REST_Settings_Controller extends WC_REST_Settings_V2_Controller {
/**
- * WP REST API namespace/version.
+ * Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
-
- /**
- * Route base.
- *
- * @var string
- */
- protected $rest_base = 'settings';
+ protected $namespace = 'wc/v3';
/**
* Register routes.
- *
- * @since 3.0.0
*/
public function register_routes() {
- register_rest_route(
- $this->namespace, '/' . $this->rest_base, array(
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_items' ),
- 'permission_callback' => array( $this, 'get_items_permissions_check' ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
- }
-
- /**
- * Get all settings groups items.
- *
- * @since 3.0.0
- * @param WP_REST_Request $request Request data.
- * @return WP_Error|WP_REST_Response
- */
- public function get_items( $request ) {
- $groups = apply_filters( 'woocommerce_settings_groups', array() );
- if ( empty( $groups ) ) {
- return new WP_Error( 'rest_setting_groups_empty', __( 'No setting groups have been registered.', 'woocommerce' ), array( 'status' => 500 ) );
- }
-
- $defaults = $this->group_defaults();
- $filtered_groups = array();
- foreach ( $groups as $group ) {
- $sub_groups = array();
- foreach ( $groups as $_group ) {
- if ( ! empty( $_group['parent_id'] ) && $group['id'] === $_group['parent_id'] ) {
- $sub_groups[] = $_group['id'];
- }
- }
- $group['sub_groups'] = $sub_groups;
-
- $group = wp_parse_args( $group, $defaults );
- if ( ! is_null( $group['id'] ) && ! is_null( $group['label'] ) ) {
- $group_obj = $this->filter_group( $group );
- $group_data = $this->prepare_item_for_response( $group_obj, $request );
- $group_data = $this->prepare_response_for_collection( $group_data );
-
- $filtered_groups[] = $group_data;
- }
- }
-
- $response = rest_ensure_response( $filtered_groups );
- return $response;
- }
-
- /**
- * Prepare links for the request.
- *
- * @param string $group_id Group ID.
- * @return array Links for the given group.
- */
- protected function prepare_links( $group_id ) {
- $base = '/' . $this->namespace . '/' . $this->rest_base;
- $links = array(
- 'options' => array(
- 'href' => rest_url( trailingslashit( $base ) . $group_id ),
+ parent::register_routes();
+ register_rest_route( $this->namespace, '/' . $this->rest_base . '/batch', array(
+ array(
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => array( $this, 'batch_items' ),
+ 'permission_callback' => array( $this, 'update_items_permissions_check' ),
),
- );
-
- return $links;
+ 'schema' => array( $this, 'get_public_batch_schema' ),
+ ) );
}
/**
- * Prepare a report sales object for serialization.
+ * Makes sure the current user has access to WRITE the settings APIs.
*
- * @since 3.0.0
- * @param array $item Group object.
- * @param WP_REST_Request $request Request object.
- * @return WP_REST_Response $response Response data.
- */
- public function prepare_item_for_response( $item, $request ) {
- $context = empty( $request['context'] ) ? 'view' : $request['context'];
- $data = $this->add_additional_fields_to_object( $item, $request );
- $data = $this->filter_response_by_context( $data, $context );
-
- $response = rest_ensure_response( $data );
-
- $response->add_links( $this->prepare_links( $item['id'] ) );
-
- return $response;
- }
-
- /**
- * Filters out bad values from the groups array/filter so we
- * only return known values via the API.
- *
- * @since 3.0.0
- * @param array $group Group.
- * @return array
- */
- public function filter_group( $group ) {
- return array_intersect_key(
- $group,
- array_flip( array_filter( array_keys( $group ), array( $this, 'allowed_group_keys' ) ) )
- );
- }
-
- /**
- * Callback for allowed keys for each group response.
- *
- * @since 3.0.0
- * @param string $key Key to check.
- * @return boolean
- */
- public function allowed_group_keys( $key ) {
- return in_array( $key, array( 'id', 'label', 'description', 'parent_id', 'sub_groups' ) );
- }
-
- /**
- * Returns default settings for groups. null means the field is required.
- *
- * @since 3.0.0
- * @return array
- */
- protected function group_defaults() {
- return array(
- 'id' => null,
- 'label' => null,
- 'description' => '',
- 'parent_id' => '',
- 'sub_groups' => array(),
- );
- }
-
- /**
- * Makes sure the current user has access to READ the settings APIs.
- *
- * @since 3.0.0
* @param WP_REST_Request $request Full data about the request.
- * @return WP_Error|boolean
+ * @return WP_Error|bool
*/
- public function get_items_permissions_check( $request ) {
- if ( ! wc_rest_check_manager_permissions( 'settings', 'read' ) ) {
- return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ public function update_items_permissions_check( $request ) {
+ if ( ! wc_rest_check_manager_permissions( 'settings', 'edit' ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you cannot edit this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
}
return true;
}
+ /**
+ * Update a setting.
+ *
+ * @param WP_REST_Request $request Request data.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function update_item( $request ) {
+ $options_controller = new WC_REST_Setting_Options_Controller();
+ $response = $options_controller->update_item( $request );
+
+ return $response;
+ }
+
/**
* Get the groups schema, conforming to JSON Schema.
*
@@ -197,32 +82,27 @@ class WC_REST_Settings_Controller extends WC_REST_Controller {
'id' => array(
'description' => __( 'A unique identifier that can be used to link settings together.', 'woocommerce' ),
'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
+ 'context' => array( 'view', 'edit' ),
),
'label' => array(
'description' => __( 'A human readable label for the setting used in interfaces.', 'woocommerce' ),
'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
+ 'context' => array( 'view', 'edit' ),
),
'description' => array(
'description' => __( 'A human readable description for the setting used in interfaces.', 'woocommerce' ),
'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
+ 'context' => array( 'view', 'edit' ),
),
'parent_id' => array(
'description' => __( 'ID of parent grouping.', 'woocommerce' ),
'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
+ 'context' => array( 'view', 'edit' ),
),
'sub_groups' => array(
'description' => __( 'IDs for settings sub groups.', 'woocommerce' ),
'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
+ 'context' => array( 'view', 'edit' ),
),
),
);
diff --git a/includes/api/class-wc-rest-shipping-methods-controller.php b/includes/api/class-wc-rest-shipping-methods-controller.php
index ab1b8acffc8..075e4f777cd 100644
--- a/includes/api/class-wc-rest-shipping-methods-controller.php
+++ b/includes/api/class-wc-rest-shipping-methods-controller.php
@@ -14,218 +14,14 @@ defined( 'ABSPATH' ) || exit;
* Shipping methods controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Controller
+ * @extends WC_REST_Shipping_Methods_V2_Controller
*/
-class WC_REST_Shipping_Methods_Controller extends WC_REST_Controller {
+class WC_REST_Shipping_Methods_Controller extends WC_REST_Shipping_Methods_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
-
- /**
- * Route base.
- *
- * @var string
- */
- protected $rest_base = 'shipping_methods';
-
- /**
- * Register the route for /shipping_methods and /shipping_methods/
- */
- public function register_routes() {
- register_rest_route(
- $this->namespace, '/' . $this->rest_base, array(
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_items' ),
- 'permission_callback' => array( $this, 'get_items_permissions_check' ),
- 'args' => $this->get_collection_params(),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
- register_rest_route(
- $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array(
- 'args' => array(
- 'id' => array(
- 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
- 'type' => 'string',
- ),
- ),
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_item' ),
- 'permission_callback' => array( $this, 'get_item_permissions_check' ),
- 'args' => array(
- 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
- ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
- }
-
- /**
- * Check whether a given request has permission to view shipping methods.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_Error|boolean
- */
- public function get_items_permissions_check( $request ) {
- if ( ! wc_rest_check_manager_permissions( 'shipping_methods', 'read' ) ) {
- return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
- }
- return true;
- }
-
- /**
- * Check if a given request has access to read a shipping method.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_Error|boolean
- */
- public function get_item_permissions_check( $request ) {
- if ( ! wc_rest_check_manager_permissions( 'shipping_methods', 'read' ) ) {
- return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
- }
- return true;
- }
-
- /**
- * Get shipping methods.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_Error|WP_REST_Response
- */
- public function get_items( $request ) {
- $wc_shipping = WC_Shipping::instance();
- $response = array();
- foreach ( $wc_shipping->get_shipping_methods() as $id => $shipping_method ) {
- $method = $this->prepare_item_for_response( $shipping_method, $request );
- $method = $this->prepare_response_for_collection( $method );
- $response[] = $method;
- }
- return rest_ensure_response( $response );
- }
-
- /**
- * Get a single Shipping Method.
- *
- * @param WP_REST_Request $request Request data.
- * @return WP_REST_Response|WP_Error
- */
- public function get_item( $request ) {
- $wc_shipping = WC_Shipping::instance();
- $methods = $wc_shipping->get_shipping_methods();
- if ( empty( $methods[ $request['id'] ] ) ) {
- return new WP_Error( 'woocommerce_rest_shipping_method_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) );
- }
-
- $method = $methods[ $request['id'] ];
- $response = $this->prepare_item_for_response( $method, $request );
-
- return rest_ensure_response( $response );
- }
-
- /**
- * Prepare a shipping method for response.
- *
- * @param WC_Shipping_Method $method Shipping method object.
- * @param WP_REST_Request $request Request object.
- * @return WP_REST_Response $response Response data.
- */
- public function prepare_item_for_response( $method, $request ) {
- $data = array(
- 'id' => $method->id,
- 'title' => $method->method_title,
- 'description' => $method->method_description,
- );
-
- $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
- $data = $this->add_additional_fields_to_object( $data, $request );
- $data = $this->filter_response_by_context( $data, $context );
-
- // Wrap the data in a response object.
- $response = rest_ensure_response( $data );
-
- $response->add_links( $this->prepare_links( $method, $request ) );
-
- /**
- * Filter shipping methods object returned from the REST API.
- *
- * @param WP_REST_Response $response The response object.
- * @param WC_Shipping_Method $method Shipping method object used to create response.
- * @param WP_REST_Request $request Request object.
- */
- return apply_filters( 'woocommerce_rest_prepare_shipping_method', $response, $method, $request );
- }
-
- /**
- * Prepare links for the request.
- *
- * @param WC_Shipping_Method $method Shipping method object.
- * @param WP_REST_Request $request Request object.
- * @return array
- */
- protected function prepare_links( $method, $request ) {
- $links = array(
- 'self' => array(
- 'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $method->id ) ),
- ),
- 'collection' => array(
- 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
- ),
- );
-
- return $links;
- }
-
- /**
- * Get the shipping method schema, conforming to JSON Schema.
- *
- * @return array
- */
- public function get_item_schema() {
- $schema = array(
- '$schema' => 'http://json-schema.org/draft-04/schema#',
- 'title' => 'shipping_method',
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Method ID.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'title' => array(
- 'description' => __( 'Shipping method title.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'description' => array(
- 'description' => __( 'Shipping method description.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- ),
- );
-
- return $this->add_additional_fields_schema( $schema );
- }
-
- /**
- * Get any query params needed.
- *
- * @return array
- */
- public function get_collection_params() {
- return array(
- 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
- );
- }
+ protected $namespace = 'wc/v3';
}
diff --git a/includes/api/class-wc-rest-shipping-zone-locations-controller.php b/includes/api/class-wc-rest-shipping-zone-locations-controller.php
index fb97a818a82..cba326a80ca 100644
--- a/includes/api/class-wc-rest-shipping-zone-locations-controller.php
+++ b/includes/api/class-wc-rest-shipping-zone-locations-controller.php
@@ -14,177 +14,14 @@ defined( 'ABSPATH' ) || exit;
* REST API Shipping Zone Locations class.
*
* @package WooCommerce/API
- * @extends WC_REST_Shipping_Zones_Controller_Base
+ * @extends WC_REST_Shipping_Zone_Locations_V2_Controller
*/
-class WC_REST_Shipping_Zone_Locations_Controller extends WC_REST_Shipping_Zones_Controller_Base {
+class WC_REST_Shipping_Zone_Locations_Controller extends WC_REST_Shipping_Zone_Locations_V2_Controller {
/**
- * Register the routes for Shipping Zone Locations.
- */
- public function register_routes() {
- register_rest_route(
- $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)/locations', array(
- 'args' => array(
- 'id' => array(
- 'description' => __( 'Unique ID for the resource.', 'woocommerce' ),
- 'type' => 'integer',
- ),
- ),
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_items' ),
- 'permission_callback' => array( $this, 'get_items_permissions_check' ),
- ),
- array(
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => array( $this, 'update_items' ),
- 'permission_callback' => array( $this, 'update_items_permissions_check' ),
- 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
- }
-
- /**
- * Get all Shipping Zone Locations.
+ * Endpoint namespace.
*
- * @param WP_REST_Request $request Request data.
- * @return WP_REST_Response|WP_Error
+ * @var string
*/
- public function get_items( $request ) {
- $zone = $this->get_zone( (int) $request['id'] );
-
- if ( is_wp_error( $zone ) ) {
- return $zone;
- }
-
- $locations = $zone->get_zone_locations();
- $data = array();
-
- foreach ( $locations as $location_obj ) {
- $location = $this->prepare_item_for_response( $location_obj, $request );
- $location = $this->prepare_response_for_collection( $location );
- $data[] = $location;
- }
-
- return rest_ensure_response( $data );
- }
-
- /**
- * Update all Shipping Zone Locations.
- *
- * @param WP_REST_Request $request Request data.
- * @return WP_REST_Response|WP_Error
- */
- public function update_items( $request ) {
- $zone = $this->get_zone( (int) $request['id'] );
-
- if ( is_wp_error( $zone ) ) {
- return $zone;
- }
-
- if ( 0 === $zone->get_id() ) {
- return new WP_Error( 'woocommerce_rest_shipping_zone_locations_invalid_zone', __( 'The "locations not covered by your other zones" zone cannot be updated.', 'woocommerce' ), array( 'status' => 403 ) );
- }
-
- $raw_locations = $request->get_json_params();
- $locations = array();
-
- foreach ( (array) $raw_locations as $raw_location ) {
- if ( empty( $raw_location['code'] ) ) {
- continue;
- }
-
- $type = ! empty( $raw_location['type'] ) ? sanitize_text_field( $raw_location['type'] ) : 'country';
-
- if ( ! in_array( $type, array( 'postcode', 'state', 'country', 'continent' ), true ) ) {
- continue;
- }
-
- $locations[] = array(
- 'code' => sanitize_text_field( $raw_location['code'] ),
- 'type' => sanitize_text_field( $type ),
- );
- }
-
- $zone->set_locations( $locations );
- $zone->save();
-
- return $this->get_items( $request );
- }
-
- /**
- * Prepare the Shipping Zone Location for the REST response.
- *
- * @param array $item Shipping Zone Location.
- * @param WP_REST_Request $request Request object.
- * @return WP_REST_Response $response
- */
- public function prepare_item_for_response( $item, $request ) {
- $context = empty( $request['context'] ) ? 'view' : $request['context'];
- $data = $this->add_additional_fields_to_object( $item, $request );
- $data = $this->filter_response_by_context( $data, $context );
-
- // Wrap the data in a response object.
- $response = rest_ensure_response( $data );
-
- $response->add_links( $this->prepare_links( (int) $request['id'] ) );
-
- return $response;
- }
-
- /**
- * Prepare links for the request.
- *
- * @param int $zone_id Given Shipping Zone ID.
- * @return array Links for the given Shipping Zone Location.
- */
- protected function prepare_links( $zone_id ) {
- $base = '/' . $this->namespace . '/' . $this->rest_base . '/' . $zone_id;
- $links = array(
- 'collection' => array(
- 'href' => rest_url( $base . '/locations' ),
- ),
- 'describes' => array(
- 'href' => rest_url( $base ),
- ),
- );
-
- return $links;
- }
-
- /**
- * Get the Shipping Zone Locations schema, conforming to JSON Schema
- *
- * @return array
- */
- public function get_item_schema() {
- $schema = array(
- '$schema' => 'http://json-schema.org/draft-04/schema#',
- 'title' => 'shipping_zone_location',
- 'type' => 'object',
- 'properties' => array(
- 'code' => array(
- 'description' => __( 'Shipping zone location code.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'type' => array(
- 'description' => __( 'Shipping zone location type.', 'woocommerce' ),
- 'type' => 'string',
- 'default' => 'country',
- 'enum' => array(
- 'postcode',
- 'state',
- 'country',
- 'continent',
- ),
- 'context' => array( 'view', 'edit' ),
- ),
- ),
- );
-
- return $this->add_additional_fields_schema( $schema );
- }
+ protected $namespace = 'wc/v3';
}
diff --git a/includes/api/class-wc-rest-shipping-zone-methods-controller.php b/includes/api/class-wc-rest-shipping-zone-methods-controller.php
index c0bc3c2d6a3..6058e95baaf 100644
--- a/includes/api/class-wc-rest-shipping-zone-methods-controller.php
+++ b/includes/api/class-wc-rest-shipping-zone-methods-controller.php
@@ -14,528 +14,14 @@ defined( 'ABSPATH' ) || exit;
* REST API Shipping Zone Methods class.
*
* @package WooCommerce/API
- * @extends WC_REST_Shipping_Zones_Controller_Base
+ * @extends WC_REST_Shipping_Zone_Methods_V2_Controller
*/
-class WC_REST_Shipping_Zone_Methods_Controller extends WC_REST_Shipping_Zones_Controller_Base {
+class WC_REST_Shipping_Zone_Methods_Controller extends WC_REST_Shipping_Zone_Methods_V2_Controller {
/**
- * Register the routes for Shipping Zone Methods.
+ * Endpoint namespace.
+ *
+ * @var string
*/
- public function register_routes() {
- register_rest_route(
- $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)/methods', array(
- 'args' => array(
- 'zone_id' => array(
- 'description' => __( 'Unique ID for the zone.', 'woocommerce' ),
- 'type' => 'integer',
- ),
- ),
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_items' ),
- 'permission_callback' => array( $this, 'get_items_permissions_check' ),
- ),
- array(
- 'methods' => WP_REST_Server::CREATABLE,
- 'callback' => array( $this, 'create_item' ),
- 'permission_callback' => array( $this, 'create_item_permissions_check' ),
- 'args' => array_merge(
- $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), array(
- 'method_id' => array(
- 'required' => true,
- 'readonly' => false,
- 'description' => __( 'Shipping method ID.', 'woocommerce' ),
- ),
- )
- ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
-
- register_rest_route(
- $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)/methods/(?P[\d]+)', array(
- 'args' => array(
- 'zone_id' => array(
- 'description' => __( 'Unique ID for the zone.', 'woocommerce' ),
- 'type' => 'integer',
- ),
- 'instance_id' => array(
- 'description' => __( 'Unique ID for the instance.', 'woocommerce' ),
- 'type' => 'integer',
- ),
- ),
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_item' ),
- 'permission_callback' => array( $this, 'get_items_permissions_check' ),
- ),
- array(
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => array( $this, 'update_item' ),
- 'permission_callback' => array( $this, 'update_items_permissions_check' ),
- 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
- ),
- array(
- 'methods' => WP_REST_Server::DELETABLE,
- 'callback' => array( $this, 'delete_item' ),
- 'permission_callback' => array( $this, 'delete_items_permissions_check' ),
- 'args' => array(
- 'force' => array(
- 'default' => false,
- 'type' => 'boolean',
- 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ),
- ),
- ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
- }
-
- /**
- * Get a single Shipping Zone Method.
- *
- * @param WP_REST_Request $request Request data.
- * @return WP_REST_Response|WP_Error
- */
- public function get_item( $request ) {
- $zone = $this->get_zone( $request['zone_id'] );
-
- if ( is_wp_error( $zone ) ) {
- return $zone;
- }
-
- $instance_id = (int) $request['instance_id'];
- $methods = $zone->get_shipping_methods();
- $method = false;
-
- foreach ( $methods as $method_obj ) {
- if ( $instance_id === $method_obj->instance_id ) {
- $method = $method_obj;
- break;
- }
- }
-
- if ( false === $method ) {
- return new WP_Error( 'woocommerce_rest_shipping_zone_method_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) );
- }
-
- $data = $this->prepare_item_for_response( $method, $request );
-
- return rest_ensure_response( $data );
- }
-
- /**
- * Get all Shipping Zone Methods.
- *
- * @param WP_REST_Request $request Request data.
- * @return WP_REST_Response|WP_Error
- */
- public function get_items( $request ) {
- $zone = $this->get_zone( $request['zone_id'] );
-
- if ( is_wp_error( $zone ) ) {
- return $zone;
- }
-
- $methods = $zone->get_shipping_methods();
- $data = array();
-
- foreach ( $methods as $method_obj ) {
- $method = $this->prepare_item_for_response( $method_obj, $request );
- $data[] = $method;
- }
-
- return rest_ensure_response( $data );
- }
-
- /**
- * Create a new shipping zone method instance.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_REST_Request|WP_Error
- */
- public function create_item( $request ) {
- $method_id = $request['method_id'];
- $zone = $this->get_zone( $request['zone_id'] );
- if ( is_wp_error( $zone ) ) {
- return $zone;
- }
-
- $instance_id = $zone->add_shipping_method( $method_id );
- $methods = $zone->get_shipping_methods();
- $method = false;
- foreach ( $methods as $method_obj ) {
- if ( $instance_id === $method_obj->instance_id ) {
- $method = $method_obj;
- break;
- }
- }
-
- if ( false === $method ) {
- return new WP_Error( 'woocommerce_rest_shipping_zone_not_created', __( 'Resource cannot be created.', 'woocommerce' ), array( 'status' => 500 ) );
- }
-
- $method = $this->update_fields( $instance_id, $method, $request );
- if ( is_wp_error( $method ) ) {
- return $method;
- }
-
- $data = $this->prepare_item_for_response( $method, $request );
- return rest_ensure_response( $data );
- }
-
- /**
- * Delete a shipping method instance.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_Error|boolean
- */
- public function delete_item( $request ) {
- $zone = $this->get_zone( $request['zone_id'] );
- if ( is_wp_error( $zone ) ) {
- return $zone;
- }
-
- $instance_id = (int) $request['instance_id'];
- $force = $request['force'];
-
- $methods = $zone->get_shipping_methods();
- $method = false;
-
- foreach ( $methods as $method_obj ) {
- if ( $instance_id === $method_obj->instance_id ) {
- $method = $method_obj;
- break;
- }
- }
-
- if ( false === $method ) {
- return new WP_Error( 'woocommerce_rest_shipping_zone_method_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) );
- }
-
- $method = $this->update_fields( $instance_id, $method, $request );
- if ( is_wp_error( $method ) ) {
- return $method;
- }
-
- $request->set_param( 'context', 'view' );
- $response = $this->prepare_item_for_response( $method, $request );
-
- // Actually delete.
- if ( $force ) {
- $zone->delete_shipping_method( $instance_id );
- } else {
- return new WP_Error( 'rest_trash_not_supported', __( 'Shipping methods do not support trashing.', 'woocommerce' ), array( 'status' => 501 ) );
- }
-
- /**
- * Fires after a product review is deleted via the REST API.
- *
- * @param object $method
- * @param WP_REST_Response $response The response data.
- * @param WP_REST_Request $request The request sent to the API.
- */
- do_action( 'rest_delete_product_review', $method, $response, $request );
-
- return $response;
- }
-
- /**
- * Update A Single Shipping Zone Method.
- *
- * @param WP_REST_Request $request Request data.
- * @return WP_REST_Response|WP_Error
- */
- public function update_item( $request ) {
- $zone = $this->get_zone( $request['zone_id'] );
- if ( is_wp_error( $zone ) ) {
- return $zone;
- }
-
- $instance_id = (int) $request['instance_id'];
- $methods = $zone->get_shipping_methods();
- $method = false;
-
- foreach ( $methods as $method_obj ) {
- if ( $instance_id === $method_obj->instance_id ) {
- $method = $method_obj;
- break;
- }
- }
-
- if ( false === $method ) {
- return new WP_Error( 'woocommerce_rest_shipping_zone_method_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) );
- }
-
- $method = $this->update_fields( $instance_id, $method, $request );
- if ( is_wp_error( $method ) ) {
- return $method;
- }
-
- $data = $this->prepare_item_for_response( $method, $request );
- return rest_ensure_response( $data );
- }
-
- /**
- * Updates settings, order, and enabled status on create.
- *
- * @param int $instance_id Instance ID.
- * @param WC_Shipping_Method $method Shipping method data.
- * @param WP_REST_Request $request Request data.
- *
- * @return WC_Shipping_Method
- */
- public function update_fields( $instance_id, $method, $request ) {
- global $wpdb;
-
- // Update settings if present.
- if ( isset( $request['settings'] ) ) {
- $method->init_instance_settings();
- $instance_settings = $method->instance_settings;
- $errors_found = false;
- foreach ( $method->get_instance_form_fields() as $key => $field ) {
- if ( isset( $request['settings'][ $key ] ) ) {
- if ( is_callable( array( $this, 'validate_setting_' . $field['type'] . '_field' ) ) ) {
- $value = $this->{'validate_setting_' . $field['type'] . '_field'}( $request['settings'][ $key ], $field );
- } else {
- $value = $this->validate_setting_text_field( $request['settings'][ $key ], $field );
- }
- if ( is_wp_error( $value ) ) {
- $errors_found = true;
- break;
- }
- $instance_settings[ $key ] = $value;
- }
- }
-
- if ( $errors_found ) {
- return new WP_Error( 'rest_setting_value_invalid', __( 'An invalid setting value was passed.', 'woocommerce' ), array( 'status' => 400 ) );
- }
-
- update_option( $method->get_instance_option_key(), apply_filters( 'woocommerce_shipping_' . $method->id . '_instance_settings_values', $instance_settings, $method ) );
- }
-
- // Update order.
- if ( isset( $request['order'] ) ) {
- $wpdb->update( "{$wpdb->prefix}woocommerce_shipping_zone_methods", array( 'method_order' => absint( $request['order'] ) ), array( 'instance_id' => absint( $instance_id ) ) );
- $method->method_order = absint( $request['order'] );
- }
-
- // Update if this method is enabled or not.
- if ( isset( $request['enabled'] ) ) {
- if ( $wpdb->update( "{$wpdb->prefix}woocommerce_shipping_zone_methods", array( 'is_enabled' => $request['enabled'] ), array( 'instance_id' => absint( $instance_id ) ) ) ) {
- do_action( 'woocommerce_shipping_zone_method_status_toggled', $instance_id, $method->id, $request['zone_id'], $request['enabled'] );
- $method->enabled = ( true === $request['enabled'] ? 'yes' : 'no' );
- }
- }
-
- return $method;
- }
-
- /**
- * Prepare the Shipping Zone Method for the REST response.
- *
- * @param array $item Shipping Zone Method.
- * @param WP_REST_Request $request Request object.
- * @return WP_REST_Response $response
- */
- public function prepare_item_for_response( $item, $request ) {
- $method = array(
- 'id' => $item->instance_id,
- 'instance_id' => $item->instance_id,
- 'title' => $item->instance_settings['title'],
- 'order' => $item->method_order,
- 'enabled' => ( 'yes' === $item->enabled ),
- 'method_id' => $item->id,
- 'method_title' => $item->method_title,
- 'method_description' => $item->method_description,
- 'settings' => $this->get_settings( $item ),
- );
-
- $context = empty( $request['context'] ) ? 'view' : $request['context'];
- $data = $this->add_additional_fields_to_object( $method, $request );
- $data = $this->filter_response_by_context( $data, $context );
-
- // Wrap the data in a response object.
- $response = rest_ensure_response( $data );
-
- $response->add_links( $this->prepare_links( $request['zone_id'], $item->instance_id ) );
-
- $response = $this->prepare_response_for_collection( $response );
-
- return $response;
- }
-
- /**
- * Return settings associated with this shipping zone method instance.
- *
- * @param WC_Shipping_Method $item Shipping method data.
- *
- * @return array
- */
- public function get_settings( $item ) {
- $item->init_instance_settings();
- $settings = array();
- foreach ( $item->get_instance_form_fields() as $id => $field ) {
- $data = array(
- 'id' => $id,
- 'label' => $field['title'],
- 'description' => empty( $field['description'] ) ? '' : $field['description'],
- 'type' => $field['type'],
- 'value' => $item->instance_settings[ $id ],
- 'default' => empty( $field['default'] ) ? '' : $field['default'],
- 'tip' => empty( $field['description'] ) ? '' : $field['description'],
- 'placeholder' => empty( $field['placeholder'] ) ? '' : $field['placeholder'],
- );
- if ( ! empty( $field['options'] ) ) {
- $data['options'] = $field['options'];
- }
- $settings[ $id ] = $data;
- }
- return $settings;
- }
-
- /**
- * Prepare links for the request.
- *
- * @param int $zone_id Given Shipping Zone ID.
- * @param int $instance_id Given Shipping Zone Method Instance ID.
- * @return array Links for the given Shipping Zone Method.
- */
- protected function prepare_links( $zone_id, $instance_id ) {
- $base = '/' . $this->namespace . '/' . $this->rest_base . '/' . $zone_id;
- $links = array(
- 'self' => array(
- 'href' => rest_url( $base . '/methods/' . $instance_id ),
- ),
- 'collection' => array(
- 'href' => rest_url( $base . '/methods' ),
- ),
- 'describes' => array(
- 'href' => rest_url( $base ),
- ),
- );
-
- return $links;
- }
-
- /**
- * Get the Shipping Zone Methods schema, conforming to JSON Schema
- *
- * @return array
- */
- public function get_item_schema() {
- $schema = array(
- '$schema' => 'http://json-schema.org/draft-04/schema#',
- 'title' => 'shipping_zone_method',
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Shipping method instance ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'instance_id' => array(
- 'description' => __( 'Shipping method instance ID.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'title' => array(
- 'description' => __( 'Shipping method customer facing title.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'order' => array(
- 'description' => __( 'Shipping method sort order.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- ),
- 'enabled' => array(
- 'description' => __( 'Shipping method enabled status.', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view', 'edit' ),
- ),
- 'method_id' => array(
- 'description' => __( 'Shipping method ID.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'method_title' => array(
- 'description' => __( 'Shipping method title.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'method_description' => array(
- 'description' => __( 'Shipping method description.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'settings' => array(
- 'description' => __( 'Shipping method settings.', 'woocommerce' ),
- 'type' => 'object',
- 'context' => array( 'view', 'edit' ),
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'A unique identifier for the setting.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'label' => array(
- 'description' => __( 'A human readable label for the setting used in interfaces.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'description' => array(
- 'description' => __( 'A human readable description for the setting used in interfaces.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'type' => array(
- 'description' => __( 'Type of setting.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'enum' => array( 'text', 'email', 'number', 'color', 'password', 'textarea', 'select', 'multiselect', 'radio', 'image_width', 'checkbox' ),
- 'readonly' => true,
- ),
- 'value' => array(
- 'description' => __( 'Setting value.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'default' => array(
- 'description' => __( 'Default value for the setting.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'tip' => array(
- 'description' => __( 'Additional help text shown to the user about the setting.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'placeholder' => array(
- 'description' => __( 'Placeholder text to be displayed in text inputs.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- ),
- ),
- ),
- );
-
- return $this->add_additional_fields_schema( $schema );
- }
+ protected $namespace = 'wc/v3';
}
diff --git a/includes/api/class-wc-rest-shipping-zones-controller.php b/includes/api/class-wc-rest-shipping-zones-controller.php
index d2d8e5b2ade..dd766a3291c 100644
--- a/includes/api/class-wc-rest-shipping-zones-controller.php
+++ b/includes/api/class-wc-rest-shipping-zones-controller.php
@@ -14,291 +14,14 @@ defined( 'ABSPATH' ) || exit;
* REST API Shipping Zones class.
*
* @package WooCommerce/API
- * @extends WC_REST_Shipping_Zones_Controller_Base
+ * @extends WC_REST_Shipping_Zones_V2_Controller
*/
-class WC_REST_Shipping_Zones_Controller extends WC_REST_Shipping_Zones_Controller_Base {
+class WC_REST_Shipping_Zones_Controller extends WC_REST_Shipping_Zones_V2_Controller {
/**
- * Register the routes for Shipping Zones.
- */
- public function register_routes() {
- register_rest_route(
- $this->namespace, '/' . $this->rest_base, array(
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_items' ),
- 'permission_callback' => array( $this, 'get_items_permissions_check' ),
- ),
- array(
- 'methods' => WP_REST_Server::CREATABLE,
- 'callback' => array( $this, 'create_item' ),
- 'permission_callback' => array( $this, 'create_item_permissions_check' ),
- 'args' => array_merge(
- $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), array(
- 'name' => array(
- 'required' => true,
- 'type' => 'string',
- 'description' => __( 'Shipping zone name.', 'woocommerce' ),
- ),
- )
- ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
-
- register_rest_route(
- $this->namespace, '/' . $this->rest_base . '/(?P[\d-]+)', array(
- 'args' => array(
- 'id' => array(
- 'description' => __( 'Unique ID for the resource.', 'woocommerce' ),
- 'type' => 'integer',
- ),
- ),
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_item' ),
- 'permission_callback' => array( $this, 'get_items_permissions_check' ),
- ),
- array(
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => array( $this, 'update_item' ),
- 'permission_callback' => array( $this, 'update_items_permissions_check' ),
- 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
- ),
- array(
- 'methods' => WP_REST_Server::DELETABLE,
- 'callback' => array( $this, 'delete_item' ),
- 'permission_callback' => array( $this, 'delete_items_permissions_check' ),
- 'args' => array(
- 'force' => array(
- 'default' => false,
- 'type' => 'boolean',
- 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ),
- ),
- ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
- }
-
- /**
- * Get a single Shipping Zone.
+ * Endpoint namespace.
*
- * @param WP_REST_Request $request Request data.
- * @return WP_REST_Response|WP_Error
+ * @var string
*/
- public function get_item( $request ) {
- $zone = $this->get_zone( $request->get_param( 'id' ) );
-
- if ( is_wp_error( $zone ) ) {
- return $zone;
- }
-
- $data = $zone->get_data();
- $data = $this->prepare_item_for_response( $data, $request );
- $data = $this->prepare_response_for_collection( $data );
-
- return rest_ensure_response( $data );
- }
-
- /**
- * Get all Shipping Zones.
- *
- * @param WP_REST_Request $request Request data.
- * @return WP_REST_Response
- */
- public function get_items( $request ) {
- $rest_of_the_world = WC_Shipping_Zones::get_zone_by( 'zone_id', 0 );
-
- $zones = WC_Shipping_Zones::get_zones();
- array_unshift( $zones, $rest_of_the_world->get_data() );
- $data = array();
-
- foreach ( $zones as $zone_obj ) {
- $zone = $this->prepare_item_for_response( $zone_obj, $request );
- $zone = $this->prepare_response_for_collection( $zone );
- $data[] = $zone;
- }
-
- return rest_ensure_response( $data );
- }
-
- /**
- * Create a single Shipping Zone.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_REST_Request|WP_Error
- */
- public function create_item( $request ) {
- $zone = new WC_Shipping_Zone( null );
-
- if ( ! is_null( $request->get_param( 'name' ) ) ) {
- $zone->set_zone_name( $request->get_param( 'name' ) );
- }
-
- if ( ! is_null( $request->get_param( 'order' ) ) ) {
- $zone->set_zone_order( $request->get_param( 'order' ) );
- }
-
- $zone->save();
-
- if ( $zone->get_id() !== 0 ) {
- $request->set_param( 'id', $zone->get_id() );
- $response = $this->get_item( $request );
- $response->set_status( 201 );
- $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $zone->get_id() ) ) );
- return $response;
- } else {
- return new WP_Error( 'woocommerce_rest_shipping_zone_not_created', __( "Resource cannot be created. Check to make sure 'order' and 'name' are present.", 'woocommerce' ), array( 'status' => 500 ) );
- }
- }
-
- /**
- * Update a single Shipping Zone.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_REST_Request|WP_Error
- */
- public function update_item( $request ) {
- $zone = $this->get_zone( $request->get_param( 'id' ) );
-
- if ( is_wp_error( $zone ) ) {
- return $zone;
- }
-
- if ( 0 === $zone->get_id() ) {
- return new WP_Error( 'woocommerce_rest_shipping_zone_invalid_zone', __( 'The "locations not covered by your other zones" zone cannot be updated.', 'woocommerce' ), array( 'status' => 403 ) );
- }
-
- $zone_changed = false;
-
- if ( ! is_null( $request->get_param( 'name' ) ) ) {
- $zone->set_zone_name( $request->get_param( 'name' ) );
- $zone_changed = true;
- }
-
- if ( ! is_null( $request->get_param( 'order' ) ) ) {
- $zone->set_zone_order( $request->get_param( 'order' ) );
- $zone_changed = true;
- }
-
- if ( $zone_changed ) {
- $zone->save();
- }
-
- return $this->get_item( $request );
- }
-
- /**
- * Delete a single Shipping Zone.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_REST_Request|WP_Error
- */
- public function delete_item( $request ) {
- $zone = $this->get_zone( $request->get_param( 'id' ) );
-
- if ( is_wp_error( $zone ) ) {
- return $zone;
- }
-
- $force = $request['force'];
-
- $response = $this->get_item( $request );
-
- if ( $force ) {
- $zone->delete();
- } else {
- return new WP_Error( 'rest_trash_not_supported', __( 'Shipping zones do not support trashing.', 'woocommerce' ), array( 'status' => 501 ) );
- }
-
- return $response;
- }
-
- /**
- * Prepare the Shipping Zone for the REST response.
- *
- * @param array $item Shipping Zone.
- * @param WP_REST_Request $request Request object.
- * @return WP_REST_Response $response
- */
- public function prepare_item_for_response( $item, $request ) {
- $data = array(
- 'id' => (int) $item['id'],
- 'name' => $item['zone_name'],
- 'order' => (int) $item['zone_order'],
- );
-
- $context = empty( $request['context'] ) ? 'view' : $request['context'];
- $data = $this->add_additional_fields_to_object( $data, $request );
- $data = $this->filter_response_by_context( $data, $context );
-
- // Wrap the data in a response object.
- $response = rest_ensure_response( $data );
-
- $response->add_links( $this->prepare_links( $data['id'] ) );
-
- return $response;
- }
-
- /**
- * Prepare links for the request.
- *
- * @param int $zone_id Given Shipping Zone ID.
- * @return array Links for the given Shipping Zone.
- */
- protected function prepare_links( $zone_id ) {
- $base = '/' . $this->namespace . '/' . $this->rest_base;
- $links = array(
- 'self' => array(
- 'href' => rest_url( trailingslashit( $base ) . $zone_id ),
- ),
- 'collection' => array(
- 'href' => rest_url( $base ),
- ),
- 'describedby' => array(
- 'href' => rest_url( trailingslashit( $base ) . $zone_id . '/locations' ),
- ),
- );
-
- return $links;
- }
-
- /**
- * Get the Shipping Zones schema, conforming to JSON Schema
- *
- * @return array
- */
- public function get_item_schema() {
- $schema = array(
- '$schema' => 'http://json-schema.org/draft-04/schema#',
- 'title' => 'shipping_zone',
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'name' => array(
- 'description' => __( 'Shipping zone name.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'arg_options' => array(
- 'sanitize_callback' => 'sanitize_text_field',
- ),
- ),
- 'order' => array(
- 'description' => __( 'Shipping zone order.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- ),
- ),
- );
-
- return $this->add_additional_fields_schema( $schema );
- }
+ protected $namespace = 'wc/v3';
}
diff --git a/includes/api/class-wc-rest-system-status-controller.php b/includes/api/class-wc-rest-system-status-controller.php
index fd010c46d3d..78b37fbe162 100644
--- a/includes/api/class-wc-rest-system-status-controller.php
+++ b/includes/api/class-wc-rest-system-status-controller.php
@@ -14,1092 +14,14 @@ defined( 'ABSPATH' ) || exit;
* System status controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Controller
+ * @extends WC_REST_System_Status_V2_Controller
*/
-class WC_REST_System_Status_Controller extends WC_REST_Controller {
+class WC_REST_System_Status_Controller extends WC_REST_System_Status_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
-
- /**
- * Route base.
- *
- * @var string
- */
- protected $rest_base = 'system_status';
-
- /**
- * Register the route for /system_status
- */
- public function register_routes() {
- register_rest_route(
- $this->namespace, '/' . $this->rest_base,
- array(
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_items' ),
- 'permission_callback' => array( $this, 'get_items_permissions_check' ),
- 'args' => $this->get_collection_params(),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
- }
-
- /**
- * Check whether a given request has permission to view system status.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_Error|boolean
- */
- public function get_items_permissions_check( $request ) {
- if ( ! wc_rest_check_manager_permissions( 'system_status', 'read' ) ) {
- return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
- }
- return true;
- }
-
- /**
- * Get a system status info, by section.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_Error|WP_REST_Response
- */
- public function get_items( $request ) {
- $schema = $this->get_item_schema();
- $mappings = $this->get_item_mappings();
- $response = array();
-
- foreach ( $mappings as $section => $values ) {
- foreach ( $values as $key => $value ) {
- if ( isset( $schema['properties'][ $section ]['properties'][ $key ]['type'] ) ) {
- settype( $values[ $key ], $schema['properties'][ $section ]['properties'][ $key ]['type'] );
- }
- }
- settype( $values, $schema['properties'][ $section ]['type'] );
- $response[ $section ] = $values;
- }
-
- $response = $this->prepare_item_for_response( $response, $request );
-
- return rest_ensure_response( $response );
- }
-
- /**
- * Get the system status schema, conforming to JSON Schema.
- *
- * @return array
- */
- public function get_item_schema() {
- $schema = array(
- '$schema' => 'http://json-schema.org/draft-04/schema#',
- 'title' => 'system_status',
- 'type' => 'object',
- 'properties' => array(
- 'environment' => array(
- 'description' => __( 'Environment.', 'woocommerce' ),
- 'type' => 'object',
- 'context' => array( 'view' ),
- 'readonly' => true,
- 'properties' => array(
- 'home_url' => array(
- 'description' => __( 'Home URL.', 'woocommerce' ),
- 'type' => 'string',
- 'format' => 'uri',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'site_url' => array(
- 'description' => __( 'Site URL.', 'woocommerce' ),
- 'type' => 'string',
- 'format' => 'uri',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'wc_version' => array(
- 'description' => __( 'WooCommerce version.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'log_directory' => array(
- 'description' => __( 'Log directory.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'log_directory_writable' => array(
- 'description' => __( 'Is log directory writable?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'wp_version' => array(
- 'description' => __( 'WordPress version.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'wp_multisite' => array(
- 'description' => __( 'Is WordPress multisite?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'wp_memory_limit' => array(
- 'description' => __( 'WordPress memory limit.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'wp_debug_mode' => array(
- 'description' => __( 'Is WordPress debug mode active?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'wp_cron' => array(
- 'description' => __( 'Are WordPress cron jobs enabled?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'language' => array(
- 'description' => __( 'WordPress language.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'server_info' => array(
- 'description' => __( 'Server info.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'php_version' => array(
- 'description' => __( 'PHP version.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'php_post_max_size' => array(
- 'description' => __( 'PHP post max size.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'php_max_execution_time' => array(
- 'description' => __( 'PHP max execution time.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'php_max_input_vars' => array(
- 'description' => __( 'PHP max input vars.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'curl_version' => array(
- 'description' => __( 'cURL version.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'suhosin_installed' => array(
- 'description' => __( 'Is SUHOSIN installed?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'max_upload_size' => array(
- 'description' => __( 'Max upload size.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'mysql_version' => array(
- 'description' => __( 'MySQL version.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'mysql_version_string' => array(
- 'description' => __( 'MySQL version string.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'default_timezone' => array(
- 'description' => __( 'Default timezone.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'fsockopen_or_curl_enabled' => array(
- 'description' => __( 'Is fsockopen/cURL enabled?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'soapclient_enabled' => array(
- 'description' => __( 'Is SoapClient class enabled?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'domdocument_enabled' => array(
- 'description' => __( 'Is DomDocument class enabled?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'gzip_enabled' => array(
- 'description' => __( 'Is GZip enabled?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'mbstring_enabled' => array(
- 'description' => __( 'Is mbstring enabled?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'remote_post_successful' => array(
- 'description' => __( 'Remote POST successful?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'remote_post_response' => array(
- 'description' => __( 'Remote POST response.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'remote_get_successful' => array(
- 'description' => __( 'Remote GET successful?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'remote_get_response' => array(
- 'description' => __( 'Remote GET response.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- ),
- ),
- 'database' => array(
- 'description' => __( 'Database.', 'woocommerce' ),
- 'type' => 'object',
- 'context' => array( 'view' ),
- 'readonly' => true,
- 'properties' => array(
- 'wc_database_version' => array(
- 'description' => __( 'WC database version.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'database_prefix' => array(
- 'description' => __( 'Database prefix.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'maxmind_geoip_database' => array(
- 'description' => __( 'MaxMind GeoIP database.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'database_tables' => array(
- 'description' => __( 'Database tables.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view' ),
- 'readonly' => true,
- 'items' => array(
- 'type' => 'string',
- ),
- ),
- ),
- ),
- 'active_plugins' => array(
- 'description' => __( 'Active plugins.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view' ),
- 'readonly' => true,
- 'items' => array(
- 'type' => 'string',
- ),
- ),
- 'theme' => array(
- 'description' => __( 'Theme.', 'woocommerce' ),
- 'type' => 'object',
- 'context' => array( 'view' ),
- 'readonly' => true,
- 'properties' => array(
- 'name' => array(
- 'description' => __( 'Theme name.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'version' => array(
- 'description' => __( 'Theme version.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'version_latest' => array(
- 'description' => __( 'Latest version of theme.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'author_url' => array(
- 'description' => __( 'Theme author URL.', 'woocommerce' ),
- 'type' => 'string',
- 'format' => 'uri',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'is_child_theme' => array(
- 'description' => __( 'Is this theme a child theme?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'has_woocommerce_support' => array(
- 'description' => __( 'Does the theme declare WooCommerce support?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'has_woocommerce_file' => array(
- 'description' => __( 'Does the theme have a woocommerce.php file?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'has_outdated_templates' => array(
- 'description' => __( 'Does this theme have outdated templates?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'overrides' => array(
- 'description' => __( 'Template overrides.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view' ),
- 'readonly' => true,
- 'items' => array(
- 'type' => 'string',
- ),
- ),
- 'parent_name' => array(
- 'description' => __( 'Parent theme name.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'parent_version' => array(
- 'description' => __( 'Parent theme version.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'parent_author_url' => array(
- 'description' => __( 'Parent theme author URL.', 'woocommerce' ),
- 'type' => 'string',
- 'format' => 'uri',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- ),
- ),
- 'settings' => array(
- 'description' => __( 'Settings.', 'woocommerce' ),
- 'type' => 'object',
- 'context' => array( 'view' ),
- 'readonly' => true,
- 'properties' => array(
- 'api_enabled' => array(
- 'description' => __( 'REST API enabled?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'force_ssl' => array(
- 'description' => __( 'SSL forced?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'currency' => array(
- 'description' => __( 'Currency.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'currency_symbol' => array(
- 'description' => __( 'Currency symbol.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'currency_position' => array(
- 'description' => __( 'Currency position.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'thousand_separator' => array(
- 'description' => __( 'Thousand separator.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'decimal_separator' => array(
- 'description' => __( 'Decimal separator.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'number_of_decimals' => array(
- 'description' => __( 'Number of decimals.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'geolocation_enabled' => array(
- 'description' => __( 'Geolocation enabled?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'taxonomies' => array(
- 'description' => __( 'Taxonomy terms for product/order statuses.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view' ),
- 'readonly' => true,
- 'items' => array(
- 'type' => 'string',
- ),
- ),
- 'product_visibility_terms' => array(
- 'description' => __( 'Terms in the product visibility taxonomy.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view' ),
- 'readonly' => true,
- 'items' => array(
- 'type' => 'string',
- ),
- ),
- ),
- ),
- 'security' => array(
- 'description' => __( 'Security.', 'woocommerce' ),
- 'type' => 'object',
- 'context' => array( 'view' ),
- 'readonly' => true,
- 'properties' => array(
- 'secure_connection' => array(
- 'description' => __( 'Is the connection to your store secure?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- 'hide_errors' => array(
- 'description' => __( 'Hide errors from visitors?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'view' ),
- 'readonly' => true,
- ),
- ),
- ),
- 'pages' => array(
- 'description' => __( 'WooCommerce pages.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view' ),
- 'readonly' => true,
- 'items' => array(
- 'type' => 'string',
- ),
- ),
- ),
- );
-
- return $this->add_additional_fields_schema( $schema );
- }
-
- /**
- * Return an array of sections and the data associated with each.
- *
- * @return array
- */
- public function get_item_mappings() {
- return array(
- 'environment' => $this->get_environment_info(),
- 'database' => $this->get_database_info(),
- 'active_plugins' => $this->get_active_plugins(),
- 'theme' => $this->get_theme_info(),
- 'settings' => $this->get_settings(),
- 'security' => $this->get_security_info(),
- 'pages' => $this->get_pages(),
- );
- }
-
- /**
- * Get array of environment information. Includes thing like software
- * versions, and various server settings.
- *
- * @return array
- */
- public function get_environment_info() {
- global $wpdb;
-
- // Figure out cURL version, if installed.
- $curl_version = '';
- if ( function_exists( 'curl_version' ) ) {
- $curl_version = curl_version();
- $curl_version = $curl_version['version'] . ', ' . $curl_version['ssl_version'];
- }
-
- // WP memory limit.
- $wp_memory_limit = wc_let_to_num( WP_MEMORY_LIMIT );
- if ( function_exists( 'memory_get_usage' ) ) {
- $wp_memory_limit = max( $wp_memory_limit, wc_let_to_num( @ini_get( 'memory_limit' ) ) );
- }
-
- // Test POST requests.
- $post_response = wp_safe_remote_post(
- 'https://www.paypal.com/cgi-bin/webscr',
- array(
- 'timeout' => 10,
- 'user-agent' => 'WooCommerce/' . WC()->version,
- 'httpversion' => '1.1',
- 'body' => array(
- 'cmd' => '_notify-validate',
- ),
- )
- );
- $post_response_successful = false;
- if ( ! is_wp_error( $post_response ) && $post_response['response']['code'] >= 200 && $post_response['response']['code'] < 300 ) {
- $post_response_successful = true;
- }
-
- // Test GET requests.
- $get_response = wp_safe_remote_get( 'https://woocommerce.com/wc-api/product-key-api?request=ping&network=' . ( is_multisite() ? '1' : '0' ) );
- $get_response_successful = false;
- if ( ! is_wp_error( $post_response ) && $post_response['response']['code'] >= 200 && $post_response['response']['code'] < 300 ) {
- $get_response_successful = true;
- }
-
- $database_version = wc_get_server_database_version();
-
- // Return all environment info. Described by JSON Schema.
- return array(
- 'home_url' => get_option( 'home' ),
- 'site_url' => get_option( 'siteurl' ),
- 'version' => WC()->version,
- 'log_directory' => WC_LOG_DIR,
- 'log_directory_writable' => (bool) @fopen( WC_LOG_DIR . 'test-log.log', 'a' ),
- 'wp_version' => get_bloginfo( 'version' ),
- 'wp_multisite' => is_multisite(),
- 'wp_memory_limit' => $wp_memory_limit,
- 'wp_debug_mode' => ( defined( 'WP_DEBUG' ) && WP_DEBUG ),
- 'wp_cron' => ! ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ),
- 'language' => get_locale(),
- 'external_object_cache' => wp_using_ext_object_cache(),
- 'server_info' => isset( $_SERVER['SERVER_SOFTWARE'] ) ? wc_clean( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) ) : '',
- 'php_version' => phpversion(),
- 'php_post_max_size' => wc_let_to_num( ini_get( 'post_max_size' ) ),
- 'php_max_execution_time' => ini_get( 'max_execution_time' ),
- 'php_max_input_vars' => ini_get( 'max_input_vars' ),
- 'curl_version' => $curl_version,
- 'suhosin_installed' => extension_loaded( 'suhosin' ),
- 'max_upload_size' => wp_max_upload_size(),
- 'mysql_version' => $database_version['number'],
- 'mysql_version_string' => $database_version['string'],
- 'default_timezone' => date_default_timezone_get(),
- 'fsockopen_or_curl_enabled' => ( function_exists( 'fsockopen' ) || function_exists( 'curl_init' ) ),
- 'soapclient_enabled' => class_exists( 'SoapClient' ),
- 'domdocument_enabled' => class_exists( 'DOMDocument' ),
- 'gzip_enabled' => is_callable( 'gzopen' ),
- 'mbstring_enabled' => extension_loaded( 'mbstring' ),
- 'remote_post_successful' => $post_response_successful,
- 'remote_post_response' => ( is_wp_error( $post_response ) ? $post_response->get_error_message() : $post_response['response']['code'] ),
- 'remote_get_successful' => $get_response_successful,
- 'remote_get_response' => ( is_wp_error( $get_response ) ? $get_response->get_error_message() : $get_response['response']['code'] ),
- );
- }
-
- /**
- * Add prefix to table.
- *
- * @param string $table Table name.
- * @return stromg
- */
- protected function add_db_table_prefix( $table ) {
- global $wpdb;
- return $wpdb->prefix . $table;
- }
-
- /**
- * Get array of database information. Version, prefix, and table existence.
- *
- * @return array
- */
- public function get_database_info() {
- global $wpdb;
-
- $database_table_sizes = $wpdb->get_results(
- $wpdb->prepare(
- "SELECT
- table_name AS 'name',
- round( ( data_length / 1024 / 1024 ), 2 ) 'data',
- round( ( index_length / 1024 / 1024 ), 2 ) 'index'
- FROM information_schema.TABLES
- WHERE table_schema = %s
- ORDER BY name ASC;",
- DB_NAME
- )
- );
-
- // WC Core tables to check existence of.
- $core_tables = apply_filters(
- 'woocommerce_database_tables',
- array(
- 'woocommerce_sessions',
- 'woocommerce_api_keys',
- 'woocommerce_attribute_taxonomies',
- 'woocommerce_downloadable_product_permissions',
- 'woocommerce_order_items',
- 'woocommerce_order_itemmeta',
- 'woocommerce_tax_rates',
- 'woocommerce_tax_rate_locations',
- 'woocommerce_shipping_zones',
- 'woocommerce_shipping_zone_locations',
- 'woocommerce_shipping_zone_methods',
- 'woocommerce_payment_tokens',
- 'woocommerce_payment_tokenmeta',
- 'woocommerce_log',
- )
- );
-
- if ( get_option( 'db_version' ) < 34370 ) {
- $core_tables[] = 'woocommerce_termmeta';
- }
-
- /**
- * Adding the prefix to the tables array, for backwards compatibility.
- *
- * If we changed the tables above to include the prefix, then any filters against that table could break.
- */
- $core_tables = array_map( array( $this, 'add_db_table_prefix' ), $core_tables );
-
- /**
- * Organize WooCommerce and non-WooCommerce tables separately for display purposes later.
- *
- * To ensure we include all WC tables, even if they do not exist, pre-populate the WC array with all the tables.
- */
- $tables = array(
- 'woocommerce' => array_fill_keys( $core_tables, false ),
- 'other' => array(),
- );
-
- $database_size = array(
- 'data' => 0,
- 'index' => 0,
- );
-
- $site_tables = $wpdb->tables( 'all', true );
- foreach ( $database_table_sizes as $table ) {
- // Only include tables matching the prefix of the current site, this is to prevent displaying all tables on a MS install not relating to the current.
- if ( is_multisite() && ! in_array( $table->name, $site_tables, true ) ) {
- continue;
- }
- $table_type = in_array( $table->name, $core_tables ) ? 'woocommerce' : 'other';
-
- $tables[ $table_type ][ $table->name ] = array(
- 'data' => $table->data,
- 'index' => $table->index,
- );
-
- $database_size['data'] += $table->data;
- $database_size['index'] += $table->index;
- }
-
- // Return all database info. Described by JSON Schema.
- return array(
- 'wc_database_version' => get_option( 'woocommerce_db_version' ),
- 'database_prefix' => $wpdb->prefix,
- 'maxmind_geoip_database' => WC_Geolocation::get_local_database_path(),
- 'database_tables' => $tables,
- 'database_size' => $database_size,
- );
- }
-
- /**
- * Get array of counts of objects. Orders, products, etc.
- *
- * @return array
- */
- public function get_post_type_counts() {
- global $wpdb;
-
- $post_type_counts = $wpdb->get_results( "SELECT post_type AS 'type', count(1) AS 'count' FROM {$wpdb->posts} GROUP BY post_type;" );
-
- return is_array( $post_type_counts ) ? $post_type_counts : array();
- }
-
- /**
- * Get a list of plugins active on the site.
- *
- * @return array
- */
- public function get_active_plugins() {
- require_once ABSPATH . 'wp-admin/includes/plugin.php';
- require_once ABSPATH . 'wp-admin/includes/update.php';
-
- if ( ! function_exists( 'get_plugin_updates' ) ) {
- return array();
- }
-
- // Get both site plugins and network plugins.
- $active_plugins = (array) get_option( 'active_plugins', array() );
- if ( is_multisite() ) {
- $network_activated_plugins = array_keys( get_site_option( 'active_sitewide_plugins', array() ) );
- $active_plugins = array_merge( $active_plugins, $network_activated_plugins );
- }
-
- $active_plugins_data = array();
- $available_updates = get_plugin_updates();
-
- foreach ( $active_plugins as $plugin ) {
- $data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin );
- $dirname = dirname( $plugin );
- $version_latest = '';
- $slug = explode( '/', $plugin );
- $slug = explode( '.', end( $slug ) );
- $slug = $slug[0];
-
- if ( 'woocommerce' !== $slug && ( strstr( $data['PluginURI'], 'woothemes.com' ) || strstr( $data['PluginURI'], 'woocommerce.com' ) ) ) {
- $version_data = get_transient( md5( $plugin ) . '_version_data' );
- if ( false === $version_data ) {
- $changelog = wp_safe_remote_get( 'http://dzv365zjfbd8v.cloudfront.net/changelogs/' . $dirname . '/changelog.txt' );
- if ( 200 === wp_remote_retrieve_response_code( $changelog ) ) {
- $cl_lines = explode( "\n", wp_remote_retrieve_body( $changelog ) );
- if ( ! empty( $cl_lines ) ) {
- foreach ( $cl_lines as $line_num => $cl_line ) {
- if ( preg_match( '/^[0-9]/', $cl_line ) ) {
- $date = str_replace( '.', '-', trim( substr( $cl_line, 0, strpos( $cl_line, '-' ) ) ) );
- $version = preg_replace( '~[^0-9,.]~', '', stristr( $cl_line, 'version' ) );
- $update = trim( str_replace( '*', '', $cl_lines[ $line_num + 1 ] ) );
- $version_data = array(
- 'date' => $date,
- 'version' => $version,
- 'update' => $update,
- 'changelog' => $changelog,
- );
- set_transient( md5( $plugin ) . '_version_data', $version_data, DAY_IN_SECONDS );
- break;
- }
- }
- }
- } else {
- $args = (object) array(
- 'slug' => $dirname,
- );
- $request = array(
- 'action' => 'plugin_information',
- 'request' => serialize( $args ),
- );
- $plugin_info = wp_safe_remote_post( 'http://api.wordpress.org/plugins/info/1.0/', array( 'body' => $request ) );
- if ( 200 === wp_remote_retrieve_response_code( $plugin_info ) ) {
- $body = maybe_unserialize( wp_remote_retrieve_body( $plugin_info ) );
- if ( is_object( $body ) && isset( $body->sections['changelog'] ) ) {
- $version_data = array(
- 'date' => $body->last_updated,
- 'version' => $body->version,
- 'update' => $body->sections['changelog'],
- 'changelog' => $body->sections['changelog'],
- );
- set_transient( md5( $plugin ) . '_version_data', $version_data, DAY_IN_SECONDS );
- break;
- }
- }
- }
- }
- $version_latest = $version_data['version'];
- } elseif ( isset( $available_updates[ $plugin ]->update->new_version ) ) {
- $version_latest = $available_updates[ $plugin ]->update->new_version;
- }
-
- // convert plugin data to json response format.
- $active_plugins_data[] = array(
- 'plugin' => $plugin,
- 'name' => $data['Name'],
- 'version' => $data['Version'],
- 'version_latest' => $version_latest,
- 'url' => $data['PluginURI'],
- 'author_name' => $data['AuthorName'],
- 'author_url' => esc_url_raw( $data['AuthorURI'] ),
- 'network_activated' => $data['Network'],
- );
- }
-
- return $active_plugins_data;
- }
-
- /**
- * Get info on the current active theme, info on parent theme (if presnet)
- * and a list of template overrides.
- *
- * @return array
- */
- public function get_theme_info() {
- $active_theme = wp_get_theme();
-
- // Get parent theme info if this theme is a child theme, otherwise
- // pass empty info in the response.
- if ( is_child_theme() ) {
- $parent_theme = wp_get_theme( $active_theme->template );
- $parent_theme_info = array(
- 'parent_name' => $parent_theme->name,
- 'parent_version' => $parent_theme->version,
- 'parent_version_latest' => WC_Admin_Status::get_latest_theme_version( $parent_theme ),
- 'parent_author_url' => $parent_theme->{'Author URI'},
- );
- } else {
- $parent_theme_info = array(
- 'parent_name' => '',
- 'parent_version' => '',
- 'parent_version_latest' => '',
- 'parent_author_url' => '',
- );
- }
-
- /**
- * Scan the theme directory for all WC templates to see if our theme
- * overrides any of them.
- */
- $override_files = array();
- $outdated_templates = false;
- $scan_files = WC_Admin_Status::scan_template_files( WC()->plugin_path() . '/templates/' );
- foreach ( $scan_files as $file ) {
- $located = apply_filters( 'wc_get_template', $file, $file, array(), WC()->template_path(), WC()->plugin_path() . '/templates/' );
-
- if ( file_exists( $located ) ) {
- $theme_file = $located;
- } elseif ( file_exists( get_stylesheet_directory() . '/' . $file ) ) {
- $theme_file = get_stylesheet_directory() . '/' . $file;
- } elseif ( file_exists( get_stylesheet_directory() . '/' . WC()->template_path() . $file ) ) {
- $theme_file = get_stylesheet_directory() . '/' . WC()->template_path() . $file;
- } elseif ( file_exists( get_template_directory() . '/' . $file ) ) {
- $theme_file = get_template_directory() . '/' . $file;
- } elseif ( file_exists( get_template_directory() . '/' . WC()->template_path() . $file ) ) {
- $theme_file = get_template_directory() . '/' . WC()->template_path() . $file;
- } else {
- $theme_file = false;
- }
-
- if ( ! empty( $theme_file ) ) {
- $core_version = WC_Admin_Status::get_file_version( WC()->plugin_path() . '/templates/' . $file );
- $theme_version = WC_Admin_Status::get_file_version( $theme_file );
- if ( $core_version && ( empty( $theme_version ) || version_compare( $theme_version, $core_version, '<' ) ) ) {
- if ( ! $outdated_templates ) {
- $outdated_templates = true;
- }
- }
- $override_files[] = array(
- 'file' => str_replace( WP_CONTENT_DIR . '/themes/', '', $theme_file ),
- 'version' => $theme_version,
- 'core_version' => $core_version,
- );
- }
- }
-
- $active_theme_info = array(
- 'name' => $active_theme->name,
- 'version' => $active_theme->version,
- 'version_latest' => WC_Admin_Status::get_latest_theme_version( $active_theme ),
- 'author_url' => esc_url_raw( $active_theme->{'Author URI'} ),
- 'is_child_theme' => is_child_theme(),
- 'has_woocommerce_support' => current_theme_supports( 'woocommerce' ),
- 'has_woocommerce_file' => ( file_exists( get_stylesheet_directory() . '/woocommerce.php' ) || file_exists( get_template_directory() . '/woocommerce.php' ) ),
- 'has_outdated_templates' => $outdated_templates,
- 'overrides' => $override_files,
- );
-
- return array_merge( $active_theme_info, $parent_theme_info );
- }
-
- /**
- * Get some setting values for the site that are useful for debugging
- * purposes. For full settings access, use the settings api.
- *
- * @return array
- */
- public function get_settings() {
- // Get a list of terms used for product/order taxonomies.
- $term_response = array();
- $terms = get_terms( 'product_type', array( 'hide_empty' => 0 ) );
- foreach ( $terms as $term ) {
- $term_response[ $term->slug ] = strtolower( $term->name );
- }
-
- // Get a list of terms used for product visibility.
- $product_visibility_terms = array();
- $terms = get_terms( 'product_visibility', array( 'hide_empty' => 0 ) );
- foreach ( $terms as $term ) {
- $product_visibility_terms[ $term->slug ] = strtolower( $term->name );
- }
-
- // Return array of useful settings for debugging.
- return array(
- 'api_enabled' => 'yes' === get_option( 'woocommerce_api_enabled' ),
- 'force_ssl' => 'yes' === get_option( 'woocommerce_force_ssl_checkout' ),
- 'currency' => get_woocommerce_currency(),
- 'currency_symbol' => get_woocommerce_currency_symbol(),
- 'currency_position' => get_option( 'woocommerce_currency_pos' ),
- 'thousand_separator' => wc_get_price_thousand_separator(),
- 'decimal_separator' => wc_get_price_decimal_separator(),
- 'number_of_decimals' => wc_get_price_decimals(),
- 'geolocation_enabled' => in_array( get_option( 'woocommerce_default_customer_address' ), array( 'geolocation_ajax', 'geolocation' ) ),
- 'taxonomies' => $term_response,
- 'product_visibility_terms' => $product_visibility_terms,
- );
- }
-
- /**
- * Returns security tips.
- *
- * @return array
- */
- public function get_security_info() {
- $check_page = 0 < wc_get_page_id( 'shop' ) ? get_permalink( wc_get_page_id( 'shop' ) ) : get_home_url();
- return array(
- 'secure_connection' => 'https' === substr( $check_page, 0, 5 ),
- 'hide_errors' => ! ( defined( 'WP_DEBUG' ) && defined( 'WP_DEBUG_DISPLAY' ) && WP_DEBUG && WP_DEBUG_DISPLAY ) || 0 === intval( ini_get( 'display_errors' ) ),
- );
- }
-
- /**
- * Returns a mini-report on WC pages and if they are configured correctly:
- * Present, visible, and including the correct shortcode.
- *
- * @return array
- */
- public function get_pages() {
- // WC pages to check against.
- $check_pages = array(
- _x( 'Shop base', 'Page setting', 'woocommerce' ) => array(
- 'option' => 'woocommerce_shop_page_id',
- 'shortcode' => '',
- ),
- _x( 'Cart', 'Page setting', 'woocommerce' ) => array(
- 'option' => 'woocommerce_cart_page_id',
- 'shortcode' => '[' . apply_filters( 'woocommerce_cart_shortcode_tag', 'woocommerce_cart' ) . ']',
- ),
- _x( 'Checkout', 'Page setting', 'woocommerce' ) => array(
- 'option' => 'woocommerce_checkout_page_id',
- 'shortcode' => '[' . apply_filters( 'woocommerce_checkout_shortcode_tag', 'woocommerce_checkout' ) . ']',
- ),
- _x( 'My account', 'Page setting', 'woocommerce' ) => array(
- 'option' => 'woocommerce_myaccount_page_id',
- 'shortcode' => '[' . apply_filters( 'woocommerce_my_account_shortcode_tag', 'woocommerce_my_account' ) . ']',
- ),
- _x( 'Terms and conditions', 'Page setting', 'woocommerce' ) => array(
- 'option' => 'woocommerce_terms_page_id',
- 'shortcode' => '',
- ),
- );
-
- $pages_output = array();
- foreach ( $check_pages as $page_name => $values ) {
- $page_id = get_option( $values['option'] );
- $page_set = false;
- $page_exists = false;
- $page_visible = false;
- $shortcode_present = false;
- $shortcode_required = false;
-
- // Page checks.
- if ( $page_id ) {
- $page_set = true;
- }
- if ( get_post( $page_id ) ) {
- $page_exists = true;
- }
- if ( 'publish' === get_post_status( $page_id ) ) {
- $page_visible = true;
- }
-
- // Shortcode checks.
- if ( $values['shortcode'] && get_post( $page_id ) ) {
- $shortcode_required = true;
- $page = get_post( $page_id );
- if ( strstr( $page->post_content, $values['shortcode'] ) ) {
- $shortcode_present = true;
- }
- }
-
- // Wrap up our findings into an output array.
- $pages_output[] = array(
- 'page_name' => $page_name,
- 'page_id' => $page_id,
- 'page_set' => $page_set,
- 'page_exists' => $page_exists,
- 'page_visible' => $page_visible,
- 'shortcode' => $values['shortcode'],
- 'shortcode_required' => $shortcode_required,
- 'shortcode_present' => $shortcode_present,
- );
- }
-
- return $pages_output;
- }
-
- /**
- * Get any query params needed.
- *
- * @return array
- */
- public function get_collection_params() {
- return array(
- 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
- );
- }
-
- /**
- * Prepare the system status response
- *
- * @param array $system_status System status data.
- * @param WP_REST_Request $request Request object.
- * @return WP_REST_Response
- */
- public function prepare_item_for_response( $system_status, $request ) {
- $data = $this->add_additional_fields_to_object( $system_status, $request );
- $data = $this->filter_response_by_context( $data, 'view' );
-
- $response = rest_ensure_response( $data );
-
- /**
- * Filter the system status returned from the REST API.
- *
- * @param WP_REST_Response $response The response object.
- * @param mixed $system_status System status
- * @param WP_REST_Request $request Request object.
- */
- return apply_filters( 'woocommerce_rest_prepare_system_status', $response, $system_status, $request );
- }
+ protected $namespace = 'wc/v3';
}
diff --git a/includes/api/class-wc-rest-system-status-tools-controller.php b/includes/api/class-wc-rest-system-status-tools-controller.php
index b5cd3a98813..f1b0bef61d7 100644
--- a/includes/api/class-wc-rest-system-status-tools-controller.php
+++ b/includes/api/class-wc-rest-system-status-tools-controller.php
@@ -14,553 +14,14 @@ defined( 'ABSPATH' ) || exit;
* System status tools controller.
*
* @package WooCommerce/API
- * @extends WC_REST_Controller
+ * @extends WC_REST_System_Status_Tools_V2_Controller
*/
-class WC_REST_System_Status_Tools_Controller extends WC_REST_Controller {
+class WC_REST_System_Status_Tools_Controller extends WC_REST_System_Status_Tools_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
-
- /**
- * Route base.
- *
- * @var string
- */
- protected $rest_base = 'system_status/tools';
-
- /**
- * Register the routes for /system_status/tools/*.
- */
- public function register_routes() {
- register_rest_route(
- $this->namespace, '/' . $this->rest_base, array(
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_items' ),
- 'permission_callback' => array( $this, 'get_items_permissions_check' ),
- 'args' => $this->get_collection_params(),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
-
- register_rest_route(
- $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array(
- 'args' => array(
- 'id' => array(
- 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
- 'type' => 'string',
- ),
- ),
- array(
- 'methods' => WP_REST_Server::READABLE,
- 'callback' => array( $this, 'get_item' ),
- 'permission_callback' => array( $this, 'get_item_permissions_check' ),
- ),
- array(
- 'methods' => WP_REST_Server::EDITABLE,
- 'callback' => array( $this, 'update_item' ),
- 'permission_callback' => array( $this, 'update_item_permissions_check' ),
- 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
- ),
- 'schema' => array( $this, 'get_public_item_schema' ),
- )
- );
- }
-
- /**
- * Check whether a given request has permission to view system status tools.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_Error|boolean
- */
- public function get_items_permissions_check( $request ) {
- if ( ! wc_rest_check_manager_permissions( 'system_status', 'read' ) ) {
- return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
- }
- return true;
- }
-
- /**
- * Check whether a given request has permission to view a specific system status tool.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_Error|boolean
- */
- public function get_item_permissions_check( $request ) {
- if ( ! wc_rest_check_manager_permissions( 'system_status', 'read' ) ) {
- return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
- }
- return true;
- }
-
- /**
- * Check whether a given request has permission to execute a specific system status tool.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_Error|boolean
- */
- public function update_item_permissions_check( $request ) {
- if ( ! wc_rest_check_manager_permissions( 'system_status', 'edit' ) ) {
- return new WP_Error( 'woocommerce_rest_cannot_update', __( 'Sorry, you cannot update resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
- }
- return true;
- }
-
- /**
- * A list of available tools for use in the system status section.
- * 'button' becomes 'action' in the API.
- *
- * @return array
- */
- public function get_tools() {
- $tools = array(
- 'clear_transients' => array(
- 'name' => __( 'WooCommerce transients', 'woocommerce' ),
- 'button' => __( 'Clear transients', 'woocommerce' ),
- 'desc' => __( 'This tool will clear the product/shop transients cache.', 'woocommerce' ),
- ),
- 'clear_expired_transients' => array(
- 'name' => __( 'Expired transients', 'woocommerce' ),
- 'button' => __( 'Clear transients', 'woocommerce' ),
- 'desc' => __( 'This tool will clear ALL expired transients from WordPress.', 'woocommerce' ),
- ),
- 'delete_orphaned_variations' => array(
- 'name' => __( 'Orphaned variations', 'woocommerce' ),
- 'button' => __( 'Delete orphaned variations', 'woocommerce' ),
- 'desc' => __( 'This tool will delete all variations which have no parent.', 'woocommerce' ),
- ),
- 'clear_expired_download_permissions' => array(
- 'name' => __( 'Used-up download permissions', 'woocommerce' ),
- 'button' => __( 'Clean up download permissions', 'woocommerce' ),
- 'desc' => __( 'This tool will delete expired download permissions and permissions with 0 remaining downloads.', 'woocommerce' ),
- ),
- 'add_order_indexes' => array(
- 'name' => __( 'Order address indexes', 'woocommerce' ),
- 'button' => __( 'Index orders', 'woocommerce' ),
- 'desc' => __( 'This tool will add address indexes to orders that do not have them yet. This improves order search results.', 'woocommerce' ),
- ),
- 'recount_terms' => array(
- 'name' => __( 'Term counts', 'woocommerce' ),
- 'button' => __( 'Recount terms', 'woocommerce' ),
- 'desc' => __( 'This tool will recount product terms - useful when changing your settings in a way which hides products from the catalog.', 'woocommerce' ),
- ),
- 'reset_roles' => array(
- 'name' => __( 'Capabilities', 'woocommerce' ),
- 'button' => __( 'Reset capabilities', 'woocommerce' ),
- 'desc' => __( 'This tool will reset the admin, customer and shop_manager roles to default. Use this if your users cannot access all of the WooCommerce admin pages.', 'woocommerce' ),
- ),
- 'clear_sessions' => array(
- 'name' => __( 'Clear customer sessions', 'woocommerce' ),
- 'button' => __( 'Clear', 'woocommerce' ),
- 'desc' => sprintf(
- '%1$s %2$s',
- __( 'Note:', 'woocommerce' ),
- __( 'This tool will delete all customer session data from the database, including current carts and saved carts in the database.', 'woocommerce' )
- ),
- ),
- 'install_pages' => array(
- 'name' => __( 'Create default WooCommerce pages', 'woocommerce' ),
- 'button' => __( 'Create pages', 'woocommerce' ),
- 'desc' => sprintf(
- '%1$s %2$s',
- __( 'Note:', 'woocommerce' ),
- __( 'This tool will install all the missing WooCommerce pages. Pages already defined and set up will not be replaced.', 'woocommerce' )
- ),
- ),
- 'delete_taxes' => array(
- 'name' => __( 'Delete WooCommerce tax rates', 'woocommerce' ),
- 'button' => __( 'Delete tax rates', 'woocommerce' ),
- 'desc' => sprintf(
- '%1$s %2$s',
- __( 'Note:', 'woocommerce' ),
- __( 'This option will delete ALL of your tax rates, use with caution. This action cannot be reversed.', 'woocommerce' )
- ),
- ),
- 'reset_tracking' => array(
- 'name' => __( 'Reset usage tracking', 'woocommerce' ),
- 'button' => __( 'Reset', 'woocommerce' ),
- 'desc' => __( 'This will reset your usage tracking settings, causing it to show the opt-in banner again and not sending any data.', 'woocommerce' ),
- ),
- 'regenerate_thumbnails' => array(
- 'name' => __( 'Regenerate shop thumbnails', 'woocommerce' ),
- 'button' => __( 'Regenerate', 'woocommerce' ),
- 'desc' => __( 'This will regenerate all shop thumbnails to match your theme and/or image settings.', 'woocommerce' ),
- ),
- );
-
- // Jetpack does the image resizing heavy lifting so you don't have to.
- if ( ( class_exists( 'Jetpack' ) && Jetpack::is_module_active( 'photon' ) ) || ! apply_filters( 'woocommerce_background_image_regeneration', true ) ) {
- unset( $tools['regenerate_thumbnails'] );
- }
-
- return apply_filters( 'woocommerce_debug_tools', $tools );
- }
-
- /**
- * Get a list of system status tools.
- *
- * @param WP_REST_Request $request Full details about the request.
- * @return WP_Error|WP_REST_Response
- */
- public function get_items( $request ) {
- $tools = array();
- foreach ( $this->get_tools() as $id => $tool ) {
- $tools[] = $this->prepare_response_for_collection(
- $this->prepare_item_for_response(
- array(
- 'id' => $id,
- 'name' => $tool['name'],
- 'action' => $tool['button'],
- 'description' => $tool['desc'],
- ), $request
- )
- );
- }
-
- $response = rest_ensure_response( $tools );
- return $response;
- }
-
- /**
- * Return a single tool.
- *
- * @param WP_REST_Request $request Request data.
- * @return WP_Error|WP_REST_Response
- */
- public function get_item( $request ) {
- $tools = $this->get_tools();
- if ( empty( $tools[ $request['id'] ] ) ) {
- return new WP_Error( 'woocommerce_rest_system_status_tool_invalid_id', __( 'Invalid tool ID.', 'woocommerce' ), array( 'status' => 404 ) );
- }
- $tool = $tools[ $request['id'] ];
- return rest_ensure_response(
- $this->prepare_item_for_response(
- array(
- 'id' => $request['id'],
- 'name' => $tool['name'],
- 'action' => $tool['button'],
- 'description' => $tool['desc'],
- ), $request
- )
- );
- }
-
- /**
- * Update (execute) a tool.
- *
- * @param WP_REST_Request $request Request data.
- * @return WP_Error|WP_REST_Response
- */
- public function update_item( $request ) {
- $tools = $this->get_tools();
- if ( empty( $tools[ $request['id'] ] ) ) {
- return new WP_Error( 'woocommerce_rest_system_status_tool_invalid_id', __( 'Invalid tool ID.', 'woocommerce' ), array( 'status' => 404 ) );
- }
-
- $tool = $tools[ $request['id'] ];
- $tool = array(
- 'id' => $request['id'],
- 'name' => $tool['name'],
- 'action' => $tool['button'],
- 'description' => $tool['desc'],
- );
-
- $execute_return = $this->execute_tool( $request['id'] );
- $tool = array_merge( $tool, $execute_return );
-
- /**
- * Fires after a WooCommerce REST system status tool has been executed.
- *
- * @param array $tool Details about the tool that has been executed.
- * @param WP_REST_Request $request The current WP_REST_Request object.
- */
- do_action( 'woocommerce_rest_insert_system_status_tool', $tool, $request );
-
- $request->set_param( 'context', 'edit' );
- $response = $this->prepare_item_for_response( $tool, $request );
- return rest_ensure_response( $response );
- }
-
- /**
- * Prepare a tool item for serialization.
- *
- * @param array $item Object.
- * @param WP_REST_Request $request Request object.
- * @return WP_REST_Response $response Response data.
- */
- public function prepare_item_for_response( $item, $request ) {
- $context = empty( $request['context'] ) ? 'view' : $request['context'];
- $data = $this->add_additional_fields_to_object( $item, $request );
- $data = $this->filter_response_by_context( $data, $context );
-
- $response = rest_ensure_response( $data );
-
- $response->add_links( $this->prepare_links( $item['id'] ) );
-
- return $response;
- }
-
- /**
- * Get the system status tools schema, conforming to JSON Schema.
- *
- * @return array
- */
- public function get_item_schema() {
- $schema = array(
- '$schema' => 'http://json-schema.org/draft-04/schema#',
- 'title' => 'system_status_tool',
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'A unique identifier for the tool.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'arg_options' => array(
- 'sanitize_callback' => 'sanitize_title',
- ),
- ),
- 'name' => array(
- 'description' => __( 'Tool name.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'arg_options' => array(
- 'sanitize_callback' => 'sanitize_text_field',
- ),
- ),
- 'action' => array(
- 'description' => __( 'What running the tool will do.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'arg_options' => array(
- 'sanitize_callback' => 'sanitize_text_field',
- ),
- ),
- 'description' => array(
- 'description' => __( 'Tool description.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'arg_options' => array(
- 'sanitize_callback' => 'sanitize_text_field',
- ),
- ),
- 'success' => array(
- 'description' => __( 'Did the tool run successfully?', 'woocommerce' ),
- 'type' => 'boolean',
- 'context' => array( 'edit' ),
- ),
- 'message' => array(
- 'description' => __( 'Tool return message.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'edit' ),
- 'arg_options' => array(
- 'sanitize_callback' => 'sanitize_text_field',
- ),
- ),
- ),
- );
-
- return $this->add_additional_fields_schema( $schema );
- }
-
- /**
- * Prepare links for the request.
- *
- * @param string $id ID.
- * @return array
- */
- protected function prepare_links( $id ) {
- $base = '/' . $this->namespace . '/' . $this->rest_base;
- $links = array(
- 'item' => array(
- 'href' => rest_url( trailingslashit( $base ) . $id ),
- 'embeddable' => true,
- ),
- );
-
- return $links;
- }
-
- /**
- * Get any query params needed.
- *
- * @return array
- */
- public function get_collection_params() {
- return array(
- 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
- );
- }
-
- /**
- * Actually executes a tool.
- *
- * @param string $tool Tool.
- * @return array
- */
- public function execute_tool( $tool ) {
- global $wpdb;
- $ran = true;
- switch ( $tool ) {
- case 'clear_transients':
- wc_delete_product_transients();
- wc_delete_shop_order_transients();
-
- $attribute_taxonomies = wc_get_attribute_taxonomies();
-
- if ( $attribute_taxonomies ) {
- foreach ( $attribute_taxonomies as $attribute ) {
- delete_transient( 'wc_layered_nav_counts_pa_' . $attribute->attribute_name );
- }
- }
-
- WC_Cache_Helper::get_transient_version( 'shipping', true );
- $message = __( 'Product transients cleared', 'woocommerce' );
- break;
-
- case 'clear_expired_transients':
- /* translators: %d: amount of expired transients */
- $message = sprintf( __( '%d transients rows cleared', 'woocommerce' ), wc_delete_expired_transients() );
- break;
-
- case 'delete_orphaned_variations':
- // Delete orphans.
- $result = absint(
- $wpdb->query(
- "DELETE products
- FROM {$wpdb->posts} products
- LEFT JOIN {$wpdb->posts} wp ON wp.ID = products.post_parent
- WHERE wp.ID IS NULL AND products.post_type = 'product_variation';"
- )
- );
- /* translators: %d: amount of orphaned variations */
- $message = sprintf( __( '%d orphaned variations deleted', 'woocommerce' ), $result );
- break;
-
- case 'clear_expired_download_permissions':
- // Delete expired download permissions and ones with 0 downloads remaining.
- $result = absint(
- $wpdb->query(
- $wpdb->prepare(
- "DELETE FROM {$wpdb->prefix}woocommerce_downloadable_product_permissions
- WHERE ( downloads_remaining != '' AND downloads_remaining = 0 ) OR ( access_expires IS NOT NULL AND access_expires < %s )",
- date( 'Y-m-d', current_time( 'timestamp' ) )
- )
- )
- );
- /* translators: %d: amount of permissions */
- $message = sprintf( __( '%d permissions deleted', 'woocommerce' ), $result );
- break;
-
- case 'add_order_indexes':
- /*
- * Add billing and shipping address indexes containing the customer name for orders
- * that don't have address indexes yet.
- */
- $sql = "INSERT INTO {$wpdb->postmeta}( post_id, meta_key, meta_value )
- SELECT post_id, '%s', GROUP_CONCAT( meta_value SEPARATOR ' ' )
- FROM {$wpdb->postmeta}
- WHERE meta_key IN ( '%s', '%s' )
- AND post_id IN ( SELECT DISTINCT post_id FROM {$wpdb->postmeta}
- WHERE post_id NOT IN ( SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='%s' )
- AND post_id IN ( SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='%s' ) )
- GROUP BY post_id";
- $rows = $wpdb->query( $wpdb->prepare( $sql, '_billing_address_index', '_billing_first_name', '_billing_last_name', '_billing_address_index', '_billing_last_name' ) ); // WPCS: unprepared SQL ok.
- $rows += $wpdb->query( $wpdb->prepare( $sql, '_shipping_address_index', '_shipping_first_name', '_shipping_last_name', '_shipping_address_index', '_shipping_last_name' ) ); // WPCS: unprepared SQL ok.
-
- /* translators: %d: amount of indexes */
- $message = sprintf( __( '%d indexes added', 'woocommerce' ), $rows );
- break;
-
- case 'reset_roles':
- // Remove then re-add caps and roles.
- WC_Install::remove_roles();
- WC_Install::create_roles();
- $message = __( 'Roles successfully reset', 'woocommerce' );
- break;
-
- case 'recount_terms':
- $product_cats = get_terms(
- 'product_cat', array(
- 'hide_empty' => false,
- 'fields' => 'id=>parent',
- )
- );
- _wc_term_recount( $product_cats, get_taxonomy( 'product_cat' ), true, false );
- $product_tags = get_terms(
- 'product_tag', array(
- 'hide_empty' => false,
- 'fields' => 'id=>parent',
- )
- );
- _wc_term_recount( $product_tags, get_taxonomy( 'product_tag' ), true, false );
- $message = __( 'Terms successfully recounted', 'woocommerce' );
- break;
-
- case 'clear_sessions':
- $wpdb->query( "TRUNCATE {$wpdb->prefix}woocommerce_sessions" );
- $result = absint( $wpdb->query( "DELETE FROM {$wpdb->usermeta} WHERE meta_key='_woocommerce_persistent_cart_" . get_current_blog_id() . "';" ) ); // WPCS: unprepared SQL ok.
- wp_cache_flush();
- /* translators: %d: amount of sessions */
- $message = sprintf( __( 'Deleted all active sessions, and %d saved carts.', 'woocommerce' ), absint( $result ) );
- break;
-
- case 'install_pages':
- WC_Install::create_pages();
- $message = __( 'All missing WooCommerce pages successfully installed', 'woocommerce' );
- break;
-
- case 'delete_taxes':
- $wpdb->query( "TRUNCATE TABLE {$wpdb->prefix}woocommerce_tax_rates;" );
- $wpdb->query( "TRUNCATE TABLE {$wpdb->prefix}woocommerce_tax_rate_locations;" );
- WC_Cache_Helper::incr_cache_prefix( 'taxes' );
- $message = __( 'Tax rates successfully deleted', 'woocommerce' );
- break;
-
- case 'reset_tracking':
- if ( ! class_exists( 'WC_Tracker' ) ) {
- include_once WC_ABSPATH . 'includes/class-wc-tracker.php';
- }
- WC_Tracker::opt_out_request();
- delete_option( 'woocommerce_allow_tracking' );
- WC_Admin_Notices::add_notice( 'tracking' );
- $message = __( 'Usage tracking settings successfully reset.', 'woocommerce' );
- break;
-
- case 'regenerate_thumbnails':
- WC_Regenerate_Images::queue_image_regeneration();
- $message = __( 'Thumbnail regeneration has been scheduled to run in the background.', 'woocommerce' );
- break;
-
- default:
- $tools = $this->get_tools();
- if ( isset( $tools[ $tool ]['callback'] ) ) {
- $callback = $tools[ $tool ]['callback'];
- $return = call_user_func( $callback );
- if ( is_string( $return ) ) {
- $message = $return;
- } elseif ( false === $return ) {
- $callback_string = is_array( $callback ) ? get_class( $callback[0] ) . '::' . $callback[1] : $callback;
- $ran = false;
- /* translators: %s: callback string */
- $message = sprintf( __( 'There was an error calling %s', 'woocommerce' ), $callback_string );
- } else {
- $message = __( 'Tool ran.', 'woocommerce' );
- }
- } else {
- $ran = false;
- $message = __( 'There was an error calling this tool. There is no callback present.', 'woocommerce' );
- }
- break;
- }
-
- return array(
- 'success' => $ran,
- 'message' => $message,
- );
- }
+ protected $namespace = 'wc/v3';
}
diff --git a/includes/api/class-wc-rest-tax-classes-controller.php b/includes/api/class-wc-rest-tax-classes-controller.php
index eb36a2da3d7..39879e20ef4 100644
--- a/includes/api/class-wc-rest-tax-classes-controller.php
+++ b/includes/api/class-wc-rest-tax-classes-controller.php
@@ -14,14 +14,14 @@ defined( 'ABSPATH' ) || exit;
* REST API Tax Classes controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Tax_Classes_V1_Controller
+ * @extends WC_REST_Tax_Classes_V2_Controller
*/
-class WC_REST_Tax_Classes_Controller extends WC_REST_Tax_Classes_V1_Controller {
+class WC_REST_Tax_Classes_Controller extends WC_REST_Tax_Classes_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
+ protected $namespace = 'wc/v3';
}
diff --git a/includes/api/class-wc-rest-taxes-controller.php b/includes/api/class-wc-rest-taxes-controller.php
index 5bd1b609211..35c20e57908 100644
--- a/includes/api/class-wc-rest-taxes-controller.php
+++ b/includes/api/class-wc-rest-taxes-controller.php
@@ -14,14 +14,14 @@ defined( 'ABSPATH' ) || exit;
* REST API Taxes controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Taxes_V1_Controller
+ * @extends WC_REST_Taxes_V2_Controller
*/
-class WC_REST_Taxes_Controller extends WC_REST_Taxes_V1_Controller {
+class WC_REST_Taxes_Controller extends WC_REST_Taxes_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
+ protected $namespace = 'wc/v3';
}
diff --git a/includes/api/class-wc-rest-webhooks-controller.php b/includes/api/class-wc-rest-webhooks-controller.php
index f5cc00e235c..99e1c70a729 100644
--- a/includes/api/class-wc-rest-webhooks-controller.php
+++ b/includes/api/class-wc-rest-webhooks-controller.php
@@ -14,64 +14,16 @@ defined( 'ABSPATH' ) || exit;
* REST API Webhooks controller class.
*
* @package WooCommerce/API
- * @extends WC_REST_Webhooks_V1_Controller
+ * @extends WC_REST_Webhooks_V2_Controller
*/
-class WC_REST_Webhooks_Controller extends WC_REST_Webhooks_V1_Controller {
+class WC_REST_Webhooks_Controller extends WC_REST_Webhooks_V2_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
- protected $namespace = 'wc/v2';
-
- /**
- * Prepare a single webhook output for response.
- *
- * @param int $id Webhook ID.
- * @param WP_REST_Request $request Request object.
- * @return WP_REST_Response $response
- */
- public function prepare_item_for_response( $id, $request ) {
- $webhook = wc_get_webhook( $id );
-
- if ( empty( $webhook ) || is_null( $webhook ) ) {
- return new WP_Error( "woocommerce_rest_{$this->post_type}_invalid_id", __( 'ID is invalid.', 'woocommerce' ), array( 'status' => 400 ) );
- }
-
- $data = array(
- 'id' => $webhook->get_id(),
- 'name' => $webhook->get_name(),
- 'status' => $webhook->get_status(),
- 'topic' => $webhook->get_topic(),
- 'resource' => $webhook->get_resource(),
- 'event' => $webhook->get_event(),
- 'hooks' => $webhook->get_hooks(),
- 'delivery_url' => $webhook->get_delivery_url(),
- 'date_created' => wc_rest_prepare_date_response( $webhook->get_date_created(), false ),
- 'date_created_gmt' => wc_rest_prepare_date_response( $webhook->get_date_created() ),
- 'date_modified' => wc_rest_prepare_date_response( $webhook->get_date_modified(), false ),
- 'date_modified_gmt' => wc_rest_prepare_date_response( $webhook->get_date_modified() ),
- );
-
- $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
- $data = $this->add_additional_fields_to_object( $data, $request );
- $data = $this->filter_response_by_context( $data, $context );
-
- // Wrap the data in a response object.
- $response = rest_ensure_response( $data );
-
- $response->add_links( $this->prepare_links( $webhook->get_id(), $request ) );
-
- /**
- * Filter webhook object returned from the REST API.
- *
- * @param WP_REST_Response $response The response object.
- * @param WC_Webhook $webhook Webhook object used to create response.
- * @param WP_REST_Request $request Request object.
- */
- return apply_filters( "woocommerce_rest_prepare_{$this->post_type}", $response, $webhook, $request );
- }
+ protected $namespace = 'wc/v3';
/**
* Get the default REST API version.
@@ -80,106 +32,6 @@ class WC_REST_Webhooks_Controller extends WC_REST_Webhooks_V1_Controller {
* @return string
*/
protected function get_default_api_version() {
- return 'wp_api_v2';
- }
-
- /**
- * Get the Webhook's schema, conforming to JSON Schema.
- *
- * @return array
- */
- public function get_item_schema() {
- $schema = array(
- '$schema' => 'http://json-schema.org/draft-04/schema#',
- 'title' => 'webhook',
- 'type' => 'object',
- 'properties' => array(
- 'id' => array(
- 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
- 'type' => 'integer',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'name' => array(
- 'description' => __( 'A friendly name for the webhook.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'status' => array(
- 'description' => __( 'Webhook status.', 'woocommerce' ),
- 'type' => 'string',
- 'default' => 'active',
- 'enum' => array( 'active', 'paused', 'disabled' ),
- 'context' => array( 'view', 'edit' ),
- 'arg_options' => array(
- 'sanitize_callback' => 'wc_is_webhook_valid_topic',
- ),
- ),
- 'topic' => array(
- 'description' => __( 'Webhook topic.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- ),
- 'resource' => array(
- 'description' => __( 'Webhook resource.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'event' => array(
- 'description' => __( 'Webhook event.', 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'hooks' => array(
- 'description' => __( 'WooCommerce action names associated with the webhook.', 'woocommerce' ),
- 'type' => 'array',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- 'items' => array(
- 'type' => 'string',
- ),
- ),
- 'delivery_url' => array(
- 'description' => __( 'The URL where the webhook payload is delivered.', 'woocommerce' ),
- 'type' => 'string',
- 'format' => 'uri',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'secret' => array(
- 'description' => __( "Secret key used to generate a hash of the delivered webhook and provided in the request headers. This will default to a MD5 hash from the current user's ID|username if not provided.", 'woocommerce' ),
- 'type' => 'string',
- 'context' => array( 'edit' ),
- ),
- 'date_created' => array(
- 'description' => __( "The date the webhook was created, in the site's timezone.", 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'date_created_gmt' => array(
- 'description' => __( 'The date the webhook was created, as GMT.', 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'date_modified' => array(
- 'description' => __( "The date the webhook was last modified, in the site's timezone.", 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- 'date_modified_gmt' => array(
- 'description' => __( 'The date the webhook was last modified, as GMT.', 'woocommerce' ),
- 'type' => 'date-time',
- 'context' => array( 'view', 'edit' ),
- 'readonly' => true,
- ),
- ),
- );
-
- return $this->add_additional_fields_schema( $schema );
+ return 'wp_api_v3';
}
}
diff --git a/includes/api/legacy/v2/class-wc-api-customers.php b/includes/api/legacy/v2/class-wc-api-customers.php
index d88865b1921..4912be3b34e 100644
--- a/includes/api/legacy/v2/class-wc-api-customers.php
+++ b/includes/api/legacy/v2/class-wc-api-customers.php
@@ -736,13 +736,13 @@ class WC_API_Customers extends WC_API_Resource {
break;
case 'edit':
- if ( ! current_user_can( 'edit_users' ) ) {
+ if ( ! wc_rest_check_user_permissions( 'edit', $customer->ID ) ) {
throw new WC_API_Exception( 'woocommerce_api_user_cannot_edit_customer', __( 'You do not have permission to edit this customer', 'woocommerce' ), 401 );
}
break;
case 'delete':
- if ( ! current_user_can( 'delete_users' ) ) {
+ if ( ! wc_rest_check_user_permissions( 'delete', $customer->ID ) ) {
throw new WC_API_Exception( 'woocommerce_api_user_cannot_delete_customer', __( 'You do not have permission to delete this customer', 'woocommerce' ), 401 );
}
break;
diff --git a/includes/api/legacy/v2/class-wc-api-orders.php b/includes/api/legacy/v2/class-wc-api-orders.php
index f5d25339cb0..2c3f74160e8 100644
--- a/includes/api/legacy/v2/class-wc-api-orders.php
+++ b/includes/api/legacy/v2/class-wc-api-orders.php
@@ -433,7 +433,7 @@ class WC_API_Orders extends WC_API_Resource {
}
update_post_meta( $order->get_id(), '_payment_method', $data['payment_details']['method_id'] );
- update_post_meta( $order->get_id(), '_payment_method_title', $data['payment_details']['method_title'] );
+ update_post_meta( $order->get_id(), '_payment_method_title', sanitize_text_field( $data['payment_details']['method_title'] ) );
// mark as paid if set
if ( isset( $data['payment_details']['paid'] ) && true === $data['payment_details']['paid'] ) {
@@ -585,7 +585,7 @@ class WC_API_Orders extends WC_API_Resource {
// Method title.
if ( isset( $data['payment_details']['method_title'] ) ) {
- update_post_meta( $order->get_id(), '_payment_method_title', $data['payment_details']['method_title'] );
+ update_post_meta( $order->get_id(), '_payment_method_title', sanitize_text_field( $data['payment_details']['method_title'] ) );
}
// Mark as paid if set.
@@ -1492,11 +1492,12 @@ class WC_API_Orders extends WC_API_Resource {
*
* @param string $order_id order ID
* @param int $id
- * @param string $fields fields to limit response to
+ * @param string|null $fields fields to limit response to
+ * @param array $filter
*
* @return array|WP_Error
*/
- public function get_order_refund( $order_id, $id, $fields = null ) {
+ public function get_order_refund( $order_id, $id, $fields = null, $filter = array() ) {
try {
// Validate order ID
$order_id = $this->validate_request( $order_id, $this->post_type, 'read' );
diff --git a/includes/api/legacy/v2/class-wc-api-products.php b/includes/api/legacy/v2/class-wc-api-products.php
index 0da071ccb15..41ea5b9c302 100644
--- a/includes/api/legacy/v2/class-wc-api-products.php
+++ b/includes/api/legacy/v2/class-wc-api-products.php
@@ -247,13 +247,13 @@ class WC_API_Products extends WC_API_Resource {
$post_content = isset( $data['description'] ) ? wc_clean( $data['description'] ) : '';
if ( $post_content && isset( $data['enable_html_description'] ) && true === $data['enable_html_description'] ) {
- $post_content = $data['description'];
+ $post_content = wp_filter_post_kses( $data['description'] );
}
// Enable short description html tags.
$post_excerpt = isset( $data['short_description'] ) ? wc_clean( $data['short_description'] ) : '';
if ( $post_excerpt && isset( $data['enable_html_short_description'] ) && true === $data['enable_html_short_description'] ) {
- $post_excerpt = $data['short_description'];
+ $post_excerpt = wp_filter_post_kses( $data['short_description'] );
}
$classname = WC_Product_Factory::get_classname_from_product_type( $data['type'] );
@@ -353,14 +353,14 @@ class WC_API_Products extends WC_API_Resource {
// Product short description.
if ( isset( $data['short_description'] ) ) {
// Enable short description html tags.
- $post_excerpt = ( isset( $data['enable_html_short_description'] ) && true === $data['enable_html_short_description'] ) ? $data['short_description'] : wc_clean( $data['short_description'] );
+ $post_excerpt = ( isset( $data['enable_html_short_description'] ) && true === $data['enable_html_short_description'] ) ? wp_filter_post_kses( $data['short_description'] ) : wc_clean( $data['short_description'] );
$product->set_short_description( $post_excerpt );
}
// Product description.
if ( isset( $data['description'] ) ) {
// Enable description html tags.
- $post_content = ( isset( $data['enable_html_description'] ) && true === $data['enable_html_description'] ) ? $data['description'] : wc_clean( $data['description'] );
+ $post_content = ( isset( $data['enable_html_description'] ) && true === $data['enable_html_description'] ) ? wp_filter_post_kses( $data['description'] ) : wc_clean( $data['description'] );
$product->set_description( $post_content );
}
@@ -1532,7 +1532,7 @@ class WC_API_Products extends WC_API_Resource {
}
$download = new WC_Product_Download();
- $download->set_id( $file['id'] ? $file['id'] : wp_generate_uuid4() );
+ $download->set_id( ! empty( $file['id'] ) ? $file['id'] : wp_generate_uuid4() );
$download->set_name( $file['name'] ? $file['name'] : wc_get_filename_from_url( $file['file'] ) );
$download->set_file( apply_filters( 'woocommerce_file_download_path', $file['file'], $product, $key ) );
$files[] = $download;
diff --git a/includes/api/legacy/v3/class-wc-api-customers.php b/includes/api/legacy/v3/class-wc-api-customers.php
index 3ae5025530b..8e6c5a13d0b 100644
--- a/includes/api/legacy/v3/class-wc-api-customers.php
+++ b/includes/api/legacy/v3/class-wc-api-customers.php
@@ -726,13 +726,13 @@ class WC_API_Customers extends WC_API_Resource {
break;
case 'edit':
- if ( ! current_user_can( 'edit_users' ) ) {
+ if ( ! wc_rest_check_user_permissions( 'edit', $customer->ID ) ) {
throw new WC_API_Exception( 'woocommerce_api_user_cannot_edit_customer', __( 'You do not have permission to edit this customer', 'woocommerce' ), 401 );
}
break;
case 'delete':
- if ( ! current_user_can( 'delete_users' ) ) {
+ if ( ! wc_rest_check_user_permissions( 'delete', $customer->ID ) ) {
throw new WC_API_Exception( 'woocommerce_api_user_cannot_delete_customer', __( 'You do not have permission to delete this customer', 'woocommerce' ), 401 );
}
break;
diff --git a/includes/api/legacy/v3/class-wc-api-orders.php b/includes/api/legacy/v3/class-wc-api-orders.php
index 046e4dd2b25..b9c3ff0e812 100644
--- a/includes/api/legacy/v3/class-wc-api-orders.php
+++ b/includes/api/legacy/v3/class-wc-api-orders.php
@@ -473,7 +473,7 @@ class WC_API_Orders extends WC_API_Resource {
}
update_post_meta( $order->get_id(), '_payment_method', $data['payment_details']['method_id'] );
- update_post_meta( $order->get_id(), '_payment_method_title', $data['payment_details']['method_title'] );
+ update_post_meta( $order->get_id(), '_payment_method_title', sanitize_text_field( $data['payment_details']['method_title'] ) );
// mark as paid if set
if ( isset( $data['payment_details']['paid'] ) && true === $data['payment_details']['paid'] ) {
@@ -622,7 +622,7 @@ class WC_API_Orders extends WC_API_Resource {
// Method title.
if ( isset( $data['payment_details']['method_title'] ) ) {
- update_post_meta( $order->get_id(), '_payment_method_title', $data['payment_details']['method_title'] );
+ update_post_meta( $order->get_id(), '_payment_method_title', sanitize_text_field( $data['payment_details']['method_title'] ) );
}
// Mark as paid if set.
@@ -1538,10 +1538,11 @@ class WC_API_Orders extends WC_API_Resource {
* @param string $order_id order ID
* @param int $id
* @param string|null $fields fields to limit response to
+ * @param array $filter
*
* @return array|WP_Error
*/
- public function get_order_refund( $order_id, $id, $fields = null ) {
+ public function get_order_refund( $order_id, $id, $fields = null, $filter = array() ) {
try {
// Validate order ID
$order_id = $this->validate_request( $order_id, $this->post_type, 'read' );
diff --git a/includes/api/legacy/v3/class-wc-api-products.php b/includes/api/legacy/v3/class-wc-api-products.php
index 71062b2820d..c2d4423aab4 100644
--- a/includes/api/legacy/v3/class-wc-api-products.php
+++ b/includes/api/legacy/v3/class-wc-api-products.php
@@ -296,13 +296,13 @@ class WC_API_Products extends WC_API_Resource {
$post_content = isset( $data['description'] ) ? wc_clean( $data['description'] ) : '';
if ( $post_content && isset( $data['enable_html_description'] ) && true === $data['enable_html_description'] ) {
- $post_content = $data['description'];
+ $post_content = wp_filter_post_kses( $data['description'] );
}
// Enable short description html tags.
$post_excerpt = isset( $data['short_description'] ) ? wc_clean( $data['short_description'] ) : '';
if ( $post_excerpt && isset( $data['enable_html_short_description'] ) && true === $data['enable_html_short_description'] ) {
- $post_excerpt = $data['short_description'];
+ $post_excerpt = wp_filter_post_kses( $data['short_description'] );
}
$classname = WC_Product_Factory::get_classname_from_product_type( $data['type'] );
@@ -407,14 +407,14 @@ class WC_API_Products extends WC_API_Resource {
// Product short description.
if ( isset( $data['short_description'] ) ) {
// Enable short description html tags.
- $post_excerpt = ( isset( $data['enable_html_short_description'] ) && true === $data['enable_html_short_description'] ) ? $data['short_description'] : wc_clean( $data['short_description'] );
+ $post_excerpt = ( isset( $data['enable_html_short_description'] ) && true === $data['enable_html_short_description'] ) ? wp_filter_post_kses( $data['short_description'] ) : wc_clean( $data['short_description'] );
$product->set_short_description( $post_excerpt );
}
// Product description.
if ( isset( $data['description'] ) ) {
// Enable description html tags.
- $post_content = ( isset( $data['enable_html_description'] ) && true === $data['enable_html_description'] ) ? $data['description'] : wc_clean( $data['description'] );
+ $post_content = ( isset( $data['enable_html_description'] ) && true === $data['enable_html_description'] ) ? wp_filter_post_kses( $data['description'] ) : wc_clean( $data['description'] );
$product->set_description( $post_content );
}
@@ -2036,7 +2036,7 @@ class WC_API_Products extends WC_API_Resource {
}
$download = new WC_Product_Download();
- $download->set_id( $file['id'] ? $file['id'] : wp_generate_uuid4() );
+ $download->set_id( ! empty( $file['id'] ) ? $file['id'] : wp_generate_uuid4() );
$download->set_name( $file['name'] ? $file['name'] : wc_get_filename_from_url( $file['file'] ) );
$download->set_file( apply_filters( 'woocommerce_file_download_path', $file['file'], $product, $key ) );
$files[] = $download;
diff --git a/includes/api/v1/class-wc-rest-orders-controller.php b/includes/api/v1/class-wc-rest-orders-controller.php
index f617192c0bb..a430e54ebd6 100644
--- a/includes/api/v1/class-wc-rest-orders-controller.php
+++ b/includes/api/v1/class-wc-rest-orders-controller.php
@@ -404,20 +404,15 @@ class WC_REST_Orders_V1_Controller extends WC_REST_Posts_Controller {
}
if ( isset( $request['customer'] ) ) {
- // On WC 3.5.0 the ID of the user that placed the order was moved from the post meta _customer_user to the post_author field in the wp_posts table.
- if ( version_compare( get_option( 'woocommerce_db_version' ), '3.5.0', '>=' ) ) {
- $args['author'] = $request['customer'];
- } else {
- if ( ! empty( $args['meta_query'] ) ) {
- $args['meta_query'] = array(); // WPCS: slow query ok.
- }
-
- $args['meta_query'][] = array(
- 'key' => '_customer_user',
- 'value' => $request['customer'],
- 'type' => 'NUMERIC',
- );
+ if ( ! empty( $args['meta_query'] ) ) {
+ $args['meta_query'] = array();
}
+
+ $args['meta_query'][] = array(
+ 'key' => '_customer_user',
+ 'value' => $request['customer'],
+ 'type' => 'NUMERIC',
+ );
}
// Search by product.
@@ -1153,6 +1148,9 @@ class WC_REST_Orders_V1_Controller extends WC_REST_Posts_Controller {
'description' => __( 'Payment method title.', 'woocommerce' ),
'type' => 'string',
'context' => array( 'view', 'edit' ),
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_text_field',
+ ),
),
'set_paid' => array(
'description' => __( 'Define if the order is paid. It will set the status to processing and reduce stock items.', 'woocommerce' ),
diff --git a/includes/api/v1/class-wc-rest-products-controller.php b/includes/api/v1/class-wc-rest-products-controller.php
index 9d893f039c8..92d755da896 100644
--- a/includes/api/v1/class-wc-rest-products-controller.php
+++ b/includes/api/v1/class-wc-rest-products-controller.php
@@ -273,7 +273,7 @@ class WC_REST_Products_V1_Controller extends WC_REST_Posts_Controller {
$attachment_ids = array();
// Add featured image.
- if ( has_post_thumbnail( $product->get_id() ) ) {
+ if ( $product->get_image_id() ) {
$attachment_ids[] = $product->get_image_id();
}
@@ -960,7 +960,7 @@ class WC_REST_Products_V1_Controller extends WC_REST_Posts_Controller {
}
$download = new WC_Product_Download();
- $download->set_id( $file['id'] ? $file['id'] : wp_generate_uuid4() );
+ $download->set_id( ! empty( $file['id'] ) ? $file['id'] : wp_generate_uuid4() );
$download->set_name( $file['name'] ? $file['name'] : wc_get_filename_from_url( $file['file'] ) );
$download->set_file( apply_filters( 'woocommerce_file_download_path', $file['file'], $product, $key ) );
$files[] = $download;
@@ -1882,10 +1882,9 @@ class WC_REST_Products_V1_Controller extends WC_REST_Posts_Controller {
'type' => 'object',
'properties' => array(
'id' => array(
- 'description' => __( 'File MD5 hash.', 'woocommerce' ),
+ 'description' => __( 'File ID.', 'woocommerce' ),
'type' => 'string',
'context' => array( 'view', 'edit' ),
- 'readonly' => true,
),
'name' => array(
'description' => __( 'File name.', 'woocommerce' ),
@@ -2360,10 +2359,9 @@ class WC_REST_Products_V1_Controller extends WC_REST_Posts_Controller {
'type' => 'object',
'properties' => array(
'id' => array(
- 'description' => __( 'File MD5 hash.', 'woocommerce' ),
+ 'description' => __( 'File ID.', 'woocommerce' ),
'type' => 'string',
'context' => array( 'view', 'edit' ),
- 'readonly' => true,
),
'name' => array(
'description' => __( 'File name.', 'woocommerce' ),
diff --git a/includes/api/v1/class-wc-rest-reports-controller.php b/includes/api/v1/class-wc-rest-reports-controller.php
index ed5dc97fef0..2d284aa48bc 100644
--- a/includes/api/v1/class-wc-rest-reports-controller.php
+++ b/includes/api/v1/class-wc-rest-reports-controller.php
@@ -66,14 +66,13 @@ class WC_REST_Reports_V1_Controller extends WC_REST_Controller {
}
/**
- * Get all reports.
+ * Get reports list.
*
- * @param WP_REST_Request $request
- * @return array|WP_Error
+ * @since 3.5.0
+ * @return array
*/
- public function get_items( $request ) {
- $data = array();
- $reports = array(
+ protected function get_reports() {
+ return array(
array(
'slug' => 'sales',
'description' => __( 'List of sales reports.', 'woocommerce' ),
@@ -83,6 +82,17 @@ class WC_REST_Reports_V1_Controller extends WC_REST_Controller {
'description' => __( 'List of top sellers products.', 'woocommerce' ),
),
);
+ }
+
+ /**
+ * Get all reports.
+ *
+ * @param WP_REST_Request $request
+ * @return array|WP_Error
+ */
+ public function get_items( $request ) {
+ $data = array();
+ $reports = $this->get_reports();
foreach ( $reports as $report ) {
$item = $this->prepare_item_for_response( (object) $report, $request );
diff --git a/includes/api/v1/class-wc-rest-webhooks-controller.php b/includes/api/v1/class-wc-rest-webhooks-controller.php
index 20541ebedd2..5971bfcfc12 100644
--- a/includes/api/v1/class-wc-rest-webhooks-controller.php
+++ b/includes/api/v1/class-wc-rest-webhooks-controller.php
@@ -408,7 +408,11 @@ class WC_REST_Webhooks_V1_Controller extends WC_REST_Controller {
// Update status.
if ( ! empty( $request['status'] ) ) {
- $webhook->set_status( $request['status'] );
+ if ( wc_is_webhook_valid_status( strtolower( $request['status'] ) ) ) {
+ $webhook->set_status( $request['status'] );
+ } else {
+ return new WP_Error( "woocommerce_rest_{$this->post_type}_invalid_status", __( 'Webhook status must be valid.', 'woocommerce' ), array( 'status' => 400 ) );
+ }
}
$post = $this->prepare_item_for_database( $request );
@@ -626,11 +630,8 @@ class WC_REST_Webhooks_V1_Controller extends WC_REST_Controller {
'description' => __( 'Webhook status.', 'woocommerce' ),
'type' => 'string',
'default' => 'active',
- 'enum' => array( 'active', 'paused', 'disabled' ),
+ 'enum' => array_keys( wc_get_webhook_statuses() ),
'context' => array( 'view', 'edit' ),
- 'arg_options' => array(
- 'sanitize_callback' => 'wc_is_webhook_valid_topic',
- ),
),
'topic' => array(
'description' => __( 'Webhook topic.', 'woocommerce' ),
diff --git a/includes/api/v2/class-wc-rest-coupons-v2-controller.php b/includes/api/v2/class-wc-rest-coupons-v2-controller.php
new file mode 100644
index 00000000000..8a437b7195e
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-coupons-v2-controller.php
@@ -0,0 +1,542 @@
+namespace, '/' . $this->rest_base, array(
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_items' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ 'args' => $this->get_collection_params(),
+ ),
+ array(
+ 'methods' => WP_REST_Server::CREATABLE,
+ 'callback' => array( $this, 'create_item' ),
+ 'permission_callback' => array( $this, 'create_item_permissions_check' ),
+ 'args' => array_merge(
+ $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), array(
+ 'code' => array(
+ 'description' => __( 'Coupon code.', 'woocommerce' ),
+ 'required' => true,
+ 'type' => 'string',
+ ),
+ )
+ ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array(
+ 'args' => array(
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
+ 'type' => 'integer',
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_item' ),
+ 'permission_callback' => array( $this, 'get_item_permissions_check' ),
+ 'args' => array(
+ 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => array( $this, 'update_item' ),
+ 'permission_callback' => array( $this, 'update_item_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::DELETABLE,
+ 'callback' => array( $this, 'delete_item' ),
+ 'permission_callback' => array( $this, 'delete_item_permissions_check' ),
+ 'args' => array(
+ 'force' => array(
+ 'default' => false,
+ 'type' => 'boolean',
+ 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ),
+ ),
+ ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/batch', array(
+ array(
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => array( $this, 'batch_items' ),
+ 'permission_callback' => array( $this, 'batch_items_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
+ ),
+ 'schema' => array( $this, 'get_public_batch_schema' ),
+ )
+ );
+ }
+
+ /**
+ * Get object.
+ *
+ * @since 3.0.0
+ * @param int $id Object ID.
+ * @return WC_Data
+ */
+ protected function get_object( $id ) {
+ return new WC_Coupon( $id );
+ }
+
+ /**
+ * Get formatted item data.
+ *
+ * @since 3.0.0
+ * @param WC_Data $object WC_Data instance.
+ * @return array
+ */
+ protected function get_formatted_item_data( $object ) {
+ $data = $object->get_data();
+
+ $format_decimal = array( 'amount', 'minimum_amount', 'maximum_amount' );
+ $format_date = array( 'date_created', 'date_modified', 'date_expires' );
+ $format_null = array( 'usage_limit', 'usage_limit_per_user', 'limit_usage_to_x_items' );
+
+ // Format decimal values.
+ foreach ( $format_decimal as $key ) {
+ $data[ $key ] = wc_format_decimal( $data[ $key ], 2 );
+ }
+
+ // Format date values.
+ foreach ( $format_date as $key ) {
+ $datetime = $data[ $key ];
+ $data[ $key ] = wc_rest_prepare_date_response( $datetime, false );
+ $data[ $key . '_gmt' ] = wc_rest_prepare_date_response( $datetime );
+ }
+
+ // Format null values.
+ foreach ( $format_null as $key ) {
+ $data[ $key ] = $data[ $key ] ? $data[ $key ] : null;
+ }
+
+ return array(
+ 'id' => $object->get_id(),
+ 'code' => $data['code'],
+ 'amount' => $data['amount'],
+ 'date_created' => $data['date_created'],
+ 'date_created_gmt' => $data['date_created_gmt'],
+ 'date_modified' => $data['date_modified'],
+ 'date_modified_gmt' => $data['date_modified_gmt'],
+ 'discount_type' => $data['discount_type'],
+ 'description' => $data['description'],
+ 'date_expires' => $data['date_expires'],
+ 'date_expires_gmt' => $data['date_expires_gmt'],
+ 'usage_count' => $data['usage_count'],
+ 'individual_use' => $data['individual_use'],
+ 'product_ids' => $data['product_ids'],
+ 'excluded_product_ids' => $data['excluded_product_ids'],
+ 'usage_limit' => $data['usage_limit'],
+ 'usage_limit_per_user' => $data['usage_limit_per_user'],
+ 'limit_usage_to_x_items' => $data['limit_usage_to_x_items'],
+ 'free_shipping' => $data['free_shipping'],
+ 'product_categories' => $data['product_categories'],
+ 'excluded_product_categories' => $data['excluded_product_categories'],
+ 'exclude_sale_items' => $data['exclude_sale_items'],
+ 'minimum_amount' => $data['minimum_amount'],
+ 'maximum_amount' => $data['maximum_amount'],
+ 'email_restrictions' => $data['email_restrictions'],
+ 'used_by' => $data['used_by'],
+ 'meta_data' => $data['meta_data'],
+ );
+ }
+
+ /**
+ * Prepare a single coupon output for response.
+ *
+ * @since 3.0.0
+ * @param WC_Data $object Object data.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response
+ */
+ public function prepare_object_for_response( $object, $request ) {
+ $data = $this->get_formatted_item_data( $object );
+ $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+ $response = rest_ensure_response( $data );
+ $response->add_links( $this->prepare_links( $object, $request ) );
+
+ /**
+ * Filter the data for a response.
+ *
+ * The dynamic portion of the hook name, $this->post_type,
+ * refers to object type being prepared for the response.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param WC_Data $object Object data.
+ * @param WP_REST_Request $request Request object.
+ */
+ return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request );
+ }
+
+ /**
+ * Prepare objects query.
+ *
+ * @since 3.0.0
+ * @param WP_REST_Request $request Full details about the request.
+ * @return array
+ */
+ protected function prepare_objects_query( $request ) {
+ $args = parent::prepare_objects_query( $request );
+
+ if ( ! empty( $request['code'] ) ) {
+ $id = wc_get_coupon_id_by_code( $request['code'] );
+ $args['post__in'] = array( $id );
+ }
+
+ // Get only ids.
+ $args['fields'] = 'ids';
+
+ return $args;
+ }
+
+ /**
+ * Only return writable props from schema.
+ *
+ * @param array $schema Schema.
+ * @return bool
+ */
+ protected function filter_writable_props( $schema ) {
+ return empty( $schema['readonly'] );
+ }
+
+ /**
+ * Prepare a single coupon for create or update.
+ *
+ * @param WP_REST_Request $request Request object.
+ * @param bool $creating If is creating a new object.
+ * @return WP_Error|WC_Data
+ */
+ protected function prepare_object_for_database( $request, $creating = false ) {
+ $id = isset( $request['id'] ) ? absint( $request['id'] ) : 0;
+ $coupon = new WC_Coupon( $id );
+ $schema = $this->get_item_schema();
+ $data_keys = array_keys( array_filter( $schema['properties'], array( $this, 'filter_writable_props' ) ) );
+
+ // Validate required POST fields.
+ if ( $creating && empty( $request['code'] ) ) {
+ return new WP_Error( 'woocommerce_rest_empty_coupon_code', sprintf( __( 'The coupon code cannot be empty.', 'woocommerce' ), 'code' ), array( 'status' => 400 ) );
+ }
+
+ // Handle all writable props.
+ foreach ( $data_keys as $key ) {
+ $value = $request[ $key ];
+
+ if ( ! is_null( $value ) ) {
+ switch ( $key ) {
+ case 'code':
+ $coupon_code = wc_format_coupon_code( $value );
+ $id = $coupon->get_id() ? $coupon->get_id() : 0;
+ $id_from_code = wc_get_coupon_id_by_code( $coupon_code, $id );
+
+ if ( $id_from_code ) {
+ return new WP_Error( 'woocommerce_rest_coupon_code_already_exists', __( 'The coupon code already exists', 'woocommerce' ), array( 'status' => 400 ) );
+ }
+
+ $coupon->set_code( $coupon_code );
+ break;
+ case 'meta_data':
+ if ( is_array( $value ) ) {
+ foreach ( $value as $meta ) {
+ $coupon->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' );
+ }
+ }
+ break;
+ case 'description':
+ $coupon->set_description( wp_filter_post_kses( $value ) );
+ break;
+ default:
+ if ( is_callable( array( $coupon, "set_{$key}" ) ) ) {
+ $coupon->{"set_{$key}"}( $value );
+ }
+ break;
+ }
+ }
+ }
+
+ /**
+ * Filters an object before it is inserted via the REST API.
+ *
+ * The dynamic portion of the hook name, `$this->post_type`,
+ * refers to the object type slug.
+ *
+ * @param WC_Data $coupon Object object.
+ * @param WP_REST_Request $request Request object.
+ * @param bool $creating If is creating a new object.
+ */
+ return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $coupon, $request, $creating );
+ }
+
+ /**
+ * Get the Coupon's schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => $this->post_type,
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the object.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'code' => array(
+ 'description' => __( 'Coupon code.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'amount' => array(
+ 'description' => __( 'The amount of discount. Should always be numeric, even if setting a percentage.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'date_created' => array(
+ 'description' => __( "The date the coupon was created, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_created_gmt' => array(
+ 'description' => __( 'The date the coupon was created, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_modified' => array(
+ 'description' => __( "The date the coupon was last modified, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_modified_gmt' => array(
+ 'description' => __( 'The date the coupon was last modified, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'discount_type' => array(
+ 'description' => __( 'Determines the type of discount that will be applied.', 'woocommerce' ),
+ 'type' => 'string',
+ 'default' => 'fixed_cart',
+ 'enum' => array_keys( wc_get_coupon_types() ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'description' => array(
+ 'description' => __( 'Coupon description.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'date_expires' => array(
+ 'description' => __( "The date the coupon expires, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'date_expires_gmt' => array(
+ 'description' => __( 'The date the coupon expires, as GMT.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'usage_count' => array(
+ 'description' => __( 'Number of times the coupon has been used already.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'individual_use' => array(
+ 'description' => __( 'If true, the coupon can only be used individually. Other applied coupons will be removed from the cart.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'default' => false,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'product_ids' => array(
+ 'description' => __( 'List of product IDs the coupon can be used on.', 'woocommerce' ),
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'integer',
+ ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'excluded_product_ids' => array(
+ 'description' => __( 'List of product IDs the coupon cannot be used on.', 'woocommerce' ),
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'integer',
+ ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'usage_limit' => array(
+ 'description' => __( 'How many times the coupon can be used in total.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'usage_limit_per_user' => array(
+ 'description' => __( 'How many times the coupon can be used per customer.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'limit_usage_to_x_items' => array(
+ 'description' => __( 'Max number of items in the cart the coupon can be applied to.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'free_shipping' => array(
+ 'description' => __( 'If true and if the free shipping method requires a coupon, this coupon will enable free shipping.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'default' => false,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'product_categories' => array(
+ 'description' => __( 'List of category IDs the coupon applies to.', 'woocommerce' ),
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'integer',
+ ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'excluded_product_categories' => array(
+ 'description' => __( 'List of category IDs the coupon does not apply to.', 'woocommerce' ),
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'integer',
+ ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'exclude_sale_items' => array(
+ 'description' => __( 'If true, this coupon will not be applied to items that have sale prices.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'default' => false,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'minimum_amount' => array(
+ 'description' => __( 'Minimum order amount that needs to be in the cart before coupon applies.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'maximum_amount' => array(
+ 'description' => __( 'Maximum order amount allowed when using the coupon.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'email_restrictions' => array(
+ 'description' => __( 'List of email addresses that can use this coupon.', 'woocommerce' ),
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'string',
+ ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'used_by' => array(
+ 'description' => __( 'List of user IDs (or guest email addresses) that have used the coupon.', 'woocommerce' ),
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'integer',
+ ),
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'meta_data' => array(
+ 'description' => __( 'Meta data.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Meta ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'key' => array(
+ 'description' => __( 'Meta key.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'value' => array(
+ 'description' => __( 'Meta value.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+ return $this->add_additional_fields_schema( $schema );
+ }
+
+ /**
+ * Get the query params for collections of attachments.
+ *
+ * @return array
+ */
+ public function get_collection_params() {
+ $params = parent::get_collection_params();
+
+ $params['code'] = array(
+ 'description' => __( 'Limit result set to resources with a specific code.', 'woocommerce' ),
+ 'type' => 'string',
+ 'sanitize_callback' => 'sanitize_text_field',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+
+ return $params;
+ }
+}
diff --git a/includes/api/v2/class-wc-rest-customer-downloads-v2-controller.php b/includes/api/v2/class-wc-rest-customer-downloads-v2-controller.php
new file mode 100644
index 00000000000..887761e074b
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-customer-downloads-v2-controller.php
@@ -0,0 +1,165 @@
+/downloads endpoint.
+ *
+ * @package WooCommerce/API
+ * @since 2.6.0
+ */
+
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * REST API Customers controller class.
+ *
+ * @package WooCommerce/API
+ * @extends WC_REST_Customer_Downloads_V1_Controller
+ */
+class WC_REST_Customer_Downloads_V2_Controller extends WC_REST_Customer_Downloads_V1_Controller {
+
+ /**
+ * Endpoint namespace.
+ *
+ * @var string
+ */
+ protected $namespace = 'wc/v2';
+
+ /**
+ * Prepare a single download output for response.
+ *
+ * @param stdClass $download Download object.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response Response data.
+ */
+ public function prepare_item_for_response( $download, $request ) {
+ $data = array(
+ 'download_id' => $download->download_id,
+ 'download_url' => $download->download_url,
+ 'product_id' => $download->product_id,
+ 'product_name' => $download->product_name,
+ 'download_name' => $download->download_name,
+ 'order_id' => $download->order_id,
+ 'order_key' => $download->order_key,
+ 'downloads_remaining' => '' === $download->downloads_remaining ? 'unlimited' : $download->downloads_remaining,
+ 'access_expires' => $download->access_expires ? wc_rest_prepare_date_response( $download->access_expires ) : 'never',
+ 'access_expires_gmt' => $download->access_expires ? wc_rest_prepare_date_response( get_gmt_from_date( $download->access_expires ) ) : 'never',
+ 'file' => $download->file,
+ );
+
+ $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+
+ // Wrap the data in a response object.
+ $response = rest_ensure_response( $data );
+
+ $response->add_links( $this->prepare_links( $download, $request ) );
+
+ /**
+ * Filter customer download data returned from the REST API.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param stdClass $download Download object used to create response.
+ * @param WP_REST_Request $request Request object.
+ */
+ return apply_filters( 'woocommerce_rest_prepare_customer_download', $response, $download, $request );
+ }
+
+ /**
+ * Get the Customer Download's schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'customer_download',
+ 'type' => 'object',
+ 'properties' => array(
+ 'download_id' => array(
+ 'description' => __( 'Download ID.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'download_url' => array(
+ 'description' => __( 'Download file URL.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'product_id' => array(
+ 'description' => __( 'Downloadable product ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'product_name' => array(
+ 'description' => __( 'Product name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'download_name' => array(
+ 'description' => __( 'Downloadable file name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'order_id' => array(
+ 'description' => __( 'Order ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'order_key' => array(
+ 'description' => __( 'Order key.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'downloads_remaining' => array(
+ 'description' => __( 'Number of downloads remaining.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'access_expires' => array(
+ 'description' => __( "The date when download access expires, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'access_expires_gmt' => array(
+ 'description' => __( 'The date when download access expires, as GMT.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'file' => array(
+ 'description' => __( 'File details.', 'woocommerce' ),
+ 'type' => 'object',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ 'properties' => array(
+ 'name' => array(
+ 'description' => __( 'File name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'file' => array(
+ 'description' => __( 'File URL.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ ),
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+}
diff --git a/includes/api/v2/class-wc-rest-customers-v2-controller.php b/includes/api/v2/class-wc-rest-customers-v2-controller.php
new file mode 100644
index 00000000000..cbb3d22afff
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-customers-v2-controller.php
@@ -0,0 +1,364 @@
+get_data();
+ $format_date = array( 'date_created', 'date_modified' );
+
+ // Format date values.
+ foreach ( $format_date as $key ) {
+ $datetime = $data[ $key ];
+ $data[ $key ] = wc_rest_prepare_date_response( $datetime, false );
+ $data[ $key . '_gmt' ] = wc_rest_prepare_date_response( $datetime );
+ }
+
+ return array(
+ 'id' => $object->get_id(),
+ 'date_created' => $data['date_created'],
+ 'date_created_gmt' => $data['date_created_gmt'],
+ 'date_modified' => $data['date_modified'],
+ 'date_modified_gmt' => $data['date_modified_gmt'],
+ 'email' => $data['email'],
+ 'first_name' => $data['first_name'],
+ 'last_name' => $data['last_name'],
+ 'role' => $data['role'],
+ 'username' => $data['username'],
+ 'billing' => $data['billing'],
+ 'shipping' => $data['shipping'],
+ 'is_paying_customer' => $data['is_paying_customer'],
+ 'orders_count' => $object->get_order_count(),
+ 'total_spent' => $object->get_total_spent(),
+ 'avatar_url' => $object->get_avatar_url(),
+ 'meta_data' => $data['meta_data'],
+ );
+ }
+
+ /**
+ * Prepare a single customer output for response.
+ *
+ * @param WP_User $user_data User object.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response Response data.
+ */
+ public function prepare_item_for_response( $user_data, $request ) {
+ $customer = new WC_Customer( $user_data->ID );
+ $data = $this->get_formatted_item_data( $customer );
+ $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+ $response = rest_ensure_response( $data );
+ $response->add_links( $this->prepare_links( $user_data ) );
+
+ /**
+ * Filter customer data returned from the REST API.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param WP_User $user_data User object used to create response.
+ * @param WP_REST_Request $request Request object.
+ */
+ return apply_filters( 'woocommerce_rest_prepare_customer', $response, $user_data, $request );
+ }
+
+ /**
+ * Update customer meta fields.
+ *
+ * @param WC_Customer $customer Customer data.
+ * @param WP_REST_Request $request Request data.
+ */
+ protected function update_customer_meta_fields( $customer, $request ) {
+ parent::update_customer_meta_fields( $customer, $request );
+
+ // Meta data.
+ if ( isset( $request['meta_data'] ) ) {
+ if ( is_array( $request['meta_data'] ) ) {
+ foreach ( $request['meta_data'] as $meta ) {
+ $customer->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' );
+ }
+ }
+ }
+ }
+
+ /**
+ * Get the Customer's schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'customer',
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_created' => array(
+ 'description' => __( "The date the customer was created, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_created_gmt' => array(
+ 'description' => __( 'The date the order was created, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_modified' => array(
+ 'description' => __( "The date the customer was last modified, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_modified_gmt' => array(
+ 'description' => __( 'The date the customer was last modified, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'email' => array(
+ 'description' => __( 'The email address for the customer.', 'woocommerce' ),
+ 'type' => 'string',
+ 'format' => 'email',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'first_name' => array(
+ 'description' => __( 'Customer first name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_text_field',
+ ),
+ ),
+ 'last_name' => array(
+ 'description' => __( 'Customer last name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_text_field',
+ ),
+ ),
+ 'role' => array(
+ 'description' => __( 'Customer role.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'username' => array(
+ 'description' => __( 'Customer login name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_user',
+ ),
+ ),
+ 'password' => array(
+ 'description' => __( 'Customer password.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'edit' ),
+ ),
+ 'billing' => array(
+ 'description' => __( 'List of billing address data.', 'woocommerce' ),
+ 'type' => 'object',
+ 'context' => array( 'view', 'edit' ),
+ 'properties' => array(
+ 'first_name' => array(
+ 'description' => __( 'First name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'last_name' => array(
+ 'description' => __( 'Last name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'company' => array(
+ 'description' => __( 'Company name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'address_1' => array(
+ 'description' => __( 'Address line 1', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'address_2' => array(
+ 'description' => __( 'Address line 2', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'city' => array(
+ 'description' => __( 'City name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'state' => array(
+ 'description' => __( 'ISO code or name of the state, province or district.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'postcode' => array(
+ 'description' => __( 'Postal code.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'country' => array(
+ 'description' => __( 'ISO code of the country.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'email' => array(
+ 'description' => __( 'Email address.', 'woocommerce' ),
+ 'type' => 'string',
+ 'format' => 'email',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'phone' => array(
+ 'description' => __( 'Phone number.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ 'shipping' => array(
+ 'description' => __( 'List of shipping address data.', 'woocommerce' ),
+ 'type' => 'object',
+ 'context' => array( 'view', 'edit' ),
+ 'properties' => array(
+ 'first_name' => array(
+ 'description' => __( 'First name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'last_name' => array(
+ 'description' => __( 'Last name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'company' => array(
+ 'description' => __( 'Company name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'address_1' => array(
+ 'description' => __( 'Address line 1', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'address_2' => array(
+ 'description' => __( 'Address line 2', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'city' => array(
+ 'description' => __( 'City name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'state' => array(
+ 'description' => __( 'ISO code or name of the state, province or district.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'postcode' => array(
+ 'description' => __( 'Postal code.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'country' => array(
+ 'description' => __( 'ISO code of the country.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ 'is_paying_customer' => array(
+ 'description' => __( 'Is the customer a paying customer?', 'woocommerce' ),
+ 'type' => 'bool',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'orders_count' => array(
+ 'description' => __( 'Quantity of orders made by the customer.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'total_spent' => array(
+ 'description' => __( 'Total amount spent.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'avatar_url' => array(
+ 'description' => __( 'Avatar URL.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'meta_data' => array(
+ 'description' => __( 'Meta data.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Meta ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'key' => array(
+ 'description' => __( 'Meta key.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'value' => array(
+ 'description' => __( 'Meta value.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+}
diff --git a/includes/api/v2/class-wc-rest-network-orders-v2-controller.php b/includes/api/v2/class-wc-rest-network-orders-v2-controller.php
new file mode 100644
index 00000000000..7e288b9dfc0
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-network-orders-v2-controller.php
@@ -0,0 +1,159 @@
+namespace, '/' . $this->rest_base . '/network', array(
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'network_orders' ),
+ 'permission_callback' => array( $this, 'network_orders_permissions_check' ),
+ 'args' => $this->get_collection_params(),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ }
+ }
+
+ /**
+ * Retrieves the item's schema for display / public consumption purposes.
+ *
+ * @access public
+ *
+ * @return array Public item schema data.
+ */
+ public function get_public_item_schema() {
+ $schema = parent::get_public_item_schema();
+
+ $schema['properties']['blog'] = array(
+ 'description' => __( 'Blog id of the record on the multisite.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ );
+ $schema['properties']['edit_url'] = array(
+ 'description' => __( 'URL to edit the order', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ );
+ $schema['properties']['customer'][] = array(
+ 'description' => __( 'Name of the customer for the order', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ );
+ $schema['properties']['status_name'][] = array(
+ 'description' => __( 'Order Status', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ );
+ $schema['properties']['formatted_total'][] = array(
+ 'description' => __( 'Order total formatted for locale', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ );
+
+ return $schema;
+ }
+
+ /**
+ * Does a permissions check for the proper requested blog
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ *
+ * @return bool $permission
+ */
+ public function network_orders_permissions_check( $request ) {
+ $blog_id = $request->get_param( 'blog_id' );
+ $blog_id = ! empty( $blog_id ) ? $blog_id : get_current_blog_id();
+
+ switch_to_blog( $blog_id );
+
+ $permission = $this->get_items_permissions_check( $request );
+
+ restore_current_blog();
+
+ return $permission;
+ }
+
+ /**
+ * Get a collection of orders from the requested blog id
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ *
+ * @return WP_REST_Response
+ */
+ public function network_orders( $request ) {
+ $blog_id = $request->get_param( 'blog_id' );
+ $blog_id = ! empty( $blog_id ) ? $blog_id : get_current_blog_id();
+
+ switch_to_blog( $blog_id );
+
+ add_filter( 'woocommerce_rest_orders_prepare_object_query', array( $this, 'network_orders_filter_args' ) );
+ $items = $this->get_items( $request );
+ remove_filter( 'woocommerce_rest_orders_prepare_object_query', array( $this, 'network_orders_filter_args' ) );
+
+ foreach ( $items->data as &$current_order ) {
+ $order = wc_get_order( $current_order['id'] );
+
+ $current_order['blog'] = get_blog_details( get_current_blog_id() );
+ $current_order['edit_url'] = get_admin_url( $blog_id, 'post.php?post=' . absint( $order->get_id() ) . '&action=edit' );
+ /* translators: 1: first name 2: last name */
+ $current_order['customer'] = trim( sprintf( _x( '%1$s %2$s', 'full name', 'woocommerce' ), $order->get_billing_first_name(), $order->get_billing_last_name() ) );
+ $current_order['status_name'] = wc_get_order_status_name( $order->get_status() );
+ $current_order['formatted_total'] = $order->get_formatted_order_total();
+ }
+
+ restore_current_blog();
+
+ return $items;
+ }
+
+ /**
+ * Filters the post statuses to on hold and processing for the network order query.
+ *
+ * @param array $args Query args.
+ *
+ * @return array
+ */
+ public function network_orders_filter_args( $args ) {
+ $args['post_status'] = array(
+ 'wc-on-hold',
+ 'wc-processing',
+ );
+
+ return $args;
+ }
+}
diff --git a/includes/api/v2/class-wc-rest-order-notes-v2-controller.php b/includes/api/v2/class-wc-rest-order-notes-v2-controller.php
new file mode 100644
index 00000000000..b7f31d1ea79
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-order-notes-v2-controller.php
@@ -0,0 +1,182 @@
+/notes endpoint.
+ *
+ * @package WooCommerce/API
+ * @since 2.6.0
+ */
+
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * REST API Order Notes controller class.
+ *
+ * @package WooCommerce/API
+ * @extends WC_REST_Order_Notes_V1_Controller
+ */
+class WC_REST_Order_Notes_V2_Controller extends WC_REST_Order_Notes_V1_Controller {
+
+ /**
+ * Endpoint namespace.
+ *
+ * @var string
+ */
+ protected $namespace = 'wc/v2';
+
+ /**
+ * Get order notes from an order.
+ *
+ * @param WP_REST_Request $request Request data.
+ *
+ * @return array|WP_Error
+ */
+ public function get_items( $request ) {
+ $order = wc_get_order( (int) $request['order_id'] );
+
+ if ( ! $order || $this->post_type !== $order->get_type() ) {
+ return new WP_Error( "woocommerce_rest_{$this->post_type}_invalid_id", __( 'Invalid order ID.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+
+ $args = array(
+ 'post_id' => $order->get_id(),
+ 'approve' => 'approve',
+ 'type' => 'order_note',
+ );
+
+ // Allow filter by order note type.
+ if ( 'customer' === $request['type'] ) {
+ $args['meta_query'] = array( // WPCS: slow query ok.
+ array(
+ 'key' => 'is_customer_note',
+ 'value' => 1,
+ 'compare' => '=',
+ ),
+ );
+ } elseif ( 'internal' === $request['type'] ) {
+ $args['meta_query'] = array( // WPCS: slow query ok.
+ array(
+ 'key' => 'is_customer_note',
+ 'compare' => 'NOT EXISTS',
+ ),
+ );
+ }
+
+ remove_filter( 'comments_clauses', array( 'WC_Comments', 'exclude_order_comments' ), 10, 1 );
+
+ $notes = get_comments( $args );
+
+ add_filter( 'comments_clauses', array( 'WC_Comments', 'exclude_order_comments' ), 10, 1 );
+
+ $data = array();
+ foreach ( $notes as $note ) {
+ $order_note = $this->prepare_item_for_response( $note, $request );
+ $order_note = $this->prepare_response_for_collection( $order_note );
+ $data[] = $order_note;
+ }
+
+ return rest_ensure_response( $data );
+ }
+
+ /**
+ * Prepare a single order note output for response.
+ *
+ * @param WP_Comment $note Order note object.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response Response data.
+ */
+ public function prepare_item_for_response( $note, $request ) {
+ $data = array(
+ 'id' => (int) $note->comment_ID,
+ 'date_created' => wc_rest_prepare_date_response( $note->comment_date ),
+ 'date_created_gmt' => wc_rest_prepare_date_response( $note->comment_date_gmt ),
+ 'note' => $note->comment_content,
+ 'customer_note' => (bool) get_comment_meta( $note->comment_ID, 'is_customer_note', true ),
+ );
+
+ $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+
+ // Wrap the data in a response object.
+ $response = rest_ensure_response( $data );
+
+ $response->add_links( $this->prepare_links( $note ) );
+
+ /**
+ * Filter order note object returned from the REST API.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param WP_Comment $note Order note object used to create response.
+ * @param WP_REST_Request $request Request object.
+ */
+ return apply_filters( 'woocommerce_rest_prepare_order_note', $response, $note, $request );
+ }
+
+ /**
+ * Get the Order Notes schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'order_note',
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_created' => array(
+ 'description' => __( "The date the order note was created, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_created_gmt' => array(
+ 'description' => __( 'The date the order note was created, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'note' => array(
+ 'description' => __( 'Order note content.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'customer_note' => array(
+ 'description' => __( 'If true, the note will be shown to customers and they will be notified. If false, the note will be for admin reference only.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'default' => false,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+
+ /**
+ * Get the query params for collections.
+ *
+ * @return array
+ */
+ public function get_collection_params() {
+ $params = array();
+ $params['context'] = $this->get_context_param( array( 'default' => 'view' ) );
+ $params['type'] = array(
+ 'default' => 'any',
+ 'description' => __( 'Limit result to customers or internal notes.', 'woocommerce' ),
+ 'type' => 'string',
+ 'enum' => array( 'any', 'customer', 'internal' ),
+ 'sanitize_callback' => 'sanitize_key',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+
+ return $params;
+ }
+}
diff --git a/includes/api/v2/class-wc-rest-order-refunds-v2-controller.php b/includes/api/v2/class-wc-rest-order-refunds-v2-controller.php
new file mode 100644
index 00000000000..3ce6e7fbf82
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-order-refunds-v2-controller.php
@@ -0,0 +1,584 @@
+/refunds endpoint.
+ *
+ * @package WooCommerce/API
+ * @since 2.6.0
+ */
+
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * REST API Order Refunds controller class.
+ *
+ * @package WooCommerce/API
+ * @extends WC_REST_Orders_V2_Controller
+ */
+class WC_REST_Order_Refunds_V2_Controller extends WC_REST_Orders_V2_Controller {
+
+ /**
+ * Endpoint namespace.
+ *
+ * @var string
+ */
+ protected $namespace = 'wc/v2';
+
+ /**
+ * Route base.
+ *
+ * @var string
+ */
+ protected $rest_base = 'orders/(?P[\d]+)/refunds';
+
+ /**
+ * Post type.
+ *
+ * @var string
+ */
+ protected $post_type = 'shop_order_refund';
+
+ /**
+ * Stores the request.
+ *
+ * @var array
+ */
+ protected $request = array();
+
+ /**
+ * Order refunds actions.
+ */
+ public function __construct() {
+ add_filter( "woocommerce_rest_{$this->post_type}_object_trashable", '__return_false' );
+ }
+
+ /**
+ * Register the routes for order refunds.
+ */
+ public function register_routes() {
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base, array(
+ 'args' => array(
+ 'order_id' => array(
+ 'description' => __( 'The order ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_items' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ 'args' => $this->get_collection_params(),
+ ),
+ array(
+ 'methods' => WP_REST_Server::CREATABLE,
+ 'callback' => array( $this, 'create_item' ),
+ 'permission_callback' => array( $this, 'create_item_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array(
+ 'args' => array(
+ 'order_id' => array(
+ 'description' => __( 'The order ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ ),
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
+ 'type' => 'integer',
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_item' ),
+ 'permission_callback' => array( $this, 'get_item_permissions_check' ),
+ 'args' => array(
+ 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::DELETABLE,
+ 'callback' => array( $this, 'delete_item' ),
+ 'permission_callback' => array( $this, 'delete_item_permissions_check' ),
+ 'args' => array(
+ 'force' => array(
+ 'default' => true,
+ 'type' => 'boolean',
+ 'description' => __( 'Required to be true, as resource does not support trashing.', 'woocommerce' ),
+ ),
+ ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ }
+
+ /**
+ * Get object.
+ *
+ * @since 3.0.0
+ * @param int $id Object ID.
+ * @return WC_Data
+ */
+ protected function get_object( $id ) {
+ return wc_get_order( $id );
+ }
+
+ /**
+ * Get formatted item data.
+ *
+ * @since 3.0.0
+ * @param WC_Data $object WC_Data instance.
+ * @return array
+ */
+ protected function get_formatted_item_data( $object ) {
+ $data = $object->get_data();
+ $format_decimal = array( 'amount' );
+ $format_date = array( 'date_created' );
+ $format_line_items = array( 'line_items' );
+
+ // Format decimal values.
+ foreach ( $format_decimal as $key ) {
+ $data[ $key ] = wc_format_decimal( $data[ $key ], $this->request['dp'] );
+ }
+
+ // Format date values.
+ foreach ( $format_date as $key ) {
+ $datetime = $data[ $key ];
+ $data[ $key ] = wc_rest_prepare_date_response( $datetime, false );
+ $data[ $key . '_gmt' ] = wc_rest_prepare_date_response( $datetime );
+ }
+
+ // Format line items.
+ foreach ( $format_line_items as $key ) {
+ $data[ $key ] = array_values( array_map( array( $this, 'get_order_item_data' ), $data[ $key ] ) );
+ }
+
+ return array(
+ 'id' => $object->get_id(),
+ 'date_created' => $data['date_created'],
+ 'date_created_gmt' => $data['date_created_gmt'],
+ 'amount' => $data['amount'],
+ 'reason' => $data['reason'],
+ 'refunded_by' => $data['refunded_by'],
+ 'refunded_payment' => $data['refunded_payment'],
+ 'meta_data' => $data['meta_data'],
+ 'line_items' => $data['line_items'],
+ );
+ }
+
+ /**
+ * Prepare a single order output for response.
+ *
+ * @since 3.0.0
+ *
+ * @param WC_Data $object Object data.
+ * @param WP_REST_Request $request Request object.
+ *
+ * @return WP_Error|WP_REST_Response
+ */
+ public function prepare_object_for_response( $object, $request ) {
+ $this->request = $request;
+ $this->request['dp'] = is_null( $this->request['dp'] ) ? wc_get_price_decimals() : absint( $this->request['dp'] );
+ $order = wc_get_order( (int) $request['order_id'] );
+
+ if ( ! $order ) {
+ return new WP_Error( 'woocommerce_rest_invalid_order_id', __( 'Invalid order ID.', 'woocommerce' ), 404 );
+ }
+
+ if ( ! $object || $object->get_parent_id() !== $order->get_id() ) {
+ return new WP_Error( 'woocommerce_rest_invalid_order_refund_id', __( 'Invalid order refund ID.', 'woocommerce' ), 404 );
+ }
+
+ $data = $this->get_formatted_item_data( $object );
+ $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+
+ // Wrap the data in a response object.
+ $response = rest_ensure_response( $data );
+
+ $response->add_links( $this->prepare_links( $object, $request ) );
+
+ /**
+ * Filter the data for a response.
+ *
+ * The dynamic portion of the hook name, $this->post_type,
+ * refers to object type being prepared for the response.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param WC_Data $object Object data.
+ * @param WP_REST_Request $request Request object.
+ */
+ return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request );
+ }
+
+ /**
+ * Prepare links for the request.
+ *
+ * @param WC_Data $object Object data.
+ * @param WP_REST_Request $request Request object.
+ * @return array Links for the given post.
+ */
+ protected function prepare_links( $object, $request ) {
+ $base = str_replace( '(?P[\d]+)', $object->get_parent_id(), $this->rest_base );
+ $links = array(
+ 'self' => array(
+ 'href' => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $base, $object->get_id() ) ),
+ ),
+ 'collection' => array(
+ 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $base ) ),
+ ),
+ 'up' => array(
+ 'href' => rest_url( sprintf( '/%s/orders/%d', $this->namespace, $object->get_parent_id() ) ),
+ ),
+ );
+
+ return $links;
+ }
+
+ /**
+ * Prepare objects query.
+ *
+ * @since 3.0.0
+ * @param WP_REST_Request $request Full details about the request.
+ * @return array
+ */
+ protected function prepare_objects_query( $request ) {
+ $args = parent::prepare_objects_query( $request );
+
+ $args['post_status'] = array_keys( wc_get_order_statuses() );
+ $args['post_parent__in'] = array( absint( $request['order_id'] ) );
+
+ return $args;
+ }
+
+ /**
+ * Prepares one object for create or update operation.
+ *
+ * @since 3.0.0
+ * @param WP_REST_Request $request Request object.
+ * @param bool $creating If is creating a new object.
+ * @return WP_Error|WC_Data The prepared item, or WP_Error object on failure.
+ */
+ protected function prepare_object_for_database( $request, $creating = false ) {
+ $order = wc_get_order( (int) $request['order_id'] );
+
+ if ( ! $order ) {
+ return new WP_Error( 'woocommerce_rest_invalid_order_id', __( 'Invalid order ID.', 'woocommerce' ), 404 );
+ }
+
+ if ( 0 > $request['amount'] ) {
+ return new WP_Error( 'woocommerce_rest_invalid_order_refund', __( 'Refund amount must be greater than zero.', 'woocommerce' ), 400 );
+ }
+
+ // Create the refund.
+ $refund = wc_create_refund(
+ array(
+ 'order_id' => $order->get_id(),
+ 'amount' => $request['amount'],
+ 'reason' => empty( $request['reason'] ) ? null : $request['reason'],
+ 'refund_payment' => is_bool( $request['api_refund'] ) ? $request['api_refund'] : true,
+ 'restock_items' => true,
+ )
+ );
+
+ if ( is_wp_error( $refund ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_create_order_refund', $refund->get_error_message(), 500 );
+ }
+
+ if ( ! $refund ) {
+ return new WP_Error( 'woocommerce_rest_cannot_create_order_refund', __( 'Cannot create order refund, please try again.', 'woocommerce' ), 500 );
+ }
+
+ if ( ! empty( $request['meta_data'] ) && is_array( $request['meta_data'] ) ) {
+ foreach ( $request['meta_data'] as $meta ) {
+ $refund->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' );
+ }
+ $refund->save_meta_data();
+ }
+
+ /**
+ * Filters an object before it is inserted via the REST API.
+ *
+ * The dynamic portion of the hook name, `$this->post_type`,
+ * refers to the object type slug.
+ *
+ * @param WC_Data $coupon Object object.
+ * @param WP_REST_Request $request Request object.
+ * @param bool $creating If is creating a new object.
+ */
+ return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $refund, $request, $creating );
+ }
+
+ /**
+ * Save an object data.
+ *
+ * @since 3.0.0
+ * @param WP_REST_Request $request Full details about the request.
+ * @param bool $creating If is creating a new object.
+ * @return WC_Data|WP_Error
+ */
+ protected function save_object( $request, $creating = false ) {
+ try {
+ $object = $this->prepare_object_for_database( $request, $creating );
+
+ if ( is_wp_error( $object ) ) {
+ return $object;
+ }
+
+ return $this->get_object( $object->get_id() );
+ } catch ( WC_Data_Exception $e ) {
+ return new WP_Error( $e->getErrorCode(), $e->getMessage(), $e->getErrorData() );
+ } catch ( WC_REST_Exception $e ) {
+ return new WP_Error( $e->getErrorCode(), $e->getMessage(), array( 'status' => $e->getCode() ) );
+ }
+ }
+
+ /**
+ * Get the Order's schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => $this->post_type,
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_created' => array(
+ 'description' => __( "The date the order refund was created, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_created_gmt' => array(
+ 'description' => __( 'The date the order refund was created, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'amount' => array(
+ 'description' => __( 'Refund amount.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'reason' => array(
+ 'description' => __( 'Reason for refund.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'refunded_by' => array(
+ 'description' => __( 'User ID of user who created the refund.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'refunded_payment' => array(
+ 'description' => __( 'If the payment was refunded via the API.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'meta_data' => array(
+ 'description' => __( 'Meta data.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Meta ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'key' => array(
+ 'description' => __( 'Meta key.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'value' => array(
+ 'description' => __( 'Meta value.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ ),
+ 'line_items' => array(
+ 'description' => __( 'Line items data.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Item ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'name' => array(
+ 'description' => __( 'Product name.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'product_id' => array(
+ 'description' => __( 'Product ID.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'variation_id' => array(
+ 'description' => __( 'Variation ID, if applicable.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'quantity' => array(
+ 'description' => __( 'Quantity ordered.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'tax_class' => array(
+ 'description' => __( 'Tax class of product.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'subtotal' => array(
+ 'description' => __( 'Line subtotal (before discounts).', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'subtotal_tax' => array(
+ 'description' => __( 'Line subtotal tax (before discounts).', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'total' => array(
+ 'description' => __( 'Line total (after discounts).', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'total_tax' => array(
+ 'description' => __( 'Line total tax (after discounts).', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'taxes' => array(
+ 'description' => __( 'Line taxes.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Tax rate ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'total' => array(
+ 'description' => __( 'Tax total.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'subtotal' => array(
+ 'description' => __( 'Tax subtotal.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ ),
+ ),
+ ),
+ 'meta_data' => array(
+ 'description' => __( 'Meta data.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Meta ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'key' => array(
+ 'description' => __( 'Meta key.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'value' => array(
+ 'description' => __( 'Meta value.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ ),
+ ),
+ ),
+ 'sku' => array(
+ 'description' => __( 'Product SKU.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'price' => array(
+ 'description' => __( 'Product price.', 'woocommerce' ),
+ 'type' => 'number',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ ),
+ ),
+ ),
+ 'api_refund' => array(
+ 'description' => __( 'When true, the payment gateway API is used to generate the refund.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'edit' ),
+ 'default' => true,
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+
+ /**
+ * Get the query params for collections.
+ *
+ * @return array
+ */
+ public function get_collection_params() {
+ $params = parent::get_collection_params();
+
+ unset( $params['status'], $params['customer'], $params['product'] );
+
+ return $params;
+ }
+}
diff --git a/includes/api/v2/class-wc-rest-orders-v2-controller.php b/includes/api/v2/class-wc-rest-orders-v2-controller.php
new file mode 100644
index 00000000000..5b312f9a394
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-orders-v2-controller.php
@@ -0,0 +1,1703 @@
+namespace, '/' . $this->rest_base, array(
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_items' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ 'args' => $this->get_collection_params(),
+ ),
+ array(
+ 'methods' => WP_REST_Server::CREATABLE,
+ 'callback' => array( $this, 'create_item' ),
+ 'permission_callback' => array( $this, 'create_item_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array(
+ 'args' => array(
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
+ 'type' => 'integer',
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_item' ),
+ 'permission_callback' => array( $this, 'get_item_permissions_check' ),
+ 'args' => array(
+ 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => array( $this, 'update_item' ),
+ 'permission_callback' => array( $this, 'update_item_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::DELETABLE,
+ 'callback' => array( $this, 'delete_item' ),
+ 'permission_callback' => array( $this, 'delete_item_permissions_check' ),
+ 'args' => array(
+ 'force' => array(
+ 'default' => false,
+ 'type' => 'boolean',
+ 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ),
+ ),
+ ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/batch', array(
+ array(
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => array( $this, 'batch_items' ),
+ 'permission_callback' => array( $this, 'batch_items_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
+ ),
+ 'schema' => array( $this, 'get_public_batch_schema' ),
+ )
+ );
+ }
+
+ /**
+ * Get object. Return false if object is not of required type.
+ *
+ * @since 3.0.0
+ * @param int $id Object ID.
+ * @return WC_Data|bool
+ */
+ protected function get_object( $id ) {
+ $order = wc_get_order( $id );
+ // In case id is a refund's id (or it's not an order at all), don't expose it via /orders/ path.
+ if ( ! $order || 'shop_order_refund' === $order->get_type() ) {
+ return false;
+ }
+
+ return $order;
+ }
+
+ /**
+ * Expands an order item to get its data.
+ *
+ * @param WC_Order_item $item Order item data.
+ * @return array
+ */
+ protected function get_order_item_data( $item ) {
+ $data = $item->get_data();
+ $format_decimal = array( 'subtotal', 'subtotal_tax', 'total', 'total_tax', 'tax_total', 'shipping_tax_total' );
+
+ // Format decimal values.
+ foreach ( $format_decimal as $key ) {
+ if ( isset( $data[ $key ] ) ) {
+ $data[ $key ] = wc_format_decimal( $data[ $key ], $this->request['dp'] );
+ }
+ }
+
+ // Add SKU and PRICE to products.
+ if ( is_callable( array( $item, 'get_product' ) ) ) {
+ $data['sku'] = $item->get_product() ? $item->get_product()->get_sku() : null;
+ $data['price'] = $item->get_quantity() ? $item->get_total() / $item->get_quantity() : 0;
+ }
+
+ // Format taxes.
+ if ( ! empty( $data['taxes']['total'] ) ) {
+ $taxes = array();
+
+ foreach ( $data['taxes']['total'] as $tax_rate_id => $tax ) {
+ $taxes[] = array(
+ 'id' => $tax_rate_id,
+ 'total' => $tax,
+ 'subtotal' => isset( $data['taxes']['subtotal'][ $tax_rate_id ] ) ? $data['taxes']['subtotal'][ $tax_rate_id ] : '',
+ );
+ }
+ $data['taxes'] = $taxes;
+ } elseif ( isset( $data['taxes'] ) ) {
+ $data['taxes'] = array();
+ }
+
+ // Remove names for coupons, taxes and shipping.
+ if ( isset( $data['code'] ) || isset( $data['rate_code'] ) || isset( $data['method_title'] ) ) {
+ unset( $data['name'] );
+ }
+
+ // Remove props we don't want to expose.
+ unset( $data['order_id'] );
+ unset( $data['type'] );
+
+ return $data;
+ }
+
+ /**
+ * Get formatted item data.
+ *
+ * @since 3.0.0
+ * @param WC_Data $object WC_Data instance.
+ * @return array
+ */
+ protected function get_formatted_item_data( $object ) {
+ $data = $object->get_data();
+ $format_decimal = array( 'discount_total', 'discount_tax', 'shipping_total', 'shipping_tax', 'shipping_total', 'shipping_tax', 'cart_tax', 'total', 'total_tax' );
+ $format_date = array( 'date_created', 'date_modified', 'date_completed', 'date_paid' );
+ $format_line_items = array( 'line_items', 'tax_lines', 'shipping_lines', 'fee_lines', 'coupon_lines' );
+
+ // Format decimal values.
+ foreach ( $format_decimal as $key ) {
+ $data[ $key ] = wc_format_decimal( $data[ $key ], $this->request['dp'] );
+ }
+
+ // Format date values.
+ foreach ( $format_date as $key ) {
+ $datetime = $data[ $key ];
+ $data[ $key ] = wc_rest_prepare_date_response( $datetime, false );
+ $data[ $key . '_gmt' ] = wc_rest_prepare_date_response( $datetime );
+ }
+
+ // Format the order status.
+ $data['status'] = 'wc-' === substr( $data['status'], 0, 3 ) ? substr( $data['status'], 3 ) : $data['status'];
+
+ // Format line items.
+ foreach ( $format_line_items as $key ) {
+ $data[ $key ] = array_values( array_map( array( $this, 'get_order_item_data' ), $data[ $key ] ) );
+ }
+
+ // Refunds.
+ $data['refunds'] = array();
+ foreach ( $object->get_refunds() as $refund ) {
+ $data['refunds'][] = array(
+ 'id' => $refund->get_id(),
+ 'reason' => $refund->get_reason() ? $refund->get_reason() : '',
+ 'total' => '-' . wc_format_decimal( $refund->get_amount(), $this->request['dp'] ),
+ );
+ }
+
+ return array(
+ 'id' => $object->get_id(),
+ 'parent_id' => $data['parent_id'],
+ 'number' => $data['number'],
+ 'order_key' => $data['order_key'],
+ 'created_via' => $data['created_via'],
+ 'version' => $data['version'],
+ 'status' => $data['status'],
+ 'currency' => $data['currency'],
+ 'date_created' => $data['date_created'],
+ 'date_created_gmt' => $data['date_created_gmt'],
+ 'date_modified' => $data['date_modified'],
+ 'date_modified_gmt' => $data['date_modified_gmt'],
+ 'discount_total' => $data['discount_total'],
+ 'discount_tax' => $data['discount_tax'],
+ 'shipping_total' => $data['shipping_total'],
+ 'shipping_tax' => $data['shipping_tax'],
+ 'cart_tax' => $data['cart_tax'],
+ 'total' => $data['total'],
+ 'total_tax' => $data['total_tax'],
+ 'prices_include_tax' => $data['prices_include_tax'],
+ 'customer_id' => $data['customer_id'],
+ 'customer_ip_address' => $data['customer_ip_address'],
+ 'customer_user_agent' => $data['customer_user_agent'],
+ 'customer_note' => $data['customer_note'],
+ 'billing' => $data['billing'],
+ 'shipping' => $data['shipping'],
+ 'payment_method' => $data['payment_method'],
+ 'payment_method_title' => $data['payment_method_title'],
+ 'transaction_id' => $data['transaction_id'],
+ 'date_paid' => $data['date_paid'],
+ 'date_paid_gmt' => $data['date_paid_gmt'],
+ 'date_completed' => $data['date_completed'],
+ 'date_completed_gmt' => $data['date_completed_gmt'],
+ 'cart_hash' => $data['cart_hash'],
+ 'meta_data' => $data['meta_data'],
+ 'line_items' => $data['line_items'],
+ 'tax_lines' => $data['tax_lines'],
+ 'shipping_lines' => $data['shipping_lines'],
+ 'fee_lines' => $data['fee_lines'],
+ 'coupon_lines' => $data['coupon_lines'],
+ 'refunds' => $data['refunds'],
+ );
+ }
+
+ /**
+ * Prepare a single order output for response.
+ *
+ * @since 3.0.0
+ * @param WC_Data $object Object data.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response
+ */
+ public function prepare_object_for_response( $object, $request ) {
+ $this->request = $request;
+ $this->request['dp'] = is_null( $this->request['dp'] ) ? wc_get_price_decimals() : absint( $this->request['dp'] );
+ $data = $this->get_formatted_item_data( $object );
+ $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+ $response = rest_ensure_response( $data );
+ $response->add_links( $this->prepare_links( $object, $request ) );
+
+ /**
+ * Filter the data for a response.
+ *
+ * The dynamic portion of the hook name, $this->post_type,
+ * refers to object type being prepared for the response.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param WC_Data $object Object data.
+ * @param WP_REST_Request $request Request object.
+ */
+ return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request );
+ }
+
+ /**
+ * Prepare links for the request.
+ *
+ * @param WC_Data $object Object data.
+ * @param WP_REST_Request $request Request object.
+ * @return array Links for the given post.
+ */
+ protected function prepare_links( $object, $request ) {
+ $links = array(
+ 'self' => array(
+ 'href' => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $object->get_id() ) ),
+ ),
+ 'collection' => array(
+ 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
+ ),
+ );
+
+ if ( 0 !== (int) $object->get_customer_id() ) {
+ $links['customer'] = array(
+ 'href' => rest_url( sprintf( '/%s/customers/%d', $this->namespace, $object->get_customer_id() ) ),
+ );
+ }
+
+ if ( 0 !== (int) $object->get_parent_id() ) {
+ $links['up'] = array(
+ 'href' => rest_url( sprintf( '/%s/orders/%d', $this->namespace, $object->get_parent_id() ) ),
+ );
+ }
+
+ return $links;
+ }
+
+ /**
+ * Prepare objects query.
+ *
+ * @since 3.0.0
+ * @param WP_REST_Request $request Full details about the request.
+ * @return array
+ */
+ protected function prepare_objects_query( $request ) {
+ global $wpdb;
+
+ $args = parent::prepare_objects_query( $request );
+
+ // Set post_status.
+ if ( in_array( $request['status'], $this->get_order_statuses(), true ) ) {
+ $args['post_status'] = 'wc-' . $request['status'];
+ } elseif ( 'any' === $request['status'] ) {
+ $args['post_status'] = 'any';
+ } else {
+ $args['post_status'] = $request['status'];
+ }
+
+ if ( isset( $request['customer'] ) ) {
+ if ( ! empty( $args['meta_query'] ) ) {
+ $args['meta_query'] = array(); // WPCS: slow query ok.
+ }
+
+ $args['meta_query'][] = array(
+ 'key' => '_customer_user',
+ 'value' => $request['customer'],
+ 'type' => 'NUMERIC',
+ );
+ }
+
+ // Search by product.
+ if ( ! empty( $request['product'] ) ) {
+ $order_ids = $wpdb->get_col(
+ $wpdb->prepare(
+ "
+ SELECT order_id
+ FROM {$wpdb->prefix}woocommerce_order_items
+ WHERE order_item_id IN ( SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE meta_key = '_product_id' AND meta_value = %d )
+ AND order_item_type = 'line_item'
+ ", $request['product']
+ )
+ );
+
+ // Force WP_Query return empty if don't found any order.
+ $order_ids = ! empty( $order_ids ) ? $order_ids : array( 0 );
+
+ $args['post__in'] = $order_ids;
+ }
+
+ // Search.
+ if ( ! empty( $args['s'] ) ) {
+ $order_ids = wc_order_search( $args['s'] );
+
+ if ( ! empty( $order_ids ) ) {
+ unset( $args['s'] );
+ $args['post__in'] = array_merge( $order_ids, array( 0 ) );
+ }
+ }
+
+ /**
+ * Filter the query arguments for a request.
+ *
+ * Enables adding extra arguments or setting defaults for an order collection request.
+ *
+ * @param array $args Key value array of query var to query value.
+ * @param WP_REST_Request $request The request used.
+ */
+ $args = apply_filters( 'woocommerce_rest_orders_prepare_object_query', $args, $request );
+
+ return $args;
+ }
+
+ /**
+ * Only return writable props from schema.
+ *
+ * @param array $schema Schema.
+ * @return bool
+ */
+ protected function filter_writable_props( $schema ) {
+ return empty( $schema['readonly'] );
+ }
+
+ /**
+ * Prepare a single order for create or update.
+ *
+ * @param WP_REST_Request $request Request object.
+ * @param bool $creating If is creating a new object.
+ * @return WP_Error|WC_Data
+ */
+ protected function prepare_object_for_database( $request, $creating = false ) {
+ $id = isset( $request['id'] ) ? absint( $request['id'] ) : 0;
+ $order = new WC_Order( $id );
+ $schema = $this->get_item_schema();
+ $data_keys = array_keys( array_filter( $schema['properties'], array( $this, 'filter_writable_props' ) ) );
+
+ // Handle all writable props.
+ foreach ( $data_keys as $key ) {
+ $value = $request[ $key ];
+
+ if ( ! is_null( $value ) ) {
+ switch ( $key ) {
+ case 'status':
+ // Status change should be done later so transitions have new data.
+ break;
+ case 'billing':
+ case 'shipping':
+ $this->update_address( $order, $value, $key );
+ break;
+ case 'line_items':
+ case 'shipping_lines':
+ case 'fee_lines':
+ case 'coupon_lines':
+ if ( is_array( $value ) ) {
+ foreach ( $value as $item ) {
+ if ( is_array( $item ) ) {
+ if ( $this->item_is_null( $item ) || ( isset( $item['quantity'] ) && 0 === $item['quantity'] ) ) {
+ $order->remove_item( $item['id'] );
+ } else {
+ $this->set_item( $order, $key, $item );
+ }
+ }
+ }
+ }
+ break;
+ case 'meta_data':
+ if ( is_array( $value ) ) {
+ foreach ( $value as $meta ) {
+ $order->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' );
+ }
+ }
+ break;
+ default:
+ if ( is_callable( array( $order, "set_{$key}" ) ) ) {
+ $order->{"set_{$key}"}( $value );
+ }
+ break;
+ }
+ }
+ }
+
+ /**
+ * Filters an object before it is inserted via the REST API.
+ *
+ * The dynamic portion of the hook name, `$this->post_type`,
+ * refers to the object type slug.
+ *
+ * @param WC_Data $order Object object.
+ * @param WP_REST_Request $request Request object.
+ * @param bool $creating If is creating a new object.
+ */
+ return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $order, $request, $creating );
+ }
+
+ /**
+ * Save an object data.
+ *
+ * @since 3.0.0
+ * @throws WC_REST_Exception But all errors are validated before returning any data.
+ * @param WP_REST_Request $request Full details about the request.
+ * @param bool $creating If is creating a new object.
+ * @return WC_Data|WP_Error
+ */
+ protected function save_object( $request, $creating = false ) {
+ try {
+ $object = $this->prepare_object_for_database( $request, $creating );
+
+ if ( is_wp_error( $object ) ) {
+ return $object;
+ }
+
+ // Make sure gateways are loaded so hooks from gateways fire on save/create.
+ WC()->payment_gateways();
+
+ if ( ! is_null( $request['customer_id'] ) && 0 !== $request['customer_id'] ) {
+ // Make sure customer exists.
+ if ( false === get_user_by( 'id', $request['customer_id'] ) ) {
+ throw new WC_REST_Exception( 'woocommerce_rest_invalid_customer_id', __( 'Customer ID is invalid.', 'woocommerce' ), 400 );
+ }
+
+ // Make sure customer is part of blog.
+ if ( is_multisite() && ! is_user_member_of_blog( $request['customer_id'] ) ) {
+ throw new WC_REST_Exception( 'woocommerce_rest_invalid_customer_id_network', __( 'Customer ID does not belong to this site.', 'woocommerce' ), 400 );
+ }
+ }
+
+ if ( $creating ) {
+ $object->set_created_via( 'rest-api' );
+ $object->set_prices_include_tax( 'yes' === get_option( 'woocommerce_prices_include_tax' ) );
+ $object->calculate_totals();
+ } else {
+ // If items have changed, recalculate order totals.
+ if ( isset( $request['billing'] ) || isset( $request['shipping'] ) || isset( $request['line_items'] ) || isset( $request['shipping_lines'] ) || isset( $request['fee_lines'] ) || isset( $request['coupon_lines'] ) ) {
+ $object->calculate_totals( true );
+ }
+ }
+
+ // Set status.
+ if ( ! empty( $request['status'] ) ) {
+ $object->set_status( $request['status'] );
+ }
+
+ $object->save();
+
+ // Actions for after the order is saved.
+ if ( true === $request['set_paid'] ) {
+ if ( $creating || $object->needs_payment() ) {
+ $object->payment_complete( $request['transaction_id'] );
+ }
+ }
+
+ return $this->get_object( $object->get_id() );
+ } catch ( WC_Data_Exception $e ) {
+ return new WP_Error( $e->getErrorCode(), $e->getMessage(), $e->getErrorData() );
+ } catch ( WC_REST_Exception $e ) {
+ return new WP_Error( $e->getErrorCode(), $e->getMessage(), array( 'status' => $e->getCode() ) );
+ }
+ }
+
+ /**
+ * Update address.
+ *
+ * @param WC_Order $order Order data.
+ * @param array $posted Posted data.
+ * @param string $type Address type.
+ */
+ protected function update_address( $order, $posted, $type = 'billing' ) {
+ foreach ( $posted as $key => $value ) {
+ if ( is_callable( array( $order, "set_{$type}_{$key}" ) ) ) {
+ $order->{"set_{$type}_{$key}"}( $value );
+ }
+ }
+ }
+
+ /**
+ * Gets the product ID from the SKU or posted ID.
+ *
+ * @throws WC_REST_Exception When SKU or ID is not valid.
+ * @param array $posted Request data.
+ * @return int
+ */
+ protected function get_product_id( $posted ) {
+ if ( ! empty( $posted['sku'] ) ) {
+ $product_id = (int) wc_get_product_id_by_sku( $posted['sku'] );
+ } elseif ( ! empty( $posted['product_id'] ) && empty( $posted['variation_id'] ) ) {
+ $product_id = (int) $posted['product_id'];
+ } elseif ( ! empty( $posted['variation_id'] ) ) {
+ $product_id = (int) $posted['variation_id'];
+ } else {
+ throw new WC_REST_Exception( 'woocommerce_rest_required_product_reference', __( 'Product ID or SKU is required.', 'woocommerce' ), 400 );
+ }
+ return $product_id;
+ }
+
+ /**
+ * Maybe set an item prop if the value was posted.
+ *
+ * @param WC_Order_Item $item Order item.
+ * @param string $prop Order property.
+ * @param array $posted Request data.
+ */
+ protected function maybe_set_item_prop( $item, $prop, $posted ) {
+ if ( isset( $posted[ $prop ] ) ) {
+ $item->{"set_$prop"}( $posted[ $prop ] );
+ }
+ }
+
+ /**
+ * Maybe set item props if the values were posted.
+ *
+ * @param WC_Order_Item $item Order item data.
+ * @param string[] $props Properties.
+ * @param array $posted Request data.
+ */
+ protected function maybe_set_item_props( $item, $props, $posted ) {
+ foreach ( $props as $prop ) {
+ $this->maybe_set_item_prop( $item, $prop, $posted );
+ }
+ }
+
+ /**
+ * Maybe set item meta if posted.
+ *
+ * @param WC_Order_Item $item Order item data.
+ * @param array $posted Request data.
+ */
+ protected function maybe_set_item_meta_data( $item, $posted ) {
+ if ( ! empty( $posted['meta_data'] ) && is_array( $posted['meta_data'] ) ) {
+ foreach ( $posted['meta_data'] as $meta ) {
+ if ( isset( $meta['key'] ) ) {
+ $value = isset( $meta['value'] ) ? $meta['value'] : null;
+ $item->update_meta_data( $meta['key'], $value, isset( $meta['id'] ) ? $meta['id'] : '' );
+ }
+ }
+ }
+ }
+
+ /**
+ * Create or update a line item.
+ *
+ * @param array $posted Line item data.
+ * @param string $action 'create' to add line item or 'update' to update it.
+ * @param object $item Passed when updating an item. Null during creation.
+ * @return WC_Order_Item_Product
+ * @throws WC_REST_Exception Invalid data, server error.
+ */
+ protected function prepare_line_items( $posted, $action = 'create', $item = null ) {
+ $item = is_null( $item ) ? new WC_Order_Item_Product( ! empty( $posted['id'] ) ? $posted['id'] : '' ) : $item;
+ $product = wc_get_product( $this->get_product_id( $posted ) );
+
+ if ( $product !== $item->get_product() ) {
+ $item->set_product( $product );
+
+ if ( 'create' === $action ) {
+ $quantity = isset( $posted['quantity'] ) ? $posted['quantity'] : 1;
+ $total = wc_get_price_excluding_tax( $product, array( 'qty' => $quantity ) );
+ $item->set_total( $total );
+ $item->set_subtotal( $total );
+ }
+ }
+
+ $this->maybe_set_item_props( $item, array( 'name', 'quantity', 'total', 'subtotal', 'tax_class' ), $posted );
+ $this->maybe_set_item_meta_data( $item, $posted );
+
+ return $item;
+ }
+
+ /**
+ * Create or update an order shipping method.
+ *
+ * @param array $posted $shipping Item data.
+ * @param string $action 'create' to add shipping or 'update' to update it.
+ * @param object $item Passed when updating an item. Null during creation.
+ * @return WC_Order_Item_Shipping
+ * @throws WC_REST_Exception Invalid data, server error.
+ */
+ protected function prepare_shipping_lines( $posted, $action = 'create', $item = null ) {
+ $item = is_null( $item ) ? new WC_Order_Item_Shipping( ! empty( $posted['id'] ) ? $posted['id'] : '' ) : $item;
+
+ if ( 'create' === $action ) {
+ if ( empty( $posted['method_id'] ) ) {
+ throw new WC_REST_Exception( 'woocommerce_rest_invalid_shipping_item', __( 'Shipping method ID is required.', 'woocommerce' ), 400 );
+ }
+ }
+
+ $this->maybe_set_item_props( $item, array( 'method_id', 'method_title', 'total' ), $posted );
+ $this->maybe_set_item_meta_data( $item, $posted );
+
+ return $item;
+ }
+
+ /**
+ * Create or update an order fee.
+ *
+ * @param array $posted Item data.
+ * @param string $action 'create' to add fee or 'update' to update it.
+ * @param object $item Passed when updating an item. Null during creation.
+ * @return WC_Order_Item_Fee
+ * @throws WC_REST_Exception Invalid data, server error.
+ */
+ protected function prepare_fee_lines( $posted, $action = 'create', $item = null ) {
+ $item = is_null( $item ) ? new WC_Order_Item_Fee( ! empty( $posted['id'] ) ? $posted['id'] : '' ) : $item;
+
+ if ( 'create' === $action ) {
+ if ( empty( $posted['name'] ) ) {
+ throw new WC_REST_Exception( 'woocommerce_rest_invalid_fee_item', __( 'Fee name is required.', 'woocommerce' ), 400 );
+ }
+ }
+
+ $this->maybe_set_item_props( $item, array( 'name', 'tax_class', 'tax_status', 'total' ), $posted );
+ $this->maybe_set_item_meta_data( $item, $posted );
+
+ return $item;
+ }
+
+ /**
+ * Create or update an order coupon.
+ *
+ * @param array $posted Item data.
+ * @param string $action 'create' to add coupon or 'update' to update it.
+ * @param object $item Passed when updating an item. Null during creation.
+ * @return WC_Order_Item_Coupon
+ * @throws WC_REST_Exception Invalid data, server error.
+ */
+ protected function prepare_coupon_lines( $posted, $action = 'create', $item = null ) {
+ $item = is_null( $item ) ? new WC_Order_Item_Coupon( ! empty( $posted['id'] ) ? $posted['id'] : '' ) : $item;
+
+ if ( 'create' === $action ) {
+ if ( empty( $posted['code'] ) ) {
+ throw new WC_REST_Exception( 'woocommerce_rest_invalid_coupon_coupon', __( 'Coupon code is required.', 'woocommerce' ), 400 );
+ }
+ }
+
+ $this->maybe_set_item_props( $item, array( 'code', 'discount' ), $posted );
+ $this->maybe_set_item_meta_data( $item, $posted );
+
+ return $item;
+ }
+
+ /**
+ * Wrapper method to create/update order items.
+ * When updating, the item ID provided is checked to ensure it is associated
+ * with the order.
+ *
+ * @param WC_Order $order order object.
+ * @param string $item_type The item type.
+ * @param array $posted item provided in the request body.
+ * @throws WC_REST_Exception If item ID is not associated with order.
+ */
+ protected function set_item( $order, $item_type, $posted ) {
+ global $wpdb;
+
+ if ( ! empty( $posted['id'] ) ) {
+ $action = 'update';
+ } else {
+ $action = 'create';
+ }
+
+ $method = 'prepare_' . $item_type;
+ $item = null;
+
+ // Verify provided line item ID is associated with order.
+ if ( 'update' === $action ) {
+ $item = $order->get_item( absint( $posted['id'] ), false );
+
+ if ( ! $item ) {
+ throw new WC_REST_Exception( 'woocommerce_rest_invalid_item_id', __( 'Order item ID provided is not associated with order.', 'woocommerce' ), 400 );
+ }
+ }
+
+ // Prepare item data.
+ $item = $this->$method( $posted, $action, $item );
+
+ do_action( 'woocommerce_rest_set_order_item', $item, $posted );
+
+ // If creating the order, add the item to it.
+ if ( 'create' === $action ) {
+ $order->add_item( $item );
+ } else {
+ $item->save();
+ }
+ }
+
+ /**
+ * Helper method to check if the resource ID associated with the provided item is null.
+ * Items can be deleted by setting the resource ID to null.
+ *
+ * @param array $item Item provided in the request body.
+ * @return bool True if the item resource ID is null, false otherwise.
+ */
+ protected function item_is_null( $item ) {
+ $keys = array( 'product_id', 'method_id', 'method_title', 'name', 'code' );
+
+ foreach ( $keys as $key ) {
+ if ( array_key_exists( $key, $item ) && is_null( $item[ $key ] ) ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Get order statuses without prefixes.
+ *
+ * @return array
+ */
+ protected function get_order_statuses() {
+ $order_statuses = array();
+
+ foreach ( array_keys( wc_get_order_statuses() ) as $status ) {
+ $order_statuses[] = str_replace( 'wc-', '', $status );
+ }
+
+ return $order_statuses;
+ }
+
+ /**
+ * Get the Order's schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => $this->post_type,
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'parent_id' => array(
+ 'description' => __( 'Parent order ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'number' => array(
+ 'description' => __( 'Order number.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'order_key' => array(
+ 'description' => __( 'Order key.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'created_via' => array(
+ 'description' => __( 'Shows where the order was created.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'version' => array(
+ 'description' => __( 'Version of WooCommerce which last updated the order.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'status' => array(
+ 'description' => __( 'Order status.', 'woocommerce' ),
+ 'type' => 'string',
+ 'default' => 'pending',
+ 'enum' => $this->get_order_statuses(),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'currency' => array(
+ 'description' => __( 'Currency the order was created with, in ISO format.', 'woocommerce' ),
+ 'type' => 'string',
+ 'default' => get_woocommerce_currency(),
+ 'enum' => array_keys( get_woocommerce_currencies() ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'date_created' => array(
+ 'description' => __( "The date the order was created, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_created_gmt' => array(
+ 'description' => __( 'The date the order was created, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_modified' => array(
+ 'description' => __( "The date the order was last modified, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_modified_gmt' => array(
+ 'description' => __( 'The date the order was last modified, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'discount_total' => array(
+ 'description' => __( 'Total discount amount for the order.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'discount_tax' => array(
+ 'description' => __( 'Total discount tax amount for the order.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'shipping_total' => array(
+ 'description' => __( 'Total shipping amount for the order.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'shipping_tax' => array(
+ 'description' => __( 'Total shipping tax amount for the order.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'cart_tax' => array(
+ 'description' => __( 'Sum of line item taxes only.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'total' => array(
+ 'description' => __( 'Grand total.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'total_tax' => array(
+ 'description' => __( 'Sum of all taxes.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'prices_include_tax' => array(
+ 'description' => __( 'True the prices included tax during checkout.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'customer_id' => array(
+ 'description' => __( 'User ID who owns the order. 0 for guests.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'default' => 0,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'customer_ip_address' => array(
+ 'description' => __( "Customer's IP address.", 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'customer_user_agent' => array(
+ 'description' => __( 'User agent of the customer.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'customer_note' => array(
+ 'description' => __( 'Note left by customer during checkout.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'billing' => array(
+ 'description' => __( 'Billing address.', 'woocommerce' ),
+ 'type' => 'object',
+ 'context' => array( 'view', 'edit' ),
+ 'properties' => array(
+ 'first_name' => array(
+ 'description' => __( 'First name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'last_name' => array(
+ 'description' => __( 'Last name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'company' => array(
+ 'description' => __( 'Company name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'address_1' => array(
+ 'description' => __( 'Address line 1', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'address_2' => array(
+ 'description' => __( 'Address line 2', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'city' => array(
+ 'description' => __( 'City name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'state' => array(
+ 'description' => __( 'ISO code or name of the state, province or district.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'postcode' => array(
+ 'description' => __( 'Postal code.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'country' => array(
+ 'description' => __( 'Country code in ISO 3166-1 alpha-2 format.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'email' => array(
+ 'description' => __( 'Email address.', 'woocommerce' ),
+ 'type' => 'string',
+ 'format' => 'email',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'phone' => array(
+ 'description' => __( 'Phone number.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ 'shipping' => array(
+ 'description' => __( 'Shipping address.', 'woocommerce' ),
+ 'type' => 'object',
+ 'context' => array( 'view', 'edit' ),
+ 'properties' => array(
+ 'first_name' => array(
+ 'description' => __( 'First name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'last_name' => array(
+ 'description' => __( 'Last name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'company' => array(
+ 'description' => __( 'Company name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'address_1' => array(
+ 'description' => __( 'Address line 1', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'address_2' => array(
+ 'description' => __( 'Address line 2', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'city' => array(
+ 'description' => __( 'City name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'state' => array(
+ 'description' => __( 'ISO code or name of the state, province or district.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'postcode' => array(
+ 'description' => __( 'Postal code.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'country' => array(
+ 'description' => __( 'Country code in ISO 3166-1 alpha-2 format.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ 'payment_method' => array(
+ 'description' => __( 'Payment method ID.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'payment_method_title' => array(
+ 'description' => __( 'Payment method title.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_text_field',
+ ),
+ ),
+ 'transaction_id' => array(
+ 'description' => __( 'Unique transaction ID.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'date_paid' => array(
+ 'description' => __( "The date the order was paid, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_paid_gmt' => array(
+ 'description' => __( 'The date the order was paid, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_completed' => array(
+ 'description' => __( "The date the order was completed, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_completed_gmt' => array(
+ 'description' => __( 'The date the order was completed, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'cart_hash' => array(
+ 'description' => __( 'MD5 hash of cart items to ensure orders are not modified.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'meta_data' => array(
+ 'description' => __( 'Meta data.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Meta ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'key' => array(
+ 'description' => __( 'Meta key.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'value' => array(
+ 'description' => __( 'Meta value.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ ),
+ 'line_items' => array(
+ 'description' => __( 'Line items data.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Item ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'name' => array(
+ 'description' => __( 'Product name.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'product_id' => array(
+ 'description' => __( 'Product ID.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'variation_id' => array(
+ 'description' => __( 'Variation ID, if applicable.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'quantity' => array(
+ 'description' => __( 'Quantity ordered.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'tax_class' => array(
+ 'description' => __( 'Tax class of product.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'subtotal' => array(
+ 'description' => __( 'Line subtotal (before discounts).', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'subtotal_tax' => array(
+ 'description' => __( 'Line subtotal tax (before discounts).', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'total' => array(
+ 'description' => __( 'Line total (after discounts).', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'total_tax' => array(
+ 'description' => __( 'Line total tax (after discounts).', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'taxes' => array(
+ 'description' => __( 'Line taxes.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Tax rate ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'total' => array(
+ 'description' => __( 'Tax total.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'subtotal' => array(
+ 'description' => __( 'Tax subtotal.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ ),
+ 'meta_data' => array(
+ 'description' => __( 'Meta data.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Meta ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'key' => array(
+ 'description' => __( 'Meta key.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'value' => array(
+ 'description' => __( 'Meta value.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ ),
+ 'sku' => array(
+ 'description' => __( 'Product SKU.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'price' => array(
+ 'description' => __( 'Product price.', 'woocommerce' ),
+ 'type' => 'number',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ ),
+ ),
+ ),
+ 'tax_lines' => array(
+ 'description' => __( 'Tax lines data.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Item ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'rate_code' => array(
+ 'description' => __( 'Tax rate code.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'rate_id' => array(
+ 'description' => __( 'Tax rate ID.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'label' => array(
+ 'description' => __( 'Tax rate label.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'compound' => array(
+ 'description' => __( 'Show if is a compound tax rate.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'tax_total' => array(
+ 'description' => __( 'Tax total (not including shipping taxes).', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'shipping_tax_total' => array(
+ 'description' => __( 'Shipping tax total.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'meta_data' => array(
+ 'description' => __( 'Meta data.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Meta ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'key' => array(
+ 'description' => __( 'Meta key.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'value' => array(
+ 'description' => __( 'Meta value.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ 'shipping_lines' => array(
+ 'description' => __( 'Shipping lines data.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Item ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'method_title' => array(
+ 'description' => __( 'Shipping method name.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'method_id' => array(
+ 'description' => __( 'Shipping method ID.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'instance_id' => array(
+ 'description' => __( 'Shipping instance ID.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'total' => array(
+ 'description' => __( 'Line total (after discounts).', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'total_tax' => array(
+ 'description' => __( 'Line total tax (after discounts).', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'taxes' => array(
+ 'description' => __( 'Line taxes.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Tax rate ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'total' => array(
+ 'description' => __( 'Tax total.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ ),
+ ),
+ ),
+ 'meta_data' => array(
+ 'description' => __( 'Meta data.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Meta ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'key' => array(
+ 'description' => __( 'Meta key.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'value' => array(
+ 'description' => __( 'Meta value.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ 'fee_lines' => array(
+ 'description' => __( 'Fee lines data.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Item ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'name' => array(
+ 'description' => __( 'Fee name.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'tax_class' => array(
+ 'description' => __( 'Tax class of fee.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'tax_status' => array(
+ 'description' => __( 'Tax status of fee.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'enum' => array( 'taxable', 'none' ),
+ ),
+ 'total' => array(
+ 'description' => __( 'Line total (after discounts).', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'total_tax' => array(
+ 'description' => __( 'Line total tax (after discounts).', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'taxes' => array(
+ 'description' => __( 'Line taxes.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Tax rate ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'total' => array(
+ 'description' => __( 'Tax total.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'subtotal' => array(
+ 'description' => __( 'Tax subtotal.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ ),
+ ),
+ ),
+ 'meta_data' => array(
+ 'description' => __( 'Meta data.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Meta ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'key' => array(
+ 'description' => __( 'Meta key.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'value' => array(
+ 'description' => __( 'Meta value.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ 'coupon_lines' => array(
+ 'description' => __( 'Coupons line data.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Item ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'code' => array(
+ 'description' => __( 'Coupon code.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'discount' => array(
+ 'description' => __( 'Discount total.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'discount_tax' => array(
+ 'description' => __( 'Discount total tax.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'meta_data' => array(
+ 'description' => __( 'Meta data.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Meta ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'key' => array(
+ 'description' => __( 'Meta key.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'value' => array(
+ 'description' => __( 'Meta value.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ 'refunds' => array(
+ 'description' => __( 'List of refunds.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Refund ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'reason' => array(
+ 'description' => __( 'Refund reason.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'total' => array(
+ 'description' => __( 'Refund total.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ ),
+ ),
+ ),
+ 'set_paid' => array(
+ 'description' => __( 'Define if the order is paid. It will set the status to processing and reduce stock items.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'default' => false,
+ 'context' => array( 'edit' ),
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+
+ /**
+ * Get the query params for collections.
+ *
+ * @return array
+ */
+ public function get_collection_params() {
+ $params = parent::get_collection_params();
+
+ $params['status'] = array(
+ 'default' => 'any',
+ 'description' => __( 'Limit result set to orders assigned a specific status.', 'woocommerce' ),
+ 'type' => 'string',
+ 'enum' => array_merge( array( 'any', 'trash' ), $this->get_order_statuses() ),
+ 'sanitize_callback' => 'sanitize_key',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+ $params['customer'] = array(
+ 'description' => __( 'Limit result set to orders assigned a specific customer.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'sanitize_callback' => 'absint',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+ $params['product'] = array(
+ 'description' => __( 'Limit result set to orders assigned a specific product.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'sanitize_callback' => 'absint',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+ $params['dp'] = array(
+ 'default' => wc_get_price_decimals(),
+ 'description' => __( 'Number of decimal points to use in each resource.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'sanitize_callback' => 'absint',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+
+ return $params;
+ }
+}
diff --git a/includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php b/includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php
new file mode 100644
index 00000000000..02e71571126
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php
@@ -0,0 +1,466 @@
+
+ */
+ public function register_routes() {
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base, array(
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_items' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ 'args' => $this->get_collection_params(),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array(
+ 'args' => array(
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
+ 'type' => 'string',
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_item' ),
+ 'permission_callback' => array( $this, 'get_item_permissions_check' ),
+ 'args' => array(
+ 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => array( $this, 'update_item' ),
+ 'permission_callback' => array( $this, 'update_items_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ }
+
+ /**
+ * Check whether a given request has permission to view payment gateways.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|boolean
+ */
+ public function get_items_permissions_check( $request ) {
+ if ( ! wc_rest_check_manager_permissions( 'payment_gateways', 'read' ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+ return true;
+ }
+
+ /**
+ * Check if a given request has access to read a payment gateway.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|boolean
+ */
+ public function get_item_permissions_check( $request ) {
+ if ( ! wc_rest_check_manager_permissions( 'payment_gateways', 'read' ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+ return true;
+ }
+
+ /**
+ * Check whether a given request has permission to edit payment gateways.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|boolean
+ */
+ public function update_items_permissions_check( $request ) {
+ if ( ! wc_rest_check_manager_permissions( 'payment_gateways', 'edit' ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you are not allowed to edit this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+ return true;
+ }
+
+ /**
+ * Get payment gateways.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function get_items( $request ) {
+ $payment_gateways = WC()->payment_gateways->payment_gateways();
+ $response = array();
+ foreach ( $payment_gateways as $payment_gateway_id => $payment_gateway ) {
+ $payment_gateway->id = $payment_gateway_id;
+ $gateway = $this->prepare_item_for_response( $payment_gateway, $request );
+ $gateway = $this->prepare_response_for_collection( $gateway );
+ $response[] = $gateway;
+ }
+ return rest_ensure_response( $response );
+ }
+
+ /**
+ * Get a single payment gateway.
+ *
+ * @param WP_REST_Request $request Request data.
+ * @return WP_REST_Response|WP_Error
+ */
+ public function get_item( $request ) {
+ $gateway = $this->get_gateway( $request );
+
+ if ( is_null( $gateway ) ) {
+ return new WP_Error( 'woocommerce_rest_payment_gateway_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+
+ $gateway = $this->prepare_item_for_response( $gateway, $request );
+ return rest_ensure_response( $gateway );
+ }
+
+ /**
+ * Update A Single Payment Method.
+ *
+ * @param WP_REST_Request $request Request data.
+ * @return WP_REST_Response|WP_Error
+ */
+ public function update_item( $request ) {
+ $gateway = $this->get_gateway( $request );
+
+ if ( is_null( $gateway ) ) {
+ return new WP_Error( 'woocommerce_rest_payment_gateway_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+
+ // Get settings.
+ $gateway->init_form_fields();
+ $settings = $gateway->settings;
+
+ // Update settings.
+ if ( isset( $request['settings'] ) ) {
+ $errors_found = false;
+ foreach ( $gateway->form_fields as $key => $field ) {
+ if ( isset( $request['settings'][ $key ] ) ) {
+ if ( is_callable( array( $this, 'validate_setting_' . $field['type'] . '_field' ) ) ) {
+ $value = $this->{'validate_setting_' . $field['type'] . '_field'}( $request['settings'][ $key ], $field );
+ } else {
+ $value = $this->validate_setting_text_field( $request['settings'][ $key ], $field );
+ }
+ if ( is_wp_error( $value ) ) {
+ $errors_found = true;
+ break;
+ }
+ $settings[ $key ] = $value;
+ }
+ }
+
+ if ( $errors_found ) {
+ return new WP_Error( 'rest_setting_value_invalid', __( 'An invalid setting value was passed.', 'woocommerce' ), array( 'status' => 400 ) );
+ }
+ }
+
+ // Update if this method is enabled or not.
+ if ( isset( $request['enabled'] ) ) {
+ $settings['enabled'] = wc_bool_to_string( $request['enabled'] );
+ $gateway->enabled = $settings['enabled'];
+ }
+
+ // Update title.
+ if ( isset( $request['title'] ) ) {
+ $settings['title'] = $request['title'];
+ $gateway->title = $settings['title'];
+ }
+
+ // Update description.
+ if ( isset( $request['description'] ) ) {
+ $settings['description'] = $request['description'];
+ $gateway->description = $settings['description'];
+ }
+
+ // Update options.
+ $gateway->settings = $settings;
+ update_option( $gateway->get_option_key(), apply_filters( 'woocommerce_gateway_' . $gateway->id . '_settings_values', $settings, $gateway ) );
+
+ // Update order.
+ if ( isset( $request['order'] ) ) {
+ $order = (array) get_option( 'woocommerce_gateway_order' );
+ $order[ $gateway->id ] = $request['order'];
+ update_option( 'woocommerce_gateway_order', $order );
+ $gateway->order = absint( $request['order'] );
+ }
+
+ $gateway = $this->prepare_item_for_response( $gateway, $request );
+ return rest_ensure_response( $gateway );
+ }
+
+ /**
+ * Get a gateway based on the current request object.
+ *
+ * @param WP_REST_Request $request Request data.
+ * @return WP_REST_Response|null
+ */
+ public function get_gateway( $request ) {
+ $gateway = null;
+ $payment_gateways = WC()->payment_gateways->payment_gateways();
+ foreach ( $payment_gateways as $payment_gateway_id => $payment_gateway ) {
+ if ( $request['id'] !== $payment_gateway_id ) {
+ continue;
+ }
+ $payment_gateway->id = $payment_gateway_id;
+ $gateway = $payment_gateway;
+ }
+ return $gateway;
+ }
+
+ /**
+ * Prepare a payment gateway for response.
+ *
+ * @param WC_Payment_Gateway $gateway Payment gateway object.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response Response data.
+ */
+ public function prepare_item_for_response( $gateway, $request ) {
+ $order = (array) get_option( 'woocommerce_gateway_order' );
+ $item = array(
+ 'id' => $gateway->id,
+ 'title' => $gateway->title,
+ 'description' => $gateway->description,
+ 'order' => isset( $order[ $gateway->id ] ) ? $order[ $gateway->id ] : '',
+ 'enabled' => ( 'yes' === $gateway->enabled ),
+ 'method_title' => $gateway->get_method_title(),
+ 'method_description' => $gateway->get_method_description(),
+ 'settings' => $this->get_settings( $gateway ),
+ );
+
+ $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+ $data = $this->add_additional_fields_to_object( $item, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+
+ $response = rest_ensure_response( $data );
+ $response->add_links( $this->prepare_links( $gateway, $request ) );
+
+ /**
+ * Filter payment gateway objects returned from the REST API.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param WC_Payment_Gateway $gateway Payment gateway object.
+ * @param WP_REST_Request $request Request object.
+ */
+ return apply_filters( 'woocommerce_rest_prepare_payment_gateway', $response, $gateway, $request );
+ }
+
+ /**
+ * Return settings associated with this payment gateway.
+ *
+ * @param WC_Payment_Gateway $gateway Gateway data.
+ *
+ * @return array
+ */
+ public function get_settings( $gateway ) {
+ $settings = array();
+ $gateway->init_form_fields();
+ foreach ( $gateway->form_fields as $id => $field ) {
+ // Make sure we at least have a title and type.
+ if ( empty( $field['title'] ) || empty( $field['type'] ) ) {
+ continue;
+ }
+ // Ignore 'title' settings/fields -- they are UI only.
+ if ( 'title' === $field['type'] ) {
+ continue;
+ }
+ // Ignore 'enabled' and 'description' which get included elsewhere.
+ if ( in_array( $id, array( 'enabled', 'description' ), true ) ) {
+ continue;
+ }
+ $data = array(
+ 'id' => $id,
+ 'label' => empty( $field['label'] ) ? $field['title'] : $field['label'],
+ 'description' => empty( $field['description'] ) ? '' : $field['description'],
+ 'type' => $field['type'],
+ 'value' => empty( $gateway->settings[ $id ] ) ? '' : $gateway->settings[ $id ],
+ 'default' => empty( $field['default'] ) ? '' : $field['default'],
+ 'tip' => empty( $field['description'] ) ? '' : $field['description'],
+ 'placeholder' => empty( $field['placeholder'] ) ? '' : $field['placeholder'],
+ );
+ if ( ! empty( $field['options'] ) ) {
+ $data['options'] = $field['options'];
+ }
+ $settings[ $id ] = $data;
+ }
+ return $settings;
+ }
+
+ /**
+ * Prepare links for the request.
+ *
+ * @param WC_Payment_Gateway $gateway Payment gateway object.
+ * @param WP_REST_Request $request Request object.
+ * @return array
+ */
+ protected function prepare_links( $gateway, $request ) {
+ $links = array(
+ 'self' => array(
+ 'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $gateway->id ) ),
+ ),
+ 'collection' => array(
+ 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
+ ),
+ );
+
+ return $links;
+ }
+
+ /**
+ * Get the payment gateway schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'payment_gateway',
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Payment gateway ID.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'title' => array(
+ 'description' => __( 'Payment gateway title on checkout.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'description' => array(
+ 'description' => __( 'Payment gateway description on checkout.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'order' => array(
+ 'description' => __( 'Payment gateway sort order.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'arg_options' => array(
+ 'sanitize_callback' => 'absint',
+ ),
+ ),
+ 'enabled' => array(
+ 'description' => __( 'Payment gateway enabled status.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'method_title' => array(
+ 'description' => __( 'Payment gateway method title.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'method_description' => array(
+ 'description' => __( 'Payment gateway method description.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'settings' => array(
+ 'description' => __( 'Payment gateway settings.', 'woocommerce' ),
+ 'type' => 'object',
+ 'context' => array( 'view', 'edit' ),
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'A unique identifier for the setting.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'label' => array(
+ 'description' => __( 'A human readable label for the setting used in interfaces.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'description' => array(
+ 'description' => __( 'A human readable description for the setting used in interfaces.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'type' => array(
+ 'description' => __( 'Type of setting.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'enum' => array( 'text', 'email', 'number', 'color', 'password', 'textarea', 'select', 'multiselect', 'radio', 'image_width', 'checkbox' ),
+ 'readonly' => true,
+ ),
+ 'value' => array(
+ 'description' => __( 'Setting value.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'default' => array(
+ 'description' => __( 'Default value for the setting.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'tip' => array(
+ 'description' => __( 'Additional help text shown to the user about the setting.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'placeholder' => array(
+ 'description' => __( 'Placeholder text to be displayed in text inputs.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ ),
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+
+ /**
+ * Get any query params needed.
+ *
+ * @return array
+ */
+ public function get_collection_params() {
+ return array(
+ 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
+ );
+ }
+
+}
diff --git a/includes/api/v2/class-wc-rest-product-attribute-terms-v2-controller.php b/includes/api/v2/class-wc-rest-product-attribute-terms-v2-controller.php
new file mode 100644
index 00000000000..23ad5e14d9c
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-product-attribute-terms-v2-controller.php
@@ -0,0 +1,27 @@
+/terms endpoint.
+ *
+ * @package WooCommerce/API
+ * @since 2.6.0
+ */
+
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * REST API Product Attribute Terms controller class.
+ *
+ * @package WooCommerce/API
+ * @extends WC_REST_Product_Attribute_Terms_V1_Controller
+ */
+class WC_REST_Product_Attribute_Terms_V2_Controller extends WC_REST_Product_Attribute_Terms_V1_Controller {
+
+ /**
+ * Endpoint namespace.
+ *
+ * @var string
+ */
+ protected $namespace = 'wc/v2';
+}
diff --git a/includes/api/v2/class-wc-rest-product-attributes-v2-controller.php b/includes/api/v2/class-wc-rest-product-attributes-v2-controller.php
new file mode 100644
index 00000000000..59d5416b52e
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-product-attributes-v2-controller.php
@@ -0,0 +1,27 @@
+term_id, 'display_type' );
+
+ // Get category order.
+ $menu_order = get_woocommerce_term_meta( $item->term_id, 'order' );
+
+ $data = array(
+ 'id' => (int) $item->term_id,
+ 'name' => $item->name,
+ 'slug' => $item->slug,
+ 'parent' => (int) $item->parent,
+ 'description' => $item->description,
+ 'display' => $display_type ? $display_type : 'default',
+ 'image' => null,
+ 'menu_order' => (int) $menu_order,
+ 'count' => (int) $item->count,
+ );
+
+ // Get category image.
+ $image_id = get_woocommerce_term_meta( $item->term_id, 'thumbnail_id' );
+ if ( $image_id ) {
+ $attachment = get_post( $image_id );
+
+ $data['image'] = array(
+ 'id' => (int) $image_id,
+ 'date_created' => wc_rest_prepare_date_response( $attachment->post_date ),
+ 'date_created_gmt' => wc_rest_prepare_date_response( $attachment->post_date_gmt ),
+ 'date_modified' => wc_rest_prepare_date_response( $attachment->post_modified ),
+ 'date_modified_gmt' => wc_rest_prepare_date_response( $attachment->post_modified_gmt ),
+ 'src' => wp_get_attachment_url( $image_id ),
+ 'title' => get_the_title( $attachment ),
+ 'alt' => get_post_meta( $image_id, '_wp_attachment_image_alt', true ),
+ );
+ }
+
+ $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+
+ $response = rest_ensure_response( $data );
+
+ $response->add_links( $this->prepare_links( $item, $request ) );
+
+ /**
+ * Filter a term item returned from the API.
+ *
+ * Allows modification of the term data right before it is returned.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param object $item The original term object.
+ * @param WP_REST_Request $request Request used to generate the response.
+ */
+ return apply_filters( "woocommerce_rest_prepare_{$this->taxonomy}", $response, $item, $request );
+ }
+
+ /**
+ * Get the Category schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => $this->taxonomy,
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'name' => array(
+ 'description' => __( 'Category name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_text_field',
+ ),
+ ),
+ 'slug' => array(
+ 'description' => __( 'An alphanumeric identifier for the resource unique to its type.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_title',
+ ),
+ ),
+ 'parent' => array(
+ 'description' => __( 'The ID for the parent of the resource.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'description' => array(
+ 'description' => __( 'HTML description of the resource.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'arg_options' => array(
+ 'sanitize_callback' => 'wp_filter_post_kses',
+ ),
+ ),
+ 'display' => array(
+ 'description' => __( 'Category archive display type.', 'woocommerce' ),
+ 'type' => 'string',
+ 'default' => 'default',
+ 'enum' => array( 'default', 'products', 'subcategories', 'both' ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'image' => array(
+ 'description' => __( 'Image data.', 'woocommerce' ),
+ 'type' => 'object',
+ 'context' => array( 'view', 'edit' ),
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Image ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'date_created' => array(
+ 'description' => __( "The date the image was created, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_created_gmt' => array(
+ 'description' => __( 'The date the image was created, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_modified' => array(
+ 'description' => __( "The date the image was last modified, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_modified_gmt' => array(
+ 'description' => __( 'The date the image was last modified, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'src' => array(
+ 'description' => __( 'Image URL.', 'woocommerce' ),
+ 'type' => 'string',
+ 'format' => 'uri',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'title' => array(
+ 'description' => __( 'Image name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'alt' => array(
+ 'description' => __( 'Image alternative text.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ 'menu_order' => array(
+ 'description' => __( 'Menu order, used to custom sort the resource.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'count' => array(
+ 'description' => __( 'Number of published products for the resource.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+}
diff --git a/includes/api/v2/class-wc-rest-product-reviews-v2-controller.php b/includes/api/v2/class-wc-rest-product-reviews-v2-controller.php
new file mode 100644
index 00000000000..5eb6ca0ab07
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-product-reviews-v2-controller.php
@@ -0,0 +1,199 @@
+/reviews.
+ *
+ * @package WooCommerce/API
+ * @since 2.6.0
+ */
+
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * REST API Product Reviews Controller Class.
+ *
+ * @package WooCommerce/API
+ * @extends WC_REST_Product_Reviews_V1_Controller
+ */
+class WC_REST_Product_Reviews_V2_Controller extends WC_REST_Product_Reviews_V1_Controller {
+
+ /**
+ * Endpoint namespace.
+ *
+ * @var string
+ */
+ protected $namespace = 'wc/v2';
+
+ /**
+ * Route base.
+ *
+ * @var string
+ */
+ protected $rest_base = 'products/(?P[\d]+)/reviews';
+
+ /**
+ * Register the routes for product reviews.
+ */
+ public function register_routes() {
+ parent::register_routes();
+
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/batch', array(
+ 'args' => array(
+ 'product_id' => array(
+ 'description' => __( 'Unique identifier for the variable product.', 'woocommerce' ),
+ 'type' => 'integer',
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => array( $this, 'batch_items' ),
+ 'permission_callback' => array( $this, 'batch_items_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
+ ),
+ 'schema' => array( $this, 'get_public_batch_schema' ),
+ )
+ );
+ }
+
+ /**
+ * Check if a given request has access to batch manage product reviews.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|boolean
+ */
+ public function batch_items_permissions_check( $request ) {
+ if ( ! wc_rest_check_post_permissions( 'product', 'batch' ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you are not allowed to batch manipulate this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+ return true;
+ }
+
+ /**
+ * Prepare a single product review output for response.
+ *
+ * @param WP_Comment $review Product review object.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response Response data.
+ */
+ public function prepare_item_for_response( $review, $request ) {
+ $data = array(
+ 'id' => (int) $review->comment_ID,
+ 'date_created' => wc_rest_prepare_date_response( $review->comment_date ),
+ 'date_created_gmt' => wc_rest_prepare_date_response( $review->comment_date_gmt ),
+ 'review' => $review->comment_content,
+ 'rating' => (int) get_comment_meta( $review->comment_ID, 'rating', true ),
+ 'name' => $review->comment_author,
+ 'email' => $review->comment_author_email,
+ 'verified' => wc_review_is_from_verified_owner( $review->comment_ID ),
+ );
+
+ $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+
+ // Wrap the data in a response object.
+ $response = rest_ensure_response( $data );
+
+ $response->add_links( $this->prepare_links( $review, $request ) );
+
+ /**
+ * Filter product reviews object returned from the REST API.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param WP_Comment $review Product review object used to create response.
+ * @param WP_REST_Request $request Request object.
+ */
+ return apply_filters( 'woocommerce_rest_prepare_product_review', $response, $review, $request );
+ }
+
+
+ /**
+ * Bulk create, update and delete items.
+ *
+ * @since 3.0.0
+ * @param WP_REST_Request $request Full details about the request.
+ * @return array Of WP_Error or WP_REST_Response.
+ */
+ public function batch_items( $request ) {
+ $items = array_filter( $request->get_params() );
+ $params = $request->get_url_params();
+ $product_id = $params['product_id'];
+ $body_params = array();
+
+ foreach ( array( 'update', 'create', 'delete' ) as $batch_type ) {
+ if ( ! empty( $items[ $batch_type ] ) ) {
+ $injected_items = array();
+ foreach ( $items[ $batch_type ] as $item ) {
+ $injected_items[] = is_array( $item ) ? array_merge( array( 'product_id' => $product_id ), $item ) : $item;
+ }
+ $body_params[ $batch_type ] = $injected_items;
+ }
+ }
+
+ $request = new WP_REST_Request( $request->get_method() );
+ $request->set_body_params( $body_params );
+
+ return parent::batch_items( $request );
+ }
+
+ /**
+ * Get the Product Review's schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'product_review',
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'review' => array(
+ 'description' => __( 'The content of the review.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'date_created' => array(
+ 'description' => __( "The date the review was created, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'date_created_gmt' => array(
+ 'description' => __( 'The date the review was created, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'rating' => array(
+ 'description' => __( 'Review rating (0 to 5).', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'name' => array(
+ 'description' => __( 'Reviewer name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'email' => array(
+ 'description' => __( 'Reviewer email.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'verified' => array(
+ 'description' => __( 'Shows if the reviewer bought the product or not.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+}
diff --git a/includes/api/v2/class-wc-rest-product-shipping-classes-v2-controller.php b/includes/api/v2/class-wc-rest-product-shipping-classes-v2-controller.php
new file mode 100644
index 00000000000..1eeec0041df
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-product-shipping-classes-v2-controller.php
@@ -0,0 +1,27 @@
+/variations endpoints.
+ *
+ * @package WooCommerce\API
+ * @since 3.0.0
+ */
+
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * REST API variations controller class.
+ *
+ * @package WooCommerce/API
+ * @extends WC_REST_Products_V2_Controller
+ */
+class WC_REST_Product_Variations_V2_Controller extends WC_REST_Products_V2_Controller {
+
+ /**
+ * Endpoint namespace.
+ *
+ * @var string
+ */
+ protected $namespace = 'wc/v2';
+
+ /**
+ * Route base.
+ *
+ * @var string
+ */
+ protected $rest_base = 'products/(?P[\d]+)/variations';
+
+ /**
+ * Post type.
+ *
+ * @var string
+ */
+ protected $post_type = 'product_variation';
+
+ /**
+ * Initialize product actions (parent).
+ */
+ public function __construct() {
+ add_filter( "woocommerce_rest_{$this->post_type}_query", array( $this, 'add_product_id' ), 9, 2 );
+ parent::__construct();
+ }
+
+ /**
+ * Register the routes for products.
+ */
+ public function register_routes() {
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base, array(
+ 'args' => array(
+ 'product_id' => array(
+ 'description' => __( 'Unique identifier for the variable product.', 'woocommerce' ),
+ 'type' => 'integer',
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_items' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ 'args' => $this->get_collection_params(),
+ ),
+ array(
+ 'methods' => WP_REST_Server::CREATABLE,
+ 'callback' => array( $this, 'create_item' ),
+ 'permission_callback' => array( $this, 'create_item_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array(
+ 'args' => array(
+ 'product_id' => array(
+ 'description' => __( 'Unique identifier for the variable product.', 'woocommerce' ),
+ 'type' => 'integer',
+ ),
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the variation.', 'woocommerce' ),
+ 'type' => 'integer',
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_item' ),
+ 'permission_callback' => array( $this, 'get_item_permissions_check' ),
+ 'args' => array(
+ 'context' => $this->get_context_param(
+ array(
+ 'default' => 'view',
+ )
+ ),
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => array( $this, 'update_item' ),
+ 'permission_callback' => array( $this, 'update_item_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::DELETABLE,
+ 'callback' => array( $this, 'delete_item' ),
+ 'permission_callback' => array( $this, 'delete_item_permissions_check' ),
+ 'args' => array(
+ 'force' => array(
+ 'default' => false,
+ 'type' => 'boolean',
+ 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ),
+ ),
+ ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/batch', array(
+ 'args' => array(
+ 'product_id' => array(
+ 'description' => __( 'Unique identifier for the variable product.', 'woocommerce' ),
+ 'type' => 'integer',
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => array( $this, 'batch_items' ),
+ 'permission_callback' => array( $this, 'batch_items_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
+ ),
+ 'schema' => array( $this, 'get_public_batch_schema' ),
+ )
+ );
+ }
+
+ /**
+ * Get object.
+ *
+ * @since 3.0.0
+ * @param int $id Object ID.
+ * @return WC_Data
+ */
+ protected function get_object( $id ) {
+ return wc_get_product( $id );
+ }
+
+ /**
+ * Check if a given request has access to update an item.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|boolean
+ */
+ public function update_item_permissions_check( $request ) {
+ $object = $this->get_object( (int) $request['id'] );
+
+ if ( $object && 0 !== $object->get_id() && ! wc_rest_check_post_permissions( $this->post_type, 'edit', $object->get_id() ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you are not allowed to edit this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+
+ // Check if variation belongs to the correct parent product.
+ if ( $object && 0 !== $object->get_parent_id() && absint( $request['product_id'] ) !== $object->get_parent_id() ) {
+ return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Parent product does not match current variation.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+
+ return true;
+ }
+
+ /**
+ * Prepare a single variation output for response.
+ *
+ * @since 3.0.0
+ * @param WC_Data $object Object data.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response
+ */
+ public function prepare_object_for_response( $object, $request ) {
+ $data = array(
+ 'id' => $object->get_id(),
+ 'date_created' => wc_rest_prepare_date_response( $object->get_date_created(), false ),
+ 'date_created_gmt' => wc_rest_prepare_date_response( $object->get_date_created() ),
+ 'date_modified' => wc_rest_prepare_date_response( $object->get_date_modified(), false ),
+ 'date_modified_gmt' => wc_rest_prepare_date_response( $object->get_date_modified() ),
+ 'description' => wc_format_content( $object->get_description() ),
+ 'permalink' => $object->get_permalink(),
+ 'sku' => $object->get_sku(),
+ 'price' => $object->get_price(),
+ 'regular_price' => $object->get_regular_price(),
+ 'sale_price' => $object->get_sale_price(),
+ 'date_on_sale_from' => wc_rest_prepare_date_response( $object->get_date_on_sale_from(), false ),
+ 'date_on_sale_from_gmt' => wc_rest_prepare_date_response( $object->get_date_on_sale_from() ),
+ 'date_on_sale_to' => wc_rest_prepare_date_response( $object->get_date_on_sale_to(), false ),
+ 'date_on_sale_to_gmt' => wc_rest_prepare_date_response( $object->get_date_on_sale_to() ),
+ 'on_sale' => $object->is_on_sale(),
+ 'visible' => $object->is_visible(),
+ 'purchasable' => $object->is_purchasable(),
+ 'virtual' => $object->is_virtual(),
+ 'downloadable' => $object->is_downloadable(),
+ 'downloads' => $this->get_downloads( $object ),
+ 'download_limit' => '' !== $object->get_download_limit() ? (int) $object->get_download_limit() : -1,
+ 'download_expiry' => '' !== $object->get_download_expiry() ? (int) $object->get_download_expiry() : -1,
+ 'tax_status' => $object->get_tax_status(),
+ 'tax_class' => $object->get_tax_class(),
+ 'manage_stock' => $object->managing_stock(),
+ 'stock_quantity' => $object->get_stock_quantity(),
+ 'in_stock' => $object->is_in_stock(),
+ 'backorders' => $object->get_backorders(),
+ 'backorders_allowed' => $object->backorders_allowed(),
+ 'backordered' => $object->is_on_backorder(),
+ 'weight' => $object->get_weight(),
+ 'dimensions' => array(
+ 'length' => $object->get_length(),
+ 'width' => $object->get_width(),
+ 'height' => $object->get_height(),
+ ),
+ 'shipping_class' => $object->get_shipping_class(),
+ 'shipping_class_id' => $object->get_shipping_class_id(),
+ 'image' => current( $this->get_images( $object ) ),
+ 'attributes' => $this->get_attributes( $object ),
+ 'menu_order' => $object->get_menu_order(),
+ 'meta_data' => $object->get_meta_data(),
+ );
+
+ $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+ $response = rest_ensure_response( $data );
+ $response->add_links( $this->prepare_links( $object, $request ) );
+
+ /**
+ * Filter the data for a response.
+ *
+ * The dynamic portion of the hook name, $this->post_type,
+ * refers to object type being prepared for the response.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param WC_Data $object Object data.
+ * @param WP_REST_Request $request Request object.
+ */
+ return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request );
+ }
+
+ /**
+ * Prepare objects query.
+ *
+ * @since 3.0.0
+ * @param WP_REST_Request $request Full details about the request.
+ * @return array
+ */
+ protected function prepare_objects_query( $request ) {
+ $args = parent::prepare_objects_query( $request );
+
+ $args['post_parent'] = $request['product_id'];
+
+ return $args;
+ }
+
+ /**
+ * Prepare a single variation for create or update.
+ *
+ * @param WP_REST_Request $request Request object.
+ * @param bool $creating If is creating a new object.
+ * @return WP_Error|WC_Data
+ */
+ protected function prepare_object_for_database( $request, $creating = false ) {
+ if ( isset( $request['id'] ) ) {
+ $variation = wc_get_product( absint( $request['id'] ) );
+ } else {
+ $variation = new WC_Product_Variation();
+ }
+
+ // Update parent ID just once.
+ if ( 0 === $variation->get_parent_id() ) {
+ $variation->set_parent_id( absint( $request['product_id'] ) );
+ }
+
+ // Status.
+ if ( isset( $request['visible'] ) ) {
+ $variation->set_status( false === $request['visible'] ? 'private' : 'publish' );
+ }
+
+ // SKU.
+ if ( isset( $request['sku'] ) ) {
+ $variation->set_sku( wc_clean( $request['sku'] ) );
+ }
+
+ // Thumbnail.
+ if ( isset( $request['image'] ) ) {
+ if ( is_array( $request['image'] ) && ! empty( $request['image'] ) ) {
+ $image = $request['image'];
+ if ( is_array( $image ) ) {
+ $image['position'] = 0;
+ }
+
+ $variation = $this->set_product_images( $variation, array( $image ) );
+ } else {
+ $variation->set_image_id( '' );
+ }
+ }
+
+ // Virtual variation.
+ if ( isset( $request['virtual'] ) ) {
+ $variation->set_virtual( $request['virtual'] );
+ }
+
+ // Downloadable variation.
+ if ( isset( $request['downloadable'] ) ) {
+ $variation->set_downloadable( $request['downloadable'] );
+ }
+
+ // Downloads.
+ if ( $variation->get_downloadable() ) {
+ // Downloadable files.
+ if ( isset( $request['downloads'] ) && is_array( $request['downloads'] ) ) {
+ $variation = $this->save_downloadable_files( $variation, $request['downloads'] );
+ }
+
+ // Download limit.
+ if ( isset( $request['download_limit'] ) ) {
+ $variation->set_download_limit( $request['download_limit'] );
+ }
+
+ // Download expiry.
+ if ( isset( $request['download_expiry'] ) ) {
+ $variation->set_download_expiry( $request['download_expiry'] );
+ }
+ }
+
+ // Shipping data.
+ $variation = $this->save_product_shipping_data( $variation, $request );
+
+ // Stock handling.
+ if ( isset( $request['manage_stock'] ) ) {
+ if ( 'parent' === $request['manage_stock'] ) {
+ $variation->set_manage_stock( false ); // This just indicates the variation does not manage stock, but the parent does.
+ } else {
+ $variation->set_manage_stock( wc_string_to_bool( $request['manage_stock'] ) );
+ }
+ }
+
+ if ( isset( $request['in_stock'] ) ) {
+ $variation->set_stock_status( true === $request['in_stock'] ? 'instock' : 'outofstock' );
+ }
+
+ if ( isset( $request['backorders'] ) ) {
+ $variation->set_backorders( $request['backorders'] );
+ }
+
+ if ( $variation->get_manage_stock() ) {
+ if ( isset( $request['stock_quantity'] ) ) {
+ $variation->set_stock_quantity( $request['stock_quantity'] );
+ } elseif ( isset( $request['inventory_delta'] ) ) {
+ $stock_quantity = wc_stock_amount( $variation->get_stock_quantity() );
+ $stock_quantity += wc_stock_amount( $request['inventory_delta'] );
+ $variation->set_stock_quantity( $stock_quantity );
+ }
+ } else {
+ $variation->set_backorders( 'no' );
+ $variation->set_stock_quantity( '' );
+ }
+
+ // Regular Price.
+ if ( isset( $request['regular_price'] ) ) {
+ $variation->set_regular_price( $request['regular_price'] );
+ }
+
+ // Sale Price.
+ if ( isset( $request['sale_price'] ) ) {
+ $variation->set_sale_price( $request['sale_price'] );
+ }
+
+ if ( isset( $request['date_on_sale_from'] ) ) {
+ $variation->set_date_on_sale_from( $request['date_on_sale_from'] );
+ }
+
+ if ( isset( $request['date_on_sale_from_gmt'] ) ) {
+ $variation->set_date_on_sale_from( $request['date_on_sale_from_gmt'] ? strtotime( $request['date_on_sale_from_gmt'] ) : null );
+ }
+
+ if ( isset( $request['date_on_sale_to'] ) ) {
+ $variation->set_date_on_sale_to( $request['date_on_sale_to'] );
+ }
+
+ if ( isset( $request['date_on_sale_to_gmt'] ) ) {
+ $variation->set_date_on_sale_to( $request['date_on_sale_to_gmt'] ? strtotime( $request['date_on_sale_to_gmt'] ) : null );
+ }
+
+ // Tax class.
+ if ( isset( $request['tax_class'] ) ) {
+ $variation->set_tax_class( $request['tax_class'] );
+ }
+
+ // Description.
+ if ( isset( $request['description'] ) ) {
+ $variation->set_description( wp_kses_post( $request['description'] ) );
+ }
+
+ // Update taxonomies.
+ if ( isset( $request['attributes'] ) ) {
+ $attributes = array();
+ $parent = wc_get_product( $variation->get_parent_id() );
+ $parent_attributes = $parent->get_attributes();
+
+ foreach ( $request['attributes'] as $attribute ) {
+ $attribute_id = 0;
+ $attribute_name = '';
+
+ // Check ID for global attributes or name for product attributes.
+ if ( ! empty( $attribute['id'] ) ) {
+ $attribute_id = absint( $attribute['id'] );
+ $raw_attribute_name = wc_attribute_taxonomy_name_by_id( $attribute_id );
+ } elseif ( ! empty( $attribute['name'] ) ) {
+ $raw_attribute_name = sanitize_title( $attribute['name'] );
+ }
+
+ if ( ! $attribute_id && ! $raw_attribute_name ) {
+ continue;
+ }
+
+ $attribute_name = sanitize_title( $raw_attribute_name );
+
+ if ( ! isset( $parent_attributes[ $attribute_name ] ) || ! $parent_attributes[ $attribute_name ]->get_variation() ) {
+ continue;
+ }
+
+ $attribute_key = sanitize_title( $parent_attributes[ $attribute_name ]->get_name() );
+ $attribute_value = isset( $attribute['option'] ) ? wc_clean( stripslashes( $attribute['option'] ) ) : '';
+
+ if ( $parent_attributes[ $attribute_name ]->is_taxonomy() ) {
+ // If dealing with a taxonomy, we need to get the slug from the name posted to the API.
+ $term = get_term_by( 'name', $attribute_value, $raw_attribute_name ); // @codingStandardsIgnoreLine
+
+ if ( $term && ! is_wp_error( $term ) ) {
+ $attribute_value = $term->slug;
+ } else {
+ $attribute_value = sanitize_title( $attribute_value );
+ }
+ }
+
+ $attributes[ $attribute_key ] = $attribute_value;
+ }
+
+ $variation->set_attributes( $attributes );
+ }
+
+ // Menu order.
+ if ( $request['menu_order'] ) {
+ $variation->set_menu_order( $request['menu_order'] );
+ }
+
+ // Meta data.
+ if ( is_array( $request['meta_data'] ) ) {
+ foreach ( $request['meta_data'] as $meta ) {
+ $variation->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' );
+ }
+ }
+
+ /**
+ * Filters an object before it is inserted via the REST API.
+ *
+ * The dynamic portion of the hook name, `$this->post_type`,
+ * refers to the object type slug.
+ *
+ * @param WC_Data $variation Object object.
+ * @param WP_REST_Request $request Request object.
+ * @param bool $creating If is creating a new object.
+ */
+ return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $variation, $request, $creating );
+ }
+
+ /**
+ * Clear caches here so in sync with any new variations.
+ *
+ * @param WC_Data $object Object data.
+ */
+ public function clear_transients( $object ) {
+ wc_delete_product_transients( $object->get_parent_id() );
+ wp_cache_delete( 'product-' . $object->get_parent_id(), 'products' );
+ }
+
+ /**
+ * Delete a variation.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ *
+ * @return bool|WP_Error|WP_REST_Response
+ */
+ public function delete_item( $request ) {
+ $force = (bool) $request['force'];
+ $object = $this->get_object( (int) $request['id'] );
+ $result = false;
+
+ if ( ! $object || 0 === $object->get_id() ) {
+ return new WP_Error(
+ "woocommerce_rest_{$this->post_type}_invalid_id", __( 'Invalid ID.', 'woocommerce' ), array(
+ 'status' => 404,
+ )
+ );
+ }
+
+ $supports_trash = EMPTY_TRASH_DAYS > 0 && is_callable( array( $object, 'get_status' ) );
+
+ /**
+ * Filter whether an object is trashable.
+ *
+ * Return false to disable trash support for the object.
+ *
+ * @param boolean $supports_trash Whether the object type support trashing.
+ * @param WC_Data $object The object being considered for trashing support.
+ */
+ $supports_trash = apply_filters( "woocommerce_rest_{$this->post_type}_object_trashable", $supports_trash, $object );
+
+ if ( ! wc_rest_check_post_permissions( $this->post_type, 'delete', $object->get_id() ) ) {
+ return new WP_Error(
+ /* translators: %s: post type */
+ "woocommerce_rest_user_cannot_delete_{$this->post_type}", sprintf( __( 'Sorry, you are not allowed to delete %s.', 'woocommerce' ), $this->post_type ), array(
+ 'status' => rest_authorization_required_code(),
+ )
+ );
+ }
+
+ $request->set_param( 'context', 'edit' );
+ $response = $this->prepare_object_for_response( $object, $request );
+
+ // If we're forcing, then delete permanently.
+ if ( $force ) {
+ $object->delete( true );
+ $result = 0 === $object->get_id();
+ } else {
+ // If we don't support trashing for this type, error out.
+ if ( ! $supports_trash ) {
+ return new WP_Error(
+ /* translators: %s: post type */
+ 'woocommerce_rest_trash_not_supported', sprintf( __( 'The %s does not support trashing.', 'woocommerce' ), $this->post_type ), array(
+ 'status' => 501,
+ )
+ );
+ }
+
+ // Otherwise, only trash if we haven't already.
+ if ( is_callable( array( $object, 'get_status' ) ) ) {
+ if ( 'trash' === $object->get_status() ) {
+ return new WP_Error(
+ /* translators: %s: post type */
+ 'woocommerce_rest_already_trashed', sprintf( __( 'The %s has already been deleted.', 'woocommerce' ), $this->post_type ), array(
+ 'status' => 410,
+ )
+ );
+ }
+
+ $object->delete();
+ $result = 'trash' === $object->get_status();
+ }
+ }
+
+ if ( ! $result ) {
+ return new WP_Error(
+ /* translators: %s: post type */
+ 'woocommerce_rest_cannot_delete', sprintf( __( 'The %s cannot be deleted.', 'woocommerce' ), $this->post_type ), array(
+ 'status' => 500,
+ )
+ );
+ }
+
+ // Delete parent product transients.
+ if ( 0 !== $object->get_parent_id() ) {
+ wc_delete_product_transients( $object->get_parent_id() );
+ }
+
+ /**
+ * Fires after a single object is deleted or trashed via the REST API.
+ *
+ * @param WC_Data $object The deleted or trashed object.
+ * @param WP_REST_Response $response The response data.
+ * @param WP_REST_Request $request The request sent to the API.
+ */
+ do_action( "woocommerce_rest_delete_{$this->post_type}_object", $object, $response, $request );
+
+ return $response;
+ }
+
+ /**
+ * Bulk create, update and delete items.
+ *
+ * @since 3.0.0
+ * @param WP_REST_Request $request Full details about the request.
+ * @return array Of WP_Error or WP_REST_Response.
+ */
+ public function batch_items( $request ) {
+ $items = array_filter( $request->get_params() );
+ $params = $request->get_url_params();
+ $product_id = $params['product_id'];
+ $body_params = array();
+
+ foreach ( array( 'update', 'create', 'delete' ) as $batch_type ) {
+ if ( ! empty( $items[ $batch_type ] ) ) {
+ $injected_items = array();
+ foreach ( $items[ $batch_type ] as $item ) {
+ $injected_items[] = is_array( $item ) ? array_merge(
+ array(
+ 'product_id' => $product_id,
+ ), $item
+ ) : $item;
+ }
+ $body_params[ $batch_type ] = $injected_items;
+ }
+ }
+
+ $request = new WP_REST_Request( $request->get_method() );
+ $request->set_body_params( $body_params );
+
+ return parent::batch_items( $request );
+ }
+
+ /**
+ * Prepare links for the request.
+ *
+ * @param WC_Data $object Object data.
+ * @param WP_REST_Request $request Request object.
+ * @return array Links for the given post.
+ */
+ protected function prepare_links( $object, $request ) {
+ $product_id = (int) $request['product_id'];
+ $base = str_replace( '(?P[\d]+)', $product_id, $this->rest_base );
+ $links = array(
+ 'self' => array(
+ 'href' => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $base, $object->get_id() ) ),
+ ),
+ 'collection' => array(
+ 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $base ) ),
+ ),
+ 'up' => array(
+ 'href' => rest_url( sprintf( '/%s/products/%d', $this->namespace, $product_id ) ),
+ ),
+ );
+ return $links;
+ }
+
+ /**
+ * Get the Variation's schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $weight_unit = get_option( 'woocommerce_weight_unit' );
+ $dimension_unit = get_option( 'woocommerce_dimension_unit' );
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => $this->post_type,
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_created' => array(
+ 'description' => __( "The date the variation was created, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_modified' => array(
+ 'description' => __( "The date the variation was last modified, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'description' => array(
+ 'description' => __( 'Variation description.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'permalink' => array(
+ 'description' => __( 'Variation URL.', 'woocommerce' ),
+ 'type' => 'string',
+ 'format' => 'uri',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'sku' => array(
+ 'description' => __( 'Unique identifier.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'price' => array(
+ 'description' => __( 'Current variation price.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'regular_price' => array(
+ 'description' => __( 'Variation regular price.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'sale_price' => array(
+ 'description' => __( 'Variation sale price.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'date_on_sale_from' => array(
+ 'description' => __( "Start date of sale price, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'date_on_sale_from_gmt' => array(
+ 'description' => __( 'Start date of sale price, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'date_on_sale_to' => array(
+ 'description' => __( "End date of sale price, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'date_on_sale_to_gmt' => array(
+ 'description' => __( 'End date of sale price, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'on_sale' => array(
+ 'description' => __( 'Shows if the variation is on sale.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'visible' => array(
+ 'description' => __( "Define if the variation is visible on the product's page.", 'woocommerce' ),
+ 'type' => 'boolean',
+ 'default' => true,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'purchasable' => array(
+ 'description' => __( 'Shows if the variation can be bought.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'virtual' => array(
+ 'description' => __( 'If the variation is virtual.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'default' => false,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'downloadable' => array(
+ 'description' => __( 'If the variation is downloadable.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'default' => false,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'downloads' => array(
+ 'description' => __( 'List of downloadable files.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'File ID.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'name' => array(
+ 'description' => __( 'File name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'file' => array(
+ 'description' => __( 'File URL.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ ),
+ 'download_limit' => array(
+ 'description' => __( 'Number of times downloadable files can be downloaded after purchase.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'default' => -1,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'download_expiry' => array(
+ 'description' => __( 'Number of days until access to downloadable files expires.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'default' => -1,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'tax_status' => array(
+ 'description' => __( 'Tax status.', 'woocommerce' ),
+ 'type' => 'string',
+ 'default' => 'taxable',
+ 'enum' => array( 'taxable', 'shipping', 'none' ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'tax_class' => array(
+ 'description' => __( 'Tax class.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'manage_stock' => array(
+ 'description' => __( 'Stock management at variation level.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'default' => false,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'stock_quantity' => array(
+ 'description' => __( 'Stock quantity.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'in_stock' => array(
+ 'description' => __( 'Controls whether or not the variation is listed as "in stock" or "out of stock" on the frontend.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'default' => true,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'backorders' => array(
+ 'description' => __( 'If managing stock, this controls if backorders are allowed.', 'woocommerce' ),
+ 'type' => 'string',
+ 'default' => 'no',
+ 'enum' => array( 'no', 'notify', 'yes' ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'backorders_allowed' => array(
+ 'description' => __( 'Shows if backorders are allowed.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'backordered' => array(
+ 'description' => __( 'Shows if the variation is on backordered.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'weight' => array(
+ /* translators: %s: weight unit */
+ 'description' => sprintf( __( 'Variation weight (%s).', 'woocommerce' ), $weight_unit ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'dimensions' => array(
+ 'description' => __( 'Variation dimensions.', 'woocommerce' ),
+ 'type' => 'object',
+ 'context' => array( 'view', 'edit' ),
+ 'properties' => array(
+ 'length' => array(
+ /* translators: %s: dimension unit */
+ 'description' => sprintf( __( 'Variation length (%s).', 'woocommerce' ), $dimension_unit ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'width' => array(
+ /* translators: %s: dimension unit */
+ 'description' => sprintf( __( 'Variation width (%s).', 'woocommerce' ), $dimension_unit ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'height' => array(
+ /* translators: %s: dimension unit */
+ 'description' => sprintf( __( 'Variation height (%s).', 'woocommerce' ), $dimension_unit ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ 'shipping_class' => array(
+ 'description' => __( 'Shipping class slug.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'shipping_class_id' => array(
+ 'description' => __( 'Shipping class ID.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'image' => array(
+ 'description' => __( 'Variation image data.', 'woocommerce' ),
+ 'type' => 'object',
+ 'context' => array( 'view', 'edit' ),
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Image ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'date_created' => array(
+ 'description' => __( "The date the image was created, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_created_gmt' => array(
+ 'description' => __( 'The date the image was created, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_modified' => array(
+ 'description' => __( "The date the image was last modified, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_modified_gmt' => array(
+ 'description' => __( 'The date the image was last modified, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'src' => array(
+ 'description' => __( 'Image URL.', 'woocommerce' ),
+ 'type' => 'string',
+ 'format' => 'uri',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'name' => array(
+ 'description' => __( 'Image name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'alt' => array(
+ 'description' => __( 'Image alternative text.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'position' => array(
+ 'description' => __( 'Image position. 0 means that the image is featured.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ 'attributes' => array(
+ 'description' => __( 'List of attributes.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Attribute ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'name' => array(
+ 'description' => __( 'Attribute name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'option' => array(
+ 'description' => __( 'Selected attribute term name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ ),
+ 'menu_order' => array(
+ 'description' => __( 'Menu order, used to custom sort products.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'meta_data' => array(
+ 'description' => __( 'Meta data.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Meta ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'key' => array(
+ 'description' => __( 'Meta key.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'value' => array(
+ 'description' => __( 'Meta value.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+}
diff --git a/includes/api/v2/class-wc-rest-products-v2-controller.php b/includes/api/v2/class-wc-rest-products-v2-controller.php
new file mode 100644
index 00000000000..0eb937627ec
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-products-v2-controller.php
@@ -0,0 +1,2177 @@
+post_type}_object", array( $this, 'clear_transients' ) );
+ }
+
+ /**
+ * Register the routes for products.
+ */
+ public function register_routes() {
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base, // @codingStandardsIgnoreLine.
+ array(
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_items' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ 'args' => $this->get_collection_params(),
+ ),
+ array(
+ 'methods' => WP_REST_Server::CREATABLE,
+ 'callback' => array( $this, 'create_item' ),
+ 'permission_callback' => array( $this, 'create_item_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', // @codingStandardsIgnoreLine.
+ array(
+ 'args' => array(
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
+ 'type' => 'integer',
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_item' ),
+ 'permission_callback' => array( $this, 'get_item_permissions_check' ),
+ 'args' => array(
+ 'context' => $this->get_context_param(
+ array(
+ 'default' => 'view',
+ )
+ ),
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => array( $this, 'update_item' ),
+ 'permission_callback' => array( $this, 'update_item_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::DELETABLE,
+ 'callback' => array( $this, 'delete_item' ),
+ 'permission_callback' => array( $this, 'delete_item_permissions_check' ),
+ 'args' => array(
+ 'force' => array(
+ 'default' => false,
+ 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ),
+ 'type' => 'boolean',
+ ),
+ ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/batch', // @codingStandardsIgnoreLine.
+ array(
+ array(
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => array( $this, 'batch_items' ),
+ 'permission_callback' => array( $this, 'batch_items_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
+ ),
+ 'schema' => array( $this, 'get_public_batch_schema' ),
+ )
+ );
+ }
+
+ /**
+ * Get object.
+ *
+ * @param int $id Object ID.
+ *
+ * @since 3.0.0
+ * @return WC_Data
+ */
+ protected function get_object( $id ) {
+ return wc_get_product( $id );
+ }
+
+ /**
+ * Prepare a single product output for response.
+ *
+ * @param WC_Data $object Object data.
+ * @param WP_REST_Request $request Request object.
+ *
+ * @since 3.0.0
+ * @return WP_REST_Response
+ */
+ public function prepare_object_for_response( $object, $request ) {
+ $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+ $data = $this->get_product_data( $object, $context );
+
+ // Add variations to variable products.
+ if ( $object->is_type( 'variable' ) && $object->has_child() ) {
+ $data['variations'] = $object->get_children();
+ }
+
+ // Add grouped products data.
+ if ( $object->is_type( 'grouped' ) && $object->has_child() ) {
+ $data['grouped_products'] = $object->get_children();
+ }
+
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+ $response = rest_ensure_response( $data );
+ $response->add_links( $this->prepare_links( $object, $request ) );
+
+ /**
+ * Filter the data for a response.
+ *
+ * The dynamic portion of the hook name, $this->post_type,
+ * refers to object type being prepared for the response.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param WC_Data $object Object data.
+ * @param WP_REST_Request $request Request object.
+ */
+ return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request );
+ }
+
+ /**
+ * Prepare objects query.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ *
+ * @since 3.0.0
+ * @return array
+ */
+ protected function prepare_objects_query( $request ) {
+ $args = parent::prepare_objects_query( $request );
+
+ // Set post_status.
+ $args['post_status'] = $request['status'];
+
+ // Taxonomy query to filter products by type, category,
+ // tag, shipping class, and attribute.
+ $tax_query = array();
+
+ // Map between taxonomy name and arg's key.
+ $taxonomies = array(
+ 'product_cat' => 'category',
+ 'product_tag' => 'tag',
+ 'product_shipping_class' => 'shipping_class',
+ );
+
+ // Set tax_query for each passed arg.
+ foreach ( $taxonomies as $taxonomy => $key ) {
+ if ( ! empty( $request[ $key ] ) ) {
+ $tax_query[] = array(
+ 'taxonomy' => $taxonomy,
+ 'field' => 'term_id',
+ 'terms' => $request[ $key ],
+ );
+ }
+ }
+
+ // Filter product type by slug.
+ if ( ! empty( $request['type'] ) ) {
+ $tax_query[] = array(
+ 'taxonomy' => 'product_type',
+ 'field' => 'slug',
+ 'terms' => $request['type'],
+ );
+ }
+
+ // Filter by attribute and term.
+ if ( ! empty( $request['attribute'] ) && ! empty( $request['attribute_term'] ) ) {
+ if ( in_array( $request['attribute'], wc_get_attribute_taxonomy_names(), true ) ) {
+ $tax_query[] = array(
+ 'taxonomy' => $request['attribute'],
+ 'field' => 'term_id',
+ 'terms' => $request['attribute_term'],
+ );
+ }
+ }
+
+ if ( ! empty( $tax_query ) ) {
+ $args['tax_query'] = $tax_query; // WPCS: slow query ok.
+ }
+
+ // Filter featured.
+ if ( is_bool( $request['featured'] ) ) {
+ $args['tax_query'][] = array(
+ 'taxonomy' => 'product_visibility',
+ 'field' => 'name',
+ 'terms' => 'featured',
+ 'operator' => true === $request['featured'] ? 'IN' : 'NOT IN',
+ );
+ }
+
+ // Filter by sku.
+ if ( ! empty( $request['sku'] ) ) {
+ $skus = explode( ',', $request['sku'] );
+ // Include the current string as a SKU too.
+ if ( 1 < count( $skus ) ) {
+ $skus[] = $request['sku'];
+ }
+
+ $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok.
+ $args, array(
+ 'key' => '_sku',
+ 'value' => $skus,
+ 'compare' => 'IN',
+ )
+ );
+ }
+
+ // Filter by tax class.
+ if ( ! empty( $request['tax_class'] ) ) {
+ $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok.
+ $args, array(
+ 'key' => '_tax_class',
+ 'value' => 'standard' !== $request['tax_class'] ? $request['tax_class'] : '',
+ )
+ );
+ }
+
+ // Price filter.
+ if ( ! empty( $request['min_price'] ) || ! empty( $request['max_price'] ) ) {
+ $args['meta_query'] = $this->add_meta_query( $args, wc_get_min_max_price_meta_query( $request ) ); // WPCS: slow query ok.
+ }
+
+ // Filter product in stock or out of stock.
+ if ( is_bool( $request['in_stock'] ) ) {
+ $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok.
+ $args, array(
+ 'key' => '_stock_status',
+ 'value' => true === $request['in_stock'] ? 'instock' : 'outofstock',
+ )
+ );
+ }
+
+ // Filter by on sale products.
+ if ( is_bool( $request['on_sale'] ) ) {
+ $on_sale_key = $request['on_sale'] ? 'post__in' : 'post__not_in';
+ $on_sale_ids = wc_get_product_ids_on_sale();
+
+ // Use 0 when there's no on sale products to avoid return all products.
+ $on_sale_ids = empty( $on_sale_ids ) ? array( 0 ) : $on_sale_ids;
+
+ $args[ $on_sale_key ] += $on_sale_ids;
+ }
+
+ // Force the post_type argument, since it's not a user input variable.
+ if ( ! empty( $request['sku'] ) ) {
+ $args['post_type'] = array( 'product', 'product_variation' );
+ } else {
+ $args['post_type'] = $this->post_type;
+ }
+
+ return $args;
+ }
+
+ /**
+ * Get the downloads for a product or product variation.
+ *
+ * @param WC_Product|WC_Product_Variation $product Product instance.
+ *
+ * @return array
+ */
+ protected function get_downloads( $product ) {
+ $downloads = array();
+
+ if ( $product->is_downloadable() ) {
+ foreach ( $product->get_downloads() as $file_id => $file ) {
+ $downloads[] = array(
+ 'id' => $file_id, // MD5 hash.
+ 'name' => $file['name'],
+ 'file' => $file['file'],
+ );
+ }
+ }
+
+ return $downloads;
+ }
+
+ /**
+ * Get taxonomy terms.
+ *
+ * @param WC_Product $product Product instance.
+ * @param string $taxonomy Taxonomy slug.
+ *
+ * @return array
+ */
+ protected function get_taxonomy_terms( $product, $taxonomy = 'cat' ) {
+ $terms = array();
+
+ foreach ( wc_get_object_terms( $product->get_id(), 'product_' . $taxonomy ) as $term ) {
+ $terms[] = array(
+ 'id' => $term->term_id,
+ 'name' => $term->name,
+ 'slug' => $term->slug,
+ );
+ }
+
+ return $terms;
+ }
+
+ /**
+ * Get the images for a product or product variation.
+ *
+ * @param WC_Product|WC_Product_Variation $product Product instance.
+ *
+ * @return array
+ */
+ protected function get_images( $product ) {
+ $images = array();
+ $attachment_ids = array();
+
+ // Add featured image.
+ if ( $product->get_image_id() ) {
+ $attachment_ids[] = $product->get_image_id();
+ }
+
+ // Add gallery images.
+ $attachment_ids = array_merge( $attachment_ids, $product->get_gallery_image_ids() );
+
+ // Build image data.
+ foreach ( $attachment_ids as $position => $attachment_id ) {
+ $attachment_post = get_post( $attachment_id );
+ if ( is_null( $attachment_post ) ) {
+ continue;
+ }
+
+ $attachment = wp_get_attachment_image_src( $attachment_id, 'full' );
+ if ( ! is_array( $attachment ) ) {
+ continue;
+ }
+
+ $images[] = array(
+ 'id' => (int) $attachment_id,
+ 'date_created' => wc_rest_prepare_date_response( $attachment_post->post_date, false ),
+ 'date_created_gmt' => wc_rest_prepare_date_response( strtotime( $attachment_post->post_date_gmt ) ),
+ 'date_modified' => wc_rest_prepare_date_response( $attachment_post->post_modified, false ),
+ 'date_modified_gmt' => wc_rest_prepare_date_response( strtotime( $attachment_post->post_modified_gmt ) ),
+ 'src' => current( $attachment ),
+ 'name' => get_the_title( $attachment_id ),
+ 'alt' => get_post_meta( $attachment_id, '_wp_attachment_image_alt', true ),
+ 'position' => (int) $position,
+ );
+ }
+
+ // Set a placeholder image if the product has no images set.
+ if ( empty( $images ) ) {
+ $images[] = array(
+ 'id' => 0,
+ 'date_created' => wc_rest_prepare_date_response( current_time( 'mysql' ), false ), // Default to now.
+ 'date_created_gmt' => wc_rest_prepare_date_response( current_time( 'timestamp', true ) ), // Default to now.
+ 'date_modified' => wc_rest_prepare_date_response( current_time( 'mysql' ), false ),
+ 'date_modified_gmt' => wc_rest_prepare_date_response( current_time( 'timestamp', true ) ),
+ 'src' => wc_placeholder_img_src(),
+ 'name' => __( 'Placeholder', 'woocommerce' ),
+ 'alt' => __( 'Placeholder', 'woocommerce' ),
+ 'position' => 0,
+ );
+ }
+
+ return $images;
+ }
+
+ /**
+ * Get attribute taxonomy label.
+ *
+ * @param string $name Taxonomy name.
+ *
+ * @deprecated 3.0.0
+ * @return string
+ */
+ protected function get_attribute_taxonomy_label( $name ) {
+ $tax = get_taxonomy( $name );
+ $labels = get_taxonomy_labels( $tax );
+
+ return $labels->singular_name;
+ }
+
+ /**
+ * Get product attribute taxonomy name.
+ *
+ * @param string $slug Taxonomy name.
+ * @param WC_Product $product Product data.
+ *
+ * @since 3.0.0
+ * @return string
+ */
+ protected function get_attribute_taxonomy_name( $slug, $product ) {
+ $attributes = $product->get_attributes();
+
+ if ( ! isset( $attributes[ $slug ] ) ) {
+ return str_replace( 'pa_', '', $slug );
+ }
+
+ $attribute = $attributes[ $slug ];
+
+ // Taxonomy attribute name.
+ if ( $attribute->is_taxonomy() ) {
+ $taxonomy = $attribute->get_taxonomy_object();
+ return $taxonomy->attribute_label;
+ }
+
+ // Custom product attribute name.
+ return $attribute->get_name();
+ }
+
+ /**
+ * Get default attributes.
+ *
+ * @param WC_Product $product Product instance.
+ *
+ * @return array
+ */
+ protected function get_default_attributes( $product ) {
+ $default = array();
+
+ if ( $product->is_type( 'variable' ) ) {
+ foreach ( array_filter( (array) $product->get_default_attributes(), 'strlen' ) as $key => $value ) {
+ if ( 0 === strpos( $key, 'pa_' ) ) {
+ $default[] = array(
+ 'id' => wc_attribute_taxonomy_id_by_name( $key ),
+ 'name' => $this->get_attribute_taxonomy_name( $key, $product ),
+ 'option' => $value,
+ );
+ } else {
+ $default[] = array(
+ 'id' => 0,
+ 'name' => $this->get_attribute_taxonomy_name( $key, $product ),
+ 'option' => $value,
+ );
+ }
+ }
+ }
+
+ return $default;
+ }
+
+ /**
+ * Get attribute options.
+ *
+ * @param int $product_id Product ID.
+ * @param array $attribute Attribute data.
+ *
+ * @return array
+ */
+ protected function get_attribute_options( $product_id, $attribute ) {
+ if ( isset( $attribute['is_taxonomy'] ) && $attribute['is_taxonomy'] ) {
+ return wc_get_product_terms(
+ $product_id, $attribute['name'], array(
+ 'fields' => 'names',
+ )
+ );
+ } elseif ( isset( $attribute['value'] ) ) {
+ return array_map( 'trim', explode( '|', $attribute['value'] ) );
+ }
+
+ return array();
+ }
+
+ /**
+ * Get the attributes for a product or product variation.
+ *
+ * @param WC_Product|WC_Product_Variation $product Product instance.
+ *
+ * @return array
+ */
+ protected function get_attributes( $product ) {
+ $attributes = array();
+
+ if ( $product->is_type( 'variation' ) ) {
+ $_product = wc_get_product( $product->get_parent_id() );
+ foreach ( $product->get_variation_attributes() as $attribute_name => $attribute ) {
+ $name = str_replace( 'attribute_', '', $attribute_name );
+
+ if ( empty( $attribute ) && '0' !== $attribute ) {
+ continue;
+ }
+
+ // Taxonomy-based attributes are prefixed with `pa_`, otherwise simply `attribute_`.
+ if ( 0 === strpos( $attribute_name, 'attribute_pa_' ) ) {
+ $option_term = get_term_by( 'slug', $attribute, $name );
+ $attributes[] = array(
+ 'id' => wc_attribute_taxonomy_id_by_name( $name ),
+ 'name' => $this->get_attribute_taxonomy_name( $name, $_product ),
+ 'option' => $option_term && ! is_wp_error( $option_term ) ? $option_term->name : $attribute,
+ );
+ } else {
+ $attributes[] = array(
+ 'id' => 0,
+ 'name' => $this->get_attribute_taxonomy_name( $name, $_product ),
+ 'option' => $attribute,
+ );
+ }
+ }
+ } else {
+ foreach ( $product->get_attributes() as $attribute ) {
+ $attributes[] = array(
+ 'id' => $attribute['is_taxonomy'] ? wc_attribute_taxonomy_id_by_name( $attribute['name'] ) : 0,
+ 'name' => $this->get_attribute_taxonomy_name( $attribute['name'], $product ),
+ 'position' => (int) $attribute['position'],
+ 'visible' => (bool) $attribute['is_visible'],
+ 'variation' => (bool) $attribute['is_variation'],
+ 'options' => $this->get_attribute_options( $product->get_id(), $attribute ),
+ );
+ }
+ }
+
+ return $attributes;
+ }
+
+ /**
+ * Get product data.
+ *
+ * @param WC_Product $product Product instance.
+ * @param string $context Request context.
+ * Options: 'view' and 'edit'.
+ *
+ * @return array
+ */
+ protected function get_product_data( $product, $context = 'view' ) {
+ $data = array(
+ 'id' => $product->get_id(),
+ 'name' => $product->get_name( $context ),
+ 'slug' => $product->get_slug( $context ),
+ 'permalink' => $product->get_permalink(),
+ 'date_created' => wc_rest_prepare_date_response( $product->get_date_created( $context ), false ),
+ 'date_created_gmt' => wc_rest_prepare_date_response( $product->get_date_created( $context ) ),
+ 'date_modified' => wc_rest_prepare_date_response( $product->get_date_modified( $context ), false ),
+ 'date_modified_gmt' => wc_rest_prepare_date_response( $product->get_date_modified( $context ) ),
+ 'type' => $product->get_type(),
+ 'status' => $product->get_status( $context ),
+ 'featured' => $product->is_featured(),
+ 'catalog_visibility' => $product->get_catalog_visibility( $context ),
+ 'description' => 'view' === $context ? wpautop( do_shortcode( $product->get_description() ) ) : $product->get_description( $context ),
+ 'short_description' => 'view' === $context ? apply_filters( 'woocommerce_short_description', $product->get_short_description() ) : $product->get_short_description( $context ),
+ 'sku' => $product->get_sku( $context ),
+ 'price' => $product->get_price( $context ),
+ 'regular_price' => $product->get_regular_price( $context ),
+ 'sale_price' => $product->get_sale_price( $context ) ? $product->get_sale_price( $context ) : '',
+ 'date_on_sale_from' => wc_rest_prepare_date_response( $product->get_date_on_sale_from( $context ), false ),
+ 'date_on_sale_from_gmt' => wc_rest_prepare_date_response( $product->get_date_on_sale_from( $context ) ),
+ 'date_on_sale_to' => wc_rest_prepare_date_response( $product->get_date_on_sale_to( $context ), false ),
+ 'date_on_sale_to_gmt' => wc_rest_prepare_date_response( $product->get_date_on_sale_to( $context ) ),
+ 'price_html' => $product->get_price_html(),
+ 'on_sale' => $product->is_on_sale( $context ),
+ 'purchasable' => $product->is_purchasable(),
+ 'total_sales' => $product->get_total_sales( $context ),
+ 'virtual' => $product->is_virtual(),
+ 'downloadable' => $product->is_downloadable(),
+ 'downloads' => $this->get_downloads( $product ),
+ 'download_limit' => $product->get_download_limit( $context ),
+ 'download_expiry' => $product->get_download_expiry( $context ),
+ 'external_url' => $product->is_type( 'external' ) ? $product->get_product_url( $context ) : '',
+ 'button_text' => $product->is_type( 'external' ) ? $product->get_button_text( $context ) : '',
+ 'tax_status' => $product->get_tax_status( $context ),
+ 'tax_class' => $product->get_tax_class( $context ),
+ 'manage_stock' => $product->managing_stock(),
+ 'stock_quantity' => $product->get_stock_quantity( $context ),
+ 'in_stock' => $product->is_in_stock(),
+ 'backorders' => $product->get_backorders( $context ),
+ 'backorders_allowed' => $product->backorders_allowed(),
+ 'backordered' => $product->is_on_backorder(),
+ 'sold_individually' => $product->is_sold_individually(),
+ 'weight' => $product->get_weight( $context ),
+ 'dimensions' => array(
+ 'length' => $product->get_length( $context ),
+ 'width' => $product->get_width( $context ),
+ 'height' => $product->get_height( $context ),
+ ),
+ 'shipping_required' => $product->needs_shipping(),
+ 'shipping_taxable' => $product->is_shipping_taxable(),
+ 'shipping_class' => $product->get_shipping_class(),
+ 'shipping_class_id' => $product->get_shipping_class_id( $context ),
+ 'reviews_allowed' => $product->get_reviews_allowed( $context ),
+ 'average_rating' => 'view' === $context ? wc_format_decimal( $product->get_average_rating(), 2 ) : $product->get_average_rating( $context ),
+ 'rating_count' => $product->get_rating_count(),
+ 'related_ids' => array_map( 'absint', array_values( wc_get_related_products( $product->get_id() ) ) ),
+ 'upsell_ids' => array_map( 'absint', $product->get_upsell_ids( $context ) ),
+ 'cross_sell_ids' => array_map( 'absint', $product->get_cross_sell_ids( $context ) ),
+ 'parent_id' => $product->get_parent_id( $context ),
+ 'purchase_note' => 'view' === $context ? wpautop( do_shortcode( wp_kses_post( $product->get_purchase_note() ) ) ) : $product->get_purchase_note( $context ),
+ 'categories' => $this->get_taxonomy_terms( $product ),
+ 'tags' => $this->get_taxonomy_terms( $product, 'tag' ),
+ 'images' => $this->get_images( $product ),
+ 'attributes' => $this->get_attributes( $product ),
+ 'default_attributes' => $this->get_default_attributes( $product ),
+ 'variations' => array(),
+ 'grouped_products' => array(),
+ 'menu_order' => $product->get_menu_order( $context ),
+ 'meta_data' => $product->get_meta_data(),
+ );
+
+ return $data;
+ }
+
+ /**
+ * Prepare links for the request.
+ *
+ * @param WC_Data $object Object data.
+ * @param WP_REST_Request $request Request object.
+ *
+ * @return array Links for the given post.
+ */
+ protected function prepare_links( $object, $request ) {
+ $links = array(
+ 'self' => array(
+ 'href' => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $object->get_id() ) ), // @codingStandardsIgnoreLine.
+ ),
+ 'collection' => array(
+ 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ), // @codingStandardsIgnoreLine.
+ ),
+ );
+
+ if ( $object->get_parent_id() ) {
+ $links['up'] = array(
+ 'href' => rest_url( sprintf( '/%s/products/%d', $this->namespace, $object->get_parent_id() ) ), // @codingStandardsIgnoreLine.
+ );
+ }
+
+ return $links;
+ }
+
+ /**
+ * Prepare a single product for create or update.
+ *
+ * @param WP_REST_Request $request Request object.
+ * @param bool $creating If is creating a new object.
+ *
+ * @return WP_Error|WC_Data
+ */
+ protected function prepare_object_for_database( $request, $creating = false ) {
+ $id = isset( $request['id'] ) ? absint( $request['id'] ) : 0;
+
+ // Type is the most important part here because we need to be using the correct class and methods.
+ if ( isset( $request['type'] ) ) {
+ $classname = WC_Product_Factory::get_classname_from_product_type( $request['type'] );
+
+ if ( ! class_exists( $classname ) ) {
+ $classname = 'WC_Product_Simple';
+ }
+
+ $product = new $classname( $id );
+ } elseif ( isset( $request['id'] ) ) {
+ $product = wc_get_product( $id );
+ } else {
+ $product = new WC_Product_Simple();
+ }
+
+ if ( 'variation' === $product->get_type() ) {
+ return new WP_Error(
+ "woocommerce_rest_invalid_{$this->post_type}_id", __( 'To manipulate product variations you should use the /products/<product_id>/variations/<id> endpoint.', 'woocommerce' ), array(
+ 'status' => 404,
+ )
+ );
+ }
+
+ // Post title.
+ if ( isset( $request['name'] ) ) {
+ $product->set_name( wp_filter_post_kses( $request['name'] ) );
+ }
+
+ // Post content.
+ if ( isset( $request['description'] ) ) {
+ $product->set_description( wp_filter_post_kses( $request['description'] ) );
+ }
+
+ // Post excerpt.
+ if ( isset( $request['short_description'] ) ) {
+ $product->set_short_description( wp_filter_post_kses( $request['short_description'] ) );
+ }
+
+ // Post status.
+ if ( isset( $request['status'] ) ) {
+ $product->set_status( get_post_status_object( $request['status'] ) ? $request['status'] : 'draft' );
+ }
+
+ // Post slug.
+ if ( isset( $request['slug'] ) ) {
+ $product->set_slug( $request['slug'] );
+ }
+
+ // Menu order.
+ if ( isset( $request['menu_order'] ) ) {
+ $product->set_menu_order( $request['menu_order'] );
+ }
+
+ // Comment status.
+ if ( isset( $request['reviews_allowed'] ) ) {
+ $product->set_reviews_allowed( $request['reviews_allowed'] );
+ }
+
+ // Virtual.
+ if ( isset( $request['virtual'] ) ) {
+ $product->set_virtual( $request['virtual'] );
+ }
+
+ // Tax status.
+ if ( isset( $request['tax_status'] ) ) {
+ $product->set_tax_status( $request['tax_status'] );
+ }
+
+ // Tax Class.
+ if ( isset( $request['tax_class'] ) ) {
+ $product->set_tax_class( $request['tax_class'] );
+ }
+
+ // Catalog Visibility.
+ if ( isset( $request['catalog_visibility'] ) ) {
+ $product->set_catalog_visibility( $request['catalog_visibility'] );
+ }
+
+ // Purchase Note.
+ if ( isset( $request['purchase_note'] ) ) {
+ $product->set_purchase_note( wp_kses_post( wp_unslash( $request['purchase_note'] ) ) );
+ }
+
+ // Featured Product.
+ if ( isset( $request['featured'] ) ) {
+ $product->set_featured( $request['featured'] );
+ }
+
+ // Shipping data.
+ $product = $this->save_product_shipping_data( $product, $request );
+
+ // SKU.
+ if ( isset( $request['sku'] ) ) {
+ $product->set_sku( wc_clean( $request['sku'] ) );
+ }
+
+ // Attributes.
+ if ( isset( $request['attributes'] ) ) {
+ $attributes = array();
+
+ foreach ( $request['attributes'] as $attribute ) {
+ $attribute_id = 0;
+ $attribute_name = '';
+
+ // Check ID for global attributes or name for product attributes.
+ if ( ! empty( $attribute['id'] ) ) {
+ $attribute_id = absint( $attribute['id'] );
+ $attribute_name = wc_attribute_taxonomy_name_by_id( $attribute_id );
+ } elseif ( ! empty( $attribute['name'] ) ) {
+ $attribute_name = wc_clean( $attribute['name'] );
+ }
+
+ if ( ! $attribute_id && ! $attribute_name ) {
+ continue;
+ }
+
+ if ( $attribute_id ) {
+
+ if ( isset( $attribute['options'] ) ) {
+ $options = $attribute['options'];
+
+ if ( ! is_array( $attribute['options'] ) ) {
+ // Text based attributes - Posted values are term names.
+ $options = explode( WC_DELIMITER, $options );
+ }
+
+ $values = array_map( 'wc_sanitize_term_text_based', $options );
+ $values = array_filter( $values, 'strlen' );
+ } else {
+ $values = array();
+ }
+
+ if ( ! empty( $values ) ) {
+ // Add attribute to array, but don't set values.
+ $attribute_object = new WC_Product_Attribute();
+ $attribute_object->set_id( $attribute_id );
+ $attribute_object->set_name( $attribute_name );
+ $attribute_object->set_options( $values );
+ $attribute_object->set_position( isset( $attribute['position'] ) ? (string) absint( $attribute['position'] ) : '0' );
+ $attribute_object->set_visible( ( isset( $attribute['visible'] ) && $attribute['visible'] ) ? 1 : 0 );
+ $attribute_object->set_variation( ( isset( $attribute['variation'] ) && $attribute['variation'] ) ? 1 : 0 );
+ $attributes[] = $attribute_object;
+ }
+ } elseif ( isset( $attribute['options'] ) ) {
+ // Custom attribute - Add attribute to array and set the values.
+ if ( is_array( $attribute['options'] ) ) {
+ $values = $attribute['options'];
+ } else {
+ $values = explode( WC_DELIMITER, $attribute['options'] );
+ }
+ $attribute_object = new WC_Product_Attribute();
+ $attribute_object->set_name( $attribute_name );
+ $attribute_object->set_options( $values );
+ $attribute_object->set_position( isset( $attribute['position'] ) ? (string) absint( $attribute['position'] ) : '0' );
+ $attribute_object->set_visible( ( isset( $attribute['visible'] ) && $attribute['visible'] ) ? 1 : 0 );
+ $attribute_object->set_variation( ( isset( $attribute['variation'] ) && $attribute['variation'] ) ? 1 : 0 );
+ $attributes[] = $attribute_object;
+ }
+ }
+ $product->set_attributes( $attributes );
+ }
+
+ // Sales and prices.
+ if ( in_array( $product->get_type(), array( 'variable', 'grouped' ), true ) ) {
+ $product->set_regular_price( '' );
+ $product->set_sale_price( '' );
+ $product->set_date_on_sale_to( '' );
+ $product->set_date_on_sale_from( '' );
+ $product->set_price( '' );
+ } else {
+ // Regular Price.
+ if ( isset( $request['regular_price'] ) ) {
+ $product->set_regular_price( $request['regular_price'] );
+ }
+
+ // Sale Price.
+ if ( isset( $request['sale_price'] ) ) {
+ $product->set_sale_price( $request['sale_price'] );
+ }
+
+ if ( isset( $request['date_on_sale_from'] ) ) {
+ $product->set_date_on_sale_from( $request['date_on_sale_from'] );
+ }
+
+ if ( isset( $request['date_on_sale_from_gmt'] ) ) {
+ $product->set_date_on_sale_from( $request['date_on_sale_from_gmt'] ? strtotime( $request['date_on_sale_from_gmt'] ) : null );
+ }
+
+ if ( isset( $request['date_on_sale_to'] ) ) {
+ $product->set_date_on_sale_to( $request['date_on_sale_to'] );
+ }
+
+ if ( isset( $request['date_on_sale_to_gmt'] ) ) {
+ $product->set_date_on_sale_to( $request['date_on_sale_to_gmt'] ? strtotime( $request['date_on_sale_to_gmt'] ) : null );
+ }
+ }
+
+ // Product parent ID.
+ if ( isset( $request['parent_id'] ) ) {
+ $product->set_parent_id( $request['parent_id'] );
+ }
+
+ // Sold individually.
+ if ( isset( $request['sold_individually'] ) ) {
+ $product->set_sold_individually( $request['sold_individually'] );
+ }
+
+ // Stock status.
+ if ( isset( $request['in_stock'] ) ) {
+ $stock_status = true === $request['in_stock'] ? 'instock' : 'outofstock';
+ } else {
+ $stock_status = $product->get_stock_status();
+ }
+
+ // Stock data.
+ if ( 'yes' === get_option( 'woocommerce_manage_stock' ) ) {
+ // Manage stock.
+ if ( isset( $request['manage_stock'] ) ) {
+ $product->set_manage_stock( $request['manage_stock'] );
+ }
+
+ // Backorders.
+ if ( isset( $request['backorders'] ) ) {
+ $product->set_backorders( $request['backorders'] );
+ }
+
+ if ( $product->is_type( 'grouped' ) ) {
+ $product->set_manage_stock( 'no' );
+ $product->set_backorders( 'no' );
+ $product->set_stock_quantity( '' );
+ $product->set_stock_status( $stock_status );
+ } elseif ( $product->is_type( 'external' ) ) {
+ $product->set_manage_stock( 'no' );
+ $product->set_backorders( 'no' );
+ $product->set_stock_quantity( '' );
+ $product->set_stock_status( 'instock' );
+ } elseif ( $product->get_manage_stock() ) {
+ // Stock status is always determined by children so sync later.
+ if ( ! $product->is_type( 'variable' ) ) {
+ $product->set_stock_status( $stock_status );
+ }
+
+ // Stock quantity.
+ if ( isset( $request['stock_quantity'] ) ) {
+ $product->set_stock_quantity( wc_stock_amount( $request['stock_quantity'] ) );
+ } elseif ( isset( $request['inventory_delta'] ) ) {
+ $stock_quantity = wc_stock_amount( $product->get_stock_quantity() );
+ $stock_quantity += wc_stock_amount( $request['inventory_delta'] );
+ $product->set_stock_quantity( wc_stock_amount( $stock_quantity ) );
+ }
+ } else {
+ // Don't manage stock.
+ $product->set_manage_stock( 'no' );
+ $product->set_stock_quantity( '' );
+ $product->set_stock_status( $stock_status );
+ }
+ } elseif ( ! $product->is_type( 'variable' ) ) {
+ $product->set_stock_status( $stock_status );
+ }
+
+ // Upsells.
+ if ( isset( $request['upsell_ids'] ) ) {
+ $upsells = array();
+ $ids = $request['upsell_ids'];
+
+ if ( ! empty( $ids ) ) {
+ foreach ( $ids as $id ) {
+ if ( $id && $id > 0 ) {
+ $upsells[] = $id;
+ }
+ }
+ }
+
+ $product->set_upsell_ids( $upsells );
+ }
+
+ // Cross sells.
+ if ( isset( $request['cross_sell_ids'] ) ) {
+ $crosssells = array();
+ $ids = $request['cross_sell_ids'];
+
+ if ( ! empty( $ids ) ) {
+ foreach ( $ids as $id ) {
+ if ( $id && $id > 0 ) {
+ $crosssells[] = $id;
+ }
+ }
+ }
+
+ $product->set_cross_sell_ids( $crosssells );
+ }
+
+ // Product categories.
+ if ( isset( $request['categories'] ) && is_array( $request['categories'] ) ) {
+ $product = $this->save_taxonomy_terms( $product, $request['categories'] );
+ }
+
+ // Product tags.
+ if ( isset( $request['tags'] ) && is_array( $request['tags'] ) ) {
+ $product = $this->save_taxonomy_terms( $product, $request['tags'], 'tag' );
+ }
+
+ // Downloadable.
+ if ( isset( $request['downloadable'] ) ) {
+ $product->set_downloadable( $request['downloadable'] );
+ }
+
+ // Downloadable options.
+ if ( $product->get_downloadable() ) {
+
+ // Downloadable files.
+ if ( isset( $request['downloads'] ) && is_array( $request['downloads'] ) ) {
+ $product = $this->save_downloadable_files( $product, $request['downloads'] );
+ }
+
+ // Download limit.
+ if ( isset( $request['download_limit'] ) ) {
+ $product->set_download_limit( $request['download_limit'] );
+ }
+
+ // Download expiry.
+ if ( isset( $request['download_expiry'] ) ) {
+ $product->set_download_expiry( $request['download_expiry'] );
+ }
+ }
+
+ // Product url and button text for external products.
+ if ( $product->is_type( 'external' ) ) {
+ if ( isset( $request['external_url'] ) ) {
+ $product->set_product_url( $request['external_url'] );
+ }
+
+ if ( isset( $request['button_text'] ) ) {
+ $product->set_button_text( $request['button_text'] );
+ }
+ }
+
+ // Save default attributes for variable products.
+ if ( $product->is_type( 'variable' ) ) {
+ $product = $this->save_default_attributes( $product, $request );
+ }
+
+ // Set children for a grouped product.
+ if ( $product->is_type( 'grouped' ) && isset( $request['grouped_products'] ) ) {
+ $product->set_children( $request['grouped_products'] );
+ }
+
+ // Check for featured/gallery images, upload it and set it.
+ if ( isset( $request['images'] ) ) {
+ $product = $this->set_product_images( $product, $request['images'] );
+ }
+
+ // Allow set meta_data.
+ if ( is_array( $request['meta_data'] ) ) {
+ foreach ( $request['meta_data'] as $meta ) {
+ $product->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' );
+ }
+ }
+
+ /**
+ * Filters an object before it is inserted via the REST API.
+ *
+ * The dynamic portion of the hook name, `$this->post_type`,
+ * refers to the object type slug.
+ *
+ * @param WC_Data $product Object object.
+ * @param WP_REST_Request $request Request object.
+ * @param bool $creating If is creating a new object.
+ */
+ return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $product, $request, $creating );
+ }
+
+ /**
+ * Set product images.
+ *
+ * @param WC_Product $product Product instance.
+ * @param array $images Images data.
+ *
+ * @throws WC_REST_Exception REST API exceptions.
+ * @return WC_Product
+ */
+ protected function set_product_images( $product, $images ) {
+ $images = is_array( $images ) ? array_filter( $images ) : array();
+
+ if ( ! empty( $images ) ) {
+ $gallery_positions = array();
+
+ foreach ( $images as $index => $image ) {
+ $attachment_id = isset( $image['id'] ) ? absint( $image['id'] ) : 0;
+
+ if ( 0 === $attachment_id && isset( $image['src'] ) ) {
+ $upload = wc_rest_upload_image_from_url( esc_url_raw( $image['src'] ) );
+
+ if ( is_wp_error( $upload ) ) {
+ if ( ! apply_filters( 'woocommerce_rest_suppress_image_upload_error', false, $upload, $product->get_id(), $images ) ) {
+ throw new WC_REST_Exception( 'woocommerce_product_image_upload_error', $upload->get_error_message(), 400 );
+ } else {
+ continue;
+ }
+ }
+
+ $attachment_id = wc_rest_set_uploaded_image_as_attachment( $upload, $product->get_id() );
+ }
+
+ if ( ! wp_attachment_is_image( $attachment_id ) ) {
+ /* translators: %s: attachment id */
+ throw new WC_REST_Exception( 'woocommerce_product_invalid_image_id', sprintf( __( '#%s is an invalid image ID.', 'woocommerce' ), $attachment_id ), 400 );
+ }
+
+ $gallery_positions[ $attachment_id ] = absint( isset( $image['position'] ) ? $image['position'] : $index );
+
+ // Set the image alt if present.
+ if ( ! empty( $image['alt'] ) ) {
+ update_post_meta( $attachment_id, '_wp_attachment_image_alt', wc_clean( $image['alt'] ) );
+ }
+
+ // Set the image name if present.
+ if ( ! empty( $image['name'] ) ) {
+ wp_update_post(
+ array(
+ 'ID' => $attachment_id,
+ 'post_title' => $image['name'],
+ )
+ );
+ }
+
+ // Set the image source if present, for future reference.
+ if ( ! empty( $image['src'] ) ) {
+ update_post_meta( $attachment_id, '_wc_attachment_source', esc_url_raw( $image['src'] ) );
+ }
+ }
+
+ // Sort images and get IDs in correct order.
+ asort( $gallery_positions );
+
+ // Get gallery in correct order.
+ $gallery = array_keys( $gallery_positions );
+
+ // Featured image is in position 0.
+ $image_id = array_shift( $gallery );
+
+ // Set images.
+ $product->set_image_id( $image_id );
+ $product->set_gallery_image_ids( $gallery );
+ } else {
+ $product->set_image_id( '' );
+ $product->set_gallery_image_ids( array() );
+ }
+
+ return $product;
+ }
+
+ /**
+ * Save product shipping data.
+ *
+ * @param WC_Product $product Product instance.
+ * @param array $data Shipping data.
+ *
+ * @return WC_Product
+ */
+ protected function save_product_shipping_data( $product, $data ) {
+ // Virtual.
+ if ( isset( $data['virtual'] ) && true === $data['virtual'] ) {
+ $product->set_weight( '' );
+ $product->set_height( '' );
+ $product->set_length( '' );
+ $product->set_width( '' );
+ } else {
+ if ( isset( $data['weight'] ) ) {
+ $product->set_weight( $data['weight'] );
+ }
+
+ // Height.
+ if ( isset( $data['dimensions']['height'] ) ) {
+ $product->set_height( $data['dimensions']['height'] );
+ }
+
+ // Width.
+ if ( isset( $data['dimensions']['width'] ) ) {
+ $product->set_width( $data['dimensions']['width'] );
+ }
+
+ // Length.
+ if ( isset( $data['dimensions']['length'] ) ) {
+ $product->set_length( $data['dimensions']['length'] );
+ }
+ }
+
+ // Shipping class.
+ if ( isset( $data['shipping_class'] ) ) {
+ $data_store = $product->get_data_store();
+ $shipping_class_id = $data_store->get_shipping_class_id_by_slug( wc_clean( $data['shipping_class'] ) );
+ $product->set_shipping_class_id( $shipping_class_id );
+ }
+
+ return $product;
+ }
+
+ /**
+ * Save downloadable files.
+ *
+ * @param WC_Product $product Product instance.
+ * @param array $downloads Downloads data.
+ * @param int $deprecated Deprecated since 3.0
+ *
+ * @return WC_Product
+ */
+ protected function save_downloadable_files( $product, $downloads, $deprecated = 0 ) {
+ if ( $deprecated ) {
+ wc_deprecated_argument( 'variation_id', '3.0', 'save_downloadable_files() not requires a variation_id anymore.' );
+ }
+
+ $files = array();
+ foreach ( $downloads as $key => $file ) {
+ if ( empty( $file['file'] ) ) {
+ continue;
+ }
+
+ $download = new WC_Product_Download();
+ $download->set_id( ! empty( $file['id'] ) ? $file['id'] : wp_generate_uuid4() );
+ $download->set_name( $file['name'] ? $file['name'] : wc_get_filename_from_url( $file['file'] ) );
+ $download->set_file( apply_filters( 'woocommerce_file_download_path', $file['file'], $product, $key ) );
+ $files[] = $download;
+ }
+ $product->set_downloads( $files );
+
+ return $product;
+ }
+
+ /**
+ * Save taxonomy terms.
+ *
+ * @param WC_Product $product Product instance.
+ * @param array $terms Terms data.
+ * @param string $taxonomy Taxonomy name.
+ *
+ * @return WC_Product
+ */
+ protected function save_taxonomy_terms( $product, $terms, $taxonomy = 'cat' ) {
+ $term_ids = wp_list_pluck( $terms, 'id' );
+
+ if ( 'cat' === $taxonomy ) {
+ $product->set_category_ids( $term_ids );
+ } elseif ( 'tag' === $taxonomy ) {
+ $product->set_tag_ids( $term_ids );
+ }
+
+ return $product;
+ }
+
+ /**
+ * Save default attributes.
+ *
+ * @param WC_Product $product Product instance.
+ * @param WP_REST_Request $request Request data.
+ *
+ * @since 3.0.0
+ * @return WC_Product
+ */
+ protected function save_default_attributes( $product, $request ) {
+ if ( isset( $request['default_attributes'] ) && is_array( $request['default_attributes'] ) ) {
+
+ $attributes = $product->get_attributes();
+ $default_attributes = array();
+
+ foreach ( $request['default_attributes'] as $attribute ) {
+ $attribute_id = 0;
+ $attribute_name = '';
+
+ // Check ID for global attributes or name for product attributes.
+ if ( ! empty( $attribute['id'] ) ) {
+ $attribute_id = absint( $attribute['id'] );
+ $attribute_name = wc_attribute_taxonomy_name_by_id( $attribute_id );
+ } elseif ( ! empty( $attribute['name'] ) ) {
+ $attribute_name = sanitize_title( $attribute['name'] );
+ }
+
+ if ( ! $attribute_id && ! $attribute_name ) {
+ continue;
+ }
+
+ if ( isset( $attributes[ $attribute_name ] ) ) {
+ $_attribute = $attributes[ $attribute_name ];
+
+ if ( $_attribute['is_variation'] ) {
+ $value = isset( $attribute['option'] ) ? wc_clean( stripslashes( $attribute['option'] ) ) : '';
+
+ if ( ! empty( $_attribute['is_taxonomy'] ) ) {
+ // If dealing with a taxonomy, we need to get the slug from the name posted to the API.
+ $term = get_term_by( 'name', $value, $attribute_name );
+
+ if ( $term && ! is_wp_error( $term ) ) {
+ $value = $term->slug;
+ } else {
+ $value = sanitize_title( $value );
+ }
+ }
+
+ if ( $value ) {
+ $default_attributes[ $attribute_name ] = $value;
+ }
+ }
+ }
+ }
+
+ $product->set_default_attributes( $default_attributes );
+ }
+
+ return $product;
+ }
+
+ /**
+ * Clear caches here so in sync with any new variations/children.
+ *
+ * @param WC_Data $object Object data.
+ */
+ public function clear_transients( $object ) {
+ wc_delete_product_transients( $object->get_id() );
+ wp_cache_delete( 'product-' . $object->get_id(), 'products' );
+ }
+
+ /**
+ * Delete a single item.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ *
+ * @return WP_REST_Response|WP_Error
+ */
+ public function delete_item( $request ) {
+ $id = (int) $request['id'];
+ $force = (bool) $request['force'];
+ $object = $this->get_object( (int) $request['id'] );
+ $result = false;
+
+ if ( ! $object || 0 === $object->get_id() ) {
+ return new WP_Error(
+ "woocommerce_rest_{$this->post_type}_invalid_id", __( 'Invalid ID.', 'woocommerce' ), array(
+ 'status' => 404,
+ )
+ );
+ }
+
+ if ( 'variation' === $object->get_type() ) {
+ return new WP_Error(
+ "woocommerce_rest_invalid_{$this->post_type}_id", __( 'To manipulate product variations you should use the /products/<product_id>/variations/<id> endpoint.', 'woocommerce' ), array(
+ 'status' => 404,
+ )
+ );
+ }
+
+ $supports_trash = EMPTY_TRASH_DAYS > 0 && is_callable( array( $object, 'get_status' ) );
+
+ /**
+ * Filter whether an object is trashable.
+ *
+ * Return false to disable trash support for the object.
+ *
+ * @param boolean $supports_trash Whether the object type support trashing.
+ * @param WC_Data $object The object being considered for trashing support.
+ */
+ $supports_trash = apply_filters( "woocommerce_rest_{$this->post_type}_object_trashable", $supports_trash, $object );
+
+ if ( ! wc_rest_check_post_permissions( $this->post_type, 'delete', $object->get_id() ) ) {
+ return new WP_Error(
+ /* translators: %s: post type */
+ "woocommerce_rest_user_cannot_delete_{$this->post_type}", sprintf( __( 'Sorry, you are not allowed to delete %s.', 'woocommerce' ), $this->post_type ), array(
+ 'status' => rest_authorization_required_code(),
+ )
+ );
+ }
+
+ $request->set_param( 'context', 'edit' );
+ $response = $this->prepare_object_for_response( $object, $request );
+
+ // If we're forcing, then delete permanently.
+ if ( $force ) {
+ if ( $object->is_type( 'variable' ) ) {
+ foreach ( $object->get_children() as $child_id ) {
+ $child = wc_get_product( $child_id );
+ if ( ! empty( $child ) ) {
+ $child->delete( true );
+ }
+ }
+ } else {
+ // For other product types, if the product has children, remove the relationship.
+ foreach ( $object->get_children() as $child_id ) {
+ $child = wc_get_product( $child_id );
+ if ( ! empty( $child ) ) {
+ $child->set_parent_id( 0 );
+ $child->save();
+ }
+ }
+ }
+
+ $object->delete( true );
+ $result = 0 === $object->get_id();
+ } else {
+ // If we don't support trashing for this type, error out.
+ if ( ! $supports_trash ) {
+ return new WP_Error(
+ /* translators: %s: post type */
+ 'woocommerce_rest_trash_not_supported', sprintf( __( 'The %s does not support trashing.', 'woocommerce' ), $this->post_type ), array(
+ 'status' => 501,
+ )
+ );
+ }
+
+ // Otherwise, only trash if we haven't already.
+ if ( is_callable( array( $object, 'get_status' ) ) ) {
+ if ( 'trash' === $object->get_status() ) {
+ return new WP_Error(
+ /* translators: %s: post type */
+ 'woocommerce_rest_already_trashed', sprintf( __( 'The %s has already been deleted.', 'woocommerce' ), $this->post_type ), array(
+ 'status' => 410,
+ )
+ );
+ }
+
+ $object->delete();
+ $result = 'trash' === $object->get_status();
+ }
+ }
+
+ if ( ! $result ) {
+ return new WP_Error(
+ /* translators: %s: post type */
+ 'woocommerce_rest_cannot_delete', sprintf( __( 'The %s cannot be deleted.', 'woocommerce' ), $this->post_type ), array(
+ 'status' => 500,
+ )
+ );
+ }
+
+ // Delete parent product transients.
+ if ( 0 !== $object->get_parent_id() ) {
+ wc_delete_product_transients( $object->get_parent_id() );
+ }
+
+ /**
+ * Fires after a single object is deleted or trashed via the REST API.
+ *
+ * @param WC_Data $object The deleted or trashed object.
+ * @param WP_REST_Response $response The response data.
+ * @param WP_REST_Request $request The request sent to the API.
+ */
+ do_action( "woocommerce_rest_delete_{$this->post_type}_object", $object, $response, $request );
+
+ return $response;
+ }
+
+ /**
+ * Get the Product's schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $weight_unit = get_option( 'woocommerce_weight_unit' );
+ $dimension_unit = get_option( 'woocommerce_dimension_unit' );
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => $this->post_type,
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'name' => array(
+ 'description' => __( 'Product name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'slug' => array(
+ 'description' => __( 'Product slug.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'permalink' => array(
+ 'description' => __( 'Product URL.', 'woocommerce' ),
+ 'type' => 'string',
+ 'format' => 'uri',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_created' => array(
+ 'description' => __( "The date the product was created, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_created_gmt' => array(
+ 'description' => __( 'The date the product was created, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_modified' => array(
+ 'description' => __( "The date the product was last modified, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_modified_gmt' => array(
+ 'description' => __( 'The date the product was last modified, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'type' => array(
+ 'description' => __( 'Product type.', 'woocommerce' ),
+ 'type' => 'string',
+ 'default' => 'simple',
+ 'enum' => array_keys( wc_get_product_types() ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'status' => array(
+ 'description' => __( 'Product status (post status).', 'woocommerce' ),
+ 'type' => 'string',
+ 'default' => 'publish',
+ 'enum' => array_keys( get_post_statuses() ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'featured' => array(
+ 'description' => __( 'Featured product.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'default' => false,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'catalog_visibility' => array(
+ 'description' => __( 'Catalog visibility.', 'woocommerce' ),
+ 'type' => 'string',
+ 'default' => 'visible',
+ 'enum' => array( 'visible', 'catalog', 'search', 'hidden' ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'description' => array(
+ 'description' => __( 'Product description.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'short_description' => array(
+ 'description' => __( 'Product short description.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'sku' => array(
+ 'description' => __( 'Unique identifier.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'price' => array(
+ 'description' => __( 'Current product price.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'regular_price' => array(
+ 'description' => __( 'Product regular price.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'sale_price' => array(
+ 'description' => __( 'Product sale price.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'date_on_sale_from' => array(
+ 'description' => __( "Start date of sale price, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'date_on_sale_from_gmt' => array(
+ 'description' => __( 'Start date of sale price, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'date_on_sale_to' => array(
+ 'description' => __( "End date of sale price, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'date_on_sale_to_gmt' => array(
+ 'description' => __( 'End date of sale price, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'price_html' => array(
+ 'description' => __( 'Price formatted in HTML.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'on_sale' => array(
+ 'description' => __( 'Shows if the product is on sale.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'purchasable' => array(
+ 'description' => __( 'Shows if the product can be bought.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'total_sales' => array(
+ 'description' => __( 'Amount of sales.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'virtual' => array(
+ 'description' => __( 'If the product is virtual.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'default' => false,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'downloadable' => array(
+ 'description' => __( 'If the product is downloadable.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'default' => false,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'downloads' => array(
+ 'description' => __( 'List of downloadable files.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'File ID.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'name' => array(
+ 'description' => __( 'File name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'file' => array(
+ 'description' => __( 'File URL.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ ),
+ 'download_limit' => array(
+ 'description' => __( 'Number of times downloadable files can be downloaded after purchase.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'default' => -1,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'download_expiry' => array(
+ 'description' => __( 'Number of days until access to downloadable files expires.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'default' => -1,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'external_url' => array(
+ 'description' => __( 'Product external URL. Only for external products.', 'woocommerce' ),
+ 'type' => 'string',
+ 'format' => 'uri',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'button_text' => array(
+ 'description' => __( 'Product external button text. Only for external products.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'tax_status' => array(
+ 'description' => __( 'Tax status.', 'woocommerce' ),
+ 'type' => 'string',
+ 'default' => 'taxable',
+ 'enum' => array( 'taxable', 'shipping', 'none' ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'tax_class' => array(
+ 'description' => __( 'Tax class.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'manage_stock' => array(
+ 'description' => __( 'Stock management at product level.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'default' => false,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'stock_quantity' => array(
+ 'description' => __( 'Stock quantity.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'in_stock' => array(
+ 'description' => __( 'Controls whether or not the product is listed as "in stock" or "out of stock" on the frontend.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'default' => true,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'backorders' => array(
+ 'description' => __( 'If managing stock, this controls if backorders are allowed.', 'woocommerce' ),
+ 'type' => 'string',
+ 'default' => 'no',
+ 'enum' => array( 'no', 'notify', 'yes' ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'backorders_allowed' => array(
+ 'description' => __( 'Shows if backorders are allowed.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'backordered' => array(
+ 'description' => __( 'Shows if the product is on backordered.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'sold_individually' => array(
+ 'description' => __( 'Allow one item to be bought in a single order.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'default' => false,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'weight' => array(
+ /* translators: %s: weight unit */
+ 'description' => sprintf( __( 'Product weight (%s).', 'woocommerce' ), $weight_unit ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'dimensions' => array(
+ 'description' => __( 'Product dimensions.', 'woocommerce' ),
+ 'type' => 'object',
+ 'context' => array( 'view', 'edit' ),
+ 'properties' => array(
+ 'length' => array(
+ /* translators: %s: dimension unit */
+ 'description' => sprintf( __( 'Product length (%s).', 'woocommerce' ), $dimension_unit ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'width' => array(
+ /* translators: %s: dimension unit */
+ 'description' => sprintf( __( 'Product width (%s).', 'woocommerce' ), $dimension_unit ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'height' => array(
+ /* translators: %s: dimension unit */
+ 'description' => sprintf( __( 'Product height (%s).', 'woocommerce' ), $dimension_unit ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ 'shipping_required' => array(
+ 'description' => __( 'Shows if the product need to be shipped.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'shipping_taxable' => array(
+ 'description' => __( 'Shows whether or not the product shipping is taxable.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'shipping_class' => array(
+ 'description' => __( 'Shipping class slug.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'shipping_class_id' => array(
+ 'description' => __( 'Shipping class ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'reviews_allowed' => array(
+ 'description' => __( 'Allow reviews.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'default' => true,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'average_rating' => array(
+ 'description' => __( 'Reviews average rating.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'rating_count' => array(
+ 'description' => __( 'Amount of reviews that the product have.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'related_ids' => array(
+ 'description' => __( 'List of related products IDs.', 'woocommerce' ),
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'integer',
+ ),
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'upsell_ids' => array(
+ 'description' => __( 'List of up-sell products IDs.', 'woocommerce' ),
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'integer',
+ ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'cross_sell_ids' => array(
+ 'description' => __( 'List of cross-sell products IDs.', 'woocommerce' ),
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'integer',
+ ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'parent_id' => array(
+ 'description' => __( 'Product parent ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'purchase_note' => array(
+ 'description' => __( 'Optional note to send the customer after purchase.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'categories' => array(
+ 'description' => __( 'List of categories.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Category ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'name' => array(
+ 'description' => __( 'Category name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'slug' => array(
+ 'description' => __( 'Category slug.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ ),
+ ),
+ ),
+ 'tags' => array(
+ 'description' => __( 'List of tags.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Tag ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'name' => array(
+ 'description' => __( 'Tag name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'slug' => array(
+ 'description' => __( 'Tag slug.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ ),
+ ),
+ ),
+ 'images' => array(
+ 'description' => __( 'List of images.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Image ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'date_created' => array(
+ 'description' => __( "The date the image was created, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_created_gmt' => array(
+ 'description' => __( 'The date the image was created, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_modified' => array(
+ 'description' => __( "The date the image was last modified, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_modified_gmt' => array(
+ 'description' => __( 'The date the image was last modified, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'src' => array(
+ 'description' => __( 'Image URL.', 'woocommerce' ),
+ 'type' => 'string',
+ 'format' => 'uri',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'name' => array(
+ 'description' => __( 'Image name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'alt' => array(
+ 'description' => __( 'Image alternative text.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'position' => array(
+ 'description' => __( 'Image position. 0 means that the image is featured.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ ),
+ 'attributes' => array(
+ 'description' => __( 'List of attributes.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Attribute ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'name' => array(
+ 'description' => __( 'Attribute name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'position' => array(
+ 'description' => __( 'Attribute position.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'visible' => array(
+ 'description' => __( "Define if the attribute is visible on the \"Additional information\" tab in the product's page.", 'woocommerce' ),
+ 'type' => 'boolean',
+ 'default' => false,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'variation' => array(
+ 'description' => __( 'Define if the attribute can be used as variation.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'default' => false,
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'options' => array(
+ 'description' => __( 'List of available term names of the attribute.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'string',
+ ),
+ ),
+ ),
+ ),
+ ),
+ 'default_attributes' => array(
+ 'description' => __( 'Defaults variation attributes.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Attribute ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'name' => array(
+ 'description' => __( 'Attribute name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'option' => array(
+ 'description' => __( 'Selected attribute term name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ ),
+ 'variations' => array(
+ 'description' => __( 'List of variations IDs.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'integer',
+ ),
+ 'readonly' => true,
+ ),
+ 'grouped_products' => array(
+ 'description' => __( 'List of grouped products ID.', 'woocommerce' ),
+ 'type' => 'array',
+ 'items' => array(
+ 'type' => 'integer',
+ ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'menu_order' => array(
+ 'description' => __( 'Menu order, used to custom sort products.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'meta_data' => array(
+ 'description' => __( 'Meta data.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'items' => array(
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Meta ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'key' => array(
+ 'description' => __( 'Meta key.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'value' => array(
+ 'description' => __( 'Meta value.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+
+ /**
+ * Get the query params for collections of attachments.
+ *
+ * @return array
+ */
+ public function get_collection_params() {
+ $params = parent::get_collection_params();
+
+ $params['slug'] = array(
+ 'description' => __( 'Limit result set to products with a specific slug.', 'woocommerce' ),
+ 'type' => 'string',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+ $params['status'] = array(
+ 'default' => 'any',
+ 'description' => __( 'Limit result set to products assigned a specific status.', 'woocommerce' ),
+ 'type' => 'string',
+ 'enum' => array_merge( array( 'any' ), array_keys( get_post_statuses() ) ),
+ 'sanitize_callback' => 'sanitize_key',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+ $params['type'] = array(
+ 'description' => __( 'Limit result set to products assigned a specific type.', 'woocommerce' ),
+ 'type' => 'string',
+ 'enum' => array_keys( wc_get_product_types() ),
+ 'sanitize_callback' => 'sanitize_key',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+ $params['sku'] = array(
+ 'description' => __( 'Limit result set to products with specific SKU(s). Use commas to separate.', 'woocommerce' ),
+ 'type' => 'string',
+ 'sanitize_callback' => 'sanitize_text_field',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+ $params['featured'] = array(
+ 'description' => __( 'Limit result set to featured products.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'sanitize_callback' => 'wc_string_to_bool',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+ $params['category'] = array(
+ 'description' => __( 'Limit result set to products assigned a specific category ID.', 'woocommerce' ),
+ 'type' => 'string',
+ 'sanitize_callback' => 'wp_parse_id_list',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+ $params['tag'] = array(
+ 'description' => __( 'Limit result set to products assigned a specific tag ID.', 'woocommerce' ),
+ 'type' => 'string',
+ 'sanitize_callback' => 'wp_parse_id_list',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+ $params['shipping_class'] = array(
+ 'description' => __( 'Limit result set to products assigned a specific shipping class ID.', 'woocommerce' ),
+ 'type' => 'string',
+ 'sanitize_callback' => 'wp_parse_id_list',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+ $params['attribute'] = array(
+ 'description' => __( 'Limit result set to products with a specific attribute. Use the taxonomy name/attribute slug.', 'woocommerce' ),
+ 'type' => 'string',
+ 'sanitize_callback' => 'sanitize_text_field',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+ $params['attribute_term'] = array(
+ 'description' => __( 'Limit result set to products with a specific attribute term ID (required an assigned attribute).', 'woocommerce' ),
+ 'type' => 'string',
+ 'sanitize_callback' => 'wp_parse_id_list',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+
+ if ( wc_tax_enabled() ) {
+ $params['tax_class'] = array(
+ 'description' => __( 'Limit result set to products with a specific tax class.', 'woocommerce' ),
+ 'type' => 'string',
+ 'enum' => array_merge( array( 'standard' ), WC_Tax::get_tax_class_slugs() ),
+ 'sanitize_callback' => 'sanitize_text_field',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+ }
+
+ $params['in_stock'] = array(
+ 'description' => __( 'Limit result set to products in stock or out of stock.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'sanitize_callback' => 'wc_string_to_bool',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+ $params['on_sale'] = array(
+ 'description' => __( 'Limit result set to products on sale.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'sanitize_callback' => 'wc_string_to_bool',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+ $params['min_price'] = array(
+ 'description' => __( 'Limit result set to products based on a minimum price.', 'woocommerce' ),
+ 'type' => 'string',
+ 'sanitize_callback' => 'sanitize_text_field',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+ $params['max_price'] = array(
+ 'description' => __( 'Limit result set to products based on a maximum price.', 'woocommerce' ),
+ 'type' => 'string',
+ 'sanitize_callback' => 'sanitize_text_field',
+ 'validate_callback' => 'rest_validate_request_arg',
+ );
+
+ return $params;
+ }
+}
diff --git a/includes/api/v2/class-wc-rest-report-sales-v2-controller.php b/includes/api/v2/class-wc-rest-report-sales-v2-controller.php
new file mode 100644
index 00000000000..14b2e52077b
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-report-sales-v2-controller.php
@@ -0,0 +1,27 @@
+[\w-]+)';
+
+ /**
+ * Register routes.
+ *
+ * @since 3.0.0
+ */
+ public function register_routes() {
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base, array(
+ 'args' => array(
+ 'group' => array(
+ 'description' => __( 'Settings group ID.', 'woocommerce' ),
+ 'type' => 'string',
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_items' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/batch', array(
+ 'args' => array(
+ 'group' => array(
+ 'description' => __( 'Settings group ID.', 'woocommerce' ),
+ 'type' => 'string',
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => array( $this, 'batch_items' ),
+ 'permission_callback' => array( $this, 'update_items_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
+ ),
+ 'schema' => array( $this, 'get_public_batch_schema' ),
+ )
+ );
+
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array(
+ 'args' => array(
+ 'group' => array(
+ 'description' => __( 'Settings group ID.', 'woocommerce' ),
+ 'type' => 'string',
+ ),
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
+ 'type' => 'string',
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_item' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => array( $this, 'update_item' ),
+ 'permission_callback' => array( $this, 'update_items_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ }
+
+ /**
+ * Return a single setting.
+ *
+ * @since 3.0.0
+ * @param WP_REST_Request $request Request data.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function get_item( $request ) {
+ $setting = $this->get_setting( $request['group_id'], $request['id'] );
+
+ if ( is_wp_error( $setting ) ) {
+ return $setting;
+ }
+
+ $response = $this->prepare_item_for_response( $setting, $request );
+
+ return rest_ensure_response( $response );
+ }
+
+ /**
+ * Return all settings in a group.
+ *
+ * @since 3.0.0
+ * @param WP_REST_Request $request Request data.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function get_items( $request ) {
+ $settings = $this->get_group_settings( $request['group_id'] );
+
+ if ( is_wp_error( $settings ) ) {
+ return $settings;
+ }
+
+ $data = array();
+
+ foreach ( $settings as $setting_obj ) {
+ $setting = $this->prepare_item_for_response( $setting_obj, $request );
+ $setting = $this->prepare_response_for_collection( $setting );
+ if ( $this->is_setting_type_valid( $setting['type'] ) ) {
+ $data[] = $setting;
+ }
+ }
+
+ return rest_ensure_response( $data );
+ }
+
+ /**
+ * Get all settings in a group.
+ *
+ * @since 3.0.0
+ * @param string $group_id Group ID.
+ * @return array|WP_Error
+ */
+ public function get_group_settings( $group_id ) {
+ if ( empty( $group_id ) ) {
+ return new WP_Error( 'rest_setting_setting_group_invalid', __( 'Invalid setting group.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+
+ $settings = apply_filters( 'woocommerce_settings-' . $group_id, array() );
+
+ if ( empty( $settings ) ) {
+ return new WP_Error( 'rest_setting_setting_group_invalid', __( 'Invalid setting group.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+
+ $filtered_settings = array();
+ foreach ( $settings as $setting ) {
+ $option_key = $setting['option_key'];
+ $setting = $this->filter_setting( $setting );
+ $default = isset( $setting['default'] ) ? $setting['default'] : '';
+ // Get the option value.
+ if ( is_array( $option_key ) ) {
+ $option = get_option( $option_key[0] );
+ $setting['value'] = isset( $option[ $option_key[1] ] ) ? $option[ $option_key[1] ] : $default;
+ } else {
+ $admin_setting_value = WC_Admin_Settings::get_option( $option_key, $default );
+ $setting['value'] = $admin_setting_value;
+ }
+
+ if ( 'multi_select_countries' === $setting['type'] ) {
+ $setting['options'] = WC()->countries->get_countries();
+ $setting['type'] = 'multiselect';
+ } elseif ( 'single_select_country' === $setting['type'] ) {
+ $setting['type'] = 'select';
+ $setting['options'] = $this->get_countries_and_states();
+ }
+
+ $filtered_settings[] = $setting;
+ }
+
+ return $filtered_settings;
+ }
+
+ /**
+ * Returns a list of countries and states for use in the base location setting.
+ *
+ * @since 3.0.7
+ * @return array Array of states and countries.
+ */
+ private function get_countries_and_states() {
+ $countries = WC()->countries->get_countries();
+ if ( ! $countries ) {
+ return array();
+ }
+
+ $output = array();
+
+ foreach ( $countries as $key => $value ) {
+ $states = WC()->countries->get_states( $key );
+ if ( $states ) {
+ foreach ( $states as $state_key => $state_value ) {
+ $output[ $key . ':' . $state_key ] = $value . ' - ' . $state_value;
+ }
+ } else {
+ $output[ $key ] = $value;
+ }
+ }
+
+ return $output;
+ }
+
+ /**
+ * Get setting data.
+ *
+ * @since 3.0.0
+ * @param string $group_id Group ID.
+ * @param string $setting_id Setting ID.
+ * @return stdClass|WP_Error
+ */
+ public function get_setting( $group_id, $setting_id ) {
+ if ( empty( $setting_id ) ) {
+ return new WP_Error( 'rest_setting_setting_invalid', __( 'Invalid setting.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+
+ $settings = $this->get_group_settings( $group_id );
+
+ if ( is_wp_error( $settings ) ) {
+ return $settings;
+ }
+
+ $array_key = array_keys( wp_list_pluck( $settings, 'id' ), $setting_id );
+
+ if ( empty( $array_key ) ) {
+ return new WP_Error( 'rest_setting_setting_invalid', __( 'Invalid setting.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+
+ $setting = $settings[ $array_key[0] ];
+
+ if ( ! $this->is_setting_type_valid( $setting['type'] ) ) {
+ return new WP_Error( 'rest_setting_setting_invalid', __( 'Invalid setting.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+
+ return $setting;
+ }
+
+ /**
+ * Bulk create, update and delete items.
+ *
+ * @since 3.0.0
+ * @param WP_REST_Request $request Full details about the request.
+ * @return array Of WP_Error or WP_REST_Response.
+ */
+ public function batch_items( $request ) {
+ // Get the request params.
+ $items = array_filter( $request->get_params() );
+
+ /*
+ * Since our batch settings update is group-specific and matches based on the route,
+ * we inject the URL parameters (containing group) into the batch items
+ */
+ if ( ! empty( $items['update'] ) ) {
+ $to_update = array();
+ foreach ( $items['update'] as $item ) {
+ $to_update[] = array_merge( $request->get_url_params(), $item );
+ }
+ $request = new WP_REST_Request( $request->get_method() );
+ $request->set_body_params( array( 'update' => $to_update ) );
+ }
+
+ return parent::batch_items( $request );
+ }
+
+ /**
+ * Update a single setting in a group.
+ *
+ * @since 3.0.0
+ * @param WP_REST_Request $request Request data.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function update_item( $request ) {
+ $setting = $this->get_setting( $request['group_id'], $request['id'] );
+
+ if ( is_wp_error( $setting ) ) {
+ return $setting;
+ }
+
+ if ( is_callable( array( $this, 'validate_setting_' . $setting['type'] . '_field' ) ) ) {
+ $value = $this->{'validate_setting_' . $setting['type'] . '_field'}( $request['value'], $setting );
+ } else {
+ $value = $this->validate_setting_text_field( $request['value'], $setting );
+ }
+
+ if ( is_wp_error( $value ) ) {
+ return $value;
+ }
+
+ if ( is_array( $setting['option_key'] ) ) {
+ $setting['value'] = $value;
+ $option_key = $setting['option_key'];
+ $prev = get_option( $option_key[0] );
+ $prev[ $option_key[1] ] = $request['value'];
+ update_option( $option_key[0], $prev );
+ } else {
+ $update_data = array();
+ $update_data[ $setting['option_key'] ] = $value;
+ $setting['value'] = $value;
+ WC_Admin_Settings::save_fields( array( $setting ), $update_data );
+ }
+
+ $response = $this->prepare_item_for_response( $setting, $request );
+
+ return rest_ensure_response( $response );
+ }
+
+ /**
+ * Prepare a single setting object for response.
+ *
+ * @since 3.0.0
+ * @param object $item Setting object.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response Response data.
+ */
+ public function prepare_item_for_response( $item, $request ) {
+ unset( $item['option_key'] );
+ $data = $this->filter_setting( $item );
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, empty( $request['context'] ) ? 'view' : $request['context'] );
+ $response = rest_ensure_response( $data );
+ $response->add_links( $this->prepare_links( $data['id'], $request['group_id'] ) );
+ return $response;
+ }
+
+ /**
+ * Prepare links for the request.
+ *
+ * @since 3.0.0
+ * @param string $setting_id Setting ID.
+ * @param string $group_id Group ID.
+ * @return array Links for the given setting.
+ */
+ protected function prepare_links( $setting_id, $group_id ) {
+ $base = str_replace( '(?P[\w-]+)', $group_id, $this->rest_base );
+ $links = array(
+ 'self' => array(
+ 'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $base, $setting_id ) ),
+ ),
+ 'collection' => array(
+ 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $base ) ),
+ ),
+ );
+
+ return $links;
+ }
+
+ /**
+ * Makes sure the current user has access to READ the settings APIs.
+ *
+ * @since 3.0.0
+ * @param WP_REST_Request $request Full data about the request.
+ * @return WP_Error|boolean
+ */
+ public function get_items_permissions_check( $request ) {
+ if ( ! wc_rest_check_manager_permissions( 'settings', 'read' ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+
+ return true;
+ }
+
+ /**
+ * Makes sure the current user has access to WRITE the settings APIs.
+ *
+ * @since 3.0.0
+ * @param WP_REST_Request $request Full data about the request.
+ * @return WP_Error|boolean
+ */
+ public function update_items_permissions_check( $request ) {
+ if ( ! wc_rest_check_manager_permissions( 'settings', 'edit' ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you cannot edit this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+
+ return true;
+ }
+
+ /**
+ * Filters out bad values from the settings array/filter so we
+ * only return known values via the API.
+ *
+ * @since 3.0.0
+ * @param array $setting Settings.
+ * @return array
+ */
+ public function filter_setting( $setting ) {
+ $setting = array_intersect_key(
+ $setting,
+ array_flip( array_filter( array_keys( $setting ), array( $this, 'allowed_setting_keys' ) ) )
+ );
+
+ if ( empty( $setting['options'] ) ) {
+ unset( $setting['options'] );
+ }
+
+ if ( 'image_width' === $setting['type'] ) {
+ $setting = $this->cast_image_width( $setting );
+ }
+
+ return $setting;
+ }
+
+ /**
+ * For image_width, Crop can return "0" instead of false -- so we want
+ * to make sure we return these consistently the same we accept them.
+ *
+ * @todo remove in 4.0
+ * @since 3.0.0
+ * @param array $setting Settings.
+ * @return array
+ */
+ public function cast_image_width( $setting ) {
+ foreach ( array( 'default', 'value' ) as $key ) {
+ if ( isset( $setting[ $key ] ) ) {
+ $setting[ $key ]['width'] = intval( $setting[ $key ]['width'] );
+ $setting[ $key ]['height'] = intval( $setting[ $key ]['height'] );
+ $setting[ $key ]['crop'] = (bool) $setting[ $key ]['crop'];
+ }
+ }
+ return $setting;
+ }
+
+ /**
+ * Callback for allowed keys for each setting response.
+ *
+ * @since 3.0.0
+ * @param string $key Key to check.
+ * @return boolean
+ */
+ public function allowed_setting_keys( $key ) {
+ return in_array(
+ $key, array(
+ 'id',
+ 'label',
+ 'description',
+ 'default',
+ 'tip',
+ 'placeholder',
+ 'type',
+ 'options',
+ 'value',
+ 'option_key',
+ )
+ );
+ }
+
+ /**
+ * Boolean for if a setting type is a valid supported setting type.
+ *
+ * @since 3.0.0
+ * @param string $type Type.
+ * @return bool
+ */
+ public function is_setting_type_valid( $type ) {
+ return in_array(
+ $type, array(
+ 'text', // Validates with validate_setting_text_field.
+ 'email', // Validates with validate_setting_text_field.
+ 'number', // Validates with validate_setting_text_field.
+ 'color', // Validates with validate_setting_text_field.
+ 'password', // Validates with validate_setting_text_field.
+ 'textarea', // Validates with validate_setting_textarea_field.
+ 'select', // Validates with validate_setting_select_field.
+ 'multiselect', // Validates with validate_setting_multiselect_field.
+ 'radio', // Validates with validate_setting_radio_field (-> validate_setting_select_field).
+ 'checkbox', // Validates with validate_setting_checkbox_field.
+ 'image_width', // Validates with validate_setting_image_width_field.
+ 'thumbnail_cropping', // Validates with validate_setting_text_field.
+ )
+ );
+ }
+
+ /**
+ * Get the settings schema, conforming to JSON Schema.
+ *
+ * @since 3.0.0
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'setting',
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'A unique identifier for the setting.', 'woocommerce' ),
+ 'type' => 'string',
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_title',
+ ),
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'label' => array(
+ 'description' => __( 'A human readable label for the setting used in interfaces.', 'woocommerce' ),
+ 'type' => 'string',
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_text_field',
+ ),
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'description' => array(
+ 'description' => __( 'A human readable description for the setting used in interfaces.', 'woocommerce' ),
+ 'type' => 'string',
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_text_field',
+ ),
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'value' => array(
+ 'description' => __( 'Setting value.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'default' => array(
+ 'description' => __( 'Default value for the setting.', 'woocommerce' ),
+ 'type' => 'mixed',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'tip' => array(
+ 'description' => __( 'Additional help text shown to the user about the setting.', 'woocommerce' ),
+ 'type' => 'string',
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_text_field',
+ ),
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'placeholder' => array(
+ 'description' => __( 'Placeholder text to be displayed in text inputs.', 'woocommerce' ),
+ 'type' => 'string',
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_text_field',
+ ),
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'type' => array(
+ 'description' => __( 'Type of setting.', 'woocommerce' ),
+ 'type' => 'string',
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_text_field',
+ ),
+ 'context' => array( 'view', 'edit' ),
+ 'enum' => array( 'text', 'email', 'number', 'color', 'password', 'textarea', 'select', 'multiselect', 'radio', 'image_width', 'checkbox', 'thumbnail_cropping' ),
+ 'readonly' => true,
+ ),
+ 'options' => array(
+ 'description' => __( 'Array of options (key value pairs) for inputs such as select, multiselect, and radio buttons.', 'woocommerce' ),
+ 'type' => 'object',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+}
diff --git a/includes/api/v2/class-wc-rest-settings-v2-controller.php b/includes/api/v2/class-wc-rest-settings-v2-controller.php
new file mode 100644
index 00000000000..f8f33f2e4bc
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-settings-v2-controller.php
@@ -0,0 +1,232 @@
+namespace, '/' . $this->rest_base, array(
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_items' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ }
+
+ /**
+ * Get all settings groups items.
+ *
+ * @since 3.0.0
+ * @param WP_REST_Request $request Request data.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function get_items( $request ) {
+ $groups = apply_filters( 'woocommerce_settings_groups', array() );
+ if ( empty( $groups ) ) {
+ return new WP_Error( 'rest_setting_groups_empty', __( 'No setting groups have been registered.', 'woocommerce' ), array( 'status' => 500 ) );
+ }
+
+ $defaults = $this->group_defaults();
+ $filtered_groups = array();
+ foreach ( $groups as $group ) {
+ $sub_groups = array();
+ foreach ( $groups as $_group ) {
+ if ( ! empty( $_group['parent_id'] ) && $group['id'] === $_group['parent_id'] ) {
+ $sub_groups[] = $_group['id'];
+ }
+ }
+ $group['sub_groups'] = $sub_groups;
+
+ $group = wp_parse_args( $group, $defaults );
+ if ( ! is_null( $group['id'] ) && ! is_null( $group['label'] ) ) {
+ $group_obj = $this->filter_group( $group );
+ $group_data = $this->prepare_item_for_response( $group_obj, $request );
+ $group_data = $this->prepare_response_for_collection( $group_data );
+
+ $filtered_groups[] = $group_data;
+ }
+ }
+
+ $response = rest_ensure_response( $filtered_groups );
+ return $response;
+ }
+
+ /**
+ * Prepare links for the request.
+ *
+ * @param string $group_id Group ID.
+ * @return array Links for the given group.
+ */
+ protected function prepare_links( $group_id ) {
+ $base = '/' . $this->namespace . '/' . $this->rest_base;
+ $links = array(
+ 'options' => array(
+ 'href' => rest_url( trailingslashit( $base ) . $group_id ),
+ ),
+ );
+
+ return $links;
+ }
+
+ /**
+ * Prepare a report sales object for serialization.
+ *
+ * @since 3.0.0
+ * @param array $item Group object.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response Response data.
+ */
+ public function prepare_item_for_response( $item, $request ) {
+ $context = empty( $request['context'] ) ? 'view' : $request['context'];
+ $data = $this->add_additional_fields_to_object( $item, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+
+ $response = rest_ensure_response( $data );
+
+ $response->add_links( $this->prepare_links( $item['id'] ) );
+
+ return $response;
+ }
+
+ /**
+ * Filters out bad values from the groups array/filter so we
+ * only return known values via the API.
+ *
+ * @since 3.0.0
+ * @param array $group Group.
+ * @return array
+ */
+ public function filter_group( $group ) {
+ return array_intersect_key(
+ $group,
+ array_flip( array_filter( array_keys( $group ), array( $this, 'allowed_group_keys' ) ) )
+ );
+ }
+
+ /**
+ * Callback for allowed keys for each group response.
+ *
+ * @since 3.0.0
+ * @param string $key Key to check.
+ * @return boolean
+ */
+ public function allowed_group_keys( $key ) {
+ return in_array( $key, array( 'id', 'label', 'description', 'parent_id', 'sub_groups' ) );
+ }
+
+ /**
+ * Returns default settings for groups. null means the field is required.
+ *
+ * @since 3.0.0
+ * @return array
+ */
+ protected function group_defaults() {
+ return array(
+ 'id' => null,
+ 'label' => null,
+ 'description' => '',
+ 'parent_id' => '',
+ 'sub_groups' => array(),
+ );
+ }
+
+ /**
+ * Makes sure the current user has access to READ the settings APIs.
+ *
+ * @since 3.0.0
+ * @param WP_REST_Request $request Full data about the request.
+ * @return WP_Error|boolean
+ */
+ public function get_items_permissions_check( $request ) {
+ if ( ! wc_rest_check_manager_permissions( 'settings', 'read' ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+
+ return true;
+ }
+
+ /**
+ * Get the groups schema, conforming to JSON Schema.
+ *
+ * @since 3.0.0
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'setting_group',
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'A unique identifier that can be used to link settings together.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'label' => array(
+ 'description' => __( 'A human readable label for the setting used in interfaces.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'description' => array(
+ 'description' => __( 'A human readable description for the setting used in interfaces.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'parent_id' => array(
+ 'description' => __( 'ID of parent grouping.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'sub_groups' => array(
+ 'description' => __( 'IDs for settings sub groups.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+}
diff --git a/includes/api/v2/class-wc-rest-shipping-methods-v2-controller.php b/includes/api/v2/class-wc-rest-shipping-methods-v2-controller.php
new file mode 100644
index 00000000000..78df57ece6e
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-shipping-methods-v2-controller.php
@@ -0,0 +1,231 @@
+
+ */
+ public function register_routes() {
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base, array(
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_items' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ 'args' => $this->get_collection_params(),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array(
+ 'args' => array(
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
+ 'type' => 'string',
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_item' ),
+ 'permission_callback' => array( $this, 'get_item_permissions_check' ),
+ 'args' => array(
+ 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
+ ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ }
+
+ /**
+ * Check whether a given request has permission to view shipping methods.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|boolean
+ */
+ public function get_items_permissions_check( $request ) {
+ if ( ! wc_rest_check_manager_permissions( 'shipping_methods', 'read' ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+ return true;
+ }
+
+ /**
+ * Check if a given request has access to read a shipping method.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|boolean
+ */
+ public function get_item_permissions_check( $request ) {
+ if ( ! wc_rest_check_manager_permissions( 'shipping_methods', 'read' ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+ return true;
+ }
+
+ /**
+ * Get shipping methods.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function get_items( $request ) {
+ $wc_shipping = WC_Shipping::instance();
+ $response = array();
+ foreach ( $wc_shipping->get_shipping_methods() as $id => $shipping_method ) {
+ $method = $this->prepare_item_for_response( $shipping_method, $request );
+ $method = $this->prepare_response_for_collection( $method );
+ $response[] = $method;
+ }
+ return rest_ensure_response( $response );
+ }
+
+ /**
+ * Get a single Shipping Method.
+ *
+ * @param WP_REST_Request $request Request data.
+ * @return WP_REST_Response|WP_Error
+ */
+ public function get_item( $request ) {
+ $wc_shipping = WC_Shipping::instance();
+ $methods = $wc_shipping->get_shipping_methods();
+ if ( empty( $methods[ $request['id'] ] ) ) {
+ return new WP_Error( 'woocommerce_rest_shipping_method_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+
+ $method = $methods[ $request['id'] ];
+ $response = $this->prepare_item_for_response( $method, $request );
+
+ return rest_ensure_response( $response );
+ }
+
+ /**
+ * Prepare a shipping method for response.
+ *
+ * @param WC_Shipping_Method $method Shipping method object.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response Response data.
+ */
+ public function prepare_item_for_response( $method, $request ) {
+ $data = array(
+ 'id' => $method->id,
+ 'title' => $method->method_title,
+ 'description' => $method->method_description,
+ );
+
+ $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+
+ // Wrap the data in a response object.
+ $response = rest_ensure_response( $data );
+
+ $response->add_links( $this->prepare_links( $method, $request ) );
+
+ /**
+ * Filter shipping methods object returned from the REST API.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param WC_Shipping_Method $method Shipping method object used to create response.
+ * @param WP_REST_Request $request Request object.
+ */
+ return apply_filters( 'woocommerce_rest_prepare_shipping_method', $response, $method, $request );
+ }
+
+ /**
+ * Prepare links for the request.
+ *
+ * @param WC_Shipping_Method $method Shipping method object.
+ * @param WP_REST_Request $request Request object.
+ * @return array
+ */
+ protected function prepare_links( $method, $request ) {
+ $links = array(
+ 'self' => array(
+ 'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $method->id ) ),
+ ),
+ 'collection' => array(
+ 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ),
+ ),
+ );
+
+ return $links;
+ }
+
+ /**
+ * Get the shipping method schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'shipping_method',
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Method ID.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'title' => array(
+ 'description' => __( 'Shipping method title.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'description' => array(
+ 'description' => __( 'Shipping method description.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+
+ /**
+ * Get any query params needed.
+ *
+ * @return array
+ */
+ public function get_collection_params() {
+ return array(
+ 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
+ );
+ }
+}
diff --git a/includes/api/v2/class-wc-rest-shipping-zone-locations-v2-controller.php b/includes/api/v2/class-wc-rest-shipping-zone-locations-v2-controller.php
new file mode 100644
index 00000000000..77d85143209
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-shipping-zone-locations-v2-controller.php
@@ -0,0 +1,190 @@
+/locations endpoint.
+ *
+ * @package WooCommerce/API
+ * @since 3.0.0
+ */
+
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * REST API Shipping Zone Locations class.
+ *
+ * @package WooCommerce/API
+ * @extends WC_REST_Shipping_Zones_Controller_Base
+ */
+class WC_REST_Shipping_Zone_Locations_V2_Controller extends WC_REST_Shipping_Zones_Controller_Base {
+
+ /**
+ * Register the routes for Shipping Zone Locations.
+ */
+ public function register_routes() {
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)/locations', array(
+ 'args' => array(
+ 'id' => array(
+ 'description' => __( 'Unique ID for the resource.', 'woocommerce' ),
+ 'type' => 'integer',
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_items' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => array( $this, 'update_items' ),
+ 'permission_callback' => array( $this, 'update_items_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ }
+
+ /**
+ * Get all Shipping Zone Locations.
+ *
+ * @param WP_REST_Request $request Request data.
+ * @return WP_REST_Response|WP_Error
+ */
+ public function get_items( $request ) {
+ $zone = $this->get_zone( (int) $request['id'] );
+
+ if ( is_wp_error( $zone ) ) {
+ return $zone;
+ }
+
+ $locations = $zone->get_zone_locations();
+ $data = array();
+
+ foreach ( $locations as $location_obj ) {
+ $location = $this->prepare_item_for_response( $location_obj, $request );
+ $location = $this->prepare_response_for_collection( $location );
+ $data[] = $location;
+ }
+
+ return rest_ensure_response( $data );
+ }
+
+ /**
+ * Update all Shipping Zone Locations.
+ *
+ * @param WP_REST_Request $request Request data.
+ * @return WP_REST_Response|WP_Error
+ */
+ public function update_items( $request ) {
+ $zone = $this->get_zone( (int) $request['id'] );
+
+ if ( is_wp_error( $zone ) ) {
+ return $zone;
+ }
+
+ if ( 0 === $zone->get_id() ) {
+ return new WP_Error( 'woocommerce_rest_shipping_zone_locations_invalid_zone', __( 'The "locations not covered by your other zones" zone cannot be updated.', 'woocommerce' ), array( 'status' => 403 ) );
+ }
+
+ $raw_locations = $request->get_json_params();
+ $locations = array();
+
+ foreach ( (array) $raw_locations as $raw_location ) {
+ if ( empty( $raw_location['code'] ) ) {
+ continue;
+ }
+
+ $type = ! empty( $raw_location['type'] ) ? sanitize_text_field( $raw_location['type'] ) : 'country';
+
+ if ( ! in_array( $type, array( 'postcode', 'state', 'country', 'continent' ), true ) ) {
+ continue;
+ }
+
+ $locations[] = array(
+ 'code' => sanitize_text_field( $raw_location['code'] ),
+ 'type' => sanitize_text_field( $type ),
+ );
+ }
+
+ $zone->set_locations( $locations );
+ $zone->save();
+
+ return $this->get_items( $request );
+ }
+
+ /**
+ * Prepare the Shipping Zone Location for the REST response.
+ *
+ * @param array $item Shipping Zone Location.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response
+ */
+ public function prepare_item_for_response( $item, $request ) {
+ $context = empty( $request['context'] ) ? 'view' : $request['context'];
+ $data = $this->add_additional_fields_to_object( $item, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+
+ // Wrap the data in a response object.
+ $response = rest_ensure_response( $data );
+
+ $response->add_links( $this->prepare_links( (int) $request['id'] ) );
+
+ return $response;
+ }
+
+ /**
+ * Prepare links for the request.
+ *
+ * @param int $zone_id Given Shipping Zone ID.
+ * @return array Links for the given Shipping Zone Location.
+ */
+ protected function prepare_links( $zone_id ) {
+ $base = '/' . $this->namespace . '/' . $this->rest_base . '/' . $zone_id;
+ $links = array(
+ 'collection' => array(
+ 'href' => rest_url( $base . '/locations' ),
+ ),
+ 'describes' => array(
+ 'href' => rest_url( $base ),
+ ),
+ );
+
+ return $links;
+ }
+
+ /**
+ * Get the Shipping Zone Locations schema, conforming to JSON Schema
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'shipping_zone_location',
+ 'type' => 'object',
+ 'properties' => array(
+ 'code' => array(
+ 'description' => __( 'Shipping zone location code.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'type' => array(
+ 'description' => __( 'Shipping zone location type.', 'woocommerce' ),
+ 'type' => 'string',
+ 'default' => 'country',
+ 'enum' => array(
+ 'postcode',
+ 'state',
+ 'country',
+ 'continent',
+ ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+}
diff --git a/includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php b/includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php
new file mode 100644
index 00000000000..69fdc4b87db
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php
@@ -0,0 +1,541 @@
+/methods endpoint.
+ *
+ * @package WooCommerce/API
+ * @since 3.0.0
+ */
+
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * REST API Shipping Zone Methods class.
+ *
+ * @package WooCommerce/API
+ * @extends WC_REST_Shipping_Zones_Controller_Base
+ */
+class WC_REST_Shipping_Zone_Methods_V2_Controller extends WC_REST_Shipping_Zones_Controller_Base {
+
+ /**
+ * Register the routes for Shipping Zone Methods.
+ */
+ public function register_routes() {
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)/methods', array(
+ 'args' => array(
+ 'zone_id' => array(
+ 'description' => __( 'Unique ID for the zone.', 'woocommerce' ),
+ 'type' => 'integer',
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_items' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::CREATABLE,
+ 'callback' => array( $this, 'create_item' ),
+ 'permission_callback' => array( $this, 'create_item_permissions_check' ),
+ 'args' => array_merge(
+ $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), array(
+ 'method_id' => array(
+ 'required' => true,
+ 'readonly' => false,
+ 'description' => __( 'Shipping method ID.', 'woocommerce' ),
+ ),
+ )
+ ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)/methods/(?P[\d]+)', array(
+ 'args' => array(
+ 'zone_id' => array(
+ 'description' => __( 'Unique ID for the zone.', 'woocommerce' ),
+ 'type' => 'integer',
+ ),
+ 'instance_id' => array(
+ 'description' => __( 'Unique ID for the instance.', 'woocommerce' ),
+ 'type' => 'integer',
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_item' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => array( $this, 'update_item' ),
+ 'permission_callback' => array( $this, 'update_items_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::DELETABLE,
+ 'callback' => array( $this, 'delete_item' ),
+ 'permission_callback' => array( $this, 'delete_items_permissions_check' ),
+ 'args' => array(
+ 'force' => array(
+ 'default' => false,
+ 'type' => 'boolean',
+ 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ),
+ ),
+ ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ }
+
+ /**
+ * Get a single Shipping Zone Method.
+ *
+ * @param WP_REST_Request $request Request data.
+ * @return WP_REST_Response|WP_Error
+ */
+ public function get_item( $request ) {
+ $zone = $this->get_zone( $request['zone_id'] );
+
+ if ( is_wp_error( $zone ) ) {
+ return $zone;
+ }
+
+ $instance_id = (int) $request['instance_id'];
+ $methods = $zone->get_shipping_methods();
+ $method = false;
+
+ foreach ( $methods as $method_obj ) {
+ if ( $instance_id === $method_obj->instance_id ) {
+ $method = $method_obj;
+ break;
+ }
+ }
+
+ if ( false === $method ) {
+ return new WP_Error( 'woocommerce_rest_shipping_zone_method_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+
+ $data = $this->prepare_item_for_response( $method, $request );
+
+ return rest_ensure_response( $data );
+ }
+
+ /**
+ * Get all Shipping Zone Methods.
+ *
+ * @param WP_REST_Request $request Request data.
+ * @return WP_REST_Response|WP_Error
+ */
+ public function get_items( $request ) {
+ $zone = $this->get_zone( $request['zone_id'] );
+
+ if ( is_wp_error( $zone ) ) {
+ return $zone;
+ }
+
+ $methods = $zone->get_shipping_methods();
+ $data = array();
+
+ foreach ( $methods as $method_obj ) {
+ $method = $this->prepare_item_for_response( $method_obj, $request );
+ $data[] = $method;
+ }
+
+ return rest_ensure_response( $data );
+ }
+
+ /**
+ * Create a new shipping zone method instance.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_REST_Request|WP_Error
+ */
+ public function create_item( $request ) {
+ $method_id = $request['method_id'];
+ $zone = $this->get_zone( $request['zone_id'] );
+ if ( is_wp_error( $zone ) ) {
+ return $zone;
+ }
+
+ $instance_id = $zone->add_shipping_method( $method_id );
+ $methods = $zone->get_shipping_methods();
+ $method = false;
+ foreach ( $methods as $method_obj ) {
+ if ( $instance_id === $method_obj->instance_id ) {
+ $method = $method_obj;
+ break;
+ }
+ }
+
+ if ( false === $method ) {
+ return new WP_Error( 'woocommerce_rest_shipping_zone_not_created', __( 'Resource cannot be created.', 'woocommerce' ), array( 'status' => 500 ) );
+ }
+
+ $method = $this->update_fields( $instance_id, $method, $request );
+ if ( is_wp_error( $method ) ) {
+ return $method;
+ }
+
+ $data = $this->prepare_item_for_response( $method, $request );
+ return rest_ensure_response( $data );
+ }
+
+ /**
+ * Delete a shipping method instance.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|boolean
+ */
+ public function delete_item( $request ) {
+ $zone = $this->get_zone( $request['zone_id'] );
+ if ( is_wp_error( $zone ) ) {
+ return $zone;
+ }
+
+ $instance_id = (int) $request['instance_id'];
+ $force = $request['force'];
+
+ $methods = $zone->get_shipping_methods();
+ $method = false;
+
+ foreach ( $methods as $method_obj ) {
+ if ( $instance_id === $method_obj->instance_id ) {
+ $method = $method_obj;
+ break;
+ }
+ }
+
+ if ( false === $method ) {
+ return new WP_Error( 'woocommerce_rest_shipping_zone_method_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+
+ $method = $this->update_fields( $instance_id, $method, $request );
+ if ( is_wp_error( $method ) ) {
+ return $method;
+ }
+
+ $request->set_param( 'context', 'view' );
+ $response = $this->prepare_item_for_response( $method, $request );
+
+ // Actually delete.
+ if ( $force ) {
+ $zone->delete_shipping_method( $instance_id );
+ } else {
+ return new WP_Error( 'rest_trash_not_supported', __( 'Shipping methods do not support trashing.', 'woocommerce' ), array( 'status' => 501 ) );
+ }
+
+ /**
+ * Fires after a product review is deleted via the REST API.
+ *
+ * @param object $method
+ * @param WP_REST_Response $response The response data.
+ * @param WP_REST_Request $request The request sent to the API.
+ */
+ do_action( 'rest_delete_product_review', $method, $response, $request );
+
+ return $response;
+ }
+
+ /**
+ * Update A Single Shipping Zone Method.
+ *
+ * @param WP_REST_Request $request Request data.
+ * @return WP_REST_Response|WP_Error
+ */
+ public function update_item( $request ) {
+ $zone = $this->get_zone( $request['zone_id'] );
+ if ( is_wp_error( $zone ) ) {
+ return $zone;
+ }
+
+ $instance_id = (int) $request['instance_id'];
+ $methods = $zone->get_shipping_methods();
+ $method = false;
+
+ foreach ( $methods as $method_obj ) {
+ if ( $instance_id === $method_obj->instance_id ) {
+ $method = $method_obj;
+ break;
+ }
+ }
+
+ if ( false === $method ) {
+ return new WP_Error( 'woocommerce_rest_shipping_zone_method_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+
+ $method = $this->update_fields( $instance_id, $method, $request );
+ if ( is_wp_error( $method ) ) {
+ return $method;
+ }
+
+ $data = $this->prepare_item_for_response( $method, $request );
+ return rest_ensure_response( $data );
+ }
+
+ /**
+ * Updates settings, order, and enabled status on create.
+ *
+ * @param int $instance_id Instance ID.
+ * @param WC_Shipping_Method $method Shipping method data.
+ * @param WP_REST_Request $request Request data.
+ *
+ * @return WC_Shipping_Method
+ */
+ public function update_fields( $instance_id, $method, $request ) {
+ global $wpdb;
+
+ // Update settings if present.
+ if ( isset( $request['settings'] ) ) {
+ $method->init_instance_settings();
+ $instance_settings = $method->instance_settings;
+ $errors_found = false;
+ foreach ( $method->get_instance_form_fields() as $key => $field ) {
+ if ( isset( $request['settings'][ $key ] ) ) {
+ if ( is_callable( array( $this, 'validate_setting_' . $field['type'] . '_field' ) ) ) {
+ $value = $this->{'validate_setting_' . $field['type'] . '_field'}( $request['settings'][ $key ], $field );
+ } else {
+ $value = $this->validate_setting_text_field( $request['settings'][ $key ], $field );
+ }
+ if ( is_wp_error( $value ) ) {
+ $errors_found = true;
+ break;
+ }
+ $instance_settings[ $key ] = $value;
+ }
+ }
+
+ if ( $errors_found ) {
+ return new WP_Error( 'rest_setting_value_invalid', __( 'An invalid setting value was passed.', 'woocommerce' ), array( 'status' => 400 ) );
+ }
+
+ update_option( $method->get_instance_option_key(), apply_filters( 'woocommerce_shipping_' . $method->id . '_instance_settings_values', $instance_settings, $method ) );
+ }
+
+ // Update order.
+ if ( isset( $request['order'] ) ) {
+ $wpdb->update( "{$wpdb->prefix}woocommerce_shipping_zone_methods", array( 'method_order' => absint( $request['order'] ) ), array( 'instance_id' => absint( $instance_id ) ) );
+ $method->method_order = absint( $request['order'] );
+ }
+
+ // Update if this method is enabled or not.
+ if ( isset( $request['enabled'] ) ) {
+ if ( $wpdb->update( "{$wpdb->prefix}woocommerce_shipping_zone_methods", array( 'is_enabled' => $request['enabled'] ), array( 'instance_id' => absint( $instance_id ) ) ) ) {
+ do_action( 'woocommerce_shipping_zone_method_status_toggled', $instance_id, $method->id, $request['zone_id'], $request['enabled'] );
+ $method->enabled = ( true === $request['enabled'] ? 'yes' : 'no' );
+ }
+ }
+
+ return $method;
+ }
+
+ /**
+ * Prepare the Shipping Zone Method for the REST response.
+ *
+ * @param array $item Shipping Zone Method.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response
+ */
+ public function prepare_item_for_response( $item, $request ) {
+ $method = array(
+ 'id' => $item->instance_id,
+ 'instance_id' => $item->instance_id,
+ 'title' => $item->instance_settings['title'],
+ 'order' => $item->method_order,
+ 'enabled' => ( 'yes' === $item->enabled ),
+ 'method_id' => $item->id,
+ 'method_title' => $item->method_title,
+ 'method_description' => $item->method_description,
+ 'settings' => $this->get_settings( $item ),
+ );
+
+ $context = empty( $request['context'] ) ? 'view' : $request['context'];
+ $data = $this->add_additional_fields_to_object( $method, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+
+ // Wrap the data in a response object.
+ $response = rest_ensure_response( $data );
+
+ $response->add_links( $this->prepare_links( $request['zone_id'], $item->instance_id ) );
+
+ $response = $this->prepare_response_for_collection( $response );
+
+ return $response;
+ }
+
+ /**
+ * Return settings associated with this shipping zone method instance.
+ *
+ * @param WC_Shipping_Method $item Shipping method data.
+ *
+ * @return array
+ */
+ public function get_settings( $item ) {
+ $item->init_instance_settings();
+ $settings = array();
+ foreach ( $item->get_instance_form_fields() as $id => $field ) {
+ $data = array(
+ 'id' => $id,
+ 'label' => $field['title'],
+ 'description' => empty( $field['description'] ) ? '' : $field['description'],
+ 'type' => $field['type'],
+ 'value' => $item->instance_settings[ $id ],
+ 'default' => empty( $field['default'] ) ? '' : $field['default'],
+ 'tip' => empty( $field['description'] ) ? '' : $field['description'],
+ 'placeholder' => empty( $field['placeholder'] ) ? '' : $field['placeholder'],
+ );
+ if ( ! empty( $field['options'] ) ) {
+ $data['options'] = $field['options'];
+ }
+ $settings[ $id ] = $data;
+ }
+ return $settings;
+ }
+
+ /**
+ * Prepare links for the request.
+ *
+ * @param int $zone_id Given Shipping Zone ID.
+ * @param int $instance_id Given Shipping Zone Method Instance ID.
+ * @return array Links for the given Shipping Zone Method.
+ */
+ protected function prepare_links( $zone_id, $instance_id ) {
+ $base = '/' . $this->namespace . '/' . $this->rest_base . '/' . $zone_id;
+ $links = array(
+ 'self' => array(
+ 'href' => rest_url( $base . '/methods/' . $instance_id ),
+ ),
+ 'collection' => array(
+ 'href' => rest_url( $base . '/methods' ),
+ ),
+ 'describes' => array(
+ 'href' => rest_url( $base ),
+ ),
+ );
+
+ return $links;
+ }
+
+ /**
+ * Get the Shipping Zone Methods schema, conforming to JSON Schema
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'shipping_zone_method',
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Shipping method instance ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'instance_id' => array(
+ 'description' => __( 'Shipping method instance ID.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'title' => array(
+ 'description' => __( 'Shipping method customer facing title.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'order' => array(
+ 'description' => __( 'Shipping method sort order.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'enabled' => array(
+ 'description' => __( 'Shipping method enabled status.', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'method_id' => array(
+ 'description' => __( 'Shipping method ID.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'method_title' => array(
+ 'description' => __( 'Shipping method title.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'method_description' => array(
+ 'description' => __( 'Shipping method description.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'settings' => array(
+ 'description' => __( 'Shipping method settings.', 'woocommerce' ),
+ 'type' => 'object',
+ 'context' => array( 'view', 'edit' ),
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'A unique identifier for the setting.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'label' => array(
+ 'description' => __( 'A human readable label for the setting used in interfaces.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'description' => array(
+ 'description' => __( 'A human readable description for the setting used in interfaces.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'type' => array(
+ 'description' => __( 'Type of setting.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'enum' => array( 'text', 'email', 'number', 'color', 'password', 'textarea', 'select', 'multiselect', 'radio', 'image_width', 'checkbox' ),
+ 'readonly' => true,
+ ),
+ 'value' => array(
+ 'description' => __( 'Setting value.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'default' => array(
+ 'description' => __( 'Default value for the setting.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'tip' => array(
+ 'description' => __( 'Additional help text shown to the user about the setting.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'placeholder' => array(
+ 'description' => __( 'Placeholder text to be displayed in text inputs.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ ),
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+}
diff --git a/includes/api/v2/class-wc-rest-shipping-zones-v2-controller.php b/includes/api/v2/class-wc-rest-shipping-zones-v2-controller.php
new file mode 100644
index 00000000000..6071f6edb26
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-shipping-zones-v2-controller.php
@@ -0,0 +1,304 @@
+namespace, '/' . $this->rest_base, array(
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_items' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::CREATABLE,
+ 'callback' => array( $this, 'create_item' ),
+ 'permission_callback' => array( $this, 'create_item_permissions_check' ),
+ 'args' => array_merge(
+ $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), array(
+ 'name' => array(
+ 'required' => true,
+ 'type' => 'string',
+ 'description' => __( 'Shipping zone name.', 'woocommerce' ),
+ ),
+ )
+ ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/(?P[\d-]+)', array(
+ 'args' => array(
+ 'id' => array(
+ 'description' => __( 'Unique ID for the resource.', 'woocommerce' ),
+ 'type' => 'integer',
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_item' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => array( $this, 'update_item' ),
+ 'permission_callback' => array( $this, 'update_items_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::DELETABLE,
+ 'callback' => array( $this, 'delete_item' ),
+ 'permission_callback' => array( $this, 'delete_items_permissions_check' ),
+ 'args' => array(
+ 'force' => array(
+ 'default' => false,
+ 'type' => 'boolean',
+ 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ),
+ ),
+ ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ }
+
+ /**
+ * Get a single Shipping Zone.
+ *
+ * @param WP_REST_Request $request Request data.
+ * @return WP_REST_Response|WP_Error
+ */
+ public function get_item( $request ) {
+ $zone = $this->get_zone( $request->get_param( 'id' ) );
+
+ if ( is_wp_error( $zone ) ) {
+ return $zone;
+ }
+
+ $data = $zone->get_data();
+ $data = $this->prepare_item_for_response( $data, $request );
+ $data = $this->prepare_response_for_collection( $data );
+
+ return rest_ensure_response( $data );
+ }
+
+ /**
+ * Get all Shipping Zones.
+ *
+ * @param WP_REST_Request $request Request data.
+ * @return WP_REST_Response
+ */
+ public function get_items( $request ) {
+ $rest_of_the_world = WC_Shipping_Zones::get_zone_by( 'zone_id', 0 );
+
+ $zones = WC_Shipping_Zones::get_zones();
+ array_unshift( $zones, $rest_of_the_world->get_data() );
+ $data = array();
+
+ foreach ( $zones as $zone_obj ) {
+ $zone = $this->prepare_item_for_response( $zone_obj, $request );
+ $zone = $this->prepare_response_for_collection( $zone );
+ $data[] = $zone;
+ }
+
+ return rest_ensure_response( $data );
+ }
+
+ /**
+ * Create a single Shipping Zone.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_REST_Request|WP_Error
+ */
+ public function create_item( $request ) {
+ $zone = new WC_Shipping_Zone( null );
+
+ if ( ! is_null( $request->get_param( 'name' ) ) ) {
+ $zone->set_zone_name( $request->get_param( 'name' ) );
+ }
+
+ if ( ! is_null( $request->get_param( 'order' ) ) ) {
+ $zone->set_zone_order( $request->get_param( 'order' ) );
+ }
+
+ $zone->save();
+
+ if ( $zone->get_id() !== 0 ) {
+ $request->set_param( 'id', $zone->get_id() );
+ $response = $this->get_item( $request );
+ $response->set_status( 201 );
+ $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $zone->get_id() ) ) );
+ return $response;
+ } else {
+ return new WP_Error( 'woocommerce_rest_shipping_zone_not_created', __( "Resource cannot be created. Check to make sure 'order' and 'name' are present.", 'woocommerce' ), array( 'status' => 500 ) );
+ }
+ }
+
+ /**
+ * Update a single Shipping Zone.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_REST_Request|WP_Error
+ */
+ public function update_item( $request ) {
+ $zone = $this->get_zone( $request->get_param( 'id' ) );
+
+ if ( is_wp_error( $zone ) ) {
+ return $zone;
+ }
+
+ if ( 0 === $zone->get_id() ) {
+ return new WP_Error( 'woocommerce_rest_shipping_zone_invalid_zone', __( 'The "locations not covered by your other zones" zone cannot be updated.', 'woocommerce' ), array( 'status' => 403 ) );
+ }
+
+ $zone_changed = false;
+
+ if ( ! is_null( $request->get_param( 'name' ) ) ) {
+ $zone->set_zone_name( $request->get_param( 'name' ) );
+ $zone_changed = true;
+ }
+
+ if ( ! is_null( $request->get_param( 'order' ) ) ) {
+ $zone->set_zone_order( $request->get_param( 'order' ) );
+ $zone_changed = true;
+ }
+
+ if ( $zone_changed ) {
+ $zone->save();
+ }
+
+ return $this->get_item( $request );
+ }
+
+ /**
+ * Delete a single Shipping Zone.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_REST_Request|WP_Error
+ */
+ public function delete_item( $request ) {
+ $zone = $this->get_zone( $request->get_param( 'id' ) );
+
+ if ( is_wp_error( $zone ) ) {
+ return $zone;
+ }
+
+ $force = $request['force'];
+
+ $response = $this->get_item( $request );
+
+ if ( $force ) {
+ $zone->delete();
+ } else {
+ return new WP_Error( 'rest_trash_not_supported', __( 'Shipping zones do not support trashing.', 'woocommerce' ), array( 'status' => 501 ) );
+ }
+
+ return $response;
+ }
+
+ /**
+ * Prepare the Shipping Zone for the REST response.
+ *
+ * @param array $item Shipping Zone.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response
+ */
+ public function prepare_item_for_response( $item, $request ) {
+ $data = array(
+ 'id' => (int) $item['id'],
+ 'name' => $item['zone_name'],
+ 'order' => (int) $item['zone_order'],
+ );
+
+ $context = empty( $request['context'] ) ? 'view' : $request['context'];
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+
+ // Wrap the data in a response object.
+ $response = rest_ensure_response( $data );
+
+ $response->add_links( $this->prepare_links( $data['id'] ) );
+
+ return $response;
+ }
+
+ /**
+ * Prepare links for the request.
+ *
+ * @param int $zone_id Given Shipping Zone ID.
+ * @return array Links for the given Shipping Zone.
+ */
+ protected function prepare_links( $zone_id ) {
+ $base = '/' . $this->namespace . '/' . $this->rest_base;
+ $links = array(
+ 'self' => array(
+ 'href' => rest_url( trailingslashit( $base ) . $zone_id ),
+ ),
+ 'collection' => array(
+ 'href' => rest_url( $base ),
+ ),
+ 'describedby' => array(
+ 'href' => rest_url( trailingslashit( $base ) . $zone_id . '/locations' ),
+ ),
+ );
+
+ return $links;
+ }
+
+ /**
+ * Get the Shipping Zones schema, conforming to JSON Schema
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'shipping_zone',
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'name' => array(
+ 'description' => __( 'Shipping zone name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_text_field',
+ ),
+ ),
+ 'order' => array(
+ 'description' => __( 'Shipping zone order.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+}
diff --git a/includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php b/includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php
new file mode 100644
index 00000000000..7d321a9904a
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php
@@ -0,0 +1,583 @@
+namespace, '/' . $this->rest_base, array(
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_items' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ 'args' => $this->get_collection_params(),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+
+ register_rest_route(
+ $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array(
+ 'args' => array(
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
+ 'type' => 'string',
+ ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_item' ),
+ 'permission_callback' => array( $this, 'get_item_permissions_check' ),
+ ),
+ array(
+ 'methods' => WP_REST_Server::EDITABLE,
+ 'callback' => array( $this, 'update_item' ),
+ 'permission_callback' => array( $this, 'update_item_permissions_check' ),
+ 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ }
+
+ /**
+ * Check whether a given request has permission to view system status tools.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|boolean
+ */
+ public function get_items_permissions_check( $request ) {
+ if ( ! wc_rest_check_manager_permissions( 'system_status', 'read' ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+ return true;
+ }
+
+ /**
+ * Check whether a given request has permission to view a specific system status tool.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|boolean
+ */
+ public function get_item_permissions_check( $request ) {
+ if ( ! wc_rest_check_manager_permissions( 'system_status', 'read' ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+ return true;
+ }
+
+ /**
+ * Check whether a given request has permission to execute a specific system status tool.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|boolean
+ */
+ public function update_item_permissions_check( $request ) {
+ if ( ! wc_rest_check_manager_permissions( 'system_status', 'edit' ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_update', __( 'Sorry, you cannot update resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+ return true;
+ }
+
+ /**
+ * A list of available tools for use in the system status section.
+ * 'button' becomes 'action' in the API.
+ *
+ * @return array
+ */
+ public function get_tools() {
+ $tools = array(
+ 'clear_transients' => array(
+ 'name' => __( 'WooCommerce transients', 'woocommerce' ),
+ 'button' => __( 'Clear transients', 'woocommerce' ),
+ 'desc' => __( 'This tool will clear the product/shop transients cache.', 'woocommerce' ),
+ ),
+ 'clear_expired_transients' => array(
+ 'name' => __( 'Expired transients', 'woocommerce' ),
+ 'button' => __( 'Clear transients', 'woocommerce' ),
+ 'desc' => __( 'This tool will clear ALL expired transients from WordPress.', 'woocommerce' ),
+ ),
+ 'delete_orphaned_variations' => array(
+ 'name' => __( 'Orphaned variations', 'woocommerce' ),
+ 'button' => __( 'Delete orphaned variations', 'woocommerce' ),
+ 'desc' => __( 'This tool will delete all variations which have no parent.', 'woocommerce' ),
+ ),
+ 'clear_expired_download_permissions' => array(
+ 'name' => __( 'Used-up download permissions', 'woocommerce' ),
+ 'button' => __( 'Clean up download permissions', 'woocommerce' ),
+ 'desc' => __( 'This tool will delete expired download permissions and permissions with 0 remaining downloads.', 'woocommerce' ),
+ ),
+ 'add_order_indexes' => array(
+ 'name' => __( 'Order address indexes', 'woocommerce' ),
+ 'button' => __( 'Index orders', 'woocommerce' ),
+ 'desc' => __( 'This tool will add address indexes to orders that do not have them yet. This improves order search results.', 'woocommerce' ),
+ ),
+ 'recount_terms' => array(
+ 'name' => __( 'Term counts', 'woocommerce' ),
+ 'button' => __( 'Recount terms', 'woocommerce' ),
+ 'desc' => __( 'This tool will recount product terms - useful when changing your settings in a way which hides products from the catalog.', 'woocommerce' ),
+ ),
+ 'reset_roles' => array(
+ 'name' => __( 'Capabilities', 'woocommerce' ),
+ 'button' => __( 'Reset capabilities', 'woocommerce' ),
+ 'desc' => __( 'This tool will reset the admin, customer and shop_manager roles to default. Use this if your users cannot access all of the WooCommerce admin pages.', 'woocommerce' ),
+ ),
+ 'clear_sessions' => array(
+ 'name' => __( 'Clear customer sessions', 'woocommerce' ),
+ 'button' => __( 'Clear', 'woocommerce' ),
+ 'desc' => sprintf(
+ '%1$s %2$s',
+ __( 'Note:', 'woocommerce' ),
+ __( 'This tool will delete all customer session data from the database, including current carts and saved carts in the database.', 'woocommerce' )
+ ),
+ ),
+ 'install_pages' => array(
+ 'name' => __( 'Create default WooCommerce pages', 'woocommerce' ),
+ 'button' => __( 'Create pages', 'woocommerce' ),
+ 'desc' => sprintf(
+ '%1$s %2$s',
+ __( 'Note:', 'woocommerce' ),
+ __( 'This tool will install all the missing WooCommerce pages. Pages already defined and set up will not be replaced.', 'woocommerce' )
+ ),
+ ),
+ 'delete_taxes' => array(
+ 'name' => __( 'Delete WooCommerce tax rates', 'woocommerce' ),
+ 'button' => __( 'Delete tax rates', 'woocommerce' ),
+ 'desc' => sprintf(
+ '%1$s %2$s',
+ __( 'Note:', 'woocommerce' ),
+ __( 'This option will delete ALL of your tax rates, use with caution. This action cannot be reversed.', 'woocommerce' )
+ ),
+ ),
+ 'reset_tracking' => array(
+ 'name' => __( 'Reset usage tracking', 'woocommerce' ),
+ 'button' => __( 'Reset', 'woocommerce' ),
+ 'desc' => __( 'This will reset your usage tracking settings, causing it to show the opt-in banner again and not sending any data.', 'woocommerce' ),
+ ),
+ 'regenerate_thumbnails' => array(
+ 'name' => __( 'Regenerate shop thumbnails', 'woocommerce' ),
+ 'button' => __( 'Regenerate', 'woocommerce' ),
+ 'desc' => __( 'This will regenerate all shop thumbnails to match your theme and/or image settings.', 'woocommerce' ),
+ ),
+ 'db_update_routine' => array(
+ 'name' => __( 'Update database', 'woocommerce' ),
+ 'button' => __( 'Update database', 'woocommerce' ),
+ 'desc' => sprintf(
+ '%1$s %2$s',
+ __( 'Note:', 'woocommerce' ),
+ __( 'This tool will update your WooCommerce database to the latest version. Please ensure you make sufficient backups before proceeding.', 'woocommerce' )
+ ),
+ )
+ );
+
+ // Jetpack does the image resizing heavy lifting so you don't have to.
+ if ( ( class_exists( 'Jetpack' ) && Jetpack::is_module_active( 'photon' ) ) || ! apply_filters( 'woocommerce_background_image_regeneration', true ) ) {
+ unset( $tools['regenerate_thumbnails'] );
+ }
+
+ return apply_filters( 'woocommerce_debug_tools', $tools );
+ }
+
+ /**
+ * Get a list of system status tools.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function get_items( $request ) {
+ $tools = array();
+ foreach ( $this->get_tools() as $id => $tool ) {
+ $tools[] = $this->prepare_response_for_collection(
+ $this->prepare_item_for_response(
+ array(
+ 'id' => $id,
+ 'name' => $tool['name'],
+ 'action' => $tool['button'],
+ 'description' => $tool['desc'],
+ ), $request
+ )
+ );
+ }
+
+ $response = rest_ensure_response( $tools );
+ return $response;
+ }
+
+ /**
+ * Return a single tool.
+ *
+ * @param WP_REST_Request $request Request data.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function get_item( $request ) {
+ $tools = $this->get_tools();
+ if ( empty( $tools[ $request['id'] ] ) ) {
+ return new WP_Error( 'woocommerce_rest_system_status_tool_invalid_id', __( 'Invalid tool ID.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+ $tool = $tools[ $request['id'] ];
+ return rest_ensure_response(
+ $this->prepare_item_for_response(
+ array(
+ 'id' => $request['id'],
+ 'name' => $tool['name'],
+ 'action' => $tool['button'],
+ 'description' => $tool['desc'],
+ ), $request
+ )
+ );
+ }
+
+ /**
+ * Update (execute) a tool.
+ *
+ * @param WP_REST_Request $request Request data.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function update_item( $request ) {
+ $tools = $this->get_tools();
+ if ( empty( $tools[ $request['id'] ] ) ) {
+ return new WP_Error( 'woocommerce_rest_system_status_tool_invalid_id', __( 'Invalid tool ID.', 'woocommerce' ), array( 'status' => 404 ) );
+ }
+
+ $tool = $tools[ $request['id'] ];
+ $tool = array(
+ 'id' => $request['id'],
+ 'name' => $tool['name'],
+ 'action' => $tool['button'],
+ 'description' => $tool['desc'],
+ );
+
+ $execute_return = $this->execute_tool( $request['id'] );
+ $tool = array_merge( $tool, $execute_return );
+
+ /**
+ * Fires after a WooCommerce REST system status tool has been executed.
+ *
+ * @param array $tool Details about the tool that has been executed.
+ * @param WP_REST_Request $request The current WP_REST_Request object.
+ */
+ do_action( 'woocommerce_rest_insert_system_status_tool', $tool, $request );
+
+ $request->set_param( 'context', 'edit' );
+ $response = $this->prepare_item_for_response( $tool, $request );
+ return rest_ensure_response( $response );
+ }
+
+ /**
+ * Prepare a tool item for serialization.
+ *
+ * @param array $item Object.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response $response Response data.
+ */
+ public function prepare_item_for_response( $item, $request ) {
+ $context = empty( $request['context'] ) ? 'view' : $request['context'];
+ $data = $this->add_additional_fields_to_object( $item, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+
+ $response = rest_ensure_response( $data );
+
+ $response->add_links( $this->prepare_links( $item['id'] ) );
+
+ return $response;
+ }
+
+ /**
+ * Get the system status tools schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'system_status_tool',
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'A unique identifier for the tool.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_title',
+ ),
+ ),
+ 'name' => array(
+ 'description' => __( 'Tool name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_text_field',
+ ),
+ ),
+ 'action' => array(
+ 'description' => __( 'What running the tool will do.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_text_field',
+ ),
+ ),
+ 'description' => array(
+ 'description' => __( 'Tool description.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_text_field',
+ ),
+ ),
+ 'success' => array(
+ 'description' => __( 'Did the tool run successfully?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'edit' ),
+ ),
+ 'message' => array(
+ 'description' => __( 'Tool return message.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'edit' ),
+ 'arg_options' => array(
+ 'sanitize_callback' => 'sanitize_text_field',
+ ),
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+
+ /**
+ * Prepare links for the request.
+ *
+ * @param string $id ID.
+ * @return array
+ */
+ protected function prepare_links( $id ) {
+ $base = '/' . $this->namespace . '/' . $this->rest_base;
+ $links = array(
+ 'item' => array(
+ 'href' => rest_url( trailingslashit( $base ) . $id ),
+ 'embeddable' => true,
+ ),
+ );
+
+ return $links;
+ }
+
+ /**
+ * Get any query params needed.
+ *
+ * @return array
+ */
+ public function get_collection_params() {
+ return array(
+ 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
+ );
+ }
+
+ /**
+ * Actually executes a tool.
+ *
+ * @param string $tool Tool.
+ * @return array
+ */
+ public function execute_tool( $tool ) {
+ global $wpdb;
+ $ran = true;
+ switch ( $tool ) {
+ case 'clear_transients':
+ wc_delete_product_transients();
+ wc_delete_shop_order_transients();
+
+ $attribute_taxonomies = wc_get_attribute_taxonomies();
+
+ if ( $attribute_taxonomies ) {
+ foreach ( $attribute_taxonomies as $attribute ) {
+ delete_transient( 'wc_layered_nav_counts_pa_' . $attribute->attribute_name );
+ }
+ }
+
+ WC_Cache_Helper::get_transient_version( 'shipping', true );
+ $message = __( 'Product transients cleared', 'woocommerce' );
+ break;
+
+ case 'clear_expired_transients':
+ /* translators: %d: amount of expired transients */
+ $message = sprintf( __( '%d transients rows cleared', 'woocommerce' ), wc_delete_expired_transients() );
+ break;
+
+ case 'delete_orphaned_variations':
+ // Delete orphans.
+ $result = absint(
+ $wpdb->query(
+ "DELETE products
+ FROM {$wpdb->posts} products
+ LEFT JOIN {$wpdb->posts} wp ON wp.ID = products.post_parent
+ WHERE wp.ID IS NULL AND products.post_type = 'product_variation';"
+ )
+ );
+ /* translators: %d: amount of orphaned variations */
+ $message = sprintf( __( '%d orphaned variations deleted', 'woocommerce' ), $result );
+ break;
+
+ case 'clear_expired_download_permissions':
+ // Delete expired download permissions and ones with 0 downloads remaining.
+ $result = absint(
+ $wpdb->query(
+ $wpdb->prepare(
+ "DELETE FROM {$wpdb->prefix}woocommerce_downloadable_product_permissions
+ WHERE ( downloads_remaining != '' AND downloads_remaining = 0 ) OR ( access_expires IS NOT NULL AND access_expires < %s )",
+ date( 'Y-m-d', current_time( 'timestamp' ) )
+ )
+ )
+ );
+ /* translators: %d: amount of permissions */
+ $message = sprintf( __( '%d permissions deleted', 'woocommerce' ), $result );
+ break;
+
+ case 'add_order_indexes':
+ /*
+ * Add billing and shipping address indexes containing the customer name for orders
+ * that don't have address indexes yet.
+ */
+ $sql = "INSERT INTO {$wpdb->postmeta}( post_id, meta_key, meta_value )
+ SELECT post_id, '%s', GROUP_CONCAT( meta_value SEPARATOR ' ' )
+ FROM {$wpdb->postmeta}
+ WHERE meta_key IN ( '%s', '%s' )
+ AND post_id IN ( SELECT DISTINCT post_id FROM {$wpdb->postmeta}
+ WHERE post_id NOT IN ( SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='%s' )
+ AND post_id IN ( SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='%s' ) )
+ GROUP BY post_id";
+ $rows = $wpdb->query( $wpdb->prepare( $sql, '_billing_address_index', '_billing_first_name', '_billing_last_name', '_billing_address_index', '_billing_last_name' ) ); // WPCS: unprepared SQL ok.
+ $rows += $wpdb->query( $wpdb->prepare( $sql, '_shipping_address_index', '_shipping_first_name', '_shipping_last_name', '_shipping_address_index', '_shipping_last_name' ) ); // WPCS: unprepared SQL ok.
+
+ /* translators: %d: amount of indexes */
+ $message = sprintf( __( '%d indexes added', 'woocommerce' ), $rows );
+ break;
+
+ case 'reset_roles':
+ // Remove then re-add caps and roles.
+ WC_Install::remove_roles();
+ WC_Install::create_roles();
+ $message = __( 'Roles successfully reset', 'woocommerce' );
+ break;
+
+ case 'recount_terms':
+ $product_cats = get_terms(
+ 'product_cat', array(
+ 'hide_empty' => false,
+ 'fields' => 'id=>parent',
+ )
+ );
+ _wc_term_recount( $product_cats, get_taxonomy( 'product_cat' ), true, false );
+ $product_tags = get_terms(
+ 'product_tag', array(
+ 'hide_empty' => false,
+ 'fields' => 'id=>parent',
+ )
+ );
+ _wc_term_recount( $product_tags, get_taxonomy( 'product_tag' ), true, false );
+ $message = __( 'Terms successfully recounted', 'woocommerce' );
+ break;
+
+ case 'clear_sessions':
+ $wpdb->query( "TRUNCATE {$wpdb->prefix}woocommerce_sessions" );
+ $result = absint( $wpdb->query( "DELETE FROM {$wpdb->usermeta} WHERE meta_key='_woocommerce_persistent_cart_" . get_current_blog_id() . "';" ) ); // WPCS: unprepared SQL ok.
+ wp_cache_flush();
+ /* translators: %d: amount of sessions */
+ $message = sprintf( __( 'Deleted all active sessions, and %d saved carts.', 'woocommerce' ), absint( $result ) );
+ break;
+
+ case 'install_pages':
+ WC_Install::create_pages();
+ $message = __( 'All missing WooCommerce pages successfully installed', 'woocommerce' );
+ break;
+
+ case 'delete_taxes':
+ $wpdb->query( "TRUNCATE TABLE {$wpdb->prefix}woocommerce_tax_rates;" );
+ $wpdb->query( "TRUNCATE TABLE {$wpdb->prefix}woocommerce_tax_rate_locations;" );
+ WC_Cache_Helper::incr_cache_prefix( 'taxes' );
+ $message = __( 'Tax rates successfully deleted', 'woocommerce' );
+ break;
+
+ case 'reset_tracking':
+ if ( ! class_exists( 'WC_Tracker' ) ) {
+ include_once WC_ABSPATH . 'includes/class-wc-tracker.php';
+ }
+ WC_Tracker::opt_out_request();
+ delete_option( 'woocommerce_allow_tracking' );
+ WC_Admin_Notices::add_notice( 'tracking' );
+ $message = __( 'Usage tracking settings successfully reset.', 'woocommerce' );
+ break;
+
+ case 'regenerate_thumbnails':
+ WC_Regenerate_Images::queue_image_regeneration();
+ $message = __( 'Thumbnail regeneration has been scheduled to run in the background.', 'woocommerce' );
+ break;
+
+ case 'db_update_routine':
+ $blog_id = get_current_blog_id();
+ // Used to fire an action added in WP_Background_Process::_construct() that calls WP_Background_Process::handle_cron_healthcheck().
+ // This method will make sure the database updates are executed even if cron is disabled. Nothing will happen if the updates are already running.
+ do_action( 'wp_' . $blog_id . '_wc_updater_cron' );
+ $message = __( 'Database upgrade routine has been scheduled to run in the background.', 'woocommerce' );
+ break;
+
+ default:
+ $tools = $this->get_tools();
+ if ( isset( $tools[ $tool ]['callback'] ) ) {
+ $callback = $tools[ $tool ]['callback'];
+ $return = call_user_func( $callback );
+ if ( is_string( $return ) ) {
+ $message = $return;
+ } elseif ( false === $return ) {
+ $callback_string = is_array( $callback ) ? get_class( $callback[0] ) . '::' . $callback[1] : $callback;
+ $ran = false;
+ /* translators: %s: callback string */
+ $message = sprintf( __( 'There was an error calling %s', 'woocommerce' ), $callback_string );
+ } else {
+ $message = __( 'Tool ran.', 'woocommerce' );
+ }
+ } else {
+ $ran = false;
+ $message = __( 'There was an error calling this tool. There is no callback present.', 'woocommerce' );
+ }
+ break;
+ }
+
+ return array(
+ 'success' => $ran,
+ 'message' => $message,
+ );
+ }
+}
diff --git a/includes/api/v2/class-wc-rest-system-status-v2-controller.php b/includes/api/v2/class-wc-rest-system-status-v2-controller.php
new file mode 100644
index 00000000000..4352dfbe13e
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-system-status-v2-controller.php
@@ -0,0 +1,1106 @@
+namespace,
+ '/' . $this->rest_base,
+ array(
+ array(
+ 'methods' => WP_REST_Server::READABLE,
+ 'callback' => array( $this, 'get_items' ),
+ 'permission_callback' => array( $this, 'get_items_permissions_check' ),
+ 'args' => $this->get_collection_params(),
+ ),
+ 'schema' => array( $this, 'get_public_item_schema' ),
+ )
+ );
+ }
+
+ /**
+ * Check whether a given request has permission to view system status.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|boolean
+ */
+ public function get_items_permissions_check( $request ) {
+ if ( ! wc_rest_check_manager_permissions( 'system_status', 'read' ) ) {
+ return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) );
+ }
+ return true;
+ }
+
+ /**
+ * Get a system status info, by section.
+ *
+ * @param WP_REST_Request $request Full details about the request.
+ * @return WP_Error|WP_REST_Response
+ */
+ public function get_items( $request ) {
+ $schema = $this->get_item_schema();
+ $mappings = $this->get_item_mappings();
+ $response = array();
+
+ foreach ( $mappings as $section => $values ) {
+ foreach ( $values as $key => $value ) {
+ if ( isset( $schema['properties'][ $section ]['properties'][ $key ]['type'] ) ) {
+ settype( $values[ $key ], $schema['properties'][ $section ]['properties'][ $key ]['type'] );
+ }
+ }
+ settype( $values, $schema['properties'][ $section ]['type'] );
+ $response[ $section ] = $values;
+ }
+
+ $response = $this->prepare_item_for_response( $response, $request );
+
+ return rest_ensure_response( $response );
+ }
+
+ /**
+ * Get the system status schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'system_status',
+ 'type' => 'object',
+ 'properties' => array(
+ 'environment' => array(
+ 'description' => __( 'Environment.', 'woocommerce' ),
+ 'type' => 'object',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ 'properties' => array(
+ 'home_url' => array(
+ 'description' => __( 'Home URL.', 'woocommerce' ),
+ 'type' => 'string',
+ 'format' => 'uri',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'site_url' => array(
+ 'description' => __( 'Site URL.', 'woocommerce' ),
+ 'type' => 'string',
+ 'format' => 'uri',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'wc_version' => array(
+ 'description' => __( 'WooCommerce version.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'log_directory' => array(
+ 'description' => __( 'Log directory.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'log_directory_writable' => array(
+ 'description' => __( 'Is log directory writable?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'wp_version' => array(
+ 'description' => __( 'WordPress version.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'wp_multisite' => array(
+ 'description' => __( 'Is WordPress multisite?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'wp_memory_limit' => array(
+ 'description' => __( 'WordPress memory limit.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'wp_debug_mode' => array(
+ 'description' => __( 'Is WordPress debug mode active?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'wp_cron' => array(
+ 'description' => __( 'Are WordPress cron jobs enabled?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'language' => array(
+ 'description' => __( 'WordPress language.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'server_info' => array(
+ 'description' => __( 'Server info.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'php_version' => array(
+ 'description' => __( 'PHP version.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'php_post_max_size' => array(
+ 'description' => __( 'PHP post max size.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'php_max_execution_time' => array(
+ 'description' => __( 'PHP max execution time.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'php_max_input_vars' => array(
+ 'description' => __( 'PHP max input vars.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'curl_version' => array(
+ 'description' => __( 'cURL version.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'suhosin_installed' => array(
+ 'description' => __( 'Is SUHOSIN installed?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'max_upload_size' => array(
+ 'description' => __( 'Max upload size.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'mysql_version' => array(
+ 'description' => __( 'MySQL version.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'mysql_version_string' => array(
+ 'description' => __( 'MySQL version string.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'default_timezone' => array(
+ 'description' => __( 'Default timezone.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'fsockopen_or_curl_enabled' => array(
+ 'description' => __( 'Is fsockopen/cURL enabled?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'soapclient_enabled' => array(
+ 'description' => __( 'Is SoapClient class enabled?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'domdocument_enabled' => array(
+ 'description' => __( 'Is DomDocument class enabled?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'gzip_enabled' => array(
+ 'description' => __( 'Is GZip enabled?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'mbstring_enabled' => array(
+ 'description' => __( 'Is mbstring enabled?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'remote_post_successful' => array(
+ 'description' => __( 'Remote POST successful?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'remote_post_response' => array(
+ 'description' => __( 'Remote POST response.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'remote_get_successful' => array(
+ 'description' => __( 'Remote GET successful?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'remote_get_response' => array(
+ 'description' => __( 'Remote GET response.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ ),
+ ),
+ 'database' => array(
+ 'description' => __( 'Database.', 'woocommerce' ),
+ 'type' => 'object',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ 'properties' => array(
+ 'wc_database_version' => array(
+ 'description' => __( 'WC database version.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'database_prefix' => array(
+ 'description' => __( 'Database prefix.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'maxmind_geoip_database' => array(
+ 'description' => __( 'MaxMind GeoIP database.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'database_tables' => array(
+ 'description' => __( 'Database tables.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ 'items' => array(
+ 'type' => 'string',
+ ),
+ ),
+ ),
+ ),
+ 'active_plugins' => array(
+ 'description' => __( 'Active plugins.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ 'items' => array(
+ 'type' => 'string',
+ ),
+ ),
+ 'theme' => array(
+ 'description' => __( 'Theme.', 'woocommerce' ),
+ 'type' => 'object',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ 'properties' => array(
+ 'name' => array(
+ 'description' => __( 'Theme name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'version' => array(
+ 'description' => __( 'Theme version.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'version_latest' => array(
+ 'description' => __( 'Latest version of theme.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'author_url' => array(
+ 'description' => __( 'Theme author URL.', 'woocommerce' ),
+ 'type' => 'string',
+ 'format' => 'uri',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'is_child_theme' => array(
+ 'description' => __( 'Is this theme a child theme?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'has_woocommerce_support' => array(
+ 'description' => __( 'Does the theme declare WooCommerce support?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'has_woocommerce_file' => array(
+ 'description' => __( 'Does the theme have a woocommerce.php file?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'has_outdated_templates' => array(
+ 'description' => __( 'Does this theme have outdated templates?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'overrides' => array(
+ 'description' => __( 'Template overrides.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ 'items' => array(
+ 'type' => 'string',
+ ),
+ ),
+ 'parent_name' => array(
+ 'description' => __( 'Parent theme name.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'parent_version' => array(
+ 'description' => __( 'Parent theme version.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'parent_author_url' => array(
+ 'description' => __( 'Parent theme author URL.', 'woocommerce' ),
+ 'type' => 'string',
+ 'format' => 'uri',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ ),
+ ),
+ 'settings' => array(
+ 'description' => __( 'Settings.', 'woocommerce' ),
+ 'type' => 'object',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ 'properties' => array(
+ 'api_enabled' => array(
+ 'description' => __( 'REST API enabled?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'force_ssl' => array(
+ 'description' => __( 'SSL forced?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'currency' => array(
+ 'description' => __( 'Currency.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'currency_symbol' => array(
+ 'description' => __( 'Currency symbol.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'currency_position' => array(
+ 'description' => __( 'Currency position.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'thousand_separator' => array(
+ 'description' => __( 'Thousand separator.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'decimal_separator' => array(
+ 'description' => __( 'Decimal separator.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'number_of_decimals' => array(
+ 'description' => __( 'Number of decimals.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'geolocation_enabled' => array(
+ 'description' => __( 'Geolocation enabled?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'taxonomies' => array(
+ 'description' => __( 'Taxonomy terms for product/order statuses.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ 'items' => array(
+ 'type' => 'string',
+ ),
+ ),
+ 'product_visibility_terms' => array(
+ 'description' => __( 'Terms in the product visibility taxonomy.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ 'items' => array(
+ 'type' => 'string',
+ ),
+ ),
+ ),
+ ),
+ 'security' => array(
+ 'description' => __( 'Security.', 'woocommerce' ),
+ 'type' => 'object',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ 'properties' => array(
+ 'secure_connection' => array(
+ 'description' => __( 'Is the connection to your store secure?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ 'hide_errors' => array(
+ 'description' => __( 'Hide errors from visitors?', 'woocommerce' ),
+ 'type' => 'boolean',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ ),
+ ),
+ ),
+ 'pages' => array(
+ 'description' => __( 'WooCommerce pages.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view' ),
+ 'readonly' => true,
+ 'items' => array(
+ 'type' => 'string',
+ ),
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+
+ /**
+ * Return an array of sections and the data associated with each.
+ *
+ * @return array
+ */
+ public function get_item_mappings() {
+ return array(
+ 'environment' => $this->get_environment_info(),
+ 'database' => $this->get_database_info(),
+ 'active_plugins' => $this->get_active_plugins(),
+ 'theme' => $this->get_theme_info(),
+ 'settings' => $this->get_settings(),
+ 'security' => $this->get_security_info(),
+ 'pages' => $this->get_pages(),
+ );
+ }
+
+ /**
+ * Get array of environment information. Includes thing like software
+ * versions, and various server settings.
+ *
+ * @return array
+ */
+ public function get_environment_info() {
+ global $wpdb;
+
+ // Figure out cURL version, if installed.
+ $curl_version = '';
+ if ( function_exists( 'curl_version' ) ) {
+ $curl_version = curl_version();
+ $curl_version = $curl_version['version'] . ', ' . $curl_version['ssl_version'];
+ }
+
+ // WP memory limit.
+ $wp_memory_limit = wc_let_to_num( WP_MEMORY_LIMIT );
+ if ( function_exists( 'memory_get_usage' ) ) {
+ $wp_memory_limit = max( $wp_memory_limit, wc_let_to_num( @ini_get( 'memory_limit' ) ) );
+ }
+
+ // Test POST requests.
+ $post_response = wp_safe_remote_post(
+ 'https://www.paypal.com/cgi-bin/webscr',
+ array(
+ 'timeout' => 10,
+ 'user-agent' => 'WooCommerce/' . WC()->version,
+ 'httpversion' => '1.1',
+ 'body' => array(
+ 'cmd' => '_notify-validate',
+ ),
+ )
+ );
+ $post_response_successful = false;
+ if ( ! is_wp_error( $post_response ) && $post_response['response']['code'] >= 200 && $post_response['response']['code'] < 300 ) {
+ $post_response_successful = true;
+ }
+
+ // Test GET requests.
+ $get_response = wp_safe_remote_get( 'https://woocommerce.com/wc-api/product-key-api?request=ping&network=' . ( is_multisite() ? '1' : '0' ) );
+ $get_response_successful = false;
+ if ( ! is_wp_error( $post_response ) && $post_response['response']['code'] >= 200 && $post_response['response']['code'] < 300 ) {
+ $get_response_successful = true;
+ }
+
+ $database_version = wc_get_server_database_version();
+
+ // Return all environment info. Described by JSON Schema.
+ return array(
+ 'home_url' => get_option( 'home' ),
+ 'site_url' => get_option( 'siteurl' ),
+ 'version' => WC()->version,
+ 'log_directory' => WC_LOG_DIR,
+ 'log_directory_writable' => (bool) @fopen( WC_LOG_DIR . 'test-log.log', 'a' ),
+ 'wp_version' => get_bloginfo( 'version' ),
+ 'wp_multisite' => is_multisite(),
+ 'wp_memory_limit' => $wp_memory_limit,
+ 'wp_debug_mode' => ( defined( 'WP_DEBUG' ) && WP_DEBUG ),
+ 'wp_cron' => ! ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ),
+ 'language' => get_locale(),
+ 'external_object_cache' => wp_using_ext_object_cache(),
+ 'server_info' => isset( $_SERVER['SERVER_SOFTWARE'] ) ? wc_clean( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) ) : '',
+ 'php_version' => phpversion(),
+ 'php_post_max_size' => wc_let_to_num( ini_get( 'post_max_size' ) ),
+ 'php_max_execution_time' => ini_get( 'max_execution_time' ),
+ 'php_max_input_vars' => ini_get( 'max_input_vars' ),
+ 'curl_version' => $curl_version,
+ 'suhosin_installed' => extension_loaded( 'suhosin' ),
+ 'max_upload_size' => wp_max_upload_size(),
+ 'mysql_version' => $database_version['number'],
+ 'mysql_version_string' => $database_version['string'],
+ 'default_timezone' => date_default_timezone_get(),
+ 'fsockopen_or_curl_enabled' => ( function_exists( 'fsockopen' ) || function_exists( 'curl_init' ) ),
+ 'soapclient_enabled' => class_exists( 'SoapClient' ),
+ 'domdocument_enabled' => class_exists( 'DOMDocument' ),
+ 'gzip_enabled' => is_callable( 'gzopen' ),
+ 'mbstring_enabled' => extension_loaded( 'mbstring' ),
+ 'remote_post_successful' => $post_response_successful,
+ 'remote_post_response' => ( is_wp_error( $post_response ) ? $post_response->get_error_message() : $post_response['response']['code'] ),
+ 'remote_get_successful' => $get_response_successful,
+ 'remote_get_response' => ( is_wp_error( $get_response ) ? $get_response->get_error_message() : $get_response['response']['code'] ),
+ );
+ }
+
+ /**
+ * Add prefix to table.
+ *
+ * @param string $table Table name.
+ * @return stromg
+ */
+ protected function add_db_table_prefix( $table ) {
+ global $wpdb;
+ return $wpdb->prefix . $table;
+ }
+
+ /**
+ * Get array of database information. Version, prefix, and table existence.
+ *
+ * @return array
+ */
+ public function get_database_info() {
+ global $wpdb;
+
+ $database_table_sizes = $wpdb->get_results(
+ $wpdb->prepare(
+ "SELECT
+ table_name AS 'name',
+ round( ( data_length / 1024 / 1024 ), 2 ) 'data',
+ round( ( index_length / 1024 / 1024 ), 2 ) 'index'
+ FROM information_schema.TABLES
+ WHERE table_schema = %s
+ ORDER BY name ASC;",
+ DB_NAME
+ )
+ );
+
+ // WC Core tables to check existence of.
+ $core_tables = apply_filters(
+ 'woocommerce_database_tables',
+ array(
+ 'woocommerce_sessions',
+ 'woocommerce_api_keys',
+ 'woocommerce_attribute_taxonomies',
+ 'woocommerce_downloadable_product_permissions',
+ 'woocommerce_order_items',
+ 'woocommerce_order_itemmeta',
+ 'woocommerce_tax_rates',
+ 'woocommerce_tax_rate_locations',
+ 'woocommerce_shipping_zones',
+ 'woocommerce_shipping_zone_locations',
+ 'woocommerce_shipping_zone_methods',
+ 'woocommerce_payment_tokens',
+ 'woocommerce_payment_tokenmeta',
+ 'woocommerce_log',
+ )
+ );
+
+ if ( get_option( 'db_version' ) < 34370 ) {
+ $core_tables[] = 'woocommerce_termmeta';
+ }
+
+ /**
+ * Adding the prefix to the tables array, for backwards compatibility.
+ *
+ * If we changed the tables above to include the prefix, then any filters against that table could break.
+ */
+ $core_tables = array_map( array( $this, 'add_db_table_prefix' ), $core_tables );
+
+ /**
+ * Organize WooCommerce and non-WooCommerce tables separately for display purposes later.
+ *
+ * To ensure we include all WC tables, even if they do not exist, pre-populate the WC array with all the tables.
+ */
+ $tables = array(
+ 'woocommerce' => array_fill_keys( $core_tables, false ),
+ 'other' => array(),
+ );
+
+ $database_size = array(
+ 'data' => 0,
+ 'index' => 0,
+ );
+
+ $site_tables_prefix = $wpdb->get_blog_prefix( get_current_blog_id() );
+ $global_tables = $wpdb->tables( 'global', true );
+ foreach ( $database_table_sizes as $table ) {
+ // Only include tables matching the prefix of the current site, this is to prevent displaying all tables on a MS install not relating to the current.
+ if ( is_multisite() && 0 !== strpos( $table->name, $site_tables_prefix ) && ! in_array( $table->name, $global_tables, true ) ) {
+ continue;
+ }
+ $table_type = in_array( $table->name, $core_tables ) ? 'woocommerce' : 'other';
+
+ $tables[ $table_type ][ $table->name ] = array(
+ 'data' => $table->data,
+ 'index' => $table->index,
+ );
+
+ $database_size['data'] += $table->data;
+ $database_size['index'] += $table->index;
+ }
+
+ // Return all database info. Described by JSON Schema.
+ return array(
+ 'wc_database_version' => get_option( 'woocommerce_db_version' ),
+ 'database_prefix' => $wpdb->prefix,
+ 'maxmind_geoip_database' => WC_Geolocation::get_local_database_path(),
+ 'database_tables' => $tables,
+ 'database_size' => $database_size,
+ );
+ }
+
+ /**
+ * Get array of counts of objects. Orders, products, etc.
+ *
+ * @return array
+ */
+ public function get_post_type_counts() {
+ global $wpdb;
+
+ $post_type_counts = $wpdb->get_results( "SELECT post_type AS 'type', count(1) AS 'count' FROM {$wpdb->posts} GROUP BY post_type;" );
+
+ return is_array( $post_type_counts ) ? $post_type_counts : array();
+ }
+
+ /**
+ * Get a list of plugins active on the site.
+ *
+ * @return array
+ */
+ public function get_active_plugins() {
+ require_once ABSPATH . 'wp-admin/includes/plugin.php';
+ require_once ABSPATH . 'wp-admin/includes/update.php';
+
+ if ( ! function_exists( 'get_plugin_updates' ) ) {
+ return array();
+ }
+
+ // Get both site plugins and network plugins.
+ $active_plugins = (array) get_option( 'active_plugins', array() );
+ if ( is_multisite() ) {
+ $network_activated_plugins = array_keys( get_site_option( 'active_sitewide_plugins', array() ) );
+ $active_plugins = array_merge( $active_plugins, $network_activated_plugins );
+ }
+
+ $active_plugins_data = array();
+ $available_updates = get_plugin_updates();
+
+ foreach ( $active_plugins as $plugin ) {
+ $data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin );
+ $dirname = dirname( $plugin );
+ $version_latest = '';
+ $slug = explode( '/', $plugin );
+ $slug = explode( '.', end( $slug ) );
+ $slug = $slug[0];
+
+ if ( 'woocommerce' !== $slug && ( strstr( $data['PluginURI'], 'woothemes.com' ) || strstr( $data['PluginURI'], 'woocommerce.com' ) ) ) {
+ $version_data = get_transient( md5( $plugin ) . '_version_data' );
+ if ( false === $version_data ) {
+ $changelog = wp_safe_remote_get( 'http://dzv365zjfbd8v.cloudfront.net/changelogs/' . $dirname . '/changelog.txt' );
+ if ( 200 === wp_remote_retrieve_response_code( $changelog ) ) {
+ $cl_lines = explode( "\n", wp_remote_retrieve_body( $changelog ) );
+ if ( ! empty( $cl_lines ) ) {
+ foreach ( $cl_lines as $line_num => $cl_line ) {
+ if ( preg_match( '/^[0-9]/', $cl_line ) ) {
+ $date = str_replace( '.', '-', trim( substr( $cl_line, 0, strpos( $cl_line, '-' ) ) ) );
+ $version = preg_replace( '~[^0-9,.]~', '', stristr( $cl_line, 'version' ) );
+ $update = trim( str_replace( '*', '', $cl_lines[ $line_num + 1 ] ) );
+ $version_data = array(
+ 'date' => $date,
+ 'version' => $version,
+ 'update' => $update,
+ 'changelog' => $changelog,
+ );
+ set_transient( md5( $plugin ) . '_version_data', $version_data, DAY_IN_SECONDS );
+ break;
+ }
+ }
+ }
+ } else {
+ $args = (object) array(
+ 'slug' => $dirname,
+ );
+ $request = array(
+ 'action' => 'plugin_information',
+ 'request' => serialize( $args ),
+ );
+ $plugin_info = wp_safe_remote_post( 'http://api.wordpress.org/plugins/info/1.0/', array( 'body' => $request ) );
+ if ( 200 === wp_remote_retrieve_response_code( $plugin_info ) ) {
+ $body = maybe_unserialize( wp_remote_retrieve_body( $plugin_info ) );
+ if ( is_object( $body ) && isset( $body->sections['changelog'] ) ) {
+ $version_data = array(
+ 'date' => $body->last_updated,
+ 'version' => $body->version,
+ 'update' => $body->sections['changelog'],
+ 'changelog' => $body->sections['changelog'],
+ );
+ set_transient( md5( $plugin ) . '_version_data', $version_data, DAY_IN_SECONDS );
+ }
+ }
+ }
+ }
+ $version_latest = $version_data['version'];
+ } elseif ( isset( $available_updates[ $plugin ]->update->new_version ) ) {
+ $version_latest = $available_updates[ $plugin ]->update->new_version;
+ }
+
+ // convert plugin data to json response format.
+ $active_plugins_data[] = array(
+ 'plugin' => $plugin,
+ 'name' => $data['Name'],
+ 'version' => $data['Version'],
+ 'version_latest' => $version_latest,
+ 'url' => $data['PluginURI'],
+ 'author_name' => $data['AuthorName'],
+ 'author_url' => esc_url_raw( $data['AuthorURI'] ),
+ 'network_activated' => $data['Network'],
+ );
+ }
+
+ return $active_plugins_data;
+ }
+
+ /**
+ * Get info on the current active theme, info on parent theme (if presnet)
+ * and a list of template overrides.
+ *
+ * @return array
+ */
+ public function get_theme_info() {
+ $active_theme = wp_get_theme();
+
+ // Get parent theme info if this theme is a child theme, otherwise
+ // pass empty info in the response.
+ if ( is_child_theme() ) {
+ $parent_theme = wp_get_theme( $active_theme->template );
+ $parent_theme_info = array(
+ 'parent_name' => $parent_theme->name,
+ 'parent_version' => $parent_theme->version,
+ 'parent_version_latest' => WC_Admin_Status::get_latest_theme_version( $parent_theme ),
+ 'parent_author_url' => $parent_theme->{'Author URI'},
+ );
+ } else {
+ $parent_theme_info = array(
+ 'parent_name' => '',
+ 'parent_version' => '',
+ 'parent_version_latest' => '',
+ 'parent_author_url' => '',
+ );
+ }
+
+ /**
+ * Scan the theme directory for all WC templates to see if our theme
+ * overrides any of them.
+ */
+ $override_files = array();
+ $outdated_templates = false;
+ $scan_files = WC_Admin_Status::scan_template_files( WC()->plugin_path() . '/templates/' );
+ foreach ( $scan_files as $file ) {
+ $located = apply_filters( 'wc_get_template', $file, $file, array(), WC()->template_path(), WC()->plugin_path() . '/templates/' );
+
+ if ( file_exists( $located ) ) {
+ $theme_file = $located;
+ } elseif ( file_exists( get_stylesheet_directory() . '/' . $file ) ) {
+ $theme_file = get_stylesheet_directory() . '/' . $file;
+ } elseif ( file_exists( get_stylesheet_directory() . '/' . WC()->template_path() . $file ) ) {
+ $theme_file = get_stylesheet_directory() . '/' . WC()->template_path() . $file;
+ } elseif ( file_exists( get_template_directory() . '/' . $file ) ) {
+ $theme_file = get_template_directory() . '/' . $file;
+ } elseif ( file_exists( get_template_directory() . '/' . WC()->template_path() . $file ) ) {
+ $theme_file = get_template_directory() . '/' . WC()->template_path() . $file;
+ } else {
+ $theme_file = false;
+ }
+
+ if ( ! empty( $theme_file ) ) {
+ $core_version = WC_Admin_Status::get_file_version( WC()->plugin_path() . '/templates/' . $file );
+ $theme_version = WC_Admin_Status::get_file_version( $theme_file );
+ if ( $core_version && ( empty( $theme_version ) || version_compare( $theme_version, $core_version, '<' ) ) ) {
+ if ( ! $outdated_templates ) {
+ $outdated_templates = true;
+ }
+ }
+ $override_files[] = array(
+ 'file' => str_replace( WP_CONTENT_DIR . '/themes/', '', $theme_file ),
+ 'version' => $theme_version,
+ 'core_version' => $core_version,
+ );
+ }
+ }
+
+ $active_theme_info = array(
+ 'name' => $active_theme->name,
+ 'version' => $active_theme->version,
+ 'version_latest' => WC_Admin_Status::get_latest_theme_version( $active_theme ),
+ 'author_url' => esc_url_raw( $active_theme->{'Author URI'} ),
+ 'is_child_theme' => is_child_theme(),
+ 'has_woocommerce_support' => current_theme_supports( 'woocommerce' ),
+ 'has_woocommerce_file' => ( file_exists( get_stylesheet_directory() . '/woocommerce.php' ) || file_exists( get_template_directory() . '/woocommerce.php' ) ),
+ 'has_outdated_templates' => $outdated_templates,
+ 'overrides' => $override_files,
+ );
+
+ return array_merge( $active_theme_info, $parent_theme_info );
+ }
+
+ /**
+ * Get some setting values for the site that are useful for debugging
+ * purposes. For full settings access, use the settings api.
+ *
+ * @return array
+ */
+ public function get_settings() {
+ // Get a list of terms used for product/order taxonomies.
+ $term_response = array();
+ $terms = get_terms( 'product_type', array( 'hide_empty' => 0 ) );
+ foreach ( $terms as $term ) {
+ $term_response[ $term->slug ] = strtolower( $term->name );
+ }
+
+ // Get a list of terms used for product visibility.
+ $product_visibility_terms = array();
+ $terms = get_terms( 'product_visibility', array( 'hide_empty' => 0 ) );
+ foreach ( $terms as $term ) {
+ $product_visibility_terms[ $term->slug ] = strtolower( $term->name );
+ }
+
+ // Return array of useful settings for debugging.
+ return array(
+ 'api_enabled' => 'yes' === get_option( 'woocommerce_api_enabled' ),
+ 'force_ssl' => 'yes' === get_option( 'woocommerce_force_ssl_checkout' ),
+ 'currency' => get_woocommerce_currency(),
+ 'currency_symbol' => get_woocommerce_currency_symbol(),
+ 'currency_position' => get_option( 'woocommerce_currency_pos' ),
+ 'thousand_separator' => wc_get_price_thousand_separator(),
+ 'decimal_separator' => wc_get_price_decimal_separator(),
+ 'number_of_decimals' => wc_get_price_decimals(),
+ 'geolocation_enabled' => in_array( get_option( 'woocommerce_default_customer_address' ), array( 'geolocation_ajax', 'geolocation' ) ),
+ 'taxonomies' => $term_response,
+ 'product_visibility_terms' => $product_visibility_terms,
+ );
+ }
+
+ /**
+ * Returns security tips.
+ *
+ * @return array
+ */
+ public function get_security_info() {
+ $check_page = 0 < wc_get_page_id( 'shop' ) ? get_permalink( wc_get_page_id( 'shop' ) ) : get_home_url();
+ return array(
+ 'secure_connection' => 'https' === substr( $check_page, 0, 5 ),
+ 'hide_errors' => ! ( defined( 'WP_DEBUG' ) && defined( 'WP_DEBUG_DISPLAY' ) && WP_DEBUG && WP_DEBUG_DISPLAY ) || 0 === intval( ini_get( 'display_errors' ) ),
+ );
+ }
+
+ /**
+ * Returns a mini-report on WC pages and if they are configured correctly:
+ * Present, visible, and including the correct shortcode.
+ *
+ * @return array
+ */
+ public function get_pages() {
+ // WC pages to check against.
+ $check_pages = array(
+ _x( 'Shop base', 'Page setting', 'woocommerce' ) => array(
+ 'option' => 'woocommerce_shop_page_id',
+ 'shortcode' => '',
+ ),
+ _x( 'Cart', 'Page setting', 'woocommerce' ) => array(
+ 'option' => 'woocommerce_cart_page_id',
+ 'shortcode' => '[' . apply_filters( 'woocommerce_cart_shortcode_tag', 'woocommerce_cart' ) . ']',
+ ),
+ _x( 'Checkout', 'Page setting', 'woocommerce' ) => array(
+ 'option' => 'woocommerce_checkout_page_id',
+ 'shortcode' => '[' . apply_filters( 'woocommerce_checkout_shortcode_tag', 'woocommerce_checkout' ) . ']',
+ ),
+ _x( 'My account', 'Page setting', 'woocommerce' ) => array(
+ 'option' => 'woocommerce_myaccount_page_id',
+ 'shortcode' => '[' . apply_filters( 'woocommerce_my_account_shortcode_tag', 'woocommerce_my_account' ) . ']',
+ ),
+ _x( 'Terms and conditions', 'Page setting', 'woocommerce' ) => array(
+ 'option' => 'woocommerce_terms_page_id',
+ 'shortcode' => '',
+ ),
+ );
+
+ $pages_output = array();
+ foreach ( $check_pages as $page_name => $values ) {
+ $page_id = get_option( $values['option'] );
+ $page_set = false;
+ $page_exists = false;
+ $page_visible = false;
+ $shortcode_present = false;
+ $shortcode_required = false;
+
+ // Page checks.
+ if ( $page_id ) {
+ $page_set = true;
+ }
+ if ( get_post( $page_id ) ) {
+ $page_exists = true;
+ }
+ if ( 'publish' === get_post_status( $page_id ) ) {
+ $page_visible = true;
+ }
+
+ // Shortcode checks.
+ if ( $values['shortcode'] && get_post( $page_id ) ) {
+ $shortcode_required = true;
+ $page = get_post( $page_id );
+ if ( strstr( $page->post_content, $values['shortcode'] ) ) {
+ $shortcode_present = true;
+ }
+ }
+
+ // Wrap up our findings into an output array.
+ $pages_output[] = array(
+ 'page_name' => $page_name,
+ 'page_id' => $page_id,
+ 'page_set' => $page_set,
+ 'page_exists' => $page_exists,
+ 'page_visible' => $page_visible,
+ 'shortcode' => $values['shortcode'],
+ 'shortcode_required' => $shortcode_required,
+ 'shortcode_present' => $shortcode_present,
+ );
+ }
+
+ return $pages_output;
+ }
+
+ /**
+ * Get any query params needed.
+ *
+ * @return array
+ */
+ public function get_collection_params() {
+ return array(
+ 'context' => $this->get_context_param( array( 'default' => 'view' ) ),
+ );
+ }
+
+ /**
+ * Prepare the system status response
+ *
+ * @param array $system_status System status data.
+ * @param WP_REST_Request $request Request object.
+ * @return WP_REST_Response
+ */
+ public function prepare_item_for_response( $system_status, $request ) {
+ $data = $this->add_additional_fields_to_object( $system_status, $request );
+ $data = $this->filter_response_by_context( $data, 'view' );
+
+ $response = rest_ensure_response( $data );
+
+ /**
+ * Filter the system status returned from the REST API.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param mixed $system_status System status
+ * @param WP_REST_Request $request Request object.
+ */
+ return apply_filters( 'woocommerce_rest_prepare_system_status', $response, $system_status, $request );
+ }
+}
diff --git a/includes/api/v2/class-wc-rest-tax-classes-v2-controller.php b/includes/api/v2/class-wc-rest-tax-classes-v2-controller.php
new file mode 100644
index 00000000000..cab4ad800ba
--- /dev/null
+++ b/includes/api/v2/class-wc-rest-tax-classes-v2-controller.php
@@ -0,0 +1,27 @@
+post_type}_invalid_id", __( 'ID is invalid.', 'woocommerce' ), array( 'status' => 400 ) );
+ }
+
+ $data = array(
+ 'id' => $webhook->get_id(),
+ 'name' => $webhook->get_name(),
+ 'status' => $webhook->get_status(),
+ 'topic' => $webhook->get_topic(),
+ 'resource' => $webhook->get_resource(),
+ 'event' => $webhook->get_event(),
+ 'hooks' => $webhook->get_hooks(),
+ 'delivery_url' => $webhook->get_delivery_url(),
+ 'date_created' => wc_rest_prepare_date_response( $webhook->get_date_created(), false ),
+ 'date_created_gmt' => wc_rest_prepare_date_response( $webhook->get_date_created() ),
+ 'date_modified' => wc_rest_prepare_date_response( $webhook->get_date_modified(), false ),
+ 'date_modified_gmt' => wc_rest_prepare_date_response( $webhook->get_date_modified() ),
+ );
+
+ $context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+ $data = $this->add_additional_fields_to_object( $data, $request );
+ $data = $this->filter_response_by_context( $data, $context );
+
+ // Wrap the data in a response object.
+ $response = rest_ensure_response( $data );
+
+ $response->add_links( $this->prepare_links( $webhook->get_id(), $request ) );
+
+ /**
+ * Filter webhook object returned from the REST API.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param WC_Webhook $webhook Webhook object used to create response.
+ * @param WP_REST_Request $request Request object.
+ */
+ return apply_filters( "woocommerce_rest_prepare_{$this->post_type}", $response, $webhook, $request );
+ }
+
+ /**
+ * Get the default REST API version.
+ *
+ * @since 3.0.0
+ * @return string
+ */
+ protected function get_default_api_version() {
+ return 'wp_api_v2';
+ }
+
+ /**
+ * Get the Webhook's schema, conforming to JSON Schema.
+ *
+ * @return array
+ */
+ public function get_item_schema() {
+ $schema = array(
+ '$schema' => 'http://json-schema.org/draft-04/schema#',
+ 'title' => 'webhook',
+ 'type' => 'object',
+ 'properties' => array(
+ 'id' => array(
+ 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ),
+ 'type' => 'integer',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'name' => array(
+ 'description' => __( 'A friendly name for the webhook.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'status' => array(
+ 'description' => __( 'Webhook status.', 'woocommerce' ),
+ 'type' => 'string',
+ 'default' => 'active',
+ 'enum' => array_keys( wc_get_webhook_statuses() ),
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'topic' => array(
+ 'description' => __( 'Webhook topic.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ ),
+ 'resource' => array(
+ 'description' => __( 'Webhook resource.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'event' => array(
+ 'description' => __( 'Webhook event.', 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'hooks' => array(
+ 'description' => __( 'WooCommerce action names associated with the webhook.', 'woocommerce' ),
+ 'type' => 'array',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ 'items' => array(
+ 'type' => 'string',
+ ),
+ ),
+ 'delivery_url' => array(
+ 'description' => __( 'The URL where the webhook payload is delivered.', 'woocommerce' ),
+ 'type' => 'string',
+ 'format' => 'uri',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'secret' => array(
+ 'description' => __( "Secret key used to generate a hash of the delivered webhook and provided in the request headers. This will default to a MD5 hash from the current user's ID|username if not provided.", 'woocommerce' ),
+ 'type' => 'string',
+ 'context' => array( 'edit' ),
+ ),
+ 'date_created' => array(
+ 'description' => __( "The date the webhook was created, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_created_gmt' => array(
+ 'description' => __( 'The date the webhook was created, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_modified' => array(
+ 'description' => __( "The date the webhook was last modified, in the site's timezone.", 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ 'date_modified_gmt' => array(
+ 'description' => __( 'The date the webhook was last modified, as GMT.', 'woocommerce' ),
+ 'type' => 'date-time',
+ 'context' => array( 'view', 'edit' ),
+ 'readonly' => true,
+ ),
+ ),
+ );
+
+ return $this->add_additional_fields_schema( $schema );
+ }
+}
diff --git a/includes/class-wc-ajax.php b/includes/class-wc-ajax.php
index bd6907d02c5..b496d9744b0 100644
--- a/includes/class-wc-ajax.php
+++ b/includes/class-wc-ajax.php
@@ -486,7 +486,7 @@ class WC_AJAX {
if ( wc_is_order_status( 'wc-' . $status ) && $order ) {
// Initialize payment gateways in case order has hooked status transition actions.
- wc()->payment_gateways();
+ WC()->payment_gateways();
$order->update_status( $status, '', true );
do_action( 'woocommerce_order_edit_status', $order->get_id(), $status );
@@ -612,6 +612,8 @@ class WC_AJAX {
wp_die( -1 );
}
+ $response = array();
+
try {
parse_str( $_POST['data'], $data );
@@ -624,14 +626,12 @@ class WC_AJAX {
$product->set_attributes( $attributes );
$product->save();
- $response = array();
-
ob_start();
$attributes = $product->get_attributes( 'edit' );
$i = -1;
foreach ( $data['attribute_names'] as $attribute_name ) {
- $attribute = isset( $attributes[ $attribute_name ] ) ? $attributes[ $attribute_name ] : false;
+ $attribute = isset( $attributes[ sanitize_title( $attribute_name ) ] ) ? $attributes[ sanitize_title( $attribute_name ) ] : false;
if ( ! $attribute ) {
continue;
}
@@ -647,12 +647,12 @@ class WC_AJAX {
}
$response['html'] = ob_get_clean();
-
- wp_send_json_success( $response );
} catch ( Exception $e ) {
wp_send_json_error( array( 'error' => $e->getMessage() ) );
}
- wp_die();
+
+ // wp_send_json_success must be outside the try block not to break phpunit tests.
+ wp_send_json_success( $response );
}
/**
@@ -847,6 +847,8 @@ class WC_AJAX {
wp_die( -1 );
}
+ $response = array();
+
try {
if ( ! isset( $_POST['order_id'] ) ) {
throw new Exception( __( 'Invalid order', 'woocommerce' ) );
@@ -897,14 +899,13 @@ class WC_AJAX {
ob_start();
include 'admin/meta-boxes/views/html-order-items.php';
- wp_send_json_success(
- array(
- 'html' => ob_get_clean(),
- )
- );
+ $response['html'] = ob_get_clean();
} catch ( Exception $e ) {
wp_send_json_error( array( 'error' => $e->getMessage() ) );
}
+
+ // wp_send_json_success must be outside the try block not to break phpunit tests.
+ wp_send_json_success( $response );
}
/**
@@ -917,6 +918,8 @@ class WC_AJAX {
wp_die( -1 );
}
+ $response = array();
+
try {
$order_id = absint( $_POST['order_id'] );
$amount = wc_clean( $_POST['amount'] );
@@ -944,7 +947,7 @@ class WC_AJAX {
$fee = new WC_Order_Item_Fee();
$fee->set_amount( $amount );
$fee->set_total( $amount );
- $fee->set_name( sprintf( __( '%s fee', 'woocommerce' ), $formatted_amount ) );
+ $fee->set_name( sprintf( __( '%s fee', 'woocommerce' ), wc_clean( $formatted_amount ) ) );
$order->add_item( $fee );
$order->calculate_taxes( $calculate_tax_args );
@@ -953,15 +956,13 @@ class WC_AJAX {
ob_start();
include 'admin/meta-boxes/views/html-order-items.php';
-
- wp_send_json_success(
- array(
- 'html' => ob_get_clean(),
- )
- );
+ $response['html'] = ob_get_clean();
} catch ( Exception $e ) {
wp_send_json_error( array( 'error' => $e->getMessage() ) );
}
+
+ // wp_send_json_success must be outside the try block not to break phpunit tests.
+ wp_send_json_success( $response );
}
/**
@@ -974,11 +975,13 @@ class WC_AJAX {
wp_die( -1 );
}
+ $response = array();
+
try {
$order_id = absint( $_POST['order_id'] );
$order = wc_get_order( $order_id );
$order_taxes = $order->get_taxes();
- $shipping_methods = WC()->shipping() ? WC()->shipping->load_shipping_methods() : array();
+ $shipping_methods = WC()->shipping() ? WC()->shipping()->load_shipping_methods() : array();
// Add new shipping
$item = new WC_Order_Item_Shipping();
@@ -988,15 +991,13 @@ class WC_AJAX {
ob_start();
include 'admin/meta-boxes/views/html-order-shipping.php';
-
- wp_send_json_success(
- array(
- 'html' => ob_get_clean(),
- )
- );
+ $response['html'] = ob_get_clean();
} catch ( Exception $e ) {
wp_send_json_error( array( 'error' => $e->getMessage() ) );
}
+
+ // wp_send_json_success must be outside the try block not to break phpunit tests.
+ wp_send_json_success( $response );
}
/**
@@ -1009,6 +1010,8 @@ class WC_AJAX {
wp_die( -1 );
}
+ $response = array();
+
try {
$order_id = absint( $_POST['order_id'] );
$rate_id = absint( $_POST['rate_id'] );
@@ -1023,15 +1026,13 @@ class WC_AJAX {
ob_start();
include 'admin/meta-boxes/views/html-order-items.php';
-
- wp_send_json_success(
- array(
- 'html' => ob_get_clean(),
- )
- );
+ $response['html'] = ob_get_clean();
} catch ( Exception $e ) {
wp_send_json_error( array( 'error' => $e->getMessage() ) );
}
+
+ // wp_send_json_success must be outside the try block not to break phpunit tests.
+ wp_send_json_success( $response );
}
/**
@@ -1044,6 +1045,8 @@ class WC_AJAX {
wp_die( -1 );
}
+ $response = array();
+
try {
$order_id = absint( $_POST['order_id'] );
$order = wc_get_order( $order_id );
@@ -1055,15 +1058,13 @@ class WC_AJAX {
ob_start();
include 'admin/meta-boxes/views/html-order-items.php';
-
- wp_send_json_success(
- array(
- 'html' => ob_get_clean(),
- )
- );
+ $response['html'] = ob_get_clean();
} catch ( Exception $e ) {
wp_send_json_error( array( 'error' => $e->getMessage() ) );
}
+
+ // wp_send_json_success must be outside the try block not to break phpunit tests.
+ wp_send_json_success( $response );
}
/**
@@ -1076,6 +1077,8 @@ class WC_AJAX {
wp_die( -1 );
}
+ $response = array();
+
try {
$order_id = absint( $_POST['order_id'] );
$order = wc_get_order( $order_id );
@@ -1084,15 +1087,13 @@ class WC_AJAX {
ob_start();
include 'admin/meta-boxes/views/html-order-items.php';
-
- wp_send_json_success(
- array(
- 'html' => ob_get_clean(),
- )
- );
+ $response['html'] = ob_get_clean();
} catch ( Exception $e ) {
wp_send_json_error( array( 'error' => $e->getMessage() ) );
}
+
+ // wp_send_json_success must be outside the try block not to break phpunit tests.
+ wp_send_json_success( $response );
}
/**
@@ -1105,6 +1106,8 @@ class WC_AJAX {
wp_die( -1 );
}
+ $response = array();
+
try {
$order_id = absint( $_POST['order_id'] );
$order_item_ids = $_POST['order_item_ids'];
@@ -1140,15 +1143,13 @@ class WC_AJAX {
ob_start();
include 'admin/meta-boxes/views/html-order-items.php';
-
- wp_send_json_success(
- array(
- 'html' => ob_get_clean(),
- )
- );
+ $response['html'] = ob_get_clean();
} catch ( Exception $e ) {
wp_send_json_error( array( 'error' => $e->getMessage() ) );
}
+
+ // wp_send_json_success must be outside the try block not to break phpunit tests.
+ wp_send_json_success( $response );
}
/**
@@ -1161,6 +1162,8 @@ class WC_AJAX {
wp_die( -1 );
}
+ $response = array();
+
try {
$order_id = absint( $_POST['order_id'] );
$rate_id = absint( $_POST['rate_id'] );
@@ -1172,15 +1175,13 @@ class WC_AJAX {
ob_start();
include 'admin/meta-boxes/views/html-order-items.php';
-
- wp_send_json_success(
- array(
- 'html' => ob_get_clean(),
- )
- );
+ $response['html'] = ob_get_clean();
} catch ( Exception $e ) {
wp_send_json_error( array( 'error' => $e->getMessage() ) );
}
+
+ // wp_send_json_success must be outside the try block not to break phpunit tests.
+ wp_send_json_success( $response );
}
/**
@@ -1287,7 +1288,7 @@ class WC_AJAX {
?>
- content ) ) ); ?>
+ content ) ) ) ); ?>
@@ -1429,9 +1430,8 @@ class WC_AJAX {
wp_die( -1 );
}
- $term = wc_clean( wp_unslash( $_GET['term'] ) );
- $exclude = array();
- $limit = '';
+ $term = wc_clean( wp_unslash( $_GET['term'] ) );
+ $limit = 0;
if ( empty( $term ) ) {
wp_die();
@@ -1633,7 +1633,7 @@ class WC_AJAX {
$api_refund = 'true' === $_POST['api_refund'];
$restock_refunded_items = 'true' === $_POST['restock_refunded_items'];
$refund = false;
- $response_data = array();
+ $response = array();
try {
$order = wc_get_order( $order_id );
@@ -1686,14 +1686,14 @@ class WC_AJAX {
}
if ( did_action( 'woocommerce_order_fully_refunded' ) ) {
- $response_data['status'] = 'fully_refunded';
+ $response['status'] = 'fully_refunded';
}
-
- wp_send_json_success( $response_data );
-
} catch ( Exception $e ) {
wp_send_json_error( array( 'error' => $e->getMessage() ) );
}
+
+ // wp_send_json_success must be outside the try block not to break phpunit tests.
+ wp_send_json_success( $response );
}
/**
@@ -1743,6 +1743,8 @@ class WC_AJAX {
wp_die( -1 );
}
+ $response = array();
+
try {
if ( empty( $_POST['description'] ) ) {
throw new Exception( __( 'Description is missing.', 'woocommerce' ) );
@@ -1759,6 +1761,13 @@ class WC_AJAX {
$permissions = ( in_array( $_POST['permissions'], array( 'read', 'write', 'read_write' ) ) ) ? sanitize_text_field( $_POST['permissions'] ) : 'read';
$user_id = absint( $_POST['user'] );
+ // Check if current user can edit other users.
+ if ( $user_id && ! current_user_can( 'edit_user', $user_id ) ) {
+ if ( get_current_user_id() !== $user_id ) {
+ throw new Exception( __( 'You do not have permission to assign API Keys to the selected user.', 'woocommerce' ) );
+ }
+ }
+
if ( 0 < $key_id ) {
$data = array(
'user_id' => $user_id,
@@ -1778,9 +1787,10 @@ class WC_AJAX {
array( '%d' )
);
- $data['consumer_key'] = '';
- $data['consumer_secret'] = '';
- $data['message'] = __( 'API Key updated successfully.', 'woocommerce' );
+ $response = $data;
+ $response['consumer_key'] = '';
+ $response['consumer_secret'] = '';
+ $response['message'] = __( 'API Key updated successfully.', 'woocommerce' );
} else {
$consumer_key = 'ck_' . wc_rand_hash();
$consumer_secret = 'cs_' . wc_rand_hash();
@@ -1807,17 +1817,19 @@ class WC_AJAX {
)
);
- $key_id = $wpdb->insert_id;
- $data['consumer_key'] = $consumer_key;
- $data['consumer_secret'] = $consumer_secret;
- $data['message'] = __( 'API Key generated successfully. Make sure to copy your new keys now as the secret key will be hidden once you leave this page.', 'woocommerce' );
- $data['revoke_url'] = '' . __( 'Revoke key', 'woocommerce' ) . ' ';
+ $key_id = $wpdb->insert_id;
+ $response = $data;
+ $response['consumer_key'] = $consumer_key;
+ $response['consumer_secret'] = $consumer_secret;
+ $response['message'] = __( 'API Key generated successfully. Make sure to copy your new keys now as the secret key will be hidden once you leave this page.', 'woocommerce' );
+ $response['revoke_url'] = '' . __( 'Revoke key', 'woocommerce' ) . ' ';
}
-
- wp_send_json_success( $data );
} catch ( Exception $e ) {
wp_send_json_error( array( 'message' => $e->getMessage() ) );
}
+
+ // wp_send_json_success must be outside the try block not to break phpunit tests.
+ wp_send_json_success( $response );
}
/**
@@ -2353,7 +2365,7 @@ class WC_AJAX {
wp_die();
}
- $changes = $_POST['changes'];
+ $changes = stripslashes_deep( $_POST['changes'] );
foreach ( $changes as $tax_rate_id => $data ) {
if ( isset( $data['deleted'] ) ) {
if ( isset( $data['newRow'] ) ) {
diff --git a/includes/class-wc-api.php b/includes/class-wc-api.php
index 286a1e9b2b3..a63e6aed598 100644
--- a/includes/class-wc-api.php
+++ b/includes/class-wc-api.php
@@ -167,6 +167,39 @@ class WC_API extends WC_Legacy_API {
include_once dirname( __FILE__ ) . '/api/legacy/class-wc-rest-legacy-products-controller.php';
// REST API v2 controllers.
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-coupons-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-customer-downloads-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-customers-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-orders-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-network-orders-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-order-notes-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-order-refunds-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-product-attribute-terms-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-product-attributes-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-product-categories-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-product-reviews-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-product-shipping-classes-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-product-tags-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-products-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-product-variations-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-report-sales-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-report-top-sellers-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-reports-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-settings-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-setting-options-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-shipping-zones-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-shipping-zone-locations-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-tax-classes-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-taxes-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-webhook-deliveries-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-webhooks-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-system-status-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-system-status-tools-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-shipping-methods-v2-controller.php';
+ include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-payment-gateways-v2-controller.php';
+
+ // REST API v3 controllers.
include_once dirname( __FILE__ ) . '/api/class-wc-rest-coupons-controller.php';
include_once dirname( __FILE__ ) . '/api/class-wc-rest-customer-downloads-controller.php';
include_once dirname( __FILE__ ) . '/api/class-wc-rest-customers-controller.php';
@@ -182,9 +215,14 @@ class WC_API extends WC_Legacy_API {
include_once dirname( __FILE__ ) . '/api/class-wc-rest-product-tags-controller.php';
include_once dirname( __FILE__ ) . '/api/class-wc-rest-products-controller.php';
include_once dirname( __FILE__ ) . '/api/class-wc-rest-product-variations-controller.php';
+ include_once dirname( __FILE__ ) . '/api/class-wc-rest-reports-controller.php';
include_once dirname( __FILE__ ) . '/api/class-wc-rest-report-sales-controller.php';
include_once dirname( __FILE__ ) . '/api/class-wc-rest-report-top-sellers-controller.php';
- include_once dirname( __FILE__ ) . '/api/class-wc-rest-reports-controller.php';
+ include_once dirname( __FILE__ ) . '/api/class-wc-rest-report-orders-totals-controller.php';
+ include_once dirname( __FILE__ ) . '/api/class-wc-rest-report-products-totals-controller.php';
+ include_once dirname( __FILE__ ) . '/api/class-wc-rest-report-customers-totals-controller.php';
+ include_once dirname( __FILE__ ) . '/api/class-wc-rest-report-coupons-totals-controller.php';
+ include_once dirname( __FILE__ ) . '/api/class-wc-rest-report-reviews-totals-controller.php';
include_once dirname( __FILE__ ) . '/api/class-wc-rest-settings-controller.php';
include_once dirname( __FILE__ ) . '/api/class-wc-rest-setting-options-controller.php';
include_once dirname( __FILE__ ) . '/api/class-wc-rest-shipping-zones-controller.php';
@@ -192,12 +230,15 @@ class WC_API extends WC_Legacy_API {
include_once dirname( __FILE__ ) . '/api/class-wc-rest-shipping-zone-methods-controller.php';
include_once dirname( __FILE__ ) . '/api/class-wc-rest-tax-classes-controller.php';
include_once dirname( __FILE__ ) . '/api/class-wc-rest-taxes-controller.php';
- include_once dirname( __FILE__ ) . '/api/class-wc-rest-webhook-deliveries-controller.php';
include_once dirname( __FILE__ ) . '/api/class-wc-rest-webhooks-controller.php';
include_once dirname( __FILE__ ) . '/api/class-wc-rest-system-status-controller.php';
include_once dirname( __FILE__ ) . '/api/class-wc-rest-system-status-tools-controller.php';
include_once dirname( __FILE__ ) . '/api/class-wc-rest-shipping-methods-controller.php';
include_once dirname( __FILE__ ) . '/api/class-wc-rest-payment-gateways-controller.php';
+ include_once dirname( __FILE__ ) . '/api/class-wc-rest-data-controller.php';
+ include_once dirname( __FILE__ ) . '/api/class-wc-rest-data-continents-controller.php';
+ include_once dirname( __FILE__ ) . '/api/class-wc-rest-data-countries-controller.php';
+ include_once dirname( __FILE__ ) . '/api/class-wc-rest-data-currencies-controller.php';
}
/**
@@ -210,7 +251,7 @@ class WC_API extends WC_Legacy_API {
$this->register_wp_admin_settings();
$controllers = array(
- // v1 controllers.
+ // REST API v1 controllers.
'WC_REST_Coupons_V1_Controller',
'WC_REST_Customer_Downloads_V1_Controller',
'WC_REST_Customers_V1_Controller',
@@ -232,7 +273,40 @@ class WC_API extends WC_Legacy_API {
'WC_REST_Webhook_Deliveries_V1_Controller',
'WC_REST_Webhooks_V1_Controller',
- // v2 controllers.
+ // REST API v2 controllers.
+ 'WC_REST_Coupons_V2_Controller',
+ 'WC_REST_Customer_Downloads_V2_Controller',
+ 'WC_REST_Customers_V2_Controller',
+ 'WC_REST_Network_Orders_V2_Controller',
+ 'WC_REST_Order_Notes_V2_Controller',
+ 'WC_REST_Order_Refunds_V2_Controller',
+ 'WC_REST_Orders_V2_Controller',
+ 'WC_REST_Product_Attribute_Terms_V2_Controller',
+ 'WC_REST_Product_Attributes_V2_Controller',
+ 'WC_REST_Product_Categories_V2_Controller',
+ 'WC_REST_Product_Reviews_V2_Controller',
+ 'WC_REST_Product_Shipping_Classes_V2_Controller',
+ 'WC_REST_Product_Tags_V2_Controller',
+ 'WC_REST_Products_V2_Controller',
+ 'WC_REST_Product_Variations_V2_Controller',
+ 'WC_REST_Report_Sales_V2_Controller',
+ 'WC_REST_Report_Top_Sellers_V2_Controller',
+ 'WC_REST_Reports_V2_Controller',
+ 'WC_REST_Settings_V2_Controller',
+ 'WC_REST_Setting_Options_V2_Controller',
+ 'WC_REST_Shipping_Zones_V2_Controller',
+ 'WC_REST_Shipping_Zone_Locations_V2_Controller',
+ 'WC_REST_Shipping_Zone_Methods_V2_Controller',
+ 'WC_REST_Tax_Classes_V2_Controller',
+ 'WC_REST_Taxes_V2_Controller',
+ 'WC_REST_Webhook_Deliveries_V2_Controller',
+ 'WC_REST_Webhooks_V2_Controller',
+ 'WC_REST_System_Status_V2_Controller',
+ 'WC_REST_System_Status_Tools_V2_Controller',
+ 'WC_REST_Shipping_Methods_V2_Controller',
+ 'WC_REST_Payment_Gateways_V2_Controller',
+
+ // REST API v3 controllers.
'WC_REST_Coupons_Controller',
'WC_REST_Customer_Downloads_Controller',
'WC_REST_Customers_Controller',
@@ -250,6 +324,11 @@ class WC_API extends WC_Legacy_API {
'WC_REST_Product_Variations_Controller',
'WC_REST_Report_Sales_Controller',
'WC_REST_Report_Top_Sellers_Controller',
+ 'WC_REST_Report_Orders_Totals_Controller',
+ 'WC_REST_Report_Products_Totals_Controller',
+ 'WC_REST_Report_Customers_Totals_Controller',
+ 'WC_REST_Report_Coupons_Totals_Controller',
+ 'WC_REST_Report_Reviews_Totals_Controller',
'WC_REST_Reports_Controller',
'WC_REST_Settings_Controller',
'WC_REST_Setting_Options_Controller',
@@ -258,12 +337,15 @@ class WC_API extends WC_Legacy_API {
'WC_REST_Shipping_Zone_Methods_Controller',
'WC_REST_Tax_Classes_Controller',
'WC_REST_Taxes_Controller',
- 'WC_REST_Webhook_Deliveries_Controller',
'WC_REST_Webhooks_Controller',
'WC_REST_System_Status_Controller',
'WC_REST_System_Status_Tools_Controller',
'WC_REST_Shipping_Methods_Controller',
'WC_REST_Payment_Gateways_Controller',
+ 'WC_REST_Data_Controller',
+ 'WC_REST_Data_Continents_Controller',
+ 'WC_REST_Data_Countries_Controller',
+ 'WC_REST_Data_Currencies_Controller',
);
foreach ( $controllers as $controller ) {
diff --git a/includes/class-wc-breadcrumb.php b/includes/class-wc-breadcrumb.php
index 85d126dfd12..142aa5a7fcd 100644
--- a/includes/class-wc-breadcrumb.php
+++ b/includes/class-wc-breadcrumb.php
@@ -140,6 +140,10 @@ class WC_Breadcrumb {
$post = get_post( $post_id ); // WPCS: override ok.
}
+ if ( ! $permalink ) {
+ $permalink = get_permalink( $post );
+ }
+
if ( 'product' === get_post_type( $post ) ) {
$this->prepend_shop_page();
@@ -209,7 +213,7 @@ class WC_Breadcrumb {
$this->prepend_shop_page();
$this->term_ancestors( $current_term->term_id, 'product_cat' );
- $this->add_crumb( $current_term->name );
+ $this->add_crumb( $current_term->name, get_term_link( $current_term, 'product_cat' ) );
}
/**
@@ -221,7 +225,7 @@ class WC_Breadcrumb {
$this->prepend_shop_page();
/* translators: %s: product tag */
- $this->add_crumb( sprintf( __( 'Products tagged “%s”', 'woocommerce' ), $current_term->name ) );
+ $this->add_crumb( sprintf( __( 'Products tagged “%s”', 'woocommerce' ), $current_term->name ), get_term_link( $current_term, 'product_tag' ) );
}
/**
diff --git a/includes/class-wc-cache-helper.php b/includes/class-wc-cache-helper.php
index fe0398775f5..e79bc5b1135 100644
--- a/includes/class-wc-cache-helper.php
+++ b/includes/class-wc-cache-helper.php
@@ -181,7 +181,7 @@ class WC_Cache_Helper {
return;
}
- $affected = $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s ORDER BY option_id LIMIT %d;", '\_transient\_%' . $version, $limit ) ); // WPCS: cache ok, db call ok.
+ $affected = $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s LIMIT %d;", '\_transient\_%' . $version, $limit ) ); // WPCS: cache ok, db call ok.
// If affected rows is equal to limit, there are more rows to delete. Delete in 30 secs.
if ( $affected === $limit ) {
diff --git a/includes/class-wc-cart-session.php b/includes/class-wc-cart-session.php
index 3f970939796..71d58e2cecf 100644
--- a/includes/class-wc-cart-session.php
+++ b/includes/class-wc-cart-session.php
@@ -61,6 +61,7 @@ final class WC_Cart_Session {
* @since 3.2.0
*/
public function get_cart_from_session() {
+ do_action( 'woocommerce_load_cart_from_session' );
$this->cart->set_totals( WC()->session->get( 'cart_totals', null ) );
$this->cart->set_applied_coupons( WC()->session->get( 'applied_coupons', array() ) );
$this->cart->set_coupon_discount_totals( WC()->session->get( 'coupon_discount_totals', array() ) );
@@ -68,6 +69,7 @@ final class WC_Cart_Session {
$this->cart->set_removed_cart_contents( WC()->session->get( 'removed_cart_contents', array() ) );
$update_cart_session = false; // Flag to indicate the stored cart should be updated.
+ $order_again = false; // Flag to indicate whether this is a re-order.
$cart = WC()->session->get( 'cart', null );
$merge_saved_cart = (bool) get_user_meta( get_current_user_id(), '_woocommerce_load_saved_cart_after_login', true );
@@ -83,7 +85,8 @@ final class WC_Cart_Session {
// Populate cart from order.
if ( isset( $_GET['order_again'], $_GET['_wpnonce'] ) && is_user_logged_in() && wp_verify_nonce( wp_unslash( $_GET['_wpnonce'] ), 'woocommerce-order_again' ) ) { // WPCS: input var ok, sanitization ok.
- $cart = $this->populate_cart_from_order( absint( $_GET['order_again'] ), $cart ); // WPCS: input var ok.
+ $cart = $this->populate_cart_from_order( absint( $_GET['order_again'] ), $cart ); // WPCS: input var ok.
+ $order_again = true;
}
// Prime caches to reduce future queries.
@@ -117,7 +120,8 @@ final class WC_Cart_Session {
} else {
// Put session data into array. Run through filter so other plugins can load their own session data.
$session_data = array_merge(
- $values, array(
+ $values,
+ array(
'data' => $product,
)
);
@@ -141,6 +145,12 @@ final class WC_Cart_Session {
WC()->session->set( 'cart', $this->get_cart_for_session() );
$this->cart->calculate_totals();
}
+
+ // If this is a re-order, redirect to the cart page to get rid of the `order_again` query string.
+ if ( $order_again ) {
+ wp_safe_redirect( wc_get_page_permalink( 'cart' ) );
+ exit;
+ }
}
/**
@@ -209,7 +219,9 @@ final class WC_Cart_Session {
public function persistent_cart_update() {
if ( get_current_user_id() && apply_filters( 'woocommerce_persistent_cart_enabled', true ) ) {
update_user_meta(
- get_current_user_id(), '_woocommerce_persistent_cart_' . get_current_blog_id(), array(
+ get_current_user_id(),
+ '_woocommerce_persistent_cart_' . get_current_blog_id(),
+ array(
'cart' => $this->get_cart_for_session(),
)
);
@@ -300,6 +312,11 @@ final class WC_Cart_Session {
continue;
}
+ // Prevent reordering items specifically out of stock.
+ if ( ! $product->is_in_stock() ) {
+ continue;
+ }
+
foreach ( $item->get_meta_data() as $meta ) {
if ( taxonomy_is_product_attribute( $meta->key ) ) {
$term = get_term_by( 'slug', $meta->value, $meta->key );
@@ -317,8 +334,10 @@ final class WC_Cart_Session {
$cart_id = WC()->cart->generate_cart_id( $product_id, $variation_id, $variations, $cart_item_data );
$product_data = wc_get_product( $variation_id ? $variation_id : $product_id );
$cart[ $cart_id ] = apply_filters(
- 'woocommerce_add_cart_item', array_merge(
- $cart_item_data, array(
+ 'woocommerce_add_order_again_cart_item',
+ array_merge(
+ $cart_item_data,
+ array(
'key' => $cart_id,
'product_id' => $product_id,
'variation_id' => $variation_id,
@@ -327,11 +346,12 @@ final class WC_Cart_Session {
'data' => $product_data,
'data_hash' => wc_get_cart_item_data_hash( $product_data ),
)
- ), $cart_id
+ ),
+ $cart_id
);
}
- do_action( 'woocommerce_ordered_again', $order->get_id() );
+ do_action( 'woocommerce_ordered_again', $order->get_id(), $order_items, $cart );
$num_items_in_cart = count( $cart );
$num_items_in_original_order = count( $order_items );
@@ -344,10 +364,10 @@ final class WC_Cart_Session {
_n(
'%d item from your previous order is currently unavailable and could not be added to your cart.',
'%d items from your previous order are currently unavailable and could not be added to your cart.',
- $num_items_added,
+ $num_items_in_original_order - $num_items_added,
'woocommerce'
),
- $num_items_added
+ $num_items_in_original_order - $num_items_added
),
'error'
);
diff --git a/includes/class-wc-cart.php b/includes/class-wc-cart.php
index 3e5e8db3eac..9d0dde7aab4 100644
--- a/includes/class-wc-cart.php
+++ b/includes/class-wc-cart.php
@@ -104,7 +104,7 @@ class WC_Cart extends WC_Legacy_Cart {
public function __construct() {
$this->session = new WC_Cart_Session( $this );
$this->fees_api = new WC_Cart_Fees( $this );
- $this->tax_display_cart = get_option( 'woocommerce_tax_display_cart' );
+ $this->tax_display_cart = $this->is_tax_displayed();
// Register hooks for the objects.
$this->session->init();
@@ -143,7 +143,7 @@ class WC_Cart extends WC_Legacy_Cart {
* @return array of cart items
*/
public function get_cart_contents() {
- return (array) $this->cart_contents;
+ return apply_filters( 'woocommerce_get_cart_contents', (array) $this->cart_contents );
}
/**
@@ -401,7 +401,7 @@ class WC_Cart extends WC_Legacy_Cart {
}
/**
- * Return all calculated coupon totals.
+ * Sets the array of calculated coupon totals.
*
* @since 3.2.0
* @param array $value Value to set.
@@ -410,7 +410,7 @@ class WC_Cart extends WC_Legacy_Cart {
$this->coupon_discount_totals = (array) $value;
}
/**
- * Return all calculated coupon tax totals.
+ * Sets the array of calculated coupon tax totals.
*
* @since 3.2.0
* @param array $value Value to set.
@@ -603,7 +603,7 @@ class WC_Cart extends WC_Legacy_Cart {
if ( ! did_action( 'wp_loaded' ) ) {
wc_doing_it_wrong( __FUNCTION__, __( 'Get cart should not be called before the wp_loaded action.', 'woocommerce' ), '2.3' );
}
- if ( ! did_action( 'woocommerce_cart_loaded_from_session' ) ) {
+ if ( ! did_action( 'woocommerce_load_cart_from_session' ) ) {
$this->session->get_cart_from_session();
}
return array_filter( $this->get_cart_contents() );
@@ -778,7 +778,7 @@ class WC_Cart extends WC_Legacy_Cart {
}
// Check stock based on all items in the cart and consider any held stock within pending orders.
- $held_stock = wc_get_held_stock_quantity( $product, $current_session_order_id );
+ $held_stock = ( $hold_stock_minutes > 0 ) ? wc_get_held_stock_quantity( $product, $current_session_order_id ) : 0;
$required_stock = $product_qty_in_cart[ $product->get_stock_managed_by_id() ];
if ( $product->get_stock_quantity() < ( $held_stock + $required_stock ) ) {
@@ -1079,8 +1079,10 @@ class WC_Cart extends WC_Legacy_Cart {
// Add item after merging with $cart_item_data - hook to allow plugins to modify cart item.
$this->cart_contents[ $cart_item_key ] = apply_filters(
- 'woocommerce_add_cart_item', array_merge(
- $cart_item_data, array(
+ 'woocommerce_add_cart_item',
+ array_merge(
+ $cart_item_data,
+ array(
'key' => $cart_item_key,
'product_id' => $product_id,
'variation_id' => $variation_id,
@@ -1089,7 +1091,8 @@ class WC_Cart extends WC_Legacy_Cart {
'data' => $product_data,
'data_hash' => wc_get_cart_item_data_hash( $product_data ),
)
- ), $cart_item_key
+ ),
+ $cart_item_key
);
}
@@ -1226,7 +1229,7 @@ class WC_Cart extends WC_Legacy_Cart {
* Uses the shipping class to calculate shipping then gets the totals when its finished.
*/
public function calculate_shipping() {
- $this->shipping_methods = $this->needs_shipping() ? $this->get_chosen_shipping_methods( WC()->shipping->calculate_shipping( $this->get_shipping_packages() ) ) : array();
+ $this->shipping_methods = $this->needs_shipping() ? $this->get_chosen_shipping_methods( WC()->shipping()->calculate_shipping( $this->get_shipping_packages() ) ) : array();
$shipping_taxes = wp_list_pluck( $this->shipping_methods, 'taxes' );
$merged_taxes = array();
@@ -1317,6 +1320,7 @@ class WC_Cart extends WC_Legacy_Cart {
'postcode' => $this->get_customer()->get_shipping_postcode(),
'city' => $this->get_customer()->get_shipping_city(),
'address' => $this->get_customer()->get_shipping_address(),
+ 'address_1' => $this->get_customer()->get_shipping_address(), // Provide both address and address_1 for backwards compatibility.
'address_2' => $this->get_customer()->get_shipping_address_2(),
),
'cart_subtotal' => $this->get_displayed_subtotal(),
@@ -1373,11 +1377,6 @@ class WC_Cart extends WC_Legacy_Cart {
}
}
- // If we're on the cart page, the user has not calculated shipping, and there is no calculator available, hide the area.
- if ( is_cart() && ! $this->get_customer()->has_calculated_shipping() && 'no' === get_option( 'woocommerce_enable_shipping_calc' ) ) {
- return false;
- }
-
return apply_filters( 'woocommerce_cart_ready_to_calc_shipping', true );
}
@@ -1431,8 +1430,10 @@ class WC_Cart extends WC_Legacy_Cart {
$check_emails = array_unique(
array_filter(
array_map(
- 'strtolower', array_map(
- 'sanitize_email', array(
+ 'strtolower',
+ array_map(
+ 'sanitize_email',
+ array(
$billing_email,
$current_user->user_email,
)
@@ -1511,7 +1512,7 @@ class WC_Cart extends WC_Legacy_Cart {
// Go through the allowed emails and return true if the email matches a wildcard.
foreach ( $restrictions as $restriction ) {
// Convert to PHP-regex syntax.
- $regex = '/' . str_replace( '*', '(.+)?', $restriction ) . '/';
+ $regex = '/^' . str_replace( '*', '(.+)?', $restriction ) . '$/';
preg_match( $regex, $check_email, $match );
if ( ! empty( $match ) ) {
return true;
@@ -1608,7 +1609,7 @@ class WC_Cart extends WC_Legacy_Cart {
// Choose free shipping.
if ( $the_coupon->get_free_shipping() ) {
- $packages = WC()->shipping->get_packages();
+ $packages = WC()->shipping()->get_packages();
$chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' );
foreach ( $packages as $i => $package ) {
@@ -1940,4 +1941,17 @@ class WC_Cart extends WC_Legacy_Cart {
$this->fees_api->remove_all_fees();
do_action( 'woocommerce_cart_reset', $this, false );
}
+
+ /**
+ * Returns 'incl' if tax should be included in cart, otherwise returns 'excl'.
+ *
+ * @return string
+ */
+ private function is_tax_displayed() {
+ if ( $this->get_customer() && $this->get_customer()->get_is_vat_exempt() ) {
+ return 'excl';
+ }
+
+ return get_option( 'woocommerce_tax_display_cart' );
+ }
}
diff --git a/includes/class-wc-checkout.php b/includes/class-wc-checkout.php
index 0d5f8e5c695..42a2d729731 100644
--- a/includes/class-wc-checkout.php
+++ b/includes/class-wc-checkout.php
@@ -238,9 +238,13 @@ class WC_Checkout {
'placeholder' => esc_attr__( 'Password', 'woocommerce' ),
);
}
-
$this->fields = apply_filters( 'woocommerce_checkout_fields', $this->fields );
+ foreach ( $this->fields as $field_type => $fields ) {
+ // Sort each of the checkout field sections based on priority.
+ uasort( $this->fields[ $field_type ], 'wc_checkout_fields_uasort_comparison' );
+ }
+
return $fieldset ? $this->fields[ $fieldset ] : $this->fields;
}
@@ -346,7 +350,7 @@ class WC_Checkout {
$order->set_total( WC()->cart->get_total( 'edit' ) );
$this->create_order_line_items( $order, WC()->cart );
$this->create_order_fee_lines( $order, WC()->cart );
- $this->create_order_shipping_lines( $order, WC()->session->get( 'chosen_shipping_methods' ), WC()->shipping->get_packages() );
+ $this->create_order_shipping_lines( $order, WC()->session->get( 'chosen_shipping_methods' ), WC()->shipping()->get_packages() );
$this->create_order_tax_lines( $order, WC()->cart );
$this->create_order_coupon_lines( $order, WC()->cart );
@@ -699,8 +703,6 @@ class WC_Checkout {
}
if ( in_array( 'phone', $format, true ) ) {
- $data[ $key ] = wc_format_phone_number( $data[ $key ] );
-
if ( $validate_fieldset && '' !== $data[ $key ] && ! WC_Validation::is_phone( $data[ $key ] ) ) {
/* translators: %s: phone number */
$errors->add( 'validation', sprintf( __( '%s is not a valid phone number.', 'woocommerce' ), '' . esc_html( $field_label ) . ' ' ) );
@@ -772,7 +774,7 @@ class WC_Checkout {
} else {
$chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' );
- foreach ( WC()->shipping->get_packages() as $i => $package ) {
+ foreach ( WC()->shipping()->get_packages() as $i => $package ) {
if ( ! isset( $chosen_shipping_methods[ $i ], $package['rates'][ $chosen_shipping_methods[ $i ] ] ) ) {
$errors->add( 'shipping', __( 'No shipping method has been selected. Please double check your address, or contact us if you need any help.', 'woocommerce' ) );
}
diff --git a/includes/class-wc-comments.php b/includes/class-wc-comments.php
index 54f0d7f0f51..2b47e1e7ca1 100644
--- a/includes/class-wc-comments.php
+++ b/includes/class-wc-comments.php
@@ -48,6 +48,9 @@ class WC_Comments {
// Review of verified purchase.
add_action( 'comment_post', array( __CLASS__, 'add_comment_purchase_verification' ) );
+
+ // Set comment type.
+ add_action( 'preprocess_comment', array( __CLASS__, 'update_comment_type' ), 1 );
}
/**
@@ -405,6 +408,21 @@ class WC_Comments {
return $counts;
}
+
+ /**
+ * Update comment type of product reviews.
+ *
+ * @since 3.5.0
+ * @param array $comment_data Comment data.
+ * @return array
+ */
+ public static function update_comment_type( $comment_data ) {
+ if ( ! is_admin() && isset( $_POST['comment_post_ID'], $comment_data['comment_type'] ) && '' === $comment_data['comment_type'] && 'product' === get_post_type( absint( $_POST['comment_post_ID'] ) ) ) { // WPCS: input var ok, CSRF ok.
+ $comment_data['comment_type'] = 'review';
+ }
+
+ return $comment_data;
+ }
}
WC_Comments::init();
diff --git a/includes/class-wc-countries.php b/includes/class-wc-countries.php
index 9a874ddd837..19230bef10b 100644
--- a/includes/class-wc-countries.php
+++ b/includes/class-wc-countries.php
@@ -473,7 +473,8 @@ class WC_Countries {
public function get_address_formats() {
if ( empty( $this->address_formats ) ) {
$this->address_formats = apply_filters(
- 'woocommerce_localisation_address_formats', array(
+ 'woocommerce_localisation_address_formats',
+ array(
'default' => "{name}\n{company}\n{address_1}\n{address_2}\n{city}\n{state}\n{postcode}\n{country}",
'AU' => "{name}\n{company}\n{address_1}\n{address_2}\n{city} {state} {postcode}\n{country}",
'AT' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}",
@@ -490,7 +491,7 @@ class WC_Countries {
'FR' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city_upper}\n{country}",
'HK' => "{company}\n{first_name} {last_name_upper}\n{address_1}\n{address_2}\n{city_upper}\n{state_upper}\n{country}",
'HU' => "{name}\n{company}\n{city}\n{address_1}\n{address_2}\n{postcode}\n{country}",
- 'IN' => "{company}\n{name}\n{address_1}\n{address_2}\n{city} - {postcode}\n{state}, {country}",
+ 'IN' => "{company}\n{name}\n{address_1}\n{address_2}\n{city} {postcode}\n{state}, {country}",
'IS' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}",
'IT' => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode}\n{city}\n{state_upper}\n{country}",
'JP' => "{postcode}\n{state} {city} {address_1}\n{address_2}\n{company}\n{last_name} {first_name}\n{country}",
@@ -548,7 +549,7 @@ class WC_Countries {
$full_country = ( isset( $this->countries[ $country ] ) ) ? $this->countries[ $country ] : $country;
// Country is not needed if the same as base.
- if ( $country === $this->get_base_country() && ! apply_filters( 'woocommerce_formatted_address_force_country_display', true ) ) {
+ if ( $country === $this->get_base_country() && ! apply_filters( 'woocommerce_formatted_address_force_country_display', false ) ) {
$format = str_replace( '{country}', '', $format );
}
@@ -557,8 +558,10 @@ class WC_Countries {
// Substitute address parts into the string.
$replace = array_map(
- 'esc_html', apply_filters(
- 'woocommerce_formatted_address_replacements', array(
+ 'esc_html',
+ apply_filters(
+ 'woocommerce_formatted_address_replacements',
+ array(
'{first_name}' => $args['first_name'],
'{last_name}' => $args['last_name'],
'{name}' => $args['first_name'] . ' ' . $args['last_name'],
@@ -569,18 +572,19 @@ class WC_Countries {
'{state}' => $full_state,
'{postcode}' => $args['postcode'],
'{country}' => $full_country,
- '{first_name_upper}' => strtoupper( $args['first_name'] ),
- '{last_name_upper}' => strtoupper( $args['last_name'] ),
- '{name_upper}' => strtoupper( $args['first_name'] . ' ' . $args['last_name'] ),
- '{company_upper}' => strtoupper( $args['company'] ),
- '{address_1_upper}' => strtoupper( $args['address_1'] ),
- '{address_2_upper}' => strtoupper( $args['address_2'] ),
- '{city_upper}' => strtoupper( $args['city'] ),
- '{state_upper}' => strtoupper( $full_state ),
- '{state_code}' => strtoupper( $state ),
- '{postcode_upper}' => strtoupper( $args['postcode'] ),
- '{country_upper}' => strtoupper( $full_country ),
- ), $args
+ '{first_name_upper}' => wc_strtoupper( $args['first_name'] ),
+ '{last_name_upper}' => wc_strtoupper( $args['last_name'] ),
+ '{name_upper}' => wc_strtoupper( $args['first_name'] . ' ' . $args['last_name'] ),
+ '{company_upper}' => wc_strtoupper( $args['company'] ),
+ '{address_1_upper}' => wc_strtoupper( $args['address_1'] ),
+ '{address_2_upper}' => wc_strtoupper( $args['address_2'] ),
+ '{city_upper}' => wc_strtoupper( $args['city'] ),
+ '{state_upper}' => wc_strtoupper( $full_state ),
+ '{state_code}' => wc_strtoupper( $state ),
+ '{postcode_upper}' => wc_strtoupper( $args['postcode'] ),
+ '{country_upper}' => wc_strtoupper( $full_country ),
+ ),
+ $args
)
);
@@ -662,6 +666,8 @@ class WC_Countries {
'priority' => 50,
),
'address_2' => array(
+ 'label' => __( 'Apartment, suite, unit etc.', 'woocommerce' ),
+ 'label_class' => array( 'screen-reader-text' ),
'placeholder' => esc_attr( $address_2_placeholder ),
'class' => array( 'form-row-wide', 'address-field' ),
'autocomplete' => 'address-line2',
@@ -702,7 +708,11 @@ class WC_Countries {
unset( $fields['address_2'] );
}
- return apply_filters( 'woocommerce_default_address_fields', $fields );
+ $default_address_fields = apply_filters( 'woocommerce_default_address_fields', $fields );
+ // Sort each of the fields based on priority.
+ uasort( $default_address_fields, 'wc_checkout_fields_uasort_comparison' );
+
+ return $default_address_fields;
}
/**
@@ -731,7 +741,8 @@ class WC_Countries {
public function get_country_locale() {
if ( empty( $this->locale ) ) {
$this->locale = apply_filters(
- 'woocommerce_get_country_locale', array(
+ 'woocommerce_get_country_locale',
+ array(
'AE' => array(
'postcode' => array(
'required' => false,
@@ -746,6 +757,15 @@ class WC_Countries {
'required' => false,
),
),
+ 'AO' => array(
+ 'postcode' => array(
+ 'required' => false,
+ 'hidden' => true,
+ ),
+ 'state' => array(
+ 'label' => __( 'Province', 'woocommerce' ),
+ ),
+ ),
'AT' => array(
'postcode' => array(
'priority' => 65,
@@ -1010,12 +1030,12 @@ class WC_Countries {
),
'NG' => array(
'postcode' => array(
- 'label' => __( 'Postcode', 'woocommerce' ),
+ 'label' => __( 'Postcode', 'woocommerce' ),
'required' => false,
'hidden' => true,
),
'state' => array(
- 'label' => __( 'State', 'woocommerce' ),
+ 'label' => __( 'State', 'woocommerce' ),
),
),
'NZ' => array(
@@ -1163,6 +1183,15 @@ class WC_Countries {
'required' => false,
),
),
+ 'ST' => array(
+ 'postcode' => array(
+ 'required' => false,
+ 'hidden' => true,
+ ),
+ 'state' => array(
+ 'label' => __( 'District', 'woocommerce' ),
+ ),
+ ),
'VN' => array(
'state' => array(
'required' => false,
@@ -1278,6 +1307,10 @@ class WC_Countries {
* on country selection. If you want to change things like the required status of an
* address field, filter woocommerce_default_address_fields instead.
*/
- return apply_filters( 'woocommerce_' . $type . 'fields', $address_fields, $country );
+ $address_fields = apply_filters( 'woocommerce_' . $type . 'fields', $address_fields, $country );
+ // Sort each of the fields based on priority.
+ uasort( $address_fields, 'wc_checkout_fields_uasort_comparison' );
+
+ return $address_fields;
}
}
diff --git a/includes/class-wc-coupon.php b/includes/class-wc-coupon.php
index e4d6161457f..c3d28ccaa4e 100644
--- a/includes/class-wc-coupon.php
+++ b/includes/class-wc-coupon.php
@@ -91,7 +91,7 @@ class WC_Coupon extends WC_Legacy_Coupon {
}
// This filter allows custom coupon objects to be created on the fly.
- $coupon = apply_filters( 'woocommerce_get_shop_coupon_data', false, $data );
+ $coupon = apply_filters( 'woocommerce_get_shop_coupon_data', false, $data, $this );
if ( $coupon ) {
$this->read_manual_coupon( $data, $coupon );
diff --git a/includes/class-wc-discounts.php b/includes/class-wc-discounts.php
index 7ff1c8a22c7..fea4eead963 100644
--- a/includes/class-wc-discounts.php
+++ b/includes/class-wc-discounts.php
@@ -765,11 +765,11 @@ class WC_Discounts {
*/
protected function validate_coupon_sale_items( $coupon ) {
if ( $coupon->get_exclude_sale_items() ) {
- $valid = false;
+ $valid = true;
foreach ( $this->get_items_to_validate() as $item ) {
- if ( $item->product && ! $item->product->is_on_sale() ) {
- $valid = true;
+ if ( $item->product && $item->product->is_on_sale() ) {
+ $valid = false;
break;
}
}
@@ -820,6 +820,7 @@ class WC_Discounts {
*/
protected function validate_coupon_eligible_items( $coupon ) {
if ( ! $coupon->is_type( wc_get_product_coupon_types() ) ) {
+ $this->validate_coupon_sale_items( $coupon );
$this->validate_coupon_excluded_product_ids( $coupon );
$this->validate_coupon_excluded_product_categories( $coupon );
}
@@ -946,7 +947,6 @@ class WC_Discounts {
$this->validate_coupon_maximum_amount( $coupon );
$this->validate_coupon_product_ids( $coupon );
$this->validate_coupon_product_categories( $coupon );
- $this->validate_coupon_sale_items( $coupon );
$this->validate_coupon_excluded_items( $coupon );
$this->validate_coupon_eligible_items( $coupon );
diff --git a/includes/class-wc-download-handler.php b/includes/class-wc-download-handler.php
index 8b1af51fe81..4bcabb74645 100644
--- a/includes/class-wc-download-handler.php
+++ b/includes/class-wc-download-handler.php
@@ -243,6 +243,14 @@ class WC_Download_Handler {
$parsed_file_path = wp_parse_url( $file_path );
$remote_file = true;
+ // Paths that begin with '//' are always remote URLs.
+ if ( '//' === substr( $file_path, 0, 2 ) ) {
+ return array(
+ 'remote_file' => true,
+ 'file_path' => is_ssl() ? 'https:' . $file_path : 'http:' . $file_path,
+ );
+ }
+
// See if path needs an abspath prepended to work.
if ( file_exists( ABSPATH . $file_path ) ) {
$remote_file = false;
diff --git a/includes/class-wc-emails.php b/includes/class-wc-emails.php
index 1ff431bc6c5..5f451b4a8ac 100644
--- a/includes/class-wc-emails.php
+++ b/includes/class-wc-emails.php
@@ -18,7 +18,7 @@ class WC_Emails {
/**
* Array of email notification classes
*
- * @var array
+ * @var WC_Email[]
*/
public $emails = array();
@@ -87,6 +87,9 @@ class WC_Emails {
'woocommerce_order_status_failed_to_processing',
'woocommerce_order_status_failed_to_completed',
'woocommerce_order_status_failed_to_on-hold',
+ 'woocommerce_order_status_cancelled_to_processing',
+ 'woocommerce_order_status_cancelled_to_completed',
+ 'woocommerce_order_status_cancelled_to_on-hold',
'woocommerce_order_status_on-hold_to_processing',
'woocommerce_order_status_on-hold_to_cancelled',
'woocommerce_order_status_on-hold_to_failed',
@@ -228,7 +231,7 @@ class WC_Emails {
/**
* Return the email classes - used in admin to load settings.
*
- * @return array
+ * @return WC_Email[]
*/
public function get_emails() {
return $this->emails;
diff --git a/includes/class-wc-form-handler.php b/includes/class-wc-form-handler.php
index a6e823b2dc8..9d0202aeda2 100644
--- a/includes/class-wc-form-handler.php
+++ b/includes/class-wc-form-handler.php
@@ -130,8 +130,6 @@ class WC_Form_Handler {
}
break;
case 'phone' :
- $_POST[ $key ] = wc_format_phone_number( $_POST[ $key ] );
-
if ( ! WC_Validation::is_phone( $_POST[ $key ] ) ) {
wc_add_notice( sprintf( __( '%s is not a valid phone number.', 'woocommerce' ), '' . $field['label'] . ' ' ), 'error' );
}
@@ -733,7 +731,7 @@ class WC_Form_Handler {
// If we added the product to the cart we can now optionally do a redirect.
if ( $was_added_to_cart && 0 === wc_notice_count( 'error' ) ) {
- if ( $url = apply_filters( 'woocommerce_add_to_cart_redirect', $url ) ) {
+ if ( $url = apply_filters( 'woocommerce_add_to_cart_redirect', $url, $adding_to_cart ) ) {
wp_safe_redirect( $url );
exit;
} elseif ( 'yes' === get_option( 'woocommerce_cart_redirect_after_add' ) ) {
diff --git a/includes/class-wc-frontend-scripts.php b/includes/class-wc-frontend-scripts.php
index b7c1e688b47..5bf920be4ae 100644
--- a/includes/class-wc-frontend-scripts.php
+++ b/includes/class-wc-frontend-scripts.php
@@ -509,7 +509,7 @@ class WC_Frontend_Scripts {
'remove_coupon_nonce' => wp_create_nonce( 'remove-coupon' ),
'option_guest_checkout' => get_option( 'woocommerce_enable_guest_checkout' ),
'checkout_url' => WC_AJAX::get_endpoint( 'checkout' ),
- 'is_checkout' => is_page( wc_get_page_id( 'checkout' ) ) && empty( $wp->query_vars['order-pay'] ) && ! isset( $wp->query_vars['order-received'] ) ? 1 : 0,
+ 'is_checkout' => is_checkout() && empty( $wp->query_vars['order-pay'] ) && ! isset( $wp->query_vars['order-received'] ) ? 1 : 0,
'debug_mode' => defined( 'WP_DEBUG' ) && WP_DEBUG,
'i18n_checkout_error' => esc_attr__( 'Error processing checkout. Please try again.', 'woocommerce' ),
);
@@ -544,7 +544,7 @@ class WC_Frontend_Scripts {
'ajax_url' => WC()->ajax_url(),
'wc_ajax_url' => WC_AJAX::get_endpoint( '%%endpoint%%' ),
'i18n_view_cart' => esc_attr__( 'View cart', 'woocommerce' ),
- 'cart_url' => apply_filters( 'woocommerce_add_to_cart_redirect', wc_get_cart_url() ),
+ 'cart_url' => apply_filters( 'woocommerce_add_to_cart_redirect', wc_get_cart_url(), null ),
'is_cart' => is_cart(),
'cart_redirect_after_add' => get_option( 'woocommerce_cart_redirect_after_add' ),
);
diff --git a/includes/class-wc-geolite-integration.php b/includes/class-wc-geolite-integration.php
index 49e9fc9941f..a5a33b8eead 100644
--- a/includes/class-wc-geolite-integration.php
+++ b/includes/class-wc-geolite-integration.php
@@ -55,7 +55,7 @@ class WC_Geolite_Integration {
$iso_code = '';
try {
- $reader = new MaxMind\Db\Reader( $this->database ); // phpcs:ignore PHPCompatibility.PHP.NewLanguageConstructs.t_ns_separatorFound
+ $reader = new MaxMind\Db\Reader( $this->database ); // phpcs:ignore PHPCompatibility.LanguageConstructs.NewLanguageConstructs.t_ns_separatorFound
$data = $reader->get( $ip_address );
if ( isset( $data['country']['iso_code'] ) ) {
diff --git a/includes/class-wc-geolocation.php b/includes/class-wc-geolocation.php
index 8eea8edaa53..93fccadf788 100644
--- a/includes/class-wc-geolocation.php
+++ b/includes/class-wc-geolocation.php
@@ -237,7 +237,7 @@ class WC_Geolocation {
* @return string
*/
public static function get_local_database_path( $deprecated = '2' ) {
- $upload_dir = wp_upload_dir();
+ $upload_dir = wp_get_upload_dir();
return apply_filters( 'woocommerce_geolocation_local_database_path', $upload_dir['basedir'] . '/GeoLite2-Country.mmdb', $deprecated );
}
@@ -265,7 +265,7 @@ class WC_Geolocation {
$dest_path = trailingslashit( $upload_dir['basedir'] ) . $database;
// Extract files with PharData. Tool built into PHP since 5.3.
- $file = new PharData( $tmp_database_path ); // phpcs:ignore PHPCompatibility.PHP.NewClasses.phardataFound
+ $file = new PharData( $tmp_database_path ); // phpcs:ignore PHPCompatibility.Classes.NewClasses.phardataFound
$file_path = trailingslashit( $file->current()->getFileName() ) . $database;
// Extract under uploads directory.
diff --git a/includes/class-wc-install.php b/includes/class-wc-install.php
index 61bde9310ae..fb7a14b3dee 100644
--- a/includes/class-wc-install.php
+++ b/includes/class-wc-install.php
@@ -114,9 +114,12 @@ class WC_Install {
'wc_update_344_db_version',
),
'3.5.0' => array(
- 'wc_update_350_order_customer_id',
+ 'wc_update_350_reviews_comment_type',
'wc_update_350_db_version',
),
+ '3.5.2' => array(
+ 'wc_update_352_drop_download_log_fk',
+ ),
);
/**
@@ -247,7 +250,7 @@ class WC_Install {
/**
* Is this a brand new WC install?
*
- * @since 3.2.0
+ * @since 3.2.0
* @return boolean
*/
private static function is_new_install() {
@@ -257,7 +260,7 @@ class WC_Install {
/**
* Is a DB update needed?
*
- * @since 3.2.0
+ * @since 3.2.0
* @return boolean
*/
private static function needs_db_update() {
@@ -354,7 +357,8 @@ class WC_Install {
/**
* Add more cron schedules.
*
- * @param array $schedules List of WP scheduled cron jobs.
+ * @param array $schedules List of WP scheduled cron jobs.
+ *
* @return array
*/
public static function cron_schedules( $schedules ) {
@@ -404,7 +408,8 @@ class WC_Install {
include_once dirname( __FILE__ ) . '/admin/wc-admin-functions.php';
$pages = apply_filters(
- 'woocommerce_create_pages', array(
+ 'woocommerce_create_pages',
+ array(
'shop' => array(
'name' => _x( 'shop', 'Page slug', 'woocommerce' ),
'title' => _x( 'Shop', 'Page title', 'woocommerce' ),
@@ -552,6 +557,22 @@ class WC_Install {
}
}
+ /**
+ * Change wp_woocommerce_sessions schema to use a bigint auto increment field instead of char(32) field as
+ * the primary key as it is not a good practice to use a char(32) field as the primary key of a table and as
+ * there were reports of issues with this table (see https://github.com/woocommerce/woocommerce/issues/20912).
+ *
+ * This query needs to run before dbDelta() as this WP function is not able to handle primary key changes
+ * (see https://github.com/woocommerce/woocommerce/issues/21534 and https://core.trac.wordpress.org/ticket/40357).
+ */
+ if ( $wpdb->get_var( "SHOW TABLES LIKE '{$wpdb->prefix}woocommerce_sessions'" ) ) {
+ if ( ! $wpdb->get_var( "SHOW KEYS FROM {$wpdb->prefix}woocommerce_sessions WHERE Key_name = 'PRIMARY' AND Column_name = 'session_id'" ) ) {
+ $wpdb->query(
+ "ALTER TABLE `{$wpdb->prefix}woocommerce_sessions` DROP PRIMARY KEY, DROP KEY `session_id`, ADD PRIMARY KEY(`session_id`), ADD UNIQUE KEY(`session_key`)"
+ );
+ }
+ }
+
dbDelta( self::get_schema() );
$index_exists = $wpdb->get_row( "SHOW INDEX FROM {$wpdb->comments} WHERE column_name = 'comment_type' and key_name = 'woo_idx_comment_type'" );
@@ -577,21 +598,21 @@ class WC_Install {
// Add constraint to download logs if the columns matches.
if ( ! empty( $download_permissions_column_type ) && ! empty( $download_log_column_type ) && $download_permissions_column_type === $download_log_column_type ) {
- $fk_result = $wpdb->get_row( "
- SELECT COUNT(*) AS fk_count
+ $fk_result = $wpdb->get_row(
+ "SELECT COUNT(*) AS fk_count
FROM information_schema.TABLE_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '{$wpdb->dbname}'
- AND CONSTRAINT_NAME = 'fk_wc_download_log_permission_id'
+ AND CONSTRAINT_NAME = 'fk_{$wpdb->prefix}wc_download_log_permission_id'
AND CONSTRAINT_TYPE = 'FOREIGN KEY'
- AND TABLE_NAME = '{$wpdb->prefix}wc_download_log'
- " );
+ AND TABLE_NAME = '{$wpdb->prefix}wc_download_log'"
+ ); // WPCS: unprepared SQL ok.
if ( 0 === (int) $fk_result->fk_count ) {
- $wpdb->query( "
- ALTER TABLE `{$wpdb->prefix}wc_download_log`
- ADD CONSTRAINT `fk_wc_download_log_permission_id`
+ $wpdb->query(
+ "ALTER TABLE `{$wpdb->prefix}wc_download_log`
+ ADD CONSTRAINT `fk_{$wpdb->prefix}wc_download_log_permission_id`
FOREIGN KEY (`permission_id`)
- REFERENCES `{$wpdb->prefix}woocommerce_downloadable_product_permissions` (`permission_id`) ON DELETE CASCADE;
- " );
+ REFERENCES `{$wpdb->prefix}woocommerce_downloadable_product_permissions` (`permission_id`) ON DELETE CASCADE;"
+ ); // WPCS: unprepared SQL ok.
}
}
}
@@ -627,8 +648,8 @@ CREATE TABLE {$wpdb->prefix}woocommerce_sessions (
session_key char(32) NOT NULL,
session_value longtext NOT NULL,
session_expiry BIGINT UNSIGNED NOT NULL,
- PRIMARY KEY (session_key),
- UNIQUE KEY session_id (session_id)
+ PRIMARY KEY (session_id),
+ UNIQUE KEY session_key (session_key)
) $collate;
CREATE TABLE {$wpdb->prefix}woocommerce_api_keys (
key_id BIGINT UNSIGNED NOT NULL auto_increment,
@@ -872,14 +893,15 @@ CREATE TABLE {$wpdb->prefix}woocommerce_termmeta (
$tables = self::get_tables();
foreach ( $tables as $table ) {
- $wpdb->query( "DROP TABLE IF EXISTS {$table}" ); // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
+ $wpdb->query( "DROP TABLE IF EXISTS {$table}" ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
}
}
/**
* Uninstall tables when MU blog is deleted.
*
- * @param array $tables List of tables that will be deleted by WP.
+ * @param array $tables List of tables that will be deleted by WP.
+ *
* @return string[]
*/
public static function wpmu_drop_tables( $tables ) {
@@ -1149,8 +1171,9 @@ CREATE TABLE {$wpdb->prefix}woocommerce_termmeta (
/**
* Show action links on the plugin screen.
*
- * @param mixed $links Plugin Action links.
- * @return array
+ * @param mixed $links Plugin Action links.
+ *
+ * @return array
*/
public static function plugin_action_links( $links ) {
$action_links = array(
@@ -1163,9 +1186,10 @@ CREATE TABLE {$wpdb->prefix}woocommerce_termmeta (
/**
* Show row meta on the plugin screen.
*
- * @param mixed $links Plugin Row Meta.
- * @param mixed $file Plugin Base file.
- * @return array
+ * @param mixed $links Plugin Row Meta.
+ * @param mixed $file Plugin Base file.
+ *
+ * @return array
*/
public static function plugin_row_meta( $links, $file ) {
if ( WC_PLUGIN_BASENAME === $file ) {
@@ -1200,12 +1224,14 @@ CREATE TABLE {$wpdb->prefix}woocommerce_termmeta (
*
* @param string $plugin_to_install_id Plugin ID.
* @param array $plugin_to_install Plugin information.
+ *
* @throws Exception If unable to proceed with plugin installation.
- * @since 2.6.0
+ * @since 2.6.0
*/
public static function background_installer( $plugin_to_install_id, $plugin_to_install ) {
// Explicitly clear the event.
- wp_clear_scheduled_hook( 'woocommerce_plugin_background_installer', func_get_args() );
+ $args = func_get_args();
+ wp_clear_scheduled_hook( 'woocommerce_plugin_background_installer', $args );
if ( ! empty( $plugin_to_install['repo-slug'] ) ) {
require_once ABSPATH . 'wp-admin/includes/file.php';
@@ -1217,7 +1243,10 @@ CREATE TABLE {$wpdb->prefix}woocommerce_termmeta (
$skin = new Automatic_Upgrader_Skin();
$upgrader = new WP_Upgrader( $skin );
- $installed_plugins = array_reduce( array_keys( get_plugins() ), array( __CLASS__, 'associate_plugin_file' ), array() );
+ $installed_plugins = array_reduce( array_keys( get_plugins() ), array( __CLASS__, 'associate_plugin_file' ) );
+ if ( empty( $installed_plugins ) ) {
+ $installed_plugins = array();
+ }
$plugin_slug = $plugin_to_install['repo-slug'];
$plugin_file = isset( $plugin_to_install['file'] ) ? $plugin_to_install['file'] : $plugin_slug . '.php';
$installed = false;
@@ -1355,12 +1384,14 @@ CREATE TABLE {$wpdb->prefix}woocommerce_termmeta (
* Install a theme from .org in the background via a cron job (used by installer - opt in).
*
* @param string $theme_slug Theme slug.
+ *
* @throws Exception If unable to proceed with theme installation.
- * @since 3.1.0
+ * @since 3.1.0
*/
public static function theme_background_installer( $theme_slug ) {
// Explicitly clear the event.
- wp_clear_scheduled_hook( 'woocommerce_theme_background_installer', func_get_args() );
+ $args = func_get_args();
+ wp_clear_scheduled_hook( 'woocommerce_theme_background_installer', $args );
if ( ! empty( $theme_slug ) ) {
// Suppress feedback.
@@ -1379,7 +1410,8 @@ CREATE TABLE {$wpdb->prefix}woocommerce_termmeta (
$skin = new Automatic_Upgrader_Skin();
$upgrader = new Theme_Upgrader( $skin );
$api = themes_api(
- 'theme_information', array(
+ 'theme_information',
+ array(
'slug' => $theme_slug,
'fields' => array( 'sections' => false ),
)
diff --git a/includes/class-wc-logger.php b/includes/class-wc-logger.php
index c2fb5e17288..9f0a68e22c6 100644
--- a/includes/class-wc-logger.php
+++ b/includes/class-wc-logger.php
@@ -99,10 +99,14 @@ class WC_Logger implements WC_Logger_Interface {
*/
public function add( $handle, $message, $level = WC_Log_Levels::NOTICE ) {
$message = apply_filters( 'woocommerce_logger_add_message', $message, $handle );
- $this->log( $level, $message, array(
- 'source' => $handle,
- '_legacy' => true,
- ) );
+ $this->log(
+ $level,
+ $message,
+ array(
+ 'source' => $handle,
+ '_legacy' => true,
+ )
+ );
wc_do_deprecated_action( 'woocommerce_log_add', array( $handle, $message ), '3.0', 'This action has been deprecated with no alternative.' );
return true;
}
@@ -129,7 +133,7 @@ class WC_Logger implements WC_Logger_Interface {
}
if ( $this->should_handle( $level ) ) {
- $timestamp = current_time( 'timestamp' );
+ $timestamp = current_time( 'timestamp', 1 );
$message = apply_filters( 'woocommerce_logger_log_message', $message, $level, $context );
foreach ( $this->handlers as $handler ) {
diff --git a/includes/class-wc-order-item.php b/includes/class-wc-order-item.php
index f0f8148d33b..215f4e693c1 100644
--- a/includes/class-wc-order-item.php
+++ b/includes/class-wc-order-item.php
@@ -85,7 +85,7 @@ class WC_Order_Item extends WC_Data implements ArrayAccess {
*/
public function apply_changes() {
if ( function_exists( 'array_replace' ) ) {
- $this->data = array_replace( $this->data, $this->changes ); // phpcs:ignore PHPCompatibility.PHP.NewFunctions.array_replaceFound
+ $this->data = array_replace( $this->data, $this->changes ); // phpcs:ignore PHPCompatibility.FunctionUse.NewFunctions.array_replaceFound
} else { // PHP 5.2 compatibility.
foreach ( $this->changes as $key => $change ) {
$this->data[ $key ] = $change;
diff --git a/includes/class-wc-order.php b/includes/class-wc-order.php
index e8715a8cffa..4b10dafcebf 100644
--- a/includes/class-wc-order.php
+++ b/includes/class-wc-order.php
@@ -262,6 +262,10 @@ class WC_Order extends WC_Abstract_Order {
'manual' => (bool) $manual_update,
);
+ if ( $manual_update ) {
+ do_action( 'woocommerce_order_edit_status', $this->get_id(), $result['to'] );
+ }
+
$this->maybe_set_date_paid();
$this->maybe_set_date_completed();
}
diff --git a/includes/class-wc-payment-tokens.php b/includes/class-wc-payment-tokens.php
index 0f1ffb20fa0..80c44cccbaa 100644
--- a/includes/class-wc-payment-tokens.php
+++ b/includes/class-wc-payment-tokens.php
@@ -28,7 +28,7 @@ class WC_Payment_Tokens {
* @type string $gateway_id Gateway ID.
* @type string $type Token type.
* }
- * @return array
+ * @return WC_Payment_Token[]
*/
public static function get_tokens( $args ) {
$args = wp_parse_args(
@@ -62,7 +62,7 @@ class WC_Payment_Tokens {
* @since 2.6.0
* @param int $customer_id Customer ID.
* @param string $gateway_id Optional Gateway ID for getting tokens for a specific gateway.
- * @return array Array of token objects.
+ * @return WC_Payment_Token[] Array of token objects.
*/
public static function get_customer_tokens( $customer_id, $gateway_id = '' ) {
if ( $customer_id < 1 ) {
@@ -105,8 +105,8 @@ class WC_Payment_Tokens {
* Returns an array of payment token objects associated with the passed order ID.
*
* @since 2.6.0
- * @param int $order_id Order ID.
- * @return array Array of token objects.
+ * @param int $order_id Order ID.
+ * @return WC_Payment_Token[] Array of token objects.
*/
public static function get_order_tokens( $order_id ) {
$order = wc_get_order( $order_id );
@@ -170,7 +170,7 @@ class WC_Payment_Tokens {
* Remove a payment token from the database by ID.
*
* @since 2.6.0
- * @param WC_Payment_Token $token_id Token ID.
+ * @param int $token_id Token ID.
*/
public static function delete( $token_id ) {
$type = self::get_token_type_by_id( $token_id );
diff --git a/includes/class-wc-post-data.php b/includes/class-wc-post-data.php
index 36085196caa..e641088de5e 100644
--- a/includes/class-wc-post-data.php
+++ b/includes/class-wc-post-data.php
@@ -245,7 +245,7 @@ class WC_Post_Data {
wp_cache_delete( 'product-' . $object_id, 'products' );
}
- if ( ! empty( $meta_value ) && is_float( $meta_value ) && in_array( get_post_type( $object_id ), array_merge( wc_get_order_types(), array( 'shop_coupon', 'product', 'product_variation' ) ), true ) ) {
+ if ( ! empty( $meta_value ) && is_float( $meta_value ) && ! registered_meta_key_exists( 'post', $meta_key ) && in_array( get_post_type( $object_id ), array_merge( wc_get_order_types(), array( 'shop_coupon', 'product', 'product_variation' ) ), true ) ) {
// Convert float to string.
$meta_value = wc_float_to_string( $meta_value );
diff --git a/includes/class-wc-post-types.php b/includes/class-wc-post-types.php
index 09d810292bd..edd10d69947 100644
--- a/includes/class-wc-post-types.php
+++ b/includes/class-wc-post-types.php
@@ -27,6 +27,7 @@ class WC_Post_Types {
add_action( 'woocommerce_after_register_post_type', array( __CLASS__, 'maybe_flush_rewrite_rules' ) );
add_action( 'woocommerce_flush_rewrite_rules', array( __CLASS__, 'flush_rewrite_rules' ) );
add_filter( 'gutenberg_can_edit_post_type', array( __CLASS__, 'gutenberg_can_edit_post_type' ), 10, 2 );
+ add_filter( 'use_block_editor_for_post_type', array( __CLASS__, 'gutenberg_can_edit_post_type' ), 10, 2 );
}
/**
diff --git a/includes/class-wc-product-attribute.php b/includes/class-wc-product-attribute.php
index bf68696f171..228dae1a319 100644
--- a/includes/class-wc-product-attribute.php
+++ b/includes/class-wc-product-attribute.php
@@ -124,7 +124,8 @@ class WC_Product_Attribute implements ArrayAccess {
*/
public function get_data() {
return array_merge(
- $this->data, array(
+ $this->data,
+ array(
'is_visible' => $this->get_visible() ? 1 : 0,
'is_variation' => $this->get_variation() ? 1 : 0,
'is_taxonomy' => $this->is_taxonomy() ? 1 : 0,
@@ -211,7 +212,7 @@ class WC_Product_Attribute implements ArrayAccess {
/**
* Get name.
*
- * @return int
+ * @return string
*/
public function get_name() {
return $this->data['name'];
diff --git a/includes/class-wc-product-download.php b/includes/class-wc-product-download.php
index 423197dc8ce..2bb73c4e5b1 100644
--- a/includes/class-wc-product-download.php
+++ b/includes/class-wc-product-download.php
@@ -87,7 +87,19 @@ class WC_Product_Download implements ArrayAccess {
* @return boolean
*/
public function is_allowed_filetype() {
- if ( 'relative' !== $this->get_type_of_file_path() ) {
+ $file_path = $this->get_file();
+
+ // File types for URL-based files located on the server should get validated.
+ $is_file_on_server = false;
+ if ( false !== stripos( $file_path, network_site_url( '/', 'https' ) ) ||
+ false !== stripos( $file_path, network_site_url( '/', 'http' ) ) ||
+ false !== stripos( $file_path, site_url( '/', 'https' ) ) ||
+ false !== stripos( $file_path, site_url( '/', 'http' ) )
+ ) {
+ $is_file_on_server = true;
+ }
+
+ if ( ! $is_file_on_server && 'relative' !== $this->get_type_of_file_path() ) {
return true;
}
return ! $this->get_file_extension() || in_array( $this->get_file_type(), $this->get_allowed_mime_types(), true );
diff --git a/includes/class-wc-product-factory.php b/includes/class-wc-product-factory.php
index 8e5791deddd..02bd8d1cd5a 100644
--- a/includes/class-wc-product-factory.php
+++ b/includes/class-wc-product-factory.php
@@ -20,7 +20,7 @@ class WC_Product_Factory {
*
* @param mixed $product_id WC_Product|WP_Post|int|bool $product Product instance, post instance, numeric or false to use global $post.
* @param array $deprecated Previously used to pass arguments to the factory, e.g. to force a type.
- * @return WC_Product|bool Product object or null if the product cannot be loaded.
+ * @return WC_Product|bool Product object or false if the product cannot be loaded.
*/
public function get_product( $product_id = false, $deprecated = array() ) {
$product_id = $this->get_product_id( $product_id );
diff --git a/includes/class-wc-product-variable.php b/includes/class-wc-product-variable.php
index c0d10a4078d..12de1b68ed7 100644
--- a/includes/class-wc-product-variable.php
+++ b/includes/class-wc-product-variable.php
@@ -504,7 +504,7 @@ class WC_Product_Variable extends WC_Product {
if ( false === $has_weight ) {
$has_weight = $this->data_store->child_has_weight( $this );
- set_transient( $transient_name, $has_weight, DAY_IN_SECONDS * 30 );
+ set_transient( $transient_name, (int) $has_weight, DAY_IN_SECONDS * 30 );
}
return (bool) $has_weight;
@@ -521,7 +521,7 @@ class WC_Product_Variable extends WC_Product {
if ( false === $has_dimension ) {
$has_dimension = $this->data_store->child_has_dimensions( $this );
- set_transient( $transient_name, $has_dimension, DAY_IN_SECONDS * 30 );
+ set_transient( $transient_name, (int) $has_dimension, DAY_IN_SECONDS * 30 );
}
return (bool) $has_dimension;
diff --git a/includes/class-wc-product-variation.php b/includes/class-wc-product-variation.php
index e0d157cd972..55b6a947ed3 100644
--- a/includes/class-wc-product-variation.php
+++ b/includes/class-wc-product-variation.php
@@ -167,7 +167,7 @@ class WC_Product_Variation extends WC_Product_Simple {
$data = $this->get_variation_attributes();
}
- $data = array_filter( $data );
+ $data = array_filter( $data, 'wc_array_filter_default_attributes' );
if ( empty( $data ) ) {
return $url;
diff --git a/includes/class-wc-query.php b/includes/class-wc-query.php
index 5084ee96795..0eeacb4b6c0 100644
--- a/includes/class-wc-query.php
+++ b/includes/class-wc-query.php
@@ -459,6 +459,9 @@ class WC_Query {
);
switch ( $orderby ) {
+ case 'id':
+ $args['orderby'] = 'ID';
+ break;
case 'menu_order':
$args['orderby'] = 'menu_order title';
break;
diff --git a/includes/class-wc-session-handler.php b/includes/class-wc-session-handler.php
index c51ab133b75..5a4907b1a97 100644
--- a/includes/class-wc-session-handler.php
+++ b/includes/class-wc-session-handler.php
@@ -212,17 +212,13 @@ class WC_Session_Handler extends WC_Session {
if ( $this->_dirty && $this->has_session() ) {
global $wpdb;
- $wpdb->replace(
- $this->_table,
- array(
- 'session_key' => $this->_customer_id,
- 'session_value' => maybe_serialize( $this->_data ),
- 'session_expiry' => $this->_session_expiration,
- ),
- array(
- '%s',
- '%s',
- '%d',
+ $wpdb->query(
+ $wpdb->prepare(
+ "INSERT INTO {$wpdb->prefix}woocommerce_sessions (`session_key`, `session_value`, `session_expiry`) VALUES (%s, %s, %d)
+ ON DUPLICATE KEY UPDATE `session_value` = VALUES(`session_value`), `session_expiry` = VALUES(`session_expiry`)",
+ $this->_customer_id,
+ maybe_serialize( $this->_data ),
+ $this->_session_expiration
)
);
@@ -235,9 +231,15 @@ class WC_Session_Handler extends WC_Session {
* Destroy all session data.
*/
public function destroy_session() {
- wc_setcookie( $this->_cookie, '', time() - YEAR_IN_SECONDS, apply_filters( 'wc_session_use_secure_cookie', false ) );
-
$this->delete_session( $this->_customer_id );
+ $this->forget_session();
+ }
+
+ /**
+ * Forget all session data without destroying it.
+ */
+ public function forget_session() {
+ wc_setcookie( $this->_cookie, '', time() - YEAR_IN_SECONDS, apply_filters( 'wc_session_use_secure_cookie', false ) );
wc_empty_cart();
diff --git a/includes/class-wc-shipping-zone.php b/includes/class-wc-shipping-zone.php
index cabfb93739b..a2f201bc197 100644
--- a/includes/class-wc-shipping-zone.php
+++ b/includes/class-wc-shipping-zone.php
@@ -334,7 +334,7 @@ class WC_Shipping_Zone extends WC_Legacy_Shipping_Zone {
* @return boolean
*/
public function is_valid_location_type( $type ) {
- return in_array( $type, array( 'postcode', 'state', 'country', 'continent' ), true );
+ return in_array( $type, apply_filters( 'woocommerce_valid_location_types', array( 'postcode', 'state', 'country', 'continent' ) ), true );
}
/**
diff --git a/includes/class-wc-shipping.php b/includes/class-wc-shipping.php
index 3b93e5027c6..9ea7ca2bd45 100644
--- a/includes/class-wc-shipping.php
+++ b/includes/class-wc-shipping.php
@@ -95,10 +95,10 @@ class WC_Shipping {
public function __get( $name ) {
// Grab from cart for backwards compatibility with versions prior to 3.2.
if ( 'shipping_total' === $name ) {
- return wc()->cart->get_shipping_total();
+ return WC()->cart->get_shipping_total();
}
if ( 'shipping_taxes' === $name ) {
- return wc()->cart->get_shipping_taxes();
+ return WC()->cart->get_shipping_taxes();
}
}
@@ -151,7 +151,7 @@ class WC_Shipping {
* If a $package is passed some methods may add themselves conditionally and zones will be used.
*
* @param array $package Package information.
- * @return array
+ * @return WC_Shipping_Method[]
*/
public function load_shipping_methods( $package = array() ) {
if ( ! empty( $package ) ) {
@@ -209,8 +209,7 @@ class WC_Shipping {
/**
* Returns all registered shipping methods for usage.
*
- * @access public
- * @return array
+ * @return WC_Shipping_Method[]
*/
public function get_shipping_methods() {
if ( is_null( $this->shipping_methods ) ) {
@@ -222,7 +221,6 @@ class WC_Shipping {
/**
* Get an array of shipping classes.
*
- * @access public
* @return array
*/
public function get_shipping_classes() {
diff --git a/includes/class-wc-shortcodes.php b/includes/class-wc-shortcodes.php
index f8b667f67f3..3efbb4b68d8 100644
--- a/includes/class-wc-shortcodes.php
+++ b/includes/class-wc-shortcodes.php
@@ -475,7 +475,7 @@ class WC_Shortcodes {
$args = array(
'posts_per_page' => 1,
'post_type' => 'product',
- 'post_status' => 'publish',
+ 'post_status' => ( ! empty( $atts['status'] ) ) ? $atts['status'] : 'publish',
'ignore_sticky_posts' => 1,
'no_found_rows' => 1,
);
diff --git a/includes/class-wc-structured-data.php b/includes/class-wc-structured-data.php
index d78af9244ce..4d3911c963a 100644
--- a/includes/class-wc-structured-data.php
+++ b/includes/class-wc-structured-data.php
@@ -329,6 +329,12 @@ class WC_Structured_Data {
$markup['itemListElement'] = array();
foreach ( $crumbs as $key => $crumb ) {
+ // Don't add the current page to the breadcrumb list on product pages,
+ // otherwise Google will not recognize both the BreadcrumbList and Product structured data.
+ if ( is_product() && count( $crumbs ) - 1 === $key ) {
+ continue;
+ }
+
$markup['itemListElement'][ $key ] = array(
'@type' => 'ListItem',
'position' => $key + 1,
@@ -337,7 +343,7 @@ class WC_Structured_Data {
),
);
- if ( ! empty( $crumb[1] ) && count( $crumbs ) !== $key + 1 ) {
+ if ( ! empty( $crumb[1] ) ) {
$markup['itemListElement'][ $key ]['item'] += array( '@id' => $crumb[1] );
}
}
diff --git a/includes/class-wc-template-loader.php b/includes/class-wc-template-loader.php
index 67243f59055..bb859639282 100644
--- a/includes/class-wc-template-loader.php
+++ b/includes/class-wc-template-loader.php
@@ -53,14 +53,14 @@ class WC_Template_Loader {
/**
* Load a template.
*
- * Handles template usage so that we can use our own templates instead of the themes.
+ * Handles template usage so that we can use our own templates instead of the theme's.
*
- * Templates are in the 'templates' folder. woocommerce looks for theme.
+ * Templates are in the 'templates' folder. WooCommerce looks for theme
* overrides in /theme/woocommerce/ by default.
*
- * For beginners, it also looks for a woocommerce.php template first. If the user adds.
- * this to the theme (containing a woocommerce() inside) this will be used for all.
- * woocommerce templates.
+ * For beginners, it also looks for a woocommerce.php template first. If the user adds
+ * this to the theme (containing a woocommerce() inside) this will be used for all
+ * WooCommerce templates.
*
* @param string $template Template to load.
* @return string
@@ -212,7 +212,7 @@ class WC_Template_Loader {
private static function unsupported_theme_shop_page_init() {
add_filter( 'the_content', array( __CLASS__, 'unsupported_theme_shop_content_filter' ), 10 );
add_filter( 'the_title', array( __CLASS__, 'unsupported_theme_title_filter' ), 10, 2 );
- add_filter( 'comments_number', '__return_empty_string' );
+ add_filter( 'comments_number', array( __CLASS__, 'unsupported_theme_comments_number_filter' ) );
}
/**
@@ -443,7 +443,7 @@ class WC_Template_Loader {
$args = self::get_current_shop_view_args();
$shortcode = new WC_Shortcode_Products(
array_merge(
- wc()->query->get_catalog_ordering_args(),
+ WC()->query->get_catalog_ordering_args(),
array(
'page' => $args->page,
'columns' => $args->columns,
@@ -457,12 +457,12 @@ class WC_Template_Loader {
'products' );
// Allow queries to run e.g. layered nav.
- add_action( 'pre_get_posts', array( wc()->query, 'product_query' ) );
+ add_action( 'pre_get_posts', array( WC()->query, 'product_query' ) );
$content = $content . $shortcode->get_content();
// Remove actions and self to avoid nested calls.
- remove_action( 'pre_get_posts', array( wc()->query, 'product_query' ) );
+ remove_action( 'pre_get_posts', array( WC()->query, 'product_query' ) );
WC()->query->remove_ordering_args();
}
@@ -493,7 +493,7 @@ class WC_Template_Loader {
remove_filter( 'the_content', array( __CLASS__, 'unsupported_theme_product_content_filter' ) );
if ( is_product() ) {
- $content = do_shortcode( '[product_page id="' . get_the_ID() . '" show_title=0]' );
+ $content = do_shortcode( '[product_page id="' . get_the_ID() . '" show_title=0 status="any"]' );
}
self::$in_content_filter = false;
@@ -501,6 +501,21 @@ class WC_Template_Loader {
return $content;
}
+ /**
+ * Suppress the comments number on the Shop page for unsupported themes since there is no commenting on the Shop page.
+ *
+ * @since 3.4.5
+ * @param string $comments_number The comments number text.
+ * @return string
+ */
+ public static function unsupported_theme_comments_number_filter( $comments_number ) {
+ if ( is_page( self::$shop_page_id ) ) {
+ return '';
+ }
+
+ return $comments_number;
+ }
+
/**
* Are we filtering content for unsupported themes?
*
diff --git a/includes/class-wc-tracker.php b/includes/class-wc-tracker.php
index bd34004ff98..74c4f39bb40 100644
--- a/includes/class-wc-tracker.php
+++ b/includes/class-wc-tracker.php
@@ -111,11 +111,14 @@ class WC_Tracker {
$data['jetpack_is_staging'] = ( class_exists( 'Jetpack' ) && is_callable( 'Jetpack::is_staging_site' ) && Jetpack::is_staging_site() ) ? 'yes' : 'no';
$data['connect_installed'] = class_exists( 'WC_Connect_Loader' ) ? 'yes' : 'no';
$data['connect_active'] = ( class_exists( 'WC_Connect_Loader' ) && wp_next_scheduled( 'wc_connect_fetch_service_schemas' ) ) ? 'yes' : 'no';
+ $data['helper_connected'] = self::get_helper_connected();
// Store count info.
$data['users'] = self::get_user_counts();
$data['products'] = self::get_product_counts();
$data['orders'] = self::get_orders();
+ $data['reviews'] = self::get_review_counts();
+ $data['categories'] = self::get_category_counts();
// Payment gateway info.
$data['gateways'] = self::get_active_payment_gateways();
@@ -258,6 +261,21 @@ class WC_Tracker {
);
}
+ /**
+ * Check to see if the helper is connected to woocommerce.com
+ *
+ * @return string
+ */
+ private static function get_helper_connected() {
+ if ( class_exists( 'WC_Helper_Options' ) && is_callable( 'WC_Helper_Options::get' ) ) {
+ $authenticated = WC_Helper_Options::get( 'auth' );
+ } else {
+ $authenticated = '';
+ }
+ return ( ! empty( $authenticated ) ) ? 'yes' : 'no';
+ }
+
+
/**
* Get user totals based on user role.
*
@@ -321,6 +339,41 @@ class WC_Tracker {
return array_merge( $order_dates, $order_counts, $order_totals );
}
+ /**
+ * Get review counts for different statuses.
+ *
+ * @return array
+ */
+ private static function get_review_counts() {
+ global $wpdb;
+ $review_count = array();
+ $counts = $wpdb->get_results( "
+ SELECT comment_approved, COUNT(*) AS num_reviews
+ FROM {$wpdb->comments}
+ WHERE comment_type = 'review'
+ GROUP BY comment_approved
+ ", ARRAY_A );
+ if ( $counts ) {
+ foreach ( $counts as $count ) {
+ if ( 1 === $count['comment_approved'] ) {
+ $review_count['approved'] = $count['num_reviews'];
+ } else {
+ $review_count['pending'] = $count['num_reviews'];
+ }
+ }
+ }
+ return $review_count;
+ }
+
+ /**
+ * Get the number of product categories.
+ *
+ * @return int
+ */
+ private static function get_category_counts() {
+ return wp_count_terms( 'product_cat' );
+ }
+
/**
* Get a list of all active payment gateways.
*
@@ -348,7 +401,7 @@ class WC_Tracker {
*/
private static function get_active_shipping_methods() {
$active_methods = array();
- $shipping_methods = WC()->shipping->get_shipping_methods();
+ $shipping_methods = WC()->shipping()->get_shipping_methods();
foreach ( $shipping_methods as $id => $shipping_method ) {
if ( isset( $shipping_method->enabled ) && 'yes' === $shipping_method->enabled ) {
$active_methods[ $id ] = array(
diff --git a/includes/class-wc-validation.php b/includes/class-wc-validation.php
index 0b7094eaf2b..f6675cd49e3 100644
--- a/includes/class-wc-validation.php
+++ b/includes/class-wc-validation.php
@@ -30,7 +30,7 @@ class WC_Validation {
* @return bool
*/
public static function is_phone( $phone ) {
- if ( 0 < strlen( trim( preg_replace( '/[\s\#0-9_\-\+\/\(\)]/', '', $phone ) ) ) ) {
+ if ( 0 < strlen( trim( preg_replace( '/[\s\#0-9_\-\+\/\(\)\.]/', '', $phone ) ) ) ) {
return false;
}
diff --git a/includes/class-wc-webhook.php b/includes/class-wc-webhook.php
index bf4cf9dc1c8..4fe32d310f3 100644
--- a/includes/class-wc-webhook.php
+++ b/includes/class-wc-webhook.php
@@ -166,6 +166,10 @@ class WC_Webhook extends WC_Legacy_Webhook {
}
}
+ if ( ! wc_is_webhook_valid_topic( $this->get_topic() ) ) {
+ $should_deliver = false;
+ }
+
/*
* Let other plugins intercept deliver for some messages queue like rabbit/zeromq.
*/
@@ -280,7 +284,8 @@ class WC_Webhook extends WC_Legacy_Webhook {
* @return array
*/
private function get_wp_api_payload( $resource, $resource_id, $event ) {
- $version_suffix = 'wp_api_v1' === $this->get_api_version() ? '_V1' : '';
+ $rest_api_versions = wc_get_webhook_rest_api_versions();
+ $version_suffix = end( $rest_api_versions ) !== $this->get_api_version() ? strtoupper( str_replace( 'wp_api', '', $this->get_api_version() ) ) : '';
switch ( $resource ) {
case 'coupon':
@@ -340,7 +345,7 @@ class WC_Webhook extends WC_Legacy_Webhook {
'id' => $resource_id,
);
} else {
- if ( in_array( $this->get_api_version(), array( 'wp_api_v1', 'wp_api_v2' ), true ) ) {
+ if ( in_array( $this->get_api_version(), wc_get_webhook_rest_api_versions(), true ) ) {
$payload = $this->get_wp_api_payload( $resource, $resource_id, $event );
} else {
$payload = $this->get_legacy_api_payload( $resource, $resource_id, $event );
@@ -442,7 +447,8 @@ class WC_Webhook extends WC_Legacy_Webhook {
);
// Track failures.
- if ( intval( $response_code ) >= 200 && intval( $response_code ) < 300 ) {
+ // Check for a success, which is a 2xx, 301 or 302 Response Code.
+ if ( intval( $response_code ) >= 200 && intval( $response_code ) < 303 ) {
$this->set_failure_count( 0 );
$this->save();
} else {
diff --git a/includes/class-woocommerce.php b/includes/class-woocommerce.php
index 4c142be2e1f..f50f5923bf5 100644
--- a/includes/class-woocommerce.php
+++ b/includes/class-woocommerce.php
@@ -20,7 +20,7 @@ final class WooCommerce {
*
* @var string
*/
- public $version = '3.5.0';
+ public $version = '3.6.0';
/**
* The single instance of the class.
@@ -405,7 +405,7 @@ final class WooCommerce {
* @since 3.3.0
*/
private function theme_support_includes() {
- if ( wc_is_active_theme( array( 'twentyseventeen', 'twentysixteen', 'twentyfifteen', 'twentyfourteen', 'twentythirteen', 'twentyeleven', 'twentytwelve', 'twentyten' ) ) ) {
+ if ( wc_is_active_theme( array( 'twentynineteen', 'twentyseventeen', 'twentysixteen', 'twentyfifteen', 'twentyfourteen', 'twentythirteen', 'twentyeleven', 'twentytwelve', 'twentyten' ) ) ) {
switch ( get_template() ) {
case 'twentyten':
include_once WC_ABSPATH . 'includes/theme-support/class-wc-twenty-ten.php';
@@ -431,6 +431,9 @@ final class WooCommerce {
case 'twentyseventeen':
include_once WC_ABSPATH . 'includes/theme-support/class-wc-twenty-seventeen.php';
break;
+ case 'twentynineteen':
+ include_once WC_ABSPATH . 'includes/theme-support/class-wc-twenty-nineteen.php';
+ break;
}
}
}
@@ -486,8 +489,9 @@ final class WooCommerce {
$this->session = new $session_class();
$this->session->init();
- $this->cart = new WC_Cart();
$this->customer = new WC_Customer( get_current_user_id(), true );
+ // Cart needs the customer info.
+ $this->cart = new WC_Cart();
// Customer should be saved during shutdown.
add_action( 'shutdown', array( $this->customer, 'save' ), 10 );
diff --git a/includes/data-stores/abstract-wc-order-data-store-cpt.php b/includes/data-stores/abstract-wc-order-data-store-cpt.php
index 0d6208887da..73ff2844cb0 100644
--- a/includes/data-stores/abstract-wc-order-data-store-cpt.php
+++ b/includes/data-stores/abstract-wc-order-data-store-cpt.php
@@ -67,7 +67,7 @@ abstract class Abstract_WC_Order_Data_Store_CPT extends WC_Data_Store_WP impleme
'post_type' => $order->get_type( 'edit' ),
'post_status' => 'wc-' . ( $order->get_status( 'edit' ) ? $order->get_status( 'edit' ) : apply_filters( 'woocommerce_default_order_status', 'pending' ) ),
'ping_status' => 'closed',
- 'post_author' => is_callable( array( $order, 'get_customer_id' ) ) ? $order->get_customer_id() : 0,
+ 'post_author' => 1,
'post_title' => $this->get_post_title(),
'post_password' => uniqid( 'order_' ),
'post_parent' => $order->get_parent_id( 'edit' ),
@@ -139,7 +139,7 @@ abstract class Abstract_WC_Order_Data_Store_CPT extends WC_Data_Store_WP impleme
$changes = $order->get_changes();
// Only update the post when the post data changes.
- if ( array_intersect( array( 'date_created', 'date_modified', 'status', 'parent_id', 'post_excerpt', 'customer_id' ), array_keys( $changes ) ) ) {
+ if ( array_intersect( array( 'date_created', 'date_modified', 'status', 'parent_id', 'post_excerpt' ), array_keys( $changes ) ) ) {
$post_data = array(
'post_date' => gmdate( 'Y-m-d H:i:s', $order->get_date_created( 'edit' )->getOffsetTimestamp() ),
'post_date_gmt' => gmdate( 'Y-m-d H:i:s', $order->get_date_created( 'edit' )->getTimestamp() ),
@@ -148,7 +148,6 @@ abstract class Abstract_WC_Order_Data_Store_CPT extends WC_Data_Store_WP impleme
'post_excerpt' => $this->get_post_excerpt( $order ),
'post_modified' => isset( $changes['date_modified'] ) ? gmdate( 'Y-m-d H:i:s', $order->get_date_modified( 'edit' )->getOffsetTimestamp() ) : current_time( 'mysql' ),
'post_modified_gmt' => isset( $changes['date_modified'] ) ? gmdate( 'Y-m-d H:i:s', $order->get_date_modified( 'edit' )->getTimestamp() ) : current_time( 'mysql', 1 ),
- 'post_author' => is_callable( array( $order, 'get_customer_id' ) ) ? $order->get_customer_id() : 0,
);
/**
@@ -166,27 +165,12 @@ abstract class Abstract_WC_Order_Data_Store_CPT extends WC_Data_Store_WP impleme
wp_update_post( array_merge( array( 'ID' => $order->get_id() ), $post_data ) );
}
$order->read_meta_data( true ); // Refresh internal meta data, in case things were hooked into `save_post` or another WP hook.
-
- // If customer changed, update any downloadable permissions.
- if ( in_array( 'customer_id', $changes ) ) {
- $this->update_downloadable_permissions( $order );
- }
}
$this->update_post_meta( $order );
$order->apply_changes();
$this->clear_caches( $order );
}
- /**
- * Update downloadable permissions for a given order.
- *
- * @param WC_Order $order Order object.
- */
- protected function update_downloadable_permissions( $order ) {
- $data_store = WC_Data_Store::load( 'customer-download' );
- $data_store->update_user_by_order_id( $order->get_id(), $order->get_customer_id(), $order->get_billing_email() );
- }
-
/**
* Method to delete an order from the database.
*
diff --git a/includes/data-stores/class-wc-coupon-data-store-cpt.php b/includes/data-stores/class-wc-coupon-data-store-cpt.php
index eeba9ff74b6..986b3c5bcc9 100644
--- a/includes/data-stores/class-wc-coupon-data-store-cpt.php
+++ b/includes/data-stores/class-wc-coupon-data-store-cpt.php
@@ -76,7 +76,8 @@ class WC_Coupon_Data_Store_CPT extends WC_Data_Store_WP implements WC_Coupon_Dat
'post_date' => gmdate( 'Y-m-d H:i:s', $coupon->get_date_created()->getOffsetTimestamp() ),
'post_date_gmt' => gmdate( 'Y-m-d H:i:s', $coupon->get_date_created()->getTimestamp() ),
)
- ), true
+ ),
+ true
);
if ( $coupon_id ) {
@@ -84,6 +85,7 @@ class WC_Coupon_Data_Store_CPT extends WC_Data_Store_WP implements WC_Coupon_Dat
$this->update_post_meta( $coupon );
$coupon->save_meta_data();
$coupon->apply_changes();
+ delete_transient( 'rest_api_coupons_type_count' );
do_action( 'woocommerce_new_coupon', $coupon_id );
}
}
@@ -176,6 +178,7 @@ class WC_Coupon_Data_Store_CPT extends WC_Data_Store_WP implements WC_Coupon_Dat
}
$this->update_post_meta( $coupon );
$coupon->apply_changes();
+ delete_transient( 'rest_api_coupons_type_count' );
do_action( 'woocommerce_update_coupon', $coupon->get_id() );
}
@@ -189,7 +192,8 @@ class WC_Coupon_Data_Store_CPT extends WC_Data_Store_WP implements WC_Coupon_Dat
*/
public function delete( &$coupon, $args = array() ) {
$args = wp_parse_args(
- $args, array(
+ $args,
+ array(
'force_delete' => false,
)
);
@@ -341,7 +345,8 @@ class WC_Coupon_Data_Store_CPT extends WC_Data_Store_WP implements WC_Coupon_Dat
add_post_meta( $id, 'usage_count', $coupon->get_usage_count( 'edit' ), true );
$wpdb->query(
$wpdb->prepare(
- "UPDATE $wpdb->postmeta SET meta_value = meta_value {$operator} 1 WHERE meta_key = 'usage_count' AND post_id = %d;", // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
+ // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
+ "UPDATE $wpdb->postmeta SET meta_value = meta_value {$operator} 1 WHERE meta_key = 'usage_count' AND post_id = %d;",
$id
)
);
diff --git a/includes/data-stores/class-wc-customer-data-store.php b/includes/data-stores/class-wc-customer-data-store.php
index 8ad38340b3f..3e7c9c6faa1 100644
--- a/includes/data-stores/class-wc-customer-data-store.php
+++ b/includes/data-stores/class-wc-customer-data-store.php
@@ -117,11 +117,13 @@ class WC_Customer_Data_Store extends WC_Data_Store_WP implements WC_Customer_Dat
wp_update_user(
apply_filters(
- 'woocommerce_update_customer_args', array(
+ 'woocommerce_update_customer_args',
+ array(
'ID' => $customer->get_id(),
'role' => $customer->get_role(),
'display_name' => $customer->get_display_name(),
- ), $customer
+ ),
+ $customer
)
);
$wp_user = new WP_User( $customer->get_id() );
@@ -156,7 +158,7 @@ class WC_Customer_Data_Store extends WC_Data_Store_WP implements WC_Customer_Dat
// Load meta but exclude deprecated props.
$user_meta = array_diff_key(
- array_map( 'wc_flatten_meta_callback', get_user_meta( $customer_id ) ),
+ array_change_key_case( array_map( 'wc_flatten_meta_callback', get_user_meta( $customer_id ) ) ),
array_flip( array( 'country', 'state', 'postcode', 'city', 'address', 'address_2', 'default', 'location' ) )
);
@@ -186,11 +188,13 @@ class WC_Customer_Data_Store extends WC_Data_Store_WP implements WC_Customer_Dat
public function update( &$customer ) {
wp_update_user(
apply_filters(
- 'woocommerce_update_customer_args', array(
+ 'woocommerce_update_customer_args',
+ array(
'ID' => $customer->get_id(),
'user_email' => $customer->get_email(),
'display_name' => $customer->get_display_name(),
- ), $customer
+ ),
+ $customer
)
);
@@ -225,7 +229,8 @@ class WC_Customer_Data_Store extends WC_Data_Store_WP implements WC_Customer_Dat
}
$args = wp_parse_args(
- $args, array(
+ $args,
+ array(
'reassign' => 0,
)
);
@@ -325,27 +330,18 @@ class WC_Customer_Data_Store extends WC_Data_Store_WP implements WC_Customer_Dat
public function get_last_order( &$customer ) {
global $wpdb;
- // On WC 3.5.0 the ID of the user that placed the order was moved from the post meta _customer_user to the post_author field in the wp_posts table.
- if ( version_compare( get_option( 'woocommerce_db_version' ), '3.5.0', '>=' ) ) {
- $query = "SELECT ID
- FROM $wpdb->posts
- WHERE post_author = '" . esc_sql( $customer->get_id() ) . "'
- AND post_type = 'shop_order'
- AND post_status IN ( '" . implode( "','", array_map( 'esc_sql', array_keys( wc_get_order_statuses() ) ) ) . "' )
- ORDER BY ID DESC";
- } else {
- $query = "SELECT posts.ID
+ $last_order = $wpdb->get_var(
+ // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared
+ "SELECT posts.ID
FROM $wpdb->posts AS posts
LEFT JOIN {$wpdb->postmeta} AS meta on posts.ID = meta.post_id
WHERE meta.meta_key = '_customer_user'
AND meta.meta_value = '" . esc_sql( $customer->get_id() ) . "'
AND posts.post_type = 'shop_order'
AND posts.post_status IN ( '" . implode( "','", array_map( 'esc_sql', array_keys( wc_get_order_statuses() ) ) ) . "' )
- ORDER BY posts.ID DESC";
- }
-
- // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
- $last_order = $wpdb->get_var( $query );
+ ORDER BY posts.ID DESC"
+ // phpcs:enable
+ );
if ( ! $last_order ) {
return false;
@@ -367,25 +363,17 @@ class WC_Customer_Data_Store extends WC_Data_Store_WP implements WC_Customer_Dat
if ( '' === $count ) {
global $wpdb;
- // On WC 3.5.0 the ID of the user that placed the order was moved from the post meta _customer_user to the post_author field in the wp_posts table.
- if ( version_compare( get_option( 'woocommerce_db_version' ), '3.5.0', '>=' ) ) {
- $query = "SELECT COUNT(*)
- FROM $wpdb->posts
- WHERE post_type = 'shop_order'
- AND post_status IN ( '" . implode( "','", array_map( 'esc_sql', array_keys( wc_get_order_statuses() ) ) ) . "' )
- AND post_author = " . esc_sql( $customer->get_id() );
- } else {
- $query = "SELECT COUNT(*)
+ $count = $wpdb->get_var(
+ // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared
+ "SELECT COUNT(*)
FROM $wpdb->posts as posts
LEFT JOIN {$wpdb->postmeta} AS meta ON posts.ID = meta.post_id
WHERE meta.meta_key = '_customer_user'
AND posts.post_type = 'shop_order'
AND posts.post_status IN ( '" . implode( "','", array_map( 'esc_sql', array_keys( wc_get_order_statuses() ) ) ) . "' )
- AND meta_value = '" . esc_sql( $customer->get_id() ) . "'";
- }
-
- // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
- $count = $wpdb->get_var( $query );
+ AND meta_value = '" . esc_sql( $customer->get_id() ) . "'"
+ // phpcs:enable
+ );
update_user_meta( $customer->get_id(), '_order_count', $count );
}
@@ -410,18 +398,11 @@ class WC_Customer_Data_Store extends WC_Data_Store_WP implements WC_Customer_Dat
global $wpdb;
$statuses = array_map( 'esc_sql', wc_get_is_paid_statuses() );
-
- // On WC 3.5.0 the ID of the user that placed the order was moved from the post meta _customer_user to the post_author field in the wp_posts table.
- if ( version_compare( get_option( 'woocommerce_db_version' ), '3.5.0', '>=' ) ) {
- $query = "SELECT SUM(meta.meta_value)
- FROM $wpdb->posts as posts
- LEFT JOIN {$wpdb->postmeta} AS meta ON posts.ID = meta.post_id
- WHERE posts.post_author = '" . esc_sql( $customer->get_id() ) . "'
- AND posts.post_type = 'shop_order'
- AND posts.post_status IN ( 'wc-" . implode( "','wc-", $statuses ) . "' )
- AND meta.meta_key = '_order_total'";
- } else {
- $query = "SELECT SUM(meta2.meta_value)
+ $spent = $wpdb->get_var(
+ // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared
+ apply_filters(
+ 'woocommerce_customer_get_total_spent_query',
+ "SELECT SUM(meta2.meta_value)
FROM $wpdb->posts as posts
LEFT JOIN {$wpdb->postmeta} AS meta ON posts.ID = meta.post_id
LEFT JOIN {$wpdb->postmeta} AS meta2 ON posts.ID = meta2.post_id
@@ -429,11 +410,11 @@ class WC_Customer_Data_Store extends WC_Data_Store_WP implements WC_Customer_Dat
AND meta.meta_value = '" . esc_sql( $customer->get_id() ) . "'
AND posts.post_type = 'shop_order'
AND posts.post_status IN ( 'wc-" . implode( "','wc-", $statuses ) . "' )
- AND meta2.meta_key = '_order_total'";
- }
-
- // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
- $spent = $wpdb->get_var( apply_filters( 'woocommerce_customer_get_total_spent_query', $query, $customer ) );
+ AND meta2.meta_key = '_order_total'",
+ $customer
+ )
+ // phpcs:enable
+ );
if ( ! $spent ) {
$spent = 0;
@@ -461,18 +442,23 @@ class WC_Customer_Data_Store extends WC_Data_Store_WP implements WC_Customer_Dat
$query = new WP_User_Query(
apply_filters(
- 'woocommerce_customer_search_customers', array(
+ 'woocommerce_customer_search_customers',
+ array(
'search' => '*' . esc_attr( $term ) . '*',
'search_columns' => array( 'user_login', 'user_url', 'user_email', 'user_nicename', 'display_name' ),
'fields' => 'ID',
'number' => $limit,
- ), $term, $limit, 'main_query'
+ ),
+ $term,
+ $limit,
+ 'main_query'
)
);
$query2 = new WP_User_Query(
apply_filters(
- 'woocommerce_customer_search_customers', array(
+ 'woocommerce_customer_search_customers',
+ array(
'fields' => 'ID',
'number' => $limit,
'meta_query' => array(
@@ -488,7 +474,10 @@ class WC_Customer_Data_Store extends WC_Data_Store_WP implements WC_Customer_Dat
'compare' => 'LIKE',
),
),
- ), $term, $limit, 'meta_query'
+ ),
+ $term,
+ $limit,
+ 'meta_query'
)
);
diff --git a/includes/data-stores/class-wc-customer-download-data-store.php b/includes/data-stores/class-wc-customer-download-data-store.php
index 95179f1b904..a26fed73b61 100644
--- a/includes/data-stores/class-wc-customer-download-data-store.php
+++ b/includes/data-stores/class-wc-customer-download-data-store.php
@@ -281,7 +281,8 @@ class WC_Customer_Download_Data_Store implements WC_Customer_Download_Data_Store
global $wpdb;
$args = wp_parse_args(
- $args, array(
+ $args,
+ array(
'user_email' => '',
'user_id' => '',
'order_id' => '',
@@ -345,7 +346,7 @@ class WC_Customer_Download_Data_Store implements WC_Customer_Download_Data_Store
$query[] = $wpdb->prepare( 'LIMIT %d, %d', absint( $args['limit'] ) * absint( $args['page'] - 1 ), absint( $args['limit'] ) );
}
- // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
+ // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
$results = $wpdb->get_results( implode( ' ', $query ), $get_results_output );
switch ( $args['return'] ) {
diff --git a/includes/data-stores/class-wc-data-store-wp.php b/includes/data-stores/class-wc-data-store-wp.php
index 229d144a9b5..9ee29557f07 100644
--- a/includes/data-stores/class-wc-data-store-wp.php
+++ b/includes/data-stores/class-wc-data-store-wp.php
@@ -75,7 +75,7 @@ class WC_Data_Store_WP {
$db_info = $this->get_db_info();
$raw_meta_data = $wpdb->get_results(
$wpdb->prepare(
- // phpcs:disable WordPress.WP.PreparedSQL.NotPrepared
+ // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared
"SELECT {$db_info['meta_id_field']} as meta_id, meta_key, meta_value
FROM {$db_info['table']}
WHERE {$db_info['object_id_field']} = %d
@@ -495,9 +495,12 @@ class WC_Data_Store_WP {
protected function get_search_stopwords() {
// Translators: This is a comma-separated list of very common words that should be excluded from a search, like a, an, and the. These are usually called "stopwords". You should not simply translate these individual words into your language. Instead, look for and provide commonly accepted stopwords in your language.
$stopwords = array_map(
- 'wc_strtolower', array_map(
- 'trim', explode(
- ',', _x(
+ 'wc_strtolower',
+ array_map(
+ 'trim',
+ explode(
+ ',',
+ _x(
'about,an,are,as,at,be,by,com,for,from,how,in,is,it,of,on,or,that,the,this,to,was,what,when,where,who,will,with,www',
'Comma-separated list of search stopwords in your language',
'woocommerce'
diff --git a/includes/data-stores/class-wc-order-data-store-cpt.php b/includes/data-stores/class-wc-order-data-store-cpt.php
index 316aa4b8373..c117b6bef63 100644
--- a/includes/data-stores/class-wc-order-data-store-cpt.php
+++ b/includes/data-stores/class-wc-order-data-store-cpt.php
@@ -107,17 +107,10 @@ class WC_Order_Data_Store_CPT extends Abstract_WC_Order_Data_Store_CPT implement
$date_paid = get_post_meta( $id, '_paid_date', true );
}
- // On WC 3.5.0 the ID of the user that placed the order was moved from the post meta _customer_user to the post_author field in the wp_posts table.
- if ( version_compare( get_option( 'woocommerce_db_version' ), '3.5.0', '>=' ) ) {
- $customer_id = $post_object->post_author;
- } else {
- $customer_id = get_post_meta( $id, '_customer_user', true );
- }
-
$order->set_props(
array(
'order_key' => get_post_meta( $id, '_order_key', true ),
- 'customer_id' => $customer_id,
+ 'customer_id' => get_post_meta( $id, '_customer_user', true ),
'billing_first_name' => get_post_meta( $id, '_billing_first_name', true ),
'billing_last_name' => get_post_meta( $id, '_billing_last_name', true ),
'billing_company' => get_post_meta( $id, '_billing_company', true ),
@@ -265,9 +258,10 @@ class WC_Order_Data_Store_CPT extends Abstract_WC_Order_Data_Store_CPT implement
update_post_meta( $id, '_shipping_address_index', implode( ' ', $order->get_address( 'shipping' ) ) );
}
- // If customer email changed, update any downloadable permissions.
- if ( in_array( 'billing_email', $updated_props ) ) {
- $this->update_downloadable_permissions( $order );
+ // If customer changed, update any downloadable permissions.
+ if ( in_array( 'customer_id', $updated_props ) || in_array( 'billing_email', $updated_props ) ) {
+ $data_store = WC_Data_Store::load( 'customer-download' );
+ $data_store->update_user_by_order_id( $id, $order->get_customer_id(), $order->get_billing_email() );
}
// Mark user account as active.
@@ -651,11 +645,6 @@ class WC_Order_Data_Store_CPT extends Abstract_WC_Order_Data_Store_CPT implement
'page' => 'paged',
);
- // On WC 3.5.0 the ID of the user that placed the order was moved from the post meta _customer_user to the post_author field in the wp_posts table.
- if ( version_compare( get_option( 'woocommerce_db_version' ), '3.5.0', '>=' ) ) {
- $key_mapping['customer_id'] = 'author';
- }
-
foreach ( $key_mapping as $query_key => $db_key ) {
if ( isset( $query_vars[ $query_key ] ) ) {
$query_vars[ $db_key ] = $query_vars[ $query_key ];
diff --git a/includes/data-stores/class-wc-payment-token-data-store.php b/includes/data-stores/class-wc-payment-token-data-store.php
index e6aee033c00..18513eb1daa 100644
--- a/includes/data-stores/class-wc-payment-token-data-store.php
+++ b/includes/data-stores/class-wc-payment-token-data-store.php
@@ -106,7 +106,7 @@ class WC_Payment_Token_Data_Store extends WC_Data_Store_WP implements WC_Payment
$wpdb->update(
$wpdb->prefix . 'woocommerce_payment_tokens',
$payment_token_data,
- array( 'token_id' => $token->get_id( 'edit' ) )
+ array( 'token_id' => $token->get_id() )
);
}
@@ -235,7 +235,8 @@ class WC_Payment_Token_Data_Store extends WC_Data_Store_WP implements WC_Payment
public function get_tokens( $args ) {
global $wpdb;
$args = wp_parse_args(
- $args, array(
+ $args,
+ array(
'token_id' => '',
'user_id' => '',
'gateway_id' => '',
@@ -275,7 +276,7 @@ class WC_Payment_Token_Data_Store extends WC_Data_Store_WP implements WC_Payment
$where[] = $wpdb->prepare( 'type = %s', $args['type'] );
}
- // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
+ // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
$token_results = $wpdb->get_results( $sql . ' WHERE ' . implode( ' AND ', $where ) . ' ' . $limits );
return $token_results;
diff --git a/includes/data-stores/class-wc-product-data-store-cpt.php b/includes/data-stores/class-wc-product-data-store-cpt.php
index 28292337548..34dad6f3455 100644
--- a/includes/data-stores/class-wc-product-data-store-cpt.php
+++ b/includes/data-stores/class-wc-product-data-store-cpt.php
@@ -99,7 +99,8 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da
$id = wp_insert_post(
apply_filters(
- 'woocommerce_new_product_data', array(
+ 'woocommerce_new_product_data',
+ array(
'post_type' => 'product',
'post_status' => $product->get_status() ? $product->get_status() : 'publish',
'post_author' => get_current_user_id(),
@@ -114,7 +115,8 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da
'post_date_gmt' => gmdate( 'Y-m-d H:i:s', $product->get_date_created( 'edit' )->getTimestamp() ),
'post_name' => $product->get_slug( 'edit' ),
)
- ), true
+ ),
+ true
);
if ( $id && ! is_wp_error( $id ) ) {
@@ -262,7 +264,8 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da
$post_type = $product->is_type( 'variation' ) ? 'product_variation' : 'product';
$args = wp_parse_args(
- $args, array(
+ $args,
+ array(
'force_delete' => false,
)
);
@@ -429,7 +432,8 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da
'is_visible' => 0,
'is_variation' => 0,
'is_taxonomy' => 0,
- ), (array) $meta_attribute_value
+ ),
+ (array) $meta_attribute_value
);
// Check if is a taxonomy attribute.
@@ -744,7 +748,7 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da
continue;
} elseif ( $attribute->is_taxonomy() ) {
- wp_set_object_terms( $product->get_id(), wp_list_pluck( $attribute->get_terms(), 'term_id' ), $attribute->get_name() );
+ wp_set_object_terms( $product->get_id(), wp_list_pluck( (array) $attribute->get_terms(), 'term_id' ), $attribute->get_name() );
} else {
$value = wc_implode_text_attributes( $attribute->get_options() );
}
@@ -848,6 +852,7 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da
$exclude_term_ids = array();
$outofstock_join = '';
$outofstock_where = '';
+ $non_published_where = '';
$product_visibility_term_ids = wc_get_product_visibility_term_ids();
if ( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) && $product_visibility_term_ids['outofstock'] ) {
@@ -859,8 +864,19 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da
$outofstock_where = ' AND exclude_join.object_id IS NULL';
}
+ // Fetch a list of non-published parent products and exlude them, quicker than joining in the main query below.
+ $non_published_products = $wpdb->get_col(
+ "SELECT post.ID as id FROM `$wpdb->posts` AS post
+ WHERE post.post_type = 'product'
+ AND post.post_parent = 0
+ AND post.post_status != 'publish'"
+ );
+ if ( 0 < count( $non_published_products ) ) {
+ $non_published_where = ' AND post.post_parent NOT IN ( ' . implode( ',', $non_published_products ) . ')';
+ }
+
return $wpdb->get_results(
- // phpcs:disable WordPress.WP.PreparedSQL.NotPrepared
+ // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared
$wpdb->prepare(
"SELECT post.ID as id, post.post_parent as parent_id FROM `$wpdb->posts` AS post
LEFT JOIN `$wpdb->postmeta` AS meta ON post.ID = meta.post_id
@@ -874,6 +890,7 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da
AND CAST( meta.meta_value AS CHAR ) != ''
AND CAST( meta.meta_value AS DECIMAL( 10, %d ) ) = CAST( meta2.meta_value AS DECIMAL( 10, %d ) )
$outofstock_where
+ $non_published_where
GROUP BY post.ID",
$decimals,
$decimals
@@ -940,7 +957,8 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da
AND $wpdb->postmeta.meta_key = '_sku' AND $wpdb->postmeta.meta_value = %s
AND $wpdb->postmeta.post_id <> %d
LIMIT 1",
- wp_slash( $sku ), $product_id
+ wp_slash( $sku ),
+ $product_id
)
);
}
@@ -1137,7 +1155,7 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da
$related_product_query = (array) apply_filters( 'woocommerce_product_related_posts_query', $this->get_related_products_query( $cats_array, $tags_array, $exclude_ids, $limit + 10 ), $product_id, $args );
- // phpcs:ignore WordPress.VIP.DirectDatabaseQuery.DirectQuery, WordPress.WP.PreparedSQL.NotPrepared
+ // phpcs:ignore WordPress.VIP.DirectDatabaseQuery.DirectQuery, WordPress.DB.PreparedSQL.NotPrepared
return $wpdb->get_col( implode( ' ', $related_product_query ) );
}
@@ -1220,7 +1238,9 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da
// phpcs:ignore WordPress.VIP.DirectDatabaseQuery.DirectQuery
$wpdb->query(
$wpdb->prepare(
- "UPDATE {$wpdb->postmeta} SET meta_value = meta_value + %f WHERE post_id = %d AND meta_key='_stock'", $stock_quantity, $product_id_with_stock
+ "UPDATE {$wpdb->postmeta} SET meta_value = meta_value + %f WHERE post_id = %d AND meta_key='_stock'",
+ $stock_quantity,
+ $product_id_with_stock
)
);
break;
@@ -1228,7 +1248,9 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da
// phpcs:ignore WordPress.VIP.DirectDatabaseQuery.DirectQuery
$wpdb->query(
$wpdb->prepare(
- "UPDATE {$wpdb->postmeta} SET meta_value = meta_value - %f WHERE post_id = %d AND meta_key='_stock'", $stock_quantity, $product_id_with_stock
+ "UPDATE {$wpdb->postmeta} SET meta_value = meta_value - %f WHERE post_id = %d AND meta_key='_stock'",
+ $stock_quantity,
+ $product_id_with_stock
)
);
break;
@@ -1236,7 +1258,9 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da
// phpcs:ignore WordPress.VIP.DirectDatabaseQuery.DirectQuery
$wpdb->query(
$wpdb->prepare(
- "UPDATE {$wpdb->postmeta} SET meta_value = %f WHERE post_id = %d AND meta_key='_stock'", $stock_quantity, $product_id_with_stock
+ "UPDATE {$wpdb->postmeta} SET meta_value = %f WHERE post_id = %d AND meta_key='_stock'",
+ $stock_quantity,
+ $product_id_with_stock
)
);
break;
@@ -1265,7 +1289,9 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da
// phpcs:ignore WordPress.VIP.DirectDatabaseQuery.DirectQuery
$wpdb->query(
$wpdb->prepare(
- "UPDATE {$wpdb->postmeta} SET meta_value = meta_value + %f WHERE post_id = %d AND meta_key='total_sales'", $quantity, $product_id
+ "UPDATE {$wpdb->postmeta} SET meta_value = meta_value + %f WHERE post_id = %d AND meta_key='total_sales'",
+ $quantity,
+ $product_id
)
);
break;
@@ -1273,7 +1299,9 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da
// phpcs:ignore WordPress.VIP.DirectDatabaseQuery.DirectQuery
$wpdb->query(
$wpdb->prepare(
- "UPDATE {$wpdb->postmeta} SET meta_value = meta_value - %f WHERE post_id = %d AND meta_key='total_sales'", $quantity, $product_id
+ "UPDATE {$wpdb->postmeta} SET meta_value = meta_value - %f WHERE post_id = %d AND meta_key='total_sales'",
+ $quantity,
+ $product_id
)
);
break;
@@ -1281,7 +1309,9 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da
// phpcs:ignore WordPress.VIP.DirectDatabaseQuery.DirectQuery
$wpdb->query(
$wpdb->prepare(
- "UPDATE {$wpdb->postmeta} SET meta_value = %f WHERE post_id = %d AND meta_key='total_sales'", $quantity, $product_id
+ "UPDATE {$wpdb->postmeta} SET meta_value = %f WHERE post_id = %d AND meta_key='total_sales'",
+ $quantity,
+ $product_id
)
);
break;
diff --git a/includes/data-stores/class-wc-product-variable-data-store-cpt.php b/includes/data-stores/class-wc-product-variable-data-store-cpt.php
index 91e19171492..08b486ec8e9 100644
--- a/includes/data-stores/class-wc-product-variable-data-store-cpt.php
+++ b/includes/data-stores/class-wc-product-variable-data-store-cpt.php
@@ -43,7 +43,8 @@ class WC_Product_Variable_Data_Store_CPT extends WC_Product_Data_Store_CPT imple
'is_visible' => 0,
'is_variation' => 0,
'is_taxonomy' => 0,
- ), (array) $meta_attribute_value
+ ),
+ (array) $meta_attribute_value
);
// Maintain data integrity. 4.9 changed sanitization functions - update the values here so variations function correctly.
@@ -184,7 +185,8 @@ class WC_Product_Variable_Data_Store_CPT extends WC_Product_Data_Store_CPT imple
$values = array_unique(
$wpdb->get_col(
$wpdb->prepare(
- "SELECT meta_value FROM {$wpdb->postmeta} WHERE meta_key = %s AND post_id IN (" . implode( ',', array_map( 'absint', $child_ids ) ) . ')', // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
+ // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
+ "SELECT meta_value FROM {$wpdb->postmeta} WHERE meta_key = %s AND post_id IN (" . implode( ',', array_map( 'absint', $child_ids ) ) . ')',
wc_variation_attribute_name( $attribute['name'] )
)
)
@@ -286,38 +288,44 @@ class WC_Product_Variable_Data_Store_CPT extends WC_Product_Data_Store_CPT imple
if ( $for_display ) {
if ( 'incl' === get_option( 'woocommerce_tax_display_shop' ) ) {
$price = '' === $price ? '' : wc_get_price_including_tax(
- $variation, array(
+ $variation,
+ array(
'qty' => 1,
'price' => $price,
)
);
$regular_price = '' === $regular_price ? '' : wc_get_price_including_tax(
- $variation, array(
+ $variation,
+ array(
'qty' => 1,
'price' => $regular_price,
)
);
$sale_price = '' === $sale_price ? '' : wc_get_price_including_tax(
- $variation, array(
+ $variation,
+ array(
'qty' => 1,
'price' => $sale_price,
)
);
} else {
$price = '' === $price ? '' : wc_get_price_excluding_tax(
- $variation, array(
+ $variation,
+ array(
'qty' => 1,
'price' => $price,
)
);
$regular_price = '' === $regular_price ? '' : wc_get_price_excluding_tax(
- $variation, array(
+ $variation,
+ array(
'qty' => 1,
'price' => $regular_price,
)
);
$sale_price = '' === $sale_price ? '' : wc_get_price_excluding_tax(
- $variation, array(
+ $variation,
+ array(
'qty' => 1,
'price' => $sale_price,
)
@@ -394,7 +402,7 @@ class WC_Product_Variable_Data_Store_CPT extends WC_Product_Data_Store_CPT imple
public function child_has_weight( $product ) {
global $wpdb;
$children = $product->get_visible_children();
- return $children ? null !== $wpdb->get_var( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_weight' AND meta_value > 0 AND post_id IN ( " . implode( ',', array_map( 'absint', $children ) ) . ' )' ) : false; // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
+ return $children ? null !== $wpdb->get_var( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_weight' AND meta_value > 0 AND post_id IN ( " . implode( ',', array_map( 'absint', $children ) ) . ' )' ) : false; // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
}
/**
@@ -407,7 +415,7 @@ class WC_Product_Variable_Data_Store_CPT extends WC_Product_Data_Store_CPT imple
public function child_has_dimensions( $product ) {
global $wpdb;
$children = $product->get_visible_children();
- return $children ? null !== $wpdb->get_var( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key IN ( '_length', '_width', '_height' ) AND meta_value > 0 AND post_id IN ( " . implode( ',', array_map( 'absint', $children ) ) . ' )' ) : false; // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
+ return $children ? null !== $wpdb->get_var( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key IN ( '_length', '_width', '_height' ) AND meta_value > 0 AND post_id IN ( " . implode( ',', array_map( 'absint', $children ) ) . ' )' ) : false; // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
}
/**
@@ -437,7 +445,8 @@ class WC_Product_Variable_Data_Store_CPT extends WC_Product_Data_Store_CPT imple
if ( $children ) {
$children_with_status = $wpdb->get_var(
$wpdb->prepare(
- "SELECT COUNT( post_id ) FROM $wpdb->postmeta WHERE meta_key = '_stock_status' AND meta_value = %s AND post_id IN ( " . implode( ',', array_map( 'absint', $children ) ) . ' )', // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
+ // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
+ "SELECT COUNT( post_id ) FROM $wpdb->postmeta WHERE meta_key = '_stock_status' AND meta_value = %s AND post_id IN ( " . implode( ',', array_map( 'absint', $children ) ) . ' )',
$status
)
);
@@ -487,7 +496,7 @@ class WC_Product_Variable_Data_Store_CPT extends WC_Product_Data_Store_CPT imple
if ( $product->get_manage_stock() ) {
$status = $product->get_stock_status();
$children = $product->get_children();
- $managed_children = $children ? array_unique( $wpdb->get_col( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_manage_stock' AND meta_value != 'yes' AND post_id IN ( " . implode( ',', array_map( 'absint', $children ) ) . ' )' ) ) : array(); // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
+ $managed_children = $children ? array_unique( $wpdb->get_col( "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_manage_stock' AND meta_value != 'yes' AND post_id IN ( " . implode( ',', array_map( 'absint', $children ) ) . ' )' ) ) : array(); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
$changed = false;
foreach ( $managed_children as $managed_child ) {
if ( update_post_meta( $managed_child, '_stock_status', $status ) ) {
@@ -512,7 +521,7 @@ class WC_Product_Variable_Data_Store_CPT extends WC_Product_Data_Store_CPT imple
global $wpdb;
$children = $product->get_visible_children();
- $prices = $children ? array_unique( $wpdb->get_col( "SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = '_price' AND post_id IN ( " . implode( ',', array_map( 'absint', $children ) ) . ' )' ) ) : array(); // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
+ $prices = $children ? array_unique( $wpdb->get_col( "SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = '_price' AND post_id IN ( " . implode( ',', array_map( 'absint', $children ) ) . ' )' ) ) : array(); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
delete_post_meta( $product->get_id(), '_price' );
delete_post_meta( $product->get_id(), '_sale_price' );
diff --git a/includes/data-stores/class-wc-product-variation-data-store-cpt.php b/includes/data-stores/class-wc-product-variation-data-store-cpt.php
index b209f4b485c..eb3a99a201b 100644
--- a/includes/data-stores/class-wc-product-variation-data-store-cpt.php
+++ b/includes/data-stores/class-wc-product-variation-data-store-cpt.php
@@ -113,7 +113,8 @@ class WC_Product_Variation_Data_Store_CPT extends WC_Product_Data_Store_CPT impl
$id = wp_insert_post(
apply_filters(
- 'woocommerce_new_product_variation_data', array(
+ 'woocommerce_new_product_variation_data',
+ array(
'post_type' => 'product_variation',
'post_status' => $product->get_status() ? $product->get_status() : 'publish',
'post_author' => get_current_user_id(),
@@ -127,7 +128,8 @@ class WC_Product_Variation_Data_Store_CPT extends WC_Product_Data_Store_CPT impl
'post_date_gmt' => gmdate( 'Y-m-d H:i:s', $product->get_date_created( 'edit' )->getTimestamp() ),
'post_name' => $product->get_slug( 'edit' ),
)
- ), true
+ ),
+ true
);
if ( $id && ! is_wp_error( $id ) ) {
@@ -432,7 +434,8 @@ class WC_Product_Variation_Data_Store_CPT extends WC_Product_Data_Store_CPT impl
// Remove old taxonomies attributes so data is kept up to date - first get attribute key names.
$delete_attribute_keys = $wpdb->get_col(
$wpdb->prepare(
- "SELECT meta_key FROM {$wpdb->postmeta} WHERE meta_key LIKE %s AND meta_key NOT IN ( '" . implode( "','", array_map( 'esc_sql', $updated_attribute_keys ) ) . "' ) AND post_id = %d", // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQLPlaceholders.QuotedDynamicPlaceholderGeneration
+ // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQLPlaceholders.QuotedDynamicPlaceholderGeneration
+ "SELECT meta_key FROM {$wpdb->postmeta} WHERE meta_key LIKE %s AND meta_key NOT IN ( '" . implode( "','", array_map( 'esc_sql', $updated_attribute_keys ) ) . "' ) AND post_id = %d",
$wpdb->esc_like( 'attribute_' ) . '%',
$product->get_id()
)
diff --git a/includes/data-stores/class-wc-shipping-zone-data-store.php b/includes/data-stores/class-wc-shipping-zone-data-store.php
index c6b9f8e3e67..342db072a62 100644
--- a/includes/data-stores/class-wc-shipping-zone-data-store.php
+++ b/includes/data-stores/class-wc-shipping-zone-data-store.php
@@ -25,7 +25,8 @@ class WC_Shipping_Zone_Data_Store extends WC_Data_Store_WP implements WC_Shippin
public function create( &$zone ) {
global $wpdb;
$wpdb->insert(
- $wpdb->prefix . 'woocommerce_shipping_zones', array(
+ $wpdb->prefix . 'woocommerce_shipping_zones',
+ array(
'zone_name' => $zone->get_zone_name(),
'zone_order' => $zone->get_zone_order(),
)
@@ -48,10 +49,12 @@ class WC_Shipping_Zone_Data_Store extends WC_Data_Store_WP implements WC_Shippin
global $wpdb;
if ( $zone->get_id() ) {
$wpdb->update(
- $wpdb->prefix . 'woocommerce_shipping_zones', array(
+ $wpdb->prefix . 'woocommerce_shipping_zones',
+ array(
'zone_name' => $zone->get_zone_name(),
'zone_order' => $zone->get_zone_order(),
- ), array( 'zone_id' => $zone->get_id() )
+ ),
+ array( 'zone_id' => $zone->get_id() )
);
}
$zone->save_meta_data();
@@ -140,7 +143,7 @@ class WC_Shipping_Zone_Data_Store extends WC_Data_Store_WP implements WC_Shippin
$raw_methods_sql = "SELECT method_id, method_order, instance_id, is_enabled FROM {$wpdb->prefix}woocommerce_shipping_zone_methods WHERE zone_id = %d";
}
- return $wpdb->get_results( $wpdb->prepare( $raw_methods_sql, $zone_id ) ); // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
+ return $wpdb->get_results( $wpdb->prepare( $raw_methods_sql, $zone_id ) ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
}
/**
@@ -245,7 +248,7 @@ class WC_Shipping_Zone_Data_Store extends WC_Data_Store_WP implements WC_Shippin
return $wpdb->get_var(
"SELECT zones.zone_id FROM {$wpdb->prefix}woocommerce_shipping_zones as zones
LEFT OUTER JOIN {$wpdb->prefix}woocommerce_shipping_zone_locations as locations ON zones.zone_id = locations.zone_id AND location_type != 'postcode'
- WHERE " . implode( ' ', $criteria ) // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
+ WHERE " . implode( ' ', $criteria ) // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
. ' ORDER BY zone_order ASC, zone_id ASC LIMIT 1'
);
}
@@ -317,7 +320,8 @@ class WC_Shipping_Zone_Data_Store extends WC_Data_Store_WP implements WC_Shippin
foreach ( $zone->get_zone_locations( 'edit' ) as $location ) {
$wpdb->insert(
- $wpdb->prefix . 'woocommerce_shipping_zone_locations', array(
+ $wpdb->prefix . 'woocommerce_shipping_zone_locations',
+ array(
'zone_id' => $zone->get_id(),
'location_code' => $location->code,
'location_type' => $location->type,
diff --git a/includes/emails/class-wc-email-cancelled-order.php b/includes/emails/class-wc-email-cancelled-order.php
index fc614713ef0..06df5915cd2 100644
--- a/includes/emails/class-wc-email-cancelled-order.php
+++ b/includes/emails/class-wc-email-cancelled-order.php
@@ -33,9 +33,10 @@ if ( ! class_exists( 'WC_Email_Cancelled_Order', false ) ) :
$this->template_html = 'emails/admin-cancelled-order.php';
$this->template_plain = 'emails/plain/admin-cancelled-order.php';
$this->placeholders = array(
- '{site_title}' => $this->get_blogname(),
- '{order_date}' => '',
- '{order_number}' => '',
+ '{site_title}' => $this->get_blogname(),
+ '{order_date}' => '',
+ '{order_number}' => '',
+ '{order_billing_full_name}' => '',
);
// Triggers for this email.
@@ -56,7 +57,7 @@ if ( ! class_exists( 'WC_Email_Cancelled_Order', false ) ) :
* @return string
*/
public function get_default_subject() {
- return __( '[{site_title}] Cancelled order ({order_number})', 'woocommerce' );
+ return __( '[{site_title}]: {order_billing_full_name} has cancelled order #{order_number}', 'woocommerce' );
}
/**
@@ -66,7 +67,7 @@ if ( ! class_exists( 'WC_Email_Cancelled_Order', false ) ) :
* @return string
*/
public function get_default_heading() {
- return __( 'Cancelled order', 'woocommerce' );
+ return __( 'Order Cancelled: #{order_number}', 'woocommerce' );
}
/**
@@ -83,9 +84,10 @@ if ( ! class_exists( 'WC_Email_Cancelled_Order', false ) ) :
}
if ( is_a( $order, 'WC_Order' ) ) {
- $this->object = $order;
- $this->placeholders['{order_date}'] = wc_format_datetime( $this->object->get_date_created() );
- $this->placeholders['{order_number}'] = $this->object->get_order_number();
+ $this->object = $order;
+ $this->placeholders['{order_date}'] = wc_format_datetime( $this->object->get_date_created() );
+ $this->placeholders['{order_number}'] = $this->object->get_order_number();
+ $this->placeholders['{order_billing_full_name}'] = $this->object->get_formatted_billing_full_name();
}
if ( $this->is_enabled() && $this->get_recipient() ) {
@@ -98,7 +100,6 @@ if ( ! class_exists( 'WC_Email_Cancelled_Order', false ) ) :
/**
* Get content html.
*
- * @access public
* @return string
*/
public function get_content_html() {
diff --git a/includes/emails/class-wc-email-customer-completed-order.php b/includes/emails/class-wc-email-customer-completed-order.php
index 87a2fac0bcf..5a515dc51cb 100644
--- a/includes/emails/class-wc-email-customer-completed-order.php
+++ b/includes/emails/class-wc-email-customer-completed-order.php
@@ -80,7 +80,7 @@ if ( ! class_exists( 'WC_Email_Customer_Completed_Order', false ) ) :
* @return string
*/
public function get_default_subject() {
- return __( 'Your {site_title} order from {order_date} is complete', 'woocommerce' );
+ return __( 'Your {site_title} order is now complete', 'woocommerce' );
}
/**
@@ -90,13 +90,12 @@ if ( ! class_exists( 'WC_Email_Customer_Completed_Order', false ) ) :
* @return string
*/
public function get_default_heading() {
- return __( 'Your order is complete', 'woocommerce' );
+ return __( 'Thanks for shopping with us', 'woocommerce' );
}
/**
* Get content html.
*
- * @access public
* @return string
*/
public function get_content_html() {
diff --git a/includes/emails/class-wc-email-customer-invoice.php b/includes/emails/class-wc-email-customer-invoice.php
index ee332af49b9..d6659c4f1bf 100644
--- a/includes/emails/class-wc-email-customer-invoice.php
+++ b/includes/emails/class-wc-email-customer-invoice.php
@@ -17,7 +17,7 @@ if ( ! class_exists( 'WC_Email_Customer_Invoice', false ) ) :
* An email sent to the customer via admin.
*
* @class WC_Email_Customer_Invoice
- * @version 2.3.0
+ * @version 3.5.0
* @package WooCommerce/Classes/Emails
* @extends WC_Email
*/
@@ -54,9 +54,9 @@ if ( ! class_exists( 'WC_Email_Customer_Invoice', false ) ) :
*/
public function get_default_subject( $paid = false ) {
if ( $paid ) {
- return __( 'Your {site_title} order from {order_date}', 'woocommerce' );
+ return __( 'Invoice for order #{order_number} on {site_title}', 'woocommerce' );
} else {
- return __( 'Invoice for order {order_number}', 'woocommerce' );
+ return __( 'Your latest {site_title} invoice', 'woocommerce' );
}
}
@@ -69,16 +69,15 @@ if ( ! class_exists( 'WC_Email_Customer_Invoice', false ) ) :
*/
public function get_default_heading( $paid = false ) {
if ( $paid ) {
- return __( 'Your order details', 'woocommerce' );
+ return __( 'Invoice for order #{order_number}', 'woocommerce' );
} else {
- return __( 'Invoice for order {order_number}', 'woocommerce' );
+ return __( 'Your invoice for order #{order_number}', 'woocommerce' );
}
}
/**
* Get email subject.
*
- * @access public
* @return string
*/
public function get_subject() {
@@ -95,7 +94,6 @@ if ( ! class_exists( 'WC_Email_Customer_Invoice', false ) ) :
/**
* Get email heading.
*
- * @access public
* @return string
*/
public function get_heading() {
@@ -138,7 +136,6 @@ if ( ! class_exists( 'WC_Email_Customer_Invoice', false ) ) :
/**
* Get content html.
*
- * @access public
* @return string
*/
public function get_content_html() {
@@ -156,7 +153,6 @@ if ( ! class_exists( 'WC_Email_Customer_Invoice', false ) ) :
/**
* Get content plain.
*
- * @access public
* @return string
*/
public function get_content_plain() {
diff --git a/includes/emails/class-wc-email-customer-new-account.php b/includes/emails/class-wc-email-customer-new-account.php
index 413321f41ea..940dca513fe 100644
--- a/includes/emails/class-wc-email-customer-new-account.php
+++ b/includes/emails/class-wc-email-customer-new-account.php
@@ -17,7 +17,7 @@ if ( ! class_exists( 'WC_Email_Customer_New_Account', false ) ) :
* An email sent to the customer when they create an account.
*
* @class WC_Email_Customer_New_Account
- * @version 2.3.0
+ * @version 3.5.0
* @package WooCommerce/Classes/Emails
* @extends WC_Email
*/
@@ -73,7 +73,7 @@ if ( ! class_exists( 'WC_Email_Customer_New_Account', false ) ) :
* @return string
*/
public function get_default_subject() {
- return __( 'Your account on {site_title}', 'woocommerce' );
+ return __( 'Your {site_title} account has been created!', 'woocommerce' );
}
/**
@@ -116,7 +116,6 @@ if ( ! class_exists( 'WC_Email_Customer_New_Account', false ) ) :
/**
* Get content html.
*
- * @access public
* @return string
*/
public function get_content_html() {
@@ -137,7 +136,6 @@ if ( ! class_exists( 'WC_Email_Customer_New_Account', false ) ) :
/**
* Get content plain.
*
- * @access public
* @return string
*/
public function get_content_plain() {
diff --git a/includes/emails/class-wc-email-customer-note.php b/includes/emails/class-wc-email-customer-note.php
index 30af000ea2b..c299ca5bdb9 100644
--- a/includes/emails/class-wc-email-customer-note.php
+++ b/includes/emails/class-wc-email-customer-note.php
@@ -17,7 +17,7 @@ if ( ! class_exists( 'WC_Email_Customer_Note', false ) ) :
* Customer note emails are sent when you add a note to an order.
*
* @class WC_Email_Customer_Note
- * @version 2.3.0
+ * @version 3.5.0
* @package WooCommerce/Classes/Emails
* @extends WC_Email
*/
@@ -114,7 +114,6 @@ if ( ! class_exists( 'WC_Email_Customer_Note', false ) ) :
/**
* Get content html.
*
- * @access public
* @return string
*/
public function get_content_html() {
@@ -133,7 +132,6 @@ if ( ! class_exists( 'WC_Email_Customer_Note', false ) ) :
/**
* Get content plain.
*
- * @access public
* @return string
*/
public function get_content_plain() {
diff --git a/includes/emails/class-wc-email-customer-on-hold-order.php b/includes/emails/class-wc-email-customer-on-hold-order.php
index 1a379a1454c..70fc5e7c867 100644
--- a/includes/emails/class-wc-email-customer-on-hold-order.php
+++ b/includes/emails/class-wc-email-customer-on-hold-order.php
@@ -42,6 +42,7 @@ if ( ! class_exists( 'WC_Email_Customer_On_Hold_Order', false ) ) :
// Triggers for this email.
add_action( 'woocommerce_order_status_pending_to_on-hold_notification', array( $this, 'trigger' ), 10, 2 );
add_action( 'woocommerce_order_status_failed_to_on-hold_notification', array( $this, 'trigger' ), 10, 2 );
+ add_action( 'woocommerce_order_status_cancelled_to_on-hold_notification', array( $this, 'trigger' ), 10, 2 );
// Call parent constructor.
parent::__construct();
@@ -54,7 +55,7 @@ if ( ! class_exists( 'WC_Email_Customer_On_Hold_Order', false ) ) :
* @return string
*/
public function get_default_subject() {
- return __( 'Your {site_title} order receipt from {order_date}', 'woocommerce' );
+ return __( 'Your {site_title} order has been received!', 'woocommerce' );
}
/**
@@ -97,7 +98,6 @@ if ( ! class_exists( 'WC_Email_Customer_On_Hold_Order', false ) ) :
/**
* Get content html.
*
- * @access public
* @return string
*/
public function get_content_html() {
@@ -115,7 +115,6 @@ if ( ! class_exists( 'WC_Email_Customer_On_Hold_Order', false ) ) :
/**
* Get content plain.
*
- * @access public
* @return string
*/
public function get_content_plain() {
diff --git a/includes/emails/class-wc-email-customer-processing-order.php b/includes/emails/class-wc-email-customer-processing-order.php
index d6649a5121a..20b6f888c00 100644
--- a/includes/emails/class-wc-email-customer-processing-order.php
+++ b/includes/emails/class-wc-email-customer-processing-order.php
@@ -17,7 +17,7 @@ if ( ! class_exists( 'WC_Email_Customer_Processing_Order', false ) ) :
* An email sent to the customer when a new order is paid for.
*
* @class WC_Email_Customer_Processing_Order
- * @version 2.0.0
+ * @version 3.5.0
* @package WooCommerce/Classes/Emails
* @extends WC_Email
*/
@@ -41,6 +41,7 @@ if ( ! class_exists( 'WC_Email_Customer_Processing_Order', false ) ) :
);
// Triggers for this email.
+ add_action( 'woocommerce_order_status_cancelled_to_processing_notification', array( $this, 'trigger' ), 10, 2 );
add_action( 'woocommerce_order_status_failed_to_processing_notification', array( $this, 'trigger' ), 10, 2 );
add_action( 'woocommerce_order_status_on-hold_to_processing_notification', array( $this, 'trigger' ), 10, 2 );
add_action( 'woocommerce_order_status_pending_to_processing_notification', array( $this, 'trigger' ), 10, 2 );
@@ -56,7 +57,7 @@ if ( ! class_exists( 'WC_Email_Customer_Processing_Order', false ) ) :
* @return string
*/
public function get_default_subject() {
- return __( 'Your {site_title} order receipt from {order_date}', 'woocommerce' );
+ return __( 'Payment received for your order', 'woocommerce' );
}
/**
@@ -66,7 +67,7 @@ if ( ! class_exists( 'WC_Email_Customer_Processing_Order', false ) ) :
* @return string
*/
public function get_default_heading() {
- return __( 'Thank you for your order', 'woocommerce' );
+ return __( 'Thank you for your payment', 'woocommerce' );
}
/**
@@ -99,7 +100,6 @@ if ( ! class_exists( 'WC_Email_Customer_Processing_Order', false ) ) :
/**
* Get content html.
*
- * @access public
* @return string
*/
public function get_content_html() {
@@ -117,7 +117,6 @@ if ( ! class_exists( 'WC_Email_Customer_Processing_Order', false ) ) :
/**
* Get content plain.
*
- * @access public
* @return string
*/
public function get_content_plain() {
diff --git a/includes/emails/class-wc-email-customer-refunded-order.php b/includes/emails/class-wc-email-customer-refunded-order.php
index f43b257e3c5..9cff70b7873 100644
--- a/includes/emails/class-wc-email-customer-refunded-order.php
+++ b/includes/emails/class-wc-email-customer-refunded-order.php
@@ -17,7 +17,7 @@ if ( ! class_exists( 'WC_Email_Customer_Refunded_Order', false ) ) :
* Order refunded emails are sent to the customer when the order is marked refunded.
*
* @class WC_Email_Customer_Refunded_Order
- * @version 2.4.0
+ * @version 3.5.0
* @package WooCommerce/Classes/Emails
* @extends WC_Email
*/
@@ -70,9 +70,9 @@ if ( ! class_exists( 'WC_Email_Customer_Refunded_Order', false ) ) :
*/
public function get_default_subject( $partial = false ) {
if ( $partial ) {
- return __( 'Your {site_title} order from {order_date} has been partially refunded', 'woocommerce' );
+ return __( 'Your {site_title} order #{order_number} has been partially refunded', 'woocommerce' );
} else {
- return __( 'Your {site_title} order from {order_date} has been refunded', 'woocommerce' );
+ return __( 'Your {site_title} order #{order_number} has been refunded', 'woocommerce' );
}
}
@@ -85,16 +85,15 @@ if ( ! class_exists( 'WC_Email_Customer_Refunded_Order', false ) ) :
*/
public function get_default_heading( $partial = false ) {
if ( $partial ) {
- return __( 'Your order has been partially refunded', 'woocommerce' );
+ return __( 'Partial Refund: Order {order_number}', 'woocommerce' );
} else {
- return __( 'Order {order_number} details', 'woocommerce' );
+ return __( 'Order Refunded: {order_number}', 'woocommerce' );
}
}
/**
* Get email subject.
*
- * @access public
* @return string
*/
public function get_subject() {
@@ -109,7 +108,6 @@ if ( ! class_exists( 'WC_Email_Customer_Refunded_Order', false ) ) :
/**
* Get email heading.
*
- * @access public
* @return string
*/
public function get_heading() {
@@ -184,7 +182,6 @@ if ( ! class_exists( 'WC_Email_Customer_Refunded_Order', false ) ) :
/**
* Get content html.
*
- * @access public
* @return string
*/
public function get_content_html() {
diff --git a/includes/emails/class-wc-email-customer-reset-password.php b/includes/emails/class-wc-email-customer-reset-password.php
index a5d20572422..9bc5d168e8e 100644
--- a/includes/emails/class-wc-email-customer-reset-password.php
+++ b/includes/emails/class-wc-email-customer-reset-password.php
@@ -17,7 +17,7 @@ if ( ! class_exists( 'WC_Email_Customer_Reset_Password', false ) ) :
* An email sent to the customer when they reset their password.
*
* @class WC_Email_Customer_Reset_Password
- * @version 2.3.0
+ * @version 3.5.0
* @package WooCommerce/Classes/Emails
* @extends WC_Email
*/
@@ -79,7 +79,7 @@ if ( ! class_exists( 'WC_Email_Customer_Reset_Password', false ) ) :
* @return string
*/
public function get_default_subject() {
- return __( 'Password reset for {site_title}', 'woocommerce' );
+ return __( 'Password Reset Request for {site_title}', 'woocommerce' );
}
/**
@@ -89,7 +89,7 @@ if ( ! class_exists( 'WC_Email_Customer_Reset_Password', false ) ) :
* @return string
*/
public function get_default_heading() {
- return __( 'Password reset instructions', 'woocommerce' );
+ return __( 'Password Reset Request', 'woocommerce' );
}
/**
@@ -120,7 +120,6 @@ if ( ! class_exists( 'WC_Email_Customer_Reset_Password', false ) ) :
/**
* Get content html.
*
- * @access public
* @return string
*/
public function get_content_html() {
@@ -141,7 +140,6 @@ if ( ! class_exists( 'WC_Email_Customer_Reset_Password', false ) ) :
/**
* Get content plain.
*
- * @access public
* @return string
*/
public function get_content_plain() {
diff --git a/includes/emails/class-wc-email-failed-order.php b/includes/emails/class-wc-email-failed-order.php
index b8f7f761964..78e1eba780e 100644
--- a/includes/emails/class-wc-email-failed-order.php
+++ b/includes/emails/class-wc-email-failed-order.php
@@ -56,7 +56,7 @@ if ( ! class_exists( 'WC_Email_Failed_Order', false ) ) :
* @return string
*/
public function get_default_subject() {
- return __( '[{site_title}] Failed order ({order_number})', 'woocommerce' );
+ return __( '[{site_title}]: Order #{order_number} has failed', 'woocommerce' );
}
/**
@@ -66,7 +66,7 @@ if ( ! class_exists( 'WC_Email_Failed_Order', false ) ) :
* @return string
*/
public function get_default_heading() {
- return __( 'Failed order', 'woocommerce' );
+ return __( 'Order Failed: #{order_number}', 'woocommerce' );
}
/**
@@ -98,7 +98,6 @@ if ( ! class_exists( 'WC_Email_Failed_Order', false ) ) :
/**
* Get content html.
*
- * @access public
* @return string
*/
public function get_content_html() {
diff --git a/includes/emails/class-wc-email-new-order.php b/includes/emails/class-wc-email-new-order.php
index 9654051227d..952e8030928 100644
--- a/includes/emails/class-wc-email-new-order.php
+++ b/includes/emails/class-wc-email-new-order.php
@@ -45,6 +45,9 @@ if ( ! class_exists( 'WC_Email_New_Order' ) ) :
add_action( 'woocommerce_order_status_failed_to_processing_notification', array( $this, 'trigger' ), 10, 2 );
add_action( 'woocommerce_order_status_failed_to_completed_notification', array( $this, 'trigger' ), 10, 2 );
add_action( 'woocommerce_order_status_failed_to_on-hold_notification', array( $this, 'trigger' ), 10, 2 );
+ add_action( 'woocommerce_order_status_cancelled_to_processing_notification', array( $this, 'trigger' ), 10, 2 );
+ add_action( 'woocommerce_order_status_cancelled_to_completed_notification', array( $this, 'trigger' ), 10, 2 );
+ add_action( 'woocommerce_order_status_cancelled_to_on-hold_notification', array( $this, 'trigger' ), 10, 2 );
// Call parent constructor.
parent::__construct();
@@ -60,7 +63,7 @@ if ( ! class_exists( 'WC_Email_New_Order' ) ) :
* @return string
*/
public function get_default_subject() {
- return __( '[{site_title}] New customer order ({order_number}) - {order_date}', 'woocommerce' );
+ return __( '[{site_title}]: New order #{order_number}', 'woocommerce' );
}
/**
@@ -70,7 +73,7 @@ if ( ! class_exists( 'WC_Email_New_Order' ) ) :
* @return string
*/
public function get_default_heading() {
- return __( 'New customer order', 'woocommerce' );
+ return __( 'New Order: #{order_number}', 'woocommerce' );
}
/**
@@ -102,7 +105,6 @@ if ( ! class_exists( 'WC_Email_New_Order' ) ) :
/**
* Get content html.
*
- * @access public
* @return string
*/
public function get_content_html() {
@@ -120,7 +122,6 @@ if ( ! class_exists( 'WC_Email_New_Order' ) ) :
/**
* Get content plain.
*
- * @access public
* @return string
*/
public function get_content_plain() {
diff --git a/includes/export/abstract-wc-csv-exporter.php b/includes/export/abstract-wc-csv-exporter.php
index 4b867b3daa1..7a37d5d1232 100644
--- a/includes/export/abstract-wc-csv-exporter.php
+++ b/includes/export/abstract-wc-csv-exporter.php
@@ -171,7 +171,7 @@ abstract class WC_CSV_Exporter {
*/
public function send_headers() {
if ( function_exists( 'gc_enable' ) ) {
- gc_enable(); // phpcs:ignore PHPCompatibility.PHP.NewFunctions.gc_enableFound
+ gc_enable(); // phpcs:ignore PHPCompatibility.FunctionUse.NewFunctions.gc_enableFound
}
if ( function_exists( 'apache_setenv' ) ) {
@apache_setenv( 'no-gzip', 1 ); // @codingStandardsIgnoreLine
@@ -354,7 +354,7 @@ abstract class WC_CSV_Exporter {
$active_content_triggers = array( '=', '+', '-', '@' );
if ( in_array( mb_substr( $data, 0, 1 ), $active_content_triggers, true ) ) {
- $data = "'" . $data . "'";
+ $data = "'" . $data;
}
return $data;
@@ -379,7 +379,6 @@ abstract class WC_CSV_Exporter {
}
$use_mb = function_exists( 'mb_convert_encoding' );
- $data = (string) urldecode( $data );
if ( $use_mb ) {
$encoding = mb_detect_encoding( $data, 'UTF-8, ISO-8859-1', true );
diff --git a/includes/export/class-wc-product-csv-exporter.php b/includes/export/class-wc-product-csv-exporter.php
index a2229780e2b..e593284c50b 100644
--- a/includes/export/class-wc-product-csv-exporter.php
+++ b/includes/export/class-wc-product-csv-exporter.php
@@ -2,8 +2,8 @@
/**
* Handles product CSV export.
*
- * @package WooCommerce/Export
- * @version 3.1.0
+ * @package WooCommerce/Export
+ * @version 3.1.0
*/
if ( ! defined( 'ABSPATH' ) ) {
@@ -61,8 +61,9 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Should meta be exported?
*
- * @since 3.1.0
* @param bool $enable_meta_export Should meta be exported.
+ *
+ * @since 3.1.0
*/
public function enable_meta_export( $enable_meta_export ) {
$this->enable_meta_export = (bool) $enable_meta_export;
@@ -71,8 +72,9 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Product types to export.
*
- * @since 3.1.0
* @param array $product_types_to_export List of types to export.
+ *
+ * @since 3.1.0
*/
public function set_product_types_to_export( $product_types_to_export ) {
$this->product_types_to_export = array_map( 'wc_clean', $product_types_to_export );
@@ -81,8 +83,9 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Product category to export
*
- * @since 3.5.0
* @param string $product_category_to_export Product category slug to export, empty string exports all.
+ *
+ * @since 3.5.0
* @return void
*/
public function set_product_category_to_export( $product_category_to_export ) {
@@ -92,55 +95,58 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Return an array of columns to export.
*
- * @since 3.1.0
+ * @since 3.1.0
* @return array
*/
public function get_default_column_names() {
- return apply_filters( "woocommerce_product_export_{$this->export_type}_default_columns", array(
- 'id' => __( 'ID', 'woocommerce' ),
- 'type' => __( 'Type', 'woocommerce' ),
- 'sku' => __( 'SKU', 'woocommerce' ),
- 'name' => __( 'Name', 'woocommerce' ),
- 'published' => __( 'Published', 'woocommerce' ),
- 'featured' => __( 'Is featured?', 'woocommerce' ),
- 'catalog_visibility' => __( 'Visibility in catalog', 'woocommerce' ),
- 'short_description' => __( 'Short description', 'woocommerce' ),
- 'description' => __( 'Description', 'woocommerce' ),
- 'date_on_sale_from' => __( 'Date sale price starts', 'woocommerce' ),
- 'date_on_sale_to' => __( 'Date sale price ends', 'woocommerce' ),
- 'tax_status' => __( 'Tax status', 'woocommerce' ),
- 'tax_class' => __( 'Tax class', 'woocommerce' ),
- 'stock_status' => __( 'In stock?', 'woocommerce' ),
- 'stock' => __( 'Stock', 'woocommerce' ),
- 'low_stock_amount' => __( 'Low stock amount', 'woocommerce' ),
- 'backorders' => __( 'Backorders allowed?', 'woocommerce' ),
- 'sold_individually' => __( 'Sold individually?', 'woocommerce' ),
- /* translators: %s: weight */
- 'weight' => sprintf( __( 'Weight (%s)', 'woocommerce' ), get_option( 'woocommerce_weight_unit' ) ),
- /* translators: %s: length */
- 'length' => sprintf( __( 'Length (%s)', 'woocommerce' ), get_option( 'woocommerce_dimension_unit' ) ),
- /* translators: %s: width */
- 'width' => sprintf( __( 'Width (%s)', 'woocommerce' ), get_option( 'woocommerce_dimension_unit' ) ),
- /* translators: %s: Height */
- 'height' => sprintf( __( 'Height (%s)', 'woocommerce' ), get_option( 'woocommerce_dimension_unit' ) ),
- 'reviews_allowed' => __( 'Allow customer reviews?', 'woocommerce' ),
- 'purchase_note' => __( 'Purchase note', 'woocommerce' ),
- 'sale_price' => __( 'Sale price', 'woocommerce' ),
- 'regular_price' => __( 'Regular price', 'woocommerce' ),
- 'category_ids' => __( 'Categories', 'woocommerce' ),
- 'tag_ids' => __( 'Tags', 'woocommerce' ),
- 'shipping_class_id' => __( 'Shipping class', 'woocommerce' ),
- 'images' => __( 'Images', 'woocommerce' ),
- 'download_limit' => __( 'Download limit', 'woocommerce' ),
- 'download_expiry' => __( 'Download expiry days', 'woocommerce' ),
- 'parent_id' => __( 'Parent', 'woocommerce' ),
- 'grouped_products' => __( 'Grouped products', 'woocommerce' ),
- 'upsell_ids' => __( 'Upsells', 'woocommerce' ),
- 'cross_sell_ids' => __( 'Cross-sells', 'woocommerce' ),
- 'product_url' => __( 'External URL', 'woocommerce' ),
- 'button_text' => __( 'Button text', 'woocommerce' ),
- 'menu_order' => __( 'Position', 'woocommerce' ),
- ) );
+ return apply_filters(
+ "woocommerce_product_export_{$this->export_type}_default_columns",
+ array(
+ 'id' => __( 'ID', 'woocommerce' ),
+ 'type' => __( 'Type', 'woocommerce' ),
+ 'sku' => __( 'SKU', 'woocommerce' ),
+ 'name' => __( 'Name', 'woocommerce' ),
+ 'published' => __( 'Published', 'woocommerce' ),
+ 'featured' => __( 'Is featured?', 'woocommerce' ),
+ 'catalog_visibility' => __( 'Visibility in catalog', 'woocommerce' ),
+ 'short_description' => __( 'Short description', 'woocommerce' ),
+ 'description' => __( 'Description', 'woocommerce' ),
+ 'date_on_sale_from' => __( 'Date sale price starts', 'woocommerce' ),
+ 'date_on_sale_to' => __( 'Date sale price ends', 'woocommerce' ),
+ 'tax_status' => __( 'Tax status', 'woocommerce' ),
+ 'tax_class' => __( 'Tax class', 'woocommerce' ),
+ 'stock_status' => __( 'In stock?', 'woocommerce' ),
+ 'stock' => __( 'Stock', 'woocommerce' ),
+ 'low_stock_amount' => __( 'Low stock amount', 'woocommerce' ),
+ 'backorders' => __( 'Backorders allowed?', 'woocommerce' ),
+ 'sold_individually' => __( 'Sold individually?', 'woocommerce' ),
+ /* translators: %s: weight */
+ 'weight' => sprintf( __( 'Weight (%s)', 'woocommerce' ), get_option( 'woocommerce_weight_unit' ) ),
+ /* translators: %s: length */
+ 'length' => sprintf( __( 'Length (%s)', 'woocommerce' ), get_option( 'woocommerce_dimension_unit' ) ),
+ /* translators: %s: width */
+ 'width' => sprintf( __( 'Width (%s)', 'woocommerce' ), get_option( 'woocommerce_dimension_unit' ) ),
+ /* translators: %s: Height */
+ 'height' => sprintf( __( 'Height (%s)', 'woocommerce' ), get_option( 'woocommerce_dimension_unit' ) ),
+ 'reviews_allowed' => __( 'Allow customer reviews?', 'woocommerce' ),
+ 'purchase_note' => __( 'Purchase note', 'woocommerce' ),
+ 'sale_price' => __( 'Sale price', 'woocommerce' ),
+ 'regular_price' => __( 'Regular price', 'woocommerce' ),
+ 'category_ids' => __( 'Categories', 'woocommerce' ),
+ 'tag_ids' => __( 'Tags', 'woocommerce' ),
+ 'shipping_class_id' => __( 'Shipping class', 'woocommerce' ),
+ 'images' => __( 'Images', 'woocommerce' ),
+ 'download_limit' => __( 'Download limit', 'woocommerce' ),
+ 'download_expiry' => __( 'Download expiry days', 'woocommerce' ),
+ 'parent_id' => __( 'Parent', 'woocommerce' ),
+ 'grouped_products' => __( 'Grouped products', 'woocommerce' ),
+ 'upsell_ids' => __( 'Upsells', 'woocommerce' ),
+ 'cross_sell_ids' => __( 'Cross-sells', 'woocommerce' ),
+ 'product_url' => __( 'External URL', 'woocommerce' ),
+ 'button_text' => __( 'Button text', 'woocommerce' ),
+ 'menu_order' => __( 'Position', 'woocommerce' ),
+ )
+ );
}
/**
@@ -182,12 +188,14 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
// If a category was selected we loop through the variations as they are not tied to a category so will be excluded by default.
if ( ! empty( $variable_products ) ) {
foreach ( $variable_products as $parent_id ) {
- $products = wc_get_products( array(
- 'parent' => $parent_id,
- 'type' => array( 'variation' ),
- 'return' => 'objects',
- 'limit' => -1,
- ) );
+ $products = wc_get_products(
+ array(
+ 'parent' => $parent_id,
+ 'type' => array( 'variation' ),
+ 'return' => 'objects',
+ 'limit' => -1,
+ )
+ );
if ( ! $products ) {
continue;
@@ -204,6 +212,7 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
* Take a product and generate row data from it for export.
*
* @param WC_Product $product WC_Product object.
+ *
* @return array
*/
protected function generate_row_data( $product ) {
@@ -231,6 +240,10 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
$value = $product->{"get_{$column_id}"}( 'edit' );
}
+ if ( 'description' === $column_id || 'short_description' === $column_id ) {
+ $value = $this->filter_description_field( $value );
+ }
+
$row[ $column_id ] = $value;
}
@@ -243,8 +256,9 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Get published value.
*
- * @since 3.1.0
* @param WC_Product $product Product being exported.
+ *
+ * @since 3.1.0
* @return int
*/
protected function get_column_value_published( $product ) {
@@ -263,6 +277,7 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
* Get formatted sale price.
*
* @param WC_Product $product Product being exported.
+ *
* @return string
*/
protected function get_column_value_sale_price( $product ) {
@@ -273,6 +288,7 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
* Get formatted regular price.
*
* @param WC_Product $product Product being exported.
+ *
* @return string
*/
protected function get_column_value_regular_price( $product ) {
@@ -282,8 +298,9 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Get product_cat value.
*
- * @since 3.1.0
* @param WC_Product $product Product being exported.
+ *
+ * @since 3.1.0
* @return string
*/
protected function get_column_value_category_ids( $product ) {
@@ -294,8 +311,9 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Get product_tag value.
*
- * @since 3.1.0
* @param WC_Product $product Product being exported.
+ *
+ * @since 3.1.0
* @return string
*/
protected function get_column_value_tag_ids( $product ) {
@@ -306,8 +324,9 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Get product_shipping_class value.
*
- * @since 3.1.0
* @param WC_Product $product Product being exported.
+ *
+ * @since 3.1.0
* @return string
*/
protected function get_column_value_shipping_class_id( $product ) {
@@ -318,8 +337,9 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Get images value.
*
- * @since 3.1.0
* @param WC_Product $product Product being exported.
+ *
+ * @since 3.1.0
* @return string
*/
protected function get_column_value_images( $product ) {
@@ -340,8 +360,9 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Prepare linked products for export.
*
- * @since 3.1.0
* @param int[] $linked_products Array of linked product ids.
+ *
+ * @since 3.1.0
* @return string
*/
protected function prepare_linked_products_for_export( $linked_products ) {
@@ -361,8 +382,9 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Get cross_sell_ids value.
*
- * @since 3.1.0
* @param WC_Product $product Product being exported.
+ *
+ * @since 3.1.0
* @return string
*/
protected function get_column_value_cross_sell_ids( $product ) {
@@ -372,8 +394,9 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Get upsell_ids value.
*
- * @since 3.1.0
* @param WC_Product $product Product being exported.
+ *
+ * @since 3.1.0
* @return string
*/
protected function get_column_value_upsell_ids( $product ) {
@@ -383,8 +406,9 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Get parent_id value.
*
- * @since 3.1.0
* @param WC_Product $product Product being exported.
+ *
+ * @since 3.1.0
* @return string
*/
protected function get_column_value_parent_id( $product ) {
@@ -402,8 +426,9 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Get grouped_products value.
*
- * @since 3.1.0
* @param WC_Product $product Product being exported.
+ *
+ * @since 3.1.0
* @return string
*/
protected function get_column_value_grouped_products( $product ) {
@@ -427,8 +452,9 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Get download_limit value.
*
- * @since 3.1.0
* @param WC_Product $product Product being exported.
+ *
+ * @since 3.1.0
* @return string
*/
protected function get_column_value_download_limit( $product ) {
@@ -438,8 +464,9 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Get download_expiry value.
*
- * @since 3.1.0
* @param WC_Product $product Product being exported.
+ *
+ * @since 3.1.0
* @return string
*/
protected function get_column_value_download_expiry( $product ) {
@@ -449,8 +476,9 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Get stock value.
*
- * @since 3.1.0
* @param WC_Product $product Product being exported.
+ *
+ * @since 3.1.0
* @return string
*/
protected function get_column_value_stock( $product ) {
@@ -469,8 +497,9 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Get stock status value.
*
- * @since 3.1.0
* @param WC_Product $product Product being exported.
+ *
+ * @since 3.1.0
* @return string
*/
protected function get_column_value_stock_status( $product ) {
@@ -486,8 +515,9 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Get backorders.
*
- * @since 3.1.0
* @param WC_Product $product Product being exported.
+ *
+ * @since 3.1.0
* @return string
*/
protected function get_column_value_backorders( $product ) {
@@ -505,7 +535,8 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
* Get low stock amount value.
*
* @param WC_Product $product Product being exported.
- * @since 3.5.0
+ *
+ * @since 3.5.0
* @return int|string Empty string if value not set
*/
protected function get_column_value_low_stock_amount( $product ) {
@@ -515,8 +546,9 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Get type value.
*
- * @since 3.1.0
* @param WC_Product $product Product being exported.
+ *
+ * @since 3.1.0
* @return string
*/
protected function get_column_value_type( $product ) {
@@ -534,12 +566,27 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
return $this->implode_values( $types );
}
+ /**
+ * Filter description field for export.
+ * Convert newlines to '\n'.
+ *
+ * @param string $description Product description text to filter.
+ *
+ * @since 3.5.4
+ * @return string
+ */
+ protected function filter_description_field( $description ) {
+ $description = str_replace( '\n', "\\\\n", $description );
+ $description = str_replace( "\n", '\n', $description );
+ return $description;
+ }
/**
* Export downloads.
*
- * @since 3.1.0
* @param WC_Product $product Product being exported.
* @param array $row Row being exported.
+ *
+ * @since 3.1.0
*/
protected function prepare_downloads_for_export( $product, &$row ) {
if ( $product->is_downloadable() && $this->is_column_exporting( 'downloads' ) ) {
@@ -563,9 +610,10 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Export attributes data.
*
+ * @param WC_Product $product Product being exported.
+ * @param array $row Row being exported.
+ *
* @since 3.1.0
- * @param WC_Product $product Product being exported.
- * @param array $row Row being exported.
*/
protected function prepare_attributes_for_export( $product, &$row ) {
if ( $this->is_column_exporting( 'attributes' ) ) {
@@ -639,9 +687,10 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter {
/**
* Export meta data.
*
- * @since 3.1.0
* @param WC_Product $product Product being exported.
* @param array $row Row data.
+ *
+ * @since 3.1.0
*/
protected function prepare_meta_for_export( $product, &$row ) {
if ( $this->enable_meta_export ) {
diff --git a/includes/gateways/bacs/class-wc-gateway-bacs.php b/includes/gateways/bacs/class-wc-gateway-bacs.php
index fdd4a64af6e..979c70a77c9 100644
--- a/includes/gateways/bacs/class-wc-gateway-bacs.php
+++ b/includes/gateways/bacs/class-wc-gateway-bacs.php
@@ -205,7 +205,7 @@ class WC_Gateway_BACS extends WC_Payment_Gateway {
$accounts = array();
- // phpcs:disable WordPress.CSRF.NonceVerification.NoNonceVerification -- Nonce verification already handled in WC_Admin_Settings::save()
+ // phpcs:disable WordPress.Security.NonceVerification.NoNonceVerification -- Nonce verification already handled in WC_Admin_Settings::save()
if ( isset( $_POST['bacs_account_name'] ) && isset( $_POST['bacs_account_number'] ) && isset( $_POST['bacs_bank_name'] )
&& isset( $_POST['bacs_sort_code'] ) && isset( $_POST['bacs_iban'] ) && isset( $_POST['bacs_bic'] ) ) {
@@ -306,7 +306,8 @@ class WC_Gateway_BACS extends WC_Payment_Gateway {
// BACS account fields shown on the thanks page and in emails.
$account_fields = apply_filters(
- 'woocommerce_bacs_account_fields', array(
+ 'woocommerce_bacs_account_fields',
+ array(
'bank_name' => array(
'label' => __( 'Bank', 'woocommerce' ),
'value' => $bacs_account->bank_name,
@@ -327,7 +328,8 @@ class WC_Gateway_BACS extends WC_Payment_Gateway {
'label' => __( 'BIC', 'woocommerce' ),
'value' => $bacs_account->bic,
),
- ), $order_id
+ ),
+ $order_id
);
foreach ( $account_fields as $field_key => $field ) {
@@ -386,7 +388,8 @@ class WC_Gateway_BACS extends WC_Payment_Gateway {
// Locale information to be used - only those that are not 'Sort Code'.
$this->locale = apply_filters(
- 'woocommerce_get_bacs_locale', array(
+ 'woocommerce_get_bacs_locale',
+ array(
'AU' => array(
'sortcode' => array(
'label' => __( 'BSB', 'woocommerce' ),
diff --git a/includes/gateways/cheque/class-wc-gateway-cheque.php b/includes/gateways/cheque/class-wc-gateway-cheque.php
index b31752d6149..40f2599438f 100644
--- a/includes/gateways/cheque/class-wc-gateway-cheque.php
+++ b/includes/gateways/cheque/class-wc-gateway-cheque.php
@@ -119,7 +119,7 @@ class WC_Gateway_Cheque extends WC_Payment_Gateway {
if ( $order->get_total() > 0 ) {
// Mark as on-hold (we're awaiting the cheque).
- $order->update_status( 'on-hold', _x( 'Awaiting check payment', 'Check payment method', 'woocommerce' ) );
+ $order->update_status( apply_filters( 'woocommerce_cheque_process_payment_order_status', 'on-hold', $order ), _x( 'Awaiting check payment', 'Check payment method', 'woocommerce' ) );
} else {
$order->payment_complete();
}
diff --git a/includes/gateways/cod/class-wc-gateway-cod.php b/includes/gateways/cod/class-wc-gateway-cod.php
index d9ba51efcfc..4787a615d5d 100644
--- a/includes/gateways/cod/class-wc-gateway-cod.php
+++ b/includes/gateways/cod/class-wc-gateway-cod.php
@@ -237,7 +237,7 @@ class WC_Gateway_COD extends WC_Payment_Gateway {
*/
private function get_canonical_package_rate_ids( $chosen_package_rate_ids ) {
- $shipping_packages = WC()->shipping->get_packages();
+ $shipping_packages = WC()->shipping()->get_packages();
$canonical_rate_ids = array();
if ( ! empty( $chosen_package_rate_ids ) && is_array( $chosen_package_rate_ids ) ) {
diff --git a/includes/gateways/paypal/includes/class-wc-gateway-paypal-pdt-handler.php b/includes/gateways/paypal/includes/class-wc-gateway-paypal-pdt-handler.php
index 23db0aa6a94..92b05236fd7 100644
--- a/includes/gateways/paypal/includes/class-wc-gateway-paypal-pdt-handler.php
+++ b/includes/gateways/paypal/includes/class-wc-gateway-paypal-pdt-handler.php
@@ -106,7 +106,7 @@ class WC_Gateway_Paypal_PDT_Handler extends WC_Gateway_Paypal_Response {
update_post_meta( $order->get_id(), '_transaction_id', $transaction );
if ( 'completed' === $status ) {
- if ( $order->get_total() !== $amount ) {
+ if ( number_format( $order->get_total(), 2, '.', '' ) !== number_format( $amount, 2, '.', '' ) ) {
WC_Gateway_Paypal::log( 'Payment error: Amounts do not match (amt ' . $amount . ')', 'error' );
/* translators: 1: Payment amount */
$this->payment_on_hold( $order, sprintf( __( 'Validation error: PayPal amounts do not match (amt %s).', 'woocommerce' ), $amount ) );
diff --git a/includes/gateways/paypal/includes/settings-paypal.php b/includes/gateways/paypal/includes/settings-paypal.php
index 50269794ce0..00bad8a706e 100644
--- a/includes/gateways/paypal/includes/settings-paypal.php
+++ b/includes/gateways/paypal/includes/settings-paypal.php
@@ -153,7 +153,7 @@ return array(
),
'api_signature' => array(
'title' => __( 'Live API signature', 'woocommerce' ),
- 'type' => 'text',
+ 'type' => 'password',
'description' => __( 'Get your API credentials from PayPal.', 'woocommerce' ),
'default' => '',
'desc_tip' => true,
@@ -177,7 +177,7 @@ return array(
),
'sandbox_api_signature' => array(
'title' => __( 'Sandbox API signature', 'woocommerce' ),
- 'type' => 'text',
+ 'type' => 'password',
'description' => __( 'Get your API credentials from PayPal.', 'woocommerce' ),
'default' => '',
'desc_tip' => true,
diff --git a/includes/gateways/simplify-commerce/includes/Simplify/PaymentsApi.php b/includes/gateways/simplify-commerce/includes/Simplify/PaymentsApi.php
index c6f2a894179..3abd7615cae 100644
--- a/includes/gateways/simplify-commerce/includes/Simplify/PaymentsApi.php
+++ b/includes/gateways/simplify-commerce/includes/Simplify/PaymentsApi.php
@@ -205,9 +205,9 @@ class Simplify_PaymentsApi
$url = $this->fixUrl($url) . urlencode(lcfirst($object->getClazz())) . '/';
$queryParams = array();
- if ($action == "show") {
+ if ( 'show' == $action ) {
$url .= urlencode($object->id);
- } elseif ($action == "list") {
+ } elseif ( 'list' == $action ) {
$queryParams = array_merge($queryParams, array('max' => $object->max, 'offset' => $object->offset));
if (is_array($object->filter) && count(array_keys($object->filter))) {
foreach ($object->filter as $key => $value) {
@@ -225,11 +225,11 @@ class Simplify_PaymentsApi
$url .= $query;
}
- } elseif ($action == "delete") {
+ } elseif ( 'delete' == $action ) {
$url .= urlencode($object->id);
- } elseif ($action == "update") {
+ } elseif ( 'update' == $action ) {
$url .= urlencode($object->id);
- } elseif ($action == "create") {
+ } elseif ( 'create' == $action ) {
}
return $url;
}
diff --git a/includes/import/abstract-wc-product-importer.php b/includes/import/abstract-wc-product-importer.php
index 54df946f924..5fbfcf504b7 100644
--- a/includes/import/abstract-wc-product-importer.php
+++ b/includes/import/abstract-wc-product-importer.php
@@ -84,7 +84,6 @@ abstract class WC_Product_Importer implements WC_Importer_Interface {
* (default value: 0)
*
* @var int
- * @access protected
*/
protected $start_time = 0;
@@ -434,6 +433,11 @@ abstract class WC_Product_Importer implements WC_Importer_Interface {
return new WP_Error( 'woocommerce_product_importer_missing_variation_parent_id', __( 'Variation cannot be imported: Missing parent ID or parent does not exist yet.', 'woocommerce' ), array( 'status' => 401 ) );
}
+ // Stop if parent is a product variation.
+ if ( $parent->is_type( 'variation' ) ) {
+ return new WP_Error( 'woocommerce_product_importer_parent_set_as_variation', __( 'Variation cannot be imported: Parent product cannot be a product variation', 'woocommerce' ), array( 'status' => 401 ) );
+ }
+
if ( isset( $data['raw_attributes'] ) ) {
$attributes = array();
$parent_attributes = $this->get_variation_parent_attributes( $data['raw_attributes'], $parent );
@@ -761,21 +765,21 @@ abstract class WC_Product_Importer implements WC_Importer_Interface {
}
/**
- * The exporter prepends a ' to fields that start with a - which causes
- * issues with negative numbers. This removes the ' if the input is still a valid
- * number after removal.
+ * The exporter prepends a ' to escape fields that start with =, +, - or @.
+ * Remove the prepended ' character preceding those characters.
*
- * @since 3.3.0
- * @param string $value A numeric string that may or may not have ' prepended.
+ * @since 3.5.2
+ * @param string $value A string that may or may not have been escaped with '.
* @return string
*/
- protected function unescape_negative_number( $value ) {
- if ( 0 === strpos( $value, "'-" ) ) {
- $unescaped = trim( $value, "'" );
- if ( is_numeric( $unescaped ) ) {
- return $unescaped;
- }
+ protected function unescape_data( $value ) {
+ $active_content_triggers = array( "'=", "'+", "'-", "'@" );
+
+ if ( in_array( mb_substr( $value, 0, 2 ), $active_content_triggers, true ) ) {
+ $value = mb_substr( $value, 1 );
}
+
return $value;
}
+
}
diff --git a/includes/import/class-wc-product-csv-importer.php b/includes/import/class-wc-product-csv-importer.php
index 93707b5d8a8..bdf05d752dc 100644
--- a/includes/import/class-wc-product-csv-importer.php
+++ b/includes/import/class-wc-product-csv-importer.php
@@ -2,8 +2,8 @@
/**
* WooCommerce Product CSV importer
*
- * @package WooCommerce/Import
- * @version 3.1.0
+ * @package WooCommerce/Import
+ * @version 3.1.0
*/
if ( ! defined( 'ABSPATH' ) ) {
@@ -17,6 +17,10 @@ if ( ! class_exists( 'WC_Product_Importer', false ) ) {
include_once dirname( __FILE__ ) . '/abstract-wc-product-importer.php';
}
+if ( ! class_exists( 'WC_Product_CSV_Importer_Controller', false ) ) {
+ include_once WC_ABSPATH . 'includes/admin/importers/class-wc-product-csv-importer-controller.php';
+}
+
/**
* WC_Product_CSV_Importer Class.
*/
@@ -63,10 +67,14 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
* Read file.
*/
protected function read_file() {
+ if ( ! WC_Product_CSV_Importer_Controller::is_file_valid_csv( $this->file ) ) {
+ wp_die( esc_html__( 'Invalid file type. The importer supports CSV and TXT file formats.', 'woocommerce' ) );
+ }
+
$handle = fopen( $this->file, 'r' ); // @codingStandardsIgnoreLine.
if ( false !== $handle ) {
- $this->raw_keys = version_compare( PHP_VERSION, '5.3', '>=' ) ? fgetcsv( $handle, 0, $this->params['delimiter'], $this->params['enclosure'], $this->params['escape'] ) : fgetcsv( $handle, 0, $this->params['delimiter'], $this->params['enclosure'] ); // @codingStandardsIgnoreLine
+ $this->raw_keys = version_compare( PHP_VERSION, '5.3', '>=' ) ? array_map( 'trim', fgetcsv( $handle, 0, $this->params['delimiter'], $this->params['enclosure'], $this->params['escape'] ) ) : array_map( 'trim', fgetcsv( $handle, 0, $this->params['delimiter'], $this->params['enclosure'] ) ); // @codingStandardsIgnoreLine
// Remove BOM signature from the first item.
if ( isset( $this->raw_keys[0] ) ) {
@@ -107,7 +115,8 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
/**
* Remove UTF-8 BOM signature.
*
- * @param string $string String to handle.
+ * @param string $string String to handle.
+ *
* @return string
*/
protected function remove_utf8_bom( $string ) {
@@ -140,7 +149,8 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
* If mapping to a SKU and the product ID does not exist, a temporary object
* will be created so it can be updated later.
*
- * @param string $value Field value.
+ * @param string $value Field value.
+ *
* @return int|string
*/
public function parse_relative_field( $value ) {
@@ -209,7 +219,8 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
* If we're not doing an update, create a placeholder product so mapping works
* for rows following this one.
*
- * @param string $value Field value.
+ * @param string $value Field value.
+ *
* @return int
*/
public function parse_id_field( $value ) {
@@ -259,6 +270,7 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
* Parse relative comma-delineated field and return product ID.
*
* @param string $value Field value.
+ *
* @return array
*/
public function parse_relative_comma_field( $value ) {
@@ -273,6 +285,7 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
* Parse a comma-delineated field from a CSV.
*
* @param string $value Field value.
+ *
* @return array
*/
public function parse_comma_field( $value ) {
@@ -280,6 +293,7 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
return array();
}
+ $value = $this->unescape_data( $value );
return array_map( 'wc_clean', $this->explode_values( $value ) );
}
@@ -287,6 +301,7 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
* Parse a field that is generally '1' or '0' but can be something else.
*
* @param string $value Field value.
+ *
* @return bool|string
*/
public function parse_bool_field( $value ) {
@@ -306,6 +321,7 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
* Parse a float value field.
*
* @param string $value Field value.
+ *
* @return float|string
*/
public function parse_float_field( $value ) {
@@ -314,7 +330,7 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
}
// Remove the ' prepended to fields that start with - if needed.
- $value = $this->unescape_negative_number( $value );
+ $value = $this->unescape_data( $value );
return floatval( $value );
}
@@ -323,6 +339,7 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
* Parse the stock qty field.
*
* @param string $value Field value.
+ *
* @return float|string
*/
public function parse_stock_quantity_field( $value ) {
@@ -331,7 +348,7 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
}
// Remove the ' prepended to fields that start with - if needed.
- $value = $this->unescape_negative_number( $value );
+ $value = $this->unescape_data( $value );
return wc_stock_amount( $value );
}
@@ -341,6 +358,7 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
* Categories are separated by commas and subcategories are "parent > subcategory".
*
* @param string $value Field value.
+ *
* @return array of arrays with "parent" and "name" keys.
*/
public function parse_categories_field( $value ) {
@@ -358,12 +376,13 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
foreach ( $_terms as $index => $_term ) {
// Check if category exists. Parent must be empty string or null if doesn't exists.
- // @codingStandardsIgnoreStart
$term = term_exists( $_term, 'product_cat', $parent );
- // @codingStandardsIgnoreEnd
if ( is_array( $term ) ) {
$term_id = $term['term_id'];
+ // Don't allow users without capabilities to create new categories.
+ } elseif ( ! current_user_can( 'manage_product_terms' ) ) {
+ break;
} else {
$term = wp_insert_term( $_term, 'product_cat', array( 'parent' => intval( $parent ) ) );
@@ -390,7 +409,8 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
/**
* Parse a tag field from a CSV.
*
- * @param string $value Field value.
+ * @param string $value Field value.
+ *
* @return array
*/
public function parse_tags_field( $value ) {
@@ -398,6 +418,7 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
return array();
}
+ $value = $this->unescape_data( $value );
$names = $this->explode_values( $value );
$tags = array();
@@ -419,7 +440,8 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
/**
* Parse a shipping class field from a CSV.
*
- * @param string $value Field value.
+ * @param string $value Field value.
+ *
* @return int
*/
public function parse_shipping_class_field( $value ) {
@@ -443,7 +465,8 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
/**
* Parse images list from a CSV. Images can be filenames or URLs.
*
- * @param string $value Field value.
+ * @param string $value Field value.
+ *
* @return array
*/
public function parse_images_field( $value ) {
@@ -468,7 +491,8 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
* Parse dates from a CSV.
* Dates requires the format YYYY-MM-DD and time is optional.
*
- * @param string $value Field value.
+ * @param string $value Field value.
+ *
* @return string|null
*/
public function parse_date_field( $value ) {
@@ -487,7 +511,8 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
/**
* Parse backorders from a CSV.
*
- * @param string $value Field value.
+ * @param string $value Field value.
+ *
* @return string
*/
public function parse_backorders_field( $value ) {
@@ -512,7 +537,8 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
* By default is applied wc_clean() to all not listed fields
* in self::get_formating_callback(), use this method to skip any formating.
*
- * @param string $value Field value.
+ * @param string $value Field value.
+ *
* @return string
*/
public function parse_skip_field( $value ) {
@@ -525,6 +551,7 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
* Allow shortcodes if present, othersiwe esc_url the value.
*
* @param string $value Field value.
+ *
* @return string
*/
public function parse_download_file_field( $value ) {
@@ -540,15 +567,32 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
* Parse an int value field
*
* @param int $value field value.
+ *
* @return int
*/
public function parse_int_field( $value ) {
// Remove the ' prepended to fields that start with - if needed.
- $value = $this->unescape_negative_number( $value );
+ $value = $this->unescape_data( $value );
return intval( $value );
}
+ /**
+ * Parse a description value field
+ *
+ * @param string $description field value.
+ *
+ * @return string
+ */
+ public function parse_description_field( $description ) {
+ $parts = explode( "\\\\n", $description );
+ foreach ( $parts as $key => $part ) {
+ $parts[ $key ] = str_replace( '\n', "\n", $part );
+ }
+
+ return implode( '\\\n', $parts );
+ }
+
/**
* Get formatting callback.
*
@@ -568,8 +612,8 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
'date_on_sale_from' => array( $this, 'parse_date_field' ),
'date_on_sale_to' => array( $this, 'parse_date_field' ),
'name' => array( $this, 'parse_skip_field' ),
- 'short_description' => array( $this, 'parse_skip_field' ),
- 'description' => array( $this, 'parse_skip_field' ),
+ 'short_description' => array( $this, 'parse_description_field' ),
+ 'description' => array( $this, 'parse_description_field' ),
'manage_stock' => array( $this, 'parse_bool_field' ),
'low_stock_amount' => array( $this, 'parse_stock_quantity_field' ),
'backorders' => array( $this, 'parse_backorders_field' ),
@@ -635,8 +679,9 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
/**
* Check if strings starts with determined word.
*
- * @param string $haystack Complete sentence.
- * @param string $needle Excerpt.
+ * @param string $haystack Complete sentence.
+ * @param string $needle Excerpt.
+ *
* @return bool
*/
protected function starts_with( $haystack, $needle ) {
@@ -646,7 +691,8 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
/**
* Expand special and internal data into the correct formats for the product CRUD.
*
- * @param array $data Data to import.
+ * @param array $data Data to import.
+ *
* @return array
*/
protected function expand_data( $data ) {
@@ -842,7 +888,8 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
/**
* Get a string to identify the row from parsed data.
*
- * @param array $parsed_data Parsed data.
+ * @param array $parsed_data Parsed data.
+ *
* @return string
*/
protected function get_row_id( $parsed_data ) {
@@ -890,7 +937,7 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
do_action( 'woocommerce_product_import_before_import', $parsed_data );
$id = isset( $parsed_data['id'] ) ? absint( $parsed_data['id'] ) : 0;
- $sku = isset( $parsed_data['sku'] ) ? esc_attr( $parsed_data['sku'] ) : '';
+ $sku = isset( $parsed_data['sku'] ) ? $parsed_data['sku'] : '';
$id_exists = false;
$sku_exists = false;
@@ -906,27 +953,39 @@ class WC_Product_CSV_Importer extends WC_Product_Importer {
}
if ( $id_exists && ! $update_existing ) {
- $data['skipped'][] = new WP_Error( 'woocommerce_product_importer_error', __( 'A product with this ID already exists.', 'woocommerce' ), array(
- 'id' => $id,
- 'row' => $this->get_row_id( $parsed_data ),
- ) );
+ $data['skipped'][] = new WP_Error(
+ 'woocommerce_product_importer_error',
+ esc_html__( 'A product with this ID already exists.', 'woocommerce' ),
+ array(
+ 'id' => $id,
+ 'row' => $this->get_row_id( $parsed_data ),
+ )
+ );
continue;
}
if ( $sku_exists && ! $update_existing ) {
- $data['skipped'][] = new WP_Error( 'woocommerce_product_importer_error', __( 'A product with this SKU already exists.', 'woocommerce' ), array(
- 'sku' => $sku,
- 'row' => $this->get_row_id( $parsed_data ),
- ) );
+ $data['skipped'][] = new WP_Error(
+ 'woocommerce_product_importer_error',
+ esc_html__( 'A product with this SKU already exists.', 'woocommerce' ),
+ array(
+ 'sku' => esc_attr( $sku ),
+ 'row' => $this->get_row_id( $parsed_data ),
+ )
+ );
continue;
}
if ( $update_existing && ( $id || $sku ) && ! $id_exists && ! $sku_exists ) {
- $data['skipped'][] = new WP_Error( 'woocommerce_product_importer_error', __( 'No matching product exists to update.', 'woocommerce' ), array(
- 'id' => $id,
- 'sku' => $sku,
- 'row' => $this->get_row_id( $parsed_data ),
- ) );
+ $data['skipped'][] = new WP_Error(
+ 'woocommerce_product_importer_error',
+ esc_html__( 'No matching product exists to update.', 'woocommerce' ),
+ array(
+ 'id' => $id,
+ 'sku' => esc_attr( $sku ),
+ 'row' => $this->get_row_id( $parsed_data ),
+ )
+ );
continue;
}
diff --git a/includes/interfaces/class-wc-queue-interface.php b/includes/interfaces/class-wc-queue-interface.php
index d9e1661f8b5..c341b6aff28 100644
--- a/includes/interfaces/class-wc-queue-interface.php
+++ b/includes/interfaces/class-wc-queue-interface.php
@@ -22,9 +22,9 @@ interface WC_Queue_Interface {
/**
* Enqueue an action to run one time, as soon as possible
*
- * @param string $hook The hook to trigger
- * @param array $args Arguments to pass when the hook triggers
- * @param string $group The group to assign this job to
+ * @param string $hook The hook to trigger.
+ * @param array $args Arguments to pass when the hook triggers.
+ * @param string $group The group to assign this job to.
* @return string The action ID
*/
public function add( $hook, $args = array(), $group = '' );
@@ -32,10 +32,10 @@ interface WC_Queue_Interface {
/**
* Schedule an action to run once at some time in the future
*
- * @param int $timestamp When the job will run
- * @param string $hook The hook to trigger
- * @param array $args Arguments to pass when the hook triggers
- * @param string $group The group to assign this job to
+ * @param int $timestamp When the job will run.
+ * @param string $hook The hook to trigger.
+ * @param array $args Arguments to pass when the hook triggers.
+ * @param string $group The group to assign this job to.
* @return string The action ID
*/
public function schedule_single( $timestamp, $hook, $args = array(), $group = '' );
@@ -43,11 +43,11 @@ interface WC_Queue_Interface {
/**
* Schedule a recurring action
*
- * @param int $timestamp When the first instance of the job will run
- * @param int $interval_in_seconds How long to wait between runs
- * @param string $hook The hook to trigger
- * @param array $args Arguments to pass when the hook triggers
- * @param string $group The group to assign this job to
+ * @param int $timestamp When the first instance of the job will run.
+ * @param int $interval_in_seconds How long to wait between runs.
+ * @param string $hook The hook to trigger.
+ * @param array $args Arguments to pass when the hook triggers.
+ * @param string $group The group to assign this job to.
* @return string The action ID
*/
public function schedule_recurring( $timestamp, $interval_in_seconds, $hook, $args = array(), $group = '' );
@@ -55,8 +55,8 @@ interface WC_Queue_Interface {
/**
* Schedule an action that recurs on a cron-like schedule.
*
- * @param int $timestamp The schedule will start on or after this time
- * @param string $cron_schedule A cron-link schedule string
+ * @param int $timestamp The schedule will start on or after this time.
+ * @param string $cron_schedule A cron-link schedule string.
* @see http://en.wikipedia.org/wiki/Cron
* * * * * * *
* ┬ ┬ ┬ ┬ ┬ ┬
@@ -67,54 +67,62 @@ interface WC_Queue_Interface {
* | | +--------------- day of month (1 - 31)
* | +-------------------- hour (0 - 23)
* +------------------------- min (0 - 59)
- * @param string $hook The hook to trigger
- * @param array $args Arguments to pass when the hook triggers
- * @param string $group The group to assign this job to
+ * @param string $hook The hook to trigger.
+ * @param array $args Arguments to pass when the hook triggers.
+ * @param string $group The group to assign this job to.
* @return string The action ID
*/
public function schedule_cron( $timestamp, $cron_schedule, $hook, $args = array(), $group = '' );
/**
- * Dequeue all actions with a matching hook (and optionally matching args and group) so they are not run.
+ * Dequeue the next scheduled instance of an action with a matching hook (and optionally matching args and group).
*
- * Any recurring actions with a matching hook will also be cancelled, not just the next scheduled action.
+ * Any recurring actions with a matching hook should also be cancelled, not just the next scheduled action.
*
- * @param string $hook The hook that the job will trigger
- * @param array $args Args that would have been passed to the job
- * @param string $group
+ * @param string $hook The hook that the job will trigger.
+ * @param array $args Args that would have been passed to the job.
+ * @param string $group The group the job is assigned to (if any).
*/
public function cancel( $hook, $args = array(), $group = '' );
+ /**
+ * Dequeue all actions with a matching hook (and optionally matching args and group) so no matching actions are ever run.
+ *
+ * @param string $hook The hook that the job will trigger.
+ * @param array $args Args that would have been passed to the job.
+ * @param string $group The group the job is assigned to (if any).
+ */
+ public function cancel_all( $hook, $args = array(), $group = '' );
+
/**
* Get the date and time for the next scheduled occurence of an action with a given hook
* (an optionally that matches certain args and group), if any.
*
- * @param string $hook
- * @param array $args
- * @param string $group
- * @return int|bool The timestamp for the next occurrence, or false if nothing was found
+ * @param string $hook The hook that the job will trigger.
+ * @param array $args Filter to a hook with matching args that will be passed to the job when it runs.
+ * @param string $group Filter to only actions assigned to a specific group.
* @return WC_DateTime|null The date and time for the next occurrence, or null if there is no pending, scheduled action for the given hook
*/
public function get_next( $hook, $args = null, $group = '' );
/**
- * Find scheduled actions
+ * Find scheduled actions.
*
- * @param array $args Possible arguments, with their default values:
- * 'hook' => '' - the name of the action that will be triggered
- * 'args' => null - the args array that will be passed with the action
+ * @param array $args Possible arguments, with their default values.
+ * 'hook' => '' - the name of the action that will be triggered.
+ * 'args' => null - the args array that will be passed with the action.
* 'date' => null - the scheduled date of the action. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). Used in UTC timezone.
- * 'date_compare' => '<=' - operator for testing "date". accepted values are '!=', '>', '>=', '<', '<=', '='
+ * 'date_compare' => '<=' - operator for testing "date". accepted values are '!=', '>', '>=', '<', '<=', '='.
* 'modified' => null - the date the action was last updated. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). Used in UTC timezone.
- * 'modified_compare' => '<=' - operator for testing "modified". accepted values are '!=', '>', '>=', '<', '<=', '='
- * 'group' => '' - the group the action belongs to
- * 'status' => '' - ActionScheduler_Store::STATUS_COMPLETE or ActionScheduler_Store::STATUS_PENDING
- * 'claimed' => null - TRUE to find claimed actions, FALSE to find unclaimed actions, a string to find a specific claim ID
- * 'per_page' => 5 - Number of results to return
- * 'offset' => 0
- * 'orderby' => 'date' - accepted values are 'hook', 'group', 'modified', or 'date'
- * 'order' => 'ASC'
- * @param string $return_format OBJECT, ARRAY_A, or ids
+ * 'modified_compare' => '<=' - operator for testing "modified". accepted values are '!=', '>', '>=', '<', '<=', '='.
+ * 'group' => '' - the group the action belongs to.
+ * 'status' => '' - ActionScheduler_Store::STATUS_COMPLETE or ActionScheduler_Store::STATUS_PENDING.
+ * 'claimed' => null - TRUE to find claimed actions, FALSE to find unclaimed actions, a string to find a specific claim ID.
+ * 'per_page' => 5 - Number of results to return.
+ * 'offset' => 0.
+ * 'orderby' => 'date' - accepted values are 'hook', 'group', 'modified', or 'date'.
+ * 'order' => 'ASC'.
+ * @param string $return_format OBJECT, ARRAY_A, or ids.
* @return array
*/
public function search( $args = array(), $return_format = OBJECT );
diff --git a/includes/libraries/action-scheduler/README.md b/includes/libraries/action-scheduler/README.md
index 0d915a1c866..5cb7dd0e982 100644
--- a/includes/libraries/action-scheduler/README.md
+++ b/includes/libraries/action-scheduler/README.md
@@ -38,6 +38,90 @@ The events logged by default include when an action:
Actions can also be grouped together using a custom taxonomy named `action-group`.
+## Usage
+
+There are two ways to install Action Scheduler:
+
+1. as a library within your plugin or theme; or
+1. as a regular WordPress plugin
+
+### Usage as a Library
+
+To use Action Scheduler as a library:
+
+1. include the Action Scheduler codebase
+1. load the library by including the `action-scheduler.php` file
+
+#### Including Action Scheduler Codebase
+
+Using a [subtree in your plugin, theme or site's Git repository](https://www.atlassian.com/blog/git/alternatives-to-git-submodule-git-subtree) to include Action Scheduler is the recommended method. Composer can also be used.
+
+To include Action Scheduler as a git subtree:
+
+##### Step 1. Add the Repository as a Remote
+
+```
+git remote add -f subtree-action-scheduler https://github.com/Prospress/action-scheduler.git
+```
+
+Adding the subtree as a remote allows us to refer to it in short from via the name `subtree-action-scheduler`, instead of the full GitHub URL.
+
+##### Step 2. Add the Repo as a Subtree
+
+```
+git subtree add --prefix libraries/action-scheduler subtree-action-scheduler master --squash
+```
+
+This will add the `master` branch of Action Scheduler to your repository in the folder `libraries/action-scheduler`.
+
+You can change the `--prefix` to change where the code is included. Or change the `master` branch to a tag, like `2.1.0` to include only a stable version.
+
+##### Step 3. Update the Subtree
+
+To update Action Scheduler to a new version, use the commands:
+
+```
+git fetch subtree-action-scheduler master
+git subtree pull --prefix libraries/action-scheduler subtree-action-scheduler master --squash
+```
+
+#### Loading Action Scheduler
+
+To load Action Scheduler, you only need to include `action-scheduler.php` file, e.g.
+
+```php
+ Add New > Upload** administration screen on your WordPress site
+1. Select the archive file you just downloaded
+1. Click **Install Now**
+1. Click **Activate**
+
+Or clone the Git repository into your site's `wp-content/plugins` folder.
+
+Using Action Scheduler as a plugin can be handy for developing against newer versions, rather than having to update the subtree in your codebase. **When installed as a plugin, Action Scheduler does not provide any user interfaces for scheduling actions**. The only way to interact with Action Scheduler is via code.
+
## Managing Scheduled Actions
Action Scheduler has a built in administration screen for monitoring, debugging and manually triggering scheduled actions.
@@ -62,7 +146,7 @@ Still have questions? Check out the [FAQ below](#faq).
Action Scheduler has custom [WP CLI](http://wp-cli.org) commands available for processing actions.
-For many sites, WP CLI is a much better choice for running queues of actions than the default WP Cron runner. These are some common cases where WP CLI is a better option:
+For large sites, WP CLI is a much better choice for running queues of actions than the default WP Cron runner. These are some common cases where WP CLI is a better option:
* long-running tasks - Tasks that take a significant amount of time to run
* large queues - A large number of tasks will naturally take a longer time
@@ -70,7 +154,7 @@ For many sites, WP CLI is a much better choice for running queues of actions tha
With a regular web request, you may have to deal with script timeouts enforced by hosts, or other restraints that make it more challenging to run Action Scheduler tasks. Utilizing WP CLI to run commands directly on the server give you more freedom. This means that you typically don't have the same constraints of a normal web request.
-If you choose to utilize WP CLI exclusively, you can disable the normal WP CLI queue runner by installing the [Action Scheduler - Disable Default Queue Runner](https://github.com/Prospress/action-scheduler-disable-default-runner) plugin. Note that if you do this, you **must** run Action Scheduler manually.
+If you choose to utilize WP CLI exclusively, you can disable the normal WP CLI queue runner by installing the [Action Scheduler - Disable Default Queue Runner](https://github.com/Prospress/action-scheduler-disable-default-runner) plugin. Note that if you do this, you **must** run Action Scheduler via WP CLI or another method, otherwise no scheduled actions will be processed.
### Commands
@@ -87,9 +171,31 @@ These are the commands available to use with Action Scheduler:
The best way to get a full list of commands and their available options is to use WP CLI itself. This can be done by running `wp action-scheduler` to list all Action Scheduler commands, or by including the `--help` flag with any of the individual commands. This will provide all relevant parameters and flags for the command.
-### Improving Performance with `--group`
+### Cautionary Note on Action Dependencies when using `--group` or `--hooks` Options
-Being able to run queues for specific groups of actions is valuable at scale. Why? Because it means you can restrict the concurrency for similar actions.
+The `--group` and `--hooks` options should be used with caution if you have an implicit dependency between scheduled actions based on their schedule.
+
+For example, consider two scheduled actions for the same subscription:
+
+* `scheduled_payment` scheduled for `2015-11-13 00:00:00` and
+* `scheduled_expiration` scheduled for `2015-11-13 00:01:00`.
+
+Under normal conditions, Action Scheduler will ensure the `scheduled_payment` action is run before the `scheduled_expiration` action. Becuase that's how they are scheduled.
+
+However, when using the `--hooks` option, the `scheduled_payment` and `scheduled_expiration` actions will be processed in separate queues. As a result, this dependency is not guaranteed.
+
+For example, consider a site with both:
+
+* 100,000 `scheduled_payment` actions, scheduled for `2015-11-13 00:00:00`
+* 100 `scheduled_expiration` actions, scheduled for `2015-11-13 00:01:00`
+
+If two queue runners are running alongside each other with each runner dedicated to just one of these hooks, the queue runner handling expiration hooks will complete the processing of the expiration hooks more quickly than the queue runner handling all the payment actions.
+
+**Because of this, the `--group` and `--hooks` options should be used with caution to avoid processing actions with an implicit dependency based on their schedule in separate queues.**
+
+### Improving Performance with `--group` or `--hooks`
+
+Being able to run queues for specific hooks or groups of actions is valuable at scale. Why? Because it means you can restrict the concurrency for similar actions.
For example, let's say you have 300,000 actions queued up comprised of:
@@ -115,13 +221,18 @@ The Action Scheduler API functions are designed to mirror the WordPress [WP-Cron
Functions return similar values and accept similar arguments to their WP-Cron counterparts. The notable differences are:
-* `wc_schedule_single_action()` & `wc_schedule_recurring_action()` will return the post ID of the scheduled action rather than boolean indicating whether the event was scheduled
-* `wc_schedule_recurring_action()` takes an interval in seconds as the recurring interval rather than an arbitrary string
-* `wc_schedule_single_action()` & `wc_schedule_recurring_action()` can accept a `$group` parameter to group different actions for the one plugin together.
-* the `wp_` prefix is substituted with `wc_` and the term `event` is replaced with `action`
+* `as_schedule_single_action()` & `as_schedule_recurring_action()` will return the post ID of the scheduled action rather than boolean indicating whether the event was scheduled
+* `as_schedule_recurring_action()` takes an interval in seconds as the recurring interval rather than an arbitrary string
+* `as_schedule_single_action()` & `as_schedule_recurring_action()` can accept a `$group` parameter to group different actions for the one plugin together.
+* the `wp_` prefix is substituted with `as_` and the term `event` is replaced with `action`
+### API Function Availability
-#### Function Reference / `wc_schedule_single_action()`
+As mentioned in the [Usage - Load Order](#load-order) section, Action Scheduler will initialize itself on the `'init'` hook with priority `1`. While API functions are loaded prior to this and call be called, they should not be called until after `'init'` with priority `1`, because each component, like the data store, has not yet been initialized.
+
+Do not use Action Scheduler API functions prior to `'init'` hook with priority `1`. Doing so could lead to unexpected results, like data being stored in the incorrect location.
+
+#### Function Reference / `as_schedule_single_action()`
##### Description
@@ -130,7 +241,7 @@ Schedule an action to run one time.
##### Usage
```php
-
+
````
##### Parameters
@@ -145,7 +256,7 @@ Schedule an action to run one time.
(integer) the action's ID in the [posts](http://codex.wordpress.org/Database_Description#Table_Overview) table.
-#### Function Reference / `wc_schedule_recurring_action()`
+#### Function Reference / `as_schedule_recurring_action()`
##### Description
@@ -154,7 +265,7 @@ Schedule an action to run repeatedly with a specified interval in seconds.
##### Usage
```php
-
+
````
##### Parameters
@@ -170,7 +281,7 @@ Schedule an action to run repeatedly with a specified interval in seconds.
(integer) the action's ID in the [posts](http://codex.wordpress.org/Database_Description#Table_Overview) table.
-#### Function Reference / `wc_schedule_cron_action()`
+#### Function Reference / `as_schedule_cron_action()`
##### Description
@@ -179,7 +290,7 @@ Schedule an action that recurs on a cron-like schedule.
##### Usage
```php
-
+
````
##### Parameters
@@ -195,7 +306,7 @@ Schedule an action that recurs on a cron-like schedule.
(integer) the action's ID in the [posts](http://codex.wordpress.org/Database_Description#Table_Overview) table.
-#### Function Reference / `wc_unschedule_action()`
+#### Function Reference / `as_unschedule_action()`
##### Description
@@ -204,7 +315,7 @@ Cancel the next occurrence of a job.
##### Usage
```php
-
+
````
##### Parameters
@@ -218,7 +329,7 @@ Cancel the next occurrence of a job.
(null)
-#### Function Reference / `wc_next_scheduled_action()`
+#### Function Reference / `as_next_scheduled_action()`
##### Description
@@ -227,7 +338,7 @@ Returns the next timestamp for a scheduled action.
##### Usage
```php
-
+
````
##### Parameters
@@ -241,7 +352,7 @@ Returns the next timestamp for a scheduled action.
(integer|boolean) The timestamp for the next occurrence, or false if nothing was found.
-#### Function Reference / `wc_get_scheduled_actions()`
+#### Function Reference / `as_get_scheduled_actions()`
##### Description
@@ -250,7 +361,7 @@ Find scheduled actions.
##### Usage
```php
-
+
````
##### Parameters
diff --git a/includes/libraries/action-scheduler/action-scheduler.php b/includes/libraries/action-scheduler/action-scheduler.php
index 96595cd4a2c..4ff7ec5266a 100644
--- a/includes/libraries/action-scheduler/action-scheduler.php
+++ b/includes/libraries/action-scheduler/action-scheduler.php
@@ -5,7 +5,7 @@
* Description: A robust scheduling library for use in WordPress plugins.
* Author: Prospress
* Author URI: http://prospress.com/
- * Version: 2.0.0
+ * Version: 2.1.0
* License: GPLv3
*
* Copyright 2018 Prospress, Inc. (email : freedoms@prospress.com)
@@ -25,21 +25,21 @@
*
*/
-if ( ! function_exists( 'action_scheduler_register_2_dot_0_dot_0' ) ) {
+if ( ! function_exists( 'action_scheduler_register_2_dot_1_dot_0' ) ) {
if ( ! class_exists( 'ActionScheduler_Versions' ) ) {
require_once( 'classes/ActionScheduler_Versions.php' );
add_action( 'plugins_loaded', array( 'ActionScheduler_Versions', 'initialize_latest_version' ), 1, 0 );
}
- add_action( 'plugins_loaded', 'action_scheduler_register_2_dot_0_dot_0', 0, 0 );
+ add_action( 'plugins_loaded', 'action_scheduler_register_2_dot_1_dot_0', 0, 0 );
- function action_scheduler_register_2_dot_0_dot_0() {
+ function action_scheduler_register_2_dot_1_dot_0() {
$versions = ActionScheduler_Versions::instance();
- $versions->register( '2.0.0', 'action_scheduler_initialize_2_dot_0_dot_0' );
+ $versions->register( '2.1.0', 'action_scheduler_initialize_2_dot_1_dot_0' );
}
- function action_scheduler_initialize_2_dot_0_dot_0() {
+ function action_scheduler_initialize_2_dot_1_dot_0() {
require_once( 'classes/ActionScheduler.php' );
ActionScheduler::init( __FILE__ );
}
diff --git a/includes/libraries/action-scheduler/classes/ActionScheduler.php b/includes/libraries/action-scheduler/classes/ActionScheduler.php
index 5e1ad36d704..ffb5ec05167 100644
--- a/includes/libraries/action-scheduler/classes/ActionScheduler.php
+++ b/includes/libraries/action-scheduler/classes/ActionScheduler.php
@@ -67,8 +67,8 @@ abstract class ActionScheduler {
return;
}
- if ( file_exists( $dir.$class.'.php' ) ) {
- include( $dir.$class.'.php' );
+ if ( file_exists( "{$dir}{$class}.php" ) ) {
+ include( "{$dir}{$class}.php" );
return;
}
}
@@ -97,6 +97,10 @@ abstract class ActionScheduler {
require_once( self::plugin_path('functions.php') );
+ if ( apply_filters( 'action_scheduler_load_deprecated_functions', true ) ) {
+ require_once( self::plugin_path('deprecated/functions.php') );
+ }
+
if ( defined( 'WP_CLI' ) && WP_CLI ) {
WP_CLI::add_command( 'action-scheduler', 'ActionScheduler_WPCLI_Scheduler_command' );
}
diff --git a/includes/libraries/action-scheduler/classes/ActionScheduler_Abstract_ListTable.php b/includes/libraries/action-scheduler/classes/ActionScheduler_Abstract_ListTable.php
index de47067dcde..6af17b9223f 100644
--- a/includes/libraries/action-scheduler/classes/ActionScheduler_Abstract_ListTable.php
+++ b/includes/libraries/action-scheduler/classes/ActionScheduler_Abstract_ListTable.php
@@ -275,7 +275,7 @@ abstract class ActionScheduler_Abstract_ListTable extends WP_List_Table {
$valid_sortable_columns = array_values( $this->sort_by );
if ( ! empty( $_GET['orderby'] ) && in_array( $_GET['orderby'], $valid_sortable_columns ) ) {
- $orderby = wc_clean( $_GET['orderby'] );
+ $orderby = sanitize_text_field( $_GET['orderby'] );
} else {
$orderby = $valid_sortable_columns[0];
}
diff --git a/includes/libraries/action-scheduler/classes/ActionScheduler_Abstract_QueueRunner.php b/includes/libraries/action-scheduler/classes/ActionScheduler_Abstract_QueueRunner.php
index 21f9ee0025f..a1227c01f55 100644
--- a/includes/libraries/action-scheduler/classes/ActionScheduler_Abstract_QueueRunner.php
+++ b/includes/libraries/action-scheduler/classes/ActionScheduler_Abstract_QueueRunner.php
@@ -14,6 +14,16 @@ abstract class ActionScheduler_Abstract_QueueRunner {
/** @var ActionScheduler_Store */
protected $store;
+ /**
+ * The created time.
+ *
+ * Represents when the queue runner was constructed and used when calculating how long a PHP request has been running.
+ * For this reason it should be as close as possible to the PHP request start time.
+ *
+ * @var int
+ */
+ private $created_time;
+
/**
* ActionScheduler_Abstract_QueueRunner constructor.
*
@@ -22,6 +32,9 @@ abstract class ActionScheduler_Abstract_QueueRunner {
* @param ActionScheduler_QueueCleaner $cleaner
*/
public function __construct( ActionScheduler_Store $store = null, ActionScheduler_FatalErrorMonitor $monitor = null, ActionScheduler_QueueCleaner $cleaner = null ) {
+
+ $this->created_time = microtime( true );
+
$this->store = $store ? $store : ActionScheduler_Store::instance();
$this->monitor = $monitor ? $monitor : new ActionScheduler_FatalErrorMonitor( $this->store );
$this->cleaner = $cleaner ? $cleaner : new ActionScheduler_QueueCleaner( $this->store );
@@ -35,6 +48,12 @@ abstract class ActionScheduler_Abstract_QueueRunner {
public function process_action( $action_id ) {
try {
do_action( 'action_scheduler_before_execute', $action_id );
+
+ if ( ActionScheduler_Store::STATUS_PENDING !== $this->store->get_status( $action_id ) ) {
+ do_action( 'action_scheduler_execution_ignored', $action_id );
+ return;
+ }
+
$action = $this->store->fetch_action( $action_id );
$this->store->log_execution( $action_id );
$action->execute();
@@ -79,6 +98,115 @@ abstract class ActionScheduler_Abstract_QueueRunner {
return apply_filters( 'action_scheduler_queue_runner_concurrent_batches', 5 );
}
+ /**
+ * Get the maximum number of seconds a batch can run for.
+ *
+ * @return int The number of seconds.
+ */
+ protected function get_maximum_execution_time() {
+
+ // There are known hosts with a strict 60 second execution time.
+ if ( defined( 'WPENGINE_ACCOUNT' ) || defined( 'PANTHEON_ENVIRONMENT' ) ) {
+ $maximum_execution_time = 60;
+ } elseif ( false !== strpos( getenv( 'HOSTNAME' ), '.siteground.' ) ) {
+ $maximum_execution_time = 120;
+ } else {
+ $maximum_execution_time = ini_get( 'max_execution_time' );
+ }
+
+ return absint( apply_filters( 'action_scheduler_maximum_execution_time', $maximum_execution_time ) );
+ }
+
+ /**
+ * Get the number of seconds a batch has run for.
+ *
+ * @return int The number of seconds.
+ */
+ protected function get_execution_time() {
+ $execution_time = microtime( true ) - $this->created_time;
+
+ // Get the CPU time if the hosting environment uses it rather than wall-clock time to calculate a process's execution time.
+ if ( function_exists( 'getrusage' ) && apply_filters( 'action_scheduler_use_cpu_execution_time', defined( 'PANTHEON_ENVIRONMENT' ) ) ) {
+ $resource_usages = getrusage();
+
+ if ( isset( $resource_usages['ru_stime.tv_usec'], $resource_usages['ru_stime.tv_usec'] ) ) {
+ $execution_time = $resource_usages['ru_stime.tv_sec'] + ( $resource_usages['ru_stime.tv_usec'] / 1000000 );
+ }
+ }
+
+ return $execution_time;
+ }
+
+ /**
+ * Check if the host's max execution time is (likely) to be exceeded if processing more actions.
+ *
+ * @param int $processed_actions The number of actions processed so far - used to determine the likelihood of exceeding the time limit if processing another action
+ * @return bool
+ */
+ protected function time_likely_to_be_exceeded( $processed_actions ) {
+
+ $execution_time = $this->get_execution_time();
+ $max_execution_time = $this->get_maximum_execution_time();
+ $time_per_action = $execution_time / $processed_actions;
+ $estimated_time = $execution_time + ( $time_per_action * 2 );
+ $likely_to_be_exceeded = $estimated_time > $this->get_maximum_execution_time();
+
+ return apply_filters( 'action_scheduler_maximum_execution_time_likely_to_be_exceeded', $likely_to_be_exceeded, $this, $processed_actions, $execution_time, $max_execution_time );
+ }
+
+ /**
+ * Get memory limit
+ *
+ * Based on WP_Background_Process::get_memory_limit()
+ *
+ * @return int
+ */
+ protected function get_memory_limit() {
+ if ( function_exists( 'ini_get' ) ) {
+ $memory_limit = ini_get( 'memory_limit' );
+ } else {
+ $memory_limit = '128M'; // Sensible default, and minimum required by WooCommerce
+ }
+
+ if ( ! $memory_limit || -1 === $memory_limit || '-1' === $memory_limit ) {
+ // Unlimited, set to 32GB.
+ $memory_limit = '32G';
+ }
+
+ return ActionScheduler_Compatibility::convert_hr_to_bytes( $memory_limit );
+ }
+
+ /**
+ * Memory exceeded
+ *
+ * Ensures the batch process never exceeds 90% of the maximum WordPress memory.
+ *
+ * Based on WP_Background_Process::memory_exceeded()
+ *
+ * @return bool
+ */
+ protected function memory_exceeded() {
+
+ $memory_limit = $this->get_memory_limit() * 0.90;
+ $current_memory = memory_get_usage( true );
+ $memory_exceeded = $current_memory >= $memory_limit;
+
+ return apply_filters( 'action_scheduler_memory_exceeded', $memory_exceeded, $this );
+ }
+
+ /**
+ * See if the batch limits have been exceeded, which is when memory usage is almost at
+ * the maximum limit, or the time to process more actions will exceed the max time limit.
+ *
+ * Based on WC_Background_Process::batch_limits_exceeded()
+ *
+ * @param int $processed_actions The number of actions processed so far - used to determine the likelihood of exceeding the time limit if processing another action
+ * @return bool
+ */
+ protected function batch_limits_exceeded( $processed_actions ) {
+ return $this->memory_exceeded() || $this->time_likely_to_be_exceeded( $processed_actions );
+ }
+
/**
* Process actions in the queue.
*
diff --git a/includes/libraries/action-scheduler/classes/ActionScheduler_Compatibility.php b/includes/libraries/action-scheduler/classes/ActionScheduler_Compatibility.php
new file mode 100644
index 00000000000..89a12e2c72d
--- /dev/null
+++ b/includes/libraries/action-scheduler/classes/ActionScheduler_Compatibility.php
@@ -0,0 +1,80 @@
+ $wp_max_limit_int && $filtered_limit_int > $current_limit_int ) ) {
+ if ( false !== @ini_set( 'memory_limit', $filtered_limit ) ) {
+ return $filtered_limit;
+ } else {
+ return false;
+ }
+ } elseif ( -1 === $wp_max_limit_int || $wp_max_limit_int > $current_limit_int ) {
+ if ( false !== @ini_set( 'memory_limit', $wp_max_limit ) ) {
+ return $wp_max_limit;
+ } else {
+ return false;
+ }
+ }
+ return false;
+ }
+}
diff --git a/includes/libraries/action-scheduler/classes/ActionScheduler_DateTime.php b/includes/libraries/action-scheduler/classes/ActionScheduler_DateTime.php
index 13d8c274c2f..5e8743cae74 100644
--- a/includes/libraries/action-scheduler/classes/ActionScheduler_DateTime.php
+++ b/includes/libraries/action-scheduler/classes/ActionScheduler_DateTime.php
@@ -7,6 +7,16 @@
*/
class ActionScheduler_DateTime extends DateTime {
+ /**
+ * UTC offset.
+ *
+ * Only used when a timezone is not set. When a timezone string is
+ * used, this will be set to 0.
+ *
+ * @var int
+ */
+ protected $utcOffset = 0;
+
/**
* Get the unix timestamp of the current object.
*
@@ -17,4 +27,50 @@ class ActionScheduler_DateTime extends DateTime {
public function getTimestamp() {
return method_exists( 'DateTime', 'getTimestamp' ) ? parent::getTimestamp() : $this->format( 'U' );
}
+
+ /**
+ * Set the UTC offset.
+ *
+ * This represents a fixed offset instead of a timezone setting.
+ *
+ * @param $offset
+ */
+ public function setUtcOffset( $offset ) {
+ $this->utcOffset = intval( $offset );
+ }
+
+ /**
+ * Returns the timezone offset.
+ *
+ * @return int
+ * @link http://php.net/manual/en/datetime.getoffset.php
+ */
+ public function getOffset() {
+ return $this->utcOffset ? $this->utcOffset : parent::getOffset();
+ }
+
+ /**
+ * Set the TimeZone associated with the DateTime
+ *
+ * @param DateTimeZone $timezone
+ *
+ * @return static
+ * @link http://php.net/manual/en/datetime.settimezone.php
+ */
+ public function setTimezone( $timezone ) {
+ $this->utcOffset = 0;
+ parent::setTimezone( $timezone );
+
+ return $this;
+ }
+
+ /**
+ * Get the timestamp with the WordPress timezone offset added or subtracted.
+ *
+ * @since 3.0.0
+ * @return int
+ */
+ public function getOffsetTimestamp() {
+ return $this->getTimestamp() + $this->getOffset();
+ }
}
diff --git a/includes/libraries/action-scheduler/classes/ActionScheduler_Exception.php b/includes/libraries/action-scheduler/classes/ActionScheduler_Exception.php
new file mode 100644
index 00000000000..9ec713f67ad
--- /dev/null
+++ b/includes/libraries/action-scheduler/classes/ActionScheduler_Exception.php
@@ -0,0 +1,11 @@
+claim = NULL;
$this->untrack_action();
remove_action( 'shutdown', array( $this, 'handle_unexpected_shutdown' ) );
- remove_action( 'action_scheduler_before_execute', array( $this, 'track_current_action' ), 0, 1 );
- remove_action( 'action_scheduler_after_execute', array( $this, 'untrack_action' ), 0, 0 );
- remove_action( 'action_scheduler_failed_execution', array( $this, 'untrack_action' ), 0, 0 );
+ remove_action( 'action_scheduler_before_execute', array( $this, 'track_current_action' ), 0 );
+ remove_action( 'action_scheduler_after_execute', array( $this, 'untrack_action' ), 0 );
+ remove_action( 'action_scheduler_execution_ignored', array( $this, 'untrack_action' ), 0 );
+ remove_action( 'action_scheduler_failed_execution', array( $this, 'untrack_action' ), 0 );
}
public function track_current_action( $action_id ) {
@@ -51,4 +53,3 @@ class ActionScheduler_FatalErrorMonitor {
}
}
}
-
\ No newline at end of file
diff --git a/includes/libraries/action-scheduler/classes/ActionScheduler_InvalidActionException.php b/includes/libraries/action-scheduler/classes/ActionScheduler_InvalidActionException.php
new file mode 100644
index 00000000000..a7decdcac6e
--- /dev/null
+++ b/includes/libraries/action-scheduler/classes/ActionScheduler_InvalidActionException.php
@@ -0,0 +1,28 @@
+';
foreach ( $row['args'] as $key => $value ) {
- $row_html .= sprintf( '%s => %s
', esc_html( $key ), esc_html( $value ) );
+ $row_html .= sprintf( '%s => %s
', esc_html( var_export( $key, true ) ), esc_html( var_export( $value, true ) ) );
}
$row_html .= '';
diff --git a/includes/libraries/action-scheduler/classes/ActionScheduler_Logger.php b/includes/libraries/action-scheduler/classes/ActionScheduler_Logger.php
index 601e5679c99..aa14205520f 100644
--- a/includes/libraries/action-scheduler/classes/ActionScheduler_Logger.php
+++ b/includes/libraries/action-scheduler/classes/ActionScheduler_Logger.php
@@ -41,7 +41,58 @@ abstract class ActionScheduler_Logger {
*/
abstract public function get_logs( $action_id );
- abstract public function init();
+ /**
+ * @codeCoverageIgnore
+ */
+ public function init() {
+ add_action( 'action_scheduler_stored_action', array( $this, 'log_stored_action' ), 10, 1 );
+ add_action( 'action_scheduler_canceled_action', array( $this, 'log_canceled_action' ), 10, 1 );
+ add_action( 'action_scheduler_before_execute', array( $this, 'log_started_action' ), 10, 1 );
+ add_action( 'action_scheduler_after_execute', array( $this, 'log_completed_action' ), 10, 1 );
+ add_action( 'action_scheduler_failed_execution', array( $this, 'log_failed_action' ), 10, 2 );
+ add_action( 'action_scheduler_failed_action', array( $this, 'log_timed_out_action' ), 10, 2 );
+ add_action( 'action_scheduler_unexpected_shutdown', array( $this, 'log_unexpected_shutdown' ), 10, 2 );
+ add_action( 'action_scheduler_reset_action', array( $this, 'log_reset_action' ), 10, 1 );
+ add_action( 'action_scheduler_execution_ignored', array( $this, 'log_ignored_action' ), 10, 1 );
+ }
+
+ public function log_stored_action( $action_id ) {
+ $this->log( $action_id, __( 'action created', 'action-scheduler' ) );
+ }
+
+ public function log_canceled_action( $action_id ) {
+ $this->log( $action_id, __( 'action canceled', 'action-scheduler' ) );
+ }
+
+ public function log_started_action( $action_id ) {
+ $this->log( $action_id, __( 'action started', 'action-scheduler' ) );
+ }
+
+ public function log_completed_action( $action_id ) {
+ $this->log( $action_id, __( 'action complete', 'action-scheduler' ) );
+ }
+
+ public function log_failed_action( $action_id, Exception $exception ) {
+ $this->log( $action_id, sprintf( __( 'action failed: %s', 'action-scheduler' ), $exception->getMessage() ) );
+ }
+
+ public function log_timed_out_action( $action_id, $timeout ) {
+ $this->log( $action_id, sprintf( __( 'action timed out after %s seconds', 'action-scheduler' ), $timeout ) );
+ }
+
+ public function log_unexpected_shutdown( $action_id, $error ) {
+ if ( ! empty( $error ) ) {
+ $this->log( $action_id, sprintf( __( 'unexpected shutdown: PHP Fatal error %s in %s on line %s', 'action-scheduler' ), $error['message'], $error['file'], $error['line'] ) );
+ }
+ }
+
+ public function log_reset_action( $action_id ) {
+ $this->log( $action_id, __( 'action reset', 'action_scheduler' ) );
+ }
+
+ public function log_ignored_action( $action_id ) {
+ $this->log( $action_id, __( 'action ignored', 'action-scheduler' ) );
+ }
}
-
\ No newline at end of file
+
diff --git a/includes/libraries/action-scheduler/classes/ActionScheduler_QueueRunner.php b/includes/libraries/action-scheduler/classes/ActionScheduler_QueueRunner.php
index 387bb516fe0..98b7ef7fa22 100644
--- a/includes/libraries/action-scheduler/classes/ActionScheduler_QueueRunner.php
+++ b/includes/libraries/action-scheduler/classes/ActionScheduler_QueueRunner.php
@@ -11,16 +11,6 @@ class ActionScheduler_QueueRunner extends ActionScheduler_Abstract_QueueRunner {
/** @var ActionScheduler_QueueRunner */
private static $runner = null;
- /**
- * The created time.
- *
- * Represents when the queue runner was constructed and used when calculating how long a PHP request has been running.
- * For this reason it should be as close as possible to the PHP request start time.
- *
- * @var int
- */
- private $created_time;
-
/**
* @return ActionScheduler_QueueRunner
* @codeCoverageIgnore
@@ -42,7 +32,6 @@ class ActionScheduler_QueueRunner extends ActionScheduler_Abstract_QueueRunner {
*/
public function __construct( ActionScheduler_Store $store = null, ActionScheduler_FatalErrorMonitor $monitor = null, ActionScheduler_QueueCleaner $cleaner = null ) {
parent::__construct( $store, $monitor, $cleaner );
- $this->created_time = microtime( true );
}
/**
@@ -61,43 +50,39 @@ class ActionScheduler_QueueRunner extends ActionScheduler_Abstract_QueueRunner {
}
public function run() {
- @ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', WP_MAX_MEMORY_LIMIT ) );
+ ActionScheduler_Compatibility::raise_memory_limit();
@set_time_limit( apply_filters( 'action_scheduler_queue_runner_time_limit', 600 ) );
do_action( 'action_scheduler_before_process_queue' );
$this->run_cleanup();
- $count = 0;
+ $processed_actions = 0;
if ( $this->store->get_claim_count() < $this->get_allowed_concurrent_batches() ) {
$batch_size = apply_filters( 'action_scheduler_queue_runner_batch_size', 25 );
- $count = $this->do_batch( $batch_size );
+ do {
+ $processed_actions_in_batch = $this->do_batch( $batch_size );
+ $processed_actions += $processed_actions_in_batch;
+ } while ( $processed_actions_in_batch > 0 && ! $this->batch_limits_exceeded( $processed_actions ) ); // keep going until we run out of actions, time, or memory
}
do_action( 'action_scheduler_after_process_queue' );
- return $count;
+ return $processed_actions;
}
protected function do_batch( $size = 100 ) {
$claim = $this->store->stake_claim($size);
$this->monitor->attach($claim);
- $processed_actions = 0;
- $maximum_execution_time = $this->get_maximum_execution_time();
+ $processed_actions = 0;
foreach ( $claim->get_actions() as $action_id ) {
- if ( 0 !== $processed_actions ) {
- $time_elapsed = $this->get_execution_time();
- $average_processing_time = $time_elapsed / $processed_actions;
-
- // Bail early if the time it has taken to process this batch is approaching the maximum execution time.
- if ( $time_elapsed + ( $average_processing_time * 2 ) > $maximum_execution_time ) {
- break;
- }
- }
-
// bail if we lost the claim
if ( ! in_array( $action_id, $this->store->find_actions_by_claim_id( $claim->get_id() ) ) ) {
break;
}
$this->process_action( $action_id );
$processed_actions++;
+
+ if ( $this->batch_limits_exceeded( $processed_actions ) ) {
+ break;
+ }
}
$this->store->release_claim($claim);
$this->monitor->detach();
@@ -127,43 +112,4 @@ class ActionScheduler_QueueRunner extends ActionScheduler_Abstract_QueueRunner {
return $schedules;
}
-
- /**
- * Get the maximum number of seconds a batch can run for.
- *
- * @return int The number of seconds.
- */
- protected function get_maximum_execution_time() {
-
- // There are known hosts with a strict 60 second execution time.
- if ( defined( 'WPENGINE_ACCOUNT' ) || defined( 'PANTHEON_ENVIRONMENT' ) ) {
- $maximum_execution_time = 60;
- } elseif ( false !== strpos( getenv( 'HOSTNAME' ), '.siteground.' ) ) {
- $maximum_execution_time = 120;
- } else {
- $maximum_execution_time = ini_get( 'max_execution_time' );
- }
-
- return absint( apply_filters( 'action_scheduler_maximum_execution_time', $maximum_execution_time ) );
- }
-
- /**
- * Get the number of seconds a batch has run for.
- *
- * @return int The number of seconds.
- */
- protected function get_execution_time() {
- $execution_time = microtime( true ) - $this->created_time;
-
- // Get the CPU time if the hosting environment uses it rather than wall-clock time to calculate a process's execution time.
- if ( function_exists( 'getrusage' ) && apply_filters( 'action_scheduler_use_cpu_execution_time', defined( 'PANTHEON_ENVIRONMENT' ) ) ) {
- $resource_usages = getrusage();
-
- if ( isset( $resource_usages['ru_stime.tv_usec'], $resource_usages['ru_stime.tv_usec'] ) ) {
- $execution_time = $resource_usages['ru_stime.tv_sec'] + ( $resource_usages['ru_stime.tv_usec'] / 1000000 );
- }
- }
-
- return $execution_time;
- }
}
diff --git a/includes/libraries/action-scheduler/classes/ActionScheduler_Store.php b/includes/libraries/action-scheduler/classes/ActionScheduler_Store.php
index d967b593de8..59ac236af9a 100644
--- a/includes/libraries/action-scheduler/classes/ActionScheduler_Store.php
+++ b/includes/libraries/action-scheduler/classes/ActionScheduler_Store.php
@@ -168,20 +168,11 @@ abstract class ActionScheduler_Store {
if ( ! $next ) {
throw new InvalidArgumentException( __( 'Invalid schedule. Cannot save action.', 'action-scheduler' ) );
}
- $next->setTimezone( $this->get_local_timezone() );
+ ActionScheduler_TimezoneHelper::set_local_timezone( $next );
return $next->format( 'Y-m-d H:i:s' );
}
- /**
- * Get the site's local time. Wrapper for ActionScheduler_TimezoneHelper::get_local_timezone().
- *
- * @return DateTimeZone
- */
- protected function get_local_timezone() {
- return ActionScheduler_TimezoneHelper::get_local_timezone();
- }
-
/**
* @return array
*/
@@ -207,4 +198,15 @@ abstract class ActionScheduler_Store {
}
return self::$store;
}
+
+ /**
+ * Get the site's local time.
+ *
+ * @deprecated 2.1.0
+ * @return DateTimeZone
+ */
+ protected function get_local_timezone() {
+ _deprecated_function( __FUNCTION__, '2.1.0', 'ActionScheduler_TimezoneHelper::set_local_timezone()' );
+ return ActionScheduler_TimezoneHelper::get_local_timezone();
+ }
}
diff --git a/includes/libraries/action-scheduler/classes/ActionScheduler_TimezoneHelper.php b/includes/libraries/action-scheduler/classes/ActionScheduler_TimezoneHelper.php
index 0c8d6e4b0ca..fd01449412e 100644
--- a/includes/libraries/action-scheduler/classes/ActionScheduler_TimezoneHelper.php
+++ b/includes/libraries/action-scheduler/classes/ActionScheduler_TimezoneHelper.php
@@ -5,7 +5,102 @@
*/
abstract class ActionScheduler_TimezoneHelper {
private static $local_timezone = NULL;
+
+ /**
+ * Set a DateTime's timezone to the WordPress site's timezone, or a UTC offset
+ * if no timezone string is available.
+ *
+ * @since 2.1.0
+ *
+ * @param DateTime $date
+ * @return ActionScheduler_DateTime
+ */
+ public static function set_local_timezone( DateTime $date ) {
+
+ // Accept a DateTime for easier backward compatibility, even though we require methods on ActionScheduler_DateTime
+ if ( ! is_a( $date, 'ActionScheduler_DateTime' ) ) {
+ $date = as_get_datetime_object( $date->format( 'U' ) );
+ }
+
+ if ( get_option( 'timezone_string' ) ) {
+ $date->setTimezone( new DateTimeZone( self::get_local_timezone_string() ) );
+ } else {
+ $date->setUtcOffset( self::get_local_timezone_offset() );
+ }
+
+ return $date;
+ }
+
+ /**
+ * Helper to retrieve the timezone string for a site until a WP core method exists
+ * (see https://core.trac.wordpress.org/ticket/24730).
+ *
+ * Adapted from wc_timezone_string() and https://secure.php.net/manual/en/function.timezone-name-from-abbr.php#89155.
+ *
+ * If no timezone string is set, and its not possible to match the UTC offset set for the site to a timezone
+ * string, then an empty string will be returned, and the UTC offset should be used to set a DateTime's
+ * timezone.
+ *
+ * @since 2.1.0
+ * @return string PHP timezone string for the site or empty if no timezone string is available.
+ */
+ protected static function get_local_timezone_string( $reset = false ) {
+ // If site timezone string exists, return it.
+ $timezone = get_option( 'timezone_string' );
+ if ( $timezone ) {
+ return $timezone;
+ }
+
+ // Get UTC offset, if it isn't set then return UTC.
+ $utc_offset = intval( get_option( 'gmt_offset', 0 ) );
+ if ( 0 === $utc_offset ) {
+ return 'UTC';
+ }
+
+ // Adjust UTC offset from hours to seconds.
+ $utc_offset *= 3600;
+
+ // Attempt to guess the timezone string from the UTC offset.
+ $timezone = timezone_name_from_abbr( '', $utc_offset );
+ if ( $timezone ) {
+ return $timezone;
+ }
+
+ // Last try, guess timezone string manually.
+ foreach ( timezone_abbreviations_list() as $abbr ) {
+ foreach ( $abbr as $city ) {
+ if ( (bool) date( 'I' ) === (bool) $city['dst'] && $city['timezone_id'] && intval( $city['offset'] ) === $utc_offset ) {
+ return $city['timezone_id'];
+ }
+ }
+ }
+
+ // No timezone string
+ return '';
+ }
+
+ /**
+ * Get timezone offset in seconds.
+ *
+ * @since 2.1.0
+ * @return float
+ */
+ protected static function get_local_timezone_offset() {
+ $timezone = get_option( 'timezone_string' );
+
+ if ( $timezone ) {
+ $timezone_object = new DateTimeZone( $timezone );
+ return $timezone_object->getOffset( new DateTime( 'now' ) );
+ } else {
+ return floatval( get_option( 'gmt_offset', 0 ) ) * HOUR_IN_SECONDS;
+ }
+ }
+
+ /**
+ * @deprecated 2.1.0
+ */
public static function get_local_timezone( $reset = FALSE ) {
+ _deprecated_function( __FUNCTION__, '2.1.0', 'ActionScheduler_TimezoneHelper::set_local_timezone()' );
if ( $reset ) {
self::$local_timezone = NULL;
}
@@ -18,18 +113,32 @@ abstract class ActionScheduler_TimezoneHelper {
$tzstring = 'UTC';
} else {
$gmt_offset *= HOUR_IN_SECONDS;
- $tzstring = timezone_name_from_abbr('', $gmt_offset);
+ $tzstring = timezone_name_from_abbr( '', $gmt_offset, 1 );
+
+ // If there's no timezone string, try again with no DST.
+ if ( false === $tzstring ) {
+ $tzstring = timezone_name_from_abbr( '', $gmt_offset, 0 );
+ }
+
+ // Try mapping to the first abbreviation we can find.
if ( false === $tzstring ) {
$is_dst = date( 'I' );
foreach ( timezone_abbreviations_list() as $abbr ) {
foreach ( $abbr as $city ) {
if ( $city['dst'] == $is_dst && $city['offset'] == $gmt_offset ) {
+ // If there's no valid timezone ID, keep looking.
+ if ( null === $city['timezone_id'] ) {
+ continue;
+ }
+
$tzstring = $city['timezone_id'];
break 2;
}
}
}
}
+
+ // If we still have no valid string, then fall back to UTC.
if ( false === $tzstring ) {
$tzstring = 'UTC';
}
@@ -41,4 +150,3 @@ abstract class ActionScheduler_TimezoneHelper {
return self::$local_timezone;
}
}
-
\ No newline at end of file
diff --git a/includes/libraries/action-scheduler/classes/ActionScheduler_wpCommentLogger.php b/includes/libraries/action-scheduler/classes/ActionScheduler_wpCommentLogger.php
index 78a9c29a615..7215ddd94a1 100644
--- a/includes/libraries/action-scheduler/classes/ActionScheduler_wpCommentLogger.php
+++ b/includes/libraries/action-scheduler/classes/ActionScheduler_wpCommentLogger.php
@@ -18,15 +18,16 @@ class ActionScheduler_wpCommentLogger extends ActionScheduler_Logger {
if ( empty($date) ) {
$date = as_get_datetime_object();
} else {
- $date = clone $date;
+ $date = as_get_datetime_object( clone $date );
}
$comment_id = $this->create_wp_comment( $action_id, $message, $date );
return $comment_id;
}
protected function create_wp_comment( $action_id, $message, DateTime $date ) {
+
$comment_date_gmt = $date->format('Y-m-d H:i:s');
- $date->setTimezone( ActionScheduler_TimezoneHelper::get_local_timezone() );
+ ActionScheduler_TimezoneHelper::set_local_timezone( $date );
$comment_data = array(
'comment_post_ID' => $action_id,
'comment_date' => $date->format('Y-m-d H:i:s'),
@@ -51,7 +52,7 @@ class ActionScheduler_wpCommentLogger extends ActionScheduler_Logger {
}
$date = as_get_datetime_object( $comment->comment_date_gmt );
- $date->setTimezone( ActionScheduler_TimezoneHelper::get_local_timezone() );
+ ActionScheduler_TimezoneHelper::set_local_timezone( $date );
return new ActionScheduler_LogEntry( $comment->comment_post_ID, $comment->comment_content, $date );
}
@@ -217,14 +218,9 @@ class ActionScheduler_wpCommentLogger extends ActionScheduler_Logger {
public function init() {
add_action( 'action_scheduler_before_process_queue', array( $this, 'disable_comment_counting' ), 10, 0 );
add_action( 'action_scheduler_after_process_queue', array( $this, 'enable_comment_counting' ), 10, 0 );
- add_action( 'action_scheduler_stored_action', array( $this, 'log_stored_action' ), 10, 1 );
- add_action( 'action_scheduler_canceled_action', array( $this, 'log_canceled_action' ), 10, 1 );
- add_action( 'action_scheduler_before_execute', array( $this, 'log_started_action' ), 10, 1 );
- add_action( 'action_scheduler_after_execute', array( $this, 'log_completed_action' ), 10, 1 );
- add_action( 'action_scheduler_failed_execution', array( $this, 'log_failed_action' ), 10, 2 );
- add_action( 'action_scheduler_failed_action', array( $this, 'log_timed_out_action' ), 10, 2 );
- add_action( 'action_scheduler_unexpected_shutdown', array( $this, 'log_unexpected_shutdown' ), 10, 2 );
- add_action( 'action_scheduler_reset_action', array( $this, 'log_reset_action' ), 10, 1 );
+
+ parent::init();
+
add_action( 'pre_get_comments', array( $this, 'filter_comment_queries' ), 10, 1 );
add_action( 'wp_count_comments', array( $this, 'filter_comment_count' ), 20, 2 ); // run after WC_Comments::wp_count_comments() to make sure we exclude order notes and action logs
add_action( 'comment_feed_where', array( $this, 'filter_comment_feed' ), 10, 2 );
@@ -241,38 +237,4 @@ class ActionScheduler_wpCommentLogger extends ActionScheduler_Logger {
wp_defer_comment_counting(false);
}
- public function log_stored_action( $action_id ) {
- $this->log( $action_id, __('action created', 'action-scheduler') );
- }
-
- public function log_canceled_action( $action_id ) {
- $this->log( $action_id, __('action canceled', 'action-scheduler') );
- }
-
- public function log_started_action( $action_id ) {
- $this->log( $action_id, __('action started', 'action-scheduler') );
- }
-
- public function log_completed_action( $action_id ) {
- $this->log( $action_id, __('action complete', 'action-scheduler') );
- }
-
- public function log_failed_action( $action_id, Exception $exception ) {
- $this->log( $action_id, sprintf(__('action failed: %s', 'action-scheduler'), $exception->getMessage() ));
- }
-
- public function log_timed_out_action( $action_id, $timeout) {
- $this->log( $action_id, sprintf( __('action timed out after %s seconds', 'action-scheduler'), $timeout ) );
- }
-
- public function log_unexpected_shutdown( $action_id, $error ) {
- if ( !empty($error) ) {
- $this->log( $action_id, sprintf(__('unexpected shutdown: PHP Fatal error %s in %s on line %s', 'action-scheduler'), $error['message'], $error['file'], $error['line'] ) );
- }
- }
-
- public function log_reset_action( $action_id ) {
- $this->log( $action_id, __('action reset', 'action_scheduler') );
- }
-
}
diff --git a/includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore.php b/includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore.php
index 030e65d8505..b91e3d19e0f 100644
--- a/includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore.php
+++ b/includes/libraries/action-scheduler/classes/ActionScheduler_wpPostStore.php
@@ -11,8 +11,12 @@ class ActionScheduler_wpPostStore extends ActionScheduler_Store {
/** @var DateTimeZone */
protected $local_timezone = NULL;
+ /** @var int */
+ private static $max_index_length = 191;
+
public function save_action( ActionScheduler_Action $action, DateTime $scheduled_date = NULL ){
try {
+ $this->validate_action( $action );
$post_array = $this->create_post_array( $action, $scheduled_date );
$post_id = $this->save_post_array( $post_array );
$this->save_post_schedule( $post_id, $action->get_schedule() );
@@ -91,6 +95,12 @@ class ActionScheduler_wpPostStore extends ActionScheduler_Store {
protected function make_action_from_post( $post ) {
$hook = $post->post_title;
$args = json_decode( $post->post_content, true );
+
+ // Handle args that do not decode properly.
+ if ( JSON_ERROR_NONE !== json_last_error() || ! is_array( $args ) ) {
+ throw ActionScheduler_InvalidActionException::from_decoding_args( $post->ID );
+ }
+
$schedule = get_post_meta( $post->ID, self::SCHEDULE_META_KEY, true );
if ( empty($schedule) ) {
$schedule = new ActionScheduler_NullSchedule();
@@ -410,18 +420,18 @@ class ActionScheduler_wpPostStore extends ActionScheduler_Store {
* @param string $action_id
*
* @throws InvalidArgumentException
- * @return DateTime The date the action is schedule to run, or the date that it ran.
+ * @return ActionScheduler_DateTime The date the action is schedule to run, or the date that it ran.
*/
public function get_date( $action_id ) {
- $date = $this->get_date_gmt( $action_id );
- return $date->setTimezone( $this->get_local_timezone() );
+ $next = $this->get_date_gmt( $action_id );
+ return ActionScheduler_TimezoneHelper::set_local_timezone( $next );
}
/**
* @param string $action_id
*
* @throws InvalidArgumentException
- * @return DateTime The date the action is schedule to run, or the date that it ran.
+ * @return ActionScheduler_DateTime The date the action is schedule to run, or the date that it ran.
*/
public function get_date_gmt( $action_id ) {
$post = get_post($action_id);
@@ -675,7 +685,7 @@ class ActionScheduler_wpPostStore extends ActionScheduler_Store {
$status = $this->get_post_column( $action_id, 'post_status' );
if ( $status === null ) {
- throw new \InvalidArgumentException( __( 'Invalid action ID. No status found.', 'action-scheduler' ) );
+ throw new InvalidArgumentException( __( 'Invalid action ID. No status found.', 'action-scheduler' ) );
}
return $this->get_action_status_by_post_status( $status );
@@ -716,6 +726,21 @@ class ActionScheduler_wpPostStore extends ActionScheduler_Store {
}
}
+ /**
+ * InnoDB indexes have a maximum size of 767 bytes by default, which is only 191 characters with utf8mb4.
+ *
+ * Previously, AS wasn't concerned about args length, as we used the (unindex) post_content column. However,
+ * as we prepare to move to custom tables, and can use an indexed VARCHAR column instead, we want to warn
+ * developers of this impending requirement.
+ *
+ * @param ActionScheduler_Action $action
+ */
+ protected function validate_action( ActionScheduler_Action $action ) {
+ if ( strlen( json_encode( $action->get_args() ) ) > self::$max_index_length ) {
+ _doing_it_wrong( 'ActionScheduler_Action::$args', sprintf( 'To ensure the action args column can be indexed, action args should not be more than %d characters when encoded as JSON. Support for strings longer than this will be removed in a future version.', self::$max_index_length ), '2.1.0' );
+ }
+ }
+
/**
* @codeCoverageIgnore
*/
diff --git a/includes/libraries/action-scheduler/composer.json b/includes/libraries/action-scheduler/composer.json
index fa07bc6a73d..b3ff1fe7ab7 100644
--- a/includes/libraries/action-scheduler/composer.json
+++ b/includes/libraries/action-scheduler/composer.json
@@ -1,12 +1,11 @@
{
"name": "prospress/action-scheduler",
- "version": "2.0.0",
"description": "Action Scheduler for WordPress and WooCommerce",
"type": "wordpress-plugin",
"license": "GPL-3.0",
"minimum-stability": "dev",
"require": {},
"require-dev": {
- "wp-cli/wp-cli": "^1.3"
+ "wp-cli/wp-cli": "2.1.0"
}
}
diff --git a/includes/libraries/action-scheduler/composer.lock b/includes/libraries/action-scheduler/composer.lock
index de44d8153ec..6f4b53581f8 100644
--- a/includes/libraries/action-scheduler/composer.lock
+++ b/includes/libraries/action-scheduler/composer.lock
@@ -1,10 +1,10 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
- "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "f4556531e7b95173d1b769b3d7350926",
+ "content-hash": "2a94d15afcb17b214630daa2d90e97fa",
"packages": [],
"packages-dev": [
{
@@ -13,12 +13,12 @@
"source": {
"type": "git",
"url": "https://github.com/composer/ca-bundle.git",
- "reference": "b17e6153cb7f33c7e44eb59578dc12eee5dc8e12"
+ "reference": "45501c64f5d1b6a9c53c9a9def19e141bcbf2260"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/ca-bundle/zipball/b17e6153cb7f33c7e44eb59578dc12eee5dc8e12",
- "reference": "b17e6153cb7f33c7e44eb59578dc12eee5dc8e12",
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/45501c64f5d1b6a9c53c9a9def19e141bcbf2260",
+ "reference": "45501c64f5d1b6a9c53c9a9def19e141bcbf2260",
"shasum": ""
},
"require": {
@@ -27,12 +27,9 @@
"php": "^5.3.2 || ^7.0"
},
"require-dev": {
- "phpunit/phpunit": "^4.5",
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5",
"psr/log": "^1.0",
- "symfony/process": "^2.5 || ^3.0"
- },
- "suggest": {
- "symfony/process": "This is necessary to reliably check whether openssl_x509_parse is vulnerable on older php versions, but can be ignored on PHP 5.5.6+"
+ "symfony/process": "^2.5 || ^3.0 || ^4.0"
},
"type": "library",
"extra": {
@@ -64,7 +61,7 @@
"ssl",
"tls"
],
- "time": "2017-03-06T11:59:08+00:00"
+ "time": "2018-10-31T14:14:03+00:00"
},
{
"name": "composer/composer",
@@ -149,12 +146,12 @@
"source": {
"type": "git",
"url": "https://github.com/composer/semver.git",
- "reference": "7ea669582e6396857cf6d1c0a6cd2728f4e7e383"
+ "reference": "2b303e43d14d15cc90c8e8db4a1cdb6259f1a5c5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/semver/zipball/7ea669582e6396857cf6d1c0a6cd2728f4e7e383",
- "reference": "7ea669582e6396857cf6d1c0a6cd2728f4e7e383",
+ "url": "https://api.github.com/repos/composer/semver/zipball/2b303e43d14d15cc90c8e8db4a1cdb6259f1a5c5",
+ "reference": "2b303e43d14d15cc90c8e8db4a1cdb6259f1a5c5",
"shasum": ""
},
"require": {
@@ -203,7 +200,7 @@
"validation",
"versioning"
],
- "time": "2017-05-15T12:49:06+00:00"
+ "time": "2017-11-06T09:05:54+00:00"
},
{
"name": "composer/spdx-licenses",
@@ -211,19 +208,19 @@
"source": {
"type": "git",
"url": "https://github.com/composer/spdx-licenses.git",
- "reference": "2603a0d7ddc00a015deb576fa5297ca43dee6b1c"
+ "reference": "5781a46078ca46330d05f46f90c42eaacba85749"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/2603a0d7ddc00a015deb576fa5297ca43dee6b1c",
- "reference": "2603a0d7ddc00a015deb576fa5297ca43dee6b1c",
+ "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/5781a46078ca46330d05f46f90c42eaacba85749",
+ "reference": "5781a46078ca46330d05f46f90c42eaacba85749",
"shasum": ""
},
"require": {
"php": "^5.3.2 || ^7.0"
},
"require-dev": {
- "phpunit/phpunit": "^4.5 || ^5.0.5",
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5",
"phpunit/phpunit-mock-objects": "2.3.0 || ^3.0"
},
"type": "library",
@@ -264,7 +261,7 @@
"spdx",
"validator"
],
- "time": "2017-04-03T19:08:52+00:00"
+ "time": "2018-12-26T21:53:59+00:00"
},
{
"name": "justinrainbow/json-schema",
@@ -272,12 +269,12 @@
"source": {
"type": "git",
"url": "https://github.com/justinrainbow/json-schema.git",
- "reference": "36ed4d935f8f5eb958dbd29e1fa5a241ec3ece4d"
+ "reference": "8560d4314577199ba51bf2032f02cd1315587c23"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/36ed4d935f8f5eb958dbd29e1fa5a241ec3ece4d",
- "reference": "36ed4d935f8f5eb958dbd29e1fa5a241ec3ece4d",
+ "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/8560d4314577199ba51bf2032f02cd1315587c23",
+ "reference": "8560d4314577199ba51bf2032f02cd1315587c23",
"shasum": ""
},
"require": {
@@ -286,7 +283,7 @@
"require-dev": {
"friendsofphp/php-cs-fixer": "^2.1",
"json-schema/json-schema-test-suite": "1.2.0",
- "phpunit/phpunit": "^4.8.22"
+ "phpunit/phpunit": "^4.8.35"
},
"bin": [
"bin/validate-json"
@@ -330,7 +327,7 @@
"json",
"schema"
],
- "time": "2017-06-23T11:43:36+00:00"
+ "time": "2018-02-14T22:26:30+00:00"
},
{
"name": "mustache/mustache",
@@ -425,12 +422,12 @@
"source": {
"type": "git",
"url": "https://github.com/php-fig/container.git",
- "reference": "2cc4a01788191489dc7459446ba832fa79a216a7"
+ "reference": "014d250daebff39eba15ba990eeb2a140798e77c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/container/zipball/2cc4a01788191489dc7459446ba832fa79a216a7",
- "reference": "2cc4a01788191489dc7459446ba832fa79a216a7",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/014d250daebff39eba15ba990eeb2a140798e77c",
+ "reference": "014d250daebff39eba15ba990eeb2a140798e77c",
"shasum": ""
},
"require": {
@@ -466,7 +463,7 @@
"container-interop",
"psr"
],
- "time": "2017-06-28T15:35:32+00:00"
+ "time": "2018-12-29T15:36:03+00:00"
},
{
"name": "psr/log",
@@ -558,6 +555,7 @@
"array_column",
"column"
],
+ "abandoned": true,
"time": "2015-03-20T22:07:39+00:00"
},
{
@@ -756,17 +754,18 @@
"source": {
"type": "git",
"url": "https://github.com/symfony/config.git",
- "reference": "d668d8c0502d2b485c00d107db65fdbc56c26282"
+ "reference": "17c5d8941eb75a03d19bc76a43757738632d87b3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/config/zipball/d668d8c0502d2b485c00d107db65fdbc56c26282",
- "reference": "d668d8c0502d2b485c00d107db65fdbc56c26282",
+ "url": "https://api.github.com/repos/symfony/config/zipball/17c5d8941eb75a03d19bc76a43757738632d87b3",
+ "reference": "17c5d8941eb75a03d19bc76a43757738632d87b3",
"shasum": ""
},
"require": {
"php": "^5.5.9|>=7.0.8",
- "symfony/filesystem": "~2.8|~3.0|~4.0"
+ "symfony/filesystem": "~2.8|~3.0|~4.0",
+ "symfony/polyfill-ctype": "~1.8"
},
"conflict": {
"symfony/dependency-injection": "<3.3",
@@ -774,6 +773,7 @@
},
"require-dev": {
"symfony/dependency-injection": "~3.3|~4.0",
+ "symfony/event-dispatcher": "~3.3|~4.0",
"symfony/finder": "~3.3|~4.0",
"symfony/yaml": "~3.0|~4.0"
},
@@ -810,7 +810,7 @@
],
"description": "Symfony Config Component",
"homepage": "https://symfony.com",
- "time": "2017-08-05T17:34:46+00:00"
+ "time": "2019-01-01T13:45:19+00:00"
},
{
"name": "symfony/console",
@@ -818,12 +818,12 @@
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "0e283478c2d68c9bf9cc52592ad1ef1834083a85"
+ "reference": "a700b874d3692bc8342199adfb6d3b99f62cc61a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/0e283478c2d68c9bf9cc52592ad1ef1834083a85",
- "reference": "0e283478c2d68c9bf9cc52592ad1ef1834083a85",
+ "url": "https://api.github.com/repos/symfony/console/zipball/a700b874d3692bc8342199adfb6d3b99f62cc61a",
+ "reference": "a700b874d3692bc8342199adfb6d3b99f62cc61a",
"shasum": ""
},
"require": {
@@ -832,20 +832,19 @@
"symfony/polyfill-mbstring": "~1.0"
},
"conflict": {
- "symfony/dependency-injection": "<3.3",
+ "symfony/dependency-injection": "<3.4",
"symfony/process": "<3.3"
},
"require-dev": {
"psr/log": "~1.0",
"symfony/config": "~3.3|~4.0",
- "symfony/dependency-injection": "~3.3|~4.0",
+ "symfony/dependency-injection": "~3.4|~4.0",
"symfony/event-dispatcher": "~2.8|~3.0|~4.0",
- "symfony/http-kernel": "~2.8|~3.0|~4.0",
"symfony/lock": "~3.4|~4.0",
"symfony/process": "~3.3|~4.0"
},
"suggest": {
- "psr/log": "For using the console logger",
+ "psr/log-implementation": "For using the console logger",
"symfony/event-dispatcher": "",
"symfony/lock": "",
"symfony/process": ""
@@ -880,7 +879,7 @@
],
"description": "Symfony Console Component",
"homepage": "https://symfony.com",
- "time": "2017-08-10T07:07:17+00:00"
+ "time": "2019-01-04T04:42:43+00:00"
},
{
"name": "symfony/debug",
@@ -888,12 +887,12 @@
"source": {
"type": "git",
"url": "https://github.com/symfony/debug.git",
- "reference": "50bda5b4b8641616d45254c6855bcd45f2f64187"
+ "reference": "26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/debug/zipball/50bda5b4b8641616d45254c6855bcd45f2f64187",
- "reference": "50bda5b4b8641616d45254c6855bcd45f2f64187",
+ "url": "https://api.github.com/repos/symfony/debug/zipball/26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186",
+ "reference": "26d7f23b9bd0b93bee5583e4d6ca5cb1ab31b186",
"shasum": ""
},
"require": {
@@ -936,7 +935,7 @@
],
"description": "Symfony Debug Component",
"homepage": "https://symfony.com",
- "time": "2017-08-10T07:07:17+00:00"
+ "time": "2019-01-01T13:45:19+00:00"
},
{
"name": "symfony/dependency-injection",
@@ -944,12 +943,12 @@
"source": {
"type": "git",
"url": "https://github.com/symfony/dependency-injection.git",
- "reference": "aaee88765cb21a838e8da26d6acda4ca2ae3a2ea"
+ "reference": "928a38b18bd632d67acbca74d0b2eed09915e83e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/aaee88765cb21a838e8da26d6acda4ca2ae3a2ea",
- "reference": "aaee88765cb21a838e8da26d6acda4ca2ae3a2ea",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/928a38b18bd632d67acbca74d0b2eed09915e83e",
+ "reference": "928a38b18bd632d67acbca74d0b2eed09915e83e",
"shasum": ""
},
"require": {
@@ -957,7 +956,7 @@
"psr/container": "^1.0"
},
"conflict": {
- "symfony/config": "<3.3.1",
+ "symfony/config": "<3.3.7",
"symfony/finder": "<3.3",
"symfony/proxy-manager-bridge": "<3.4",
"symfony/yaml": "<3.4"
@@ -1007,7 +1006,7 @@
],
"description": "Symfony DependencyInjection Component",
"homepage": "https://symfony.com",
- "time": "2017-08-10T19:43:00+00:00"
+ "time": "2019-01-05T12:26:58+00:00"
},
{
"name": "symfony/event-dispatcher",
@@ -1015,12 +1014,12 @@
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "cd8b015f859e6b60933324db00067c2f060b4d18"
+ "reference": "d1cdd46c53c264a2bd42505bd0e8ce21423bd0e2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/cd8b015f859e6b60933324db00067c2f060b4d18",
- "reference": "cd8b015f859e6b60933324db00067c2f060b4d18",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/d1cdd46c53c264a2bd42505bd0e8ce21423bd0e2",
+ "reference": "d1cdd46c53c264a2bd42505bd0e8ce21423bd0e2",
"shasum": ""
},
"require": {
@@ -1070,7 +1069,7 @@
],
"description": "Symfony EventDispatcher Component",
"homepage": "https://symfony.com",
- "time": "2017-08-03T09:34:20+00:00"
+ "time": "2019-01-01T18:08:36+00:00"
},
{
"name": "symfony/filesystem",
@@ -1078,16 +1077,17 @@
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
- "reference": "e4d366b620c8b6e2d4977c154f6a1d5b416db4dd"
+ "reference": "c24ce3d18ccc9bb9d7e1d6ce9330fcc6061cafde"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/e4d366b620c8b6e2d4977c154f6a1d5b416db4dd",
- "reference": "e4d366b620c8b6e2d4977c154f6a1d5b416db4dd",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/c24ce3d18ccc9bb9d7e1d6ce9330fcc6061cafde",
+ "reference": "c24ce3d18ccc9bb9d7e1d6ce9330fcc6061cafde",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8"
+ "php": "^5.5.9|>=7.0.8",
+ "symfony/polyfill-ctype": "~1.8"
},
"type": "library",
"extra": {
@@ -1119,7 +1119,7 @@
],
"description": "Symfony Filesystem Component",
"homepage": "https://symfony.com",
- "time": "2017-08-03T09:34:20+00:00"
+ "time": "2019-01-01T13:45:19+00:00"
},
{
"name": "symfony/finder",
@@ -1127,12 +1127,12 @@
"source": {
"type": "git",
"url": "https://github.com/symfony/finder.git",
- "reference": "bf0450cfe7282c5f06539c4733ba64273e91e918"
+ "reference": "3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/finder/zipball/bf0450cfe7282c5f06539c4733ba64273e91e918",
- "reference": "bf0450cfe7282c5f06539c4733ba64273e91e918",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e",
+ "reference": "3f2a2ab6315dd7682d4c16dcae1e7b95c8b8555e",
"shasum": ""
},
"require": {
@@ -1168,7 +1168,65 @@
],
"description": "Symfony Finder Component",
"homepage": "https://symfony.com",
- "time": "2017-08-03T09:34:20+00:00"
+ "time": "2019-01-01T13:45:19+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "e3d826245268269cd66f8326bd8bc066687b4a19"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19",
+ "reference": "e3d826245268269cd66f8326bd8bc066687b4a19",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ },
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "time": "2018-08-06T14:22:27+00:00"
},
{
"name": "symfony/polyfill-mbstring",
@@ -1235,12 +1293,12 @@
"source": {
"type": "git",
"url": "https://github.com/symfony/process.git",
- "reference": "9794f948d9af3be0157185051275d78b24d68b92"
+ "reference": "0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/9794f948d9af3be0157185051275d78b24d68b92",
- "reference": "9794f948d9af3be0157185051275d78b24d68b92",
+ "url": "https://api.github.com/repos/symfony/process/zipball/0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c",
+ "reference": "0d41dd7d95ed179aed6a13393b0f4f97bfa2d25c",
"shasum": ""
},
"require": {
@@ -1276,7 +1334,7 @@
],
"description": "Symfony Process Component",
"homepage": "https://symfony.com",
- "time": "2017-08-03T09:34:20+00:00"
+ "time": "2019-01-02T21:24:08+00:00"
},
{
"name": "symfony/translation",
@@ -1284,12 +1342,12 @@
"source": {
"type": "git",
"url": "https://github.com/symfony/translation.git",
- "reference": "62bb068e004874bbe39624101e1aae70ca7c05cd"
+ "reference": "5f357063f4907cef47e5cf82fa3187fbfb700456"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/translation/zipball/62bb068e004874bbe39624101e1aae70ca7c05cd",
- "reference": "62bb068e004874bbe39624101e1aae70ca7c05cd",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/5f357063f4907cef47e5cf82fa3187fbfb700456",
+ "reference": "5f357063f4907cef47e5cf82fa3187fbfb700456",
"shasum": ""
},
"require": {
@@ -1299,17 +1357,18 @@
"conflict": {
"symfony/config": "<2.8",
"symfony/dependency-injection": "<3.4",
- "symfony/yaml": "<3.3"
+ "symfony/yaml": "<3.4"
},
"require-dev": {
"psr/log": "~1.0",
"symfony/config": "~2.8|~3.0|~4.0",
"symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/finder": "~2.8|~3.0|~4.0",
"symfony/intl": "^2.8.18|^3.2.5|~4.0",
- "symfony/yaml": "~3.3|~4.0"
+ "symfony/yaml": "~3.4|~4.0"
},
"suggest": {
- "psr/log": "To use logging capability in translator",
+ "psr/log-implementation": "To use logging capability in translator",
"symfony/config": "",
"symfony/yaml": ""
},
@@ -1343,7 +1402,7 @@
],
"description": "Symfony Translation Component",
"homepage": "https://symfony.com",
- "time": "2017-08-03T12:04:31+00:00"
+ "time": "2019-01-01T13:45:19+00:00"
},
{
"name": "symfony/yaml",
@@ -1351,19 +1410,23 @@
"source": {
"type": "git",
"url": "https://github.com/symfony/yaml.git",
- "reference": "1395ddba6f65bf46cdf1d80d59223cbab8ff3ccc"
+ "reference": "554a59a1ccbaac238a89b19c8e551a556fd0e2ea"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/1395ddba6f65bf46cdf1d80d59223cbab8ff3ccc",
- "reference": "1395ddba6f65bf46cdf1d80d59223cbab8ff3ccc",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/554a59a1ccbaac238a89b19c8e551a556fd0e2ea",
+ "reference": "554a59a1ccbaac238a89b19c8e551a556fd0e2ea",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8"
+ "php": "^5.5.9|>=7.0.8",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "conflict": {
+ "symfony/console": "<3.4"
},
"require-dev": {
- "symfony/console": "~2.8|~3.0|~4.0"
+ "symfony/console": "~3.4|~4.0"
},
"suggest": {
"symfony/console": "For validating YAML files using the lint command"
@@ -1398,7 +1461,7 @@
],
"description": "Symfony Yaml Component",
"homepage": "https://symfony.com",
- "time": "2017-08-04T13:29:48+00:00"
+ "time": "2019-01-01T13:45:19+00:00"
},
{
"name": "wp-cli/autoload-splitter",
@@ -2802,101 +2865,66 @@
},
{
"name": "wp-cli/wp-cli",
- "version": "v1.3.0",
+ "version": "v2.1.0",
"source": {
"type": "git",
"url": "https://github.com/wp-cli/wp-cli.git",
- "reference": "4ab0d99da0ad5e6ca39453ff5c82d4f06aecb086"
+ "reference": "6dde820a8f6f183f4b6d751e5be1cd343974f333"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/4ab0d99da0ad5e6ca39453ff5c82d4f06aecb086",
- "reference": "4ab0d99da0ad5e6ca39453ff5c82d4f06aecb086",
+ "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/6dde820a8f6f183f4b6d751e5be1cd343974f333",
+ "reference": "6dde820a8f6f183f4b6d751e5be1cd343974f333",
"shasum": ""
},
"require": {
- "composer/composer": "^1.2.0",
- "composer/semver": "~1.0",
+ "ext-curl": "*",
+ "ext-readline": "*",
"mustache/mustache": "~2.4",
- "php": ">=5.3.29",
+ "php": ">=5.4",
"ramsey/array_column": "~1.1",
"rmccue/requests": "~1.6",
- "symfony/config": "^2.7|^3.0",
- "symfony/console": "^2.7|^3.0",
- "symfony/debug": "^2.7|^3.0",
- "symfony/dependency-injection": "^2.7|^3.0",
- "symfony/event-dispatcher": "^2.7|^3.0",
- "symfony/filesystem": "^2.7|^3.0",
- "symfony/finder": "^2.7|^3.0",
- "symfony/process": "^2.1|^3.0",
- "symfony/translation": "^2.7|^3.0",
- "symfony/yaml": "^2.7|^3.0",
- "wp-cli/autoload-splitter": "^0.1.5",
- "wp-cli/cache-command": "^1.0",
- "wp-cli/checksum-command": "^1.0",
- "wp-cli/config-command": "^1.0",
- "wp-cli/core-command": "^1.0",
- "wp-cli/cron-command": "^1.0",
- "wp-cli/db-command": "^1.0",
- "wp-cli/entity-command": "^1.0",
- "wp-cli/eval-command": "^1.0",
- "wp-cli/export-command": "^1.0",
- "wp-cli/extension-command": "^1.0",
- "wp-cli/import-command": "^1.0",
- "wp-cli/language-command": "^1.0",
- "wp-cli/media-command": "^1.0",
+ "symfony/finder": ">2.7",
"wp-cli/mustangostang-spyc": "^0.6.3",
- "wp-cli/package-command": "^1.0",
- "wp-cli/php-cli-tools": "~0.11.2",
- "wp-cli/rewrite-command": "^1.0",
- "wp-cli/role-command": "^1.0",
- "wp-cli/scaffold-command": "^1.0",
- "wp-cli/search-replace-command": "^1.0",
- "wp-cli/server-command": "^1.0",
- "wp-cli/shell-command": "^1.0",
- "wp-cli/super-admin-command": "^1.0",
- "wp-cli/widget-command": "^1.0"
+ "wp-cli/php-cli-tools": "~0.11.2"
},
"require-dev": {
- "behat/behat": "2.5.*",
- "phpunit/phpunit": "3.7.*",
- "roave/security-advisories": "dev-master"
+ "roave/security-advisories": "dev-master",
+ "wp-cli/db-command": "^1.3 || ^2",
+ "wp-cli/entity-command": "^1.2 || ^2",
+ "wp-cli/extension-command": "^1.1 || ^2",
+ "wp-cli/package-command": "^1 || ^2",
+ "wp-cli/wp-cli-tests": "^2.0.8"
},
"suggest": {
- "psy/psysh": "Enhanced `wp shell` functionality"
+ "ext-zip": "Needed to support extraction of ZIP archives when doing downloads or updates"
},
"bin": [
- "bin/wp.bat",
- "bin/wp"
+ "bin/wp",
+ "bin/wp.bat"
],
"type": "library",
"extra": {
- "autoload-splitter": {
- "splitter-logic": "WP_CLI\\AutoloadSplitter",
- "splitter-location": "php/WP_CLI/AutoloadSplitter.php",
- "split-target-prefix-true": "autoload_commands",
- "split-target-prefix-false": "autoload_framework"
+ "branch-alias": {
+ "dev-master": "2.1.x-dev"
}
},
"autoload": {
"psr-0": {
"WP_CLI": "php"
- },
- "psr-4": {
- "": "php/commands/src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
- "description": "A command line interface for WordPress",
- "homepage": "http://wp-cli.org",
+ "description": "WP-CLI framework",
+ "homepage": "https://wp-cli.org",
"keywords": [
"cli",
"wordpress"
],
- "time": "2017-08-08T14:28:58+00:00"
+ "time": "2018-12-18T17:37:51+00:00"
}
],
"aliases": [],
diff --git a/includes/libraries/action-scheduler/deprecated/functions.php b/includes/libraries/action-scheduler/deprecated/functions.php
new file mode 100644
index 00000000000..f782c4b7f07
--- /dev/null
+++ b/includes/libraries/action-scheduler/deprecated/functions.php
@@ -0,0 +1,126 @@
+ '' - the name of the action that will be triggered
+ * 'args' => NULL - the args array that will be passed with the action
+ * 'date' => NULL - the scheduled date of the action. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). Used in UTC timezone.
+ * 'date_compare' => '<=' - operator for testing "date". accepted values are '!=', '>', '>=', '<', '<=', '='
+ * 'modified' => NULL - the date the action was last updated. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). Used in UTC timezone.
+ * 'modified_compare' => '<=' - operator for testing "modified". accepted values are '!=', '>', '>=', '<', '<=', '='
+ * 'group' => '' - the group the action belongs to
+ * 'status' => '' - ActionScheduler_Store::STATUS_COMPLETE or ActionScheduler_Store::STATUS_PENDING
+ * 'claimed' => NULL - TRUE to find claimed actions, FALSE to find unclaimed actions, a string to find a specific claim ID
+ * 'per_page' => 5 - Number of results to return
+ * 'offset' => 0
+ * 'orderby' => 'date' - accepted values are 'hook', 'group', 'modified', or 'date'
+ * 'order' => 'ASC'
+ * @param string $return_format OBJECT, ARRAY_A, or ids
+ *
+ * @deprecated 2.1.0
+ *
+ * @return array
+ */
+function wc_get_scheduled_actions( $args = array(), $return_format = OBJECT ) {
+ _deprecated_function( __FUNCTION__, '2.1.0', 'as_get_scheduled_actions()' );
+ return as_get_scheduled_actions( $args, $return_format );
+}
diff --git a/includes/libraries/action-scheduler/functions.php b/includes/libraries/action-scheduler/functions.php
index 567ba6854b8..2f27d7e7e34 100644
--- a/includes/libraries/action-scheduler/functions.php
+++ b/includes/libraries/action-scheduler/functions.php
@@ -14,7 +14,7 @@
*
* @return string The job ID
*/
-function wc_schedule_single_action( $timestamp, $hook, $args = array(), $group = '' ) {
+function as_schedule_single_action( $timestamp, $hook, $args = array(), $group = '' ) {
return ActionScheduler::factory()->single( $hook, $args, $timestamp, $group );
}
@@ -29,7 +29,7 @@ function wc_schedule_single_action( $timestamp, $hook, $args = array(), $group =
*
* @return string The job ID
*/
-function wc_schedule_recurring_action( $timestamp, $interval_in_seconds, $hook, $args = array(), $group = '' ) {
+function as_schedule_recurring_action( $timestamp, $interval_in_seconds, $hook, $args = array(), $group = '' ) {
return ActionScheduler::factory()->recurring( $hook, $args, $timestamp, $interval_in_seconds, $group );
}
@@ -54,18 +54,27 @@ function wc_schedule_recurring_action( $timestamp, $interval_in_seconds, $hook,
*
* @return string The job ID
*/
-function wc_schedule_cron_action( $timestamp, $schedule, $hook, $args = array(), $group = '' ) {
+function as_schedule_cron_action( $timestamp, $schedule, $hook, $args = array(), $group = '' ) {
return ActionScheduler::factory()->cron( $hook, $args, $timestamp, $schedule, $group );
}
/**
- * Cancel the next occurrence of a job.
+ * Cancel the next occurrence of a scheduled action.
+ *
+ * While only the next instance of a recurring or cron action is unscheduled by this method, that will also prevent
+ * all future instances of that recurring or cron action from being run. Recurring and cron actions are scheduled in
+ * a sequence instead of all being scheduled at once. Each successive occurrence of a recurring action is scheduled
+ * only after the former action is run. If the next instance is never run, because it's unscheduled by this function,
+ * then the following instance will never be scheduled (or exist), which is effectively the same as being unscheduled
+ * by this method also.
*
* @param string $hook The hook that the job will trigger
* @param array $args Args that would have been passed to the job
* @param string $group
+ *
+ * @return string The scheduled action ID if a scheduled action was found, or empty string if no matching action found.
*/
-function wc_unschedule_action( $hook, $args = array(), $group = '' ) {
+function as_unschedule_action( $hook, $args = array(), $group = '' ) {
$params = array();
if ( is_array($args) ) {
$params['args'] = $args;
@@ -74,11 +83,25 @@ function wc_unschedule_action( $hook, $args = array(), $group = '' ) {
$params['group'] = $group;
}
$job_id = ActionScheduler::store()->find_action( $hook, $params );
- if ( empty($job_id) ) {
- return;
+
+ if ( ! empty( $job_id ) ) {
+ ActionScheduler::store()->cancel_action( $job_id );
}
- ActionScheduler::store()->cancel_action( $job_id );
+ return $job_id;
+}
+
+/**
+ * Cancel all occurrences of a scheduled action.
+ *
+ * @param string $hook The hook that the job will trigger
+ * @param array $args Args that would have been passed to the job
+ * @param string $group
+ */
+function as_unschedule_all_actions( $hook, $args = array(), $group = '' ) {
+ do {
+ $unscheduled_action = as_unschedule_action( $hook, $args, $group );
+ } while ( ! empty( $unscheduled_action ) );
}
/**
@@ -88,7 +111,7 @@ function wc_unschedule_action( $hook, $args = array(), $group = '' ) {
*
* @return int|bool The timestamp for the next occurrence, or false if nothing was found
*/
-function wc_next_scheduled_action( $hook, $args = NULL, $group = '' ) {
+function as_next_scheduled_action( $hook, $args = NULL, $group = '' ) {
$params = array();
if ( is_array($args) ) {
$params['args'] = $args;
@@ -130,7 +153,7 @@ function wc_next_scheduled_action( $hook, $args = NULL, $group = '' ) {
*
* @return array
*/
-function wc_get_scheduled_actions( $args = array(), $return_format = OBJECT ) {
+function as_get_scheduled_actions( $args = array(), $return_format = OBJECT ) {
$store = ActionScheduler::store();
foreach ( array('date', 'modified') as $key ) {
if ( isset($args[$key]) ) {
diff --git a/includes/libraries/action-scheduler/tests/phpunit/helpers/ActionScheduler_TimezoneHelper_Test.php b/includes/libraries/action-scheduler/tests/phpunit/helpers/ActionScheduler_TimezoneHelper_Test.php
new file mode 100644
index 00000000000..03d8195eb6d
--- /dev/null
+++ b/includes/libraries/action-scheduler/tests/phpunit/helpers/ActionScheduler_TimezoneHelper_Test.php
@@ -0,0 +1,100 @@
+getTimezone();
+ $this->assertInstanceOf( 'DateTimeZone', $timezone );
+ $this->assertEquals( $timezone_string, $timezone->getName() );
+
+ remove_filter( 'option_timezone_string', $timezone_filter );
+ }
+
+ public function local_timezone_provider() {
+ return array(
+ array( 'America/New_York' ),
+ array( 'Australia/Melbourne' ),
+ array( 'UTC' ),
+ );
+ }
+
+ /**
+ * Ensure that most GMT offsets don't return UTC as the timezone.
+ *
+ * @dataProvider local_timezone_offsets_provider
+ *
+ * @param $gmt_offset
+ */
+ public function test_local_timezone_offsets( $gmt_offset ) {
+ $gmt_filter = function ( $gmt ) use ( $gmt_offset ) {
+ return $gmt_offset;
+ };
+
+ $date = new ActionScheduler_DateTime();
+
+ add_filter( 'option_gmt_offset', $gmt_filter );
+ ActionScheduler_TimezoneHelper::set_local_timezone( $date );
+ remove_filter( 'option_gmt_offset', $gmt_filter );
+
+ $offset_in_seconds = $gmt_offset * HOUR_IN_SECONDS;
+
+ $this->assertEquals( $offset_in_seconds, $date->getOffset() );
+ $this->assertEquals( $offset_in_seconds, $date->getOffsetTimestamp() - $date->getTimestamp() );
+ }
+
+ public function local_timezone_offsets_provider() {
+ return array(
+ array( '-11' ),
+ array( '-10.5' ),
+ array( '-10' ),
+ array( '-9' ),
+ array( '-8' ),
+ array( '-7' ),
+ array( '-6' ),
+ array( '-5' ),
+ array( '-4.5' ),
+ array( '-4' ),
+ array( '-3.5' ),
+ array( '-3' ),
+ array( '-2' ),
+ array( '-1' ),
+ array( '1' ),
+ array( '1.5' ),
+ array( '2' ),
+ array( '3' ),
+ array( '4' ),
+ array( '5' ),
+ array( '5.5' ),
+ array( '5.75' ),
+ array( '6' ),
+ array( '7' ),
+ array( '8' ),
+ array( '8.5' ),
+ array( '9' ),
+ array( '9.5' ),
+ array( '10' ),
+ array( '10.5' ),
+ array( '11' ),
+ array( '11.5' ),
+ array( '12' ),
+ array( '13' ),
+ );
+ }
+}
diff --git a/includes/libraries/action-scheduler/tests/phpunit/jobstore/ActionScheduler_wpPostStore_Test.php b/includes/libraries/action-scheduler/tests/phpunit/jobstore/ActionScheduler_wpPostStore_Test.php
index d1fbed9294a..4cbd8485065 100644
--- a/includes/libraries/action-scheduler/tests/phpunit/jobstore/ActionScheduler_wpPostStore_Test.php
+++ b/includes/libraries/action-scheduler/tests/phpunit/jobstore/ActionScheduler_wpPostStore_Test.php
@@ -41,6 +41,29 @@ class ActionScheduler_wpPostStore_Test extends ActionScheduler_UnitTestCase {
$this->assertEquals($action->get_group(), $retrieved->get_group());
}
+ /**
+ * @expectedException ActionScheduler_InvalidActionException
+ * @dataProvider provide_bad_args
+ *
+ * @param string $content
+ */
+ public function test_action_bad_args( $content ) {
+ $store = new ActionScheduler_wpPostStore();
+ $post_id = wp_insert_post( array(
+ 'post_type' => ActionScheduler_wpPostStore::POST_TYPE,
+ 'post_status' => ActionScheduler_Store::STATUS_PENDING,
+ 'post_content' => $content,
+ ) );
+
+ $store->fetch_action( $post_id );
+ }
+
+ public function provide_bad_args() {
+ return array(
+ array( '{"bad_json":true}}' ),
+ );
+ }
+
public function test_cancel_action() {
$time = as_get_datetime_object();
$schedule = new ActionScheduler_SimpleSchedule($time);
diff --git a/includes/libraries/action-scheduler/tests/phpunit/logging/ActionScheduler_wpCommentLogger_Test.php b/includes/libraries/action-scheduler/tests/phpunit/logging/ActionScheduler_wpCommentLogger_Test.php
index dbffb346c3b..154b822a896 100644
--- a/includes/libraries/action-scheduler/tests/phpunit/logging/ActionScheduler_wpCommentLogger_Test.php
+++ b/includes/libraries/action-scheduler/tests/phpunit/logging/ActionScheduler_wpCommentLogger_Test.php
@@ -12,7 +12,7 @@ class ActionScheduler_wpCommentLogger_Test extends ActionScheduler_UnitTestCase
}
public function test_add_log_entry() {
- $action_id = wc_schedule_single_action( time(), 'a hook' );
+ $action_id = as_schedule_single_action( time(), 'a hook' );
$logger = ActionScheduler::logger();
$message = 'Logging that something happened';
$log_id = $logger->log( $action_id, $message );
@@ -22,6 +22,25 @@ class ActionScheduler_wpCommentLogger_Test extends ActionScheduler_UnitTestCase
$this->assertEquals( $message, $entry->get_message() );
}
+ public function test_add_log_datetime() {
+ $action_id = as_schedule_single_action( time(), 'a hook' );
+ $logger = ActionScheduler::logger();
+ $message = 'Logging that something happened';
+ $date = new DateTime( 'now', new DateTimeZone( 'UTC' ) );
+ $log_id = $logger->log( $action_id, $message, $date );
+ $entry = $logger->get_entry( $log_id );
+
+ $this->assertEquals( $action_id, $entry->get_action_id() );
+ $this->assertEquals( $message, $entry->get_message() );
+
+ $date = new ActionScheduler_DateTime( 'now', new DateTimeZone( 'UTC' ) );
+ $log_id = $logger->log( $action_id, $message, $date );
+ $entry = $logger->get_entry( $log_id );
+
+ $this->assertEquals( $action_id, $entry->get_action_id() );
+ $this->assertEquals( $message, $entry->get_message() );
+ }
+
public function test_null_log_entry() {
$logger = ActionScheduler::logger();
$entry = $logger->get_entry( 1 );
@@ -42,7 +61,7 @@ class ActionScheduler_wpCommentLogger_Test extends ActionScheduler_UnitTestCase
}
public function test_storage_comments() {
- $action_id = wc_schedule_single_action( time(), 'a hook' );
+ $action_id = as_schedule_single_action( time(), 'a hook' );
$logger = ActionScheduler::logger();
$logs = $logger->get_logs( $action_id );
$expected = new ActionScheduler_LogEntry( $action_id, 'action created' );
@@ -62,7 +81,7 @@ class ActionScheduler_wpCommentLogger_Test extends ActionScheduler_UnitTestCase
}
public function test_execution_comments() {
- $action_id = wc_schedule_single_action( time(), 'a hook' );
+ $action_id = as_schedule_single_action( time(), 'a hook' );
$logger = ActionScheduler::logger();
$started = new ActionScheduler_LogEntry( $action_id, 'action started' );
$finished = new ActionScheduler_LogEntry( $action_id, 'action complete' );
@@ -78,7 +97,7 @@ class ActionScheduler_wpCommentLogger_Test extends ActionScheduler_UnitTestCase
public function test_failed_execution_comments() {
$hook = md5(rand());
add_action( $hook, array( $this, '_a_hook_callback_that_throws_an_exception' ) );
- $action_id = wc_schedule_single_action( time(), $hook );
+ $action_id = as_schedule_single_action( time(), $hook );
$logger = ActionScheduler::logger();
$started = new ActionScheduler_LogEntry( $action_id, 'action started' );
$finished = new ActionScheduler_LogEntry( $action_id, 'action complete' );
@@ -95,7 +114,7 @@ class ActionScheduler_wpCommentLogger_Test extends ActionScheduler_UnitTestCase
public function test_fatal_error_comments() {
$hook = md5(rand());
- $action_id = wc_schedule_single_action( time(), $hook );
+ $action_id = as_schedule_single_action( time(), $hook );
$logger = ActionScheduler::logger();
do_action( 'action_scheduler_unexpected_shutdown', $action_id, array(
'type' => E_ERROR,
@@ -115,8 +134,8 @@ class ActionScheduler_wpCommentLogger_Test extends ActionScheduler_UnitTestCase
}
public function test_canceled_action_comments() {
- $action_id = wc_schedule_single_action( time(), 'a hook' );
- wc_unschedule_action( 'a hook' );
+ $action_id = as_schedule_single_action( time(), 'a hook' );
+ as_unschedule_action( 'a hook' );
$logger = ActionScheduler::logger();
$logs = $logger->get_logs( $action_id );
$expected = new ActionScheduler_LogEntry( $action_id, 'action canceled' );
@@ -143,7 +162,7 @@ class ActionScheduler_wpCommentLogger_Test extends ActionScheduler_UnitTestCase
$this->assertEquals( $comment_id, $comments[0]->comment_ID );
- $action_id = wc_schedule_single_action( time(), 'a hook' );
+ $action_id = as_schedule_single_action( time(), 'a hook' );
$logger = ActionScheduler::logger();
$message = 'Logging that something happened';
$log_id = $logger->log( $action_id, $message );
diff --git a/includes/libraries/action-scheduler/tests/phpunit/procedural_api/procedural_api_Test.php b/includes/libraries/action-scheduler/tests/phpunit/procedural_api/procedural_api_Test.php
index 1c178def444..543add798b1 100644
--- a/includes/libraries/action-scheduler/tests/phpunit/procedural_api/procedural_api_Test.php
+++ b/includes/libraries/action-scheduler/tests/phpunit/procedural_api/procedural_api_Test.php
@@ -8,7 +8,7 @@ class procedural_api_Test extends ActionScheduler_UnitTestCase {
public function test_schedule_action() {
$time = time();
$hook = md5(rand());
- $action_id = wc_schedule_single_action( $time, $hook );
+ $action_id = as_schedule_single_action( $time, $hook );
$store = ActionScheduler::store();
$action = $store->fetch_action($action_id);
@@ -19,7 +19,7 @@ class procedural_api_Test extends ActionScheduler_UnitTestCase {
public function test_recurring_action() {
$time = time();
$hook = md5(rand());
- $action_id = wc_schedule_recurring_action( $time, HOUR_IN_SECONDS, $hook );
+ $action_id = as_schedule_recurring_action( $time, HOUR_IN_SECONDS, $hook );
$store = ActionScheduler::store();
$action = $store->fetch_action($action_id);
@@ -31,7 +31,7 @@ class procedural_api_Test extends ActionScheduler_UnitTestCase {
public function test_cron_schedule() {
$time = as_get_datetime_object('2014-01-01');
$hook = md5(rand());
- $action_id = wc_schedule_cron_action( $time->getTimestamp(), '0 0 10 10 *', $hook );
+ $action_id = as_schedule_cron_action( $time->getTimestamp(), '0 0 10 10 *', $hook );
$store = ActionScheduler::store();
$action = $store->fetch_action($action_id);
@@ -43,28 +43,108 @@ class procedural_api_Test extends ActionScheduler_UnitTestCase {
public function test_get_next() {
$time = as_get_datetime_object('tomorrow');
$hook = md5(rand());
- wc_schedule_recurring_action( $time->getTimestamp(), HOUR_IN_SECONDS, $hook );
+ as_schedule_recurring_action( $time->getTimestamp(), HOUR_IN_SECONDS, $hook );
- $next = wc_next_scheduled_action( $hook );
+ $next = as_next_scheduled_action( $hook );
$this->assertEquals( $time->getTimestamp(), $next );
}
- public function test_unschedule() {
- $time = time();
- $hook = md5(rand());
- $action_id = wc_schedule_single_action( $time, $hook );
+ public function provider_time_hook_args_group() {
+ $time = time() + 60 * 2;
+ $hook = md5( rand() );
+ $args = array( rand(), rand() );
+ $group = 'test_group';
- wc_unschedule_action( $hook );
+ return array(
- $next = wc_next_scheduled_action( $hook );
+ // Test with no args or group
+ array(
+ 'time' => $time,
+ 'hook' => $hook,
+ 'args' => array(),
+ 'group' => '',
+ ),
+
+ // Test with args but no group
+ array(
+ 'time' => $time,
+ 'hook' => $hook,
+ 'args' => $args,
+ 'group' => '',
+ ),
+
+ // Test with group but no args
+ array(
+ 'time' => $time,
+ 'hook' => $hook,
+ 'args' => array(),
+ 'group' => $group,
+ ),
+
+ // Test with args & group
+ array(
+ 'time' => $time,
+ 'hook' => $hook,
+ 'args' => $args,
+ 'group' => $group,
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider provider_time_hook_args_group
+ */
+ public function test_unschedule( $time, $hook, $args, $group ) {
+
+ $action_id_unscheduled = as_schedule_single_action( $time, $hook, $args, $group );
+ $action_scheduled_time = $time + 1;
+ $action_id_scheduled = as_schedule_single_action( $action_scheduled_time, $hook, $args, $group );
+
+ as_unschedule_action( $hook, $args, $group );
+
+ $next = as_next_scheduled_action( $hook, $args, $group );
+ $this->assertEquals( $action_scheduled_time, $next );
+
+ $store = ActionScheduler::store();
+ $unscheduled_action = $store->fetch_action( $action_id_unscheduled );
+
+ // Make sure the next scheduled action is unscheduled
+ $this->assertEquals( $hook, $unscheduled_action->get_hook() );
+ $this->assertNull( $unscheduled_action->get_schedule()->next() );
+
+ // Make sure other scheduled actions are not unscheduled
+ $scheduled_action = $store->fetch_action( $action_id_scheduled );
+
+ $this->assertEquals( $hook, $scheduled_action->get_hook() );
+ $this->assertEquals( $action_scheduled_time, $scheduled_action->get_schedule()->next()->getTimestamp() );
+ }
+
+ /**
+ * @dataProvider provider_time_hook_args_group
+ */
+ public function test_unschedule_all( $time, $hook, $args, $group ) {
+
+ $hook = md5( $hook );
+ $action_ids = array();
+
+ for ( $i = 0; $i < 3; $i++ ) {
+ $action_ids[] = as_schedule_single_action( $time, $hook, $args, $group );
+ }
+
+ as_unschedule_all_actions( $hook, $args, $group );
+
+ $next = as_next_scheduled_action( $hook );
$this->assertFalse($next);
$store = ActionScheduler::store();
- $action = $store->fetch_action($action_id);
- $this->assertNull($action->get_schedule()->next());
- $this->assertEquals($hook, $action->get_hook() );
+ foreach ( $action_ids as $action_id ) {
+ $action = $store->fetch_action($action_id);
+
+ $this->assertNull($action->get_schedule()->next());
+ $this->assertEquals($hook, $action->get_hook() );
+ }
}
public function test_as_get_datetime_object_default() {
diff --git a/includes/libraries/action-scheduler/tests/phpunit/procedural_api/wc_get_scheduled_actions_Test.php b/includes/libraries/action-scheduler/tests/phpunit/procedural_api/wc_get_scheduled_actions_Test.php
index ee2bbfba157..af839d9195a 100644
--- a/includes/libraries/action-scheduler/tests/phpunit/procedural_api/wc_get_scheduled_actions_Test.php
+++ b/includes/libraries/action-scheduler/tests/phpunit/procedural_api/wc_get_scheduled_actions_Test.php
@@ -1,9 +1,9 @@
as_get_datetime_object(gmdate('Y-m-d 00:00:00')),
'per_page' => -1,
), 'ids');
$this->assertCount(30, $actions);
- $actions = wc_get_scheduled_actions(array(
+ $actions = as_get_scheduled_actions(array(
'date' => as_get_datetime_object(gmdate('Y-m-d 00:00:00')),
'date_compare' => '>=',
'per_page' => -1,
@@ -45,13 +45,13 @@ class wc_get_scheduled_actions_Test extends ActionScheduler_UnitTestCase {
}
public function test_hook_queries() {
- $actions = wc_get_scheduled_actions(array(
+ $actions = as_get_scheduled_actions(array(
'hook' => $this->hooks[2],
'per_page' => -1,
), 'ids');
$this->assertCount(10, $actions);
- $actions = wc_get_scheduled_actions(array(
+ $actions = as_get_scheduled_actions(array(
'hook' => $this->hooks[2],
'date' => as_get_datetime_object(gmdate('Y-m-d 00:00:00')),
'per_page' => -1,
@@ -60,20 +60,20 @@ class wc_get_scheduled_actions_Test extends ActionScheduler_UnitTestCase {
}
public function test_args_queries() {
- $actions = wc_get_scheduled_actions(array(
+ $actions = as_get_scheduled_actions(array(
'args' => array($this->args[5]),
'per_page' => -1,
), 'ids');
$this->assertCount(10, $actions);
- $actions = wc_get_scheduled_actions(array(
+ $actions = as_get_scheduled_actions(array(
'args' => array($this->args[5]),
'hook' => $this->hooks[3],
'per_page' => -1,
), 'ids');
$this->assertCount(1, $actions);
- $actions = wc_get_scheduled_actions(array(
+ $actions = as_get_scheduled_actions(array(
'args' => array($this->args[5]),
'hook' => $this->hooks[3],
'date' => as_get_datetime_object(gmdate('Y-m-d 00:00:00')),
@@ -83,13 +83,13 @@ class wc_get_scheduled_actions_Test extends ActionScheduler_UnitTestCase {
}
public function test_group_queries() {
- $actions = wc_get_scheduled_actions(array(
+ $actions = as_get_scheduled_actions(array(
'group' => $this->groups[1],
'per_page' => -1,
), 'ids');
$this->assertCount(10, $actions);
- $actions = wc_get_scheduled_actions(array(
+ $actions = as_get_scheduled_actions(array(
'group' => $this->groups[1],
'hook' => $this->hooks[9],
'per_page' => -1,
diff --git a/includes/libraries/class-emogrifier.php b/includes/libraries/class-emogrifier.php
index 12d6c82722a..8518c4bf43e 100644
--- a/includes/libraries/class-emogrifier.php
+++ b/includes/libraries/class-emogrifier.php
@@ -162,15 +162,15 @@ class Emogrifier
// type and attribute exact value
'/(\\w)\\[(\\w+)\\=[\'"]?([\\w\\s]+)[\'"]?\\]/' => '\\1[@\\2="\\3"]',
// type and attribute value with ~ (one word within a whitespace-separated list of words)
- '/([\\w\\*]+)\\[(\\w+)[\\s]*\\~\\=[\\s]*[\'"]?([\\w-_\\/]+)[\'"]?\\]/'
+ '/([\\w\\*]+)\\[(\\w+)[\\s]*\\~\\=[\\s]*[\'"]?([\\w\\-_\\/]+)[\'"]?\\]/'
=> '\\1[contains(concat(" ", @\\2, " "), concat(" ", "\\3", " "))]',
// type and attribute value with | (either exact value match or prefix followed by a hyphen)
- '/([\\w\\*]+)\\[(\\w+)[\\s]*\\|\\=[\\s]*[\'"]?([\\w-_\\s\\/]+)[\'"]?\\]/'
+ '/([\\w\\*]+)\\[(\\w+)[\\s]*\\|\\=[\\s]*[\'"]?([\\w\\-_\\s\\/]+)[\'"]?\\]/'
=> '\\1[@\\2="\\3" or starts-with(@\\2, concat("\\3", "-"))]',
// type and attribute value with ^ (prefix match)
- '/([\\w\\*]+)\\[(\\w+)[\\s]*\\^\\=[\\s]*[\'"]?([\\w-_\\/]+)[\'"]?\\]/' => '\\1[starts-with(@\\2, "\\3")]',
+ '/([\\w\\*]+)\\[(\\w+)[\\s]*\\^\\=[\\s]*[\'"]?([\\w\\-_\\/]+)[\'"]?\\]/' => '\\1[starts-with(@\\2, "\\3")]',
// type and attribute value with * (substring match)
- '/([\\w\\*]+)\\[(\\w+)[\\s]*\\*\\=[\\s]*[\'"]?([\\w-_\\s\\/:;]+)[\'"]?\\]/' => '\\1[contains(@\\2, "\\3")]',
+ '/([\\w\\*]+)\\[(\\w+)[\\s]*\\*\\=[\\s]*[\'"]?([\\w\\-_\\s\\/:;]+)[\'"]?\\]/' => '\\1[contains(@\\2, "\\3")]',
// adjacent sibling
'/\\s+\\+\\s+/' => '/following-sibling::*[1]/self::',
// child
@@ -185,7 +185,7 @@ class Emogrifier
// The following matcher will break things if it is placed before the adjacent matcher.
// So one of the matchers matches either too much or not enough.
// type and attribute value with $ (suffix match)
- '/([\\w\\*]+)\\[(\\w+)[\\s]*\\$\\=[\\s]*[\'"]?([\\w-_\\s\\/]+)[\'"]?\\]/'
+ '/([\\w\\*]+)\\[(\\w+)[\\s]*\\$\\=[\\s]*[\'"]?([\\w\\-_\\s\\/]+)[\'"]?\\]/'
=> '\\1[substring(@\\2, string-length(@\\2) - string-length("\\3") + 1) = "\\3"]',
];
diff --git a/includes/libraries/wp-background-process.php b/includes/libraries/wp-background-process.php
index 53d701ed66a..d21faf6df23 100644
--- a/includes/libraries/wp-background-process.php
+++ b/includes/libraries/wp-background-process.php
@@ -414,7 +414,7 @@ abstract class WP_Background_Process extends WP_Async_Request {
$interval = apply_filters( $this->identifier . '_cron_interval', 5 );
if ( property_exists( $this, 'cron_interval' ) ) {
- $interval = apply_filters( $this->identifier . '_cron_interval', $this->cron_interval_identifier );
+ $interval = apply_filters( $this->identifier . '_cron_interval', $this->cron_interval );
}
// Adds every 5 minutes to the existing schedules.
diff --git a/includes/log-handlers/class-wc-log-handler-db.php b/includes/log-handlers/class-wc-log-handler-db.php
index e654eb92b80..9991dfafd48 100644
--- a/includes/log-handlers/class-wc-log-handler-db.php
+++ b/includes/log-handlers/class-wc-log-handler-db.php
@@ -124,11 +124,9 @@ class WC_Log_Handler_DB extends WC_Log_Handler {
$log_ids = array( $log_ids );
}
- $format = array_fill( 0, count( $log_ids ), '%d' );
-
+ $format = array_fill( 0, count( $log_ids ), '%d' );
$query_in = '(' . implode( ',', $format ) . ')';
-
- return $wpdb->query( "DELETE FROM {$wpdb->prefix}woocommerce_log WHERE log_id IN {$query_in}" ); // @codingStandardsIgnoreLine.
+ return $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}woocommerce_log WHERE log_id IN {$query_in}", $log_ids ) ); // @codingStandardsIgnoreLine.
}
/**
@@ -146,8 +144,8 @@ class WC_Log_Handler_DB extends WC_Log_Handler {
$wpdb->query(
$wpdb->prepare(
- "DELETE FROM {$wpdb->prefix}woocommerce_log WHERE timestamp < %d",
- $timestamp
+ "DELETE FROM {$wpdb->prefix}woocommerce_log WHERE timestamp < %s",
+ date( 'Y-m-d H:i:s', $timestamp )
)
);
}
@@ -168,7 +166,7 @@ class WC_Log_Handler_DB extends WC_Log_Handler {
* @see http://php.net/manual/en/function.debug-backtrace.php#refsect1-function.debug-backtrace-parameters
*/
if ( defined( 'DEBUG_BACKTRACE_IGNORE_ARGS' ) ) {
- $debug_backtrace_arg = DEBUG_BACKTRACE_IGNORE_ARGS; // phpcs:ignore PHPCompatibility.PHP.NewConstants.debug_backtrace_ignore_argsFound
+ $debug_backtrace_arg = DEBUG_BACKTRACE_IGNORE_ARGS; // phpcs:ignore PHPCompatibility.Constants.NewConstants.debug_backtrace_ignore_argsFound
} else {
$debug_backtrace_arg = false;
}
diff --git a/includes/log-handlers/class-wc-log-handler-file.php b/includes/log-handlers/class-wc-log-handler-file.php
index 0b233ef4a92..85514dbbfd9 100644
--- a/includes/log-handlers/class-wc-log-handler-file.php
+++ b/includes/log-handlers/class-wc-log-handler-file.php
@@ -248,9 +248,12 @@ class WC_Log_Handler_File extends WC_Log_Handler {
*/
public function remove( $handle ) {
$removed = false;
- $file = trailingslashit( WC_LOG_DIR ) . $handle;
- if ( $file ) {
- if ( is_file( $file ) && is_writable( $file ) ) { // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_is_writable
+ $logs = $this->get_log_files();
+ $handle = sanitize_title( $handle );
+
+ if ( isset( $logs[ $handle ] ) && $logs[ $handle ] ) {
+ $file = realpath( trailingslashit( WC_LOG_DIR ) . $logs[ $handle ] );
+ if ( 0 === stripos( $file, trailingslashit( WC_LOG_DIR ) ) && is_file( $file ) && is_writable( $file ) ) { // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_is_writable
$this->close( $file ); // Close first to be certain no processes keep it alive after it is unlinked.
$removed = unlink( $file ); // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_unlink
}
diff --git a/includes/queue/class-wc-action-queue.php b/includes/queue/class-wc-action-queue.php
index 7dc141c83c6..f0e3445f42e 100644
--- a/includes/queue/class-wc-action-queue.php
+++ b/includes/queue/class-wc-action-queue.php
@@ -41,7 +41,7 @@ class WC_Action_Queue implements WC_Queue_Interface {
* @return string The action ID.
*/
public function schedule_single( $timestamp, $hook, $args = array(), $group = '' ) {
- return wc_schedule_single_action( $timestamp, $hook, $args, $group );
+ return as_schedule_single_action( $timestamp, $hook, $args, $group );
}
/**
@@ -55,7 +55,7 @@ class WC_Action_Queue implements WC_Queue_Interface {
* @return string The action ID.
*/
public function schedule_recurring( $timestamp, $interval_in_seconds, $hook, $args = array(), $group = '' ) {
- return wc_schedule_recurring_action( $timestamp, $interval_in_seconds, $hook, $args, $group );
+ return as_schedule_recurring_action( $timestamp, $interval_in_seconds, $hook, $args, $group );
}
/**
@@ -79,41 +79,55 @@ class WC_Action_Queue implements WC_Queue_Interface {
* @return string The action ID
*/
public function schedule_cron( $timestamp, $cron_schedule, $hook, $args = array(), $group = '' ) {
- return wc_schedule_cron_action( $timestamp, $cron_schedule, $hook, $args, $group );
+ return as_schedule_cron_action( $timestamp, $cron_schedule, $hook, $args, $group );
}
/**
- * Dequeue all actions with a matching hook (and optionally matching args and group) so they are not run.
+ * Dequeue the next scheduled instance of an action with a matching hook (and optionally matching args and group).
*
- * Any recurring actions with a matching hook will also be cancelled, not just the next scheduled action.
+ * Any recurring actions with a matching hook should also be cancelled, not just the next scheduled action.
*
- * Technically, one action in a recurring or Cron action is scheduled at any one point in time. The next
- * in the sequence is scheduled after the previous one is run, so only the next scheduled action needs to
- * be cancelled/dequeued to stop the sequence.
+ * While technically only the next instance of a recurring or cron action is unscheduled by this method, that will also
+ * prevent all future instances of that recurring or cron action from being run. Recurring and cron actions are scheduled
+ * in a sequence instead of all being scheduled at once. Each successive occurrence of a recurring action is scheduled
+ * only after the former action is run. As the next instance is never run, because it's unscheduled by this function,
+ * then the following instance will never be scheduled (or exist), which is effectively the same as being unscheduled
+ * by this method also.
*
* @param string $hook The hook that the job will trigger.
* @param array $args Args that would have been passed to the job.
- * @param string $group Group name.
+ * @param string $group The group the job is assigned to (if any).
*/
public function cancel( $hook, $args = array(), $group = '' ) {
- wc_unschedule_action( $hook, $args, $group );
+ as_unschedule_action( $hook, $args, $group );
+ }
+
+ /**
+ * Dequeue all actions with a matching hook (and optionally matching args and group) so no matching actions are ever run.
+ *
+ * @param string $hook The hook that the job will trigger.
+ * @param array $args Args that would have been passed to the job.
+ * @param string $group The group the job is assigned to (if any).
+ */
+ public function cancel_all( $hook, $args = array(), $group = '' ) {
+ as_unschedule_all_actions( $hook, $args, $group );
}
/**
* Get the date and time for the next scheduled occurence of an action with a given hook
* (an optionally that matches certain args and group), if any.
*
- * @param string $hook Hook name.
- * @param array $args Arguments.
- * @param string $group Group name.
+ * @param string $hook The hook that the job will trigger.
+ * @param array $args Filter to a hook with matching args that will be passed to the job when it runs.
+ * @param string $group Filter to only actions assigned to a specific group.
* @return WC_DateTime|null The date and time for the next occurrence, or null if there is no pending, scheduled action for the given hook.
*/
public function get_next( $hook, $args = null, $group = '' ) {
- $next_timestamp = wc_next_scheduled_action( $hook, $args, $group );
+ $next_timestamp = as_next_scheduled_action( $hook, $args, $group );
if ( $next_timestamp ) {
- return wc_string_to_datetime( $next_timestamp );
+ return new WC_DateTime( "@{$next_timestamp}", new DateTimeZone( 'UTC' ) );
}
return null;
@@ -141,6 +155,6 @@ class WC_Action_Queue implements WC_Queue_Interface {
* @return array
*/
public function search( $args = array(), $return_format = OBJECT ) {
- return wc_get_scheduled_actions( $args, $return_format );
+ return as_get_scheduled_actions( $args, $return_format );
}
}
diff --git a/includes/shipping/flat-rate/class-wc-shipping-flat-rate.php b/includes/shipping/flat-rate/class-wc-shipping-flat-rate.php
index 070253b1466..d8ea696e628 100644
--- a/includes/shipping/flat-rate/class-wc-shipping-flat-rate.php
+++ b/includes/shipping/flat-rate/class-wc-shipping-flat-rate.php
@@ -159,7 +159,7 @@ class WC_Shipping_Flat_Rate extends WC_Shipping_Method {
}
// Add shipping class costs.
- $shipping_classes = WC()->shipping->get_shipping_classes();
+ $shipping_classes = WC()->shipping()->get_shipping_classes();
if ( ! empty( $shipping_classes ) ) {
$found_shipping_classes = $this->find_shipping_classes( $package );
diff --git a/includes/shipping/flat-rate/includes/settings-flat-rate.php b/includes/shipping/flat-rate/includes/settings-flat-rate.php
index 8e53c331f53..803c961aa76 100644
--- a/includes/shipping/flat-rate/includes/settings-flat-rate.php
+++ b/includes/shipping/flat-rate/includes/settings-flat-rate.php
@@ -38,7 +38,7 @@ $settings = array(
),
);
-$shipping_classes = WC()->shipping->get_shipping_classes();
+$shipping_classes = WC()->shipping()->get_shipping_classes();
if ( ! empty( $shipping_classes ) ) {
$settings['class_costs'] = array(
diff --git a/includes/shipping/legacy-flat-rate/includes/settings-flat-rate.php b/includes/shipping/legacy-flat-rate/includes/settings-flat-rate.php
index 71dc5f5248f..de0fd0b5a36 100644
--- a/includes/shipping/legacy-flat-rate/includes/settings-flat-rate.php
+++ b/includes/shipping/legacy-flat-rate/includes/settings-flat-rate.php
@@ -69,7 +69,7 @@ $settings = array(
),
);
-$shipping_classes = WC()->shipping->get_shipping_classes();
+$shipping_classes = WC()->shipping()->get_shipping_classes();
if ( ! empty( $shipping_classes ) ) {
$settings['class_costs'] = array(
diff --git a/includes/shortcodes/class-wc-shortcode-cart.php b/includes/shortcodes/class-wc-shortcode-cart.php
index 047219f87c7..a42527206d2 100644
--- a/includes/shortcodes/class-wc-shortcode-cart.php
+++ b/includes/shortcodes/class-wc-shortcode-cart.php
@@ -22,7 +22,7 @@ class WC_Shortcode_Cart {
*/
public static function calculate_shipping() {
try {
- WC()->shipping->reset_shipping();
+ WC()->shipping()->reset_shipping();
$address = array();
diff --git a/includes/shortcodes/class-wc-shortcode-checkout.php b/includes/shortcodes/class-wc-shortcode-checkout.php
index 7305eb6f1dd..bea67a36be0 100644
--- a/includes/shortcodes/class-wc-shortcode-checkout.php
+++ b/includes/shortcodes/class-wc-shortcode-checkout.php
@@ -84,8 +84,9 @@ class WC_Shortcode_Checkout {
// Pay for existing order.
if ( isset( $_GET['pay_for_order'], $_GET['key'] ) && $order_id ) { // WPCS: input var ok, CSRF ok.
try {
- $order_key = isset( $_GET['key'] ) ? wc_clean( wp_unslash( $_GET['key'] ) ) : ''; // WPCS: input var ok, CSRF ok.
- $order = wc_get_order( $order_id );
+ $order_key = isset( $_GET['key'] ) ? wc_clean( wp_unslash( $_GET['key'] ) ) : ''; // WPCS: input var ok, CSRF ok.
+ $order = wc_get_order( $order_id );
+ $hold_stock_minutes = (int) get_option( 'woocommerce_hold_stock_minutes', 0 );
// Order or payment link is invalid.
if ( ! $order || $order->get_id() !== $order_id || $order->get_order_key() !== $order_key ) {
@@ -143,8 +144,13 @@ class WC_Shortcode_Checkout {
throw new Exception( sprintf( __( 'Sorry, "%s" is no longer in stock so this order cannot be paid for. We apologize for any inconvenience caused.', 'woocommerce' ), $product->get_name() ) );
}
+ // We only need to check products managing stock, with a limited stock qty.
+ if ( ! $product->managing_stock() || $product->backorders_allowed() ) {
+ continue;
+ }
+
// Check stock based on all items in the cart and consider any held stock within pending orders.
- $held_stock = wc_get_held_stock_quantity( $product, $order->get_id() );
+ $held_stock = ( $hold_stock_minutes > 0 ) ? wc_get_held_stock_quantity( $product, $order->get_id() ) : 0;
$required_stock = $quantities[ $product->get_stock_managed_by_id() ];
if ( $product->get_stock_quantity() < ( $held_stock + $required_stock ) ) {
@@ -171,7 +177,8 @@ class WC_Shortcode_Checkout {
}
wc_get_template(
- 'checkout/form-pay.php', array(
+ 'checkout/form-pay.php',
+ array(
'order' => $order,
'available_gateways' => $available_gateways,
'order_button_text' => apply_filters( 'woocommerce_pay_order_button_text', __( 'Pay for order', 'woocommerce' ) ),
@@ -245,6 +252,9 @@ class WC_Shortcode_Checkout {
* Show the checkout.
*/
private static function checkout() {
+ // Show non-cart errors.
+ do_action( 'woocommerce_before_checkout_form_cart_notices' );
+
// Check cart has contents.
if ( WC()->cart->is_empty() && ! is_customize_preview() && apply_filters( 'woocommerce_checkout_redirect_empty_cart', true ) ) {
return;
diff --git a/includes/shortcodes/class-wc-shortcode-products.php b/includes/shortcodes/class-wc-shortcode-products.php
index 72de10afaaa..b4545504a45 100644
--- a/includes/shortcodes/class-wc-shortcode-products.php
+++ b/includes/shortcodes/class-wc-shortcode-products.php
@@ -287,8 +287,15 @@ class WC_Shortcode_Products {
$field = 'slug';
if ( $terms && is_numeric( $terms[0] ) ) {
- $terms = array_map( 'absint', $terms );
$field = 'term_id';
+ $terms = array_map( 'absint', $terms );
+ // Check numeric slugs.
+ foreach ( $terms as $term ) {
+ $the_term = get_term_by( 'slug', $term, $taxonomy );
+ if ( false !== $the_term ) {
+ $terms[] = $the_term->term_id;
+ }
+ }
}
// If no terms were specified get all products that are in the attribute taxonomy.
@@ -302,6 +309,7 @@ class WC_Shortcode_Products {
$field = 'term_id';
}
+ // We always need to search based on the slug as well, this is to accommodate numeric slugs.
$query_args['tax_query'][] = array(
'taxonomy' => $taxonomy,
'terms' => $terms,
@@ -323,8 +331,15 @@ class WC_Shortcode_Products {
$field = 'slug';
if ( is_numeric( $categories[0] ) ) {
+ $field = 'term_id';
$categories = array_map( 'absint', $categories );
- $field = 'term_id';
+ // Check numeric slugs.
+ foreach ( $categories as $cat ) {
+ $the_cat = get_term_by( 'slug', $cat, 'product_cat' );
+ if ( false !== $the_cat ) {
+ $categories[] = $the_cat->term_id;
+ }
+ }
}
$query_args['tax_query'][] = array(
diff --git a/includes/theme-support/class-wc-twenty-nineteen.php b/includes/theme-support/class-wc-twenty-nineteen.php
new file mode 100644
index 00000000000..1f99a18602b
--- /dev/null
+++ b/includes/theme-support/class-wc-twenty-nineteen.php
@@ -0,0 +1,127 @@
+ 300,
+ 'single_image_width' => 450,
+ ) );
+
+ // Tweak Twenty Nineteen features.
+ add_action( 'wp', array( __CLASS__, 'tweak_theme_features' ) );
+
+ // Color scheme CSS
+ add_filter( 'twentynineteen_custom_colors_css', array( __CLASS__, 'custom_colors_css' ), 10, 3 );
+ }
+
+ /**
+ * Open the Twenty Nineteen wrapper.
+ */
+ public static function output_content_wrapper() {
+ echo '';
+ echo '';
+ }
+
+ /**
+ * Close the Twenty Nineteen wrapper.
+ */
+ public static function output_content_wrapper_end() {
+ echo ' ';
+ echo ' ';
+ }
+
+ /**
+ * Enqueue CSS for this theme.
+ *
+ * @param array $styles Array of registered styles.
+ * @return array
+ */
+ public static function enqueue_styles( $styles ) {
+ unset( $styles['woocommerce-general'] );
+
+ $styles['woocommerce-general'] = array(
+ 'src' => str_replace( array( 'http:', 'https:' ), '', WC()->plugin_url() ) . '/assets/css/twenty-nineteen.css',
+ 'deps' => '',
+ 'version' => WC_VERSION,
+ 'media' => 'all',
+ 'has_rtl' => true,
+ );
+
+ return apply_filters( 'woocommerce_twenty_nineteen_styles', $styles );
+ }
+
+ /**
+ * Tweak Twenty Nineteen features.
+ */
+ public static function tweak_theme_features() {
+ if ( is_woocommerce() ) {
+ add_filter( 'twentynineteen_can_show_post_thumbnail', '__return_false' );
+ }
+ }
+
+ /**
+ * Filters Twenty Nineteen custom colors CSS.
+ *
+ * @param string $css Base theme colors CSS.
+ * @param int $primary_color The user's selected color hue.
+ * @param string $saturation Filtered theme color saturation level.
+ */
+ public static function custom_colors_css( $css, $primary_color, $saturation ) {
+ if ( function_exists( 'register_block_type' ) && is_admin() ) {
+ return $css;
+ }
+
+ $lightness = absint( apply_filters( 'twentynineteen_custom_colors_lightness', 33 ) );
+ $lightness = $lightness . '%';
+
+ $css .= '
+ .onsale,
+ .woocommerce-info,
+ .woocommerce-store-notice {
+ background-color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness . ' );
+ }
+
+ .woocommerce-tabs ul li.active a {
+ color: hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness . ' );
+ box-shadow: 0 2px 0 hsl( ' . $primary_color . ', ' . $saturation . ', ' . $lightness . ' );
+ }
+ ';
+
+ return $css;
+ }
+}
+
+WC_Twenty_Nineteen::init();
diff --git a/includes/wc-attribute-functions.php b/includes/wc-attribute-functions.php
index 22c2b913baa..b4a3616f0c2 100644
--- a/includes/wc-attribute-functions.php
+++ b/includes/wc-attribute-functions.php
@@ -507,24 +507,24 @@ function wc_create_attribute( $args ) {
return new WP_Error( 'cannot_update_attribute', __( 'Could not update the attribute.', 'woocommerce' ), array( 'status' => 400 ) );
}
- // Set old_slug to check for database changes.
- $args['old_slug'] = ! empty( $args['old_slug'] ) ? $args['old_slug'] : $args['slug'];
+ // Set old slug to check for database changes.
+ $old_slug = ! empty( $args['old_slug'] ) ? wc_sanitize_taxonomy_name( $args['old_slug'] ) : $slug;
/**
* Attribute updated.
*
- * @param int $id Added attribute ID.
- * @param array $data Attribute data.
- * @param string $old_slug Attribute old name.
+ * @param int $id Added attribute ID.
+ * @param array $data Attribute data.
+ * @param string $old_slug Attribute old name.
*/
- do_action( 'woocommerce_attribute_updated', $id, $data, $args['old_slug'] );
+ do_action( 'woocommerce_attribute_updated', $id, $data, $old_slug );
- if ( $args['old_slug'] !== $args['slug'] ) {
+ if ( $old_slug !== $slug ) {
// Update taxonomies in the wp term taxonomy table.
$wpdb->update(
$wpdb->term_taxonomy,
array( 'taxonomy' => wc_attribute_taxonomy_name( $data['attribute_name'] ) ),
- array( 'taxonomy' => 'pa_' . $args['old_slug'] )
+ array( 'taxonomy' => 'pa_' . $old_slug )
);
// Update taxonomy ordering term meta.
@@ -532,26 +532,36 @@ function wc_create_attribute( $args ) {
$wpdb->update(
$table_name,
array( 'meta_key' => 'order_pa_' . sanitize_title( $data['attribute_name'] ) ), // WPCS: slow query ok.
- array( 'meta_key' => 'order_pa_' . sanitize_title( $args['old_slug'] ) ) // WPCS: slow query ok.
+ array( 'meta_key' => 'order_pa_' . sanitize_title( $old_slug ) ) // WPCS: slow query ok.
);
// Update product attributes which use this taxonomy.
- $old_attribute_name_length = strlen( $args['old_slug'] ) + 3;
- $attribute_name_length = strlen( $data['attribute_name'] ) + 3;
-
- $wpdb->query(
+ $old_taxonomy_name = 'pa_' . $old_slug;
+ $new_taxonomy_name = 'pa_' . $data['attribute_name'];
+ $metadatas = $wpdb->get_results(
$wpdb->prepare(
- "UPDATE {$wpdb->postmeta} SET meta_value = REPLACE( meta_value, %s, %s ) WHERE meta_key = '_product_attributes'",
- 's:' . $old_attribute_name_length . ':"pa_' . $args['old_slug'] . '"',
- 's:' . $attribute_name_length . ':"pa_' . $data['attribute_name'] . '"'
- )
- );
+ "SELECT post_id, meta_value FROM {$wpdb->postmeta} WHERE meta_key = '_product_attributes' AND meta_value LIKE %s",
+ '%' . $wpdb->esc_like( $old_taxonomy_name ) . '%'
+ ),
+ ARRAY_A );
+ foreach ( $metadatas as $metadata ) {
+ $product_id = $metadata['post_id'];
+ $unserialized_data = maybe_unserialize( $metadata['meta_value'] );
+ if ( ! $unserialized_data || ! is_array( $unserialized_data ) || ! isset( $unserialized_data[ $old_taxonomy_name ] ) ) {
+ continue;
+ }
+
+ $unserialized_data[ $new_taxonomy_name ] = $unserialized_data[ $old_taxonomy_name ];
+ unset( $unserialized_data[ $old_taxonomy_name ] );
+ $unserialized_data[ $new_taxonomy_name ]['name'] = $new_taxonomy_name;
+ update_post_meta( $product_id, '_product_attributes', $unserialized_data );
+ }
// Update variations which use this taxonomy.
$wpdb->update(
$wpdb->postmeta,
array( 'meta_key' => 'attribute_pa_' . sanitize_title( $data['attribute_name'] ) ), // WPCS: slow query ok.
- array( 'meta_key' => 'attribute_pa_' . sanitize_title( $args['old_slug'] ) ) // WPCS: slow query ok.
+ array( 'meta_key' => 'attribute_pa_' . sanitize_title( $old_slug ) ) // WPCS: slow query ok.
);
}
}
@@ -587,10 +597,10 @@ function wc_update_attribute( $id, $args ) {
$args['old_slug'] = $wpdb->get_var(
$wpdb->prepare(
"
- SELECT attribute_name
- FROM {$wpdb->prefix}woocommerce_attribute_taxonomies
- WHERE attribute_id = %d
- ", $args['id']
+ SELECT attribute_name
+ FROM {$wpdb->prefix}woocommerce_attribute_taxonomies
+ WHERE attribute_id = %d
+ ", $args['id']
)
);
diff --git a/includes/wc-cart-functions.php b/includes/wc-cart-functions.php
index 54bd1ec2aa6..26091bfd17c 100644
--- a/includes/wc-cart-functions.php
+++ b/includes/wc-cart-functions.php
@@ -203,7 +203,7 @@ function wc_cart_totals_subtotal_html() {
* Get shipping methods.
*/
function wc_cart_totals_shipping_html() {
- $packages = WC()->shipping->get_packages();
+ $packages = WC()->shipping()->get_packages();
$first = true;
foreach ( $packages as $i => $package ) {
diff --git a/includes/wc-core-functions.php b/includes/wc-core-functions.php
index 6631d4339c4..d503708f328 100644
--- a/includes/wc-core-functions.php
+++ b/includes/wc-core-functions.php
@@ -194,15 +194,15 @@ function wc_get_template( $template_name, $args = array(), $template_path = '',
$located = wc_locate_template( $template_name, $template_path, $default_path );
+ // Allow 3rd party plugin filter template file from their plugin.
+ $located = apply_filters( 'wc_get_template', $located, $template_name, $args, $template_path, $default_path );
+
if ( ! file_exists( $located ) ) {
/* translators: %s template */
wc_doing_it_wrong( __FUNCTION__, sprintf( __( '%s does not exist.', 'woocommerce' ), '' . $located . '
' ), '2.1' );
return;
}
- // Allow 3rd party plugin filter template file from their plugin.
- $located = apply_filters( 'wc_get_template', $located, $template_name, $args, $template_path, $default_path );
-
do_action( 'woocommerce_before_template_part', $template_name, $template_path, $located, $args );
include $located;
@@ -473,7 +473,8 @@ function get_woocommerce_currency_symbol( $currency = '' ) {
}
$symbols = apply_filters(
- 'woocommerce_currency_symbols', array(
+ 'woocommerce_currency_symbols',
+ array(
'AED' => 'د.إ',
'AFN' => '؋',
'ALL' => 'L',
@@ -533,7 +534,7 @@ function get_woocommerce_currency_symbol( $currency = '' ) {
'GYD' => '$',
'HKD' => '$',
'HNL' => 'L',
- 'HRK' => 'Kn',
+ 'HRK' => 'kn',
'HTG' => 'G',
'HUF' => 'Ft',
'IDR' => 'Rp',
@@ -1079,7 +1080,8 @@ function wc_get_customer_default_location() {
$location = wc_format_country_state_string( apply_filters( 'woocommerce_customer_default_location', get_option( 'woocommerce_default_country' ) ) );
break;
default:
- $location = wc_format_country_state_string( apply_filters( 'woocommerce_customer_default_location', '' ) );
+ $countries = WC()->countries->get_allowed_countries();
+ $location = wc_format_country_state_string( apply_filters( 'woocommerce_customer_default_location', 1 === count( $countries ) ? key( $countries ) : '' ) );
break;
}
@@ -1283,7 +1285,7 @@ function wc_get_checkout_url() {
* @param string|object $shipping_method class name (string) or a class object.
*/
function woocommerce_register_shipping_method( $shipping_method ) {
- WC()->shipping->register_shipping_method( $shipping_method );
+ WC()->shipping()->register_shipping_method( $shipping_method );
}
if ( ! function_exists( 'wc_get_shipping_zone' ) ) {
@@ -1314,7 +1316,8 @@ function wc_get_credit_card_type_label( $type ) {
$type = str_replace( '_', ' ', $type );
$labels = apply_filters(
- 'woocommerce_credit_card_type_labels', array(
+ 'woocommerce_credit_card_type_labels',
+ array(
'mastercard' => __( 'MasterCard', 'woocommerce' ),
'visa' => __( 'Visa', 'woocommerce' ),
'discover' => __( 'Discover', 'woocommerce' ),
@@ -1453,7 +1456,7 @@ function wc_get_shipping_method_count( $include_legacy = false ) {
if ( $include_legacy ) {
// Count activated methods that don't support shipping zones.
- $methods = WC()->shipping->get_shipping_methods();
+ $methods = WC()->shipping()->get_shipping_methods();
foreach ( $methods as $method ) {
if ( isset( $method->enabled ) && 'yes' === $method->enabled && ! $method->supports( 'shipping-zones' ) ) {
@@ -1475,7 +1478,7 @@ function wc_get_shipping_method_count( $include_legacy = false ) {
* @param int $limit Time limit.
*/
function wc_set_time_limit( $limit = 0 ) {
- if ( function_exists( 'set_time_limit' ) && false === strpos( ini_get( 'disable_functions' ), 'set_time_limit' ) && ! ini_get( 'safe_mode' ) ) { // phpcs:ignore PHPCompatibility.PHP.DeprecatedIniDirectives.safe_modeDeprecatedRemoved
+ if ( function_exists( 'set_time_limit' ) && false === strpos( ini_get( 'disable_functions' ), 'set_time_limit' ) && ! ini_get( 'safe_mode' ) ) { // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.safe_modeDeprecatedRemoved
@set_time_limit( $limit ); // @codingStandardsIgnoreLine
}
}
@@ -1499,10 +1502,7 @@ function wc_nocache_headers() {
* @return int
*/
function wc_product_attribute_uasort_comparison( $a, $b ) {
- if ( $a['position'] === $b['position'] ) {
- return 0;
- }
- return ( $a['position'] < $b['position'] ) ? -1 : 1;
+ return wc_uasort_comparison( $a['position'], $b['position'] );
}
/**
@@ -1514,10 +1514,43 @@ function wc_product_attribute_uasort_comparison( $a, $b ) {
* @return int
*/
function wc_shipping_zone_method_order_uasort_comparison( $a, $b ) {
- if ( $a->method_order === $b->method_order ) {
+ return wc_uasort_comparison( $a->method_order, $b->method_order );
+}
+
+/**
+ * User to sort checkout fields based on priority with uasort.
+ *
+ * @since 3.5.1
+ * @param array $a First field to compare.
+ * @param array $b Second field to compare.
+ * @return int
+ */
+function wc_checkout_fields_uasort_comparison( $a, $b ) {
+ /*
+ * We are not guaranteed to get a priority
+ * setting. So don't compare if they don't
+ * exist.
+ */
+ if ( ! isset( $a['priority'], $b['priority'] ) ) {
return 0;
}
- return ( $a->method_order < $b->method_order ) ? -1 : 1;
+
+ return wc_uasort_comparison( $a['priority'], $b['priority'] );
+}
+
+/**
+ * User to sort two values with ausort.
+ *
+ * @since 3.5.1
+ * @param int $a First value to compare.
+ * @param int $b Second value to compare.
+ * @return int
+ */
+function wc_uasort_comparison( $a, $b ) {
+ if ( $a === $b ) {
+ return 0;
+ }
+ return ( $a < $b ) ? -1 : 1;
}
/**
@@ -1633,7 +1666,7 @@ function wc_get_logger() {
$class = apply_filters( 'woocommerce_logging_class', 'WC_Logger' );
- if ( null !== $logger && is_a( $logger, $class ) ) {
+ if ( null !== $logger && is_string( $class ) && is_a( $logger, $class ) ) {
return $logger;
}
@@ -1805,7 +1838,8 @@ function wc_list_pluck( $list, $callback_or_field, $index_key = null ) {
function wc_get_permalink_structure() {
$saved_permalinks = (array) get_option( 'woocommerce_permalinks', array() );
$permalinks = wp_parse_args(
- array_filter( $saved_permalinks ), array(
+ array_filter( $saved_permalinks ),
+ array(
'product_base' => _x( 'product', 'slug', 'woocommerce' ),
'category_base' => _x( 'product-category', 'slug', 'woocommerce' ),
'tag_base' => _x( 'product-tag', 'slug', 'woocommerce' ),
@@ -2082,7 +2116,7 @@ function wc_decimal_to_fraction( $decimal ) {
*/
function wc_round_discount( $value, $precision ) {
if ( version_compare( PHP_VERSION, '5.3.0', '>=' ) ) {
- return round( $value, $precision, WC_DISCOUNT_ROUNDING_MODE ); // phpcs:ignore PHPCompatibility.PHP.NewFunctionParameters.round_modeFound
+ return round( $value, $precision, WC_DISCOUNT_ROUNDING_MODE ); // phpcs:ignore PHPCompatibility.FunctionUse.NewFunctionParameters.round_modeFound
}
if ( 2 === WC_DISCOUNT_ROUNDING_MODE ) {
diff --git a/includes/wc-formatting-functions.php b/includes/wc-formatting-functions.php
index aef02e0596e..9b363bac4b6 100644
--- a/includes/wc-formatting-functions.php
+++ b/includes/wc-formatting-functions.php
@@ -228,7 +228,7 @@ function wc_round_tax_total( $value, $precision = null ) {
$precision = is_null( $precision ) ? wc_get_price_decimals() : intval( $precision );
if ( version_compare( PHP_VERSION, '5.3.0', '>=' ) ) {
- $rounded_tax = round( $value, $precision, wc_get_tax_rounding_mode() ); // phpcs:ignore PHPCompatibility.PHP.NewFunctionParameters.round_modeFound
+ $rounded_tax = round( $value, $precision, wc_get_tax_rounding_mode() ); // phpcs:ignore PHPCompatibility.FunctionUse.NewFunctionParameters.round_modeFound
} elseif ( 2 === wc_get_tax_rounding_mode() ) {
$rounded_tax = wc_legacy_round_half_down( $value, $precision );
} else {
@@ -377,6 +377,20 @@ function wc_clean( $var ) {
}
}
+/**
+ * Function wp_check_invalid_utf8 with recursive array support.
+ *
+ * @param string|array $var Data to sanitize.
+ * @return string|array
+ */
+function wc_check_invalid_utf8( $var ) {
+ if ( is_array( $var ) ) {
+ return array_map( 'wc_check_invalid_utf8', $var );
+ } else {
+ return wp_check_invalid_utf8( $var );
+ }
+}
+
/**
* Run wc_clean over posted textarea but maintain line breaks.
*
@@ -398,7 +412,8 @@ function wc_sanitize_textarea( $var ) {
function wc_sanitize_tooltip( $var ) {
return htmlspecialchars(
wp_kses(
- html_entity_decode( $var ), array(
+ html_entity_decode( $var ),
+ array(
'br' => array(),
'em' => array(),
'strong' => array(),
@@ -527,8 +542,10 @@ function wc_get_price_decimals() {
*/
function wc_price( $price, $args = array() ) {
$args = apply_filters(
- 'wc_price_args', wp_parse_args(
- $args, array(
+ 'wc_price_args',
+ wp_parse_args(
+ $args,
+ array(
'ex_tax_label' => false,
'currency' => '',
'decimal_separator' => wc_get_price_decimal_separator(),
@@ -941,6 +958,9 @@ function wc_normalize_postcode( $postcode ) {
* @return string
*/
function wc_format_phone_number( $phone ) {
+ if ( ! WC_Validation::is_phone( $phone ) ) {
+ return '';
+ }
return preg_replace( '/[^0-9\+\-\s]/', '-', preg_replace( '/[\x00-\x1F\x7F-\xFF]/', '', $phone ) );
}
@@ -1015,7 +1035,8 @@ function wc_format_product_short_description( $content ) {
return wpautop(
$markdown->transform(
- $content, array(
+ $content,
+ array(
'unslash' => false,
)
)
@@ -1215,7 +1236,7 @@ function wc_format_weight( $weight ) {
* @return string
*/
function wc_format_dimensions( $dimensions ) {
- $dimension_string = implode( ' x ', array_filter( array_map( 'wc_format_localized_decimal', $dimensions ) ) );
+ $dimension_string = implode( ' × ', array_filter( array_map( 'wc_format_localized_decimal', $dimensions ) ) );
if ( ! empty( $dimension_string ) ) {
$dimension_string .= ' ' . get_option( 'woocommerce_dimension_unit' );
@@ -1363,10 +1384,13 @@ function wc_parse_relative_date_option( $raw_value ) {
'years' => __( 'Year(s)', 'woocommerce' ),
);
- $value = wp_parse_args( (array) $raw_value, array(
- 'number' => '',
- 'unit' => 'days',
- ) );
+ $value = wp_parse_args(
+ (array) $raw_value,
+ array(
+ 'number' => '',
+ 'unit' => 'days',
+ )
+ );
$value['number'] = ! empty( $value['number'] ) ? absint( $value['number'] ) : '';
@@ -1376,3 +1400,27 @@ function wc_parse_relative_date_option( $raw_value ) {
return $value;
}
+
+/**
+ * Format the endpoint slug, strip out anything not allowed in a url.
+ *
+ * @since 3.5.0
+ * @param string $raw_value The raw value.
+ * @return string
+ */
+function wc_sanitize_endpoint_slug( $raw_value ) {
+ return sanitize_title( $raw_value );
+}
+add_filter( 'woocommerce_admin_settings_sanitize_option_woocommerce_checkout_pay_endpoint', 'wc_sanitize_endpoint_slug', 10, 1 );
+add_filter( 'woocommerce_admin_settings_sanitize_option_woocommerce_checkout_order_received_endpoint', 'wc_sanitize_endpoint_slug', 10, 1 );
+add_filter( 'woocommerce_admin_settings_sanitize_option_woocommerce_myaccount_add_payment_method_endpoint', 'wc_sanitize_endpoint_slug', 10, 1 );
+add_filter( 'woocommerce_admin_settings_sanitize_option_woocommerce_myaccount_delete_payment_method_endpoint', 'wc_sanitize_endpoint_slug', 10, 1 );
+add_filter( 'woocommerce_admin_settings_sanitize_option_woocommerce_myaccount_set_default_payment_method_endpoint', 'wc_sanitize_endpoint_slug', 10, 1 );
+add_filter( 'woocommerce_admin_settings_sanitize_option_woocommerce_myaccount_orders_endpoint', 'wc_sanitize_endpoint_slug', 10, 1 );
+add_filter( 'woocommerce_admin_settings_sanitize_option_woocommerce_myaccount_view_order_endpoint', 'wc_sanitize_endpoint_slug', 10, 1 );
+add_filter( 'woocommerce_admin_settings_sanitize_option_woocommerce_myaccount_downloads_endpoint', 'wc_sanitize_endpoint_slug', 10, 1 );
+add_filter( 'woocommerce_admin_settings_sanitize_option_woocommerce_myaccount_edit_account_endpoint', 'wc_sanitize_endpoint_slug', 10, 1 );
+add_filter( 'woocommerce_admin_settings_sanitize_option_woocommerce_myaccount_edit_address_endpoint', 'wc_sanitize_endpoint_slug', 10, 1 );
+add_filter( 'woocommerce_admin_settings_sanitize_option_woocommerce_myaccount_payment_methods_endpoint', 'wc_sanitize_endpoint_slug', 10, 1 );
+add_filter( 'woocommerce_admin_settings_sanitize_option_woocommerce_myaccount_lost_password_endpoint', 'wc_sanitize_endpoint_slug', 10, 1 );
+add_filter( 'woocommerce_admin_settings_sanitize_option_woocommerce_logout_endpoint', 'wc_sanitize_endpoint_slug', 10, 1 );
diff --git a/includes/wc-order-functions.php b/includes/wc-order-functions.php
index ee68ae42d6b..3d72c451b70 100644
--- a/includes/wc-order-functions.php
+++ b/includes/wc-order-functions.php
@@ -73,7 +73,7 @@ function wc_get_orders( $args ) {
*
* @param mixed $the_order Post object or post ID of the order.
*
- * @return bool|WC_Order|WC_Refund
+ * @return bool|WC_Order|WC_Order_Refund
*/
function wc_get_order( $the_order = false ) {
if ( ! did_action( 'woocommerce_after_register_post_type' ) ) {
@@ -886,7 +886,7 @@ add_action( 'woocommerce_cancel_unpaid_orders', 'wc_cancel_unpaid_orders' );
* @param int $order_id Order ID.
*/
function wc_sanitize_order_id( $order_id ) {
- return filter_var( $order_id, FILTER_SANITIZE_NUMBER_INT );
+ return (int) filter_var( $order_id, FILTER_SANITIZE_NUMBER_INT );
}
add_filter( 'woocommerce_shortcode_order_tracking_order_id', 'wc_sanitize_order_id' );
diff --git a/includes/wc-product-functions.php b/includes/wc-product-functions.php
index 7c4ff7d4188..91912cb78d7 100644
--- a/includes/wc-product-functions.php
+++ b/includes/wc-product-functions.php
@@ -284,8 +284,7 @@ function wc_placeholder_img_src( $size = 'woocommerce_thumbnail' ) {
if ( ! empty( $placeholder_image ) ) {
if ( is_numeric( $placeholder_image ) ) {
- $dimensions = wc_get_image_size( $size );
- $image = wp_get_attachment_image_src( $placeholder_image, array( $dimensions['width'], $dimensions['height'] ) );
+ $image = wp_get_attachment_image_src( $placeholder_image, $size );
if ( ! empty( $image[0] ) ) {
$src = $image[0];
@@ -455,8 +454,12 @@ add_action( 'woocommerce_scheduled_sales', 'wc_scheduled_sales' );
* @return array
*/
function wc_get_attachment_image_attributes( $attr ) {
- if ( strstr( $attr['src'][0], 'woocommerce_uploads/' ) ) {
- $attr['src'][0] = wc_placeholder_img_src();
+ if ( isset( $attr['src'] ) && strstr( $attr['src'], 'woocommerce_uploads/' ) ) {
+ $attr['src'] = wc_placeholder_img_src();
+
+ if ( isset( $attr['srcset'] ) ) {
+ $attr['srcset'] = '';
+ }
}
return $attr;
}
@@ -527,7 +530,8 @@ add_action( 'template_redirect', 'wc_track_product_view', 20 );
*/
function wc_get_product_types() {
return (array) apply_filters(
- 'product_type_selector', array(
+ 'product_type_selector',
+ array(
'simple' => __( 'Simple product', 'woocommerce' ),
'grouped' => __( 'Grouped product', 'woocommerce' ),
'external' => __( 'External/Affiliate product', 'woocommerce' ),
@@ -744,8 +748,7 @@ function wc_get_product_attachment_props( $attachment_id = null, $product = fals
$props['thumb_src_h'] = $src[2];
// Image source.
- $flexslider = (bool) apply_filters( 'woocommerce_single_product_flexslider_enabled', get_theme_support( 'wc-product-gallery-slider' ) );
- $image_size = apply_filters( 'woocommerce_gallery_image_size', $flexslider ? 'woocommerce_single' : $gallery_thumbnail_size );
+ $image_size = apply_filters( 'woocommerce_gallery_image_size', 'woocommerce_single' );
$src = wp_get_attachment_image_src( $attachment_id, $image_size );
$props['src'] = $src[0];
$props['src_w'] = $src[1];
@@ -764,7 +767,8 @@ function wc_get_product_attachment_props( $attachment_id = null, $product = fals
*/
function wc_get_product_visibility_options() {
return apply_filters(
- 'woocommerce_product_visibility_options', array(
+ 'woocommerce_product_visibility_options',
+ array(
'visible' => __( 'Shop and search results', 'woocommerce' ),
'catalog' => __( 'Shop only', 'woocommerce' ),
'search' => __( 'Search results only', 'woocommerce' ),
@@ -910,7 +914,10 @@ function wc_get_related_products( $product_id, $limit = 5, $exclude_ids = array(
}
$related_posts = apply_filters(
- 'woocommerce_related_products', $related_posts, $product_id, array(
+ 'woocommerce_related_products',
+ $related_posts,
+ $product_id,
+ array(
'limit' => $limit,
'excluded_ids' => $exclude_ids,
)
@@ -944,7 +951,8 @@ function wc_get_product_term_ids( $product_id, $taxonomy ) {
*/
function wc_get_price_including_tax( $product, $args = array() ) {
$args = wp_parse_args(
- $args, array(
+ $args,
+ array(
'qty' => '',
'price' => '',
)
@@ -1006,7 +1014,8 @@ function wc_get_price_including_tax( $product, $args = array() ) {
*/
function wc_get_price_excluding_tax( $product, $args = array() ) {
$args = wp_parse_args(
- $args, array(
+ $args,
+ array(
'qty' => '',
'price' => '',
)
@@ -1045,7 +1054,8 @@ function wc_get_price_excluding_tax( $product, $args = array() ) {
*/
function wc_get_price_to_display( $product, $args = array() ) {
$args = wp_parse_args(
- $args, array(
+ $args,
+ array(
'qty' => 1,
'price' => $product->get_price(),
)
@@ -1056,13 +1066,15 @@ function wc_get_price_to_display( $product, $args = array() ) {
return 'incl' === get_option( 'woocommerce_tax_display_shop' ) ?
wc_get_price_including_tax(
- $product, array(
+ $product,
+ array(
'qty' => $qty,
'price' => $price,
)
) :
wc_get_price_excluding_tax(
- $product, array(
+ $product,
+ array(
'qty' => $qty,
'price' => $price,
)
diff --git a/includes/wc-rest-functions.php b/includes/wc-rest-functions.php
index 29b65501973..00bf6144457 100644
--- a/includes/wc-rest-functions.php
+++ b/includes/wc-rest-functions.php
@@ -273,13 +273,29 @@ function wc_rest_check_post_permissions( $post_type, $context = 'read', $object_
function wc_rest_check_user_permissions( $context = 'read', $object_id = 0 ) {
$contexts = array(
'read' => 'list_users',
- 'create' => 'edit_users',
+ 'create' => 'promote_users', // Check if current user can create users, shop managers are not allowed to create users.
'edit' => 'edit_users',
'delete' => 'delete_users',
- 'batch' => 'edit_users',
+ 'batch' => 'promote_users',
);
- $permission = current_user_can( $contexts[ $context ], $object_id );
+ // Check to allow shop_managers to manage only customers.
+ if ( in_array( $context, array( 'edit', 'delete' ), true ) && wc_current_user_has_role( 'shop_manager' ) ) {
+ $permission = false;
+ $user_data = get_userdata( $object_id );
+ $shop_manager_editable_roles = apply_filters( 'woocommerce_shop_manager_editable_roles', array( 'customer' ) );
+
+ if ( isset( $user_data->roles ) ) {
+ $can_manage_users = array_intersect( $user_data->roles, array_unique( $shop_manager_editable_roles ) );
+
+ // Check if Shop Manager can edit customer or with the is same shop manager.
+ if ( 0 < count( $can_manage_users ) || intval( $object_id ) === intval( get_current_user_id() ) ) {
+ $permission = current_user_can( $contexts[ $context ], $object_id );
+ }
+ }
+ } else {
+ $permission = current_user_can( $contexts[ $context ], $object_id );
+ }
return apply_filters( 'woocommerce_rest_check_permissions', $permission, $context, $object_id, 'user' );
}
@@ -332,3 +348,28 @@ function wc_rest_check_manager_permissions( $object, $context = 'read' ) {
return apply_filters( 'woocommerce_rest_check_permissions', $permission, $context, 0, $object );
}
+
+/**
+ * Check product reviews permissions on REST API.
+ *
+ * @since 3.5.0
+ * @param string $context Request context.
+ * @param string $object_id Object ID.
+ * @return bool
+ */
+function wc_rest_check_product_reviews_permissions( $context = 'read', $object_id = 0 ) {
+ $permission = false;
+ $contexts = array(
+ 'read' => 'moderate_comments',
+ 'create' => 'moderate_comments',
+ 'edit' => 'moderate_comments',
+ 'delete' => 'moderate_comments',
+ 'batch' => 'moderate_comments',
+ );
+
+ if ( isset( $contexts[ $context ] ) ) {
+ $permission = current_user_can( $contexts[ $context ] );
+ }
+
+ return apply_filters( 'woocommerce_rest_check_permissions', $permission, $context, $object_id, 'product_review' );
+}
diff --git a/includes/wc-stock-functions.php b/includes/wc-stock-functions.php
index dbb2b048bb3..0e1eb39dbcb 100644
--- a/includes/wc-stock-functions.php
+++ b/includes/wc-stock-functions.php
@@ -247,6 +247,8 @@ function wc_increase_stock_levels( $order_id ) {
return;
}
+ $changes = array();
+
// Loop over all items.
foreach ( $order->get_items() as $item ) {
if ( ! $item->is_type( 'line_item' ) ) {
@@ -332,4 +334,4 @@ function wc_get_low_stock_amount( WC_Product $product ) {
}
return $low_stock_amount;
-}
\ No newline at end of file
+}
diff --git a/includes/wc-template-functions.php b/includes/wc-template-functions.php
index 55dbcd69544..ff71246af43 100644
--- a/includes/wc-template-functions.php
+++ b/includes/wc-template-functions.php
@@ -165,14 +165,17 @@ function wc_setup_loop( $args = array() ) {
// If this is a main WC query, use global args as defaults.
if ( $GLOBALS['wp_query']->get( 'wc_query' ) ) {
- $default_args = array_merge( $default_args, array(
- 'is_search' => $GLOBALS['wp_query']->is_search(),
- 'is_filtered' => is_filtered(),
- 'total' => $GLOBALS['wp_query']->found_posts,
- 'total_pages' => $GLOBALS['wp_query']->max_num_pages,
- 'per_page' => $GLOBALS['wp_query']->get( 'posts_per_page' ),
- 'current_page' => max( 1, $GLOBALS['wp_query']->get( 'paged', 1 ) ),
- ) );
+ $default_args = array_merge(
+ $default_args,
+ array(
+ 'is_search' => $GLOBALS['wp_query']->is_search(),
+ 'is_filtered' => is_filtered(),
+ 'total' => $GLOBALS['wp_query']->found_posts,
+ 'total_pages' => $GLOBALS['wp_query']->max_num_pages,
+ 'per_page' => $GLOBALS['wp_query']->get( 'posts_per_page' ),
+ 'current_page' => max( 1, $GLOBALS['wp_query']->get( 'paged', 1 ) ),
+ )
+ );
}
// Merge any existing values.
@@ -603,7 +606,7 @@ function wc_get_product_class( $class = '', $product_id = null ) {
}
// Post thumbnails.
- if ( current_theme_supports( 'post-thumbnails' ) && has_post_thumbnail( $post->ID ) && ! is_attachment( $post ) && ! $post_password_required ) {
+ if ( current_theme_supports( 'post-thumbnails' ) && $product->get_image_id() && ! is_attachment( $post ) && ! $post_password_required ) {
$classes[] = 'has-post-thumbnail';
}
@@ -623,7 +626,7 @@ function wc_get_product_class( $class = '', $product_id = null ) {
if ( apply_filters( 'woocommerce_get_product_class_include_taxonomies', false ) ) {
$taxonomies = get_taxonomies( array( 'public' => true ) );
foreach ( (array) $taxonomies as $taxonomy ) {
- if ( is_object_in_taxonomy( $post->post_type, $taxonomy ) && in_array( $taxonomy, array( 'product_cat', 'product_tag' ), true ) ) {
+ if ( is_object_in_taxonomy( $post->post_type, $taxonomy ) && ! in_array( $taxonomy, array( 'product_cat', 'product_tag' ), true ) ) {
$classes = array_merge( $classes, wc_get_product_taxonomy_class( (array) get_the_terms( $post->ID, $taxonomy ), $taxonomy ) );
}
}
@@ -1181,12 +1184,17 @@ if ( ! function_exists( 'woocommerce_template_loop_add_to_cart' ) ) {
if ( $product ) {
$defaults = array(
'quantity' => 1,
- 'class' => implode( ' ', array_filter( array(
- 'button',
- 'product_type_' . $product->get_type(),
- $product->is_purchasable() && $product->is_in_stock() ? 'add_to_cart_button' : '',
- $product->supports( 'ajax_add_to_cart' ) && $product->is_purchasable() && $product->is_in_stock() ? 'ajax_add_to_cart' : '',
- ) ) ),
+ 'class' => implode(
+ ' ',
+ array_filter(
+ array(
+ 'button',
+ 'product_type_' . $product->get_type(),
+ $product->is_purchasable() && $product->is_in_stock() ? 'add_to_cart_button' : '',
+ $product->supports( 'ajax_add_to_cart' ) && $product->is_purchasable() && $product->is_in_stock() ? 'ajax_add_to_cart' : '',
+ )
+ )
+ ),
'attributes' => array(
'data-product_id' => $product->get_id(),
'data-product_sku' => $product->get_sku(),
@@ -1291,14 +1299,17 @@ if ( ! function_exists( 'woocommerce_catalog_ordering' ) ) {
return;
}
$show_default_orderby = 'menu_order' === apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
- $catalog_orderby_options = apply_filters( 'woocommerce_catalog_orderby', array(
- 'menu_order' => __( 'Default sorting', 'woocommerce' ),
- 'popularity' => __( 'Sort by popularity', 'woocommerce' ),
- 'rating' => __( 'Sort by average rating', 'woocommerce' ),
- 'date' => __( 'Sort by newness', 'woocommerce' ),
- 'price' => __( 'Sort by price: low to high', 'woocommerce' ),
- 'price-desc' => __( 'Sort by price: high to low', 'woocommerce' ),
- ) );
+ $catalog_orderby_options = apply_filters(
+ 'woocommerce_catalog_orderby',
+ array(
+ 'menu_order' => __( 'Default sorting', 'woocommerce' ),
+ 'popularity' => __( 'Sort by popularity', 'woocommerce' ),
+ 'rating' => __( 'Sort by average rating', 'woocommerce' ),
+ 'date' => __( 'Sort by latest', 'woocommerce' ),
+ 'price' => __( 'Sort by price: low to high', 'woocommerce' ),
+ 'price-desc' => __( 'Sort by price: high to low', 'woocommerce' ),
+ )
+ );
$default_orderby = wc_get_loop_prop( 'is_search' ) ? 'relevance' : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby', '' ) );
$orderby = isset( $_GET['orderby'] ) ? wc_clean( wp_unslash( $_GET['orderby'] ) ) : $default_orderby; // WPCS: sanitization ok, input var ok, CSRF ok.
@@ -1321,11 +1332,14 @@ if ( ! function_exists( 'woocommerce_catalog_ordering' ) ) {
$orderby = current( array_keys( $catalog_orderby_options ) );
}
- wc_get_template( 'loop/orderby.php', array(
- 'catalog_orderby_options' => $catalog_orderby_options,
- 'orderby' => $orderby,
- 'show_default_orderby' => $show_default_orderby,
- ) );
+ wc_get_template(
+ 'loop/orderby.php',
+ array(
+ 'catalog_orderby_options' => $catalog_orderby_options,
+ 'orderby' => $orderby,
+ 'show_default_orderby' => $show_default_orderby,
+ )
+ );
}
}
@@ -1396,15 +1410,26 @@ function wc_get_gallery_image_html( $attachment_id, $main_image = false ) {
$full_size = apply_filters( 'woocommerce_gallery_full_size', apply_filters( 'woocommerce_product_thumbnails_large_size', 'full' ) );
$thumbnail_src = wp_get_attachment_image_src( $attachment_id, $thumbnail_size );
$full_src = wp_get_attachment_image_src( $attachment_id, $full_size );
- $image = wp_get_attachment_image( $attachment_id, $image_size, false, array(
- 'title' => get_post_field( 'post_title', $attachment_id ),
- 'data-caption' => get_post_field( 'post_excerpt', $attachment_id ),
- 'data-src' => $full_src[0],
- 'data-large_image' => $full_src[0],
- 'data-large_image_width' => $full_src[1],
- 'data-large_image_height' => $full_src[2],
- 'class' => $main_image ? 'wp-post-image' : '',
- ) );
+ $image = wp_get_attachment_image(
+ $attachment_id,
+ $image_size,
+ false,
+ apply_filters(
+ 'woocommerce_gallery_image_html_attachment_image_params',
+ array(
+ 'title' => get_post_field( 'post_title', $attachment_id ),
+ 'data-caption' => get_post_field( 'post_excerpt', $attachment_id ),
+ 'data-src' => $full_src[0],
+ 'data-large_image' => $full_src[0],
+ 'data-large_image_width' => $full_src[1],
+ 'data-large_image_height' => $full_src[2],
+ 'class' => $main_image ? 'wp-post-image' : '',
+ ),
+ $attachment_id,
+ $image_size,
+ $main_image
+ )
+ );
return '';
}
@@ -1514,11 +1539,14 @@ if ( ! function_exists( 'woocommerce_grouped_add_to_cart' ) ) {
$products = array_filter( array_map( 'wc_get_product', $product->get_children() ), 'wc_products_array_filter_visible_grouped' );
if ( $products ) {
- wc_get_template( 'single-product/add-to-cart/grouped.php', array(
- 'grouped_product' => $product,
- 'grouped_products' => $products,
- 'quantites_required' => false,
- ) );
+ wc_get_template(
+ 'single-product/add-to-cart/grouped.php',
+ array(
+ 'grouped_product' => $product,
+ 'grouped_products' => $products,
+ 'quantites_required' => false,
+ )
+ );
}
}
}
@@ -1537,11 +1565,14 @@ if ( ! function_exists( 'woocommerce_variable_add_to_cart' ) ) {
$get_variations = count( $product->get_children() ) <= apply_filters( 'woocommerce_ajax_variation_threshold', 30, $product );
// Load the template.
- wc_get_template( 'single-product/add-to-cart/variable.php', array(
- 'available_variations' => $get_variations ? $product->get_available_variations() : false,
- 'attributes' => $product->get_variation_attributes(),
- 'selected_attributes' => $product->get_default_attributes(),
- ) );
+ wc_get_template(
+ 'single-product/add-to-cart/variable.php',
+ array(
+ 'available_variations' => $get_variations ? $product->get_available_variations() : false,
+ 'attributes' => $product->get_variation_attributes(),
+ 'selected_attributes' => $product->get_default_attributes(),
+ )
+ );
}
}
if ( ! function_exists( 'woocommerce_external_add_to_cart' ) ) {
@@ -1556,10 +1587,13 @@ if ( ! function_exists( 'woocommerce_external_add_to_cart' ) ) {
return;
}
- wc_get_template( 'single-product/add-to-cart/external.php', array(
- 'product_url' => $product->add_to_cart_url(),
- 'button_text' => $product->single_add_to_cart_text(),
- ) );
+ wc_get_template(
+ 'single-product/add-to-cart/external.php',
+ array(
+ 'product_url' => $product->add_to_cart_url(),
+ 'button_text' => $product->single_add_to_cart_text(),
+ )
+ );
}
}
@@ -1580,14 +1614,16 @@ if ( ! function_exists( 'woocommerce_quantity_input' ) ) {
}
$defaults = array(
- 'input_id' => uniqid( 'quantity_' ),
- 'input_name' => 'quantity',
- 'input_value' => '1',
- 'max_value' => apply_filters( 'woocommerce_quantity_input_max', -1, $product ),
- 'min_value' => apply_filters( 'woocommerce_quantity_input_min', 0, $product ),
- 'step' => apply_filters( 'woocommerce_quantity_input_step', 1, $product ),
- 'pattern' => apply_filters( 'woocommerce_quantity_input_pattern', has_filter( 'woocommerce_stock_amount', 'intval' ) ? '[0-9]*' : '' ),
- 'inputmode' => apply_filters( 'woocommerce_quantity_input_inputmode', has_filter( 'woocommerce_stock_amount', 'intval' ) ? 'numeric' : '' ),
+ 'input_id' => uniqid( 'quantity_' ),
+ 'input_name' => 'quantity',
+ 'input_value' => '1',
+ 'classes' => apply_filters( 'woocommerce_quantity_input_classes', array( 'input-text', 'qty', 'text' ), $product ),
+ 'max_value' => apply_filters( 'woocommerce_quantity_input_max', -1, $product ),
+ 'min_value' => apply_filters( 'woocommerce_quantity_input_min', 0, $product ),
+ 'step' => apply_filters( 'woocommerce_quantity_input_step', 1, $product ),
+ 'pattern' => apply_filters( 'woocommerce_quantity_input_pattern', has_filter( 'woocommerce_stock_amount', 'intval' ) ? '[0-9]*' : '' ),
+ 'inputmode' => apply_filters( 'woocommerce_quantity_input_inputmode', has_filter( 'woocommerce_stock_amount', 'intval' ) ? 'numeric' : '' ),
+ 'product_name' => $product ? $product->get_title() : '',
);
$args = apply_filters( 'woocommerce_quantity_input_args', wp_parse_args( $args, $defaults ), $product );
@@ -1724,11 +1760,14 @@ if ( ! function_exists( 'woocommerce_comments' ) ) {
*/
function woocommerce_comments( $comment, $args, $depth ) {
$GLOBALS['comment'] = $comment; // WPCS: override ok.
- wc_get_template( 'single-product/review.php', array(
- 'comment' => $comment,
- 'args' => $args,
- 'depth' => $depth,
- ) );
+ wc_get_template(
+ 'single-product/review.php',
+ array(
+ 'comment' => $comment,
+ 'args' => $args,
+ 'depth' => $depth,
+ )
+ );
}
}
@@ -1852,11 +1891,14 @@ if ( ! function_exists( 'woocommerce_upsell_display' ) ) {
}
// Handle the legacy filter which controlled posts per page etc.
- $args = apply_filters( 'woocommerce_upsell_display_args', array(
- 'posts_per_page' => $limit,
- 'orderby' => $orderby,
- 'columns' => $columns,
- ) );
+ $args = apply_filters(
+ 'woocommerce_upsell_display_args',
+ array(
+ 'posts_per_page' => $limit,
+ 'orderby' => $orderby,
+ 'columns' => $columns,
+ )
+ );
wc_set_loop_prop( 'name', 'up-sells' );
wc_set_loop_prop( 'columns', apply_filters( 'woocommerce_upsells_columns', isset( $args['columns'] ) ? $args['columns'] : $columns ) );
@@ -1867,14 +1909,17 @@ if ( ! function_exists( 'woocommerce_upsell_display' ) ) {
$upsells = wc_products_array_orderby( array_filter( array_map( 'wc_get_product', $product->get_upsell_ids() ), 'wc_products_array_filter_visible' ), $orderby, $order );
$upsells = $limit > 0 ? array_slice( $upsells, 0, $limit ) : $upsells;
- wc_get_template( 'single-product/up-sells.php', array(
- 'upsells' => $upsells,
+ wc_get_template(
+ 'single-product/up-sells.php',
+ array(
+ 'upsells' => $upsells,
- // Not used now, but used in previous version of up-sells.php.
- 'posts_per_page' => $limit,
- 'orderby' => $orderby,
- 'columns' => $columns,
- ) );
+ // Not used now, but used in previous version of up-sells.php.
+ 'posts_per_page' => $limit,
+ 'orderby' => $orderby,
+ 'columns' => $columns,
+ )
+ );
}
}
@@ -1892,9 +1937,12 @@ if ( ! function_exists( 'woocommerce_shipping_calculator' ) ) {
return;
}
wp_enqueue_script( 'wc-country-select' );
- wc_get_template( 'cart/shipping-calculator.php', array(
- 'button_text' => $button_text,
- ) );
+ wc_get_template(
+ 'cart/shipping-calculator.php',
+ array(
+ 'button_text' => $button_text,
+ )
+ );
}
}
@@ -1938,14 +1986,17 @@ if ( ! function_exists( 'woocommerce_cross_sell_display' ) ) {
$limit = apply_filters( 'woocommerce_cross_sells_total', $limit );
$cross_sells = $limit > 0 ? array_slice( $cross_sells, 0, $limit ) : $cross_sells;
- wc_get_template( 'cart/cross-sells.php', array(
- 'cross_sells' => $cross_sells,
+ wc_get_template(
+ 'cart/cross-sells.php',
+ array(
+ 'cross_sells' => $cross_sells,
- // Not used now, but used in previous version of up-sells.php.
- 'posts_per_page' => $limit,
- 'orderby' => $orderby,
- 'columns' => $columns,
- ) );
+ // Not used now, but used in previous version of up-sells.php.
+ 'posts_per_page' => $limit,
+ 'orderby' => $orderby,
+ 'columns' => $columns,
+ )
+ );
}
}
@@ -2029,9 +2080,12 @@ if ( ! function_exists( 'woocommerce_checkout_login_form' ) ) {
* Output the WooCommerce Checkout Login Form.
*/
function woocommerce_checkout_login_form() {
- wc_get_template( 'checkout/form-login.php', array(
- 'checkout' => WC()->checkout(),
- ) );
+ wc_get_template(
+ 'checkout/form-login.php',
+ array(
+ 'checkout' => WC()->checkout(),
+ )
+ );
}
}
@@ -2043,14 +2097,20 @@ if ( ! function_exists( 'woocommerce_breadcrumb' ) ) {
* @param array $args Arguments.
*/
function woocommerce_breadcrumb( $args = array() ) {
- $args = wp_parse_args( $args, apply_filters( 'woocommerce_breadcrumb_defaults', array(
- 'delimiter' => ' / ',
- 'wrap_before' => '',
- 'wrap_after' => ' ',
- 'before' => '',
- 'after' => '',
- 'home' => _x( 'Home', 'breadcrumb', 'woocommerce' ),
- ) ) );
+ $args = wp_parse_args(
+ $args,
+ apply_filters(
+ 'woocommerce_breadcrumb_defaults',
+ array(
+ 'delimiter' => ' / ',
+ 'wrap_before' => '',
+ 'wrap_after' => ' ',
+ 'before' => '',
+ 'after' => '',
+ 'home' => _x( 'Home', 'breadcrumb', 'woocommerce' ),
+ )
+ )
+ );
$breadcrumbs = new WC_Breadcrumb();
@@ -2079,9 +2139,12 @@ if ( ! function_exists( 'woocommerce_order_review' ) ) {
* @param bool $deprecated Deprecated param.
*/
function woocommerce_order_review( $deprecated = false ) {
- wc_get_template( 'checkout/review-order.php', array(
- 'checkout' => WC()->checkout(),
- ) );
+ wc_get_template(
+ 'checkout/review-order.php',
+ array(
+ 'checkout' => WC()->checkout(),
+ )
+ );
}
}
@@ -2098,11 +2161,14 @@ if ( ! function_exists( 'woocommerce_checkout_payment' ) ) {
$available_gateways = array();
}
- wc_get_template( 'checkout/payment.php', array(
- 'checkout' => WC()->checkout(),
- 'available_gateways' => $available_gateways,
- 'order_button_text' => apply_filters( 'woocommerce_order_button_text', __( 'Place order', 'woocommerce' ) ),
- ) );
+ wc_get_template(
+ 'checkout/payment.php',
+ array(
+ 'checkout' => WC()->checkout(),
+ 'available_gateways' => $available_gateways,
+ 'order_button_text' => apply_filters( 'woocommerce_order_button_text', __( 'Place order', 'woocommerce' ) ),
+ )
+ );
}
}
@@ -2112,9 +2178,12 @@ if ( ! function_exists( 'woocommerce_checkout_coupon_form' ) ) {
* Output the Coupon form for the checkout.
*/
function woocommerce_checkout_coupon_form() {
- wc_get_template( 'checkout/form-coupon.php', array(
- 'checkout' => WC()->checkout(),
- ) );
+ wc_get_template(
+ 'checkout/form-coupon.php',
+ array(
+ 'checkout' => WC()->checkout(),
+ )
+ );
}
}
@@ -2194,9 +2263,11 @@ if ( ! function_exists( 'woocommerce_maybe_show_product_subcategories' ) ) {
// If displaying categories, append to the loop.
if ( 'subcategories' === $display_type || 'both' === $display_type ) {
ob_start();
- woocommerce_output_product_categories( array(
- 'parent_id' => is_product_category() ? get_queried_object_id() : 0,
- ) );
+ woocommerce_output_product_categories(
+ array(
+ 'parent_id' => is_product_category() ? get_queried_object_id() : 0,
+ )
+ );
$loop_html .= ob_get_clean();
if ( 'subcategories' === $display_type ) {
@@ -2243,11 +2314,13 @@ if ( ! function_exists( 'woocommerce_product_subcategories' ) ) {
if ( $args['force_display'] ) {
// We can still render if display is forced.
- woocommerce_output_product_categories( array(
- 'before' => $args['before'],
- 'after' => $args['after'],
- 'parent_id' => is_product_category() ? get_queried_object_id() : 0,
- ) );
+ woocommerce_output_product_categories(
+ array(
+ 'before' => $args['before'],
+ 'after' => $args['after'],
+ 'parent_id' => is_product_category() ? get_queried_object_id() : 0,
+ )
+ );
return true;
} else {
// Output nothing. woocommerce_maybe_show_product_subcategories will handle the output of cats.
@@ -2280,11 +2353,14 @@ if ( ! function_exists( 'woocommerce_output_product_categories' ) ) {
* @return boolean
*/
function woocommerce_output_product_categories( $args = array() ) {
- $args = wp_parse_args( $args, array(
- 'before' => apply_filters( 'woocommerce_before_output_product_categories', '' ),
- 'after' => apply_filters( 'woocommerce_after_output_product_categories', '' ),
- 'parent_id' => 0,
- ) );
+ $args = wp_parse_args(
+ $args,
+ array(
+ 'before' => apply_filters( 'woocommerce_before_output_product_categories', '' ),
+ 'after' => apply_filters( 'woocommerce_after_output_product_categories', '' ),
+ 'parent_id' => 0,
+ )
+ );
$product_categories = woocommerce_get_product_subcategories( $args['parent_id'] );
@@ -2295,9 +2371,12 @@ if ( ! function_exists( 'woocommerce_output_product_categories' ) ) {
echo $args['before']; // WPCS: XSS ok.
foreach ( $product_categories as $category ) {
- wc_get_template( 'content-product_cat.php', array(
- 'category' => $category,
- ) );
+ wc_get_template(
+ 'content-product_cat.php',
+ array(
+ 'category' => $category,
+ )
+ );
}
echo $args['after']; // WPCS: XSS ok.
@@ -2319,14 +2398,19 @@ if ( ! function_exists( 'woocommerce_get_product_subcategories' ) ) {
if ( false === $product_categories ) {
// NOTE: using child_of instead of parent - this is not ideal but due to a WP bug ( https://core.trac.wordpress.org/ticket/15626 ) pad_counts won't work.
- $product_categories = get_categories( apply_filters( 'woocommerce_product_subcategories_args', array(
- 'parent' => $parent_id,
- 'menu_order' => 'ASC',
- 'hide_empty' => 0,
- 'hierarchical' => 1,
- 'taxonomy' => 'product_cat',
- 'pad_counts' => 1,
- ) ) );
+ $product_categories = get_categories(
+ apply_filters(
+ 'woocommerce_product_subcategories_args',
+ array(
+ 'parent' => $parent_id,
+ 'menu_order' => 'ASC',
+ 'hide_empty' => 0,
+ 'hierarchical' => 1,
+ 'taxonomy' => 'product_cat',
+ 'pad_counts' => 1,
+ )
+ )
+ );
wp_cache_set( 'product-category-hierarchy-' . $parent_id, $product_categories, 'product_cat' );
}
@@ -2389,9 +2473,12 @@ if ( ! function_exists( 'woocommerce_order_details_table' ) ) {
return;
}
- wc_get_template( 'order/order-details.php', array(
- 'order_id' => $order_id,
- ) );
+ wc_get_template(
+ 'order/order-details.php',
+ array(
+ 'order_id' => $order_id,
+ )
+ );
}
}
@@ -2407,9 +2494,12 @@ if ( ! function_exists( 'woocommerce_order_downloads_table' ) ) {
if ( ! $downloads ) {
return;
}
- wc_get_template( 'order/order-downloads.php', array(
- 'downloads' => $downloads,
- ) );
+ wc_get_template(
+ 'order/order-downloads.php',
+ array(
+ 'downloads' => $downloads,
+ )
+ );
}
}
@@ -2425,10 +2515,13 @@ if ( ! function_exists( 'woocommerce_order_again_button' ) ) {
return;
}
- wc_get_template( 'order/order-again.php', array(
- 'order' => $order,
- 'order_again_url' => wp_nonce_url( add_query_arg( 'order_again', $order->get_id(), wc_get_cart_url() ), 'woocommerce-order_again' ),
- ) );
+ wc_get_template(
+ 'order/order-again.php',
+ array(
+ 'order' => $order,
+ 'order_again_url' => wp_nonce_url( add_query_arg( 'order_again', $order->get_id(), wc_get_cart_url() ), 'woocommerce-order_again' ),
+ )
+ );
}
}
@@ -2699,9 +2792,12 @@ if ( ! function_exists( 'get_product_search_form' ) ) {
do_action( 'pre_get_product_search_form' );
- wc_get_template( 'product-searchform.php', array(
- 'index' => $product_search_form_index++,
- ) );
+ wc_get_template(
+ 'product-searchform.php',
+ array(
+ 'index' => $product_search_form_index++,
+ )
+ );
$form = apply_filters( 'get_product_search_form', ob_get_clean() );
@@ -2762,21 +2858,24 @@ if ( ! function_exists( 'wc_dropdown_variation_attribute_options' ) ) {
* @since 2.4.0
*/
function wc_dropdown_variation_attribute_options( $args = array() ) {
- $args = wp_parse_args( apply_filters( 'woocommerce_dropdown_variation_attribute_options_args', $args ), array(
- 'options' => false,
- 'attribute' => false,
- 'product' => false,
- 'selected' => false,
- 'name' => '',
- 'id' => '',
- 'class' => '',
- 'show_option_none' => __( 'Choose an option', 'woocommerce' ),
- ) );
+ $args = wp_parse_args(
+ apply_filters( 'woocommerce_dropdown_variation_attribute_options_args', $args ),
+ array(
+ 'options' => false,
+ 'attribute' => false,
+ 'product' => false,
+ 'selected' => false,
+ 'name' => '',
+ 'id' => '',
+ 'class' => '',
+ 'show_option_none' => __( 'Choose an option', 'woocommerce' ),
+ )
+ );
// Get selected value.
if ( false === $args['selected'] && $args['attribute'] && $args['product'] instanceof WC_Product ) {
$selected_key = 'attribute_' . sanitize_title( $args['attribute'] );
- $args['selected'] = isset( $_REQUEST[ $selected_key ] ) ? wc_clean( urldecode( wp_unslash( $_REQUEST[ $selected_key ] ) ) ) : $args['product']->get_variation_default_attribute( $args['attribute'] ); // WPCS: input var ok, CSRF ok, sanitization ok.
+ $args['selected'] = isset( $_REQUEST[ $selected_key ] ) ? wc_clean( wp_unslash( $_REQUEST[ $selected_key ] ) ) : $args['product']->get_variation_default_attribute( $args['attribute'] ); // WPCS: input var ok, CSRF ok, sanitization ok.
}
$options = $args['options'];
@@ -2799,20 +2898,24 @@ if ( ! function_exists( 'wc_dropdown_variation_attribute_options' ) ) {
if ( ! empty( $options ) ) {
if ( $product && taxonomy_exists( $attribute ) ) {
// Get terms if this is a taxonomy - ordered. We need the names too.
- $terms = wc_get_product_terms( $product->get_id(), $attribute, array(
- 'fields' => 'all',
- ) );
+ $terms = wc_get_product_terms(
+ $product->get_id(),
+ $attribute,
+ array(
+ 'fields' => 'all',
+ )
+ );
foreach ( $terms as $term ) {
if ( in_array( $term->slug, $options, true ) ) {
- $html .= 'slug, false ) . '>' . esc_html( apply_filters( 'woocommerce_variation_option_name', $term->name ) ) . ' ';
+ $html .= 'slug, false ) . '>' . esc_html( apply_filters( 'woocommerce_variation_option_name', $term->name, $term, $attribute, $product ) ) . ' ';
}
}
} else {
foreach ( $options as $option ) {
// This handles < 2.4.0 bw compatibility where text attributes were not sanitized.
$selected = sanitize_title( $args['selected'] ) === $args['selected'] ? selected( $args['selected'], sanitize_title( $option ), false ) : selected( $args['selected'], $option, false );
- $html .= '' . esc_html( apply_filters( 'woocommerce_variation_option_name', $option ) ) . ' ';
+ $html .= '' . esc_html( apply_filters( 'woocommerce_variation_option_name', $option, null, $attribute, $product ) ) . ' ';
}
}
}
@@ -2846,9 +2949,12 @@ if ( ! function_exists( 'woocommerce_account_content' ) ) {
}
// No endpoint found? Default to dashboard.
- wc_get_template( 'myaccount/dashboard.php', array(
- 'current_user' => get_user_by( 'id', get_current_user_id() ),
- ) );
+ wc_get_template(
+ 'myaccount/dashboard.php',
+ array(
+ 'current_user' => get_user_by( 'id', get_current_user_id() ),
+ )
+ );
}
}
@@ -2871,11 +2977,16 @@ if ( ! function_exists( 'woocommerce_account_orders' ) ) {
*/
function woocommerce_account_orders( $current_page ) {
$current_page = empty( $current_page ) ? 1 : absint( $current_page );
- $customer_orders = wc_get_orders( apply_filters( 'woocommerce_my_account_my_orders_query', array(
- 'customer' => get_current_user_id(),
- 'page' => $current_page,
- 'paginate' => true,
- ) ) );
+ $customer_orders = wc_get_orders(
+ apply_filters(
+ 'woocommerce_my_account_my_orders_query',
+ array(
+ 'customer' => get_current_user_id(),
+ 'page' => $current_page,
+ 'paginate' => true,
+ )
+ )
+ );
wc_get_template(
'myaccount/orders.php',
@@ -2989,17 +3100,23 @@ if ( ! function_exists( 'wc_get_email_order_items' ) ) {
$args = wp_parse_args( $args, $defaults );
$template = $args['plain_text'] ? 'emails/plain/email-order-items.php' : 'emails/email-order-items.php';
- wc_get_template( $template, apply_filters( 'woocommerce_email_order_items_args', array(
- 'order' => $order,
- 'items' => $order->get_items(),
- 'show_download_links' => $order->is_download_permitted() && ! $args['sent_to_admin'],
- 'show_sku' => $args['show_sku'],
- 'show_purchase_note' => $order->is_paid() && ! $args['sent_to_admin'],
- 'show_image' => $args['show_image'],
- 'image_size' => $args['image_size'],
- 'plain_text' => $args['plain_text'],
- 'sent_to_admin' => $args['sent_to_admin'],
- ) ) );
+ wc_get_template(
+ $template,
+ apply_filters(
+ 'woocommerce_email_order_items_args',
+ array(
+ 'order' => $order,
+ 'items' => $order->get_items(),
+ 'show_download_links' => $order->is_download_permitted() && ! $args['sent_to_admin'],
+ 'show_sku' => $args['show_sku'],
+ 'show_purchase_note' => $order->is_paid() && ! $args['sent_to_admin'],
+ 'show_image' => $args['show_image'],
+ 'image_size' => $args['image_size'],
+ 'plain_text' => $args['plain_text'],
+ 'sent_to_admin' => $args['sent_to_admin'],
+ )
+ )
+ );
return apply_filters( 'woocommerce_email_order_items_table', ob_get_clean(), $order );
}
@@ -3017,17 +3134,22 @@ if ( ! function_exists( 'wc_display_item_meta' ) ) {
function wc_display_item_meta( $item, $args = array() ) {
$strings = array();
$html = '';
- $args = wp_parse_args( $args, array(
- 'before' => '',
- 'separator' => '
',
- 'echo' => true,
- 'autop' => false,
- ) );
+ $args = wp_parse_args(
+ $args,
+ array(
+ 'before' => '',
+ 'separator' => ' ',
+ 'echo' => true,
+ 'autop' => false,
+ 'label_before' => '',
+ 'label_after' => ': ',
+ )
+ );
foreach ( $item->get_formatted_meta_data() as $meta_id => $meta ) {
$value = $args['autop'] ? wp_kses_post( $meta->display_value ) : wp_kses_post( make_clickable( trim( $meta->display_value ) ) );
- $strings[] = '' . wp_kses_post( $meta->display_key ) . ': ' . $value;
+ $strings[] = $args['label_before'] . wp_kses_post( $meta->display_key ) . $args['label_after'] . $value;
}
if ( $strings ) {
@@ -3056,13 +3178,16 @@ if ( ! function_exists( 'wc_display_item_downloads' ) ) {
function wc_display_item_downloads( $item, $args = array() ) {
$strings = array();
$html = '';
- $args = wp_parse_args( $args, array(
- 'before' => '',
- 'separator' => ' ',
- 'echo' => true,
- 'show_url' => false,
- ) );
+ $args = wp_parse_args(
+ $args,
+ array(
+ 'before' => '',
+ 'separator' => ' ',
+ 'echo' => true,
+ 'show_url' => false,
+ )
+ );
$downloads = is_object( $item ) && $item->is_type( 'line_item' ) ? $item->get_item_downloads() : array();
@@ -3114,11 +3239,14 @@ if ( ! function_exists( 'woocommerce_photoswipe' ) ) {
* @param WC_Product $product Product Object.
*/
function wc_display_product_attributes( $product ) {
- wc_get_template( 'single-product/product-attributes.php', array(
- 'product' => $product,
- 'attributes' => array_filter( $product->get_attributes(), 'wc_attributes_array_filter_visible' ),
- 'display_dimensions' => apply_filters( 'wc_product_enable_dimensions_display', $product->has_weight() || $product->has_dimensions() ),
- ) );
+ wc_get_template(
+ 'single-product/product-attributes.php',
+ array(
+ 'product' => $product,
+ 'attributes' => array_filter( $product->get_attributes(), 'wc_attributes_array_filter_visible' ),
+ 'display_dimensions' => apply_filters( 'wc_product_enable_dimensions_display', $product->has_weight() || $product->has_dimensions() ),
+ )
+ );
}
/**
@@ -3135,11 +3263,14 @@ function wc_get_stock_html( $product ) {
if ( ! empty( $availability['availability'] ) ) {
ob_start();
- wc_get_template( 'single-product/stock.php', array(
- 'product' => $product,
- 'class' => $availability['class'],
- 'availability' => $availability['availability'],
- ) );
+ wc_get_template(
+ 'single-product/stock.php',
+ array(
+ 'product' => $product,
+ 'class' => $availability['class'],
+ 'availability' => $availability['availability'],
+ )
+ );
$html = ob_get_clean();
}
@@ -3275,7 +3406,7 @@ function wc_get_formatted_cart_item_data( $cart_item, $flat = false ) {
$label = wc_attribute_label( $taxonomy );
} else {
// If this is a custom option slug, get the options name.
- $value = apply_filters( 'woocommerce_variation_option_name', $value );
+ $value = apply_filters( 'woocommerce_variation_option_name', $value, null, $taxonomy, $cart_item['data'] );
$label = wc_attribute_label( str_replace( 'attribute_', '', $name ), $cart_item['data'] );
}
diff --git a/includes/wc-template-hooks.php b/includes/wc-template-hooks.php
index 7502d943da8..2964a9240ed 100644
--- a/includes/wc-template-hooks.php
+++ b/includes/wc-template-hooks.php
@@ -292,10 +292,14 @@ add_action( 'woocommerce_register_form', 'wc_registration_privacy_policy_text',
/**
* Notices.
*/
-add_action( 'woocommerce_cart_is_empty', 'woocommerce_output_all_notices', 10 );
+add_action( 'woocommerce_cart_is_empty', 'woocommerce_output_all_notices', 5 );
add_action( 'woocommerce_shortcode_before_product_cat_loop', 'woocommerce_output_all_notices', 10 );
add_action( 'woocommerce_before_shop_loop', 'woocommerce_output_all_notices', 10 );
add_action( 'woocommerce_before_single_product', 'woocommerce_output_all_notices', 10 );
add_action( 'woocommerce_before_cart', 'woocommerce_output_all_notices', 10 );
+add_action( 'woocommerce_before_checkout_form_cart_notices', 'woocommerce_output_all_notices', 10 );
add_action( 'woocommerce_before_checkout_form', 'woocommerce_output_all_notices', 10 );
add_action( 'woocommerce_account_content', 'woocommerce_output_all_notices', 10 );
+add_action( 'woocommerce_before_customer_login_form', 'woocommerce_output_all_notices', 10 );
+add_action( 'woocommerce_before_lost_password_form', 'woocommerce_output_all_notices', 10 );
+add_action( 'before_woocommerce_pay', 'woocommerce_output_all_notices', 10 );
diff --git a/includes/wc-term-functions.php b/includes/wc-term-functions.php
index 96373a04f18..b355509a872 100644
--- a/includes/wc-term-functions.php
+++ b/includes/wc-term-functions.php
@@ -51,9 +51,7 @@ function _wc_get_cached_product_terms( $product_id, $taxonomy, $args = array() )
return $terms;
}
- // @codingStandardsIgnoreStart
$terms = wp_get_post_terms( $product_id, $taxonomy, $args );
- // @codingStandardsIgnoreEnd
wp_cache_add( $cache_key, $terms, $cache_group );
@@ -482,6 +480,12 @@ function wc_terms_clauses( $clauses, $taxonomies, $args ) {
foreach ( (array) $taxonomies as $taxonomy ) {
if ( taxonomy_is_product_attribute( $taxonomy ) || in_array( $taxonomy, apply_filters( 'woocommerce_sortable_taxonomies', array( 'product_cat' ) ), true ) ) {
+
+ // Don't modify the orderby when we're ordering attributes by name.
+ if ( taxonomy_is_product_attribute( $taxonomy ) && 'name' === wc_attribute_orderby( $taxonomy ) ) {
+ return $clauses;
+ }
+
$found = true;
break;
}
@@ -537,7 +541,7 @@ add_filter( 'terms_clauses', 'wc_terms_clauses', 99, 3 );
* Function for recounting product terms, ignoring hidden products.
*
* @param array $terms List of terms.
- * @param string $taxonomy Taxonomy.
+ * @param object $taxonomy Taxonomy.
* @param bool $callback Callback.
* @param bool $terms_are_term_taxonomy_ids If terms are from term_taxonomy_id column.
*/
diff --git a/includes/wc-update-functions.php b/includes/wc-update-functions.php
index 77ed46f25f9..e1963404bfe 100644
--- a/includes/wc-update-functions.php
+++ b/includes/wc-update-functions.php
@@ -317,7 +317,8 @@ function wc_update_200_line_items() {
}
$item_id = wc_add_order_item(
- $order_tax_row->post_id, array(
+ $order_tax_row->post_id,
+ array(
'order_item_name' => $order_tax['label'],
'order_item_type' => 'tax',
)
@@ -737,22 +738,23 @@ function wc_update_240_shipping_methods() {
foreach ( $shipping_methods as $flat_rate_option_key => $shipping_method ) {
// Stop this running more than once if routine is repeated.
if ( version_compare( $shipping_method->get_option( 'version', 0 ), '2.4.0', '<' ) ) {
- $has_classes = count( WC()->shipping->get_shipping_classes() ) > 0;
- $cost_key = $has_classes ? 'no_class_cost' : 'cost';
- $min_fee = $shipping_method->get_option( 'minimum_fee' );
- $math_cost_strings = array(
+ $shipping_classes = WC()->shipping()->get_shipping_classes();
+ $has_classes = count( $shipping_classes ) > 0;
+ $cost_key = $has_classes ? 'no_class_cost': 'cost';
+ $min_fee = $shipping_method->get_option( 'minimum_fee' );
+ $math_cost_strings = array(
'cost' => array(),
'no_class_cost' => array(),
);
$math_cost_strings[ $cost_key ][] = $shipping_method->get_option( 'cost' );
- $fee = $shipping_method->get_option( 'fee' );
+ $fee = $shipping_method->get_option( 'fee' );
if ( $fee ) {
$math_cost_strings[ $cost_key ][] = strstr( $fee, '%' ) ? '[fee percent="' . str_replace( '%', '', $fee ) . '" min="' . esc_attr( $min_fee ) . '"]' : $fee;
}
- foreach ( WC()->shipping->get_shipping_classes() as $shipping_class ) {
+ foreach ( $shipping_classes as $shipping_class ) {
$rate_key = 'class_cost_' . $shipping_class->slug;
$math_cost_strings[ $rate_key ] = $math_cost_strings['no_class_cost'];
}
@@ -1087,7 +1089,8 @@ function wc_update_260_zone_methods() {
// Move data.
foreach ( $old_methods as $old_method ) {
$wpdb->insert(
- $wpdb->prefix . 'woocommerce_shipping_zone_methods', array(
+ $wpdb->prefix . 'woocommerce_shipping_zone_methods',
+ array(
'zone_id' => $old_method->zone_id,
'method_id' => $old_method->shipping_method_type,
'method_order' => $old_method->shipping_method_order,
@@ -1422,7 +1425,8 @@ function wc_update_320_mexican_states() {
SET meta_value = %s
WHERE meta_key IN ( '_billing_state', '_shipping_state' )
AND meta_value = %s",
- $new, $old
+ $new,
+ $old
)
);
$wpdb->update(
@@ -1511,11 +1515,13 @@ function wc_update_330_webhooks() {
'pending' => 'disabled',
);
- $posts = get_posts( array(
- 'posts_per_page' => -1,
- 'post_type' => 'shop_webhook',
- 'post_status' => 'any',
- ) );
+ $posts = get_posts(
+ array(
+ 'posts_per_page' => -1,
+ 'post_type' => 'shop_webhook',
+ 'post_status' => 'any',
+ )
+ );
foreach ( $posts as $post ) {
$webhook = new WC_Webhook();
@@ -1544,19 +1550,22 @@ function wc_update_330_set_default_product_cat() {
$default_category = get_option( 'default_product_cat', 0 );
if ( $default_category ) {
- $result = $wpdb->query( $wpdb->prepare( "
- INSERT INTO {$wpdb->term_relationships} (object_id, term_taxonomy_id)
- SELECT DISTINCT posts.ID, %s FROM {$wpdb->posts} posts
- LEFT JOIN
- (
- SELECT object_id FROM {$wpdb->term_relationships} term_relationships
- LEFT JOIN {$wpdb->term_taxonomy} term_taxonomy ON term_relationships.term_taxonomy_id = term_taxonomy.term_taxonomy_id
- WHERE term_taxonomy.taxonomy = 'product_cat'
- ) AS tax_query
- ON posts.ID = tax_query.object_id
- WHERE posts.post_type = 'product'
- AND tax_query.object_id IS NULL
- ", $default_category ) );
+ $result = $wpdb->query(
+ $wpdb->prepare(
+ "INSERT INTO {$wpdb->term_relationships} (object_id, term_taxonomy_id)
+ SELECT DISTINCT posts.ID, %s FROM {$wpdb->posts} posts
+ LEFT JOIN
+ (
+ SELECT object_id FROM {$wpdb->term_relationships} term_relationships
+ LEFT JOIN {$wpdb->term_taxonomy} term_taxonomy ON term_relationships.term_taxonomy_id = term_taxonomy.term_taxonomy_id
+ WHERE term_taxonomy.taxonomy = 'product_cat'
+ ) AS tax_query
+ ON posts.ID = tax_query.object_id
+ WHERE posts.post_type = 'product'
+ AND tax_query.object_id IS NULL",
+ $default_category
+ )
+ );
wp_cache_flush();
delete_transient( 'wc_term_counts' );
wp_update_term_count_now( array( $default_category ), 'product_cat' );
@@ -1576,16 +1585,19 @@ function wc_update_330_product_stock_status() {
$min_stock_amount = (int) get_option( 'woocommerce_notify_no_stock_amount', 0 );
// Get all products that have stock management enabled, stock less than or equal to min stock amount, and backorders enabled.
- $post_ids = $wpdb->get_col( $wpdb->prepare( "
- SELECT t1.post_id FROM $wpdb->postmeta t1
- INNER JOIN $wpdb->postmeta t2
- ON t1.post_id = t2.post_id
- AND t1.meta_key = '_manage_stock' AND t1.meta_value = 'yes'
- AND t2.meta_key = '_stock' AND t2.meta_value <= %d
- INNER JOIN $wpdb->postmeta t3
- ON t2.post_id = t3.post_id
- AND t3.meta_key = '_backorders' AND ( t3.meta_value = 'yes' OR t3.meta_value = 'notify' )
- ", $min_stock_amount ) ); // WPCS: db call ok, unprepared SQL ok, cache ok.
+ $post_ids = $wpdb->get_col(
+ $wpdb->prepare(
+ "SELECT t1.post_id FROM $wpdb->postmeta t1
+ INNER JOIN $wpdb->postmeta t2
+ ON t1.post_id = t2.post_id
+ AND t1.meta_key = '_manage_stock' AND t1.meta_value = 'yes'
+ AND t2.meta_key = '_stock' AND t2.meta_value <= %d
+ INNER JOIN $wpdb->postmeta t3
+ ON t2.post_id = t3.post_id
+ AND t3.meta_key = '_backorders' AND ( t3.meta_value = 'yes' OR t3.meta_value = 'notify' )",
+ $min_stock_amount
+ )
+ ); // WPCS: db call ok, unprepared SQL ok, cache ok.
if ( empty( $post_ids ) ) {
return;
@@ -1594,11 +1606,11 @@ function wc_update_330_product_stock_status() {
$post_ids = array_map( 'absint', $post_ids );
// Set the status to onbackorder for those products.
- $wpdb->query( "
- UPDATE $wpdb->postmeta
+ $wpdb->query(
+ "UPDATE $wpdb->postmeta
SET meta_value = 'onbackorder'
- WHERE meta_key = '_stock_status' AND post_id IN ( " . implode( ',', $post_ids ) . ' )
- ' ); // WPCS: db call ok, unprepared SQL ok, cache ok.
+ WHERE meta_key = '_stock_status' AND post_id IN ( " . implode( ',', $post_ids ) . ' )'
+ ); // WPCS: db call ok, unprepared SQL ok, cache ok.
}
/**
@@ -1737,7 +1749,8 @@ function wc_update_340_state() {
SET meta_value = %s
WHERE meta_key IN ( '_billing_state', '_shipping_state' )
AND meta_value = %s",
- $new, $old
+ $new,
+ $old
)
);
$wpdb->update(
@@ -1811,18 +1824,18 @@ function wc_update_340_db_version() {
function wc_update_343_cleanup_foreign_keys() {
global $wpdb;
- $results = $wpdb->get_results( "
- SELECT CONSTRAINT_NAME
+ $results = $wpdb->get_results(
+ "SELECT CONSTRAINT_NAME
FROM information_schema.TABLE_CONSTRAINTS
WHERE CONSTRAINT_SCHEMA = '{$wpdb->dbname}'
AND CONSTRAINT_NAME LIKE '%wc_download_log_ib%'
AND CONSTRAINT_TYPE = 'FOREIGN KEY'
- AND TABLE_NAME = '{$wpdb->prefix}wc_download_log'
- " );
+ AND TABLE_NAME = '{$wpdb->prefix}wc_download_log'"
+ );
if ( $results ) {
foreach ( $results as $fk ) {
- $wpdb->query( "ALTER TABLE {$wpdb->prefix}wc_download_log DROP FOREIGN KEY {$fk->CONSTRAINT_NAME}" ); // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
+ $wpdb->query( "ALTER TABLE {$wpdb->prefix}wc_download_log DROP FOREIGN KEY {$fk->CONSTRAINT_NAME}" ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
}
}
}
@@ -1856,123 +1869,14 @@ function wc_update_344_db_version() {
}
/**
- * Copy order customer_id from post meta to post_author and set post_author to 0 for refunds.
- *
- * Two different strategies are used to copy data depending if the update is being executed from
- * the command line or not. If `wp wc update` is used to update the database, this function
- * copies data in a single go that is faster but uses more resources. If the databse update was
- * triggered from the wp-admin, this function copies data in batches which is slower but uses
- * few resources and thus is less likely to fail on smaller servers.
- *
- * @param WC_Background_Updater|false $updater Background updater instance or false if function is called from `wp wc update` WP-CLI command.
- * @return true|void Return true if near memory limit and needs to restart. Return void if update completed.
+ * Set the comment type to 'review' for product reviews that don't have a comment type.
*/
-function wc_update_350_order_customer_id( $updater = false ) {
+function wc_update_350_reviews_comment_type() {
global $wpdb;
- $post_types = (array) apply_filters( 'woocommerce_update_350_order_customer_id_post_types', array( 'shop_order' ) );
- $post_types_placeholders = implode( ', ', array_fill( 0, count( $post_types ), '%s' ) );
-
- if ( defined( 'WP_CLI' ) && WP_CLI ) {
- // If running the update from the command-line, copy data in a single go which is faster but uses more resources.
- $wpdb->query(
- 'CREATE TEMPORARY TABLE customers_map (post_id BIGINT(20), customer_id BIGINT(20), PRIMARY KEY(post_id))'
- );
-
- $wpdb->query(
- "INSERT IGNORE INTO customers_map (SELECT post_id, meta_value FROM {$wpdb->prefix}postmeta WHERE meta_key = '_customer_user')"
- );
-
- $wpdb->query( 'SET sql_safe_updates=1' );
-
- $wpdb->query(
- $wpdb->prepare(
- "UPDATE {$wpdb->prefix}posts JOIN customers_map ON {$wpdb->prefix}posts.ID = customers_map.post_id SET {$wpdb->prefix}posts.post_author = customers_map.customer_id WHERE post_type IN ({$post_types_placeholders})", // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
- $post_types
- )
- );
-
- $wpdb->update( $wpdb->posts, array( 'post_author' => 0 ), array( 'post_type' => 'shop_order_refund' ) );
- } else {
- // If running the update from the wp-admin, copy data in batches being careful not to use more memory than allowed.
- $admin_orders_sql = '';
- $admin_orders = get_transient( 'wc_update_350_admin_orders' );
-
- if ( false === $admin_orders ) {
- // Get the list of orders that we don't want to change as they belong to user ID 1.
- $admin_orders = $wpdb->get_col(
- $wpdb->prepare(
- "SELECT ID FROM {$wpdb->prefix}posts p
- INNER JOIN {$wpdb->prefix}postmeta pm ON p.ID = pm.post_id
- WHERE post_type IN ({$post_types_placeholders}) AND meta_key = '_customer_user' AND meta_value = 1", // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
- $post_types
- )
- );
-
- // Cache the list of orders placed by the user ID 1 as to large stores this query can be slow.
- set_transient( 'wc_update_350_admin_orders', $admin_orders, DAY_IN_SECONDS );
- }
-
- if ( ! empty( $admin_orders ) ) {
- $admin_orders_sql .= ' AND ID NOT IN (' . implode( ', ', $admin_orders ) . ') ';
- }
-
- // Query to get a batch of orders IDs to change.
- $query = $wpdb->prepare(
- // phpcs:disable WordPress.WP.PreparedSQL.NotPrepared
- "SELECT ID FROM {$wpdb->posts}
- WHERE post_author = 1 AND post_type IN ({$post_types_placeholders}) $admin_orders_sql
- LIMIT 1000",
- $post_types
- // phpcs:enable
- );
-
- while ( true ) {
- // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
- $orders_to_update = $wpdb->get_col( $query );
-
- // Exit loop if no more orders to update.
- if ( ! $orders_to_update ) {
- break;
- }
-
- $orders_meta_data = $wpdb->get_results(
- // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
- "SELECT post_id, meta_value as customer_id FROM {$wpdb->postmeta} WHERE meta_key = '_customer_user' AND post_id IN (" . implode( ', ', $orders_to_update ) . ')'
- );
-
- // Exit loop if no _customer_user metas exist for the list of orders to update.
- if ( ! $orders_meta_data ) {
- break;
- }
-
- // Update post_author for a batch of orders.
- foreach ( $orders_meta_data as $order_meta ) {
- // Stop update execution and re-enqueue it if near memory limit.
- if ( $updater instanceof WC_Background_Updater && $updater->is_memory_exceeded() ) {
- return true;
- }
-
- $wpdb->update( $wpdb->posts, array( 'post_author' => $order_meta->customer_id ), array( 'ID' => $order_meta->post_id ) );
- }
- }
-
- // Set post_author to 0 instead of 1 on all shop_order_refunds.
- while ( true ) {
- // Stop update execution and re-enqueue it if near memory limit.
- if ( $updater instanceof WC_Background_Updater && $updater->is_memory_exceeded() ) {
- return true;
- }
-
- $updated_rows = $wpdb->query( "UPDATE {$wpdb->posts} SET post_author = 0 WHERE post_type = 'shop_order_refund' LIMIT 1000" );
-
- if ( ! $updated_rows ) {
- break;
- }
- }
- }
-
- wp_cache_flush();
+ $wpdb->query(
+ "UPDATE {$wpdb->prefix}comments JOIN {$wpdb->prefix}posts ON {$wpdb->prefix}posts.ID = {$wpdb->prefix}comments.comment_post_ID AND ( {$wpdb->prefix}posts.post_type = 'product' OR {$wpdb->prefix}posts.post_type = 'product_variation' ) SET {$wpdb->prefix}comments.comment_type = 'review' WHERE {$wpdb->prefix}comments.comment_type = ''"
+ );
}
/**
@@ -1981,3 +1885,25 @@ function wc_update_350_order_customer_id( $updater = false ) {
function wc_update_350_db_version() {
WC_Install::update_db_version( '3.5.0' );
}
+
+/**
+ * Drop the fk_wc_download_log_permission_id FK as we use a new one with the table and blog prefix for MS compatability.
+ *
+ * @return void
+ */
+function wc_update_352_drop_download_log_fk() {
+ global $wpdb;
+ $results = $wpdb->get_results(
+ "SELECT CONSTRAINT_NAME
+ FROM information_schema.TABLE_CONSTRAINTS
+ WHERE CONSTRAINT_SCHEMA = '{$wpdb->dbname}'
+ AND CONSTRAINT_NAME = 'fk_wc_download_log_permission_id'
+ AND CONSTRAINT_TYPE = 'FOREIGN KEY'
+ AND TABLE_NAME = '{$wpdb->prefix}wc_download_log'"
+ );
+
+ // We only need to drop the old key as WC_Install::create_tables() takes care of creating the new FK.
+ if ( $results ) {
+ $wpdb->query( "ALTER TABLE {$wpdb->prefix}wc_download_log DROP FOREIGN KEY fk_wc_download_log_permission_id" ); // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared
+ }
+}
diff --git a/includes/wc-user-functions.php b/includes/wc-user-functions.php
index 90dae915926..dc7f3ea616b 100644
--- a/includes/wc-user-functions.php
+++ b/includes/wc-user-functions.php
@@ -219,15 +219,11 @@ function wc_customer_bought_product( $customer_email, $user_id, $product_id ) {
$result = get_transient( $transient_name );
if ( false === $result ) {
- $customer_data = array();
+ $customer_data = array( $user_id );
if ( $user_id ) {
$user = get_user_by( 'id', $user_id );
- if ( version_compare( get_option( 'woocommerce_db_version' ), '3.5.0', '<' ) ) {
- $customer_data[] = $user_id;
- }
-
if ( isset( $user->user_email ) ) {
$customer_data[] = $user->user_email;
}
@@ -244,31 +240,19 @@ function wc_customer_bought_product( $customer_email, $user_id, $product_id ) {
return false;
}
- if ( version_compare( get_option( 'woocommerce_db_version' ), '3.5.0', '>=' ) && $user_id ) {
- // Since WC 3.5 wp_posts.post_author is used to store the ID of the customer who placed an order.
- $query = "SELECT im.meta_value FROM {$wpdb->posts} AS p
- INNER JOIN {$wpdb->postmeta} AS pm ON p.ID = pm.post_id
- INNER JOIN {$wpdb->prefix}woocommerce_order_items AS i ON p.ID = i.order_id
- INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS im ON i.order_item_id = im.order_item_id
- WHERE p.post_status IN ( 'wc-" . implode( "','wc-", $statuses ) . "' )
- AND p.post_author = {$user_id}
- AND pm.meta_key = '_billing_email'
- AND im.meta_key IN ( '_product_id', '_variation_id' )
- AND im.meta_value != 0
- AND pm.meta_value IN ( '" . implode( "','", $customer_data ) . "' )";
- } else {
- $query = "SELECT im.meta_value FROM {$wpdb->posts} AS p
- INNER JOIN {$wpdb->postmeta} AS pm ON p.ID = pm.post_id
- INNER JOIN {$wpdb->prefix}woocommerce_order_items AS i ON p.ID = i.order_id
- INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS im ON i.order_item_id = im.order_item_id
- WHERE p.post_status IN ( 'wc-" . implode( "','wc-", $statuses ) . "' )
- AND pm.meta_key IN ( '_billing_email', '_customer_user' )
- AND im.meta_key IN ( '_product_id', '_variation_id' )
- AND im.meta_value != 0
- AND pm.meta_value IN ( '" . implode( "','", $customer_data ) . "' )";
- }
-
- $result = $wpdb->get_col( $query ); // WPCS: unprepared SQL ok.
+ $result = $wpdb->get_col(
+ "
+ SELECT im.meta_value FROM {$wpdb->posts} AS p
+ INNER JOIN {$wpdb->postmeta} AS pm ON p.ID = pm.post_id
+ INNER JOIN {$wpdb->prefix}woocommerce_order_items AS i ON p.ID = i.order_id
+ INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS im ON i.order_item_id = im.order_item_id
+ WHERE p.post_status IN ( 'wc-" . implode( "','wc-", $statuses ) . "' )
+ AND pm.meta_key IN ( '_billing_email', '_customer_user' )
+ AND im.meta_key IN ( '_product_id', '_variation_id' )
+ AND im.meta_value != 0
+ AND pm.meta_value IN ( '" . implode( "','", $customer_data ) . "' )
+ "
+ ); // WPCS: unprepared SQL ok.
$result = array_map( 'absint', $result );
set_transient( $transient_name, $result, DAY_IN_SECONDS * 30 );
@@ -276,13 +260,43 @@ function wc_customer_bought_product( $customer_email, $user_id, $product_id ) {
return in_array( absint( $product_id ), $result, true );
}
+/**
+ * Checks if the current user has a role.
+ *
+ * @param string $role The role.
+ * @return bool
+ */
+function wc_current_user_has_role( $role ) {
+ return wc_user_has_role( wp_get_current_user(), $role );
+}
+
+/**
+ * Checks if a user has a role.
+ *
+ * @param int|\WP_User $user The user.
+ * @param string $role The role.
+ * @return bool
+ */
+function wc_user_has_role( $user, $role ) {
+ if ( ! is_object( $user ) ) {
+ $user = get_userdata( $user );
+ }
+
+ if ( ! $user || ! $user->exists() ) {
+ return false;
+ }
+
+ return in_array( $role, $user->roles, true );
+}
+
/**
* Checks if a user has a certain capability.
*
* @param array $allcaps All capabilities.
* @param array $caps Capabilities.
* @param array $args Arguments.
- * @return bool
+ *
+ * @return array The filtered array of all capabilities.
*/
function wc_customer_has_capability( $allcaps, $caps, $args ) {
if ( isset( $caps[0] ) ) {
@@ -349,9 +363,18 @@ add_filter( 'user_has_cap', 'wc_customer_has_capability', 10, 3 );
* @return array
*/
function wc_modify_editable_roles( $roles ) {
- if ( ! current_user_can( 'administrator' ) ) {
- unset( $roles['administrator'] );
+ if ( is_multisite() && is_super_admin() ) {
+ return $roles;
}
+ if ( ! wc_current_user_has_role( 'administrator' ) ) {
+ unset( $roles['administrator'] );
+
+ if ( wc_current_user_has_role( 'shop_manager' ) ) {
+ $shop_manager_editable_roles = apply_filters( 'woocommerce_shop_manager_editable_roles', array( 'customer' ) );
+ return array_intersect_key( $roles, array_flip( $shop_manager_editable_roles ) );
+ }
+ }
+
return $roles;
}
add_filter( 'editable_roles', 'wc_modify_editable_roles' );
@@ -368,6 +391,9 @@ add_filter( 'editable_roles', 'wc_modify_editable_roles' );
* @return array
*/
function wc_modify_map_meta_cap( $caps, $cap, $user_id, $args ) {
+ if ( is_multisite() && is_super_admin() ) {
+ return $caps;
+ }
switch ( $cap ) {
case 'edit_user':
case 'remove_user':
@@ -376,8 +402,17 @@ function wc_modify_map_meta_cap( $caps, $cap, $user_id, $args ) {
if ( ! isset( $args[0] ) || $args[0] === $user_id ) {
break;
} else {
- if ( user_can( $args[0], 'administrator' ) && ! current_user_can( 'administrator' ) ) {
- $caps[] = 'do_not_allow';
+ if ( ! wc_current_user_has_role( 'administrator' ) ) {
+ if ( wc_user_has_role( $args[0], 'administrator' ) ) {
+ $caps[] = 'do_not_allow';
+ } elseif ( wc_current_user_has_role( 'shop_manager' ) ) {
+ // Shop managers can only edit customer info.
+ $userdata = get_userdata( $args[0] );
+ $shop_manager_editable_roles = apply_filters( 'woocommerce_shop_manager_editable_roles', array( 'customer' ) );
+ if ( property_exists( $userdata, 'roles' ) && ! empty( $userdata->roles ) && ! array_intersect( $userdata->roles, $shop_manager_editable_roles ) ) {
+ $caps[] = 'do_not_allow';
+ }
+ }
}
}
break;
@@ -511,7 +546,7 @@ function wc_get_customer_order_count( $user_id ) {
}
/**
- * Reset customer ID on orders when a user is deleted.
+ * Reset _customer_user on orders when a user is deleted.
*
* @param int $user_id User ID.
*/
@@ -524,22 +559,6 @@ function wc_reset_order_customer_id_on_deleted_user( $user_id ) {
'meta_value' => $user_id,
)
); // WPCS: slow query ok.
-
- $post_types = (array) apply_filters( 'woocommerce_reset_order_customer_id_post_types', array( 'shop_order' ) );
- $post_types_placeholders = implode( ', ', array_fill( 0, count( $post_types ), '%s' ) );
- $query_args = array_merge( $post_types, array( $user_id ) );
-
- // Since WC 3.5, the customer ID is stored both in the _customer_user postmeta and in the post_author field.
- // In future versions of WC, the plan is to use only post_author and stop using _customer_user, but for now
- // we have to update both places.
- $wpdb->query(
- // phpcs:disable WordPress.WP.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
- $wpdb->prepare(
- "UPDATE {$wpdb->posts} SET `post_author` = 0 WHERE post_type IN ({$post_types_placeholders}) AND post_author = %d",
- $query_args
- )
- // phpcs:enable
- );
}
add_action( 'deleted_user', 'wc_reset_order_customer_id_on_deleted_user' );
diff --git a/includes/wc-webhook-functions.php b/includes/wc-webhook-functions.php
index 23361fb976c..cb28a25613c 100644
--- a/includes/wc-webhook-functions.php
+++ b/includes/wc-webhook-functions.php
@@ -20,8 +20,17 @@ function wc_webhook_process_delivery( $webhook, $arg ) {
// so as to avoid delays or failures in delivery from affecting the
// user who triggered it.
if ( apply_filters( 'woocommerce_webhook_deliver_async', true, $webhook, $arg ) ) {
- // Deliver in background.
- WC()->queue()->add( 'woocommerce_deliver_webhook_async', array( 'webhook_id' => $webhook->get_id(), 'arg' => $arg ), 'woocommerce-webhooks' );
+ $queue_args = array(
+ 'webhook_id' => $webhook->get_id(),
+ 'arg' => $arg,
+ );
+
+ $next_scheduled_date = WC()->queue()->get_next( 'woocommerce_deliver_webhook_async', $queue_args, 'woocommerce-webhooks' );
+
+ // Make webhooks unique - only schedule one webhook every 10 minutes to maintain backward compatibility with WP Cron behaviour seen in WC < 3.5.0.
+ if ( is_null( $next_scheduled_date ) || $next_scheduled_date->getTimestamp() >= ( 600 + gmdate( 'U' ) ) ) {
+ WC()->queue()->add( 'woocommerce_deliver_webhook_async', $queue_args, 'woocommerce-webhooks' );
+ }
} else {
// Deliver immediately.
$webhook->deliver( $arg );
@@ -55,6 +64,15 @@ add_action( 'woocommerce_deliver_webhook_async', 'wc_deliver_webhook_async', 10,
* @return bool
*/
function wc_is_webhook_valid_topic( $topic ) {
+ $invalid_topics = array(
+ 'action.woocommerce_login_credentials',
+ 'action.woocommerce_product_csv_importer_check_import_file_path',
+ 'action.woocommerce_webhook_should_deliver',
+ );
+
+ if ( in_array( $topic, $invalid_topics, true ) ) {
+ return false;
+ }
// Custom topics are prefixed with woocommerce_ or wc_ are valid.
if ( 0 === strpos( $topic, 'action.woocommerce_' ) || 0 === strpos( $topic, 'action.wc_' ) ) {
@@ -77,6 +95,17 @@ function wc_is_webhook_valid_topic( $topic ) {
return false;
}
+/**
+ * Check if given status is a valid webhook status.
+ *
+ * @since 3.5.3
+ * @param string $status Status to check.
+ * @return bool
+ */
+function wc_is_webhook_valid_status( $status ) {
+ return in_array( $status, array_keys( wc_get_webhook_statuses() ), true );
+}
+
/**
* Get Webhook statuses.
*
@@ -84,11 +113,14 @@ function wc_is_webhook_valid_topic( $topic ) {
* @return array
*/
function wc_get_webhook_statuses() {
- return apply_filters( 'woocommerce_webhook_statuses', array(
- 'active' => __( 'Active', 'woocommerce' ),
- 'paused' => __( 'Paused', 'woocommerce' ),
- 'disabled' => __( 'Disabled', 'woocommerce' ),
- ) );
+ return apply_filters(
+ 'woocommerce_webhook_statuses',
+ array(
+ 'active' => __( 'Active', 'woocommerce' ),
+ 'paused' => __( 'Paused', 'woocommerce' ),
+ 'disabled' => __( 'Disabled', 'woocommerce' ),
+ )
+ );
}
/**
@@ -124,3 +156,17 @@ function wc_get_webhook( $id ) {
return 0 !== $webhook->get_id() ? $webhook : null;
}
+
+/**
+ * Get webhoook REST API versions.
+ *
+ * @since 3.5.1
+ * @return array
+ */
+function wc_get_webhook_rest_api_versions() {
+ return array(
+ 'wp_api_v1',
+ 'wp_api_v2',
+ 'wp_api_v3',
+ );
+}
diff --git a/includes/widgets/class-wc-widget-layered-nav.php b/includes/widgets/class-wc-widget-layered-nav.php
index 55618988d58..7360e28dfdb 100644
--- a/includes/widgets/class-wc-widget-layered-nav.php
+++ b/includes/widgets/class-wc-widget-layered-nav.php
@@ -293,7 +293,7 @@ class WC_Widget_Layered_Nav extends WC_Widget {
if ( jQuery().selectWoo ) {
var wc_layered_nav_select = function() {
jQuery( '.dropdown_layered_nav_" . esc_js( $taxonomy_filter_name ) . "' ).selectWoo( {
- placeholder: '" . esc_js( $any_label ) . "',
+ placeholder: " . wp_json_encode( (string) wp_specialchars_decode( $any_label ) ) . ",
minimumResultsForSearch: 5,
width: '100%',
allowClear: " . ( $multiple ? 'false' : 'true' ) . ",
@@ -373,7 +373,7 @@ class WC_Widget_Layered_Nav extends WC_Widget {
// Maybe store a transient of the count values.
$cache = apply_filters( 'woocommerce_layered_nav_count_maybe_cache', true );
if ( true === $cache ) {
- $cached_counts = (array) get_transient( 'wc_layered_nav_counts_' . $taxonomy );
+ $cached_counts = (array) get_transient( 'wc_layered_nav_counts_' . sanitize_title( $taxonomy ) );
} else {
$cached_counts = array();
}
@@ -383,7 +383,7 @@ class WC_Widget_Layered_Nav extends WC_Widget {
$counts = array_map( 'absint', wp_list_pluck( $results, 'term_count', 'term_count_id' ) );
$cached_counts[ $query_hash ] = $counts;
if ( true === $cache ) {
- set_transient( 'wc_layered_nav_counts_' . $taxonomy, $cached_counts, DAY_IN_SECONDS );
+ set_transient( 'wc_layered_nav_counts_' . sanitize_title( $taxonomy ), $cached_counts, DAY_IN_SECONDS );
}
}
diff --git a/includes/widgets/class-wc-widget-price-filter.php b/includes/widgets/class-wc-widget-price-filter.php
index 45f41b90bcb..c445de07c91 100644
--- a/includes/widgets/class-wc-widget-price-filter.php
+++ b/includes/widgets/class-wc-widget-price-filter.php
@@ -66,7 +66,7 @@ class WC_Widget_Price_Filter extends WC_Widget {
return;
}
- if ( ! wc()->query->get_main_query()->post_count ) {
+ if ( ! WC()->query->get_main_query()->post_count ) {
return;
}
@@ -119,7 +119,7 @@ class WC_Widget_Price_Filter extends WC_Widget {
protected function get_filtered_price() {
global $wpdb;
- $args = wc()->query->get_main_query()->query_vars;
+ $args = WC()->query->get_main_query()->query_vars;
$tax_query = isset( $args['tax_query'] ) ? $args['tax_query'] : array();
$meta_query = isset( $args['meta_query'] ) ? $args['meta_query'] : array();
diff --git a/includes/widgets/class-wc-widget-products.php b/includes/widgets/class-wc-widget-products.php
index d3e5334594a..a9be009e918 100644
--- a/includes/widgets/class-wc-widget-products.php
+++ b/includes/widgets/class-wc-widget-products.php
@@ -83,8 +83,9 @@ class WC_Widget_Products extends WC_Widget {
/**
* Query the products and return them.
*
- * @param array $args Arguments.
- * @param array $instance Widget instance.
+ * @param array $args Arguments.
+ * @param array $instance Widget instance.
+ *
* @return WP_Query
*/
public function get_products( $args, $instance ) {
@@ -126,7 +127,7 @@ class WC_Widget_Products extends WC_Widget {
}
if ( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) ) {
- $query_args['tax_query'] = array(
+ $query_args['tax_query'][] = array(
array(
'taxonomy' => 'product_visibility',
'field' => 'term_taxonomy_id',
@@ -173,10 +174,10 @@ class WC_Widget_Products extends WC_Widget {
/**
* Output widget.
*
- * @see WP_Widget
- *
* @param array $args Arguments.
* @param array $instance Widget instance.
+ *
+ * @see WP_Widget
*/
public function widget( $args, $instance ) {
if ( $this->get_cached_widget( $args ) ) {
diff --git a/includes/widgets/class-wc-widget-rating-filter.php b/includes/widgets/class-wc-widget-rating-filter.php
index b9601cc9d64..3a64f15e404 100644
--- a/includes/widgets/class-wc-widget-rating-filter.php
+++ b/includes/widgets/class-wc-widget-rating-filter.php
@@ -91,7 +91,7 @@ class WC_Widget_Rating_Filter extends WC_Widget {
return;
}
- if ( ! wc()->query->get_main_query()->post_count ) {
+ if ( ! WC()->query->get_main_query()->post_count ) {
return;
}
@@ -121,7 +121,14 @@ class WC_Widget_Rating_Filter extends WC_Widget {
$class = in_array( $rating, $rating_filter, true ) ? 'wc-layered-nav-rating chosen' : 'wc-layered-nav-rating';
$link = apply_filters( 'woocommerce_rating_filter_link', $link_ratings ? add_query_arg( 'rating_filter', $link_ratings ) : remove_query_arg( 'rating_filter' ) );
$rating_html = wc_get_star_rating_html( $rating );
- $count_html = esc_html( apply_filters( 'woocommerce_rating_filter_count', "({$count})", $count, $rating ) );
+ $count_html = wp_kses(
+ apply_filters( 'woocommerce_rating_filter_count', "({$count})", $count, $rating ),
+ array(
+ 'em' => array(),
+ 'span' => array(),
+ 'strong' => array(),
+ )
+ );
printf( ' %s %s ', esc_attr( $class ), esc_url( $link ), $rating_html, $count_html ); // WPCS: XSS ok.
}
diff --git a/package-lock.json b/package-lock.json
index 4fc6f7913f9..d6cb8f64553 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,35 +1,229 @@
{
"name": "woocommerce",
- "version": "3.4.0",
+ "version": "3.5.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@babel/code-frame": {
- "version": "7.0.0-beta.49",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.49.tgz",
- "integrity": "sha1-vs2AVIJzREDJ0TfkbXc0DmTX9Rs=",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
"dev": true,
"requires": {
- "@babel/highlight": "7.0.0-beta.49"
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/core": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.2.2.tgz",
+ "integrity": "sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "@babel/generator": "^7.2.2",
+ "@babel/helpers": "^7.2.0",
+ "@babel/parser": "^7.2.2",
+ "@babel/template": "^7.2.2",
+ "@babel/traverse": "^7.2.2",
+ "@babel/types": "^7.2.2",
+ "convert-source-map": "^1.1.0",
+ "debug": "^4.1.0",
+ "json5": "^2.1.0",
+ "lodash": "^4.17.10",
+ "resolve": "^1.3.2",
+ "semver": "^5.4.1",
+ "source-map": "^0.5.0"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.2.tgz",
+ "integrity": "sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.2.2",
+ "jsesc": "^2.5.1",
+ "lodash": "^4.17.10",
+ "source-map": "^0.5.0",
+ "trim-right": "^1.0.1"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
+ "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.0.0",
+ "@babel/template": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
+ "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz",
+ "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/template": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
+ "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "@babel/parser": "^7.2.2",
+ "@babel/types": "^7.2.2"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz",
+ "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "@babel/generator": "^7.2.2",
+ "@babel/helper-function-name": "^7.1.0",
+ "@babel/helper-split-export-declaration": "^7.0.0",
+ "@babel/parser": "^7.2.3",
+ "@babel/types": "^7.2.2",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.10"
+ }
+ },
+ "@babel/types": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
+ "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2",
+ "lodash": "^4.17.10",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "globals": {
+ "version": "11.9.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz",
+ "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true
+ },
+ "json5": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz",
+ "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz",
+ "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
}
},
"@babel/generator": {
- "version": "7.0.0-beta.49",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.49.tgz",
- "integrity": "sha1-6c/9qROZaszseTu8JauRvBnQv3o=",
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.2.tgz",
+ "integrity": "sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg==",
"dev": true,
"requires": {
- "@babel/types": "7.0.0-beta.49",
+ "@babel/types": "^7.2.2",
"jsesc": "^2.5.1",
- "lodash": "^4.17.5",
+ "lodash": "^4.17.10",
"source-map": "^0.5.0",
"trim-right": "^1.0.1"
},
"dependencies": {
"jsesc": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz",
- "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=",
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true
},
"source-map": {
@@ -41,106 +235,277 @@
}
},
"@babel/helper-function-name": {
- "version": "7.0.0-beta.49",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.49.tgz",
- "integrity": "sha1-olwRGbnwNSeGcBJuAiXAMEHI3jI=",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
+ "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
"dev": true,
"requires": {
- "@babel/helper-get-function-arity": "7.0.0-beta.49",
- "@babel/template": "7.0.0-beta.49",
- "@babel/types": "7.0.0-beta.49"
+ "@babel/helper-get-function-arity": "^7.0.0",
+ "@babel/template": "^7.1.0",
+ "@babel/types": "^7.0.0"
}
},
"@babel/helper-get-function-arity": {
- "version": "7.0.0-beta.49",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.49.tgz",
- "integrity": "sha1-z1Aj8y0q2S0Ic3STnOwJUby1FEE=",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
+ "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
"dev": true,
"requires": {
- "@babel/types": "7.0.0-beta.49"
+ "@babel/types": "^7.0.0"
}
},
"@babel/helper-split-export-declaration": {
- "version": "7.0.0-beta.49",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.49.tgz",
- "integrity": "sha1-QNeO2glo0BGxxShm5XRs+yPldUg=",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz",
+ "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==",
"dev": true,
"requires": {
- "@babel/types": "7.0.0-beta.49"
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/helpers": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.2.0.tgz",
+ "integrity": "sha512-Fr07N+ea0dMcMN8nFpuK6dUIT7/ivt9yKQdEEnjVS83tG2pHwPi03gYmk/tyuwONnZ+sY+GFFPlWGgCtW1hF9A==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.1.2",
+ "@babel/traverse": "^7.1.5",
+ "@babel/types": "^7.2.0"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.2.tgz",
+ "integrity": "sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.2.2",
+ "jsesc": "^2.5.1",
+ "lodash": "^4.17.10",
+ "source-map": "^0.5.0",
+ "trim-right": "^1.0.1"
+ }
+ },
+ "@babel/helper-function-name": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
+ "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-get-function-arity": "^7.0.0",
+ "@babel/template": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/helper-get-function-arity": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
+ "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz",
+ "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/template": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
+ "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "@babel/parser": "^7.2.2",
+ "@babel/types": "^7.2.2"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz",
+ "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "@babel/generator": "^7.2.2",
+ "@babel/helper-function-name": "^7.1.0",
+ "@babel/helper-split-export-declaration": "^7.0.0",
+ "@babel/parser": "^7.2.3",
+ "@babel/types": "^7.2.2",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0",
+ "lodash": "^4.17.10"
+ }
+ },
+ "@babel/types": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
+ "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2",
+ "lodash": "^4.17.10",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "globals": {
+ "version": "11.9.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz",
+ "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+ "dev": true
+ }
}
},
"@babel/highlight": {
- "version": "7.0.0-beta.49",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.49.tgz",
- "integrity": "sha1-lr3GtD4TSCASumaRsQGEktOWIsw=",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
"dev": true,
"requires": {
"chalk": "^2.0.0",
"esutils": "^2.0.2",
- "js-tokens": "^3.0.0"
+ "js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ }
}
},
"@babel/parser": {
- "version": "7.0.0-beta.49",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.0.0-beta.49.tgz",
- "integrity": "sha1-lE0MW6KBK7FZ7b0iZ0Ov0mUXm9w=",
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz",
+ "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==",
"dev": true
},
"@babel/template": {
- "version": "7.0.0-beta.49",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.49.tgz",
- "integrity": "sha1-44q+ghfLl5P0YaUwbXrXRdg+HSc=",
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
+ "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
"dev": true,
"requires": {
- "@babel/code-frame": "7.0.0-beta.49",
- "@babel/parser": "7.0.0-beta.49",
- "@babel/types": "7.0.0-beta.49",
- "lodash": "^4.17.5"
+ "@babel/code-frame": "^7.0.0",
+ "@babel/parser": "^7.2.2",
+ "@babel/types": "^7.2.2"
}
},
"@babel/traverse": {
- "version": "7.0.0-beta.49",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.49.tgz",
- "integrity": "sha1-TypzaCoYM07WYl0QCo0nMZ98LWg=",
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz",
+ "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==",
"dev": true,
"requires": {
- "@babel/code-frame": "7.0.0-beta.49",
- "@babel/generator": "7.0.0-beta.49",
- "@babel/helper-function-name": "7.0.0-beta.49",
- "@babel/helper-split-export-declaration": "7.0.0-beta.49",
- "@babel/parser": "7.0.0-beta.49",
- "@babel/types": "7.0.0-beta.49",
- "debug": "^3.1.0",
+ "@babel/code-frame": "^7.0.0",
+ "@babel/generator": "^7.2.2",
+ "@babel/helper-function-name": "^7.1.0",
+ "@babel/helper-split-export-declaration": "^7.0.0",
+ "@babel/parser": "^7.2.3",
+ "@babel/types": "^7.2.2",
+ "debug": "^4.1.0",
"globals": "^11.1.0",
- "invariant": "^2.2.0",
- "lodash": "^4.17.5"
+ "lodash": "^4.17.10"
},
"dependencies": {
"debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
"dev": true,
"requires": {
- "ms": "2.0.0"
+ "ms": "^2.1.1"
}
},
"globals": {
- "version": "11.5.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz",
- "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==",
+ "version": "11.9.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz",
+ "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
"dev": true
}
}
},
"@babel/types": {
- "version": "7.0.0-beta.49",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.49.tgz",
- "integrity": "sha1-t+Oxw/TUz+Eb34yJ8e/V4WF7h6Y=",
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz",
+ "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==",
"dev": true,
"requires": {
"esutils": "^2.0.2",
- "lodash": "^4.17.5",
+ "lodash": "^4.17.10",
"to-fast-properties": "^2.0.0"
},
"dependencies": {
@@ -163,17 +528,44 @@
}
},
"@nodelib/fs.stat": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz",
- "integrity": "sha512-LAQ1d4OPfSJ/BMbI2DuizmYrrkD9JMaTdi2hQTlI53lQ4kRQPyZQRS4CYQ7O66bnBBnP/oYdRxbk++X0xuFU6A==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
+ "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "10.12.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.2.tgz",
+ "integrity": "sha512-53ElVDSnZeFUUFIYzI8WLQ25IhWzb6vbddNp8UHlXQyU0ET2RhV5zg0NfubzU7iNMh5bBXb0htCzfvrSVNgzaQ==",
"dev": true
},
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true
},
+ "acorn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz",
+ "integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz",
+ "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg==",
+ "dev": true
+ },
+ "agent-base": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz",
+ "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==",
+ "dev": true,
+ "requires": {
+ "es6-promisify": "^5.0.0"
+ }
+ },
"ajv": {
"version": "5.5.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
@@ -186,32 +578,9 @@
"json-schema-traverse": "^0.3.0"
}
},
- "ajv-keywords": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz",
- "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=",
- "dev": true
- },
- "align-text": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
- "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2",
- "longest": "^1.0.1",
- "repeat-string": "^1.5.2"
- }
- },
- "amdefine": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
- "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
- "dev": true
- },
"ansi-escapes": {
"version": "1.4.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
+ "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz",
"integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=",
"dev": true
},
@@ -222,9 +591,9 @@
"dev": true
},
"ansi-styles": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
- "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
@@ -233,7 +602,7 @@
"anymatch": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
- "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=",
+ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
"dev": true,
"optional": true,
"requires": {
@@ -241,29 +610,30 @@
"normalize-path": "^2.0.0"
}
},
- "aproba": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
- "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
- "dev": true
- },
- "are-we-there-yet": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
- "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+ "append-transform": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz",
+ "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=",
"dev": true,
"requires": {
- "delegates": "^1.0.0",
- "readable-stream": "^2.0.6"
+ "default-require-extensions": "^1.0.0"
}
},
"argparse": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
- "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
"dev": true,
"requires": {
"sprintf-js": "~1.0.2"
+ },
+ "dependencies": {
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ }
}
},
"arr-diff": {
@@ -271,6 +641,7 @@
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
"integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
"dev": true,
+ "optional": true,
"requires": {
"arr-flatten": "^1.0.1"
}
@@ -278,7 +649,7 @@
"arr-flatten": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
- "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
"dev": true
},
"arr-union": {
@@ -293,12 +664,6 @@
"integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
"dev": true
},
- "array-iterate": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.2.tgz",
- "integrity": "sha512-1hWSHTIlG/8wtYD+PPX5AOBtKWngpDFjrsrHgZpe+JdgNGz0udYu6ZIkAa/xuenIUEqFv7DvE2Yr60jxweJSrQ==",
- "dev": true
- },
"array-union": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
@@ -318,7 +683,8 @@
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
"integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
- "dev": true
+ "dev": true,
+ "optional": true
},
"arrify": {
"version": "1.0.1",
@@ -327,10 +693,13 @@
"dev": true
},
"asn1": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
- "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
- "dev": true
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": "~2.1.0"
+ }
},
"assert-plus": {
"version": "1.0.0",
@@ -350,9 +719,15 @@
"integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
"dev": true
},
+ "astral-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+ "dev": true
+ },
"async": {
"version": "1.5.2",
- "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz",
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
"dev": true
},
@@ -363,12 +738,6 @@
"dev": true,
"optional": true
},
- "async-foreach": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
- "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
- "dev": true
- },
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -376,66 +745,62 @@
"dev": true
},
"atob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz",
- "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=",
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
"dev": true
},
"autoprefixer": {
- "version": "8.6.2",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.6.2.tgz",
- "integrity": "sha512-cv9v1mYYBcAnZq4MHseJ9AIdjQmNahnpCpPO46oTkQJS2GggsBp2azHjNpAuQ95Epvsg+AIsyjYhfI9YwFxGSA==",
+ "version": "9.4.4",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.4.tgz",
+ "integrity": "sha512-7tpjBadJyHKf+gOJEmKhZIksWxdZCSrnKbbTJNsw+/zX9+f//DLELRQPWjjjVoDbbWlCuNRkN7RfmZwDVgWMLw==",
"dev": true,
"requires": {
- "browserslist": "^3.2.8",
- "caniuse-lite": "^1.0.30000851",
+ "browserslist": "^4.3.7",
+ "caniuse-lite": "^1.0.30000926",
"normalize-range": "^0.1.2",
"num2fraction": "^1.2.2",
- "postcss": "^6.0.22",
- "postcss-value-parser": "^3.2.3"
+ "postcss": "^7.0.7",
+ "postcss-value-parser": "^3.3.1"
},
"dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
"chalk": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
- "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
}
},
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
"postcss": {
- "version": "6.0.22",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz",
- "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==",
+ "version": "7.0.8",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.8.tgz",
+ "integrity": "sha512-WudsIzuTKRw9IInRTPBgVXJ7DKR26HT09Rxp0g3w0Fqh3TUtYICcUmvC0xURj04o3vdcDtnjCAUCECg/p341iQ==",
"dev": true,
"requires": {
- "chalk": "^2.4.1",
+ "chalk": "^2.4.2",
"source-map": "^0.6.1",
- "supports-color": "^5.4.0"
+ "supports-color": "^6.0.0"
}
},
"supports-color": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
- "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
+ "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
@@ -450,9 +815,9 @@
"dev": true
},
"aws4": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
- "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
"dev": true
},
"babel": {
@@ -511,7 +876,7 @@
},
"chalk": {
"version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"requires": {
@@ -566,167 +931,23 @@
}
},
"babel-eslint": {
- "version": "8.2.3",
- "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.3.tgz",
- "integrity": "sha512-0HeSTtaXg/Em7FCUWxwOT+KeFSO1O7LuRuzhk7g+1BjwdlQGlHq4OyMi3GqGxrNfEq8jEi6Hmt5ylEQUhurgiQ==",
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.1.tgz",
+ "integrity": "sha512-z7OT1iNV+TjOwHNLLyJk+HN+YVWX+CLE6fPD2SymJZOZQBs+QIexFjhm4keGTm8MW9xr4EC9Q0PbaLB24V5GoQ==",
"dev": true,
"requires": {
- "@babel/code-frame": "7.0.0-beta.44",
- "@babel/traverse": "7.0.0-beta.44",
- "@babel/types": "7.0.0-beta.44",
- "babylon": "7.0.0-beta.44",
- "eslint-scope": "~3.7.1",
+ "@babel/code-frame": "^7.0.0",
+ "@babel/parser": "^7.0.0",
+ "@babel/traverse": "^7.0.0",
+ "@babel/types": "^7.0.0",
+ "eslint-scope": "3.7.1",
"eslint-visitor-keys": "^1.0.0"
- },
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.0.0-beta.44",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz",
- "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==",
- "dev": true,
- "requires": {
- "@babel/highlight": "7.0.0-beta.44"
- }
- },
- "@babel/generator": {
- "version": "7.0.0-beta.44",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz",
- "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==",
- "dev": true,
- "requires": {
- "@babel/types": "7.0.0-beta.44",
- "jsesc": "^2.5.1",
- "lodash": "^4.2.0",
- "source-map": "^0.5.0",
- "trim-right": "^1.0.1"
- }
- },
- "@babel/helper-function-name": {
- "version": "7.0.0-beta.44",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz",
- "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==",
- "dev": true,
- "requires": {
- "@babel/helper-get-function-arity": "7.0.0-beta.44",
- "@babel/template": "7.0.0-beta.44",
- "@babel/types": "7.0.0-beta.44"
- }
- },
- "@babel/helper-get-function-arity": {
- "version": "7.0.0-beta.44",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz",
- "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==",
- "dev": true,
- "requires": {
- "@babel/types": "7.0.0-beta.44"
- }
- },
- "@babel/helper-split-export-declaration": {
- "version": "7.0.0-beta.44",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz",
- "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==",
- "dev": true,
- "requires": {
- "@babel/types": "7.0.0-beta.44"
- }
- },
- "@babel/highlight": {
- "version": "7.0.0-beta.44",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz",
- "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==",
- "dev": true,
- "requires": {
- "chalk": "^2.0.0",
- "esutils": "^2.0.2",
- "js-tokens": "^3.0.0"
- }
- },
- "@babel/template": {
- "version": "7.0.0-beta.44",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz",
- "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "7.0.0-beta.44",
- "@babel/types": "7.0.0-beta.44",
- "babylon": "7.0.0-beta.44",
- "lodash": "^4.2.0"
- }
- },
- "@babel/traverse": {
- "version": "7.0.0-beta.44",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz",
- "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "7.0.0-beta.44",
- "@babel/generator": "7.0.0-beta.44",
- "@babel/helper-function-name": "7.0.0-beta.44",
- "@babel/helper-split-export-declaration": "7.0.0-beta.44",
- "@babel/types": "7.0.0-beta.44",
- "babylon": "7.0.0-beta.44",
- "debug": "^3.1.0",
- "globals": "^11.1.0",
- "invariant": "^2.2.0",
- "lodash": "^4.2.0"
- }
- },
- "@babel/types": {
- "version": "7.0.0-beta.44",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz",
- "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2",
- "lodash": "^4.2.0",
- "to-fast-properties": "^2.0.0"
- }
- },
- "babylon": {
- "version": "7.0.0-beta.44",
- "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
- "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
- "dev": true
- },
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "globals": {
- "version": "11.5.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz",
- "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==",
- "dev": true
- },
- "jsesc": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.1.tgz",
- "integrity": "sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=",
- "dev": true
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
- },
- "to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
- "dev": true
- }
}
},
"babel-generator": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz",
- "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=",
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
"dev": true,
"requires": {
"babel-messages": "^6.23.0",
@@ -735,7 +956,7 @@
"detect-indent": "^4.0.0",
"jsesc": "^1.3.0",
"lodash": "^4.17.4",
- "source-map": "^0.5.6",
+ "source-map": "^0.5.7",
"trim-right": "^1.0.1"
},
"dependencies": {
@@ -917,10 +1138,388 @@
}
},
"babel-plugin-add-module-exports": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz",
- "integrity": "sha1-mumh9KjcZ/DN7E9K7aHkOl/2XiU=",
- "dev": true
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.0.tgz",
+ "integrity": "sha512-m0sMxPL4FaN2K69GQgaRJa4Ny15qKSdoknIcpN+gz+NaJlAW9pge/povs13tPYsKDboflrEQC+/3kfIsONBTaw==",
+ "dev": true,
+ "requires": {
+ "chokidar": "^2.0.4"
+ },
+ "dependencies": {
+ "anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "micromatch": "^3.1.4",
+ "normalize-path": "^2.1.1"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true,
+ "optional": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true,
+ "optional": true
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "chokidar": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
+ "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "anymatch": "^2.0.0",
+ "async-each": "^1.0.0",
+ "braces": "^2.3.0",
+ "fsevents": "^1.2.2",
+ "glob-parent": "^3.1.0",
+ "inherits": "^2.0.1",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "lodash.debounce": "^4.0.8",
+ "normalize-path": "^2.1.1",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.0.0",
+ "upath": "^1.0.5"
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ }
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true,
+ "optional": true
+ },
+ "is-glob": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz",
+ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true,
+ "optional": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true,
+ "optional": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ }
+ }
},
"babel-plugin-check-es2015-constants": {
"version": "6.22.0",
@@ -933,43 +1532,43 @@
},
"babel-plugin-syntax-async-functions": {
"version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
+ "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
"integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
"dev": true
},
"babel-plugin-syntax-async-generators": {
"version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz",
+ "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz",
"integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=",
"dev": true
},
"babel-plugin-syntax-class-properties": {
"version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz",
+ "resolved": "http://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz",
"integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=",
"dev": true
},
"babel-plugin-syntax-decorators": {
"version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz",
+ "resolved": "http://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz",
"integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=",
"dev": true
},
"babel-plugin-syntax-dynamic-import": {
"version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz",
+ "resolved": "http://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz",
"integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=",
"dev": true
},
"babel-plugin-syntax-exponentiation-operator": {
"version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
+ "resolved": "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
"integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
"dev": true
},
"babel-plugin-syntax-object-rest-spread": {
"version": "6.13.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
+ "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz",
"integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=",
"dev": true
},
@@ -1389,41 +1988,6 @@
"lodash": "^4.17.4",
"mkdirp": "^0.5.1",
"source-map-support": "^0.4.15"
- },
- "dependencies": {
- "babel-core": {
- "version": "6.26.3",
- "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
- "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
- "dev": true,
- "requires": {
- "babel-code-frame": "^6.26.0",
- "babel-generator": "^6.26.0",
- "babel-helpers": "^6.24.1",
- "babel-messages": "^6.23.0",
- "babel-register": "^6.26.0",
- "babel-runtime": "^6.26.0",
- "babel-template": "^6.26.0",
- "babel-traverse": "^6.26.0",
- "babel-types": "^6.26.0",
- "babylon": "^6.18.0",
- "convert-source-map": "^1.5.1",
- "debug": "^2.6.9",
- "json5": "^0.5.1",
- "lodash": "^4.17.4",
- "minimatch": "^3.0.4",
- "path-is-absolute": "^1.0.1",
- "private": "^0.1.8",
- "slash": "^1.0.0",
- "source-map": "^0.5.7"
- }
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
- }
}
},
"babel-runtime": {
@@ -1481,7 +2045,7 @@
"babylon": {
"version": "6.18.0",
"resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
- "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
"dev": true
},
"bail": {
@@ -1564,35 +2128,25 @@
}
},
"bcrypt-pbkdf": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
- "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
"dev": true,
- "optional": true,
"requires": {
"tweetnacl": "^0.14.3"
}
},
"binary-extensions": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
- "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz",
+ "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==",
"dev": true,
"optional": true
},
- "block-stream": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
- "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
- "dev": true,
- "requires": {
- "inherits": "~2.0.0"
- }
- },
"bluebird": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
- "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=",
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz",
+ "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==",
"dev": true
},
"body": {
@@ -1607,19 +2161,10 @@
"safe-json-parse": "~1.0.1"
}
},
- "boom": {
- "version": "2.10.1",
- "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
- "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
- "dev": true,
- "requires": {
- "hoek": "2.x.x"
- }
- },
"brace-expansion": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
- "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"requires": {
"balanced-match": "^1.0.0",
@@ -1631,6 +2176,7 @@
"resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
"integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
"dev": true,
+ "optional": true,
"requires": {
"expand-range": "^1.8.1",
"preserve": "^0.2.0",
@@ -1640,32 +2186,24 @@
"browser-stdout": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
- "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
"dev": true
},
- "browserify-zlib": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz",
- "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=",
- "dev": true,
- "requires": {
- "pako": "~0.2.0"
- }
- },
"browserslist": {
- "version": "3.2.8",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz",
- "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==",
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.7.tgz",
+ "integrity": "sha512-pWQv51Ynb0MNk9JGMCZ8VkM785/4MQNXiFYtPqI7EEP0TJO+/d/NqRVn1uiAN0DNbnlUSpL2sh16Kspasv3pUQ==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30000844",
- "electron-to-chromium": "^1.3.47"
+ "caniuse-lite": "^1.0.30000925",
+ "electron-to-chromium": "^1.3.96",
+ "node-releases": "^1.1.3"
}
},
"buffer-from": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz",
- "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
"dev": true
},
"builtin-modules": {
@@ -1711,6 +2249,38 @@
"integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
"dev": true
},
+ "caller-callsite": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
+ "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
+ "dev": true,
+ "requires": {
+ "callsites": "^2.0.0"
+ },
+ "dependencies": {
+ "callsites": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
+ "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
+ "dev": true
+ }
+ }
+ },
+ "caller-path": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
+ "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
+ "dev": true,
+ "requires": {
+ "caller-callsite": "^2.0.0"
+ }
+ },
+ "callsites": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.0.0.tgz",
+ "integrity": "sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw==",
+ "dev": true
+ },
"camelcase": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
@@ -1719,7 +2289,7 @@
},
"camelcase-keys": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+ "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
"integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
"dev": true,
"requires": {
@@ -1728,9 +2298,9 @@
}
},
"caniuse-lite": {
- "version": "1.0.30000851",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000851.tgz",
- "integrity": "sha512-Y1ecA1cL9wg0vni8t33nBw/poX8ypm+2c3fbwAESj8cm4ufK9CBFQ1+nUK8Dp5dtFo5Fc3JzkI5DKmQbuIo6hQ==",
+ "version": "1.0.30000927",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000927.tgz",
+ "integrity": "sha512-ogq4NbUWf1uG/j66k0AmiO3GjqJAlQyF8n4w8a954cbCyFKmYGvRtgz6qkq2fWuduTXHibX7GyYL5Pg58Aks2g==",
"dev": true
},
"caseless": {
@@ -1745,29 +2315,18 @@
"integrity": "sha512-Jt9tIBkRc9POUof7QA/VwWd+58fKkEEfI+/t1/eOlxKM7ZhrczNzMFefge7Ai+39y1pR/pP6cI19guHy3FSLmw==",
"dev": true
},
- "center-align": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
- "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
- "dev": true,
- "optional": true,
- "requires": {
- "align-text": "^0.1.3",
- "lazy-cache": "^1.0.3"
- }
- },
"chai": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
- "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
+ "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
"dev": true,
"requires": {
- "assertion-error": "^1.0.1",
- "check-error": "^1.0.1",
- "deep-eql": "^3.0.0",
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.2",
+ "deep-eql": "^3.0.1",
"get-func-name": "^2.0.0",
- "pathval": "^1.0.0",
- "type-detect": "^4.0.0"
+ "pathval": "^1.1.0",
+ "type-detect": "^4.0.5"
}
},
"chai-as-promised": {
@@ -1780,14 +2339,14 @@
}
},
"chalk": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
- "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=",
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
"dev": true,
"requires": {
- "ansi-styles": "^3.1.0",
+ "ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
- "supports-color": "^4.0.0"
+ "supports-color": "^5.3.0"
}
},
"character-entities": {
@@ -1814,6 +2373,12 @@
"integrity": "sha512-7I/xceXfKyUJmSAn/jw8ve/9DyOP7XxufNYLI9Px7CmsKgEUaZLUTax6nZxGQtaoiZCjpu6cHPj20xC/vqRReQ==",
"dev": true
},
+ "chardet": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+ "dev": true
+ },
"check-error": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
@@ -1839,52 +2404,22 @@
}
},
"chromedriver": {
- "version": "2.40.0",
- "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-2.40.0.tgz",
- "integrity": "sha512-ewvRQ1HMk0vpFSWYCk5hKDoEz5QMPplx5w3C6/Me+03y1imr67l3Hxl9U0jn3mu2N7+c7BoC7JtNW6HzbRAwDQ==",
+ "version": "2.45.0",
+ "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-2.45.0.tgz",
+ "integrity": "sha512-Qwmcr+2mU3INeR6mVsQ8gO00vZpL8ZeTJLclX44C0dcs88jrSDgckPqbG+qkVX+m2L/aOPnF0lYgPdOiOiLt5w==",
"dev": true,
"requires": {
"del": "^3.0.0",
"extract-zip": "^1.6.7",
- "kew": "^0.7.0",
"mkdirp": "^0.5.1",
- "request": "^2.87.0"
- },
- "dependencies": {
- "request": {
- "version": "2.87.0",
- "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz",
- "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==",
- "dev": true,
- "requires": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.6.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.5",
- "extend": "~3.0.1",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.1",
- "har-validator": "~5.0.3",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.17",
- "oauth-sign": "~0.8.2",
- "performance-now": "^2.1.0",
- "qs": "~6.5.1",
- "safe-buffer": "^5.1.1",
- "tough-cookie": "~2.3.3",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.1.0"
- }
- }
+ "request": "^2.88.0",
+ "tcp-port-used": "^1.0.1"
}
},
- "circular-json": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
- "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==",
+ "cjk-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/cjk-regex/-/cjk-regex-1.0.2.tgz",
+ "integrity": "sha512-NwSMtwULPLk8Ka9DEUcoFXhMRnV/bpyKDnoyDiVw/Qy5przhvHTvXLcsKaOmx13o8J4XEsPVT1baoCUj5zQs3w==",
"dev": true
},
"class-utils": {
@@ -1917,20 +2452,12 @@
}
},
"clean-css": {
- "version": "4.1.9",
- "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz",
- "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz",
+ "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==",
"dev": true,
"requires": {
- "source-map": "0.5.x"
- },
- "dependencies": {
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
- }
+ "source-map": "~0.6.0"
}
},
"cli": {
@@ -1958,17 +2485,6 @@
"integrity": "sha1-pNKT72frt7iNSk1CwMzwDE0eNm0=",
"dev": true
},
- "cliui": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
- "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
- "dev": true,
- "requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wrap-ansi": "^2.0.0"
- }
- },
"clone-regexp": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-1.0.1.tgz",
@@ -2014,12 +2530,12 @@
}
},
"color-convert": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
- "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=",
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": {
- "color-name": "^1.1.1"
+ "color-name": "1.1.3"
}
},
"color-name": {
@@ -2035,24 +2551,18 @@
"dev": true
},
"combined-stream": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
- "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
+ "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
"dev": true,
"requires": {
"delayed-stream": "~1.0.0"
}
},
"commander": {
- "version": "2.12.2",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz",
- "integrity": "sha1-D1lGxCftnsDZGka7ne9T5UZQ5VU=",
- "dev": true
- },
- "compare-versions": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.2.1.tgz",
- "integrity": "sha512-2y2nHcopMG/NAyk6vWXlLs86XeM9sik4jmx1tKIgzMi9/RQ2eo758RGpxQO3ErihHmg0RlQITPqgz73y6s7quA==",
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
+ "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
"dev": true
},
"component-emitter": {
@@ -2068,30 +2578,39 @@
"dev": true
},
"concat-stream": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz",
- "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=",
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
"dev": true,
"requires": {
+ "buffer-from": "^1.0.0",
"inherits": "^2.0.3",
"readable-stream": "^2.2.2",
"typedarray": "^0.0.6"
}
},
"config": {
- "version": "1.30.0",
- "resolved": "https://registry.npmjs.org/config/-/config-1.30.0.tgz",
- "integrity": "sha1-HWCp81NIoTwXV5jThOgaWhbDum4=",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/config/-/config-3.0.1.tgz",
+ "integrity": "sha512-TBNrrk2b6AybUohqXw2AydglFBL9b/+1GG93Di6Fm6x1SyVJ5PYgo+mqY2X0KpU9m0PJDSbFaC5H95utSphtLw==",
"dev": true,
"requires": {
- "json5": "0.4.0",
- "os-homedir": "1.0.2"
+ "json5": "^1.0.1"
},
"dependencies": {
"json5": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/json5/-/json5-0.4.0.tgz",
- "integrity": "sha1-BUNS5MTIDIbAkjh31EneF2pzLI0=",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"dev": true
}
}
@@ -2105,12 +2624,6 @@
"date-now": "^0.1.4"
}
},
- "console-control-strings": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
- "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
- "dev": true
- },
"continuable-cache": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz",
@@ -2118,10 +2631,13 @@
"dev": true
},
"convert-source-map": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
- "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
- "dev": true
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
+ "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ }
},
"copy-descriptor": {
"version": "0.1.1",
@@ -2130,9 +2646,9 @@
"dev": true
},
"core-js": {
- "version": "2.5.3",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
- "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=",
+ "version": "2.5.7",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
+ "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==",
"dev": true
},
"core-util-is": {
@@ -2142,20 +2658,21 @@
"dev": true
},
"cosmiconfig": {
- "version": "5.0.5",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.5.tgz",
- "integrity": "sha512-94j37OtvxS5w7qr7Ta6dt67tWdnOxigBVN4VnSxNXFez9o18PGQ0D33SchKP17r9LAcWVTYV72G6vDayAUBFIg==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-3.1.0.tgz",
+ "integrity": "sha512-zedsBhLSbPBms+kE7AH4vHg6JsKDz6epSv2/+5XHs8ILHlgDciSJfSWf8sX9aQ52Jb7KI7VswUTsLpR/G0cr2Q==",
"dev": true,
"requires": {
"is-directory": "^0.3.1",
"js-yaml": "^3.9.0",
- "parse-json": "^4.0.0"
+ "parse-json": "^3.0.0",
+ "require-from-string": "^2.0.1"
},
"dependencies": {
"esprima": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
- "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true
},
"js-yaml": {
@@ -2169,47 +2686,39 @@
}
},
"parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-3.0.0.tgz",
+ "integrity": "sha1-+m9HsY4jgm6tMvJj50TQ4ehH+xM=",
"dev": true,
"requires": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
+ "error-ex": "^1.3.1"
}
}
}
},
"cross-env": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.6.tgz",
- "integrity": "sha512-VWTDq+G4v383SzgRS7jsAVWqEWF0aKZpDz1GVjhONvPRgHB1LnxP2sXUVFKbykHkPSnfRKS8YdiDevWFwZmQ9g==",
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz",
+ "integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==",
"dev": true,
"requires": {
- "cross-spawn": "^5.1.0",
+ "cross-spawn": "^6.0.5",
"is-windows": "^1.0.0"
}
},
"cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
"dev": true,
"requires": {
- "lru-cache": "^4.0.1",
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
"shebang-command": "^1.2.0",
"which": "^1.2.9"
}
},
- "cryptiles": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
- "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
- "dev": true,
- "requires": {
- "boom": "2.x.x"
- }
- },
"currently-unhandled": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
@@ -2228,6 +2737,12 @@
"assert-plus": "^1.0.0"
}
},
+ "dashify": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/dashify/-/dashify-0.2.2.tgz",
+ "integrity": "sha1-agdBWgHJH69KMuONnfunH2HLIP4=",
+ "dev": true
+ },
"date-now": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
@@ -2247,7 +2762,7 @@
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
"ms": "2.0.0"
@@ -2284,6 +2799,21 @@
"type-detect": "^4.0.0"
}
},
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "default-require-extensions": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz",
+ "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=",
+ "dev": true,
+ "requires": {
+ "strip-bom": "^2.0.0"
+ }
+ },
"define-property": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
@@ -2357,16 +2887,10 @@
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
"dev": true
},
- "delegates": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
- "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
- "dev": true
- },
"deprecate": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/deprecate/-/deprecate-1.0.0.tgz",
- "integrity": "sha1-ZhSQ7SQokWpsiIPYg05WRvTkpKg=",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/deprecate/-/deprecate-1.1.0.tgz",
+ "integrity": "sha512-b5dDNQYdy2vW9WXUD8+RQlfoxvqztLLhDE+T7Gd37I5E8My7nJkKu6FmhdDeRWJ8B+yjZKuwjCta8pgi8kgSqA==",
"dev": true
},
"detect-indent": {
@@ -2378,10 +2902,16 @@
"repeating": "^2.0.0"
}
},
+ "detect-newline": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz",
+ "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=",
+ "dev": true
+ },
"diff": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-3.4.0.tgz",
- "integrity": "sha1-sdhVB9rzlkgo3lSzfQ1zumfdpWw=",
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
"dev": true
},
"dir-glob": {
@@ -2405,6 +2935,15 @@
}
}
},
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
"dom-serializer": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
@@ -2417,22 +2956,22 @@
"dependencies": {
"domelementtype": {
"version": "1.1.3",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
+ "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
"integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
"dev": true
},
"entities": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
- "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
"dev": true
}
}
},
"domelementtype": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
- "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.2.1.tgz",
+ "integrity": "sha512-SQVCLFS2E7G5CRCMdn6K9bIhRj1bS6QBWZfF0TUPh4V/BbqrQ619IdSS3/izn0FZ+9l+uODzaZjb08fjOfablA==",
"dev": true
},
"domhandler": {
@@ -2465,34 +3004,60 @@
},
"duplexer": {
"version": "0.1.1",
- "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
+ "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
"integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
"dev": true
},
- "each-async": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz",
- "integrity": "sha1-3uUim98KtrogEqOV4bhpq/iBNHM=",
+ "ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
"dev": true,
"requires": {
- "onetime": "^1.0.0",
- "set-immediate-shim": "^1.0.0"
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
}
},
- "ecc-jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
- "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
+ "editorconfig": {
+ "version": "0.14.2",
+ "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.14.2.tgz",
+ "integrity": "sha512-tghjvKwo1gakrhFiZWlbo5ILWAfnuOu1JFztW0li+vzbnInN0CMZuF4F0T/Pnn9UWpT7Mr1aFTWdHVuxiR9K9A==",
"dev": true,
- "optional": true,
"requires": {
- "jsbn": "~0.1.0"
+ "bluebird": "^3.0.5",
+ "commander": "^2.9.0",
+ "lru-cache": "^3.2.0",
+ "semver": "^5.1.0",
+ "sigmund": "^1.0.1"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz",
+ "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=",
+ "dev": true,
+ "requires": {
+ "pseudomap": "^1.0.1"
+ }
+ }
}
},
+ "editorconfig-to-prettier": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/editorconfig-to-prettier/-/editorconfig-to-prettier-0.0.6.tgz",
+ "integrity": "sha512-Ysw+hBdwhPFruYmLapKRm7Or5XgMzhasbqu4AN07V2l/AkqpgooWm2xtTQPzTD6S0tq54A+WbSxNt6qmsO3hoA==",
+ "dev": true
+ },
"electron-to-chromium": {
- "version": "1.3.48",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.48.tgz",
- "integrity": "sha1-07DYWTgUBE4JLs4hCPw6ya6kuQA=",
+ "version": "1.3.100",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.100.tgz",
+ "integrity": "sha512-cEUzis2g/RatrVf8x26L8lK5VEls1AGnLHk6msluBUg/NTB4wcXzExTsGscFq+Vs4WBBU2zbLLySvD4C0C3hwg==",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.5.1.tgz",
+ "integrity": "sha512-PAHp6TxrCy7MGMFidro8uikr+zlJJKJ/Q6mm2ExZ7HwkyR9lSVFfE3kt36qcwa24BQL7y0G9axycGjK1A/0uNQ==",
"dev": true
},
"encoding": {
@@ -2521,35 +3086,27 @@
}
},
"error-ex": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
- "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
"dev": true,
"requires": {
"is-arrayish": "^0.2.1"
}
},
"es6-promise": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz",
- "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=",
+ "version": "4.2.5",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz",
+ "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==",
"dev": true
},
"es6-promisify": {
"version": "5.0.0",
- "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
+ "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
"integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
"dev": true,
"requires": {
"es6-promise": "^4.0.3"
- },
- "dependencies": {
- "es6-promise": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
- "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==",
- "dev": true
- }
}
},
"escape-string-regexp": {
@@ -2558,6 +3115,339 @@
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
+ "eslint": {
+ "version": "5.12.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.12.0.tgz",
+ "integrity": "sha512-LntwyPxtOHrsJdcSwyQKVtHofPHdv+4+mFwEe91r2V13vqpM8yLr7b1sW+Oo/yheOPkWYsYlYJCkzlFAt8KV7g==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "ajv": "^6.5.3",
+ "chalk": "^2.1.0",
+ "cross-spawn": "^6.0.5",
+ "debug": "^4.0.1",
+ "doctrine": "^2.1.0",
+ "eslint-scope": "^4.0.0",
+ "eslint-utils": "^1.3.1",
+ "eslint-visitor-keys": "^1.0.0",
+ "espree": "^5.0.0",
+ "esquery": "^1.0.1",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^2.0.0",
+ "functional-red-black-tree": "^1.0.1",
+ "glob": "^7.1.2",
+ "globals": "^11.7.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "inquirer": "^6.1.0",
+ "js-yaml": "^3.12.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.3.0",
+ "lodash": "^4.17.5",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.1",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.8.2",
+ "path-is-inside": "^1.0.2",
+ "pluralize": "^7.0.0",
+ "progress": "^2.0.0",
+ "regexpp": "^2.0.1",
+ "semver": "^5.5.1",
+ "strip-ansi": "^4.0.0",
+ "strip-json-comments": "^2.0.1",
+ "table": "^5.0.2",
+ "text-table": "^0.2.0"
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "ajv": {
+ "version": "6.6.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz",
+ "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-escapes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
+ "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "cli-cursor": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+ "dev": true,
+ "requires": {
+ "restore-cursor": "^2.0.0"
+ }
+ },
+ "cli-width": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "eslint-scope": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
+ "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+ "dev": true
+ },
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "dev": true,
+ "requires": {
+ "escape-string-regexp": "^1.0.5"
+ }
+ },
+ "globals": {
+ "version": "11.9.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz",
+ "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==",
+ "dev": true
+ },
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true
+ },
+ "inquirer": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz",
+ "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==",
+ "dev": true,
+ "requires": {
+ "ansi-escapes": "^3.0.0",
+ "chalk": "^2.0.0",
+ "cli-cursor": "^2.1.0",
+ "cli-width": "^2.0.0",
+ "external-editor": "^3.0.0",
+ "figures": "^2.0.0",
+ "lodash": "^4.17.10",
+ "mute-stream": "0.0.7",
+ "run-async": "^2.2.0",
+ "rxjs": "^6.1.0",
+ "string-width": "^2.1.0",
+ "strip-ansi": "^5.0.0",
+ "through": "^2.3.6"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz",
+ "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz",
+ "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^4.0.0"
+ }
+ }
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
+ "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ },
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
+ "dev": true
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^1.0.0"
+ }
+ },
+ "progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "dev": true,
+ "requires": {
+ "onetime": "^2.0.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "run-async": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+ "dev": true,
+ "requires": {
+ "is-promise": "^2.1.0"
+ }
+ },
+ "slice-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.0.0.tgz",
+ "integrity": "sha512-4j2WTWjp3GsZ+AOagyzVbzp4vWGtZ0hEZ/gDY/uTvm6MTxUfTUIsnMIFb1bn8o0RuXiqUw15H1bue8f22Vw2oQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.0",
+ "astral-regex": "^1.0.0",
+ "is-fullwidth-code-point": "^2.0.0"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+ "dev": true
+ },
+ "table": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/table/-/table-5.1.1.tgz",
+ "integrity": "sha512-NUjapYb/qd4PeFW03HnAuOJ7OMcBkJlqeClWxeNlQ0lXGSb52oZXGzkO0/I0ARegQ2eUT1g2VDJH0eUxDRcHmw==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.6.1",
+ "lodash": "^4.17.11",
+ "slice-ansi": "2.0.0",
+ "string-width": "^2.1.1"
+ }
+ }
+ }
+ },
+ "eslint-config-wpcalypso": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-config-wpcalypso/-/eslint-config-wpcalypso-4.0.1.tgz",
+ "integrity": "sha512-/MdCPOQusYRJI57/GFNi523CW75CUIoqKEY+8XhDtkz0iSeFXl12c2hW2l4ezE0cDbhMUwSslI07YpSPW7nRgA==",
+ "dev": true
+ },
+ "eslint-plugin-wpcalypso": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-wpcalypso/-/eslint-plugin-wpcalypso-4.0.2.tgz",
+ "integrity": "sha512-XqsgUlz4kiPppuZBjMMUtcPRsLduxfRBrrBpGGipxQpwCYp1+yPBOwjk17WrR/BeHEw/RJ9+Xrt+F8vrRv2qBw==",
+ "dev": true,
+ "requires": {
+ "requireindex": "^1.1.0"
+ }
+ },
"eslint-scope": {
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz",
@@ -2568,18 +3458,44 @@
"estraverse": "^4.1.1"
}
},
+ "eslint-utils": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz",
+ "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q==",
+ "dev": true
+ },
"eslint-visitor-keys": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
"integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==",
"dev": true
},
+ "espree": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.0.tgz",
+ "integrity": "sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA==",
+ "dev": true,
+ "requires": {
+ "acorn": "^6.0.2",
+ "acorn-jsx": "^5.0.0",
+ "eslint-visitor-keys": "^1.0.0"
+ }
+ },
"esprima": {
"version": "2.7.3",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
"integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
"dev": true
},
+ "esquery": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
+ "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^4.0.0"
+ }
+ },
"esrecurse": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
@@ -2603,7 +3519,7 @@
},
"eventemitter2": {
"version": "0.4.14",
- "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
+ "resolved": "http://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz",
"integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=",
"dev": true
},
@@ -2633,6 +3549,7 @@
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
"integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
"dev": true,
+ "optional": true,
"requires": {
"is-posix-bracket": "^0.1.0"
}
@@ -2642,14 +3559,24 @@
"resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
"integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
"dev": true,
+ "optional": true,
"requires": {
"fill-range": "^2.1.0"
}
},
+ "expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "^1.0.1"
+ }
+ },
"extend": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
- "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
"dev": true
},
"extend-shallow": {
@@ -2673,11 +3600,23 @@
}
}
},
+ "external-editor": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz",
+ "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==",
+ "dev": true,
+ "requires": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ }
+ },
"extglob": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
"integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
"dev": true,
+ "optional": true,
"requires": {
"is-extglob": "^1.0.0"
}
@@ -2692,20 +3631,6 @@
"debug": "2.6.9",
"mkdirp": "0.5.1",
"yauzl": "2.4.1"
- },
- "dependencies": {
- "concat-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
- "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^2.2.2",
- "typedarray": "^0.0.6"
- }
- }
}
},
"extsprintf": {
@@ -2716,21 +3641,21 @@
},
"fast-deep-equal": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+ "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
"integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
"dev": true
},
"fast-glob": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.2.tgz",
- "integrity": "sha512-TR6zxCKftDQnUAPvkrCWdBgDq/gbqx8A3ApnBrR5rMvpp6+KMJI0Igw7fkWPgeVK0uhRXTXdvO3O+YP0CaUX2g==",
+ "version": "2.2.6",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz",
+ "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==",
"dev": true,
"requires": {
"@mrmlnc/readdir-enhanced": "^2.2.1",
- "@nodelib/fs.stat": "^1.0.1",
+ "@nodelib/fs.stat": "^1.1.2",
"glob-parent": "^3.1.0",
"is-glob": "^4.0.0",
- "merge2": "^1.2.1",
+ "merge2": "^1.2.3",
"micromatch": "^3.1.10"
},
"dependencies": {
@@ -3052,6 +3977,21 @@
"integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
"dev": true
},
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fault": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.2.tgz",
+ "integrity": "sha512-o2eo/X2syzzERAtN5LcGbiVQ0WwZSlN3qLtadwAz3X8Bu+XWD16dja/KMsjZLiQr+BLGPDnHGkc4yUJf1Xpkpw==",
+ "dev": true,
+ "requires": {
+ "format": "^0.2.2"
+ }
+ },
"faye-websocket": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
@@ -3094,7 +4034,8 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
"integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
- "dev": true
+ "dev": true,
+ "optional": true
},
"fileset": {
"version": "2.0.3",
@@ -3111,39 +4052,13 @@
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
"integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
"dev": true,
+ "optional": true,
"requires": {
"is-number": "^2.1.0",
"isobject": "^2.0.0",
"randomatic": "^3.0.0",
"repeat-element": "^1.1.2",
"repeat-string": "^1.5.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
- "dev": true
- },
- "randomatic": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz",
- "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==",
- "dev": true,
- "requires": {
- "is-number": "^4.0.0",
- "kind-of": "^6.0.0",
- "math-random": "^1.0.1"
- },
- "dependencies": {
- "is-number": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
- "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
- "dev": true
- }
- }
- }
}
},
"find-up": {
@@ -3174,7 +4089,7 @@
},
"commander": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz",
+ "resolved": "http://registry.npmjs.org/commander/-/commander-2.1.0.tgz",
"integrity": "sha1-0SG7roYNmZKj1Re6lvVliOR8Z4E=",
"dev": true
}
@@ -3205,54 +4120,35 @@
}
},
"flat-cache": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
- "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.1.tgz",
+ "integrity": "sha512-BUaXPScuox3BPmS9CGqbsh7tvAGzBEU2Dlnw243WoHjC0vO57faTOvHOkPQkPZZdpvJuwOQhMdAQx3BtdUh6nQ==",
"dev": true,
"requires": {
- "circular-json": "^0.3.1",
- "del": "^2.0.2",
+ "del": "^3.0.0",
+ "flatted": "^2.0.0",
"graceful-fs": "^4.1.2",
"write": "^0.2.1"
- },
- "dependencies": {
- "del": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
- "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
- "dev": true,
- "requires": {
- "globby": "^5.0.0",
- "is-path-cwd": "^1.0.0",
- "is-path-in-cwd": "^1.0.0",
- "object-assign": "^4.0.1",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0",
- "rimraf": "^2.2.8"
- }
- },
- "globby": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
- "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
- "dev": true,
- "requires": {
- "array-union": "^1.0.1",
- "arrify": "^1.0.0",
- "glob": "^7.0.3",
- "object-assign": "^4.0.1",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "dev": true
- }
}
},
+ "flatted": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.0.tgz",
+ "integrity": "sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg==",
+ "dev": true
+ },
+ "flatten": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz",
+ "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=",
+ "dev": true
+ },
+ "flow-parser": {
+ "version": "0.59.0",
+ "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.59.0.tgz",
+ "integrity": "sha1-9uvK5h/6GH5CCZnUDOCoAfObJjU=",
+ "dev": true
+ },
"for-in": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
@@ -3264,6 +4160,7 @@
"resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
"integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
"dev": true,
+ "optional": true,
"requires": {
"for-in": "^1.0.1"
}
@@ -3275,27 +4172,22 @@
"dev": true
},
"form-data": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
- "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"dev": true,
"requires": {
"asynckit": "^0.4.0",
- "combined-stream": "1.0.6",
+ "combined-stream": "^1.0.6",
"mime-types": "^2.1.12"
- },
- "dependencies": {
- "combined-stream": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
- "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
- "dev": true,
- "requires": {
- "delayed-stream": "~1.0.0"
- }
- }
}
},
+ "format": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
+ "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=",
+ "dev": true
+ },
"fragment-cache": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
@@ -3305,21 +4197,10 @@
"map-cache": "^0.2.2"
}
},
- "fs-extra": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
- "integrity": "sha1-QU0BEM3QZwVzTQVWUsVBEmDDGr0=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
"fs-readdir-recursive": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
- "integrity": "sha1-4y/AMKLM7kSmtTcTCNpUvgs5fSc=",
+ "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==",
"dev": true
},
"fs.realpath": {
@@ -3341,24 +4222,29 @@
"dependencies": {
"abbrev": {
"version": "1.1.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true,
"optional": true
},
"ansi-regex": {
"version": "2.1.1",
- "bundled": true,
- "dev": true
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true,
+ "optional": true
},
"aproba": {
"version": "1.2.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
"dev": true,
"optional": true
},
"are-we-there-yet": {
"version": "1.1.4",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz",
+ "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=",
"dev": true,
"optional": true,
"requires": {
@@ -3368,13 +4254,17 @@
},
"balanced-match": {
"version": "1.0.0",
- "bundled": true,
- "dev": true
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true,
+ "optional": true
},
"brace-expansion": {
"version": "1.1.11",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
+ "optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -3382,34 +4272,43 @@
},
"chownr": {
"version": "1.0.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz",
+ "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=",
"dev": true,
"optional": true
},
"code-point-at": {
"version": "1.1.0",
- "bundled": true,
- "dev": true
+ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+ "dev": true,
+ "optional": true
},
"concat-map": {
"version": "0.0.1",
- "bundled": true,
- "dev": true
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true,
+ "optional": true
},
"console-control-strings": {
"version": "1.1.0",
- "bundled": true,
- "dev": true
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
+ "dev": true,
+ "optional": true
},
"core-util-is": {
"version": "1.0.2",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
"dev": true,
"optional": true
},
"debug": {
"version": "2.6.9",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"optional": true,
"requires": {
@@ -3418,25 +4317,29 @@
},
"deep-extend": {
"version": "0.5.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
+ "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==",
"dev": true,
"optional": true
},
"delegates": {
"version": "1.0.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
"dev": true,
"optional": true
},
"detect-libc": {
"version": "1.0.3",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
"dev": true,
"optional": true
},
"fs-minipass": {
"version": "1.2.5",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz",
+ "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
"dev": true,
"optional": true,
"requires": {
@@ -3445,13 +4348,15 @@
},
"fs.realpath": {
"version": "1.0.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true,
"optional": true
},
"gauge": {
"version": "2.7.4",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
"dev": true,
"optional": true,
"requires": {
@@ -3467,7 +4372,8 @@
},
"glob": {
"version": "7.1.2",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
"dev": true,
"optional": true,
"requires": {
@@ -3481,13 +4387,15 @@
},
"has-unicode": {
"version": "2.0.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
"dev": true,
"optional": true
},
"iconv-lite": {
"version": "0.4.21",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz",
+ "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==",
"dev": true,
"optional": true,
"requires": {
@@ -3496,7 +4404,8 @@
},
"ignore-walk": {
"version": "3.0.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz",
+ "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
"dev": true,
"optional": true,
"requires": {
@@ -3505,7 +4414,8 @@
},
"inflight": {
"version": "1.0.6",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"optional": true,
"requires": {
@@ -3515,46 +4425,58 @@
},
"inherits": {
"version": "2.0.3",
- "bundled": true,
- "dev": true
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true,
+ "optional": true
},
"ini": {
"version": "1.3.5",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
"dev": true,
"optional": true
},
"is-fullwidth-code-point": {
"version": "1.0.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
+ "optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
},
"isarray": {
"version": "1.0.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true,
"optional": true
},
"minimatch": {
"version": "3.0.4",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
+ "optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "0.0.8",
- "bundled": true,
- "dev": true
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true,
+ "optional": true
},
"minipass": {
"version": "2.2.4",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz",
+ "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==",
"dev": true,
+ "optional": true,
"requires": {
"safe-buffer": "^5.1.1",
"yallist": "^3.0.0"
@@ -3562,7 +4484,8 @@
},
"minizlib": {
"version": "1.1.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz",
+ "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==",
"dev": true,
"optional": true,
"requires": {
@@ -3571,28 +4494,25 @@
},
"mkdirp": {
"version": "0.5.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"dev": true,
+ "optional": true,
"requires": {
"minimist": "0.0.8"
}
},
"ms": {
"version": "2.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "nan": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
- "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true,
"optional": true
},
"needle": {
"version": "2.2.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz",
+ "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==",
"dev": true,
"optional": true,
"requires": {
@@ -3603,7 +4523,8 @@
},
"node-pre-gyp": {
"version": "0.10.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz",
+ "integrity": "sha512-G7kEonQLRbcA/mOoFoxvlMrw6Q6dPf92+t/l0DFSMuSlDoWaI9JWIyPwK0jyE1bph//CUEL65/Fz1m2vJbmjQQ==",
"dev": true,
"optional": true,
"requires": {
@@ -3621,7 +4542,8 @@
},
"nopt": {
"version": "4.0.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
+ "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
"dev": true,
"optional": true,
"requires": {
@@ -3631,13 +4553,15 @@
},
"npm-bundled": {
"version": "1.0.3",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz",
+ "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==",
"dev": true,
"optional": true
},
"npm-packlist": {
"version": "1.1.10",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.10.tgz",
+ "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==",
"dev": true,
"optional": true,
"requires": {
@@ -3647,7 +4571,8 @@
},
"npmlog": {
"version": "4.1.2",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+ "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"dev": true,
"optional": true,
"requires": {
@@ -3659,38 +4584,46 @@
},
"number-is-nan": {
"version": "1.0.1",
- "bundled": true,
- "dev": true
+ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+ "dev": true,
+ "optional": true
},
"object-assign": {
"version": "4.1.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true,
"optional": true
},
"once": {
"version": "1.4.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
+ "optional": true,
"requires": {
"wrappy": "1"
}
},
"os-homedir": {
"version": "1.0.2",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
"dev": true,
"optional": true
},
"os-tmpdir": {
"version": "1.0.2",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
"dev": true,
"optional": true
},
"osenv": {
"version": "0.1.5",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
"dev": true,
"optional": true,
"requires": {
@@ -3700,19 +4633,22 @@
},
"path-is-absolute": {
"version": "1.0.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true,
"optional": true
},
"process-nextick-args": {
"version": "2.0.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
"dev": true,
"optional": true
},
"rc": {
"version": "1.2.7",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz",
+ "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==",
"dev": true,
"optional": true,
"requires": {
@@ -3724,7 +4660,8 @@
"dependencies": {
"minimist": {
"version": "1.2.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"dev": true,
"optional": true
}
@@ -3732,7 +4669,8 @@
},
"readable-stream": {
"version": "2.3.6",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"dev": true,
"optional": true,
"requires": {
@@ -3747,7 +4685,8 @@
},
"rimraf": {
"version": "2.6.2",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
"dev": true,
"optional": true,
"requires": {
@@ -3756,43 +4695,52 @@
},
"safe-buffer": {
"version": "5.1.1",
- "bundled": true,
- "dev": true
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
+ "dev": true,
+ "optional": true
},
"safer-buffer": {
"version": "2.1.2",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true,
"optional": true
},
"sax": {
"version": "1.2.4",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
"dev": true,
"optional": true
},
"semver": {
"version": "5.5.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
"dev": true,
"optional": true
},
"set-blocking": {
"version": "2.0.0",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
"dev": true,
"optional": true
},
"signal-exit": {
"version": "3.0.2",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
"dev": true,
"optional": true
},
"string-width": {
"version": "1.0.2",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
+ "optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@@ -3801,7 +4749,8 @@
},
"string_decoder": {
"version": "1.1.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"optional": true,
"requires": {
@@ -3810,21 +4759,25 @@
},
"strip-ansi": {
"version": "3.0.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
+ "optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
},
"strip-json-comments": {
"version": "2.0.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
"dev": true,
"optional": true
},
"tar": {
"version": "4.4.1",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz",
+ "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==",
"dev": true,
"optional": true,
"requires": {
@@ -3839,13 +4792,15 @@
},
"util-deprecate": {
"version": "1.0.2",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"dev": true,
"optional": true
},
"wide-align": {
"version": "1.1.2",
- "bundled": true,
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
+ "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==",
"dev": true,
"optional": true,
"requires": {
@@ -3854,74 +4809,35 @@
},
"wrappy": {
"version": "1.0.2",
- "bundled": true,
- "dev": true
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true,
+ "optional": true
},
"yallist": {
"version": "3.0.2",
- "bundled": true,
- "dev": true
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz",
+ "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=",
+ "dev": true,
+ "optional": true
}
}
},
- "fstream": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
- "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "inherits": "~2.0.0",
- "mkdirp": ">=0.5 0",
- "rimraf": "2"
- }
- },
- "gauge": {
- "version": "2.7.4",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
- "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
- "dev": true,
- "requires": {
- "aproba": "^1.0.3",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.0",
- "object-assign": "^4.1.0",
- "signal-exit": "^3.0.0",
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wide-align": "^1.1.0"
- }
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
},
"gaze": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz",
- "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
+ "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
"dev": true,
"requires": {
"globule": "^1.0.0"
}
},
- "generate-function": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
- "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=",
- "dev": true
- },
- "generate-object-property": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
- "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
- "dev": true,
- "requires": {
- "is-property": "^1.0.0"
- }
- },
- "get-caller-file": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
- "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
- "dev": true
- },
"get-func-name": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
@@ -3934,6 +4850,12 @@
"integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
"dev": true
},
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+ "dev": true
+ },
"get-value": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
@@ -3956,37 +4878,44 @@
}
},
"gettext-parser": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.3.1.tgz",
- "integrity": "sha1-dLepnktfqNqrEfpRXopYJIBEihI=",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-3.1.0.tgz",
+ "integrity": "sha512-eVD8RxFMeHg8pjl5zsk7xlEDaKdcYlotLztiMaYGLvI13LMXwWlybLg7rg6eagct79vyGkPGZrMPBsdjsQOnWg==",
"dev": true,
"requires": {
"encoding": "^0.1.12",
- "safe-buffer": "^5.1.1"
+ "readable-stream": "^3.0.6",
+ "safe-buffer": "^5.1.2"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz",
+ "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ }
}
},
"github-contributors-list": {
"version": "https://github.com/woocommerce/github-contributors-list/tarball/master",
- "integrity": "sha1-x/jBWtseshWNb8iGGLtEkK64xd8=",
+ "integrity": "sha512-B2yGehx2B1Fg0ooPCxcbq2fRE+YvAh1Yssa6Kp/sGMCRgDD9+yR6Fa5urn+cOqMbOvuAVZElVqQx+4wVm4JWgw==",
"requires": {
"marked": "~0.3.1",
"merge": "^1.2.0",
"minimist": "0.0.8",
"q": "~1.4.1",
"sprintf-js": "0.0.7"
- },
- "dependencies": {
- "sprintf-js": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-0.0.7.tgz",
- "integrity": "sha1-8A14/RYBMICbSrNAwDEPqnElPb0="
- }
}
},
"glob": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
- "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=",
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
"dev": true,
"requires": {
"fs.realpath": "^1.0.0",
@@ -4002,6 +4931,7 @@
"resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
"integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
"dev": true,
+ "optional": true,
"requires": {
"glob-parent": "^2.0.0",
"is-glob": "^2.0.0"
@@ -4012,6 +4942,7 @@
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
"integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
"dev": true,
+ "optional": true,
"requires": {
"is-glob": "^2.0.0"
}
@@ -4022,10 +4953,34 @@
"integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
"dev": true
},
+ "global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "dev": true,
+ "requires": {
+ "global-prefix": "^1.0.1",
+ "is-windows": "^1.0.1",
+ "resolve-dir": "^1.0.0"
+ }
+ },
+ "global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "^2.0.2",
+ "homedir-polyfill": "^1.0.1",
+ "ini": "^1.3.4",
+ "is-windows": "^1.0.1",
+ "which": "^1.2.14"
+ }
+ },
"globals": {
"version": "9.18.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
- "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
"dev": true
},
"globby": {
@@ -4043,7 +4998,7 @@
"dependencies": {
"pify": {
"version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
"dev": true
}
@@ -4056,13 +5011,13 @@
"dev": true
},
"globule": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz",
- "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz",
+ "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
"dev": true,
"requires": {
"glob": "~7.1.1",
- "lodash": "~4.17.4",
+ "lodash": "~4.17.10",
"minimatch": "~3.0.2"
}
},
@@ -4084,15 +5039,24 @@
}
},
"graceful-fs": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
- "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "version": "4.1.15",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
+ "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
"dev": true
},
+ "graphql": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/graphql/-/graphql-0.10.5.tgz",
+ "integrity": "sha512-Q7cx22DiLhwHsEfUnUip1Ww/Vfx7FS0w6+iHItNuN61+XpegHSa3k5U0+6M5BcpavQImBwFiy0z3uYwY7cXMLQ==",
+ "dev": true,
+ "requires": {
+ "iterall": "^1.1.0"
+ }
+ },
"growl": {
"version": "1.10.5",
"resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
- "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=",
+ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
"dev": true
},
"grunt": {
@@ -4136,7 +5100,7 @@
},
"grunt-cli": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz",
+ "resolved": "http://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz",
"integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=",
"dev": true,
"requires": {
@@ -4166,7 +5130,7 @@
},
"chalk": {
"version": "0.2.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.2.1.tgz",
+ "resolved": "http://registry.npmjs.org/chalk/-/chalk-0.2.1.tgz",
"integrity": "sha1-dhPhV1FFshOGSD9/SFql/6jL0Qw=",
"dev": true,
"requires": {
@@ -4177,13 +5141,24 @@
}
},
"grunt-contrib-clean": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.1.0.tgz",
- "integrity": "sha1-Vkq/LQN4qYOhW54/MO51tzjEBjg=",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-2.0.0.tgz",
+ "integrity": "sha512-g5ZD3ORk6gMa5ugZosLDQl3dZO7cI3R14U75hTM+dVLVxdMNJCPVmwf9OUt4v4eWgpKKWWoVK9DZc1amJp4nQw==",
"dev": true,
"requires": {
- "async": "^1.5.2",
- "rimraf": "^2.5.1"
+ "async": "^2.6.1",
+ "rimraf": "^2.6.2"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
+ "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.10"
+ }
+ }
}
},
"grunt-contrib-concat": {
@@ -4204,7 +5179,7 @@
},
"chalk": {
"version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"requires": {
@@ -4230,149 +5205,54 @@
}
},
"grunt-contrib-cssmin": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-2.2.1.tgz",
- "integrity": "sha1-ZMvr5gE0vBJwykFUUU7EAHzBb38=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-3.0.0.tgz",
+ "integrity": "sha512-eXpooYmVGKMs/xV7DzTLgJFPVOfMuawPD3x0JwhlH0mumq2NtH3xsxaHxp1Y3NKxp0j0tRhFS6kSBRsz6TuTGg==",
"dev": true,
"requires": {
- "chalk": "^1.0.0",
- "clean-css": "~4.1.1",
+ "chalk": "^2.4.1",
+ "clean-css": "~4.2.1",
"maxmin": "^2.1.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- }
}
},
"grunt-contrib-jshint": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz",
- "integrity": "sha1-Np2QmyWTxA6L55lAshNAhQx5Oaw=",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-2.0.0.tgz",
+ "integrity": "sha512-4qR411I1bhvVrPkKBzCUcrWkTEtBuWioXi9ABWRXHoplRScg03jiMqLDpzS4pDhVsLOTx5F9l+0cnMc+Gd2MWg==",
"dev": true,
"requires": {
- "chalk": "^1.1.1",
+ "chalk": "^2.4.1",
"hooker": "^0.2.3",
- "jshint": "~2.9.4"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- }
+ "jshint": "~2.9.6"
}
},
"grunt-contrib-uglify": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-3.3.0.tgz",
- "integrity": "sha512-W9O7lJE3PlD8VCc5fyaf98QV7f5wEDiU4PBIh0+/6UBbk2LhgzEFS0/p+taH5UD3+PlEn7QPN0o06Z0To6SqXw==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-4.0.0.tgz",
+ "integrity": "sha512-vy3Vop2KDqdiwcGOGAjyKvjHFrRD/YK4KPQWR3Yt6OdYlgFw1z7HCuk66+IJ9s7oJmp9uRQXuuSHyawKRAgiMw==",
"dev": true,
"requires": {
- "chalk": "^1.0.0",
- "maxmin": "^1.1.0",
- "uglify-js": "~3.3.0",
+ "chalk": "^2.4.1",
+ "maxmin": "^2.1.0",
+ "uglify-js": "~3.4.8",
"uri-path": "^1.0.0"
},
"dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "commander": {
+ "version": "2.17.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
+ "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
"dev": true
},
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "uglify-js": {
+ "version": "3.4.9",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz",
+ "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==",
"dev": true,
"requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
+ "commander": "~2.17.1",
+ "source-map": "~0.6.1"
}
- },
- "gzip-size": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz",
- "integrity": "sha1-Zs+LEBBHInuVus5uodoMF37Vwi8=",
- "dev": true,
- "requires": {
- "browserify-zlib": "^0.1.4",
- "concat-stream": "^1.4.1"
- }
- },
- "maxmin": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz",
- "integrity": "sha1-cTZehKmd2Piz99X94vANHn9zvmE=",
- "dev": true,
- "requires": {
- "chalk": "^1.0.0",
- "figures": "^1.0.1",
- "gzip-size": "^1.0.0",
- "pretty-bytes": "^1.0.0"
- }
- },
- "pretty-bytes": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz",
- "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=",
- "dev": true,
- "requires": {
- "get-stdin": "^4.0.1",
- "meow": "^3.1.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
}
}
},
@@ -4400,9 +5280,9 @@
}
},
"grunt-known-options": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz",
- "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz",
+ "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==",
"dev": true
},
"grunt-legacy-log": {
@@ -4425,43 +5305,6 @@
"requires": {
"chalk": "~2.4.1",
"lodash": "~4.17.10"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
- "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
- "supports-color": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
- "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
}
},
"grunt-legacy-util": {
@@ -4488,7 +5331,7 @@
"grunt-postcss": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/grunt-postcss/-/grunt-postcss-0.9.0.tgz",
- "integrity": "sha1-++WTSmvp6siTr20FfiMYyX+unaM=",
+ "integrity": "sha512-lglLcVaoOIqH0sFv7RqwUKkEFGQwnlqyAKbatxZderwZGV1nDyKHN7gZS9LUiTx1t5GOvRBx0BEalHMyVwFAIA==",
"dev": true,
"requires": {
"chalk": "^2.1.0",
@@ -4508,7 +5351,7 @@
"dependencies": {
"lodash": {
"version": "3.10.1",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
"integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
"dev": true
}
@@ -4532,7 +5375,7 @@
},
"chalk": {
"version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"requires": {
@@ -4552,57 +5395,43 @@
}
},
"grunt-sass": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/grunt-sass/-/grunt-sass-2.1.0.tgz",
- "integrity": "sha512-XkexnQt/9rhReNd+Y7T0n/2g5FqYOQKfi2iSlpwDqvgs7EgEaGTxNhnWzHnbW5oNRvzL9AHopBG3AgRxL0d+DA==",
- "dev": true,
- "requires": {
- "each-async": "^1.0.0",
- "node-sass": "^4.7.2",
- "object-assign": "^4.0.1"
- }
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/grunt-sass/-/grunt-sass-3.0.2.tgz",
+ "integrity": "sha512-Ogq4cWqBre71gZIkgxIxevgzZHSIIsrKu/5yvPDl4Mvib0A4TRTJEQUdpQ0YV1iai0DPjayz02vDJE6KUVHQ2w==",
+ "dev": true
},
"grunt-shell": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/grunt-shell/-/grunt-shell-2.1.0.tgz",
- "integrity": "sha1-Q595FZ7RHmSmUaacyKPQK+v17MI=",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/grunt-shell/-/grunt-shell-3.0.1.tgz",
+ "integrity": "sha512-C8eR4frw/NmIFIwSvzSLS4wOQBUzC+z6QhrKPzwt/tlaIqlzH35i/O2MggVOBj2Sh1tbaAqpASWxGiGsi4JMIQ==",
"dev": true,
"requires": {
- "chalk": "^1.0.0",
- "npm-run-path": "^2.0.0"
+ "chalk": "^2.4.1",
+ "npm-run-path": "^2.0.0",
+ "strip-ansi": "^5.0.0"
},
"dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "ansi-regex": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz",
+ "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==",
"dev": true
},
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "strip-ansi": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz",
+ "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==",
"dev": true,
"requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
+ "ansi-regex": "^4.0.0"
}
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
}
}
},
"grunt-stylelint": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.10.0.tgz",
- "integrity": "sha512-1HC3H1CZlK3niJGORr+1nmcdtogoSiZex7ej9MtJPXVmxrvWvXTVhZppKoPVVQgHRvNozmtGCZTZr7c9kMPO5g==",
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/grunt-stylelint/-/grunt-stylelint-0.10.1.tgz",
+ "integrity": "sha512-7MAHUqySn2x0yCS4SEkrv5pVoTrP44j8IZGEF6UTQD9Nm7K96cGEhB6FFMWk+uXbRHiiU+c4s3B0h4rpT8nOyQ==",
"dev": true,
"requires": {
"chalk": "1.1.3"
@@ -4616,7 +5445,7 @@
},
"chalk": {
"version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"requires": {
@@ -4636,13 +5465,13 @@
}
},
"grunt-wp-i18n": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/grunt-wp-i18n/-/grunt-wp-i18n-1.0.2.tgz",
- "integrity": "sha1-4cwnw/bxiPbUMv0DBq97F/uDy1Q=",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/grunt-wp-i18n/-/grunt-wp-i18n-1.0.3.tgz",
+ "integrity": "sha512-CJNbEKeBeOSAPeaJ9B8iCgSwtaG63UR9/uT46a4OsIqnFhOJpeAi138JTlvjfIbnDVoBrzvdrKJe1svveLjUtA==",
"dev": true,
"requires": {
- "grunt": "^1.0.2",
- "node-wp-i18n": "^1.0.5"
+ "grunt": "^1.0.3",
+ "node-wp-i18n": "^1.2.2"
}
},
"gzip-size": {
@@ -4655,84 +5484,24 @@
}
},
"handlebars": {
- "version": "4.0.11",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
- "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz",
+ "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==",
"dev": true,
"requires": {
- "async": "^1.4.0",
+ "async": "^2.5.0",
"optimist": "^0.6.1",
- "source-map": "^0.4.4",
- "uglify-js": "^2.6"
+ "source-map": "^0.6.1",
+ "uglify-js": "^3.1.4"
},
"dependencies": {
- "camelcase": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
- "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
- "dev": true,
- "optional": true
- },
- "cliui": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
- "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
- "dev": true,
- "optional": true,
- "requires": {
- "center-align": "^0.1.1",
- "right-align": "^0.1.1",
- "wordwrap": "0.0.2"
- }
- },
- "source-map": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
- "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+ "async": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
+ "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
"dev": true,
"requires": {
- "amdefine": ">=0.0.4"
- }
- },
- "uglify-js": {
- "version": "2.8.29",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
- "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
- "dev": true,
- "optional": true,
- "requires": {
- "source-map": "~0.5.1",
- "uglify-to-browserify": "~1.0.0",
- "yargs": "~3.10.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true,
- "optional": true
- }
- }
- },
- "wordwrap": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
- "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
- "dev": true,
- "optional": true
- },
- "yargs": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
- "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
- "dev": true,
- "optional": true,
- "requires": {
- "camelcase": "^1.0.2",
- "cliui": "^2.1.0",
- "decamelize": "^1.0.0",
- "window-size": "0.1.0"
+ "lodash": "^4.17.10"
}
}
}
@@ -4744,12 +5513,12 @@
"dev": true
},
"har-validator": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
- "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
+ "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
"dev": true,
"requires": {
- "ajv": "^5.1.0",
+ "ajv": "^5.3.0",
"har-schema": "^2.0.0"
}
},
@@ -4769,15 +5538,9 @@
"dev": true
},
"has-flag": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
- "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
- "dev": true
- },
- "has-unicode": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
- "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"has-value": {
@@ -4840,30 +5603,12 @@
}
}
},
- "hawk": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
- "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
- "dev": true,
- "requires": {
- "boom": "2.x.x",
- "cryptiles": "2.x.x",
- "hoek": "2.x.x",
- "sntp": "1.x.x"
- }
- },
"he": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
"integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
"dev": true
},
- "hoek": {
- "version": "2.16.3",
- "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
- "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
- "dev": true
- },
"home-or-tmp": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
@@ -4874,6 +5619,15 @@
"os-tmpdir": "^1.0.1"
}
},
+ "homedir-polyfill": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
+ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
+ "dev": true,
+ "requires": {
+ "parse-passwd": "^1.0.0"
+ }
+ },
"hooker": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz",
@@ -4881,9 +5635,9 @@
"dev": true
},
"hosted-git-info": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
- "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=",
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
+ "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
"dev": true
},
"html-tags": {
@@ -4932,9 +5686,9 @@
}
},
"http-parser-js": {
- "version": "0.4.13",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz",
- "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=",
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz",
+ "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==",
"dev": true
},
"http-signature": {
@@ -4948,19 +5702,46 @@
"sshpk": "^1.7.0"
}
},
- "iconv-lite": {
- "version": "0.4.21",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz",
- "integrity": "sha1-xH+HM9AhcRievEpADzIY00gJR5g=",
+ "https-proxy-agent": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
+ "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
"dev": true,
"requires": {
- "safer-buffer": "^2.1.0"
+ "agent-base": "^4.1.0",
+ "debug": "^3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ }
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
}
},
"ignore": {
- "version": "3.3.8",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz",
- "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==",
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz",
+ "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==",
"dev": true
},
"immediate": {
@@ -4969,6 +5750,16 @@
"integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=",
"dev": true
},
+ "import-fresh": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.0.0.tgz",
+ "integrity": "sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ==",
+ "dev": true,
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
"import-lazy": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz",
@@ -4981,12 +5772,6 @@
"integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
"dev": true
},
- "in-publish": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
- "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=",
- "dev": true
- },
"indent-string": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
@@ -5018,9 +5803,15 @@
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
},
+ "ini": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "dev": true
+ },
"inquirer": {
"version": "0.11.4",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.11.4.tgz",
+ "resolved": "http://registry.npmjs.org/inquirer/-/inquirer-0.11.4.tgz",
"integrity": "sha1-geM3ToNhvq/y2XAWIG01nQsy+k0=",
"dev": true,
"requires": {
@@ -5047,7 +5838,7 @@
},
"chalk": {
"version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"requires": {
@@ -5060,7 +5851,7 @@
},
"lodash": {
"version": "3.10.1",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "resolved": "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
"integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
"dev": true
},
@@ -5073,18 +5864,18 @@
}
},
"invariant": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
- "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
"dev": true,
"requires": {
"loose-envify": "^1.0.0"
}
},
- "invert-kv": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
- "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+ "ip-regex": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
+ "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
"dev": true
},
"is-accessor-descriptor": {
@@ -5137,12 +5928,12 @@
"is-buffer": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
"dev": true
},
"is-builtin-module": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "resolved": "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
"integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
"dev": true,
"requires": {
@@ -5193,13 +5984,15 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
"integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
- "dev": true
+ "dev": true,
+ "optional": true
},
"is-equal-shallow": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
"integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
"dev": true,
+ "optional": true,
"requires": {
"is-primitive": "^2.0.0"
}
@@ -5214,7 +6007,8 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
"integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
- "dev": true
+ "dev": true,
+ "optional": true
},
"is-finite": {
"version": "1.0.2",
@@ -5239,6 +6033,7 @@
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
"integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
"dev": true,
+ "optional": true,
"requires": {
"is-extglob": "^1.0.0"
}
@@ -5249,30 +6044,12 @@
"integrity": "sha512-but/G3sapV3MNyqiDBLrOi4x8uCIw0RY3o/Vb5GT0sMFHrVV7731wFSVy41T5FO1og7G0gXLJh0MkgPRouko/A==",
"dev": true
},
- "is-my-ip-valid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz",
- "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==",
- "dev": true
- },
- "is-my-json-valid": {
- "version": "2.17.2",
- "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz",
- "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==",
- "dev": true,
- "requires": {
- "generate-function": "^2.0.0",
- "generate-object-property": "^1.1.0",
- "is-my-ip-valid": "^1.0.0",
- "jsonpointer": "^4.0.0",
- "xtend": "^4.0.0"
- }
- },
"is-number": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
"integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
"dev": true,
+ "optional": true,
"requires": {
"kind-of": "^3.0.2"
}
@@ -5283,23 +6060,6 @@
"integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
"dev": true
},
- "is-odd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz",
- "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==",
- "dev": true,
- "requires": {
- "is-number": "^4.0.0"
- },
- "dependencies": {
- "is-number": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
- "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
- "dev": true
- }
- }
- },
"is-path-cwd": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
@@ -5307,9 +6067,9 @@
"dev": true
},
"is-path-in-cwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
- "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
+ "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
"dev": true,
"requires": {
"is-path-inside": "^1.0.0"
@@ -5351,18 +6111,20 @@
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
"integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
- "dev": true
+ "dev": true,
+ "optional": true
},
"is-primitive": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
"integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
- "dev": true
+ "dev": true,
+ "optional": true
},
- "is-property": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
- "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
+ "is-promise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
"dev": true
},
"is-regexp": {
@@ -5383,6 +6145,12 @@
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
"dev": true
},
+ "is-url": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
+ "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==",
+ "dev": true
+ },
"is-utf8": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
@@ -5398,7 +6166,7 @@
"is-windows": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
- "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
"dev": true
},
"is-word-character": {
@@ -5407,6 +6175,17 @@
"integrity": "sha512-T3FlsX8rCHAH8e7RE7PfOPZVFQlcV3XRF9eOOBQ1uf70OxO7CjjSOjeImMPCADBdYWcStAbVbYvJ1m2D3tb+EA==",
"dev": true
},
+ "is2": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.1.tgz",
+ "integrity": "sha512-+WaJvnaA7aJySz2q/8sLjMb2Mw14KTplHmSwcSpZ/fWJPkUmqw3YTzSWbPJ7OAwRvdYTWF2Wg+yYJ1AdP5Z8CA==",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "ip-regex": "^2.1.0",
+ "is-url": "^1.2.2"
+ }
+ },
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@@ -5424,6 +6203,7 @@
"resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
"integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
"dev": true,
+ "optional": true,
"requires": {
"isarray": "1.0.0"
}
@@ -5459,34 +6239,24 @@
}
},
"istanbul-api": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.6.tgz",
- "integrity": "sha512-luJDnB1uJ5Qsg/WwusGfNXayQ4598yDgW5S0nUS85T576m1LVJzSqLrCDULkT6sTQXVKHa54093gNuCKumMCjQ==",
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz",
+ "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==",
"dev": true,
"requires": {
"async": "^2.1.4",
- "compare-versions": "^3.1.0",
"fileset": "^2.0.2",
- "istanbul-lib-coverage": "^1.2.0",
- "istanbul-lib-hook": "^1.2.0",
- "istanbul-lib-instrument": "^2.1.0",
- "istanbul-lib-report": "^1.1.4",
- "istanbul-lib-source-maps": "^1.2.5",
- "istanbul-reports": "^1.4.1",
+ "istanbul-lib-coverage": "^1.2.1",
+ "istanbul-lib-hook": "^1.2.2",
+ "istanbul-lib-instrument": "^1.10.2",
+ "istanbul-lib-report": "^1.1.5",
+ "istanbul-lib-source-maps": "^1.2.6",
+ "istanbul-reports": "^1.5.1",
"js-yaml": "^3.7.0",
"mkdirp": "^0.5.1",
"once": "^1.4.0"
},
"dependencies": {
- "append-transform": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz",
- "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==",
- "dev": true,
- "requires": {
- "default-require-extensions": "^2.0.0"
- }
- },
"async": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
@@ -5496,108 +6266,12 @@
"lodash": "^4.17.10"
}
},
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "default-require-extensions": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz",
- "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=",
- "dev": true,
- "requires": {
- "strip-bom": "^3.0.0"
- }
- },
"esprima": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
- "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true
},
- "has-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
- "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
- "dev": true
- },
- "istanbul-lib-coverage": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz",
- "integrity": "sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A==",
- "dev": true
- },
- "istanbul-lib-hook": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.1.tgz",
- "integrity": "sha512-eLAMkPG9FU0v5L02lIkcj/2/Zlz9OuluaXikdr5iStk8FDbSwAixTK9TkYxbF0eNnzAJTwM2fkV2A1tpsIp4Jg==",
- "dev": true,
- "requires": {
- "append-transform": "^1.0.0"
- }
- },
- "istanbul-lib-instrument": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-2.2.0.tgz",
- "integrity": "sha512-ozQGtlIw+/a/F3n6QwWiuuyRAPp64+g2GVsKYsIez0sgIEzkU5ZpL2uZ5pmAzbEJ82anlRaPlOQZzkRXspgJyg==",
- "dev": true,
- "requires": {
- "@babel/generator": "7.0.0-beta.49",
- "@babel/parser": "7.0.0-beta.49",
- "@babel/template": "7.0.0-beta.49",
- "@babel/traverse": "7.0.0-beta.49",
- "@babel/types": "7.0.0-beta.49",
- "istanbul-lib-coverage": "^2.0.0",
- "semver": "^5.5.0"
- },
- "dependencies": {
- "istanbul-lib-coverage": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.0.tgz",
- "integrity": "sha512-yMSw5xLIbdaxiVXHk3amfNM2WeBxLrwH/BCyZ9HvA/fylwziAIJOG2rKqWyLqEJqwKT725vxxqidv+SyynnGAA==",
- "dev": true
- }
- }
- },
- "istanbul-lib-report": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz",
- "integrity": "sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA==",
- "dev": true,
- "requires": {
- "istanbul-lib-coverage": "^1.2.0",
- "mkdirp": "^0.5.1",
- "path-parse": "^1.0.5",
- "supports-color": "^3.1.2"
- }
- },
- "istanbul-lib-source-maps": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz",
- "integrity": "sha512-8O2T/3VhrQHn0XcJbP1/GN7kXMiRAlPi+fj3uEHrjBD8Oz7Py0prSC25C09NuAZS6bgW1NNKAvCSHZXB0irSGA==",
- "dev": true,
- "requires": {
- "debug": "^3.1.0",
- "istanbul-lib-coverage": "^1.2.0",
- "mkdirp": "^0.5.1",
- "rimraf": "^2.6.1",
- "source-map": "^0.5.3"
- }
- },
- "istanbul-reports": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.0.tgz",
- "integrity": "sha512-HeZG0WHretI9FXBni5wZ9DOgNziqDCEwetxnme5k1Vv5e81uTqcsy3fMH99gXGDGKr1ea87TyGseDMa2h4HEUA==",
- "dev": true,
- "requires": {
- "handlebars": "^4.0.11"
- }
- },
"js-yaml": {
"version": "3.12.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
@@ -5607,23 +6281,55 @@
"argparse": "^1.0.7",
"esprima": "^4.0.0"
}
- },
- "semver": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
- "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
- "dev": true
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
- },
- "strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ }
+ }
+ },
+ "istanbul-lib-coverage": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz",
+ "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==",
+ "dev": true
+ },
+ "istanbul-lib-hook": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz",
+ "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==",
+ "dev": true,
+ "requires": {
+ "append-transform": "^0.4.0"
+ }
+ },
+ "istanbul-lib-instrument": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz",
+ "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==",
+ "dev": true,
+ "requires": {
+ "babel-generator": "^6.18.0",
+ "babel-template": "^6.16.0",
+ "babel-traverse": "^6.18.0",
+ "babel-types": "^6.18.0",
+ "babylon": "^6.18.0",
+ "istanbul-lib-coverage": "^1.2.1",
+ "semver": "^5.3.0"
+ }
+ },
+ "istanbul-lib-report": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz",
+ "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==",
+ "dev": true,
+ "requires": {
+ "istanbul-lib-coverage": "^1.2.1",
+ "mkdirp": "^0.5.1",
+ "path-parse": "^1.0.5",
+ "supports-color": "^3.1.2"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
"dev": true
},
"supports-color": {
@@ -5637,10 +6343,88 @@
}
}
},
+ "istanbul-lib-source-maps": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz",
+ "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==",
+ "dev": true,
+ "requires": {
+ "debug": "^3.1.0",
+ "istanbul-lib-coverage": "^1.2.1",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.6.1",
+ "source-map": "^0.5.3"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "istanbul-reports": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz",
+ "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==",
+ "dev": true,
+ "requires": {
+ "handlebars": "^4.0.3"
+ }
+ },
+ "iterall": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.2.2.tgz",
+ "integrity": "sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA==",
+ "dev": true
+ },
+ "jest-docblock": {
+ "version": "21.3.0-beta.11",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.3.0-beta.11.tgz",
+ "integrity": "sha512-sxSwZUm7JyCO8dverup5g/OKJhjYRrBdgEdezIO1qAmMGWuza7ewovpfDmxp+JLvlm0i2WRFKUQNNIMGmPGTVg==",
+ "dev": true,
+ "requires": {
+ "detect-newline": "^2.1.0"
+ }
+ },
+ "jest-get-type": {
+ "version": "21.2.0",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-21.2.0.tgz",
+ "integrity": "sha512-y2fFw3C+D0yjNSDp7ab1kcd6NUYfy3waPTlD8yWkAtiocJdBRQqNoRqVfMNxgj+IjT0V5cBIHJO0z9vuSSZ43Q==",
+ "dev": true
+ },
+ "jest-validate": {
+ "version": "21.1.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-21.1.0.tgz",
+ "integrity": "sha512-xS0cyErNWpsLFlGkn/b87pk/Mv7J+mCTs8hQ4KmtOIIoM1sHYobXII8AtkoN8FC7E3+Ptxjo+/3xWk6LK1dKcw==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.1",
+ "jest-get-type": "^21.0.2",
+ "leven": "^2.1.0",
+ "pretty-format": "^21.1.0"
+ }
+ },
"js-base64": {
- "version": "2.4.5",
- "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.5.tgz",
- "integrity": "sha512-aUnNwqMOXw3yvErjMPSQu6qIIzUmT1e5KcU1OZxRDU1g/am6mzBvcrmLAYwzmB59BHPrh5/tKaiF4OPhqRWESQ==",
+ "version": "2.4.9",
+ "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz",
+ "integrity": "sha512-xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==",
"dev": true
},
"js-tokens": {
@@ -5663,8 +6447,7 @@
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
- "dev": true,
- "optional": true
+ "dev": true
},
"jsesc": {
"version": "1.3.0",
@@ -5673,27 +6456,19 @@
"dev": true
},
"jshint": {
- "version": "2.9.5",
- "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.5.tgz",
- "integrity": "sha1-HnJSkVzmgbQIJ+4UJIxG006apiw=",
+ "version": "2.9.7",
+ "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.7.tgz",
+ "integrity": "sha512-Q8XN38hGsVQhdlM+4gd1Xl7OB1VieSuCJf+fEJjpo59JH99bVJhXRXAh26qQ15wfdd1VPMuDWNeSWoNl53T4YA==",
"dev": true,
"requires": {
"cli": "~1.0.0",
"console-browserify": "1.1.x",
"exit": "0.1.x",
"htmlparser2": "3.8.x",
- "lodash": "3.7.x",
+ "lodash": "~4.17.10",
"minimatch": "~3.0.2",
"shelljs": "0.3.x",
"strip-json-comments": "1.0.x"
- },
- "dependencies": {
- "lodash": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz",
- "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=",
- "dev": true
- }
}
},
"json-parse-better-errors": {
@@ -5714,6 +6489,12 @@
"integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
"dev": true
},
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
"json-stringify-safe": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
@@ -5722,25 +6503,10 @@
},
"json5": {
"version": "0.5.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
"integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
"dev": true
},
- "jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.6"
- }
- },
- "jsonpointer": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
- "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
- "dev": true
- },
"jsprim": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
@@ -5756,7 +6522,7 @@
"jszip": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz",
- "integrity": "sha1-48KmxtcGrG5gMxQDbUPNQL7v3zc=",
+ "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==",
"dev": true,
"requires": {
"core-js": "~2.3.0",
@@ -5768,19 +6534,31 @@
"dependencies": {
"core-js": {
"version": "2.3.0",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz",
+ "resolved": "http://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz",
"integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=",
"dev": true
},
+ "es6-promise": {
+ "version": "3.0.2",
+ "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz",
+ "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=",
+ "dev": true
+ },
"pako": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
- "integrity": "sha1-AQEhG6pwxLykoPY/Igbpe3368lg=",
+ "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
"dev": true
},
"readable-stream": {
"version": "2.0.6",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
+ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
"integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
"dev": true,
"requires": {
@@ -5800,12 +6578,6 @@
}
}
},
- "kew": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz",
- "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=",
- "dev": true
- },
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
@@ -5816,25 +6588,25 @@
}
},
"known-css-properties": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.6.1.tgz",
- "integrity": "sha512-nQRpMcHm1cQ6gmztdvLcIvxocznSMqH/y6XtERrWrHaymOYdDGroRqetJvJycxGEr1aakXiigDgn7JnzuXlk6A==",
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.10.0.tgz",
+ "integrity": "sha512-OMPb86bpVbnKN/2VJw1Ggs1Hw/FNGwEL1QYiNIEHaB5FSLybJ4QD7My5Hm9yDhgpRrRnnOgu0oKeuuABzASeBw==",
"dev": true
},
- "lazy-cache": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
- "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
- "dev": true,
- "optional": true
+ "leven": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz",
+ "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=",
+ "dev": true
},
- "lcid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
- "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
"dev": true,
"requires": {
- "invert-kv": "^1.0.0"
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
}
},
"lie": {
@@ -5847,14 +6619,14 @@
}
},
"livereload-js": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.3.0.tgz",
- "integrity": "sha1-w6si6Kr1vzUF2A0JjLrWdyZUjJo=",
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz",
+ "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==",
"dev": true
},
"load-json-file": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
"integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
"dev": true,
"requires": {
@@ -5867,7 +6639,7 @@
"dependencies": {
"pify": {
"version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
"dev": true
}
@@ -5892,27 +6664,22 @@
}
},
"lodash": {
- "version": "4.17.10",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
- "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
+ "version": "4.17.11",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+ "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
"dev": true
},
- "lodash.assign": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
- "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
- "dev": true
+ "lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
+ "dev": true,
+ "optional": true
},
- "lodash.clonedeep": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
- "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
- "dev": true
- },
- "lodash.mergewith": {
- "version": "4.6.1",
- "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz",
- "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==",
+ "lodash.unescape": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.unescape/-/lodash.unescape-4.0.1.tgz",
+ "integrity": "sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=",
"dev": true
},
"log-symbols": {
@@ -5924,12 +6691,6 @@
"chalk": "^2.0.1"
}
},
- "longest": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
- "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
- "dev": true
- },
"longest-streak": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.2.tgz",
@@ -5937,12 +6698,12 @@
"dev": true
},
"loose-envify": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
- "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"dev": true,
"requires": {
- "js-tokens": "^3.0.0"
+ "js-tokens": "^3.0.0 || ^4.0.0"
}
},
"loud-rejection": {
@@ -5955,16 +6716,6 @@
"signal-exit": "^3.0.0"
}
},
- "lru-cache": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
- "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=",
- "dev": true,
- "requires": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
- }
- },
"map-cache": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
@@ -6000,14 +6751,15 @@
},
"marked": {
"version": "0.3.19",
- "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz",
- "integrity": "sha1-XUf3CcTJ/Dwha21GEnKA9As515A="
+ "resolved": "http://registry.npmjs.org/marked/-/marked-0.3.19.tgz",
+ "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg=="
},
"math-random": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
"integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=",
- "dev": true
+ "dev": true,
+ "optional": true
},
"mathml-tag-names": {
"version": "2.1.0",
@@ -6035,7 +6787,7 @@
},
"chalk": {
"version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"requires": {
@@ -6055,18 +6807,26 @@
}
},
"mdast-util-compact": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.1.tgz",
- "integrity": "sha1-zbX4TitqLTEU3zO9BdnLMuPECDo=",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.2.tgz",
+ "integrity": "sha512-d2WS98JSDVbpSsBfVvD9TaDMlqPRz7ohM/11G0rp5jOBb5q96RJ6YLszQ/09AAixyzh23FeIpCGqfaamEADtWg==",
"dev": true,
"requires": {
- "unist-util-modify-children": "^1.0.0",
"unist-util-visit": "^1.1.0"
}
},
+ "mem": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
+ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^1.0.0"
+ }
+ },
"meow": {
"version": "3.7.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+ "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
"integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
"dev": true,
"requires": {
@@ -6084,21 +6844,21 @@
"dependencies": {
"minimist": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"dev": true
}
}
},
"merge": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz",
- "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo="
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz",
+ "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ=="
},
"merge2": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz",
- "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==",
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz",
+ "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==",
"dev": true
},
"micromatch": {
@@ -6106,6 +6866,7 @@
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
"integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
"dev": true,
+ "optional": true,
"requires": {
"arr-diff": "^2.0.0",
"array-unique": "^0.2.1",
@@ -6123,24 +6884,30 @@
}
},
"mime-db": {
- "version": "1.30.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz",
- "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=",
+ "version": "1.37.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz",
+ "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==",
"dev": true
},
"mime-types": {
- "version": "2.1.17",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz",
- "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
+ "version": "2.1.21",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz",
+ "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==",
"dev": true,
"requires": {
- "mime-db": "~1.30.0"
+ "mime-db": "~1.37.0"
}
},
+ "mimic-fn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "dev": true
+ },
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
@@ -6148,7 +6915,7 @@
},
"minimist": {
"version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
},
"minimist-options": {
@@ -6184,7 +6951,7 @@
},
"mkdirp": {
"version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"dev": true,
"requires": {
@@ -6194,7 +6961,7 @@
"mocha": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz",
- "integrity": "sha1-bYrlCPWRZ/lA8rWzxKYSrlDJCuY=",
+ "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==",
"dev": true,
"requires": {
"browser-stdout": "1.3.1",
@@ -6212,35 +6979,37 @@
"dependencies": {
"commander": {
"version": "2.15.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
- "integrity": "sha1-30boZ9D8Kuxmo0ZitAapzK//Ww8=",
+ "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
+ "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
"dev": true
},
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
},
- "diff": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
- "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=",
- "dev": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
},
"supports-color": {
"version": "5.4.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
- "integrity": "sha1-HGszdALCE3YF7+GfEP7DkPb6q1Q=",
+ "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
@@ -6261,15 +7030,16 @@
"dev": true
},
"nan": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
- "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==",
- "dev": true
+ "version": "2.11.1",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz",
+ "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==",
+ "dev": true,
+ "optional": true
},
"nanomatch": {
- "version": "1.2.9",
- "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz",
- "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==",
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
"dev": true,
"requires": {
"arr-diff": "^4.0.0",
@@ -6277,7 +7047,6 @@
"define-property": "^2.0.2",
"extend-shallow": "^3.0.2",
"fragment-cache": "^0.2.1",
- "is-odd": "^2.0.0",
"is-windows": "^1.0.2",
"kind-of": "^6.0.2",
"object.pick": "^1.3.0",
@@ -6306,106 +7075,35 @@
}
}
},
- "node-gyp": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.7.0.tgz",
- "integrity": "sha512-qDQE/Ft9xXP6zphwx4sD0t+VhwV7yFaloMpfbL2QnnDZcyaiakWlLdtFGGQfTAwpFHdpbRhRxVhIHN1OKAjgbg==",
- "dev": true,
- "requires": {
- "fstream": "^1.0.0",
- "glob": "^7.0.3",
- "graceful-fs": "^4.1.2",
- "mkdirp": "^0.5.0",
- "nopt": "2 || 3",
- "npmlog": "0 || 1 || 2 || 3 || 4",
- "osenv": "0",
- "request": ">=2.9.0 <2.82.0",
- "rimraf": "2",
- "semver": "~5.3.0",
- "tar": "^2.0.0",
- "which": "1"
- },
- "dependencies": {
- "semver": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
- "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
- "dev": true
- }
- }
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
},
- "node-sass": {
- "version": "4.9.0",
- "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.0.tgz",
- "integrity": "sha512-QFHfrZl6lqRU3csypwviz2XLgGNOoWQbo2GOvtsfQqOfL4cy1BtWnhx/XUeAO9LT3ahBzSRXcEO6DdvAH9DzSg==",
+ "nice-try": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+ "dev": true
+ },
+ "node-releases": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.3.tgz",
+ "integrity": "sha512-6VrvH7z6jqqNFY200kdB6HdzkgM96Oaj9v3dqGfgp6mF+cHmU4wyQKZ2/WPDRVoR0Jz9KqbamaBN0ZhdUaysUQ==",
"dev": true,
"requires": {
- "async-foreach": "^0.1.3",
- "chalk": "^1.1.1",
- "cross-spawn": "^3.0.0",
- "gaze": "^1.0.0",
- "get-stdin": "^4.0.1",
- "glob": "^7.0.3",
- "in-publish": "^2.0.0",
- "lodash.assign": "^4.2.0",
- "lodash.clonedeep": "^4.3.2",
- "lodash.mergewith": "^4.6.0",
- "meow": "^3.7.0",
- "mkdirp": "^0.5.1",
- "nan": "^2.10.0",
- "node-gyp": "^3.3.1",
- "npmlog": "^4.0.0",
- "request": "~2.79.0",
- "sass-graph": "^2.2.4",
- "stdout-stream": "^1.4.0",
- "true-case-path": "^1.0.2"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "cross-spawn": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
- "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
- "dev": true,
- "requires": {
- "lru-cache": "^4.0.1",
- "which": "^1.2.9"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- }
+ "semver": "^5.3.0"
}
},
"node-wp-i18n": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/node-wp-i18n/-/node-wp-i18n-1.1.1.tgz",
- "integrity": "sha1-ODd6vO93ZVJhfWqG9q+Nq5jX+vs=",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/node-wp-i18n/-/node-wp-i18n-1.2.2.tgz",
+ "integrity": "sha512-uRtKibN+PdwED6YzzcdCk4AG7qPt2Cmplpwq0szUz6alz1U/15N1U56EY6kcolGcVrJacW5s70QRB5k8d5k9gg==",
"dev": true,
"requires": {
"bluebird": "^3.4.1",
- "gettext-parser": "^1.2.0",
+ "gettext-parser": "^3.1.0",
"glob": "^7.0.5",
"lodash": "^4.14.2",
"minimist": "^1.2.0",
@@ -6433,7 +7131,7 @@
"normalize-package-data": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
- "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=",
+ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
"dev": true,
"requires": {
"hosted-git-info": "^2.1.4",
@@ -6447,6 +7145,7 @@
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
"integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
"dev": true,
+ "optional": true,
"requires": {
"remove-trailing-separator": "^1.0.1"
}
@@ -6472,18 +7171,6 @@
"path-key": "^2.0.0"
}
},
- "npmlog": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
- "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
- "dev": true,
- "requires": {
- "are-we-there-yet": "~1.1.2",
- "console-control-strings": "~1.1.0",
- "gauge": "~2.7.3",
- "set-blocking": "~2.0.0"
- }
- },
"num2fraction": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
@@ -6497,9 +7184,9 @@
"dev": true
},
"oauth-sign": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
- "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
"dev": true
},
"object-assign": {
@@ -6552,6 +7239,7 @@
"resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
"integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
"dev": true,
+ "optional": true,
"requires": {
"for-own": "^0.1.4",
"is-extendable": "^0.1.1"
@@ -6585,7 +7273,7 @@
},
"onetime": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
+ "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
"integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
"dev": true
},
@@ -6607,37 +7295,32 @@
}
}
},
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.4",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "wordwrap": "~1.0.0"
+ }
+ },
"os-homedir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
"dev": true
},
- "os-locale": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
- "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
- "dev": true,
- "requires": {
- "lcid": "^1.0.0"
- }
- },
"os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
"dev": true
},
- "osenv": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
- "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
- "dev": true,
- "requires": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.0"
- }
- },
"output-file-sync": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz",
@@ -6679,16 +7362,19 @@
"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
"dev": true
},
- "pako": {
- "version": "0.2.9",
- "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
- "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=",
- "dev": true
+ "parent-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.0.tgz",
+ "integrity": "sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA==",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0"
+ }
},
"parse-entities": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.1.2.tgz",
- "integrity": "sha512-5N9lmQ7tmxfXf+hO3X6KRG6w7uYO/HL9fHalSySTdyn63C3WNvTM/1R8tn1u1larNcEbo3Slcy2bsVDQqvEpUg==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.0.tgz",
+ "integrity": "sha512-XXtDdOPLSB0sHecbEapQi6/58U/ODj/KWfIXmmMCJF/eRn8laX6LZbOyioMoETOOJoWRW8/qTSl5VQkUIfKM5g==",
"dev": true,
"requires": {
"character-entities": "^1.0.0",
@@ -6704,6 +7390,7 @@
"resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
"integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
"dev": true,
+ "optional": true,
"requires": {
"glob-base": "^0.3.0",
"is-dotfile": "^1.0.0",
@@ -6720,6 +7407,21 @@
"error-ex": "^1.2.0"
}
},
+ "parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+ "dev": true
+ },
+ "parse5": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz",
+ "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
"pascalcase": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
@@ -6760,9 +7462,24 @@
"dev": true
},
"path-parse": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
- "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "path-root": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
+ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+ "dev": true,
+ "requires": {
+ "path-root-regex": "^0.1.0"
+ }
+ },
+ "path-root-regex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
+ "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
"dev": true
},
"path-type": {
@@ -6778,7 +7495,7 @@
"dependencies": {
"pify": {
"version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
"dev": true
}
@@ -6823,6 +7540,12 @@
"pinkie": "^2.0.0"
}
},
+ "pluralize": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
+ "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==",
+ "dev": true
+ },
"posix-character-classes": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
@@ -6830,35 +7553,41 @@
"dev": true
},
"postcss": {
- "version": "6.0.14",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz",
- "integrity": "sha1-VTTHIRRznnXQr88BfbhTCZ9WKIU=",
+ "version": "6.0.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
"dev": true,
"requires": {
- "chalk": "^2.3.0",
+ "chalk": "^2.4.1",
"source-map": "^0.6.1",
- "supports-color": "^4.4.0"
+ "supports-color": "^5.4.0"
}
},
"postcss-html": {
- "version": "0.23.7",
- "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.23.7.tgz",
- "integrity": "sha1-RxRsFeIbnAB0bEARXc/4JwxDnzI=",
+ "version": "0.34.0",
+ "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.34.0.tgz",
+ "integrity": "sha512-BIW982Kbf9/RikInNhNS3/GA6x/qY/+jhVS9KumqXZtU9ss8Yq15HhPJ6mnaXcU5bFq2ULxpOv96mHPAErpGMQ==",
"dev": true,
"requires": {
"htmlparser2": "^3.9.2"
},
"dependencies": {
+ "domelementtype": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+ "dev": true
+ },
"entities": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
- "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
"dev": true
},
"htmlparser2": {
- "version": "3.9.2",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz",
- "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=",
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.0.tgz",
+ "integrity": "sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==",
"dev": true,
"requires": {
"domelementtype": "^1.3.0",
@@ -6866,15 +7595,36 @@
"domutils": "^1.5.1",
"entities": "^1.1.1",
"inherits": "^2.0.1",
- "readable-stream": "^2.0.2"
+ "readable-stream": "^3.0.6"
+ }
+ },
+ "readable-stream": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz",
+ "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
}
}
}
},
+ "postcss-jsx": {
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/postcss-jsx/-/postcss-jsx-0.35.0.tgz",
+ "integrity": "sha512-AU2/9QDmHYJRxTiniMt2bJ9fwCzVF6n00VnR4gdnFGHeXRW2mGwoptpuPgYjfivkdI8LlNIuo+w8TyS6a4JhJw==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.1.2",
+ "postcss-styled": ">=0.34.0"
+ }
+ },
"postcss-less": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-1.1.5.tgz",
- "integrity": "sha512-QQIiIqgEjNnquc0d4b6HDOSFZxbFQoy4MPpli2lSLpKhMyBkKwwca2HFqu4xzxlKID/F2fxSOowwtKpgczhF7A==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-1.1.3.tgz",
+ "integrity": "sha512-WS0wsQxRm+kmN8wEYAGZ3t4lnoNfoyx9EJZrhiPR1K0lMHR0UNWnz52Ya5QRXChHtY75Ef+kDc05FpnBujebgw==",
"dev": true,
"requires": {
"postcss": "^5.2.16"
@@ -6888,7 +7638,7 @@
},
"chalk": {
"version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true,
"requires": {
@@ -6943,9 +7693,9 @@
}
},
"postcss-markdown": {
- "version": "0.23.7",
- "resolved": "https://registry.npmjs.org/postcss-markdown/-/postcss-markdown-0.23.7.tgz",
- "integrity": "sha1-fjo5h5QpXEJeUeTwq97m0TrT0TQ=",
+ "version": "0.34.0",
+ "resolved": "https://registry.npmjs.org/postcss-markdown/-/postcss-markdown-0.34.0.tgz",
+ "integrity": "sha512-cKPggF9OMOKPoqDm5YpYszCqMsImFh78FK6P8p6IsEKZB6IkUJYKz0/QgadYy4jLb60jcFIHJ6v6jsMH7/ZQrA==",
"dev": true,
"requires": {
"remark": "^9.0.0",
@@ -6959,15 +7709,61 @@
"dev": true
},
"postcss-reporter": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-5.0.0.tgz",
- "integrity": "sha512-rBkDbaHAu5uywbCR2XE8a25tats3xSOsGNx6mppK6Q9kSFGKc/FyAzfci+fWM2l+K402p1D0pNcfDGxeje5IKg==",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-6.0.1.tgz",
+ "integrity": "sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==",
"dev": true,
"requires": {
- "chalk": "^2.0.1",
- "lodash": "^4.17.4",
- "log-symbols": "^2.0.0",
- "postcss": "^6.0.8"
+ "chalk": "^2.4.1",
+ "lodash": "^4.17.11",
+ "log-symbols": "^2.2.0",
+ "postcss": "^7.0.7"
+ },
+ "dependencies": {
+ "postcss": {
+ "version": "7.0.8",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.8.tgz",
+ "integrity": "sha512-WudsIzuTKRw9IInRTPBgVXJ7DKR26HT09Rxp0g3w0Fqh3TUtYICcUmvC0xURj04o3vdcDtnjCAUCECg/p341iQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ }
+ }
+ },
+ "supports-color": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
+ "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
}
},
"postcss-resolve-nested-selector": {
@@ -6977,65 +7773,105 @@
"dev": true
},
"postcss-safe-parser": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-3.0.1.tgz",
- "integrity": "sha1-t1Pv9sfArqXoN1++TN6L+QY/8UI=",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.1.tgz",
+ "integrity": "sha512-xZsFA3uX8MO3yAda03QrG3/Eg1LN3EPfjjf07vke/46HERLZyHrTsQ9E1r1w1W//fWEhtYNndo2hQplN2cVpCQ==",
"dev": true,
"requires": {
- "postcss": "^6.0.6"
- }
- },
- "postcss-sass": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.3.2.tgz",
- "integrity": "sha512-0HgxikiZ07VKYr98KT+k7/rAzyMgZlP+3+R8vUti56T2dPdhW0OhPGDQzddxY/N2iDtBVZQqCHRDA09j5I6EWg==",
- "dev": true,
- "requires": {
- "gonzales-pe": "4.2.3",
- "postcss": "6.0.22"
+ "postcss": "^7.0.0"
},
"dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
"chalk": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
- "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
}
},
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
"postcss": {
- "version": "6.0.22",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz",
- "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==",
+ "version": "7.0.8",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.8.tgz",
+ "integrity": "sha512-WudsIzuTKRw9IInRTPBgVXJ7DKR26HT09Rxp0g3w0Fqh3TUtYICcUmvC0xURj04o3vdcDtnjCAUCECg/p341iQ==",
"dev": true,
"requires": {
- "chalk": "^2.4.1",
+ "chalk": "^2.4.2",
"source-map": "^0.6.1",
- "supports-color": "^5.4.0"
+ "supports-color": "^6.0.0"
}
},
"supports-color": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
- "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
+ "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "postcss-sass": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.3.5.tgz",
+ "integrity": "sha512-B5z2Kob4xBxFjcufFnhQ2HqJQ2y/Zs/ic5EZbCywCkxKd756Q40cIQ/veRDwSrw1BF6+4wUgmpm0sBASqVi65A==",
+ "dev": true,
+ "requires": {
+ "gonzales-pe": "^4.2.3",
+ "postcss": "^7.0.1"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "postcss": {
+ "version": "7.0.8",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.8.tgz",
+ "integrity": "sha512-WudsIzuTKRw9IInRTPBgVXJ7DKR26HT09Rxp0g3w0Fqh3TUtYICcUmvC0xURj04o3vdcDtnjCAUCECg/p341iQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
+ "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
@@ -7044,90 +7880,212 @@
}
},
"postcss-scss": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-1.0.5.tgz",
- "integrity": "sha512-gJB1tKYMkBy0MU+COt6WXA4ZiRctAKoWLa6qD7a6bbEbBMqrpa/BhfQdN80eYMV+JkKddZVEpZlOggnGShpvyg==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-1.0.2.tgz",
+ "integrity": "sha1-/0XPM1S4ee6JpOtoaA9GrJuxT5Q=",
"dev": true,
"requires": {
- "postcss": "^6.0.21"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
- "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
- "postcss": {
- "version": "6.0.22",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz",
- "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==",
- "dev": true,
- "requires": {
- "chalk": "^2.4.1",
- "source-map": "^0.6.1",
- "supports-color": "^5.4.0"
- }
- },
- "supports-color": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
- "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
+ "postcss": "^6.0.3"
}
},
"postcss-selector-parser": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz",
- "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=",
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz",
+ "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=",
"dev": true,
"requires": {
- "dot-prop": "^4.1.1",
+ "flatten": "^1.0.2",
"indexes-of": "^1.0.1",
"uniq": "^1.0.1"
}
},
+ "postcss-styled": {
+ "version": "0.34.0",
+ "resolved": "https://registry.npmjs.org/postcss-styled/-/postcss-styled-0.34.0.tgz",
+ "integrity": "sha512-Uaeetr/xOiQWGJgzPFOr32/Bwykpfh9TVE26OpmwDb8eEN205TS/gqkt9ri+C6otQzQKXqbMfeZNbKYi7QpeNA==",
+ "dev": true
+ },
"postcss-syntax": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.9.1.tgz",
- "integrity": "sha512-oC78MbSKmT/kPgqRl9sQrBIsbfr4TN+vH0STuUa7gnewVg9cs+wjJ00Lclu1GbKy38vJE7tBrhvjlEWvyxiZcg==",
+ "version": "0.34.0",
+ "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.34.0.tgz",
+ "integrity": "sha512-L36NZwq2UK743US+vl1CRMdBRZCBmFYfThP9n9jCFhX1Wfk6BqnRSgt0Fy8q44IwxPee/GCzlo7T1c1JIeUDlQ==",
"dev": true
},
"postcss-value-parser": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz",
- "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=",
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+ "dev": true
+ },
+ "postcss-values-parser": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-1.3.1.tgz",
+ "integrity": "sha512-chFn9CnFAAUpQ3cwrxvVjKB8c0y6BfONv6eapndJoTXJ3h8fr1uAiue8lGP3rUIpBI2KgJGdgCVk9KNvXh0n6A==",
+ "dev": true,
+ "requires": {
+ "flatten": "^1.0.2",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
"dev": true
},
"preserve": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
"integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
- "dev": true
+ "dev": true,
+ "optional": true
+ },
+ "prettier": {
+ "version": "github:automattic/calypso-prettier#c56b42511ec98ba6d8f72b6c391e0a626e90f531",
+ "from": "github:automattic/calypso-prettier#c56b4251",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "7.0.0-beta.3",
+ "babylon": "7.0.0-beta.34",
+ "camelcase": "4.1.0",
+ "chalk": "2.1.0",
+ "cjk-regex": "1.0.2",
+ "cosmiconfig": "3.1.0",
+ "dashify": "0.2.2",
+ "diff": "3.2.0",
+ "editorconfig": "0.14.2",
+ "editorconfig-to-prettier": "0.0.6",
+ "emoji-regex": "6.5.1",
+ "escape-string-regexp": "1.0.5",
+ "esutils": "2.0.2",
+ "flow-parser": "0.59.0",
+ "get-stream": "3.0.0",
+ "globby": "6.1.0",
+ "graphql": "0.10.5",
+ "ignore": "3.3.7",
+ "jest-docblock": "21.3.0-beta.11",
+ "jest-validate": "21.1.0",
+ "leven": "2.1.0",
+ "mem": "1.1.0",
+ "minimatch": "3.0.4",
+ "minimist": "1.2.0",
+ "parse5": "3.0.3",
+ "path-root": "0.1.1",
+ "postcss-less": "1.1.3",
+ "postcss-media-query-parser": "0.2.3",
+ "postcss-scss": "1.0.2",
+ "postcss-selector-parser": "2.2.3",
+ "postcss-values-parser": "1.3.1",
+ "remark-frontmatter": "1.1.0",
+ "remark-parse": "4.0.0",
+ "semver": "5.4.1",
+ "string-width": "2.1.1",
+ "typescript": "2.6.2",
+ "typescript-eslint-parser": "9.0.1",
+ "unicode-regex": "1.0.1",
+ "unified": "6.1.6"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "7.0.0-beta.3",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-7.0.0-beta.3.tgz",
+ "integrity": "sha512-flMsJ9eSpShupt2Gwpka84DoMePvE4HlDObzdEc+1iNkacv3+NHlsJ7dMKmbnVA/AT22UhcGEBHwbJLoXWBO6Q==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.0"
+ }
+ },
+ "babylon": {
+ "version": "7.0.0-beta.34",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.34.tgz",
+ "integrity": "sha512-ribEzWEhWKKjY+1FdKCryo+HiN/1idPjUB8vyR5Yf221MtGzCd5+7OwPvWvYHerHHC2eJLr6MhvumbTocXGY7Q==",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz",
+ "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.1.0",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^4.0.0"
+ }
+ },
+ "diff": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz",
+ "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "semver": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
+ "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "dev": true,
+ "requires": {
+ "has-flag": "^2.0.0"
+ }
+ }
+ }
},
"pretty-bytes": {
"version": "3.0.1",
@@ -7138,16 +8096,34 @@
"number-is-nan": "^1.0.0"
}
},
+ "pretty-format": {
+ "version": "21.2.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-21.2.1.tgz",
+ "integrity": "sha512-ZdWPGYAnYfcVP8yKA3zFjCn8s4/17TeYH28MXuC8vTp0o21eXjbFGcOAXZEaDaOFJjc3h2qa7HQNHNshhvoh2A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0",
+ "ansi-styles": "^3.2.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ }
+ }
+ },
"private": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
- "integrity": "sha1-I4Hts2ifelPWUxkAYPz4ItLzaP8=",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
"dev": true
},
"process-nextick-args": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
- "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
"dev": true
},
"pseudomap": {
@@ -7156,6 +8132,12 @@
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
"dev": true
},
+ "psl": {
+ "version": "1.1.29",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
+ "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==",
+ "dev": true
+ },
"punycode": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
@@ -7168,9 +8150,9 @@
"integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4="
},
"qs": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
- "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=",
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
"dev": true
},
"quick-lru": {
@@ -7179,6 +8161,34 @@
"integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=",
"dev": true
},
+ "randomatic": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz",
+ "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-number": "^4.0.0",
+ "kind-of": "^6.0.0",
+ "math-random": "^1.0.1"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true,
+ "optional": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
"raw-body": {
"version": "1.1.7",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz",
@@ -7219,31 +8229,332 @@
}
},
"readable-stream": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
- "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=",
+ "version": "2.3.6",
+ "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"dev": true,
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
"isarray": "~1.0.0",
- "process-nextick-args": "~1.0.6",
+ "process-nextick-args": "~2.0.0",
"safe-buffer": "~5.1.1",
- "string_decoder": "~1.0.3",
+ "string_decoder": "~1.1.1",
"util-deprecate": "~1.0.1"
}
},
"readdirp": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
- "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
"dev": true,
"optional": true,
"requires": {
- "graceful-fs": "^4.1.2",
- "minimatch": "^3.0.2",
- "readable-stream": "^2.0.2",
- "set-immediate-shim": "^1.0.1"
+ "graceful-fs": "^4.1.11",
+ "micromatch": "^3.1.10",
+ "readable-stream": "^2.0.2"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true,
+ "optional": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true,
+ "optional": true
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true,
+ "optional": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true,
+ "optional": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ }
}
},
"readline2": {
@@ -7268,21 +8579,21 @@
}
},
"regenerate": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz",
- "integrity": "sha1-DDNtOYBVPXVcObWGrjsgqknIK38=",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
+ "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
"dev": true
},
"regenerator-runtime": {
"version": "0.11.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
- "integrity": "sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk=",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
"dev": true
},
"regenerator-transform": {
"version": "0.10.1",
"resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
- "integrity": "sha1-HkmWg3Ix2ot/PPQRTXG1aRoGgN0=",
+ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
"dev": true,
"requires": {
"babel-runtime": "^6.18.0",
@@ -7293,8 +8604,9 @@
"regex-cache": {
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
- "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=",
+ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
"dev": true,
+ "optional": true,
"requires": {
"is-equal-shallow": "^0.1.3"
}
@@ -7309,6 +8621,12 @@
"safe-regex": "^1.1.0"
}
},
+ "regexpp": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
+ "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
+ "dev": true
+ },
"regexpu-core": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
@@ -7322,7 +8640,7 @@
},
"regjsgen": {
"version": "0.2.0",
- "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+ "resolved": "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
"integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
"dev": true
},
@@ -7352,12 +8670,47 @@
"remark-parse": "^5.0.0",
"remark-stringify": "^5.0.0",
"unified": "^6.0.0"
+ },
+ "dependencies": {
+ "remark-parse": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz",
+ "integrity": "sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==",
+ "dev": true,
+ "requires": {
+ "collapse-white-space": "^1.0.2",
+ "is-alphabetical": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-whitespace-character": "^1.0.0",
+ "is-word-character": "^1.0.0",
+ "markdown-escapes": "^1.0.0",
+ "parse-entities": "^1.1.0",
+ "repeat-string": "^1.5.4",
+ "state-toggle": "^1.0.0",
+ "trim": "0.0.1",
+ "trim-trailing-lines": "^1.0.0",
+ "unherit": "^1.0.4",
+ "unist-util-remove-position": "^1.0.0",
+ "vfile-location": "^2.0.0",
+ "xtend": "^4.0.1"
+ }
+ }
+ }
+ },
+ "remark-frontmatter": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-1.1.0.tgz",
+ "integrity": "sha512-mLbYtwP9w1L9TA8dX+I/HyDF5lCpa0dmYvvW9Io+zUPpqEZ49QMKWb0hSpunpLVA+Squy0SowzSzjHVPbxWq1g==",
+ "dev": true,
+ "requires": {
+ "fault": "^1.0.1",
+ "xtend": "^4.0.1"
}
},
"remark-parse": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz",
- "integrity": "sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-4.0.0.tgz",
+ "integrity": "sha512-XZgICP2gJ1MHU7+vQaRM+VA9HEL3X253uwUM/BGgx3iv6TH2B3bF3B8q00DKcyP9YrJV+/7WOWEWBFF/u8cIsw==",
"dev": true,
"requires": {
"collapse-white-space": "^1.0.2",
@@ -7366,7 +8719,7 @@
"is-whitespace-character": "^1.0.0",
"is-word-character": "^1.0.0",
"markdown-escapes": "^1.0.0",
- "parse-entities": "^1.1.0",
+ "parse-entities": "^1.0.2",
"repeat-string": "^1.5.4",
"state-toggle": "^1.0.0",
"trim": "0.0.1",
@@ -7403,12 +8756,13 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
"integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
- "dev": true
+ "dev": true,
+ "optional": true
},
"repeat-element": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
- "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+ "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
"dev": true
},
"repeat-string": {
@@ -7433,134 +8787,43 @@
"dev": true
},
"request": {
- "version": "2.79.0",
- "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz",
- "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=",
+ "version": "2.88.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+ "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
"dev": true,
"requires": {
- "aws-sign2": "~0.6.0",
- "aws4": "^1.2.1",
- "caseless": "~0.11.0",
- "combined-stream": "~1.0.5",
- "extend": "~3.0.0",
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
"forever-agent": "~0.6.1",
- "form-data": "~2.1.1",
- "har-validator": "~2.0.6",
- "hawk": "~3.1.3",
- "http-signature": "~1.1.0",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.0",
+ "http-signature": "~1.2.0",
"is-typedarray": "~1.0.0",
"isstream": "~0.1.2",
"json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.7",
- "oauth-sign": "~0.8.1",
- "qs": "~6.3.0",
- "stringstream": "~0.0.4",
- "tough-cookie": "~2.3.0",
- "tunnel-agent": "~0.4.1",
- "uuid": "^3.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "assert-plus": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
- "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
- "dev": true
- },
- "aws-sign2": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
- "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
- "dev": true
- },
- "caseless": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
- "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "form-data": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
- "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
- "dev": true,
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.5",
- "mime-types": "^2.1.12"
- }
- },
- "har-validator": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
- "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
- "dev": true,
- "requires": {
- "chalk": "^1.1.1",
- "commander": "^2.9.0",
- "is-my-json-valid": "^2.12.4",
- "pinkie-promise": "^2.0.0"
- }
- },
- "http-signature": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
- "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
- "dev": true,
- "requires": {
- "assert-plus": "^0.2.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- }
- },
- "qs": {
- "version": "6.3.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
- "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=",
- "dev": true
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- },
- "tunnel-agent": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
- "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
- "dev": true
- }
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.4.3",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
}
},
- "require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
"dev": true
},
- "require-main-filename": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
- "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "requireindex": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz",
+ "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==",
"dev": true
},
"resolve": {
@@ -7569,6 +8832,16 @@
"integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=",
"dev": true
},
+ "resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "^2.0.0",
+ "global-modules": "^1.0.0"
+ }
+ },
"resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@@ -7597,29 +8870,19 @@
"integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
"dev": true
},
- "right-align": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
- "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
- "dev": true,
- "optional": true,
- "requires": {
- "align-text": "^0.1.1"
- }
- },
"rimraf": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
- "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
"dev": true,
"requires": {
"glob": "^7.0.5"
}
},
"rtlcss": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-2.2.1.tgz",
- "integrity": "sha1-+FN+QVUggWawXhiYAhMZNvzv0p4=",
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-2.4.0.tgz",
+ "integrity": "sha512-hdjFhZ5FCI0ABOfyXOMOhBtwPWtANLCG7rOiOcRf+yi5eDdxmDjqBruWouEnwVdzfh/TWF6NNncIEsigOCFZOA==",
"dev": true,
"requires": {
"chalk": "^2.3.0",
@@ -7652,10 +8915,19 @@
"integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=",
"dev": true
},
+ "rxjs": {
+ "version": "6.3.3",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+ "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.9.0"
+ }
+ },
"safe-buffer": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=",
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
"safe-json-parse": {
@@ -7666,7 +8938,7 @@
},
"safe-regex": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
"integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
"dev": true,
"requires": {
@@ -7676,21 +8948,9 @@
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true
},
- "sass-graph": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
- "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
- "dev": true,
- "requires": {
- "glob": "^7.0.0",
- "lodash": "^4.0.0",
- "scss-tokenizer": "^0.2.3",
- "yargs": "^7.0.0"
- }
- },
"saucelabs": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz",
@@ -7698,69 +8958,18 @@
"dev": true,
"requires": {
"https-proxy-agent": "^2.2.1"
- },
- "dependencies": {
- "agent-base": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz",
- "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==",
- "dev": true,
- "requires": {
- "es6-promisify": "^5.0.0"
- }
- },
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "https-proxy-agent": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz",
- "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==",
- "dev": true,
- "requires": {
- "agent-base": "^4.1.0",
- "debug": "^3.1.0"
- }
- }
}
},
"sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
"dev": true
},
- "scss-tokenizer": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
- "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
- "dev": true,
- "requires": {
- "js-base64": "^2.1.8",
- "source-map": "^0.4.2"
- },
- "dependencies": {
- "source-map": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
- "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
- "dev": true,
- "requires": {
- "amdefine": ">=0.0.4"
- }
- }
- }
- },
"selenium-webdriver": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz",
- "integrity": "sha1-K6h6FmLAILiYjJga5iyyoBKY6vw=",
+ "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==",
"dev": true,
"requires": {
"jszip": "^3.1.3",
@@ -7781,21 +8990,9 @@
}
},
"semver": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
- "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=",
- "dev": true
- },
- "set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
- "dev": true
- },
- "set-immediate-shim": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
- "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+ "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
"dev": true
},
"set-value": {
@@ -7842,6 +9039,12 @@
"integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=",
"dev": true
},
+ "sigmund": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
+ "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
+ "dev": true
+ },
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
@@ -7855,11 +9058,13 @@
"dev": true
},
"slice-ansi": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
- "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.0.0.tgz",
+ "integrity": "sha512-4j2WTWjp3GsZ+AOagyzVbzp4vWGtZ0hEZ/gDY/uTvm6MTxUfTUIsnMIFb1bn8o0RuXiqUw15H1bue8f22Vw2oQ==",
"dev": true,
"requires": {
+ "ansi-styles": "^3.2.0",
+ "astral-regex": "^1.0.0",
"is-fullwidth-code-point": "^2.0.0"
},
"dependencies": {
@@ -7991,19 +9196,10 @@
"kind-of": "^3.2.0"
}
},
- "sntp": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
- "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
- "dev": true,
- "requires": {
- "hoek": "2.x.x"
- }
- },
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
},
"source-map-resolve": {
@@ -8022,7 +9218,7 @@
"source-map-support": {
"version": "0.4.18",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
- "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=",
+ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
"dev": true,
"requires": {
"source-map": "^0.5.6"
@@ -8043,30 +9239,41 @@
"dev": true
},
"spdx-correct": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
- "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz",
+ "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==",
"dev": true,
"requires": {
- "spdx-license-ids": "^1.0.2"
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
}
},
- "spdx-expression-parse": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
- "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=",
+ "spdx-exceptions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
+ "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
"dev": true
},
+ "spdx-expression-parse": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+ "dev": true,
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
"spdx-license-ids": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
- "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz",
+ "integrity": "sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==",
"dev": true
},
"specificity": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.3.2.tgz",
- "integrity": "sha512-Nc/QN/A425Qog7j9aHmwOrlwX2e7pNI47ciwxwy4jOlvbbMHkNNJchit+FX+UjF3IAdiaaV5BKeWuDUnws6G1A==",
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz",
+ "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==",
"dev": true
},
"split-string": {
@@ -8079,15 +9286,14 @@
}
},
"sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
- "dev": true
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-0.0.7.tgz",
+ "integrity": "sha1-8A14/RYBMICbSrNAwDEPqnElPb0="
},
"sshpk": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz",
- "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=",
+ "version": "1.15.2",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.2.tgz",
+ "integrity": "sha512-Ra/OXQtuh0/enyl4ETZAfTaeksa6BXks5ZcjpSUNrjBr0DvrJKX+1fsKDPpT9TBXgHAFsa4510aNVgI8g/+SzA==",
"dev": true,
"requires": {
"asn1": "~0.2.3",
@@ -8097,6 +9303,7 @@
"ecc-jsbn": "~0.1.1",
"getpass": "^0.1.1",
"jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
"tweetnacl": "~0.14.0"
}
},
@@ -8127,15 +9334,6 @@
}
}
},
- "stdout-stream": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz",
- "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=",
- "dev": true,
- "requires": {
- "readable-stream": "^2.0.1"
- }
- },
"string-template": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz",
@@ -8154,9 +9352,9 @@
}
},
"string_decoder": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
- "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"requires": {
"safe-buffer": "~5.1.0"
@@ -8174,15 +9372,9 @@
"is-hexadecimal": "^1.0.0"
}
},
- "stringstream": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz",
- "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==",
- "dev": true
- },
"strip-ansi": {
"version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
@@ -8220,54 +9412,59 @@
"dev": true
},
"stylelint": {
- "version": "9.2.1",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-9.2.1.tgz",
- "integrity": "sha512-zR0rSMITL8VjTVoIEGsUh5m0lMluHaIbDLAJTrFYVLElYhP6d5HcJc5/cexA1mrKzQkKu7gvmbDclNLgAeiabw==",
+ "version": "9.9.0",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-9.9.0.tgz",
+ "integrity": "sha512-kIuX0/9/I2mZeHz6EoFt7UpLt7Mz+ic9/PmFwKMdq4BkQHikg3FkcgAElLdAmaI8Au1JEUOS996ZFE+mwXytmA==",
"dev": true,
"requires": {
- "autoprefixer": "^8.0.0",
+ "autoprefixer": "^9.0.0",
"balanced-match": "^1.0.0",
"chalk": "^2.4.1",
"cosmiconfig": "^5.0.0",
- "debug": "^3.0.0",
+ "debug": "^4.0.0",
"execall": "^1.0.0",
"file-entry-cache": "^2.0.0",
"get-stdin": "^6.0.0",
+ "global-modules": "^1.0.0",
"globby": "^8.0.0",
"globjoin": "^0.1.4",
"html-tags": "^2.0.0",
- "ignore": "^3.3.3",
+ "ignore": "^5.0.4",
"import-lazy": "^3.1.0",
"imurmurhash": "^0.1.4",
- "known-css-properties": "^0.6.0",
+ "known-css-properties": "^0.10.0",
+ "leven": "^2.1.0",
"lodash": "^4.17.4",
"log-symbols": "^2.0.0",
"mathml-tag-names": "^2.0.1",
"meow": "^5.0.0",
- "micromatch": "^2.3.11",
+ "micromatch": "^3.1.10",
"normalize-selector": "^0.2.0",
- "pify": "^3.0.0",
- "postcss": "^6.0.16",
- "postcss-html": "^0.23.6",
- "postcss-less": "^1.1.5",
- "postcss-markdown": "^0.23.6",
+ "pify": "^4.0.0",
+ "postcss": "^7.0.0",
+ "postcss-html": "^0.34.0",
+ "postcss-jsx": "^0.35.0",
+ "postcss-less": "^3.1.0",
+ "postcss-markdown": "^0.34.0",
"postcss-media-query-parser": "^0.2.3",
- "postcss-reporter": "^5.0.0",
+ "postcss-reporter": "^6.0.0",
"postcss-resolve-nested-selector": "^0.1.1",
- "postcss-safe-parser": "^3.0.1",
- "postcss-sass": "^0.3.0",
- "postcss-scss": "^1.0.2",
+ "postcss-safe-parser": "^4.0.0",
+ "postcss-sass": "^0.3.5",
+ "postcss-scss": "^2.0.0",
"postcss-selector-parser": "^3.1.0",
- "postcss-syntax": "^0.9.0",
+ "postcss-styled": "^0.34.0",
+ "postcss-syntax": "^0.34.0",
"postcss-value-parser": "^3.3.0",
"resolve-from": "^4.0.0",
"signal-exit": "^3.0.2",
- "specificity": "^0.3.1",
+ "slash": "^2.0.0",
+ "specificity": "^0.4.1",
"string-width": "^2.1.0",
"style-search": "^0.1.0",
- "sugarss": "^1.0.0",
+ "sugarss": "^2.0.0",
"svg-tags": "^1.0.0",
- "table": "^4.0.1"
+ "table": "^5.0.0"
},
"dependencies": {
"ansi-regex": {
@@ -8276,13 +9473,70 @@
"integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
"dev": true
},
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "autoprefixer": {
+ "version": "9.4.4",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.4.4.tgz",
+ "integrity": "sha512-7tpjBadJyHKf+gOJEmKhZIksWxdZCSrnKbbTJNsw+/zX9+f//DLELRQPWjjjVoDbbWlCuNRkN7RfmZwDVgWMLw==",
"dev": true,
"requires": {
- "color-convert": "^1.9.0"
+ "browserslist": "^4.3.7",
+ "caniuse-lite": "^1.0.30000926",
+ "normalize-range": "^0.1.2",
+ "num2fraction": "^1.2.2",
+ "postcss": "^7.0.7",
+ "postcss-value-parser": "^3.3.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "browserslist": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.7.tgz",
+ "integrity": "sha512-pWQv51Ynb0MNk9JGMCZ8VkM785/4MQNXiFYtPqI7EEP0TJO+/d/NqRVn1uiAN0DNbnlUSpL2sh16Kspasv3pUQ==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30000925",
+ "electron-to-chromium": "^1.3.96",
+ "node-releases": "^1.1.3"
}
},
"camelcase": {
@@ -8302,24 +9556,209 @@
"quick-lru": "^1.0.0"
}
},
- "chalk": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
- "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+ "caniuse-lite": {
+ "version": "1.0.30000927",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000927.tgz",
+ "integrity": "sha512-ogq4NbUWf1uG/j66k0AmiO3GjqJAlQyF8n4w8a954cbCyFKmYGvRtgz6qkq2fWuduTXHibX7GyYL5Pg58Aks2g==",
+ "dev": true
+ },
+ "cosmiconfig": {
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.7.tgz",
+ "integrity": "sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==",
"dev": true,
"requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
+ "import-fresh": "^2.0.0",
+ "is-directory": "^0.3.1",
+ "js-yaml": "^3.9.0",
+ "parse-json": "^4.0.0"
}
},
"debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
"dev": true,
"requires": {
- "ms": "2.0.0"
+ "ms": "^2.1.1"
+ }
+ },
+ "electron-to-chromium": {
+ "version": "1.3.100",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.100.tgz",
+ "integrity": "sha512-cEUzis2g/RatrVf8x26L8lK5VEls1AGnLHk6msluBUg/NTB4wcXzExTsGscFq+Vs4WBBU2zbLLySvD4C0C3hwg==",
+ "dev": true
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
}
},
"find-up": {
@@ -8350,26 +9789,135 @@
"ignore": "^3.3.5",
"pify": "^3.0.0",
"slash": "^1.0.0"
+ },
+ "dependencies": {
+ "ignore": {
+ "version": "3.3.10",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
+ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==",
+ "dev": true
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ },
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+ "dev": true
+ }
}
},
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "ignore": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.0.4.tgz",
+ "integrity": "sha512-WLsTMEhsQuXpCiG173+f3aymI43SXa+fB1rSfbzyP4GkPP+ZFVuO0/3sFUGNBtifisPeDcl/uD/Y2NxZ7xFq4g==",
"dev": true
},
+ "import-fresh": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
+ "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
+ "dev": true,
+ "requires": {
+ "caller-path": "^2.0.0",
+ "resolve-from": "^3.0.0"
+ },
+ "dependencies": {
+ "resolve-from": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+ "dev": true
+ }
+ }
+ },
"indent-string": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz",
"integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=",
"dev": true
},
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
"is-fullwidth-code-point": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
"integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true
},
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.12.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz",
+ "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ },
"load-json-file": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
@@ -8380,6 +9928,14 @@
"parse-json": "^4.0.0",
"pify": "^3.0.0",
"strip-bom": "^3.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ }
}
},
"map-obj": {
@@ -8405,6 +9961,33 @@
"yargs-parser": "^10.0.0"
}
},
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ },
"parse-json": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
@@ -8422,17 +10005,84 @@
"dev": true,
"requires": {
"pify": "^3.0.0"
+ },
+ "dependencies": {
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "dev": true
+ }
}
},
+ "pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true
+ },
"postcss": {
- "version": "6.0.22",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.22.tgz",
- "integrity": "sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA==",
+ "version": "7.0.8",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.8.tgz",
+ "integrity": "sha512-WudsIzuTKRw9IInRTPBgVXJ7DKR26HT09Rxp0g3w0Fqh3TUtYICcUmvC0xURj04o3vdcDtnjCAUCECg/p341iQ==",
"dev": true,
"requires": {
- "chalk": "^2.4.1",
+ "chalk": "^2.4.2",
"source-map": "^0.6.1",
- "supports-color": "^5.4.0"
+ "supports-color": "^6.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ }
+ }
+ },
+ "postcss-less": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.0.tgz",
+ "integrity": "sha512-+fDH2A9zV8B4gFu3Idhq8ma09/mMBXXc03T2lL9CHjBQqKrfUit+TrQrnojc6Y4k7N4E+tyE1Uj5U1tcoKtXLQ==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.3"
+ }
+ },
+ "postcss-scss": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.0.0.tgz",
+ "integrity": "sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.0"
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz",
+ "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=",
+ "dev": true,
+ "requires": {
+ "dot-prop": "^4.1.1",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1"
}
},
"read-pkg": {
@@ -8466,6 +10116,12 @@
"strip-indent": "^2.0.0"
}
},
+ "slash": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+ "dev": true
+ },
"string-width": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
@@ -8498,9 +10154,9 @@
"dev": true
},
"supports-color": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
- "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
+ "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
@@ -8513,9 +10169,9 @@
"dev": true
},
"yargs-parser": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.0.0.tgz",
- "integrity": "sha512-+DHejWujTVYeMHLff8U96rLc4uE4Emncoftvn5AjhB1Jw1pWxLzgBUT/WYbPrHmy6YPEBTZQx5myHhVcuuu64g==",
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
+ "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
"dev": true,
"requires": {
"camelcase": "^4.1.0"
@@ -8524,21 +10180,65 @@
}
},
"sugarss": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-1.0.1.tgz",
- "integrity": "sha512-3qgLZytikQQEVn1/FrhY7B68gPUUGY3R1Q1vTiD5xT+Ti1DP/8iZuwFet9ONs5+bmL8pZoDQ6JrQHVgrNlK6mA==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz",
+ "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==",
"dev": true,
"requires": {
- "postcss": "^6.0.14"
+ "postcss": "^7.0.2"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "postcss": {
+ "version": "7.0.8",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.8.tgz",
+ "integrity": "sha512-WudsIzuTKRw9IInRTPBgVXJ7DKR26HT09Rxp0g3w0Fqh3TUtYICcUmvC0xURj04o3vdcDtnjCAUCECg/p341iQ==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
+ "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
}
},
"supports-color": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
- "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
- "has-flag": "^2.0.0"
+ "has-flag": "^3.0.0"
}
},
"svg-tags": {
@@ -8548,29 +10248,27 @@
"dev": true
},
"table": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/table/-/table-4.0.3.tgz",
- "integrity": "sha512-S7rnFITmBH1EnyKcvxBh1LjYeQMmnZtCXSEbHcH6S0NoKit24ZuFO/T1vDcLdYsLQkM188PVVhQmzKIuThNkKg==",
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/table/-/table-5.1.1.tgz",
+ "integrity": "sha512-NUjapYb/qd4PeFW03HnAuOJ7OMcBkJlqeClWxeNlQ0lXGSb52oZXGzkO0/I0ARegQ2eUT1g2VDJH0eUxDRcHmw==",
"dev": true,
"requires": {
- "ajv": "^6.0.1",
- "ajv-keywords": "^3.0.0",
- "chalk": "^2.1.0",
- "lodash": "^4.17.4",
- "slice-ansi": "1.0.0",
+ "ajv": "^6.6.1",
+ "lodash": "^4.17.11",
+ "slice-ansi": "2.0.0",
"string-width": "^2.1.1"
},
"dependencies": {
"ajv": {
- "version": "6.5.1",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.1.tgz",
- "integrity": "sha512-pgZos1vgOHDiC7gKNbZW8eKvCnNXARv2oqrGQT7Hzbq5Azp7aZG6DJzADnkuSq7RH6qkXp4J/m68yPX/2uBHyQ==",
+ "version": "6.6.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz",
+ "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==",
"dev": true,
"requires": {
"fast-deep-equal": "^2.0.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.1"
+ "uri-js": "^4.2.2"
}
},
"ansi-regex": {
@@ -8618,15 +10316,31 @@
}
}
},
- "tar": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
- "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
+ "tcp-port-used": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.1.tgz",
+ "integrity": "sha512-rwi5xJeU6utXoEIiMvVBMc9eJ2/ofzB+7nLOdnZuFTmNCLqRiQh2sMG9MqCxHU/69VC/Fwp5dV9306Qd54ll1Q==",
"dev": true,
"requires": {
- "block-stream": "*",
- "fstream": "^1.0.2",
- "inherits": "2"
+ "debug": "4.1.0",
+ "is2": "2.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz",
+ "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ }
}
},
"temp": {
@@ -8641,7 +10355,7 @@
"dependencies": {
"rimraf": {
"version": "2.2.8",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
+ "resolved": "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
"integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=",
"dev": true
}
@@ -8655,7 +10369,7 @@
},
"through": {
"version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
"dev": true
},
@@ -8674,20 +10388,26 @@
},
"dependencies": {
"debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
+ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
"dev": true,
"requires": {
- "ms": "2.0.0"
+ "ms": "^2.1.1"
}
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
}
}
},
"tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
- "integrity": "sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
"dev": true,
"requires": {
"os-tmpdir": "~1.0.2"
@@ -8742,11 +10462,12 @@
}
},
"tough-cookie": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz",
- "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=",
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+ "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
"dev": true,
"requires": {
+ "psl": "^1.1.24",
"punycode": "^1.4.1"
}
},
@@ -8775,34 +10496,16 @@
"dev": true
},
"trough": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.2.tgz",
- "integrity": "sha512-FHkoUZvG6Egrv9XZAyYGKEyb1JMsFphgPjoczkZC2y6W93U1jswcVURB8MUvtsahEPEVACyxD47JAL63vF4JsQ==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.3.tgz",
+ "integrity": "sha512-fwkLWH+DimvA4YCy+/nvJd61nWQQ2liO/nF/RjkTpiOGi+zxZzVkhb1mvbHIIW4b/8nDsYI8uTmAlc0nNkRMOw==",
"dev": true
},
- "true-case-path": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz",
- "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=",
- "dev": true,
- "requires": {
- "glob": "^6.0.4"
- },
- "dependencies": {
- "glob": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
- "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
- "dev": true,
- "requires": {
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "2 || 3",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- }
- }
+ "tslib": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
+ "dev": true
},
"tunnel-agent": {
"version": "0.6.0",
@@ -8817,8 +10520,16 @@
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
"dev": true,
- "optional": true
+ "requires": {
+ "prelude-ls": "~1.1.2"
+ }
},
"type-detect": {
"version": "4.0.8",
@@ -8832,6 +10543,30 @@
"integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
"dev": true
},
+ "typescript": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz",
+ "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=",
+ "dev": true
+ },
+ "typescript-eslint-parser": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/typescript-eslint-parser/-/typescript-eslint-parser-9.0.1.tgz",
+ "integrity": "sha512-w1jqotvnhLtLukD9H3gQPAlbD0kLf7ZkoQGwiwSIshKIlzRL7i0OY9Y7VIdE1xtytZXThg678eomxMZ1rZXGVQ==",
+ "dev": true,
+ "requires": {
+ "lodash.unescape": "4.0.1",
+ "semver": "5.4.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
+ "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==",
+ "dev": true
+ }
+ }
+ },
"uglify-js": {
"version": "3.3.28",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.28.tgz",
@@ -8844,27 +10579,28 @@
"dependencies": {
"commander": {
"version": "2.15.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
+ "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
"integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
"dev": true
}
}
},
- "uglify-to-browserify": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
- "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
- "dev": true,
- "optional": true
- },
"underscore.string": {
- "version": "3.3.4",
- "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.4.tgz",
- "integrity": "sha1-LCo/n4PmR2L9xF5s6sZRQoZCE9s=",
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz",
+ "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==",
"dev": true,
"requires": {
"sprintf-js": "^1.0.3",
"util-deprecate": "^1.0.2"
+ },
+ "dependencies": {
+ "sprintf-js": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz",
+ "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=",
+ "dev": true
+ }
}
},
"unherit": {
@@ -8877,10 +10613,16 @@
"xtend": "^4.0.1"
}
},
+ "unicode-regex": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/unicode-regex/-/unicode-regex-1.0.1.tgz",
+ "integrity": "sha1-+BngUBkdW5VhozmljdO5CV7ZSzU=",
+ "dev": true
+ },
"unified": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz",
- "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==",
+ "version": "6.1.6",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-6.1.6.tgz",
+ "integrity": "sha512-pW2f82bCIo2ifuIGYcV12fL96kMMYgw7JKVEgh7ODlrM9rj6vXSY3BV+H6lCcv1ksxynFf582hwWLnA1qRFy4w==",
"dev": true,
"requires": {
"bail": "^1.0.0",
@@ -8888,6 +10630,7 @@
"is-plain-obj": "^1.1.0",
"trough": "^1.0.0",
"vfile": "^2.0.0",
+ "x-is-function": "^1.0.4",
"x-is-string": "^0.1.0"
}
},
@@ -8947,15 +10690,6 @@
"integrity": "sha512-YkXBK/H9raAmG7KXck+UUpnKiNmUdB+aBGrknfQ4EreE1banuzrKABx3jP6Z5Z3fMSPMQQmeXBlKpCbMwBkxVw==",
"dev": true
},
- "unist-util-modify-children": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.2.tgz",
- "integrity": "sha512-GRi04yhng1WqBf5RBzPkOtWAadcZS2gvuOgNn/cyJBYNxtTuyYqTKN0eg4rC1YJwGnzrqfRB3dSKm8cNCjNirg==",
- "dev": true,
- "requires": {
- "array-iterate": "^1.0.0"
- }
- },
"unist-util-remove-position": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.2.tgz",
@@ -8972,18 +10706,27 @@
"dev": true
},
"unist-util-visit": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.3.1.tgz",
- "integrity": "sha512-0fdB9EQJU0tho5tK0VzOJzAQpPv2LyLZ030b10GxuzAWEfvd54mpY7BMjQ1L69k2YNvL+SvxRzH0yUIehOO8aA==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.0.tgz",
+ "integrity": "sha512-FiGu34ziNsZA3ZUteZxSFaczIjGmksfSgdKqBfOejrrfzyUy5b7YrlzT1Bcvi+djkYDituJDy2XB7tGTeBieKw==",
"dev": true,
"requires": {
- "unist-util-is": "^2.1.1"
+ "unist-util-visit-parents": "^2.0.0"
+ }
+ },
+ "unist-util-visit-parents": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.0.1.tgz",
+ "integrity": "sha512-6B0UTiMfdWql4cQ03gDTCSns+64Zkfo2OCbK31Ov0uMizEz+CJeAp0cgZVb5Fhmcd7Bct2iRNywejT0orpbqUA==",
+ "dev": true,
+ "requires": {
+ "unist-util-is": "^2.1.2"
}
},
"universalify": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
- "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
"dev": true
},
"unset-value": {
@@ -9032,6 +10775,13 @@
}
}
},
+ "upath": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz",
+ "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==",
+ "dev": true,
+ "optional": true
+ },
"uri-js": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
@@ -9068,21 +10818,10 @@
"dev": true
},
"use": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz",
- "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
- "dev": true
- }
- }
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+ "dev": true
},
"user-home": {
"version": "1.1.1",
@@ -9097,9 +10836,9 @@
"dev": true
},
"uuid": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz",
- "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=",
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
"dev": true
},
"v8flags": {
@@ -9112,13 +10851,13 @@
}
},
"validate-npm-package-license": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
- "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
"dev": true,
"requires": {
- "spdx-correct": "~1.0.0",
- "spdx-expression-parse": "~1.0.0"
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
}
},
"verror": {
@@ -9162,7 +10901,7 @@
"wc-e2e-page-objects": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/wc-e2e-page-objects/-/wc-e2e-page-objects-0.10.0.tgz",
- "integrity": "sha1-opnsEUmyVMO2PErx7sNGRww61kg=",
+ "integrity": "sha512-sPxL/xvxyGjkDW/Nn5TXfRxM8rid2L0BCRZKblSz14/M096IXU7C7a647IiJ2c6KkEWpw2Za/BCiGhBxbj6JFg==",
"dev": true,
"requires": {
"lodash": "^4.13.1",
@@ -9183,40 +10922,18 @@
"websocket-extensions": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
- "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=",
+ "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==",
"dev": true
},
"which": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
- "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
"dev": true,
"requires": {
"isexe": "^2.0.0"
}
},
- "which-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
- "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
- "dev": true
- },
- "wide-align": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
- "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
- "dev": true,
- "requires": {
- "string-width": "^1.0.2 || 2"
- }
- },
- "window-size": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
- "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
- "dev": true,
- "optional": true
- },
"wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
@@ -9226,7 +10943,7 @@
"wp-e2e-page-objects": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/wp-e2e-page-objects/-/wp-e2e-page-objects-0.8.1.tgz",
- "integrity": "sha1-m1+Nx1p9pU7q4YDUxp0FBIIksg0=",
+ "integrity": "sha512-oChVuw7w/QDN9I271aw65iRXBQVMMIMwlxgf7dxzeYf9dfZ0rY7d63Mi4Tnp1aQzVUhhNEqjLTQ4uqjsm0p7MA==",
"dev": true,
"requires": {
"deprecate": "^1.0.0",
@@ -9234,12 +10951,20 @@
"selenium-webdriver": "^3.6.0",
"sprintf-js": "^1.0.3",
"wp-e2e-webdriver": "^0.14.0"
+ },
+ "dependencies": {
+ "sprintf-js": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz",
+ "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=",
+ "dev": true
+ }
}
},
"wp-e2e-webdriver": {
"version": "0.14.0",
"resolved": "https://registry.npmjs.org/wp-e2e-webdriver/-/wp-e2e-webdriver-0.14.0.tgz",
- "integrity": "sha1-fHJnxDUv4barX10yu2rt+SaMdP8=",
+ "integrity": "sha512-7oS5k6IzAFCzoTEgu9x9+1x9PbtOVDef39UF5JEOCsxo2Zi6Ag9VH4jHkVUmbm5uLOrvJyP3k3S8CgCu/tQevA==",
"dev": true,
"requires": {
"chromedriver": "^2.37.0",
@@ -9249,16 +10974,28 @@
"slugs": "^0.1.3",
"temp": "^0.8.3",
"url-join": "^4.0.0"
- }
- },
- "wrap-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
- "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
- "dev": true,
- "requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
+ "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ }
}
},
"wrappy": {
@@ -9276,6 +11013,12 @@
"mkdirp": "^0.5.1"
}
},
+ "x-is-function": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/x-is-function/-/x-is-function-1.0.4.tgz",
+ "integrity": "sha1-XSlNw9Joy90GJYDgxd93o5HR+h4=",
+ "dev": true
+ },
"x-is-string": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz",
@@ -9285,7 +11028,7 @@
"xml2js": {
"version": "0.4.19",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
- "integrity": "sha1-aGwg8hMgnpSr8NG88e+qKRx4J6c=",
+ "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
"dev": true,
"requires": {
"sax": ">=0.6.0",
@@ -9294,7 +11037,7 @@
},
"xmlbuilder": {
"version": "9.0.7",
- "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
+ "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
"integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
"dev": true
},
@@ -9304,64 +11047,6 @@
"integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
"dev": true
},
- "y18n": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
- "dev": true
- },
- "yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
- "dev": true
- },
- "yargs": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
- "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
- "dev": true,
- "requires": {
- "camelcase": "^3.0.0",
- "cliui": "^3.2.0",
- "decamelize": "^1.1.1",
- "get-caller-file": "^1.0.1",
- "os-locale": "^1.4.0",
- "read-pkg-up": "^1.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
- "set-blocking": "^2.0.0",
- "string-width": "^1.0.2",
- "which-module": "^1.0.0",
- "y18n": "^3.2.1",
- "yargs-parser": "^5.0.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
- "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
- "dev": true
- }
- }
- },
- "yargs-parser": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
- "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
- "dev": true,
- "requires": {
- "camelcase": "^3.0.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
- "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
- "dev": true
- }
- }
- },
"yauzl": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
diff --git a/package.json b/package.json
index a8bae722568..df51cd76b8e 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "woocommerce",
"title": "WooCommerce",
- "version": "3.4.0",
+ "version": "3.5.0",
"homepage": "https://woocommerce.com/",
"repository": {
"type": "git",
@@ -12,42 +12,47 @@
"scripts": {
"build": "grunt",
"build-watch": "grunt watch",
+ "lint:js": "eslint assets/js --ext=js",
"test": "cross-env NODE_CONFIG_DIR='./tests/e2e-tests/config' BABEL_ENV=commonjs mocha \"tests/e2e-tests\" --require babel-register --recursive",
"test:grep": "cross-env NODE_CONFIG_DIR='./tests/e2e-tests/config' BABEL_ENV=commonjs mocha \"tests/e2e-tests\" --require babel-register --grep ",
"test:single": "cross-env NODE_CONFIG_DIR='./tests/e2e-tests/config' BABEL_ENV=commonjs mocha --require babel-register"
},
"devDependencies": {
- "autoprefixer": "~8.6.2",
- "babel": "^6.5.2",
- "babel-cli": "^6.14.0",
- "babel-eslint": "^8.2.3",
- "babel-plugin-add-module-exports": "^0.2.1",
- "babel-preset-es2015": "^6.14.0",
- "babel-preset-stage-2": "^6.13.0",
- "chai": "^4.1.2",
- "chai-as-promised": "^7.1.1",
- "chromedriver": "^2.40.0",
- "config": "^1.24.0",
- "cross-env": "^5.1.6",
- "grunt": "^1.0.3",
- "grunt-checktextdomain": "~1.0.1",
- "grunt-contrib-clean": "~1.1.0",
- "grunt-contrib-concat": "~1.0.1",
- "grunt-contrib-cssmin": "~2.2.1",
- "grunt-contrib-jshint": "~1.1.0",
- "grunt-contrib-uglify": "~3.3.0",
- "grunt-contrib-watch": "^1.1.0",
- "grunt-phpcs": "~0.4.0",
- "grunt-postcss": "~0.9.0",
- "grunt-prompt": "^1.3.3",
- "grunt-rtlcss": "~2.0.1",
- "grunt-sass": "~2.1.0",
- "grunt-shell": "~2.1.0",
- "grunt-stylelint": "~0.10.0",
- "grunt-wp-i18n": "~1.0.1",
- "istanbul": "^1.0.0-alpha",
- "mocha": "^5.2.0",
- "stylelint": "~9.2.1",
+ "autoprefixer": "9.4.4",
+ "babel": "6.23.0",
+ "babel-cli": "6.26.0",
+ "babel-eslint": "10.0.1",
+ "babel-plugin-add-module-exports": "1.0.0",
+ "babel-preset-es2015": "6.24.1",
+ "babel-preset-stage-2": "6.24.1",
+ "chai": "4.2.0",
+ "chai-as-promised": "7.1.1",
+ "chromedriver": "2.45.0",
+ "config": "3.0.1",
+ "cross-env": "5.2.0",
+ "eslint": "5.12.0",
+ "eslint-config-wpcalypso": "4.0.1",
+ "eslint-plugin-wpcalypso": "4.0.2",
+ "grunt": "1.0.3",
+ "grunt-checktextdomain": "1.0.1",
+ "grunt-contrib-clean": "2.0.0",
+ "grunt-contrib-concat": "1.0.1",
+ "grunt-contrib-cssmin": "3.0.0",
+ "grunt-contrib-jshint": "2.0.0",
+ "grunt-contrib-uglify": "4.0.0",
+ "grunt-contrib-watch": "1.1.0",
+ "grunt-phpcs": "0.4.0",
+ "grunt-postcss": "0.9.0",
+ "grunt-prompt": "1.3.3",
+ "grunt-rtlcss": "2.0.1",
+ "grunt-sass": "3.0.2",
+ "grunt-shell": "3.0.1",
+ "grunt-stylelint": "0.10.1",
+ "grunt-wp-i18n": "1.0.3",
+ "istanbul": "1.0.0-alpha.2",
+ "mocha": "5.2.0",
+ "prettier": "github:automattic/calypso-prettier#c56b4251",
+ "stylelint": "9.9.0",
"wc-e2e-page-objects": "0.10.0"
},
"engines": {
diff --git a/phpcs.xml b/phpcs.xml
index 2d1e0db01ce..f2b1419fb0c 100644
--- a/phpcs.xml
+++ b/phpcs.xml
@@ -1,8 +1,5 @@
-
-
-
WooCommerce dev PHP_CodeSniffer ruleset.
@@ -20,72 +17,34 @@
-
+
-
-
-
-
- tests/
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+ tests/
+
+
includes/**/abstract-*.php
tests/*
+
tests/
-
- tests/
-
-
-
+
tests/e2e-tests/
-
- i18n/
-
-
-
- includes/cli/
-
-
- includes/cli/
-
-
- includes/cli/
-
i18n/
diff --git a/readme.txt b/readme.txt
index e4594b9fbf4..8e82fce0653 100644
--- a/readme.txt
+++ b/readme.txt
@@ -2,8 +2,8 @@
Contributors: automattic, mikejolley, jameskoster, claudiosanches, claudiulodro, kloon, rodrigosprimo, jshreve, coderkevin
Tags: ecommerce, e-commerce, store, sales, sell, shop, cart, checkout, downloadable, downloads, paypal, storefront, woo commerce
Requires at least: 4.7
-Tested up to: 4.9
-Stable tag: 3.4.0
+Tested up to: 5.0
+Stable tag: 3.5.0
License: GPLv3
License URI: https://www.gnu.org/licenses/gpl-3.0.html
@@ -13,7 +13,7 @@ WooCommerce is a powerful, extendable eCommerce plugin that helps you sell anyth
WooCommerce is a free eCommerce plugin that allows you to sell anything, beautifully. Built to integrate seamlessly with WordPress, WooCommerce is the world’s favorite eCommerce solution that gives both store owners and developers complete control.
-With endless flexibility and access to hundreds of free and premium WordPress extensions, WooCommerce now powers 30% of all online stores -- more than any other platform.
+With endless flexibility and access to hundreds of free and premium WordPress extensions, WooCommerce now powers 30% of all online stores — more than any other platform.
[youtube https://www.youtube.com/watch?v=1KahlicghaE]
@@ -28,10 +28,10 @@ Offer free shipping, flat rate shipping, or make real-time calculations. Limit y
= Extensive payment options =
WooCommerce comes bundled with the ability to accept major credit cards, PayPal, BACS (bank transfers), and cash on delivery. Need additional options? More than 140 region-specific gateways integrate with WooCommerce, including popular choices like Stripe, Authorize.Net, and Amazon Payments.
-= You control it all -- forever =
+= You control it all — forever =
WooCommerce gives you complete control of your store, from taxes to stock levels to customer accounts. Add and remove extensions, change your design, and switch settings as you please. It’s all under your control.
-One of the biggest risks of using a hosted eCommerce platform is what happens to your store if the provider closes up shop. With WooCommerce, you have complete control, so there’s never any reason to worry. Your data belongs to you -- and it’s kept secure, thanks to regular audits by industry leaders.
+One of the biggest risks of using a hosted eCommerce platform is what happens to your store if the provider closes up shop. With WooCommerce, you have complete control, so there’s never any reason to worry. Your data belongs to you — and it’s kept secure, thanks to regular audits by industry leaders.
= Define your style with Storefront =
@@ -41,11 +41,11 @@ Define your style even further by customizing Storefront to your liking or choos
= Built with developers in mind =
-Extendable, adaptable, and open source -- WooCommerce was created with developers in mind. With its strong, robust framework, you can scale your client’s store all the way from basic to high-end (infinity and beyond).
+Extendable, adaptable, and open source — WooCommerce was created with developers in mind. With its strong, robust framework, you can scale your client’s store all the way from basic to high-end (infinity and beyond).
Built with a REST API, WooCommerce can integrate with virtually any service. Your store’s data can be accessed anywhere, anytime, 100% securely. WooCommerce allows developers to easily create, modify, and grow a store that meets their specifications.
-No matter the size of the store you want to build, WooCommerce will scale to meet your requirements. With a growing collection of more than 300 extensions, you can enhance each store’s features to meet your client’s unique needs -- or even create your own solution.
+No matter the size of the store you want to build, WooCommerce will scale to meet your requirements. With a growing collection of more than 300 extensions, you can enhance each store’s features to meet your client’s unique needs — or even create your own solution.
If security is a concern, rest easy. WooCommerce is audited by a dedicated team of developers working around the clock to identify and patch any and all discovered bugs.
@@ -158,7 +158,129 @@ Yes you can! Join in on our [GitHub repository](https://github.com/woocommerce/w
== Changelog ==
-= 3.5.0 - 2018-XX-XX =
+= 3.5.0 - 2018-10-17 =
+* Feature - REST API v3. #20111
+* Feature - Option has been added on the inventory tab of the edit product page to set a low stock threshold for individual products. #20260
+* Feature - Add ability to export products by category to the CSV exporter. #20870
+* Feature - Ability to define custom product placeholder images that will resize to correct store aspect ratio. #20644
+* Enhancement - Excluded children categories from WP_Query in product shortcode if cat_operator=AND. #20207
+* Enhancement - Add anchor tag example to email template preview. #20246
+* Enhancement - Introduce is_paypal_supported_currency check in setup wizard. #20244
+* Enhancement - Payment method table reordering accessibility. #19844
+* Enhancement - Log errors from transaction emails with logger. #20203
+* Enhancement - Improved shipping calculator experience. Shows destination country and added context to calculate shipping link. #20345
+* Enhancement - On the fly image generation for frontend, if image sizes are missing. #20011
+* Enhancement - SelectWoo enabled product categories dropdown widget. #20617
+* Enhancement - Make it easier to read and act upon the outdated template notice. #20732
+* Enhancement - Styled date, time, etc. inputs in admin to match styling of other inputs. #21013
+* Enhancement - Show update notices on the System Status page for WordPress.org hosted Official WooCommerce extensions. #21073
+* Enhancement - Better wording for transactional emails. #21288
+* Fix - Check billing email is posted before using in WC_Cart::check_customer_coupons. #20180
+* Fix - Shipping postcode formatting when only posting a billing address. #20330
+* Fix - Correctly show/hide save card checkbox on tokenization form. #20506
+* Fix - orderby and order parameters in WC_Customer_Download_Log_Data_Store::get_download_logs() were ignored. #20931
+* Fix - Unslash city name to prevent double escape in tax settings. #21205
+* Fix - Updated phone validation logic. #21188
+* Fix - Fix weight and dimensions cache of variable products if childs doesn't have any of those params. #21244
+* Fix - Correctly replace images in the woocommerce_uploads folder with the placeholder image. #20848
+* Fix - Show parent variable product in shipping class admin screen when variation has shipping class. #21278
+* Fix - Correctly excluded administrators from "Customer list" report. #21304
+* Fix - Update quick edit logic to show/hide Stock qty and Backorders fields. #21301
+* Fix - Fix Layered Nav Widget where special HTML entities did not display correctly in the "Any %s" string. #21312
+* Fix - Set the is_checkout javascript parameter on any page that uses the checkout filter or shortcode. #21328
+* Fix - Fix cron_interval property support in WP_Background_Process. #21353
+* Fix - CSS Changes to make text fields line up on the shipping settings page. #21247
+* Fix - Add extra null check to fix an issue with select payment fields using disabed select as placeholders. #21391
+* Fix - Don't modify attributes orderby when sorting by name. #21408
+* Fix - Allow saving a stock quantity of 0 using quick edit. #21447
+* Fix - Change the query used to save session data to the database to protect against deadlocks. #21455
+* Fix - Make sure default category tooltip is rendered when the image column is deactivated. #21410
+* Fix - Fix warning when using logger instance in woocommerce_logging_class filter. #21448
+* Fix - Use uppercase "ID" when sorting product queries by ID. #21461
+* Fix - Consistently escape the gateway ID in the checkout payment method template. #21439
+* Fix - Avoid treating HTTP 301 and 302 codes as failures for webhooks. #21491
+* Fix - Add address_1 to shipping packages info in WC_Cart:: get_shipping_packages to make it work correctly in address formatting functions. #21493
+* Fix - Don't fire two of the same action when saving shipping settings. #21494
+* Fix - Remove double condition for address line 2 in `WC_Countries::get_default_address_fields`. #20629
+* Fix - Correctly handle shorthand values for memory_limit in php.ini. #21557
+* Fix - Product shortcode numeric term slug matching. #21560
+* Fix - Remove the erasure tools links from the descriptions of the erasure settings for users without the manage_privacy_options capability. #21565
+* Fix - Don't double urldecode posted variation attributes. #21570
+* Fix - Don't double-sanitize cart images. #21574
+* Fix - Check if ID exists and is not empty before set Product's download ID in API. #21588
+* Fix - Ensure wp_list_pluck() gets a array and not possibly null in WC_Product_Data_Store_CPT::update_attributes. #21591
+* Fix - Trim CSV header rows to prevent leading/trailing whitespace issues. #21614
+* Fix - Show draft products in previews on unsupported themes. #21619
+* Fix/Tweak - Fire `woocommerce_grant_product_download_access` hook after the download has its ID set. #20905
+* Fix/Tweak/Performance - Change wp_woocommerce_sessions primary key to session_id. #21245
+* Tweak - Show empty terms in admin product category filter dropdown. #20324
+* Tweak - Don't force default token gateway active by default. #20125
+* Tweak - Move notice output to hooked in functions. #19794
+* Tweak - Apply order bulk actions in chronological order. #20338
+* Tweak - Updated Emogrifier to 2.0. #20547
+* Tweak - Avoid using wp.template (eval) in add-to-cart-variation.js. #19496
+* Tweak - Hide Preview button when creating new products, as most fields aren't set up for it. #20650
+* Tweak - For guests, store all address fields to the session whilst placing an order. #20665
+* Tweak - Removed 'ajax_add_to_cart' class from 'Read more' button. #20690
+* Tweak - Removed unnecessary checkout form change trigger on load of the checkout page. #20655
+* Tweak - Add image size filters to wc_get_product_attachment_props(). #20722
+* Tweak - Only display the current site's tables for a multisite install when viewing the system status. #20731
+* Tweak - include the file path and line number where a fatal error occurred in the fatal errors log. #20787
+* Tweak - Cast tax rate to float so that it can be treated as number further on in the code. #20910
+* Tweak - Send webhooks using Action Scheduler. #20030
+* Tweak - Update customer's ip address on successful payment. #21038
+* Tweak - Changed wc_clean to checking for valid utf8 for line items and password. #20993
+* Tweak - Add to cart notice actions (View cart/Continue shopping) now have tabindex 1 for improved accessibility. #21108
+* Tweak - Remove icanhazip from geolocation services. #21198
+* Tweak - Remove unnecessary aria-required attributes from product reviews template. #21211
+* Tweak - Added hidden label for screen readers on checkout address line 2 input. #21193
+* Tweak - Remove empty space in mini-cart template. #21261
+* Tweak - Tax display in cart now depends on whether customer is tax exempt. #21292
+* Tweak - Change sort dropdown option "Sort by newness" to "Sort by latest". #21311
+* Tweak - Sanitize endpoint slugs upon saving. #21355
+* Tweak - Ignore converting float meta value for registered post meta. #21333
+* Tweak - Remove 'order_again' query string to avoid multiple re-orders. #21444
+* Tweak - Remove Netherlands Antilles from the North America continent definitions. #21449
+* Tweak - Display label and meta on the same line in order emails to match frontend Order Details styling. #21456
+* Tweak - Use wp_get_upload_dir for geolite DB path. #21550
+* Performance/Tweak - Use post_author for the order customer instead of '_customer_user' meta data. #17895
+* Performance - Exclude frontend include from REST API calls. #20000
+* Performance - Improve performance of the query to delete version transients by removing unneeded "ORDER BY". #21274
+* Dev - REST API - Allows oAuth1.0a authentication under SSL.
+* Dev - REST API - Fix position param for images. #20497
+* Dev - REST API - Handle children products deletion regardless of type. #20670
+* Dev - Added woocommerce_increase_coupon_usage_count and woocommerce_decrease_coupon_usage_count action hooks to increase extensibility of Coupons. #19981
+* Dev - Add endpoints to account menu items filter. #19980
+* Dev - Added qty param to `wc_add_to_cart_message` filter. #19817
+* Dev - Added `woocommerce_search_products_ids` filter. #20160
+* Dev - Introduced `woocommerce_cart_calculate_shipping_address` field to allow manipulation of cart shipping calculator data. #20046
+* Dev - Introduced `woocommerce_shipping_calculator_enable_country` filter. #20046
+* Dev - Pass product id to backorder notification. #20416
+* Dev - Added woocommerce_cart_shipping_total filter to control shipping display. #20591
+* Dev - Refactor "Order again" handling to separate logic better. #20606
+* Dev - Added 'woocommerce_products_admin_list_table_filters' filter to make it easier to customize the products list table filters. #20634
+* Dev - Added `woocommerce_shipping_method_add_rate_args` and `woocommerce_shipping_method_add_rate` filters. #20633
+* Dev - Added `woocommerce_coupon_validate_user_usage_limit` filter. #20630
+* Dev - Add hooks needed for product custom tables feature plugin. #20520
+* Dev - Added new filter to 'Item in quotes' translation for messages. #20714
+* Dev - Add 'woocommerce_shutdown_error' hook triggered on request termination with an error. #20787
+* Dev - New filter 'woocommerce_admin_meta_boxes_variations_count' to customize the shown count of variations. #21067
+* Dev - Added ability to query products that have a field set in wc_get_products/WC_Product_Query using the wildcard symbol '*'. #21162
+* Dev - Added a JavaScript events before and after the order total recalculation on the Edit Order page. #21181
+* Dev - Check for `needs_payment` instead of `has_status( 'pending' )` in PayPal PDT handler for custom order status support. #21200
+* Dev - Added form action hooks for edit account and login templates. #21248
+* Dev - Add action for when system tools are run. #21270
+* Dev - Add - woocommerce_restock_refunded_items filter to control default state of the restock option when refunding items on an order. #21314
+* Dev - Add an extensible/swappable job queue via WC_Action_Queue and WC_Queue_Interface. #20030
+* Dev - Use WC_Action_Queue for schedule and delivery of webhooks. #20030
+* Dev - Include Action Scheduler v2.1.0 and use it for the default job queue. #21424 / #20030
+* Dev - Save reviews under the 'review' comment type. #21305
+* Localization - Updated IT provinces. #20286
+* Localization - Eircode validation. #20330
+* Localization - Disable postcode requirement for Bahrain. #21103
+* Localization - Make postcode field optional and hidden for Nigeria and label State. #21056
+* Localization - Make Romania state selection mandatory. #21180
+* Localization - Make city field optional and hidden for Singapore addresses. #21016
[See changelog for all versions](https://raw.githubusercontent.com/woocommerce/woocommerce/master/CHANGELOG.txt).
diff --git a/renovate.json b/renovate.json
new file mode 100644
index 00000000000..f45d8f110c3
--- /dev/null
+++ b/renovate.json
@@ -0,0 +1,5 @@
+{
+ "extends": [
+ "config:base"
+ ]
+}
diff --git a/templates/archive-product.php b/templates/archive-product.php
index 41b6c89e5a8..f96e68acffb 100644
--- a/templates/archive-product.php
+++ b/templates/archive-product.php
@@ -50,7 +50,7 @@ if ( woocommerce_product_loop() ) {
/**
* Hook: woocommerce_before_shop_loop.
*
- * @hooked wc_print_notices - 10
+ * @hooked woocommerce_output_all_notices - 10
* @hooked woocommerce_result_count - 20
* @hooked woocommerce_catalog_ordering - 30
*/
diff --git a/templates/auth/footer.php b/templates/auth/footer.php
index c54810cbe2b..50b2ced04b0 100644
--- a/templates/auth/footer.php
+++ b/templates/auth/footer.php
@@ -11,7 +11,6 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates/Auth
* @version 2.4.0
*/
diff --git a/templates/auth/form-grant-access.php b/templates/auth/form-grant-access.php
index 1a58595e426..30f107fa152 100644
--- a/templates/auth/form-grant-access.php
+++ b/templates/auth/form-grant-access.php
@@ -11,7 +11,6 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates/Auth
* @version 2.4.0
*/
diff --git a/templates/auth/header.php b/templates/auth/header.php
index fdbc6483364..0709890c1e5 100644
--- a/templates/auth/header.php
+++ b/templates/auth/header.php
@@ -11,7 +11,6 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates/Auth
* @version 2.4.0
*/
diff --git a/templates/cart/cart-empty.php b/templates/cart/cart-empty.php
index 7a6f8fbf718..739c8a8c6d2 100644
--- a/templates/cart/cart-empty.php
+++ b/templates/cart/cart-empty.php
@@ -10,17 +10,14 @@
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
- * @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
+ * @see https://docs.woocommerce.com/document/template-structure/
* @package WooCommerce/Templates
- * @version 3.1.0
+ * @version 3.5.0
*/
-if ( ! defined( 'ABSPATH' ) ) {
- exit; // Exit if accessed directly
-}
+defined( 'ABSPATH' ) || exit;
-/**
+/*
* @hooked wc_empty_cart_message - 10
*/
do_action( 'woocommerce_cart_is_empty' );
@@ -28,7 +25,7 @@ do_action( 'woocommerce_cart_is_empty' );
if ( wc_get_page_id( 'shop' ) > 0 ) : ?>
-
+
diff --git a/templates/cart/cart-item-data.php b/templates/cart/cart-item-data.php
index 98f3296e37b..90ef7962e47 100644
--- a/templates/cart/cart-item-data.php
+++ b/templates/cart/cart-item-data.php
@@ -11,7 +11,6 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates
* @version 2.4.0
*/
diff --git a/templates/cart/cart-shipping.php b/templates/cart/cart-shipping.php
index 8ba509219ce..766c2dbcc8a 100644
--- a/templates/cart/cart-shipping.php
+++ b/templates/cart/cart-shipping.php
@@ -14,7 +14,7 @@
*
* @see https://docs.woocommerce.com/document/template-structure/
* @package WooCommerce/Templates
- * @version 3.5.0
+ * @version 3.6.0
*/
defined( 'ABSPATH' ) || exit;
@@ -51,14 +51,14 @@ $calculator_text = '';
printf( esc_html__( 'Estimate for %s.', 'woocommerce' ) . ' ', '' . esc_html( $formatted_destination ) . ' ' );
$calculator_text = __( 'Change address', 'woocommerce' );
} else {
- echo esc_html__( 'This is only an estimate. Prices will be updated during checkout.', 'woocommerce' );
+ echo wp_kses_post( apply_filters( 'woocommerce_shipping_estimate_html', __( 'This is only an estimate. Prices will be updated during checkout.', 'woocommerce' ) ) );
}
?>
-
$thumbnail = apply_filters( 'woocommerce_cart_item_thumbnail', $_product->get_image(), $cart_item, $cart_item_key );
if ( ! $product_permalink ) {
- echo wp_kses_post( $thumbnail );
+ echo $thumbnail; // PHPCS: XSS ok.
} else {
- printf( '%s ', esc_url( $product_permalink ), wp_kses_post( $thumbnail ) );
+ printf( '%s ', esc_url( $product_permalink ), $thumbnail ); // PHPCS: XSS ok.
}
?>
diff --git a/templates/cart/cross-sells.php b/templates/cart/cross-sells.php
index 8a0376add89..a27851a22e8 100644
--- a/templates/cart/cross-sells.php
+++ b/templates/cart/cross-sells.php
@@ -11,7 +11,6 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates
* @version 3.0.0
*/
@@ -24,7 +23,7 @@ if ( $cross_sells ) : ?>
-
+
diff --git a/templates/cart/mini-cart.php b/templates/cart/mini-cart.php
index dc18c2aba20..b105dd5ddc0 100644
--- a/templates/cart/mini-cart.php
+++ b/templates/cart/mini-cart.php
@@ -13,9 +13,8 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates
- * @version 3.3.0
+ * @version 3.5.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
@@ -51,14 +50,13 @@ do_action( 'woocommerce_before_mini_cart' ); ?>
), $cart_item_key );
?>
-
+
-
+
-
' . sprintf( '%s × %s', $cart_item['quantity'], $product_price ) . '', $cart_item, $cart_item_key ); ?>
-
+
diff --git a/templates/checkout/cart-errors.php b/templates/checkout/cart-errors.php
index ebda3283df5..500245e16bc 100644
--- a/templates/checkout/cart-errors.php
+++ b/templates/checkout/cart-errors.php
@@ -12,14 +12,14 @@
*
* @see https://docs.woocommerce.com/document/template-structure/
* @package WooCommerce/Templates
- * @version 2.4.0
+ * @version 3.5.0
*/
defined( 'ABSPATH' ) || exit;
?>
-
+
-
+
diff --git a/templates/checkout/form-billing.php b/templates/checkout/form-billing.php
index 1f5cbfc0335..e09dd829d1d 100644
--- a/templates/checkout/form-billing.php
+++ b/templates/checkout/form-billing.php
@@ -11,7 +11,6 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates
* @version 3.0.9
*/
diff --git a/templates/checkout/form-checkout.php b/templates/checkout/form-checkout.php
index 43108bbf51f..1fccf5e7d80 100644
--- a/templates/checkout/form-checkout.php
+++ b/templates/checkout/form-checkout.php
@@ -10,10 +10,9 @@
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
- * @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
- * @package WooCommerce/Templates
- * @version 2.3.0
+ * @see https://docs.woocommerce.com/document/template-structure/
+ * @package WooCommerce/Templates
+ * @version 3.5.0
*/
if ( ! defined( 'ABSPATH' ) ) {
@@ -22,9 +21,9 @@ if ( ! defined( 'ABSPATH' ) ) {
do_action( 'woocommerce_before_checkout_form', $checkout );
-// If checkout registration is disabled and not logged in, the user cannot checkout
+// If checkout registration is disabled and not logged in, the user cannot checkout.
if ( ! $checkout->is_registration_enabled() && $checkout->is_registration_required() && ! is_user_logged_in() ) {
- echo apply_filters( 'woocommerce_checkout_must_be_logged_in_message', __( 'You must be logged in to checkout.', 'woocommerce' ) );
+ echo esc_html( apply_filters( 'woocommerce_checkout_must_be_logged_in_message', __( 'You must be logged in to checkout.', 'woocommerce' ) ) );
return;
}
@@ -50,7 +49,7 @@ if ( ! $checkout->is_registration_enabled() && $checkout->is_registration_requir
-
+
diff --git a/templates/checkout/form-shipping.php b/templates/checkout/form-shipping.php
index e5867f6466f..c7ae79adebe 100644
--- a/templates/checkout/form-shipping.php
+++ b/templates/checkout/form-shipping.php
@@ -11,7 +11,6 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates
* @version 3.0.9
*/
diff --git a/templates/checkout/order-receipt.php b/templates/checkout/order-receipt.php
index e7d351c752a..fae638a9ff4 100644
--- a/templates/checkout/order-receipt.php
+++ b/templates/checkout/order-receipt.php
@@ -11,7 +11,6 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates
* @version 3.2.0
*/
diff --git a/templates/checkout/payment-method.php b/templates/checkout/payment-method.php
index dead8df7953..0e8a654508a 100644
--- a/templates/checkout/payment-method.php
+++ b/templates/checkout/payment-method.php
@@ -10,24 +10,23 @@
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
- * @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
- * @package WooCommerce/Templates
- * @version 2.3.0
+ * @see https://docs.woocommerce.com/document/template-structure/
+ * @package WooCommerce/Templates
+ * @version 3.5.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
-
- chosen, true ); ?> data-order_button_text="order_button_text ); ?>" />
+
+ chosen, true ); ?> data-order_button_text="order_button_text ); ?>" />
-
- get_title(); ?> get_icon(); ?>
+
+ get_title(); /* phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped */ ?> get_icon(); /* phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped */ ?>
has_fields() || $gateway->get_description() ) : ?>
- chosen ) : ?>style="display:none;">
+
chosen ) : /* phpcs:ignore Squiz.ControlStructures.ControlSignature.NewlineAfterOpenBrace */ ?>style="display:none;">
payment_fields(); ?>
diff --git a/templates/checkout/payment.php b/templates/checkout/payment.php
index 9d6c7957da9..7262fc55ffa 100644
--- a/templates/checkout/payment.php
+++ b/templates/checkout/payment.php
@@ -10,9 +10,9 @@
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
- * @see https://docs.woocommerce.com/document/template-structure/
+ * @see https://docs.woocommerce.com/document/template-structure/
* @package WooCommerce/Templates
- * @version 3.4.0
+ * @version 3.5.3
*/
defined( 'ABSPATH' ) || exit;
@@ -37,7 +37,10 @@ if ( ! is_ajax() ) {
- Update Totals button before placing your order. You may be charged more than the amount stated above if you fail to do so.', 'woocommerce' ); ?>
+ ', '' );
+ ?>
diff --git a/templates/checkout/review-order.php b/templates/checkout/review-order.php
index e97bf694401..91e613dd6b2 100644
--- a/templates/checkout/review-order.php
+++ b/templates/checkout/review-order.php
@@ -11,7 +11,6 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates
* @version 3.3.0
*/
diff --git a/templates/checkout/thankyou.php b/templates/checkout/thankyou.php
index 7453974ffaf..129aa642c40 100644
--- a/templates/checkout/thankyou.php
+++ b/templates/checkout/thankyou.php
@@ -11,7 +11,6 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates
* @version 3.2.0
*/
diff --git a/templates/content-product_cat.php b/templates/content-product_cat.php
index c4e3d9afaac..d2f8516ba21 100644
--- a/templates/content-product_cat.php
+++ b/templates/content-product_cat.php
@@ -11,7 +11,6 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates
* @version 2.6.1
*/
diff --git a/templates/content-single-product.php b/templates/content-single-product.php
index 7dcb3574fa3..ec6226aa4a9 100644
--- a/templates/content-single-product.php
+++ b/templates/content-single-product.php
@@ -32,42 +32,42 @@ if ( post_password_required() ) {
diff --git a/templates/content-widget-product.php b/templates/content-widget-product.php
index b74aab4ef4c..35e12f3540c 100644
--- a/templates/content-widget-product.php
+++ b/templates/content-widget-product.php
@@ -11,7 +11,7 @@
*
* @see https://docs.woocommerce.com/document/template-structure/
* @package WooCommerce/Templates
- * @version 3.5.0
+ * @version 3.5.2
*/
if ( ! defined( 'ABSPATH' ) ) {
@@ -29,15 +29,15 @@ if ( ! is_a( $product, 'WC_Product' ) ) {
- get_image() ); ?>
- get_name() ); ?>
+ get_image(); ?>
+ get_name() ); ?>
get_average_rating() ) ); ?>
- get_price_html() ); ?>
+ get_price_html(); ?>
diff --git a/templates/emails/admin-cancelled-order.php b/templates/emails/admin-cancelled-order.php
index e50e17256fa..15517743313 100644
--- a/templates/emails/admin-cancelled-order.php
+++ b/templates/emails/admin-cancelled-order.php
@@ -10,45 +10,50 @@
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
- * @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
+ * @see https://docs.woocommerce.com/document/template-structure/
* @package WooCommerce/Templates/Emails
- * @version 2.5.0
+ * @version 3.5.0
*/
- if ( ! defined( 'ABSPATH' ) ) {
- exit;
- }
+if ( ! defined( 'ABSPATH' ) ) {
+ exit;
+}
- /**
- * @hooked WC_Emails::email_header() Output the email header
- */
- do_action( 'woocommerce_email_header', $email_heading, $email ); ?>
+/*
+ * @hooked WC_Emails::email_header() Output the email header
+*/
+do_action( 'woocommerce_email_header', $email_heading, $email ); ?>
-
get_order_number(), $order->get_formatted_billing_full_name() ); ?>
+
+
get_formatted_billing_full_name() ), esc_html( $order->get_order_number() ) ); ?>
-
+
+
+
+
+/*
+ * @hooked WC_Emails::email_header() Output the email header
+ */
+do_action( 'woocommerce_email_header', $email_heading, $email ); ?>
-
get_order_number(), $order->get_formatted_billing_full_name() ); ?>
+
+
get_order_number() ), esc_html( $order->get_formatted_billing_full_name() ) ); ?>
-
+
+troubleshooting failed payments.', 'woocommerce' ) ); ?>
+
+
+/*
+ * @hooked WC_Emails::email_header() Output the email header
+ */
+do_action( 'woocommerce_email_header', $email_heading, $email ); ?>
-
get_formatted_billing_full_name() ); ?>
+
+
get_formatted_billing_full_name() ); ?>
+
-
-
+
+
get_billing_first_name() ) ); ?>
+
+
*/
do_action( 'woocommerce_email_order_details', $order, $sent_to_admin, $plain_text, $email );
-/**
+/*
* @hooked WC_Emails::order_meta() Shows order meta data.
*/
do_action( 'woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text, $email );
-/**
+/*
* @hooked WC_Emails::customer_details() Shows customer details
* @hooked WC_Emails::email_address() Shows email address
*/
do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email );
-/**
+?>
+
+
+
+
-has_status( 'pending' ) ) : ?>
+
+
get_billing_first_name() ) ); ?>
+
+has_status( 'pending' ) ) { ?>
array(
'href' => array(),
@@ -45,9 +47,16 @@ do_action( 'woocommerce_email_header', $email_heading, $email ); ?>
);
?>
-
+
+
+ get_date_created() ) ) );
+ ?>
+
+
+
+
+
-
' . esc_html( $user_login ) . '' ); ?>
+
+
+
+
' . esc_html( $user_login ) . '', make_clickable( esc_url( wc_get_page_permalink( 'myaccount' ) ) ) ); ?>
-
-
' . esc_html( $user_pass ) . '' ); ?>
-
+
+
' . esc_html( $user_pass ) . '' ); ?>
-
+
-
-
+
+
get_billing_first_name() ) ); ?>
+
-
+
-
+
*/
do_action( 'woocommerce_email_order_details', $order, $sent_to_admin, $plain_text, $email );
-/**
+/*
* @hooked WC_Emails::order_meta() Shows order meta data.
*/
do_action( 'woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text, $email );
-/**
+/*
* @hooked WC_Emails::customer_details() Shows customer details
* @hooked WC_Emails::email_address() Shows email address
*/
do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email );
-/**
+?>
+
+
-
+
+
get_billing_first_name() ); ?>
+
*/
do_action( 'woocommerce_email_order_details', $order, $sent_to_admin, $plain_text, $email );
-/**
+/*
* @hooked WC_Emails::order_meta() Shows order meta data.
*/
do_action( 'woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text, $email );
-/**
+/*
* @hooked WC_Emails::customer_details() Shows customer details
* @hooked WC_Emails::email_address() Shows email address
*/
do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email );
-/**
+?>
+
+
+
+
-
+
+
get_billing_first_name() ) ); ?>
+
+
get_order_number() ) ); ?>
*/
do_action( 'woocommerce_email_order_details', $order, $sent_to_admin, $plain_text, $email );
-/**
+/*
* @hooked WC_Emails::order_meta() Shows order meta data.
*/
do_action( 'woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text, $email );
-/**
+/*
* @hooked WC_Emails::customer_details() Shows customer details
* @hooked WC_Emails::email_address() Shows email address
*/
do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email );
-/**
+?>
+
+
+
+
-
+
+
get_billing_first_name() ); ?>
+
+
+
*/
do_action( 'woocommerce_email_order_details', $order, $sent_to_admin, $plain_text, $email );
-/**
+/*
* @hooked WC_Emails::order_meta() Shows order meta data.
*/
do_action( 'woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text, $email );
-/**
+/*
* @hooked WC_Emails::customer_details() Shows customer details
* @hooked WC_Emails::email_address() Shows email address
*/
do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email );
-/**
+?>
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
-
-
+
+
+
-
+
diff --git a/templates/emails/email-addresses.php b/templates/emails/email-addresses.php
index 2cce13d8d91..0bcd1dbfd61 100644
--- a/templates/emails/email-addresses.php
+++ b/templates/emails/email-addresses.php
@@ -11,7 +11,6 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates/Emails
* @version 3.2.1
*/
diff --git a/templates/emails/email-customer-details.php b/templates/emails/email-customer-details.php
index acce35d7882..8493c789cd4 100644
--- a/templates/emails/email-customer-details.php
+++ b/templates/emails/email-customer-details.php
@@ -13,7 +13,6 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates/Emails
* @version 2.5.0
*/
diff --git a/templates/emails/email-footer.php b/templates/emails/email-footer.php
index 5266ddd2e41..784b02fb070 100644
--- a/templates/emails/email-footer.php
+++ b/templates/emails/email-footer.php
@@ -11,7 +11,6 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates/Emails
* @version 2.3.0
*/
diff --git a/templates/emails/email-header.php b/templates/emails/email-header.php
index 78984b50b54..d78c16352fe 100644
--- a/templates/emails/email-header.php
+++ b/templates/emails/email-header.php
@@ -11,7 +11,6 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates/Emails
* @version 2.4.0
*/
@@ -28,7 +27,7 @@ if ( ! defined( 'ABSPATH' ) ) {
="0" marginwidth="0" topmargin="0" marginheight="0" offset="0">
-
+
diff --git a/templates/emails/email-order-details.php b/templates/emails/email-order-details.php
index 93f10bbae1e..997fae8761f 100644
--- a/templates/emails/email-order-details.php
+++ b/templates/emails/email-order-details.php
@@ -33,7 +33,7 @@ do_action( 'woocommerce_email_before_order_table', $order, $sent_to_admin, $plai
$after = '';
}
/* translators: %s: Order ID. */
- echo wp_kses_post( $before . sprintf( __( 'Order #%s', 'woocommerce' ) . $after . ' (%s )', $order->get_order_number(), $order->get_date_created()->format( 'c' ), wc_format_datetime( $order->get_date_created() ) ) );
+ echo wp_kses_post( $before . sprintf( __( '[Order #%s]', 'woocommerce' ) . $after . ' (%s )', $order->get_order_number(), $order->get_date_created()->format( 'c' ), wc_format_datetime( $order->get_date_created() ) ) );
?>
diff --git a/templates/emails/email-order-items.php b/templates/emails/email-order-items.php
index 4473a565f70..0ae64791c5e 100644
--- a/templates/emails/email-order-items.php
+++ b/templates/emails/email-order-items.php
@@ -12,12 +12,13 @@
*
* @see https://docs.woocommerce.com/document/template-structure/
* @package WooCommerce/Templates/Emails
- * @version 3.4.0
+ * @version 3.5.0
*/
defined( 'ABSPATH' ) || exit;
-$text_align = is_rtl() ? 'right' : 'left';
+$text_align = is_rtl() ? 'right' : 'left';
+$margin_side = is_rtl() ? 'left' : 'right';
foreach ( $items as $item_id => $item ) :
$product = $item->get_product();
@@ -56,7 +57,12 @@ foreach ( $items as $item_id => $item ) :
// allow other plugins to add additional product information here.
do_action( 'woocommerce_order_item_meta_start', $item_id, $item, $order, $plain_text );
- wc_display_item_meta( $item );
+ wc_display_item_meta(
+ $item,
+ array(
+ 'label_before' => '',
+ )
+ );
// allow other plugins to add additional product information here.
do_action( 'woocommerce_order_item_meta_end', $item_id, $item, $order, $plain_text );
diff --git a/templates/emails/email-styles.php b/templates/emails/email-styles.php
index 152ec467282..e5ef89bc388 100644
--- a/templates/emails/email-styles.php
+++ b/templates/emails/email-styles.php
@@ -43,13 +43,13 @@ $text_lighter_20 = wc_hex_lighter( $text, 20 );
#wrapper {
background-color: ;
margin: 0;
- padding: 70px 0 70px 0;
+ padding: 70px 0;
-webkit-text-size-adjust: none !important;
width: 100%;
}
#template_container {
- box-shadow: 0 1px 4px rgba(0,0,0,0.1) !important;
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1) !important;
background-color: ;
border: 1px solid ;
border-radius: 3px !important;
@@ -73,16 +73,16 @@ $text_lighter_20 = wc_hex_lighter( $text, 20 );
#template_footer td {
padding: 0;
- -webkit-border-radius: 6px;
+ border-radius: 6px;
}
#template_footer #credit {
- border:0;
+ border: 0;
color: ;
- font-family: Arial;
- font-size:12px;
- line-height:125%;
- text-align:center;
+ font-family: "Helvetica Neue", Helvetica, Roboto, Arial, sans-serif;
+ font-size: 12px;
+ line-height: 125%;
+ text-align: center;
padding: 0 48px 48px 48px;
}
@@ -137,7 +137,7 @@ $text_lighter_20 = wc_hex_lighter( $text, 20 );
}
.address {
- padding:12px 12px 0;
+ padding: 12px 12px 0;
color: ;
border: 1px solid ;
}
diff --git a/templates/emails/plain/admin-cancelled-order.php b/templates/emails/plain/admin-cancelled-order.php
index d926d60e5e8..acbf1c9d160 100644
--- a/templates/emails/plain/admin-cancelled-order.php
+++ b/templates/emails/plain/admin-cancelled-order.php
@@ -10,23 +10,23 @@
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
- * @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
- * @package WooCommerce/Templates/Emails/Plain
- * @version 2.5.0
+ * @see https://docs.woocommerce.com/document/template-structure/
+ * @package WooCommerce/Templates/Emails/Plain
+ * @version 3.5.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
-echo "= " . $email_heading . " =\n\n";
+echo '= ' . esc_html( $email_heading ) . " =\n\n";
-echo sprintf( __( 'The order #%1$s from %2$s has been cancelled. The order was as follows:', 'woocommerce' ), $order->get_order_number(), $order->get_formatted_billing_full_name() ) . "\n\n";
+/* translators: %1$s: Customer full name. %2$s: Order numer */
+echo sprintf( esc_html__( 'Alas. Just to let you know — %1$s has cancelled order #%2$s:', 'woocommerce' ), esc_html( $order->get_formatted_billing_full_name() ), esc_html( $order->get_order_number() ) ) . "\n\n";
echo "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-/**
+/*
* @hooked WC_Emails::order_details() Shows the order details table.
* @hooked WC_Structured_Data::generate_order_data() Generates structured data.
* @hooked WC_Structured_Data::output_structured_data() Outputs structured data.
@@ -36,17 +36,19 @@ do_action( 'woocommerce_email_order_details', $order, $sent_to_admin, $plain_tex
echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-/**
+/*
* @hooked WC_Emails::order_meta() Shows order meta data.
*/
do_action( 'woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text, $email );
-/**
+/*
* @hooked WC_Emails::customer_details() Shows customer details
* @hooked WC_Emails::email_address() Shows email address
*/
do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email );
+echo esc_html__( 'Thanks for reading.', 'woocommerce' ) . "\n\n";
+
echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-echo apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) );
+echo esc_html( apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) ) );
diff --git a/templates/emails/plain/admin-failed-order.php b/templates/emails/plain/admin-failed-order.php
index 0a0ad01630f..84f9b6c6678 100644
--- a/templates/emails/plain/admin-failed-order.php
+++ b/templates/emails/plain/admin-failed-order.php
@@ -10,23 +10,23 @@
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
- * @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
- * @package WooCommerce/Templates/Emails/Plain
- * @version 2.5.0
+ * @see https://docs.woocommerce.com/document/template-structure/
+ * @package WooCommerce/Templates/Emails/Plain
+ * @version 3.5.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
-echo "= " . $email_heading . " =\n\n";
+echo '= ' . $email_heading . " =\n\n"; // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
-echo sprintf( __( 'Payment for order #%1$s from %2$s has failed. The order was as follows:', 'woocommerce' ), $order->get_order_number(), $order->get_formatted_billing_full_name() ) . "\n\n";
+/* translators: %1$s: Order number. %2$s: Customer full name. */
+echo sprintf( esc_html__( 'Payment for order #%1$s from %2$s has failed. The order was as follows:', 'woocommerce' ), esc_html( $order->get_order_number() ), esc_html( $order->get_formatted_billing_full_name() ) ) . "\n\n";
echo "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-/**
+/*
* @hooked WC_Emails::order_details() Shows the order details table.
* @hooked WC_Structured_Data::generate_order_data() Generates structured data.
* @hooked WC_Structured_Data::output_structured_data() Outputs structured data.
@@ -36,17 +36,19 @@ do_action( 'woocommerce_email_order_details', $order, $sent_to_admin, $plain_tex
echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-/**
+/*
* @hooked WC_Emails::order_meta() Shows order meta data.
*/
do_action( 'woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text, $email );
-/**
+/*
* @hooked WC_Emails::customer_details() Shows customer details
* @hooked WC_Emails::email_address() Shows email address
*/
do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email );
+echo esc_html__( 'Hopefully they’ll be back. Read more about troubleshooting failed payments .', 'woocommerce' ) . "\n\n";
+
echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-echo apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) );
+echo esc_html( apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) ) );
diff --git a/templates/emails/plain/admin-new-order.php b/templates/emails/plain/admin-new-order.php
index cc920b80450..669322311b3 100644
--- a/templates/emails/plain/admin-new-order.php
+++ b/templates/emails/plain/admin-new-order.php
@@ -10,23 +10,23 @@
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
- * @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
- * @package WooCommerce/Templates/Emails/Plain
- * @version 2.5.0
+ * @see https://docs.woocommerce.com/document/template-structure/
+ * @package WooCommerce/Templates/Emails/Plain
+ * @version 3.5.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
-echo "= " . $email_heading . " =\n\n";
+echo '= ' . esc_html( $email_heading ) . " =\n\n";
-echo sprintf( __( 'You have received an order from %s.', 'woocommerce' ), $order->get_formatted_billing_full_name() ) . "\n\n";
+/* translators: %s: Customer billing full name */
+echo sprintf( esc_html__( 'You’ve received the following order from %s:', 'woocommerce' ), esc_html( $order->get_formatted_billing_full_name() ) ) . "\n\n";
echo "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-/**
+/*
* @hooked WC_Emails::order_details() Shows the order details table.
* @hooked WC_Structured_Data::generate_order_data() Generates structured data.
* @hooked WC_Structured_Data::output_structured_data() Outputs structured data.
@@ -36,12 +36,12 @@ do_action( 'woocommerce_email_order_details', $order, $sent_to_admin, $plain_tex
echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-/**
+/*
* @hooked WC_Emails::order_meta() Shows order meta data.
*/
do_action( 'woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text, $email );
-/**
+/*
* @hooked WC_Emails::customer_details() Shows customer details
* @hooked WC_Emails::email_address() Shows email address
*/
@@ -49,4 +49,4 @@ do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_
echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-echo apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) );
+echo esc_html( apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) ) );
diff --git a/templates/emails/plain/customer-completed-order.php b/templates/emails/plain/customer-completed-order.php
index e6b5abe03dc..4e2aa4afa5e 100644
--- a/templates/emails/plain/customer-completed-order.php
+++ b/templates/emails/plain/customer-completed-order.php
@@ -10,23 +10,25 @@
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
- * @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
- * @package WooCommerce/Templates/Emails/Plain
- * @version 2.5.0
+ * @see https://docs.woocommerce.com/document/template-structure/
+ * @package WooCommerce/Templates/Emails/Plain
+ * @version 3.5.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
-echo "= " . $email_heading . " =\n\n";
+echo '= ' . esc_html( $email_heading ) . " =\n\n";
-echo sprintf( __( "Hi there. Your recent order on %s has been completed. Your order details are shown below for your reference:", 'woocommerce' ), get_option( 'blogname' ) ) . "\n\n";
+/* translators: %s: Customer first name */
+echo sprintf( esc_html__( 'Hi %s,', 'woocommerce' ), esc_html( $order->get_billing_first_name() ) ) . "\n\n";
+/* translators: %s: Site title */
+echo sprintf( esc_html__( 'Your %s order has been marked complete on our side.', 'woocommerce' ), esc_html( wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ) ) ) . "\n\n";
echo "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-/**
+/*
* @hooked WC_Emails::order_details() Shows the order details table.
* @hooked WC_Structured_Data::generate_order_data() Generates structured data.
* @hooked WC_Structured_Data::output_structured_data() Outputs structured data.
@@ -36,17 +38,19 @@ do_action( 'woocommerce_email_order_details', $order, $sent_to_admin, $plain_tex
echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-/**
+/*
* @hooked WC_Emails::order_meta() Shows order meta data.
*/
do_action( 'woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text, $email );
-/**
+/*
* @hooked WC_Emails::customer_details() Shows customer details
* @hooked WC_Emails::email_address() Shows email address
*/
do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email );
+echo esc_html__( 'Thanks for shopping with us.', 'woocommerce' ) . "\n\n";
+
echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-echo apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) );
+echo esc_html( apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) ) ); // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
diff --git a/templates/emails/plain/customer-invoice.php b/templates/emails/plain/customer-invoice.php
index 6d8e49a322a..67a65f7d571 100644
--- a/templates/emails/plain/customer-invoice.php
+++ b/templates/emails/plain/customer-invoice.php
@@ -10,10 +10,9 @@
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
- * @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
- * @package WooCommerce/Templates/Emails/Plain
- * @version 2.5.0
+ * @see https://docs.woocommerce.com/document/template-structure/
+ * @package WooCommerce/Templates/Emails/Plain
+ * @version 3.5.0
*/
if ( ! defined( 'ABSPATH' ) ) {
@@ -22,16 +21,21 @@ if ( ! defined( 'ABSPATH' ) ) {
echo '= ' . esc_html( $email_heading ) . " =\n\n";
-if ( $order->has_status( 'pending' ) ) {
+/* translators: %s: Customer first name */
+echo sprintf( esc_html__( 'Hi %s,', 'woocommerce' ), esc_html( $order->get_billing_first_name() ) ) . "\n\n";
+if ( $order->has_status( 'pending' ) ) {
echo sprintf(
- /* translators: %1s item is the name of the site, %2s is a html link */
- esc_html__( 'An order has been created for you on %1$s. %2$s', 'woocommerce' ),
+ /* translators: %1$s Site title, %2$s Order pay link */
+ __( 'An order has been created for you on %1$s. Your invoice is below, with a link to make payment when you’re ready: %2$s', 'woocommerce' ),
esc_html( get_bloginfo( 'name', 'display' ) ),
esc_url( $order->get_checkout_payment_url() )
) . "\n\n";
-}
+} else {
+ /* translators: %s Order date */
+ echo sprintf( esc_html__( 'Here are the details of your order placed on %s:', 'woocommerce' ), esc_html( wc_format_datetime( $order->get_date_created() ) ) ) . "\n\n";
+}
echo "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
/**
@@ -61,6 +65,8 @@ do_action( 'woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text,
*/
do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email );
+echo esc_html__( 'Thanks for reading.', 'woocommerce' ) . "\n\n";
+
echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-echo wp_kses_post( apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) ) );
+echo esc_html( apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) ) );
diff --git a/templates/emails/plain/customer-new-account.php b/templates/emails/plain/customer-new-account.php
index 82180ab4454..9f64213bd14 100644
--- a/templates/emails/plain/customer-new-account.php
+++ b/templates/emails/plain/customer-new-account.php
@@ -10,26 +10,29 @@
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
- * @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
- * @package WooCommerce/Templates/Emails/Plain
- * @version 2.0.0
+ * @see https://docs.woocommerce.com/document/template-structure/
+ * @package WooCommerce/Templates/Emails/Plain
+ * @version 3.5.2
*/
if ( ! defined( 'ABSPATH' ) ) {
- exit; // Exit if accessed directly
+ exit; // Exit if accessed directly.
}
-echo "= " . $email_heading . " =\n\n";
+echo '= ' . esc_html( $email_heading ) . " =\n\n";
-echo sprintf( __( 'Thanks for creating an account on %1$s. Your username is %2$s', 'woocommerce' ), $blogname, '' . $user_login . ' ' ) . "\n\n";
+/* translators: %s Customer first name */
+echo sprintf( esc_html__( 'Hi %s,', 'woocommerce' ), esc_html( $user_login ) ) . "\n\n";
+/* translators: %1$s: Site title, %2$s: Username, %3$s: My account link */
+echo sprintf( esc_html__( 'Thanks for creating an account on %1$s. Your username is %2$s. You can access your account area to view orders, change your password, and more at: %3$s', 'woocommerce' ), esc_html( $blogname ), '' . esc_html( $user_login ) . ' ', esc_html( wc_get_page_permalink( 'myaccount' ) ) ) . "\n\n";
if ( 'yes' === get_option( 'woocommerce_registration_generate_password' ) && $password_generated ) {
- echo sprintf( __( 'Your password is %s.', 'woocommerce' ), '' . $user_pass . ' ' ) . "\n\n";
+ /* translators: %s Auto generated password */
+ echo sprintf( esc_html__( 'Your password has been automatically generated: %s.', 'woocommerce' ), esc_html( $user_pass ) ) . "\n\n";
}
-echo sprintf( __( 'You can access your account area to view your orders and change your password here: %s.', 'woocommerce' ), wc_get_page_permalink( 'myaccount' ) ) . "\n\n";
+echo esc_html__( 'We look forward to seeing you soon.', 'woocommerce' ) . "\n\n";
echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-echo apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) );
+echo apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) ); // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
diff --git a/templates/emails/plain/customer-note.php b/templates/emails/plain/customer-note.php
index e4b2affe443..28d19c10491 100644
--- a/templates/emails/plain/customer-note.php
+++ b/templates/emails/plain/customer-note.php
@@ -10,31 +10,33 @@
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
- * @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
- * @package WooCommerce/Templates/Emails/Plain
- * @version 2.5.0
+ * @see https://docs.woocommerce.com/document/template-structure/
+
+ * @package WooCommerce/Templates/Emails/Plain
+ * @version 3.5.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
-echo "= " . $email_heading . " =\n\n";
+echo '= ' . esc_html( $email_heading ) . " =\n\n";
-echo __( "Hello, a note has just been added to your order:", 'woocommerce' ) . "\n\n";
+/* translators: %s Customer first name */
+echo sprintf( esc_html__( 'Hi %s,', 'woocommerce' ), esc_html( $order->get_billing_first_name() ) ) . "\n\n";
+echo esc_html__( 'The following note has been added to your order:', 'woocommerce' ) . "\n\n";
echo "----------\n\n";
-echo wptexturize( $customer_note ) . "\n\n";
+echo wptexturize( $customer_note ) . "\n\n"; // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
echo "----------\n\n";
-echo __( "For your reference, your order details are shown below.", 'woocommerce' ) . "\n\n";
+echo esc_html__( 'As a reminder, here are your order details:', 'woocommerce' ) . "\n\n";
echo "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-/**
+/*
* @hooked WC_Emails::order_details() Shows the order details table.
* @hooked WC_Structured_Data::generate_order_data() Generates structured data.
* @hooked WC_Structured_Data::output_structured_data() Outputs structured data.
@@ -44,17 +46,19 @@ do_action( 'woocommerce_email_order_details', $order, $sent_to_admin, $plain_tex
echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-/**
+/*
* @hooked WC_Emails::order_meta() Shows order meta data.
*/
do_action( 'woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text, $email );
-/**
+/*
* @hooked WC_Emails::customer_details() Shows customer details
* @hooked WC_Emails::email_address() Shows email address
*/
do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email );
+echo esc_html__( 'Thanks for reading.', 'woocommerce' ) . "\n\n";
+
echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-echo apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) );
+echo esc_html( apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) ) );
diff --git a/templates/emails/plain/customer-on-hold-order.php b/templates/emails/plain/customer-on-hold-order.php
index 04bec34671a..c61f43ff856 100644
--- a/templates/emails/plain/customer-on-hold-order.php
+++ b/templates/emails/plain/customer-on-hold-order.php
@@ -10,23 +10,24 @@
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
- * @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
- * @package WooCommerce/Templates/Emails/Plain
- * @version 2.5.0
+ * @see https://docs.woocommerce.com/document/template-structure/
+ * @package WooCommerce/Templates/Emails/Plain
+ * @version 3.5.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
-echo "= " . $email_heading . " =\n\n";
+echo '= ' . $email_heading . " =\n\n"; // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
-echo __( "Your order is on-hold until we confirm payment has been received. Your order details are shown below for your reference:", 'woocommerce' ) . "\n\n";
+/* translators: %s: Customer first name */
+echo sprintf( __( 'Hi %s,', 'woocommerce' ), $order->get_billing_first_name() ) . "\n\n"; // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
+echo __( 'Thanks for your order. It’s on-hold until we confirm that payment has been received. In the meantime, here’s a reminder of what you ordered:', 'woocommerce' ) . "\n\n"; // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
echo "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-/**
+/*
* @hooked WC_Emails::order_details() Shows the order details table.
* @hooked WC_Structured_Data::generate_order_data() Generates structured data.
* @hooked WC_Structured_Data::output_structured_data() Outputs structured data.
@@ -36,17 +37,19 @@ do_action( 'woocommerce_email_order_details', $order, $sent_to_admin, $plain_tex
echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-/**
+/*
* @hooked WC_Emails::order_meta() Shows order meta data.
*/
do_action( 'woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text, $email );
-/**
+/*
* @hooked WC_Emails::customer_details() Shows customer details
* @hooked WC_Emails::email_address() Shows email address
*/
do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email );
+_e( 'We look forward to fulfilling your order soon.', 'woocommerce' ); // phpcs:ignore WordPress.XSS.EscapeOutput
+
echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-echo apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) );
+echo apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) ); // phpcs:ignore WordPress.XSS.EscapeOutput
diff --git a/templates/emails/plain/customer-processing-order.php b/templates/emails/plain/customer-processing-order.php
index 43d251b1a39..4ea616b1e19 100644
--- a/templates/emails/plain/customer-processing-order.php
+++ b/templates/emails/plain/customer-processing-order.php
@@ -10,23 +10,25 @@
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
- * @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
- * @package WooCommerce/Templates/Emails/Plain
- * @version 2.5.0
+ * @see https://docs.woocommerce.com/document/template-structure/
+ * @package WooCommerce/Templates/Emails/Plain
+ * @version 3.5.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
-echo "= " . $email_heading . " =\n\n";
+echo '= ' . esc_html( $email_heading ) . " =\n\n";
-echo __( "Your order has been received and is now being processed. Your order details are shown below for your reference:", 'woocommerce' ) . "\n\n";
+/* translators: %s: Customer first name */
+echo sprintf( esc_html__( 'Hi %s,', 'woocommerce' ), esc_html( $order->get_billing_first_name() ) ) . "\n\n";
+/* translators: %s: Order number */
+echo sprintf( esc_html__( 'Just to let you know — your payment has been confirmed, and order #%s is now being processed:', 'woocommerce' ), esc_html( $order->get_order_number() ) ) . "\n\n";
echo "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-/**
+/*
* @hooked WC_Emails::order_details() Shows the order details table.
* @hooked WC_Structured_Data::generate_order_data() Generates structured data.
* @hooked WC_Structured_Data::output_structured_data() Outputs structured data.
@@ -36,17 +38,19 @@ do_action( 'woocommerce_email_order_details', $order, $sent_to_admin, $plain_tex
echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-/**
+/*
* @hooked WC_Emails::order_meta() Shows order meta data.
*/
do_action( 'woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text, $email );
-/**
+/*
* @hooked WC_Emails::customer_details() Shows customer details
* @hooked WC_Emails::email_address() Shows email address
*/
do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email );
+echo esc_html_e( 'Thanks!', 'woocommerce' ) . "\n\n";
+
echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-echo apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) );
+echo esc_html( apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) ) );
diff --git a/templates/emails/plain/customer-refunded-order.php b/templates/emails/plain/customer-refunded-order.php
index d87d65d42b0..37831394d84 100644
--- a/templates/emails/plain/customer-refunded-order.php
+++ b/templates/emails/plain/customer-refunded-order.php
@@ -10,23 +10,29 @@
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
- * @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
- * @package WooCommerce/Templates/Emails/Plain
- * @version 2.5.0
+ * @see https://docs.woocommerce.com/document/template-structure/
+ * @package WooCommerce/Templates/Emails/Plain
+ * @version 3.5.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
-echo "= " . $email_heading . " =\n\n";
-
-echo sprintf( __( "Hi there. Your order on %s has been refunded. Your order details are shown below for your reference:", 'woocommerce' ), get_option( 'blogname' ) ) . "\n\n";
+echo '= ' . $email_heading . " =\n\n"; // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
+/* translators: %s: Customer first name */
+echo sprintf( __( 'Hi %s,', 'woocommerce' ), $order->get_billing_first_name() ) . "\n\n"; // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
+if ( $partial_refund ) {
+ /* translators: %s: Site title */
+ echo sprintf( __( 'Your order on %s has been partially refunded. There are more details below for your reference:', 'woocommerce' ), wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ) ) . "\n\n"; // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
+} else {
+ /* translators: %s: Site title */
+ echo sprintf( __( 'Your order on %s has been refunded. There are more details below for your reference:', 'woocommerce' ), wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ) ) . "\n\n"; // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
+}
echo "=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-/**
+/*
* @hooked WC_Emails::order_details() Shows the order details table.
* @hooked WC_Structured_Data::generate_order_data() Generates structured data.
* @hooked WC_Structured_Data::output_structured_data() Outputs structured data.
@@ -36,17 +42,19 @@ do_action( 'woocommerce_email_order_details', $order, $sent_to_admin, $plain_tex
echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-/**
+/*
* @hooked WC_Emails::order_meta() Shows order meta data.
*/
do_action( 'woocommerce_email_order_meta', $order, $sent_to_admin, $plain_text, $email );
-/**
+/*
* @hooked WC_Emails::customer_details() Shows customer details
* @hooked WC_Emails::email_address() Shows email address
*/
do_action( 'woocommerce_email_customer_details', $order, $sent_to_admin, $plain_text, $email );
+echo esc_html__( 'We hope to see you again soon.', 'woocommerce' ) . "\n\n";
+
echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-echo apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) );
+echo apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) ); // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped
diff --git a/templates/emails/plain/customer-reset-password.php b/templates/emails/plain/customer-reset-password.php
index e17dff53377..3c6df74c8be 100644
--- a/templates/emails/plain/customer-reset-password.php
+++ b/templates/emails/plain/customer-reset-password.php
@@ -10,26 +10,27 @@
* happen. When this occurs the version of the template file will be bumped and
* the readme will list any important changes.
*
- * @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
+ * @see https://docs.woocommerce.com/document/template-structure/
* @package WooCommerce/Templates/Emails/Plain
- * @version 2.3.0
+ * @version 3.5.0
*/
if ( ! defined( 'ABSPATH' ) ) {
- exit; // Exit if accessed directly
+ exit; // Exit if accessed directly.
}
-echo "= " . $email_heading . " =\n\n";
+echo '= ' . esc_html( $email_heading ) . " =\n\n";
-echo __( 'Someone requested that the password be reset for the following account:', 'woocommerce' ) . "\r\n\r\n";
-echo esc_url( network_home_url( '/' ) ) . "\r\n\r\n";
-echo sprintf( __( 'Username: %s', 'woocommerce' ), $user_login ) . "\r\n\r\n";
-echo __( 'If this was a mistake, just ignore this email and nothing will happen.', 'woocommerce' ) . "\r\n\r\n";
-echo __( 'To reset your password, visit the following address:', 'woocommerce' ) . "\r\n\r\n";
-
-echo esc_url( add_query_arg( array( 'key' => $reset_key, 'id' => $user_id ), wc_get_endpoint_url( 'lost-password', '', wc_get_page_permalink( 'myaccount' ) ) ) ) . "\r\n";
+/* translators: %s: Customer first name */
+echo sprintf( esc_html__( 'Hi %s,', 'woocommerce' ), esc_html( $user_login ) ) . "\n\n";
+/* translators: %s: Store name */
+echo sprintf( esc_html__( 'Someone has requested a new password for the following account on %s:', 'woocommerce' ), esc_html( wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES ) ) ) . "\n\n";
+/* translators: %s: Customer username */
+echo sprintf( esc_html__( 'Username: %s', 'woocommerce' ), esc_html( $user_login ) ) . "\n\n";
+echo esc_html__( 'If you didn\'t make this request, just ignore this email. If you\'d like to proceed:', 'woocommerce' ) . "\n\n";
+echo esc_url( add_query_arg( array( 'key' => $reset_key, 'id' => $user_id ), wc_get_endpoint_url( 'lost-password', '', wc_get_page_permalink( 'myaccount' ) ) ) ) . "\n\n"; // phpcs:ignore
+echo esc_html__( 'Thanks for reading.', 'woocommerce' ) . "\n\n";
echo "\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n\n";
-echo apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) );
+echo esc_html( apply_filters( 'woocommerce_email_footer_text', get_option( 'woocommerce_email_footer_text' ) ) );
diff --git a/templates/emails/plain/email-order-details.php b/templates/emails/plain/email-order-details.php
index a07880c2760..b9df61272ab 100644
--- a/templates/emails/plain/email-order-details.php
+++ b/templates/emails/plain/email-order-details.php
@@ -12,7 +12,7 @@
*
* @see https://docs.woocommerce.com/document/template-structure/
* @package WooCommerce/Templates/Emails
- * @version 3.4.0
+ * @version 3.5.0
*/
if ( ! defined( 'ABSPATH' ) ) {
@@ -21,9 +21,8 @@ if ( ! defined( 'ABSPATH' ) ) {
do_action( 'woocommerce_email_before_order_table', $order, $sent_to_admin, $plain_text, $email );
-/* translators: %s: Order ID. */
-echo wp_kses_post( wc_strtoupper( sprintf( __( 'Order number: %s', 'woocommerce' ), $order->get_order_number() ) ) ) . "\n";
-echo wc_format_datetime( $order->get_date_created() ) . "\n"; // WPCS: XSS ok.
+/* translators: %1$s: Order ID. %2$s: Order date */
+echo wp_kses_post( wc_strtoupper( sprintf( __( '[Order #%1$s] (%2$s)', 'woocommerce' ), $order->get_order_number(), wc_format_datetime( $order->get_date_created() ) ) ) ) . "\n";
echo "\n" . wc_get_email_order_items( $order, array( // WPCS: XSS ok.
'show_sku' => $sent_to_admin,
'show_image' => false,
diff --git a/templates/emails/plain/email-order-items.php b/templates/emails/plain/email-order-items.php
index 1cdd92697b8..8392ec0ccc7 100644
--- a/templates/emails/plain/email-order-items.php
+++ b/templates/emails/plain/email-order-items.php
@@ -11,7 +11,6 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates/Emails/Plain
* @version 3.2.0
*/
diff --git a/templates/global/breadcrumb.php b/templates/global/breadcrumb.php
index ab98be1fff0..67abda2a5d6 100644
--- a/templates/global/breadcrumb.php
+++ b/templates/global/breadcrumb.php
@@ -11,7 +11,6 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates
* @version 2.3.0
* @see woocommerce_breadcrumb()
diff --git a/templates/global/form-login.php b/templates/global/form-login.php
index 3dc991879e8..ba60b6bb927 100644
--- a/templates/global/form-login.php
+++ b/templates/global/form-login.php
@@ -11,7 +11,6 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates
* @version 3.3.0
*/
@@ -46,7 +45,7 @@ if ( is_user_logged_in() ) {
-
+
diff --git a/templates/global/quantity-input.php b/templates/global/quantity-input.php
index f5333e876a5..4942e64498a 100644
--- a/templates/global/quantity-input.php
+++ b/templates/global/quantity-input.php
@@ -12,7 +12,7 @@
*
* @see https://docs.woocommerce.com/document/template-structure/
* @package WooCommerce/Templates
- * @version 3.4.0
+ * @version 3.6.0
*/
defined( 'ABSPATH' ) || exit;
@@ -25,14 +25,14 @@ if ( $max_value && $min_value === $max_value ) {
aria-labelledby="" />
+
diff --git a/templates/myaccount/form-edit-account.php b/templates/myaccount/form-edit-account.php
index d3bcdd78376..27d932a32a7 100644
--- a/templates/myaccount/form-edit-account.php
+++ b/templates/myaccount/form-edit-account.php
@@ -12,14 +12,14 @@
*
* @see https://docs.woocommerce.com/document/template-structure/
* @package WooCommerce/Templates
- * @version 3.4.0
+ * @version 3.5.0
*/
defined( 'ABSPATH' ) || exit;
do_action( 'woocommerce_before_edit_account_form' ); ?>
-
+
-
+
diff --git a/templates/myaccount/my-account.php b/templates/myaccount/my-account.php
index e75c86d102f..d724d7adc10 100644
--- a/templates/myaccount/my-account.php
+++ b/templates/myaccount/my-account.php
@@ -11,17 +11,15 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates
- * @version 2.6.0
+ * @version 3.5.0
*/
-if ( ! defined( 'ABSPATH' ) ) {
- exit;
-}
+defined( 'ABSPATH' ) || exit;
/**
* My Account navigation.
+ *
* @since 2.6.0
*/
do_action( 'woocommerce_account_navigation' ); ?>
@@ -30,6 +28,7 @@ do_action( 'woocommerce_account_navigation' ); ?>
diff --git a/templates/myaccount/payment-methods.php b/templates/myaccount/payment-methods.php
index 56bcd922ad7..a3630ab3515 100644
--- a/templates/myaccount/payment-methods.php
+++ b/templates/myaccount/payment-methods.php
@@ -13,7 +13,6 @@
* the readme will list any important changes.
*
* @see https://docs.woocommerce.com/document/template-structure/
- * @author WooThemes
* @package WooCommerce/Templates
* @version 2.6.0
*/
@@ -40,7 +39,7 @@ do_action( 'woocommerce_before_account_payment_methods', $has_methods ); ?>
$methods ) : ?>
-
+
$column_name ) : ?>
-