Easy Digital Downloads - Version 2.9.2

Version Description

Download this release

Release Info

Developer cklosows
Plugin Icon 128x128 Easy Digital Downloads
Version 2.9.2
Comparing to
See all releases

Code changes from version 2.9.1 to 2.9.2

assets/js/edd-ajax.js CHANGED
@@ -381,7 +381,7 @@ jQuery(document).ready(function ($) {
381
  }
382
 
383
  // Process checkout
384
- $(document).on('click', '#edd_purchase_form #edd_purchase_submit input[type=submit]', function(e) {
385
 
386
  var eddPurchaseform = document.getElementById('edd_purchase_form');
387
 
381
  }
382
 
383
  // Process checkout
384
+ $(document).on('click', '#edd_purchase_form #edd_purchase_submit [type=submit]', function(e) {
385
 
386
  var eddPurchaseform = document.getElementById('edd_purchase_form');
387
 
assets/js/edd-ajax.min.js CHANGED
@@ -1 +1 @@
1
- var edd_scripts;function edd_load_gateway(payment_mode){jQuery(".edd-cart-ajax").show(),jQuery("#edd_purchase_form_wrap").html('<span class="edd-loading-ajax edd-loading"></span>');var url=edd_scripts.ajaxurl;0<url.indexOf("?")?url+="&":url+="?",url=url+"payment-mode="+payment_mode,jQuery.post(url,{action:"edd_load_gateway",edd_payment_mode:payment_mode},function(response){jQuery("#edd_purchase_form_wrap").html(response),jQuery(".edd-no-js").hide(),jQuery("body").trigger("edd_gateway_loaded",[payment_mode])})}jQuery(document).ready(function($){if($(".edd-no-js").hide(),$("a.edd-add-to-cart").addClass("edd-has-js"),$(document.body).on("click.eddRemoveFromCart",".edd-remove-from-cart",function(event){var $this=$(this),item=$this.data("cart-item"),action=$this.data("action"),id=$this.data("download-id"),data={action:action,cart_item:item};return $.ajax({type:"POST",data:data,dataType:"json",url:edd_scripts.ajaxurl,xhrFields:{withCredentials:!0},success:function(response){if(response.removed){if(parseInt(edd_scripts.position_in_cart,10)===parseInt(item,10)||edd_scripts.has_purchase_links)return window.location=window.location,!1;$(".edd-cart").each(function(){$(this).find("[data-cart-item='"+item+"']").parent().remove()}),$(".edd-cart").each(function(){var cart_item_counter=0;$(this).find("[data-cart-item]").each(function(){$(this).attr("data-cart-item",cart_item_counter),cart_item_counter+=1})}),$("[id^=edd_purchase_"+id+"]").length&&($("[id^=edd_purchase_"+id+"] .edd_go_to_checkout").hide(),$("[id^=edd_purchase_"+id+"] a.edd-add-to-cart").show().removeAttr("data-edd-loading"),"1"==edd_scripts.quantities_enabled&&$("[id^=edd_purchase_"+id+"] .edd_download_quantity_wrapper").show()),$("span.edd-cart-quantity").text(response.cart_quantity),$(document.body).trigger("edd_quantity_updated",[response.cart_quantity]),edd_scripts.taxes_enabled&&($(".cart_item.edd_subtotal span").html(response.subtotal),$(".cart_item.edd_cart_tax span").html(response.tax)),$(".cart_item.edd_total span").html(response.total),0==response.cart_quantity&&($(".cart_item.edd_subtotal,.edd-cart-number-of-items,.cart_item.edd_checkout,.cart_item.edd_cart_tax,.cart_item.edd_total").hide(),$(".edd-cart").each(function(){var cart_wrapper=$(this).parent();cart_wrapper&&(cart_wrapper.addClass("cart-empty"),cart_wrapper.removeClass("cart-not-empty")),$(this).append('<li class="cart_item empty">'+edd_scripts.empty_cart_message+"</li>")})),$(document.body).trigger("edd_cart_item_removed",[response])}}}).fail(function(response){window.console&&window.console.log&&console.log(response)}).done(function(response){}),!1}),$(document.body).on("click.eddAddToCart",".edd-add-to-cart",function(e){e.preventDefault();var $this=$(this),form=$this.closest("form");$this.prop("disabled",!0);$this.find(".edd-loading");var container=$this.closest("div");$this.attr("data-edd-loading","");form=$this.parents("form").last();var download=$this.data("download-id"),variable_price=$this.data("variable-price"),price_mode=$this.data("price-mode"),item_price_ids=[],free_items=!0;if("yes"==variable_price)if(0<form.find(".edd_price_option_"+download+'[type="hidden"]').length)item_price_ids[0]=$(".edd_price_option_"+download,form).val(),form.find(".edd-submit").data("price")&&0<form.find(".edd-submit").data("price")&&(free_items=!1);else{if(!form.find(".edd_price_option_"+download+":checked",form).length)return $this.removeAttr("data-edd-loading"),alert(edd_scripts.select_option),e.stopPropagation(),$this.prop("disabled",!1),!1;form.find(".edd_price_option_"+download+":checked",form).each(function(index){if(item_price_ids[index]=$(this).val(),!0===free_items){var item_price=$(this).data("price");item_price&&0<item_price&&(free_items=!1)}})}else item_price_ids[0]=download,$this.data("price")&&0<$this.data("price")&&(free_items=!1);if(free_items&&form.find(".edd_action_input").val("add_to_cart"),"straight_to_gateway"==form.find(".edd_action_input").val())return form.submit(),!0;var data={action:$this.data("action"),download_id:download,price_ids:item_price_ids,post_data:$(form).serialize()};return $.ajax({type:"POST",data:data,dataType:"json",url:edd_scripts.ajaxurl,xhrFields:{withCredentials:!0},success:function(response){var store_redirect="1"==edd_scripts.redirect_to_checkout,item_redirect="1"==form.find("#edd_redirect_to_checkout").val();if(store_redirect&&item_redirect||!store_redirect&&item_redirect)window.location=edd_scripts.checkout_page;else{"1"===edd_scripts.taxes_enabled&&($(".cart_item.edd_subtotal").show(),$(".cart_item.edd_cart_tax").show()),$(".cart_item.edd_total").show(),$(".cart_item.edd_checkout").show(),$(".cart_item.empty").length&&$(".cart_item.empty").hide(),$(".widget_edd_cart_widget .edd-cart").each(function(cart){var target=$(this).find(".edd-cart-meta:first");$(response.cart_item).insertBefore(target);var cart_wrapper=$(this).parent();cart_wrapper&&(cart_wrapper.addClass("cart-not-empty"),cart_wrapper.removeClass("cart-empty"))}),"1"===edd_scripts.taxes_enabled&&($(".edd-cart-meta.edd_subtotal span").html(response.subtotal),$(".edd-cart-meta.edd_cart_tax span").html(response.tax)),$(".edd-cart-meta.edd_total span").html(response.total);$(".edd-cart-item-title",response.cart_item).length;if($("span.edd-cart-quantity").each(function(){$(this).text(response.cart_quantity),$(document.body).trigger("edd_quantity_updated",[response.cart_quantity])}),"none"==$(".edd-cart-number-of-items").css("display")&&$(".edd-cart-number-of-items").show("slow"),"no"!=variable_price&&"multi"==price_mode||($("a.edd-add-to-cart",container).toggle(),$(".edd_go_to_checkout",container).css("display","inline-block")),"multi"==price_mode&&$this.removeAttr("data-edd-loading"),$(".edd_download_purchase_form").length&&("no"==variable_price||!form.find(".edd_price_option_"+download).is("input:hidden"))){var parent_form=$('.edd_download_purchase_form *[data-download-id="'+download+'"]').parents("form");$("a.edd-add-to-cart",parent_form).hide(),"multi"!=price_mode&&parent_form.find(".edd_download_quantity_wrapper").slideUp(),$(".edd_go_to_checkout",parent_form).show().removeAttr("data-edd-loading")}"incart"!=response&&($(".edd-cart-added-alert",container).fadeIn(),setTimeout(function(){$(".edd-cart-added-alert",container).fadeOut()},3e3)),$this.prop("disabled",!1),$(document.body).trigger("edd_cart_item_added",[response])}}}).fail(function(response){window.console&&window.console.log&&console.log(response)}).done(function(response){}),!1}),$("#edd_checkout_form_wrap").on("click",".edd_checkout_register_login",function(){var data={action:$(this).data("action")};return $(".edd-cart-ajax").show(),$.post(edd_scripts.ajaxurl,data,function(checkout_response){$("#edd_checkout_login_register").html(edd_scripts.loading),$("#edd_checkout_login_register").html(checkout_response),$(".edd-cart-ajax").hide()}),!1}),$(document).on("click","#edd_purchase_form #edd_login_fields input[type=submit]",function(e){e.preventDefault();var complete_purchase_val=$(this).val();$(this).val(edd_global_vars.purchase_loading),$(this).after('<span class="edd-loading-ajax edd-loading"></span>');var data={action:"edd_process_checkout_login",edd_ajax:1,edd_user_login:$("#edd_login_fields #edd_user_login").val(),edd_user_pass:$("#edd_login_fields #edd_user_pass").val()};$.post(edd_global_vars.ajaxurl,data,function(data){"success"==$.trim(data)?($(".edd_errors").remove(),window.location=edd_scripts.checkout_page):($("#edd_login_fields input[type=submit]").val(complete_purchase_val),$(".edd-loading-ajax").remove(),$(".edd_errors").remove(),$("#edd-user-login-submit").before(data))})}),$("select#edd-gateway, input.edd-gateway").change(function(e){var payment_mode=$("#edd-gateway option:selected, input.edd-gateway:checked").val();return"0"==payment_mode||edd_load_gateway(payment_mode),!1}),"1"==edd_scripts.is_checkout){var chosen_gateway=!1,ajax_needed=!1;$("select#edd-gateway, input.edd-gateway").length&&(chosen_gateway=$("meta[name='edd-chosen-gateway']").attr("content"),ajax_needed=!0),chosen_gateway||(chosen_gateway=edd_scripts.default_gateway),ajax_needed?setTimeout(function(){edd_load_gateway(chosen_gateway)},200):$("body").trigger("edd_gateway_loaded",[chosen_gateway])}$(document).on("click","#edd_purchase_form #edd_purchase_submit input[type=submit]",function(e){var eddPurchaseform=document.getElementById("edd_purchase_form");if("function"!=typeof eddPurchaseform.checkValidity||!1!==eddPurchaseform.checkValidity()){e.preventDefault();var complete_purchase_val=$(this).val();$(this).val(edd_global_vars.purchase_loading),$(this).prop("disabled",!0),$(this).after('<span class="edd-loading-ajax edd-loading"></span>'),$.post(edd_global_vars.ajaxurl,$("#edd_purchase_form").serialize()+"&action=edd_process_checkout&edd_ajax=true",function(data){"success"==$.trim(data)?($(".edd_errors").remove(),$(".edd-error").hide(),$(eddPurchaseform).submit()):($("#edd-purchase-button").val(complete_purchase_val),$(".edd-loading-ajax").remove(),$(".edd_errors").remove(),$(".edd-error").hide(),$(edd_global_vars.checkout_error_anchor).before(data),$("#edd-purchase-button").prop("disabled",!1),$(document.body).trigger("edd_checkout_error",[data]))})}}),$(document.body).on("change","#edd_cc_address input.card_state, #edd_cc_address select, #edd_address_country",function(){var $form,$this=$(this),is_checkout="undefined"!=typeof edd_global_vars,field_name="card_state";"edd_address_country"==$(this).attr("id")&&(field_name="edd_address_state");if("card_state"!=$this.attr("id")){var postData={action:"edd_get_shop_states",country:$this.val(),field_name:field_name};$.ajax({type:"POST",data:postData,url:edd_scripts.ajaxurl,xhrFields:{withCredentials:!0},success:function(response){$form=is_checkout?$("#edd_purchase_form"):$this.closest("form");var state_inputs='input[name="card_state"], select[name="card_state"], input[name="edd_address_state"], select[name="edd_address_state"]';if("nostates"==$.trim(response)){$form.find(state_inputs).replaceWith('<input type="text" name="card_state" class="card-state edd-input required" value=""/>')}else $form.find(state_inputs).replaceWith(response);is_checkout&&$(document.body).trigger("edd_cart_billing_address_updated",[response])}}).fail(function(data){window.console&&window.console.log&&console.log(data)}).done(function(data){is_checkout&&recalculate_taxes()})}else is_checkout&&recalculate_taxes();return!1}),$(document.body).on("change","#edd_cc_address input[name=card_zip]",function(){"undefined"!=typeof edd_global_vars&&recalculate_taxes()})});
1
+ var edd_scripts;function edd_load_gateway(payment_mode){jQuery(".edd-cart-ajax").show(),jQuery("#edd_purchase_form_wrap").html('<span class="edd-loading-ajax edd-loading"></span>');var url=edd_scripts.ajaxurl;0<url.indexOf("?")?url+="&":url+="?",url=url+"payment-mode="+payment_mode,jQuery.post(url,{action:"edd_load_gateway",edd_payment_mode:payment_mode},function(response){jQuery("#edd_purchase_form_wrap").html(response),jQuery(".edd-no-js").hide(),jQuery("body").trigger("edd_gateway_loaded",[payment_mode])})}jQuery(document).ready(function($){if($(".edd-no-js").hide(),$("a.edd-add-to-cart").addClass("edd-has-js"),$(document.body).on("click.eddRemoveFromCart",".edd-remove-from-cart",function(event){var $this=$(this),item=$this.data("cart-item"),action=$this.data("action"),id=$this.data("download-id"),data={action:action,cart_item:item};return $.ajax({type:"POST",data:data,dataType:"json",url:edd_scripts.ajaxurl,xhrFields:{withCredentials:!0},success:function(response){if(response.removed){if(parseInt(edd_scripts.position_in_cart,10)===parseInt(item,10)||edd_scripts.has_purchase_links)return window.location=window.location,!1;$(".edd-cart").each(function(){$(this).find("[data-cart-item='"+item+"']").parent().remove()}),$(".edd-cart").each(function(){var cart_item_counter=0;$(this).find("[data-cart-item]").each(function(){$(this).attr("data-cart-item",cart_item_counter),cart_item_counter+=1})}),$("[id^=edd_purchase_"+id+"]").length&&($("[id^=edd_purchase_"+id+"] .edd_go_to_checkout").hide(),$("[id^=edd_purchase_"+id+"] a.edd-add-to-cart").show().removeAttr("data-edd-loading"),"1"==edd_scripts.quantities_enabled&&$("[id^=edd_purchase_"+id+"] .edd_download_quantity_wrapper").show()),$("span.edd-cart-quantity").text(response.cart_quantity),$(document.body).trigger("edd_quantity_updated",[response.cart_quantity]),edd_scripts.taxes_enabled&&($(".cart_item.edd_subtotal span").html(response.subtotal),$(".cart_item.edd_cart_tax span").html(response.tax)),$(".cart_item.edd_total span").html(response.total),0==response.cart_quantity&&($(".cart_item.edd_subtotal,.edd-cart-number-of-items,.cart_item.edd_checkout,.cart_item.edd_cart_tax,.cart_item.edd_total").hide(),$(".edd-cart").each(function(){var cart_wrapper=$(this).parent();cart_wrapper&&(cart_wrapper.addClass("cart-empty"),cart_wrapper.removeClass("cart-not-empty")),$(this).append('<li class="cart_item empty">'+edd_scripts.empty_cart_message+"</li>")})),$(document.body).trigger("edd_cart_item_removed",[response])}}}).fail(function(response){window.console&&window.console.log&&console.log(response)}).done(function(response){}),!1}),$(document.body).on("click.eddAddToCart",".edd-add-to-cart",function(e){e.preventDefault();var $this=$(this),form=$this.closest("form");$this.prop("disabled",!0);$this.find(".edd-loading");var container=$this.closest("div");$this.attr("data-edd-loading","");form=$this.parents("form").last();var download=$this.data("download-id"),variable_price=$this.data("variable-price"),price_mode=$this.data("price-mode"),item_price_ids=[],free_items=!0;if("yes"==variable_price)if(0<form.find(".edd_price_option_"+download+'[type="hidden"]').length)item_price_ids[0]=$(".edd_price_option_"+download,form).val(),form.find(".edd-submit").data("price")&&0<form.find(".edd-submit").data("price")&&(free_items=!1);else{if(!form.find(".edd_price_option_"+download+":checked",form).length)return $this.removeAttr("data-edd-loading"),alert(edd_scripts.select_option),e.stopPropagation(),$this.prop("disabled",!1),!1;form.find(".edd_price_option_"+download+":checked",form).each(function(index){if(item_price_ids[index]=$(this).val(),!0===free_items){var item_price=$(this).data("price");item_price&&0<item_price&&(free_items=!1)}})}else item_price_ids[0]=download,$this.data("price")&&0<$this.data("price")&&(free_items=!1);if(free_items&&form.find(".edd_action_input").val("add_to_cart"),"straight_to_gateway"==form.find(".edd_action_input").val())return form.submit(),!0;var data={action:$this.data("action"),download_id:download,price_ids:item_price_ids,post_data:$(form).serialize()};return $.ajax({type:"POST",data:data,dataType:"json",url:edd_scripts.ajaxurl,xhrFields:{withCredentials:!0},success:function(response){var store_redirect="1"==edd_scripts.redirect_to_checkout,item_redirect="1"==form.find("#edd_redirect_to_checkout").val();if(store_redirect&&item_redirect||!store_redirect&&item_redirect)window.location=edd_scripts.checkout_page;else{"1"===edd_scripts.taxes_enabled&&($(".cart_item.edd_subtotal").show(),$(".cart_item.edd_cart_tax").show()),$(".cart_item.edd_total").show(),$(".cart_item.edd_checkout").show(),$(".cart_item.empty").length&&$(".cart_item.empty").hide(),$(".widget_edd_cart_widget .edd-cart").each(function(cart){var target=$(this).find(".edd-cart-meta:first");$(response.cart_item).insertBefore(target);var cart_wrapper=$(this).parent();cart_wrapper&&(cart_wrapper.addClass("cart-not-empty"),cart_wrapper.removeClass("cart-empty"))}),"1"===edd_scripts.taxes_enabled&&($(".edd-cart-meta.edd_subtotal span").html(response.subtotal),$(".edd-cart-meta.edd_cart_tax span").html(response.tax)),$(".edd-cart-meta.edd_total span").html(response.total);$(".edd-cart-item-title",response.cart_item).length;if($("span.edd-cart-quantity").each(function(){$(this).text(response.cart_quantity),$(document.body).trigger("edd_quantity_updated",[response.cart_quantity])}),"none"==$(".edd-cart-number-of-items").css("display")&&$(".edd-cart-number-of-items").show("slow"),"no"!=variable_price&&"multi"==price_mode||($("a.edd-add-to-cart",container).toggle(),$(".edd_go_to_checkout",container).css("display","inline-block")),"multi"==price_mode&&$this.removeAttr("data-edd-loading"),$(".edd_download_purchase_form").length&&("no"==variable_price||!form.find(".edd_price_option_"+download).is("input:hidden"))){var parent_form=$('.edd_download_purchase_form *[data-download-id="'+download+'"]').parents("form");$("a.edd-add-to-cart",parent_form).hide(),"multi"!=price_mode&&parent_form.find(".edd_download_quantity_wrapper").slideUp(),$(".edd_go_to_checkout",parent_form).show().removeAttr("data-edd-loading")}"incart"!=response&&($(".edd-cart-added-alert",container).fadeIn(),setTimeout(function(){$(".edd-cart-added-alert",container).fadeOut()},3e3)),$this.prop("disabled",!1),$(document.body).trigger("edd_cart_item_added",[response])}}}).fail(function(response){window.console&&window.console.log&&console.log(response)}).done(function(response){}),!1}),$("#edd_checkout_form_wrap").on("click",".edd_checkout_register_login",function(){var data={action:$(this).data("action")};return $(".edd-cart-ajax").show(),$.post(edd_scripts.ajaxurl,data,function(checkout_response){$("#edd_checkout_login_register").html(edd_scripts.loading),$("#edd_checkout_login_register").html(checkout_response),$(".edd-cart-ajax").hide()}),!1}),$(document).on("click","#edd_purchase_form #edd_login_fields input[type=submit]",function(e){e.preventDefault();var complete_purchase_val=$(this).val();$(this).val(edd_global_vars.purchase_loading),$(this).after('<span class="edd-loading-ajax edd-loading"></span>');var data={action:"edd_process_checkout_login",edd_ajax:1,edd_user_login:$("#edd_login_fields #edd_user_login").val(),edd_user_pass:$("#edd_login_fields #edd_user_pass").val()};$.post(edd_global_vars.ajaxurl,data,function(data){"success"==$.trim(data)?($(".edd_errors").remove(),window.location=edd_scripts.checkout_page):($("#edd_login_fields input[type=submit]").val(complete_purchase_val),$(".edd-loading-ajax").remove(),$(".edd_errors").remove(),$("#edd-user-login-submit").before(data))})}),$("select#edd-gateway, input.edd-gateway").change(function(e){var payment_mode=$("#edd-gateway option:selected, input.edd-gateway:checked").val();return"0"==payment_mode||edd_load_gateway(payment_mode),!1}),"1"==edd_scripts.is_checkout){var chosen_gateway=!1,ajax_needed=!1;$("select#edd-gateway, input.edd-gateway").length&&(chosen_gateway=$("meta[name='edd-chosen-gateway']").attr("content"),ajax_needed=!0),chosen_gateway||(chosen_gateway=edd_scripts.default_gateway),ajax_needed?setTimeout(function(){edd_load_gateway(chosen_gateway)},200):$("body").trigger("edd_gateway_loaded",[chosen_gateway])}$(document).on("click","#edd_purchase_form #edd_purchase_submit [type=submit]",function(e){var eddPurchaseform=document.getElementById("edd_purchase_form");if("function"!=typeof eddPurchaseform.checkValidity||!1!==eddPurchaseform.checkValidity()){e.preventDefault();var complete_purchase_val=$(this).val();$(this).val(edd_global_vars.purchase_loading),$(this).prop("disabled",!0),$(this).after('<span class="edd-loading-ajax edd-loading"></span>'),$.post(edd_global_vars.ajaxurl,$("#edd_purchase_form").serialize()+"&action=edd_process_checkout&edd_ajax=true",function(data){"success"==$.trim(data)?($(".edd_errors").remove(),$(".edd-error").hide(),$(eddPurchaseform).submit()):($("#edd-purchase-button").val(complete_purchase_val),$(".edd-loading-ajax").remove(),$(".edd_errors").remove(),$(".edd-error").hide(),$(edd_global_vars.checkout_error_anchor).before(data),$("#edd-purchase-button").prop("disabled",!1),$(document.body).trigger("edd_checkout_error",[data]))})}}),$(document.body).on("change","#edd_cc_address input.card_state, #edd_cc_address select, #edd_address_country",function(){var $form,$this=$(this),is_checkout="undefined"!=typeof edd_global_vars,field_name="card_state";"edd_address_country"==$(this).attr("id")&&(field_name="edd_address_state");if("card_state"!=$this.attr("id")){var postData={action:"edd_get_shop_states",country:$this.val(),field_name:field_name};$.ajax({type:"POST",data:postData,url:edd_scripts.ajaxurl,xhrFields:{withCredentials:!0},success:function(response){$form=is_checkout?$("#edd_purchase_form"):$this.closest("form");var state_inputs='input[name="card_state"], select[name="card_state"], input[name="edd_address_state"], select[name="edd_address_state"]';if("nostates"==$.trim(response)){$form.find(state_inputs).replaceWith('<input type="text" name="card_state" class="card-state edd-input required" value=""/>')}else $form.find(state_inputs).replaceWith(response);is_checkout&&$(document.body).trigger("edd_cart_billing_address_updated",[response])}}).fail(function(data){window.console&&window.console.log&&console.log(data)}).done(function(data){is_checkout&&recalculate_taxes()})}else is_checkout&&recalculate_taxes();return!1}),$(document.body).on("change","#edd_cc_address input[name=card_zip]",function(){"undefined"!=typeof edd_global_vars&&recalculate_taxes()})});
easy-digital-downloads.php CHANGED
@@ -5,7 +5,7 @@
5
  * Description: The easiest way to sell digital products with WordPress.
6
  * Author: Easy Digital Downloads
7
  * Author URI: https://easydigitaldownloads.com
8
- * Version: 2.9.1
9
  * Text Domain: easy-digital-downloads
10
  * Domain Path: languages
11
  *
@@ -25,7 +25,7 @@
25
  * @package EDD
26
  * @category Core
27
  * @author Pippin Williamson
28
- * @version 2.9.1
29
  */
30
 
31
  // Exit if accessed directly.
@@ -206,7 +206,7 @@ final class Easy_Digital_Downloads {
206
 
207
  // Plugin version.
208
  if ( ! defined( 'EDD_VERSION' ) ) {
209
- define( 'EDD_VERSION', '2.9.1' );
210
  }
211
 
212
  // Plugin Folder Path.
@@ -311,6 +311,7 @@ final class Easy_Digital_Downloads {
311
  require_once EDD_PLUGIN_DIR . 'includes/login-register.php';
312
  require_once EDD_PLUGIN_DIR . 'includes/shortcodes.php';
313
  require_once EDD_PLUGIN_DIR . 'includes/admin/tracking.php'; // Must be loaded on frontend to ensure cron runs
 
314
 
315
  if ( is_admin() || ( defined( 'WP_CLI' ) && WP_CLI ) ) {
316
  require_once EDD_PLUGIN_DIR . 'includes/admin/add-ons.php';
5
  * Description: The easiest way to sell digital products with WordPress.
6
  * Author: Easy Digital Downloads
7
  * Author URI: https://easydigitaldownloads.com
8
+ * Version: 2.9.2
9
  * Text Domain: easy-digital-downloads
10
  * Domain Path: languages
11
  *
25
  * @package EDD
26
  * @category Core
27
  * @author Pippin Williamson
28
+ * @version 2.9.2
29
  */
30
 
31
  // Exit if accessed directly.
206
 
207
  // Plugin version.
208
  if ( ! defined( 'EDD_VERSION' ) ) {
209
+ define( 'EDD_VERSION', '2.9.2' );
210
  }
211
 
212
  // Plugin Folder Path.
311
  require_once EDD_PLUGIN_DIR . 'includes/login-register.php';
312
  require_once EDD_PLUGIN_DIR . 'includes/shortcodes.php';
313
  require_once EDD_PLUGIN_DIR . 'includes/admin/tracking.php'; // Must be loaded on frontend to ensure cron runs
314
+ require_once EDD_PLUGIN_DIR . 'includes/privacy-functions.php';
315
 
316
  if ( is_admin() || ( defined( 'WP_CLI' ) && WP_CLI ) ) {
317
  require_once EDD_PLUGIN_DIR . 'includes/admin/add-ons.php';
includes/admin/admin-actions.php CHANGED
@@ -78,7 +78,7 @@ function edd_display_product_tabs() {
78
  ?>
79
 
80
  <a href="<?php echo admin_url( 'post-new.php?post_type=download' ); ?>" class="page-title-action">
81
- <?php _e( 'Add New' ); // No text domain so it just follows what WP Core does ?>
82
  </a>
83
  </h2>
84
  <br />
78
  ?>
79
 
80
  <a href="<?php echo admin_url( 'post-new.php?post_type=download' ); ?>" class="page-title-action">
81
+ <?php _e( 'Add New', 'easy-digital-downloads' ); // No text domain so it just follows what WP Core does ?>
82
  </a>
83
  </h2>
84
  <br />
includes/admin/customers/customers.php CHANGED
@@ -525,6 +525,86 @@ function edd_customer_notes_view( $customer ) {
525
  <div class="edd-item-notes-header">
526
  <?php echo get_avatar( $customer->email, 30 ); ?> <span><?php echo $customer->name; ?></span>
527
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
528
  <h3><?php _e( 'Notes', 'easy-digital-downloads' ); ?></h3>
529
 
530
  <?php if ( 1 == $paged ) : ?>
525
  <div class="edd-item-notes-header">
526
  <?php echo get_avatar( $customer->email, 30 ); ?> <span><?php echo $customer->name; ?></span>
527
  </div>
528
+ <?php
529
+ $show_agree_to_terms = edd_get_option( 'show_agree_to_terms', false );
530
+ $show_agree_to_privacy = edd_get_option( 'show_agree_to_privacy_policy', false );
531
+
532
+ $agreement_timestamps = $customer->get_meta( 'agree_to_terms_time', false );
533
+ $privacy_timestamps = $customer->get_meta( 'agree_to_privacy_time', false );
534
+
535
+ $payments = edd_get_payments( array(
536
+ 'output' => 'payments',
537
+ 'post__in' => explode( ',', $customer->payment_ids ),
538
+ 'orderby' => 'date',
539
+ 'posts_per_page' => 1
540
+ ));
541
+
542
+ $last_payment_date = '';
543
+
544
+ foreach ( $payments as $payment ) {
545
+ if ( empty( $payment->gateway ) ) {
546
+ continue;
547
+ }
548
+
549
+ // We should be using `date` here, as that is the date the button was clicked.
550
+ $last_payment_date = strtotime( $payment->date );
551
+ break;
552
+ }
553
+
554
+ if ( is_array( $agreement_timestamps ) ) {
555
+ $agreement_timestamp = array_pop( $agreement_timestamps );
556
+ }
557
+
558
+ if ( is_array( $privacy_timestamps ) ) {
559
+ $privacy_timestamp = array_pop( $privacy_timestamps );
560
+ }
561
+
562
+ ?>
563
+
564
+ <h3><?php _e( 'Agreements', 'easy-digital-downloads' ); ?></h3>
565
+
566
+ <span class="customer-terms-agreement-date info-item">
567
+ <?php _e( 'Last Agreed to Terms', 'easy-digital-downloads' ); ?>:
568
+ <?php if ( ! empty( $agreement_timestamp ) ) : ?>
569
+ <?php echo date_i18n( get_option( 'date_format' ) . ' H:i:s', $agreement_timestamp ); ?>
570
+ <?php if ( ! empty( $agreement_timestamps ) ) : ?>
571
+ <span alt="f223" class="edd-help-tip dashicons dashicons-editor-help" title="<strong><?php _e( 'Previous Agreement Dates', 'easy-digital-downloads' ); ?></strong><br /><?php foreach ( $agreement_timestamps as $timestamp ) { echo date_i18n( get_option( 'date_format' ) . ' H:i:s', $timestamp ); } ?>"></span>
572
+ <?php endif; ?>
573
+ <?php else: ?>
574
+ <?php
575
+ if ( empty( $last_payment_date ) ) {
576
+ _e( 'No date found.', 'easy-digital-downloads' );
577
+ } else {
578
+ echo date_i18n( get_option( 'date_format' ) . ' H:i:s', $last_payment_date );
579
+ ?>
580
+ <span alt="f223" class="edd-help-tip dashicons dashicons-editor-help" title="<strong><?php _e( 'Estimated Privacy Policy Date', 'easy-digital-downloads' ); ?></strong><br /><?php _e( 'This customer made a purchase prior to agreement dates being logged, this is the date of their last purchase. If your site was displaying the agreement checkbox at that time, this is our best estimate as to when they last agreed to your terms.', 'easy-digital-downloads' ); ?>"></span>
581
+ <?php
582
+ }
583
+ ?>
584
+ <?php endif; ?>
585
+ </span>
586
+
587
+ <span class="customer-privacy-policy-date info-item">
588
+ <?php _e( 'Last Agreed to Privacy Policy', 'easy-digital-downloads' ); ?>:
589
+ <?php if ( ! empty( $privacy_timestamp ) ) : ?>
590
+ <?php echo date_i18n( get_option( 'date_format' ) . ' H:i:s', $privacy_timestamp ); ?>
591
+ <?php if ( ! empty( $privacy_timestamps ) ) : ?>
592
+ <span alt="f223" class="edd-help-tip dashicons dashicons-editor-help" title="<strong><?php _e( 'Previous Agreement Dates', 'easy-digital-downloads' ); ?></strong><br /><?php foreach ( $privacy_timestamps as $timestamp ) { echo date_i18n( get_option( 'date_format' ) . ' H:i:s', $timestamp ); } ?>"></span>
593
+ <?php endif; ?>
594
+ <?php else: ?>
595
+ <?php
596
+ if ( empty( $last_payment_date ) ) {
597
+ _e( 'No date found.', 'easy-digital-downloads' );
598
+ } else {
599
+ echo date_i18n( get_option( 'date_format' ) . ' H:i:s', $last_payment_date );
600
+ ?>
601
+ <span alt="f223" class="edd-help-tip dashicons dashicons-editor-help" title="<strong><?php _e( 'Estimated Privacy Policy Date', 'easy-digital-downloads' ); ?></strong><br /><?php _e( 'This customer made a purchase prior to privacy policy dates being logged, this is the date of their last purchase. If your site was displaying the privacy policy checkbox at that time, this is our best estimate as to when they last agreed to your privacy policy.', 'easy-digital-downloads' ); ?>"></span>
602
+ <?php
603
+ }
604
+ ?>
605
+ <?php endif; ?>
606
+ </span>
607
+
608
  <h3><?php _e( 'Notes', 'easy-digital-downloads' ); ?></h3>
609
 
610
  <?php if ( 1 == $paged ) : ?>
includes/admin/reporting/class-file-downloads-logs-list-table.php CHANGED
@@ -118,6 +118,7 @@ class EDD_File_Downloads_Log_Table extends WP_List_Table {
118
  * @return string Column Name
119
  */
120
  public function column_default( $item, $column_name ) {
 
121
  switch ( $column_name ) {
122
  case 'download' :
123
  $download = new EDD_Download( $item[ $column_name ] );
@@ -127,9 +128,9 @@ class EDD_File_Downloads_Log_Table extends WP_List_Table {
127
  $column_value .= ' &mdash; ' . edd_get_price_option_name( $download->ID, $item['price_id'] );
128
  }
129
 
130
- return '<a href="' . add_query_arg( 'download', $download->ID ) . '" >' . $column_value . '</a>';
131
  case 'customer' :
132
- return '<a href="' . add_query_arg( 'user', $item[ 'customer' ]->email ) . '">' . $item['customer']->name . '</a>';
133
  case 'payment_id' :
134
  return $item['payment_id'] !== false ? '<a href="' . admin_url( 'edit.php?post_type=download&page=edd-payment-history&view=view-order-details&id=' . $item['payment_id'] ) . '">' . edd_get_payment_number( $item['payment_id'] ) . '</a>' : '';
135
  case 'ip' :
@@ -159,19 +160,18 @@ class EDD_File_Downloads_Log_Table extends WP_List_Table {
159
  }
160
 
161
  /**
162
- * Retrieves the user we are filtering logs by, if any
163
  *
164
  * @since 1.4
165
- * @return mixed int If User ID, string If Email/Login, false if not present
166
  */
167
- public function get_filtered_user() {
168
  $ret = false;
169
 
170
- if( isset( $_GET['user'] ) ) {
171
- if( is_numeric( $_GET['user'] ) ) {
172
- $ret = absint( $_GET['user'] );
173
- } else {
174
- $ret = sanitize_text_field( $_GET['user'] );
175
  }
176
  }
177
 
@@ -217,25 +217,9 @@ class EDD_File_Downloads_Log_Table extends WP_List_Table {
217
  * @return array $meta_query
218
  */
219
  public function get_meta_query() {
220
- $user = $this->get_filtered_user();
221
- $payment = $this->get_filtered_payment();
222
- $meta_query = array();
223
-
224
- if ( $user ) {
225
- // Show only logs from a specific user
226
- if( is_numeric( $user ) ) {
227
- $meta_query[] = array(
228
- 'key' => '_edd_log_user_id',
229
- 'value' => $user,
230
- );
231
- } else {
232
- $meta_query[] = array(
233
- 'key' => '_edd_log_user_info',
234
- 'value' => $user,
235
- 'compare' => 'LIKE',
236
- );
237
- }
238
- }
239
 
240
  if ( $payment ) {
241
  // Show only logs from a specific payment
@@ -245,7 +229,11 @@ class EDD_File_Downloads_Log_Table extends WP_List_Table {
245
  );
246
  }
247
 
248
- $search = $this->get_search();
 
 
 
 
249
 
250
  if ( ! empty( $search ) ) {
251
  if ( filter_var( $search, FILTER_VALIDATE_IP ) ) {
@@ -253,40 +241,26 @@ class EDD_File_Downloads_Log_Table extends WP_List_Table {
253
  $key = '_edd_log_ip';
254
  $compare = '=';
255
  } else if ( is_email( $search ) ) {
256
- // This is an email search. We use this to ensure it works for guest users and logged-in users
257
- $key = '_edd_log_user_info';
258
- $compare = 'LIKE';
 
 
 
259
  } else {
260
- // Look for a user
261
- $key = '_edd_log_user_id';
262
- $compare = 'LIKE';
263
 
264
- if ( ! is_numeric( $search ) ) {
265
- // Searching for user by username
266
- $user = get_user_by( 'login', $search );
267
-
268
- if ( $user ) {
269
- // Found one, set meta value to user's ID
270
- $search = $user->ID;
271
  } else {
272
- // No user found so let's do a real search query
273
- $users = new WP_User_Query( array(
274
- 'search' => $search,
275
- 'search_columns' => array( 'user_url', 'user_nicename' ),
276
- 'number' => 1,
277
- 'fields' => 'ids',
278
- ) );
279
-
280
- $found_user = $users->get_results();
281
-
282
- if ( $found_user ) {
283
- $search = $found_user[0];
284
- } else {
285
- // No users were found so let's look for file names instead
286
- $this->file_search = true;
287
- }
288
  }
 
289
  }
 
290
  }
291
 
292
  if ( ! $this->file_search ) {
@@ -383,11 +357,10 @@ class EDD_File_Downloads_Log_Table extends WP_List_Table {
383
  foreach ( $logs as $log ) {
384
 
385
  $meta = get_post_custom( $log->ID );
386
- $user_info = isset( $meta['_edd_log_user_info'] ) ? maybe_unserialize( $meta['_edd_log_user_info'][0] ) : array();
387
  $payment_id = isset( $meta['_edd_log_payment_id'] ) ? $meta['_edd_log_payment_id'][0] : false;
388
  $ip = $meta['_edd_log_ip'][0];
389
- $user_id = isset( $user_info['id'] ) ? $user_info['id'] : false;
390
- $customer_id = edd_get_payment_customer_id( $payment_id );
391
  $price_id = edd_has_variable_prices( $log->post_parent ) ? get_post_meta( $log->ID, '_edd_log_price_id', true ) : false;
392
 
393
  if( ! array_key_exists( $log->post_parent, $this->queried_files ) ) {
118
  * @return string Column Name
119
  */
120
  public function column_default( $item, $column_name ) {
121
+ $base_url = remove_query_arg( 'paged' );
122
  switch ( $column_name ) {
123
  case 'download' :
124
  $download = new EDD_Download( $item[ $column_name ] );
128
  $column_value .= ' &mdash; ' . edd_get_price_option_name( $download->ID, $item['price_id'] );
129
  }
130
 
131
+ return '<a href="' . add_query_arg( 'download', $download->ID, $base_url ) . '" >' . $column_value . '</a>';
132
  case 'customer' :
133
+ return '<a href="' . add_query_arg( 'customer', $item[ 'customer' ]->id, $base_url ) . '">' . $item['customer']->name . '</a>';
134
  case 'payment_id' :
135
  return $item['payment_id'] !== false ? '<a href="' . admin_url( 'edit.php?post_type=download&page=edd-payment-history&view=view-order-details&id=' . $item['payment_id'] ) . '">' . edd_get_payment_number( $item['payment_id'] ) . '</a>' : '';
136
  case 'ip' :
160
  }
161
 
162
  /**
163
+ * Retrieves the customer we are filtering logs by, if any
164
  *
165
  * @since 1.4
166
+ * @return mixed int If customer ID, string If Email, false if not present
167
  */
168
+ public function get_filtered_customer() {
169
  $ret = false;
170
 
171
+ if( isset( $_GET['customer'] ) ) {
172
+ $customer = new EDD_Customer( sanitize_text_field( $_GET['customer'] ) );
173
+ if ( ! empty( $customer->id ) ) {
174
+ $ret = $customer->id;
 
175
  }
176
  }
177
 
217
  * @return array $meta_query
218
  */
219
  public function get_meta_query() {
220
+ $customer_id = $this->get_filtered_customer();
221
+ $payment = $this->get_filtered_payment();
222
+ $meta_query = array();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
223
 
224
  if ( $payment ) {
225
  // Show only logs from a specific payment
229
  );
230
  }
231
 
232
+ if ( ! empty( $customer_id ) ) {
233
+ $search = $customer_id;
234
+ } else {
235
+ $search = $this->get_search();
236
+ }
237
 
238
  if ( ! empty( $search ) ) {
239
  if ( filter_var( $search, FILTER_VALIDATE_IP ) ) {
241
  $key = '_edd_log_ip';
242
  $compare = '=';
243
  } else if ( is_email( $search ) ) {
244
+ $customer = new EDD_Customer( $search );
245
+ if ( ! empty( $customer->id ) ) {
246
+ $key = '_edd_log_customer_id';
247
+ $search = $customer->id;
248
+ $compare = '=';
249
+ }
250
  } else {
251
+ if ( is_numeric( $search ) ) {
252
+ $customer = new EDD_Customer( $search );
 
253
 
254
+ if ( ! empty( $customer->id ) ) {
255
+ $key = '_edd_log_customer_id';
256
+ $search = $customer->id;
257
+ $compare = '=';
 
 
 
258
  } else {
259
+ $this->file_search = true;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
260
  }
261
+
262
  }
263
+
264
  }
265
 
266
  if ( ! $this->file_search ) {
357
  foreach ( $logs as $log ) {
358
 
359
  $meta = get_post_custom( $log->ID );
 
360
  $payment_id = isset( $meta['_edd_log_payment_id'] ) ? $meta['_edd_log_payment_id'][0] : false;
361
  $ip = $meta['_edd_log_ip'][0];
362
+ $user_id = isset( $meta['_edd_log_user_id'] ) ? (int) $meta['_edd_log_user_id'][0] : null;
363
+ $customer_id = isset( $meta['_edd_log_customer_id'] ) ? (int) $meta['_edd_log_customer_id'][0] : null;
364
  $price_id = edd_has_variable_prices( $log->post_parent ) ? get_post_meta( $log->ID, '_edd_log_price_id', true ) : false;
365
 
366
  if( ! array_key_exists( $log->post_parent, $this->queried_files ) ) {
includes/admin/settings/register-settings.php CHANGED
@@ -853,14 +853,6 @@ function edd_get_registered_settings() {
853
  ),
854
  ),
855
  'site_terms' => array(
856
- array(
857
- 'id' => 'terms_settings',
858
- 'name' => '<h3>' . __( 'Terms and Privacy Policy', 'easy-digital-downloads' ) . '</h3>',
859
- 'desc' => '',
860
- 'type' => 'header',
861
- 'tooltip_title' => __( 'Terms and Privacy Policy Settings', 'easy-digital-downloads' ),
862
- 'tooltip_desc' => __( 'Depending on legal and regulatory requirements, it may be necessary for your site to show checkboxes for Terms of Agreement and/or Privacy Policy.','easy-digital-downloads' ),
863
- ),
864
  'show_agree_to_terms' => array(
865
  'id' => 'show_agree_to_terms',
866
  'name' => __( 'Agree to Terms', 'easy-digital-downloads' ),
@@ -880,39 +872,95 @@ function edd_get_registered_settings() {
880
  'desc' => __( 'If Agree to Terms is checked, enter the agreement terms here.', 'easy-digital-downloads' ),
881
  'type' => 'rich_editor',
882
  ),
 
 
 
 
 
 
883
  'show_agree_to_privacy_policy' => array(
884
  'id' => 'show_agree_to_privacy_policy',
885
  'name' => __( 'Agree to Privacy Policy', 'easy-digital-downloads' ),
886
- 'desc' => __( 'Check this to show an agree to privacy policy on checkout that users must agree to before purchasing.', 'easy-digital-downloads' ),
887
  'type' => 'checkbox',
888
  ),
889
  'agree_privacy_label' => array(
890
  'id' => 'privacy_agree_label',
891
  'name' => __( 'Agree to Privacy Policy Label', 'easy-digital-downloads' ),
892
- 'desc' => __( 'Label shown next to the agree to privacy policy check box.', 'easy-digital-downloads' ),
893
  'type' => 'text',
894
  'size' => 'regular',
895
  ),
896
  'show_privacy_policy_on_checkout' => array(
897
- 'id' => 'show_to_privacy_policy_on_checkout',
898
- 'name' => __( 'Show the privacy policy on checkout', 'easy-digital-downloads' ),
899
- 'desc' => __( 'Display your privacy policy on checkout.', 'easy-digital-downloads' ),
900
  'type' => 'checkbox',
901
  ),
902
- 'agree_privacy_page' => array(
903
- 'id' => 'privacy_agree_page',
904
- 'name' => __( 'Privacy Agreement Page', 'easy-digital-downloads' ),
905
- 'desc' => __( 'If Agree to Privacy Policy is checked, select a page for the Privacy Agreement here.', 'easy-digital-downloads' ),
906
- 'type' => 'select',
907
- 'options' => edd_get_pages(),
908
- 'chosen' => true,
909
- 'placeholder' => __( 'Select a page', 'easy-digital-downloads' ),
910
- ),
911
  ),
 
912
  )
913
  )
914
  );
915
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
916
  if ( ! edd_shop_supports_buy_now() ) {
917
  $edd_settings['misc']['button_text']['buy_now_text']['disabled'] = true;
918
  $edd_settings['misc']['button_text']['buy_now_text']['tooltip_title'] = __( 'Buy Now Disabled', 'easy-digital-downloads' );
@@ -1204,10 +1252,11 @@ function edd_sanitize_text_field( $input ) {
1204
  'id' => array(),
1205
  ),
1206
  'a' => array(
1207
- 'href' => array(),
1208
- 'title' => array(),
1209
- 'class' => array(),
1210
- 'id' => array(),
 
1211
  ),
1212
  'strong' => array(),
1213
  'em' => array(),
@@ -1274,6 +1323,7 @@ function edd_get_settings_tabs() {
1274
  $tabs['emails'] = __( 'Emails', 'easy-digital-downloads' );
1275
  $tabs['styles'] = __( 'Styles', 'easy-digital-downloads' );
1276
  $tabs['taxes'] = __( 'Taxes', 'easy-digital-downloads' );
 
1277
 
1278
  if( ! empty( $settings['extensions'] ) ) {
1279
  $tabs['extensions'] = __( 'Extensions', 'easy-digital-downloads' );
@@ -1355,6 +1405,10 @@ function edd_get_registered_settings_sections() {
1355
  'accounting' => __( 'Accounting', 'easy-digital-downloads' ),
1356
  'site_terms' => __( 'Terms of Agreement', 'easy-digital-downloads' ),
1357
  ) ),
 
 
 
 
1358
  );
1359
 
1360
  $sections = apply_filters( 'edd_settings_sections', $sections );
@@ -2402,7 +2456,7 @@ add_filter( 'option_page_capability_edd_settings', 'edd_set_settings_cap' );
2402
  function edd_add_setting_tooltip( $html, $args ) {
2403
 
2404
  if ( ! empty( $args['tooltip_title'] ) && ! empty( $args['tooltip_desc'] ) ) {
2405
- $tooltip = '<span alt="f223" class="edd-help-tip dashicons dashicons-editor-help" title="<strong>' . $args['tooltip_title'] . '</strong>: ' . $args['tooltip_desc'] . '"></span>';
2406
  $html .= $tooltip;
2407
  }
2408
 
853
  ),
854
  ),
855
  'site_terms' => array(
 
 
 
 
 
 
 
 
856
  'show_agree_to_terms' => array(
857
  'id' => 'show_agree_to_terms',
858
  'name' => __( 'Agree to Terms', 'easy-digital-downloads' ),
872
  'desc' => __( 'If Agree to Terms is checked, enter the agreement terms here.', 'easy-digital-downloads' ),
873
  'type' => 'rich_editor',
874
  ),
875
+ ),
876
+ )
877
+ ),
878
+ 'privacy' => apply_filters( 'edd_settings_privacy',
879
+ array(
880
+ 'general' => array(
881
  'show_agree_to_privacy_policy' => array(
882
  'id' => 'show_agree_to_privacy_policy',
883
  'name' => __( 'Agree to Privacy Policy', 'easy-digital-downloads' ),
884
+ 'desc' => __( 'Check this to show an agree to Privacy Policy on checkout that users must agree to before purchasing.', 'easy-digital-downloads' ),
885
  'type' => 'checkbox',
886
  ),
887
  'agree_privacy_label' => array(
888
  'id' => 'privacy_agree_label',
889
  'name' => __( 'Agree to Privacy Policy Label', 'easy-digital-downloads' ),
890
+ 'desc' => __( 'Label shown next to the agree to Privacy Policy checkbox.', 'easy-digital-downloads' ),
891
  'type' => 'text',
892
  'size' => 'regular',
893
  ),
894
  'show_privacy_policy_on_checkout' => array(
895
+ 'id' => 'show_agree_to_privacy_policy_on_checkout',
896
+ 'name' => __( 'Show the Privacy Policy on checkout', 'easy-digital-downloads' ),
897
+ 'desc' => __( 'Display your Privacy Policy on checkout.', 'easy-digital-downloads' ) . ' <a href="' . esc_attr( admin_url( 'privacy.php' ) ) . '">' . __( 'Set your Privacy Policy here', 'easy-digital-downloads' ) .'</a>.',
898
  'type' => 'checkbox',
899
  ),
 
 
 
 
 
 
 
 
 
900
  ),
901
+ 'export_erase' => array()
902
  )
903
  )
904
  );
905
 
906
+ $payment_statuses = edd_get_payment_statuses();
907
+
908
+ $edd_settings['privacy']['export_erase'][] = array(
909
+ 'id' => 'payment_privacy_status_action_header',
910
+ 'name' => '<h3>' . __( 'Payment Status Actions', 'easy-digital-downloads' ) . '</h3>',
911
+ 'type' => 'descriptive_text',
912
+ 'desc' => __( 'When a user requests to be anonymized or removed from a site, these are the actions that will be taken on payments associated with their customer, by status.','easy-digital-downloads' ),
913
+ 'tooltip_title' => __( 'What settings should I use?', 'easy-digital-downloads' ),
914
+ 'tooltip_desc' => __( 'By default, Easy Digital Downloads sets suggested actions based on the Payment Status. These are purely recommendations, and you may need to change them to suit your store\'s needs. If you are unsure, you can safely leave these settings as is.','easy-digital-downloads' ),
915
+ );
916
+
917
+ $edd_settings['privacy']['export_erase'][] = array(
918
+ 'id' => 'payment_privacy_status_descriptive_text',
919
+ 'name' => '',
920
+ 'type' => 'descriptive_text',
921
+
922
+ );
923
+
924
+ $select_options = array(
925
+ 'none' => __( 'No Action', 'easy-digital-downloads' ),
926
+ 'anonymize' => __( 'Anonymize', 'easy-digital-downloads' ),
927
+ 'delete' => __( 'Delete', 'easy-digital-downloads' ),
928
+ );
929
+
930
+ foreach ( $payment_statuses as $status => $label ) {
931
+
932
+ switch ( $status ) {
933
+
934
+ case 'publish':
935
+ case 'refunded':
936
+ case 'revoked':
937
+ $action = 'anonymize';
938
+ break;
939
+
940
+ case 'failed':
941
+ case 'abandoned':
942
+ $action = 'delete';
943
+ break;
944
+
945
+ case 'pending':
946
+ case 'processing':
947
+ default:
948
+ $action = 'none';
949
+ break;
950
+
951
+ }
952
+
953
+ $edd_settings['privacy']['export_erase'][] = array(
954
+ 'id' => 'payment_privacy_status_action_' . $status,
955
+ 'name' => sprintf( _x( '%s Payments', 'payment status labels for the privacy export & erase settings: Pending Payments', 'easy-digital-downloads' ), $label ),
956
+ 'desc' => '',
957
+ 'type' => 'select',
958
+ 'options' => $select_options,
959
+ 'std' => $action,
960
+ );
961
+
962
+ }
963
+
964
  if ( ! edd_shop_supports_buy_now() ) {
965
  $edd_settings['misc']['button_text']['buy_now_text']['disabled'] = true;
966
  $edd_settings['misc']['button_text']['buy_now_text']['tooltip_title'] = __( 'Buy Now Disabled', 'easy-digital-downloads' );
1252
  'id' => array(),
1253
  ),
1254
  'a' => array(
1255
+ 'href' => array(),
1256
+ 'target' => array(),
1257
+ 'title' => array(),
1258
+ 'class' => array(),
1259
+ 'id' => array(),
1260
  ),
1261
  'strong' => array(),
1262
  'em' => array(),
1323
  $tabs['emails'] = __( 'Emails', 'easy-digital-downloads' );
1324
  $tabs['styles'] = __( 'Styles', 'easy-digital-downloads' );
1325
  $tabs['taxes'] = __( 'Taxes', 'easy-digital-downloads' );
1326
+ $tabs['privacy'] = __( 'Privacy', 'easy-digital-downloads' );
1327
 
1328
  if( ! empty( $settings['extensions'] ) ) {
1329
  $tabs['extensions'] = __( 'Extensions', 'easy-digital-downloads' );
1405
  'accounting' => __( 'Accounting', 'easy-digital-downloads' ),
1406
  'site_terms' => __( 'Terms of Agreement', 'easy-digital-downloads' ),
1407
  ) ),
1408
+ 'privacy' => apply_filters( 'edd_settings_section_privacy', array(
1409
+ 'general' => __( 'General', 'easy-digital-downloads' ),
1410
+ 'export_erase' => __( 'Export & Erase', 'easy-digital-downloads' ),
1411
+ ) ),
1412
  );
1413
 
1414
  $sections = apply_filters( 'edd_settings_sections', $sections );
2456
  function edd_add_setting_tooltip( $html, $args ) {
2457
 
2458
  if ( ! empty( $args['tooltip_title'] ) && ! empty( $args['tooltip_desc'] ) ) {
2459
+ $tooltip = '<span alt="f223" class="edd-help-tip dashicons dashicons-editor-help" title="<strong>' . $args['tooltip_title'] . '</strong><br />' . $args['tooltip_desc'] . '"></span>';
2460
  $html .= $tooltip;
2461
  }
2462
 
includes/admin/upgrades/classes/class-file-download-log-migration.php ADDED
@@ -0,0 +1,273 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Migrate File Download Logs
4
+ *
5
+ * Removes some PII from the log meta, and adds the customer ID of the payment to allow more accurate
6
+ * file download counts for a customer.
7
+ *
8
+ * @subpackage Admin/Classes/EDD_SL_License_Log_Migration
9
+ * @copyright Copyright (c) 2018, Easy Digital Downloads, LLC
10
+ * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
11
+ * @since 2.6.2
12
+ */
13
+
14
+ // Exit if accessed directly
15
+ if ( ! defined( 'ABSPATH' ) ) exit;
16
+
17
+ /**
18
+ * EDD_File_Download_Log_Migration Class
19
+ *
20
+ * @since 2.9.2
21
+ */
22
+ class EDD_File_Download_Log_Migration extends EDD_Batch_Export {
23
+
24
+ /**
25
+ * Our export type. Used for export-type specific filters/actions
26
+ * @var string
27
+ * @since 2.9.2
28
+ */
29
+ public $export_type = '';
30
+
31
+ /**
32
+ * Allows for a non-download batch processing to be run.
33
+ * @since 2.9.2
34
+ * @var boolean
35
+ */
36
+ public $is_void = true;
37
+
38
+ /**
39
+ * Sets the number of items to pull on each step
40
+ * @since 2.9.2
41
+ * @var integer
42
+ */
43
+ public $per_step = 50;
44
+
45
+ /**
46
+ * Get the Export Data
47
+ *
48
+ * @access public
49
+ * @since 2.9.2
50
+ * @global object $wpdb Used to query the database using the WordPress
51
+ * Database API
52
+ * @return array $data The data for the CSV file
53
+ */
54
+ public function get_data() {
55
+
56
+ global $wpdb;
57
+
58
+ $items = $this->get_stored_data( 'edd_file_download_log_ids' );
59
+
60
+ if ( ! is_array( $items ) ) {
61
+ return false;
62
+ }
63
+
64
+ $offset = ( $this->step - 1 ) * $this->per_step;
65
+ $step_items = array_slice( $items, $offset, $this->per_step, true );
66
+
67
+ if ( $step_items ) {
68
+
69
+ foreach ( $step_items as $log_id ) {
70
+
71
+ $log_id = (int) $log_id['object_id'];
72
+ $sanitized_log_id = absint( $log_id );
73
+
74
+ if ( $sanitized_log_id !== $log_id ) {
75
+ edd_debug_log( "Log ID mismatch, skipping log ID {$log_id}" );
76
+ continue;
77
+ }
78
+
79
+ $has_customer_id = get_post_meta( $log_id, '_edd_log_customer_id', true );
80
+ if ( ! empty( $has_customer_id ) ) {
81
+ continue;
82
+ }
83
+
84
+ $payment_id = $wpdb->get_var( "SELECT meta_value FROM {$wpdb->postmeta} WHERE post_id = {$sanitized_log_id} AND meta_key = '_edd_log_payment_id'" );
85
+ if ( ! empty( $payment_id ) ) {
86
+ $payment = edd_get_payment( $payment_id );
87
+ $customer_id = $payment->customer_id;
88
+
89
+ if ( $customer_id < 0 ) {
90
+ $customer_id = 0;
91
+ }
92
+
93
+ update_post_meta( $log_id, '_edd_log_customer_id', $customer_id );
94
+ delete_post_meta( $log_id, '_edd_log_user_info' );
95
+
96
+ }
97
+
98
+ }
99
+
100
+ return true;
101
+
102
+ }
103
+
104
+ return false;
105
+
106
+ }
107
+
108
+ /**
109
+ * Return the calculated completion percentage
110
+ *
111
+ * @since 2.9.2
112
+ * @return int
113
+ */
114
+ public function get_percentage_complete() {
115
+
116
+ $items = $this->get_stored_data( 'edd_file_download_log_ids', false );
117
+ $total = count( $items );
118
+
119
+ $percentage = 100;
120
+
121
+ if( $total > 0 ) {
122
+ $percentage = ( ( $this->per_step * $this->step ) / $total ) * 100;
123
+ }
124
+
125
+ if( $percentage > 100 ) {
126
+ $percentage = 100;
127
+ }
128
+
129
+ return $percentage;
130
+ }
131
+
132
+ /**
133
+ * Set the properties specific to the payments export
134
+ *
135
+ * @since 2.9.2
136
+ * @param array $request The Form Data passed into the batch processing
137
+ */
138
+ public function set_properties( $request ) {}
139
+
140
+ /**
141
+ * Process a step
142
+ *
143
+ * @since 2.9.2
144
+ * @return bool
145
+ */
146
+ public function process_step() {
147
+
148
+ if ( ! $this->can_export() ) {
149
+ wp_die(
150
+ __( 'You do not have permission to run this upgrade.', 'easy-digital-downloads' ),
151
+ __( 'Error', 'easy-digital-downloads' ),
152
+ array( 'response' => 403 ) );
153
+ }
154
+
155
+ $had_data = $this->get_data();
156
+
157
+ if( $had_data ) {
158
+ $this->done = false;
159
+ return true;
160
+ } else {
161
+ $this->delete_data( 'edd_file_download_log_ids' );
162
+
163
+ $this->done = true;
164
+ $this->message = __( 'File download logs updated successfully.', 'easy-digital-downloads' );
165
+ edd_set_upgrade_complete( 'update_file_download_log_data' );
166
+ return false;
167
+ }
168
+ }
169
+
170
+ public function headers() {
171
+ ignore_user_abort( true );
172
+
173
+ if ( ! edd_is_func_disabled( 'set_time_limit' ) ) {
174
+ set_time_limit( 0 );
175
+ }
176
+ }
177
+
178
+ /**
179
+ * Perform the export
180
+ *
181
+ * @access public
182
+ * @since 2.9.2
183
+ * @return void
184
+ */
185
+ public function export() {
186
+
187
+ // Set headers
188
+ $this->headers();
189
+
190
+ edd_die();
191
+ }
192
+
193
+ public function pre_fetch() {
194
+ global $wpdb;
195
+
196
+ // Get all the file download logs
197
+ if ( $this->step == 1 ) {
198
+ $this->delete_data( 'edd_file_download_log_ids' );
199
+
200
+ $term_id = $wpdb->get_var( "SELECT term_id FROM {$wpdb->terms} WHERE name = 'file_download'" );
201
+ $term_tax_id = $wpdb->get_var( "SELECT term_taxonomy_id FROM {$wpdb->term_taxonomy} WHERE term_id = {$term_id} AND taxonomy = 'edd_log_type'" );
202
+ $log_ids = $wpdb->get_results( "SELECT object_id FROM {$wpdb->term_relationships} WHERE term_taxonomy_id = {$term_tax_id}" );
203
+
204
+ $this->store_data( 'edd_file_download_log_ids', $log_ids );
205
+
206
+ }
207
+
208
+ }
209
+
210
+ /**
211
+ * Given a key, get the information from the Database Directly
212
+ *
213
+ * @since 2.9.2
214
+ * @param string $key The option_name
215
+ * @return mixed Returns the data from the database
216
+ */
217
+ private function get_stored_data( $key ) {
218
+ global $wpdb;
219
+ $value = $wpdb->get_var(
220
+ $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = '%s'", $key )
221
+ );
222
+
223
+ if ( empty( $value ) ) {
224
+ return false;
225
+ }
226
+
227
+ $maybe_json = json_decode( $value );
228
+ if ( ! is_null( $maybe_json ) ) {
229
+ $value = json_decode( $value, true );
230
+ }
231
+
232
+ return $value;
233
+ }
234
+
235
+ /**
236
+ * Give a key, store the value
237
+ *
238
+ * @since 2.9.2
239
+ * @param string $key The option_name
240
+ * @param mixed $value The value to store
241
+ * @return void
242
+ */
243
+ private function store_data( $key, $value ) {
244
+ global $wpdb;
245
+
246
+ $value = is_array( $value ) ? wp_json_encode( $value ) : esc_attr( $value );
247
+
248
+ $data = array(
249
+ 'option_name' => $key,
250
+ 'option_value' => $value,
251
+ 'autoload' => 'no',
252
+ );
253
+
254
+ $formats = array(
255
+ '%s', '%s', '%s',
256
+ );
257
+
258
+ $wpdb->replace( $wpdb->options, $data, $formats );
259
+ }
260
+
261
+ /**
262
+ * Delete an option
263
+ *
264
+ * @since 2.9.2
265
+ * @param string $key The option_name to delete
266
+ * @return void
267
+ */
268
+ private function delete_data( $key ) {
269
+ global $wpdb;
270
+ $wpdb->delete( $wpdb->options, array( 'option_name' => $key ) );
271
+ }
272
+
273
+ }
includes/admin/upgrades/upgrade-functions.php CHANGED
@@ -176,6 +176,13 @@ function edd_show_upgrade_notices() {
176
  );
177
  }
178
 
 
 
 
 
 
 
 
179
  /*
180
  * NOTICE:
181
  *
@@ -1163,3 +1170,116 @@ function edd_v26_upgrades() {
1163
  @EDD()->customers->create_table();
1164
  @EDD()->customer_meta->create_table();
1165
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
176
  );
177
  }
178
 
179
+ if ( version_compare( $edd_version, '2.9.2', '<' ) || ! edd_has_upgrade_completed( 'update_file_download_log_data' ) ) {
180
+ printf(
181
+ '<div class="updated"><p>' . __( 'Easy Digital Downloads needs to upgrade the file download logs database, click <a href="%s">here</a> to start the upgrade.', 'easy-digital-downloads' ) . '</p></div>',
182
+ esc_url( admin_url( 'index.php?page=edd-upgrades&edd-upgrade=update_file_download_log_data' ) )
183
+ );
184
+ }
185
+
186
  /*
187
  * NOTICE:
188
  *
1170
  @EDD()->customers->create_table();
1171
  @EDD()->customer_meta->create_table();
1172
  }
1173
+
1174
+
1175
+ function edd_upgrade_render_update_file_download_log_data() {
1176
+ $migration_complete = edd_has_upgrade_completed( 'update_file_download_log_data' );
1177
+
1178
+ if ( $migration_complete ) : ?>
1179
+ <div id="edd-sl-migration-complete" class="notice notice-success">
1180
+ <p>
1181
+ <?php _e( '<strong>Migration complete:</strong> You have already completed the update to the file download logs.', 'easy-digital-downloads' ); ?>
1182
+ </p>
1183
+ </div>
1184
+ <?php return; ?>
1185
+ <?php endif; ?>
1186
+
1187
+ <div id="edd-migration-ready" class="notice notice-success" style="display: none;">
1188
+ <p>
1189
+ <?php _e( '<strong>Database Upgrade Complete:</strong> All database upgrades have been completed.', 'easy-digital-downloads' ); ?>
1190
+ <br /><br />
1191
+ <?php _e( 'You may now leave this page.', 'easy-digital-downloads' ); ?>
1192
+ </p>
1193
+ </div>
1194
+
1195
+ <div id="edd-migration-nav-warn" class="notice notice-info">
1196
+ <p>
1197
+ <?php _e( '<strong>Important:</strong> Please leave this screen open and do not navigate away until the process completes.', 'easy-digital-downloads' ); ?>
1198
+ </p>
1199
+ </div>
1200
+
1201
+ <style>
1202
+ .dashicons.dashicons-yes { display: none; color: rgb(0, 128, 0); vertical-align: middle; }
1203
+ </style>
1204
+ <script>
1205
+ jQuery( function($) {
1206
+ $(document).ready(function () {
1207
+ $(document).on("DOMNodeInserted", function (e) {
1208
+ var element = e.target;
1209
+
1210
+ if (element.id === 'edd-batch-success') {
1211
+ element = $(element);
1212
+
1213
+ element.parent().prev().find('.edd-migration.allowed').hide();
1214
+ element.parent().prev().find('.edd-migration.unavailable').show();
1215
+ var element_wrapper = element.parents().eq(4);
1216
+ element_wrapper.find('.dashicons.dashicons-yes').show();
1217
+
1218
+ var next_step_wrapper = element_wrapper.next();
1219
+ if (next_step_wrapper.find('.postbox').length) {
1220
+ next_step_wrapper.find('.edd-migration.allowed').show();
1221
+ next_step_wrapper.find('.edd-migration.unavailable').hide();
1222
+
1223
+ if (auto_start_next_step) {
1224
+ next_step_wrapper.find('.edd-export-form').submit();
1225
+ }
1226
+ } else {
1227
+ $('#edd-migration-nav-warn').hide();
1228
+ $('#edd-migration-ready').slideDown();
1229
+ }
1230
+
1231
+ }
1232
+ });
1233
+ });
1234
+ });
1235
+ </script>
1236
+
1237
+ <div class="metabox-holder">
1238
+ <div class="postbox">
1239
+ <h2 class="hndle">
1240
+ <span><?php _e( 'Update file download logs', 'easy-digital-downloads' ); ?></span>
1241
+ <span class="dashicons dashicons-yes"></span>
1242
+ </h2>
1243
+ <div class="inside migrate-file-download-logs-control">
1244
+ <p>
1245
+ <?php _e( 'This will update the file download logs to remove some <abbr title="Personally Identifiable Information">PII</abbr> and make file download counts more accurate.', 'easy-digital-downloads' ); ?>
1246
+ </p>
1247
+ <form method="post" id="edd-fix-file-download-logs-form" class="edd-export-form edd-import-export-form">
1248
+ <span class="step-instructions-wrapper">
1249
+
1250
+ <?php wp_nonce_field( 'edd_ajax_export', 'edd_ajax_export' ); ?>
1251
+
1252
+ <?php if ( ! $migration_complete ) : ?>
1253
+ <span class="edd-migration allowed">
1254
+ <input type="submit" id="migrate-logs-submit" value="<?php _e( 'Update File Download Logs', 'easy-digital-downloads' ); ?>" class="button-primary"/>
1255
+ </span>
1256
+ <?php else: ?>
1257
+ <input type="submit" disabled="disabled" id="migrate-logs-submit" value="<?php _e( 'Update File Download Logs', 'easy-digital-downloads' ); ?>" class="button-secondary"/>
1258
+ &mdash; <?php _e( 'File download logs have already been updated.', 'easy-digital-downloads' ); ?>
1259
+ <?php endif; ?>
1260
+
1261
+ <input type="hidden" name="edd-export-class" value="EDD_File_Download_Log_Migration" />
1262
+ <span class="spinner"></span>
1263
+
1264
+ </span>
1265
+ </form>
1266
+ </div><!-- .inside -->
1267
+ </div><!-- .postbox -->
1268
+ </div>
1269
+
1270
+ <?php
1271
+ }
1272
+
1273
+ function edd_register_batch_file_download_log_migration() {
1274
+ add_action( 'edd_batch_export_class_include', 'edd_include_file_download_log_migration_batch_processor', 10, 1 );
1275
+ }
1276
+ add_action( 'edd_register_batch_exporter', 'edd_register_batch_file_download_log_migration', 10 );
1277
+
1278
+
1279
+ function edd_include_file_download_log_migration_batch_processor( $class ) {
1280
+
1281
+ if ( 'EDD_File_Download_Log_Migration' === $class ) {
1282
+ require_once EDD_PLUGIN_DIR . 'includes/admin/upgrades/classes/class-file-download-log-migration.php';
1283
+ }
1284
+
1285
+ }
includes/admin/upgrades/upgrades.php CHANGED
@@ -20,68 +20,86 @@ if ( !defined( 'ABSPATH' ) ) exit;
20
  */
21
  function edd_upgrades_screen() {
22
  $action = isset( $_GET['edd-upgrade'] ) ? sanitize_text_field( $_GET['edd-upgrade'] ) : '';
23
- $step = isset( $_GET['step'] ) ? absint( $_GET['step'] ) : 1;
24
- $total = isset( $_GET['total'] ) ? absint( $_GET['total'] ) : false;
25
- $custom = isset( $_GET['custom'] ) ? absint( $_GET['custom'] ) : 0;
26
- $number = isset( $_GET['number'] ) ? absint( $_GET['number'] ) : 100;
27
- $steps = round( ( $total / $number ), 0 );
28
- if ( ( $steps * $number ) < $total ) {
29
- $steps++;
30
- }
31
-
32
- $doing_upgrade_args = array(
33
- 'page' => 'edd-upgrades',
34
- 'edd-upgrade' => $action,
35
- 'step' => $step,
36
- 'total' => $total,
37
- 'custom' => $custom,
38
- 'steps' => $steps
39
- );
40
- update_option( 'edd_doing_upgrade', $doing_upgrade_args );
41
- if ( $step > $steps ) {
42
- // Prevent a weird case where the estimate was off. Usually only a couple.
43
- $steps = $step;
44
- }
45
  ?>
 
46
  <div class="wrap">
47
- <h2><?php _e( 'Easy Digital Downloads - Upgrades', 'easy-digital-downloads' ); ?></h2>
 
 
 
 
 
 
48
 
49
- <?php if( ! empty( $action ) ) : ?>
 
50
 
51
- <div id="edd-upgrade-status">
52
- <p><?php _e( 'The upgrade process has started, please be patient. This could take several minutes. You will be automatically redirected when the upgrade is finished.', 'easy-digital-downloads' ); ?></p>
53
 
54
- <?php if( ! empty( $total ) ) : ?>
55
- <p><strong><?php printf( __( 'Step %d of approximately %d running', 'easy-digital-downloads' ), $step, $steps ); ?></strong></p>
56
- <?php endif; ?>
57
- </div>
58
- <script type="text/javascript">
59
- setTimeout(function() { document.location.href = "index.php?edd_action=<?php echo $action; ?>&step=<?php echo $step; ?>&total=<?php echo $total; ?>&custom=<?php echo $custom; ?>"; }, 250);
60
- </script>
 
 
61
 
62
- <?php else : ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
63
 
64
- <div id="edd-upgrade-status">
65
- <p>
66
- <?php _e( 'The upgrade process has started, please be patient. This could take several minutes. You will be automatically redirected when the upgrade is finished.', 'easy-digital-downloads' ); ?>
67
- <img src="<?php echo EDD_PLUGIN_URL . '/assets/images/loading.gif'; ?>" id="edd-upgrade-loader"/>
68
- </p>
69
- </div>
70
- <script type="text/javascript">
71
- jQuery( document ).ready( function() {
72
- // Trigger upgrades on page load
73
- var data = { action: 'edd_trigger_upgrades' };
74
- jQuery.post( ajaxurl, data, function (response) {
75
- if( response == 'complete' ) {
76
- jQuery('#edd-upgrade-loader').hide();
77
- document.location.href = 'index.php'; // Redirect to the dashboard
78
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  });
80
- });
81
- </script>
82
 
83
- <?php endif; ?>
84
 
 
 
 
85
  </div>
86
  <?php
87
  }
20
  */
21
  function edd_upgrades_screen() {
22
  $action = isset( $_GET['edd-upgrade'] ) ? sanitize_text_field( $_GET['edd-upgrade'] ) : '';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  ?>
24
+
25
  <div class="wrap">
26
+ <h2><?php _e( 'Easy Digital Downloads - Upgrades', 'easy-digital-downloads' ); ?></h2>
27
+ <?php
28
+ if ( is_callable( 'edd_upgrade_render_' . $action ) ) {
29
+
30
+ // Until we have fully migrated all upgrade scripts to this new system, we will selectively enqueue the necessary scripts.
31
+ add_filter( 'edd_load_admin_scripts', '__return_true' );
32
+ edd_load_admin_scripts( '' );
33
 
34
+ // This is the new method to register an upgrade routine, so we can use an ajax and progress bar to display any needed upgrades.
35
+ call_user_func( 'edd_upgrade_render_' . $action );
36
 
37
+ } else {
 
38
 
39
+ // This is the legacy upgrade method, which requires a page refresh at each step.
40
+ $step = isset( $_GET['step'] ) ? absint( $_GET['step'] ) : 1;
41
+ $total = isset( $_GET['total'] ) ? absint( $_GET['total'] ) : false;
42
+ $custom = isset( $_GET['custom'] ) ? absint( $_GET['custom'] ) : 0;
43
+ $number = isset( $_GET['number'] ) ? absint( $_GET['number'] ) : 100;
44
+ $steps = round( ( $total / $number ), 0 );
45
+ if ( ( $steps * $number ) < $total ) {
46
+ $steps++;
47
+ }
48
 
49
+ $doing_upgrade_args = array(
50
+ 'page' => 'edd-upgrades',
51
+ 'edd-upgrade' => $action,
52
+ 'step' => $step,
53
+ 'total' => $total,
54
+ 'custom' => $custom,
55
+ 'steps' => $steps
56
+ );
57
+ update_option( 'edd_doing_upgrade', $doing_upgrade_args );
58
+ if ( $step > $steps ) {
59
+ // Prevent a weird case where the estimate was off. Usually only a couple.
60
+ $steps = $step;
61
+ }
62
+ ?>
63
 
64
+ <?php if( ! empty( $action ) ) : ?>
65
+
66
+ <div id="edd-upgrade-status">
67
+ <p><?php _e( 'The upgrade process has started, please be patient. This could take several minutes. You will be automatically redirected when the upgrade is finished.', 'easy-digital-downloads' ); ?></p>
68
+
69
+ <?php if( ! empty( $total ) ) : ?>
70
+ <p><strong><?php printf( __( 'Step %d of approximately %d running', 'easy-digital-downloads' ), $step, $steps ); ?></strong></p>
71
+ <?php endif; ?>
72
+ </div>
73
+ <script type="text/javascript">
74
+ setTimeout(function() { document.location.href = "index.php?edd_action=<?php echo $action; ?>&step=<?php echo $step; ?>&total=<?php echo $total; ?>&custom=<?php echo $custom; ?>"; }, 250);
75
+ </script>
76
+
77
+ <?php else : ?>
78
+
79
+ <div id="edd-upgrade-status">
80
+ <p>
81
+ <?php _e( 'The upgrade process has started, please be patient. This could take several minutes. You will be automatically redirected when the upgrade is finished.', 'easy-digital-downloads' ); ?>
82
+ <img src="<?php echo EDD_PLUGIN_URL . '/assets/images/loading.gif'; ?>" id="edd-upgrade-loader"/>
83
+ </p>
84
+ </div>
85
+ <script type="text/javascript">
86
+ jQuery( document ).ready( function() {
87
+ // Trigger upgrades on page load
88
+ var data = { action: 'edd_trigger_upgrades' };
89
+ jQuery.post( ajaxurl, data, function (response) {
90
+ if( response == 'complete' ) {
91
+ jQuery('#edd-upgrade-loader').hide();
92
+ document.location.href = 'index.php'; // Redirect to the dashboard
93
+ }
94
+ });
95
  });
96
+ </script>
 
97
 
98
+ <?php endif; ?>
99
 
100
+ <?php
101
+ }
102
+ ?>
103
  </div>
104
  <?php
105
  }
includes/api/class-edd-api-v2.php CHANGED
@@ -306,7 +306,7 @@ class EDD_API_V2 extends EDD_API_V1 {
306
 
307
  $customers['customers'][ $customer_count ]['stats']['total_purchases'] = $customer_obj->purchase_count;
308
  $customers['customers'][ $customer_count ]['stats']['total_spent'] = $customer_obj->purchase_value;
309
- $customers['customers'][ $customer_count ]['stats']['total_downloads'] = edd_count_file_downloads_of_user( $customer_obj->email );
310
 
311
  $customer_count++;
312
 
306
 
307
  $customers['customers'][ $customer_count ]['stats']['total_purchases'] = $customer_obj->purchase_count;
308
  $customers['customers'][ $customer_count ]['stats']['total_spent'] = $customer_obj->purchase_value;
309
+ $customers['customers'][ $customer_count ]['stats']['total_downloads'] = edd_count_file_downloads_of_customer( $customer_obj->id );
310
 
311
  $customer_count++;
312
 
includes/api/class-edd-api.php CHANGED
@@ -1044,7 +1044,7 @@ class EDD_API {
1044
 
1045
  $customers['customers'][$customer_count]['stats']['total_purchases'] = $customer_obj->purchase_count;
1046
  $customers['customers'][$customer_count]['stats']['total_spent'] = $customer_obj->purchase_value;
1047
- $customers['customers'][$customer_count]['stats']['total_downloads'] = edd_count_file_downloads_of_user( $customer_obj->email );
1048
 
1049
  $customer_count++;
1050
 
1044
 
1045
  $customers['customers'][$customer_count]['stats']['total_purchases'] = $customer_obj->purchase_count;
1046
  $customers['customers'][$customer_count]['stats']['total_spent'] = $customer_obj->purchase_value;
1047
+ $customers['customers'][$customer_count]['stats']['total_downloads'] = edd_count_file_downloads_of_customer( $customer_obj->id );
1048
 
1049
  $customer_count++;
1050
 
includes/checkout/template.php CHANGED
@@ -744,7 +744,7 @@ function edd_discount_field() {
744
  <span class="edd-description"><?php _e( 'Enter a coupon code if you have one.', 'easy-digital-downloads' ); ?></span>
745
  <span class="edd-discount-code-field-wrap">
746
  <input class="edd-input" type="text" id="edd-discount" name="edd-discount" placeholder="<?php _e( 'Enter discount', 'easy-digital-downloads' ); ?>"/>
747
- <input type="submit" class="edd-apply-discount edd-submit button <?php echo $color . ' ' . $style; ?>" value="<?php echo _x( 'Apply', 'Apply discount at checkout', 'easy-digital-downloads' ); ?>"/>
748
  </span>
749
  <span class="edd-discount-loader edd-loading" id="edd-discount-loader" style="display:none;"></span>
750
  <span id="edd-discount-error-wrap" class="edd_error edd-alert edd-alert-error" aria-hidden="true" style="display:none;"></span>
@@ -783,9 +783,9 @@ function edd_terms_agreement() {
783
  <a href="#" class="edd_terms_links" style="display:none;"><?php _e( 'Hide Terms', 'easy-digital-downloads' ); ?></a>
784
  </div>
785
 
786
- <?php if ( ! edd_get_option( 'show_agree_to_privacy_policy', false ) && edd_get_option( 'show_to_privacy_policy_on_checkout', false ) ) : ?>
787
  <?php
788
- $agree_page = edd_get_option( 'privacy_agree_page', get_option( 'page_for_privacy_policy' ) );
789
  $agree_label = edd_get_option( 'privacy_agree_label', __( 'Agree to Terms?', 'easy-digital-downloads' ) );
790
  $agreement_text = get_post_field( 'post_content', $agree_page );
791
  ?>
@@ -829,17 +829,17 @@ add_action( 'edd_purchase_form_before_submit', 'edd_terms_agreement' );
829
  * @return void
830
  */
831
  function edd_privacy_agreement() {
832
- if ( edd_get_option( 'show_agree_to_privacy_policy', false ) ) {
833
  $agree_label = edd_get_option( 'privacy_agree_label', __( 'Agree to Terms?', 'easy-digital-downloads' ) );
834
 
835
  ob_start();
836
  ?>
837
  <fieldset id="edd-privacy-policy-agreement">
838
 
839
- <?php if ( edd_get_option( 'show_to_privacy_policy_on_checkout', false ) ) : ?>
840
 
841
  <?php
842
- $agree_page = edd_get_option( 'privacy_agree_page', get_option( 'page_for_privacy_policy' ) );
843
  $agreement_text = get_post_field( 'post_content', $agree_page );
844
  ?>
845
 
@@ -979,7 +979,7 @@ function edd_get_checkout_button_purchase_label() {
979
  * @return void
980
  */
981
  function edd_agree_to_terms_js() {
982
- if ( edd_get_option( 'show_agree_to_terms', false ) ) {
983
  ?>
984
  <script type="text/javascript">
985
  jQuery(document).ready(function($){
744
  <span class="edd-description"><?php _e( 'Enter a coupon code if you have one.', 'easy-digital-downloads' ); ?></span>
745
  <span class="edd-discount-code-field-wrap">
746
  <input class="edd-input" type="text" id="edd-discount" name="edd-discount" placeholder="<?php _e( 'Enter discount', 'easy-digital-downloads' ); ?>"/>
747
+ <input type="submit" class="edd-apply-discount edd-submit <?php echo $color . ' ' . $style; ?>" value="<?php echo _x( 'Apply', 'Apply discount at checkout', 'easy-digital-downloads' ); ?>"/>
748
  </span>
749
  <span class="edd-discount-loader edd-loading" id="edd-discount-loader" style="display:none;"></span>
750
  <span id="edd-discount-error-wrap" class="edd_error edd-alert edd-alert-error" aria-hidden="true" style="display:none;"></span>
783
  <a href="#" class="edd_terms_links" style="display:none;"><?php _e( 'Hide Terms', 'easy-digital-downloads' ); ?></a>
784
  </div>
785
 
786
+ <?php if ( '1' !== edd_get_option( 'show_agree_to_privacy_policy', false ) && '1' === edd_get_option( 'show_agree_to_privacy_policy_on_checkout', false ) ) : ?>
787
  <?php
788
+ $agree_page = get_option( 'wp_page_for_privacy_policy' );
789
  $agree_label = edd_get_option( 'privacy_agree_label', __( 'Agree to Terms?', 'easy-digital-downloads' ) );
790
  $agreement_text = get_post_field( 'post_content', $agree_page );
791
  ?>
829
  * @return void
830
  */
831
  function edd_privacy_agreement() {
832
+ if ( edd_get_option( 'show_agree_to_privacy_policy', false ) === '1' ) {
833
  $agree_label = edd_get_option( 'privacy_agree_label', __( 'Agree to Terms?', 'easy-digital-downloads' ) );
834
 
835
  ob_start();
836
  ?>
837
  <fieldset id="edd-privacy-policy-agreement">
838
 
839
+ <?php if ( edd_get_option( 'show_agree_to_privacy_policy_on_checkout', false ) ) : ?>
840
 
841
  <?php
842
+ $agree_page = get_option( 'wp_page_for_privacy_policy' );
843
  $agreement_text = get_post_field( 'post_content', $agree_page );
844
  ?>
845
 
979
  * @return void
980
  */
981
  function edd_agree_to_terms_js() {
982
+ if ( edd_get_option( 'show_agree_to_terms', false ) || edd_get_option( 'show_agree_to_privacy_policy', false ) ) {
983
  ?>
984
  <script type="text/javascript">
985
  jQuery(document).ready(function($){
includes/class-edd-cli.php CHANGED
@@ -743,6 +743,133 @@ class EDD_CLI extends WP_CLI_Command {
743
  return;
744
  }
745
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
746
  protected function get_fname() {
747
  $names = array(
748
  'Ilse','Emelda','Aurelio','Chiquita','Cheryl','Norbert','Neville','Wendie','Clint','Synthia','Tobi','Nakita',
743
  return;
744
  }
745
 
746
+ /**
747
+ * Create sample file download log data for your EDD site
748
+ *
749
+ * ## OPTIONS
750
+ *
751
+ * --number: The number of download logs to create
752
+ *
753
+ * ## EXAMPLES
754
+ *
755
+ * wp edd download_logs create --number=10
756
+ */
757
+ public function download_logs( $args, $assoc_args ) {
758
+ global $wpdb, $edd_logs;
759
+
760
+ $error = false;
761
+
762
+ // At some point we'll likely add another action for payments
763
+ if( ! isset( $args ) || count( $args ) == 0 ) {
764
+ $error = __( 'No action specified, did you mean', 'easy-digital-downloads' );
765
+ } elseif( isset( $args ) && ! in_array( 'create', $args ) ) {
766
+ $error = __( 'Invalid action specified, did you mean', 'easy-digital-downloads' );
767
+ }
768
+
769
+ if( $error ) {
770
+ $query = '';
771
+ foreach( $assoc_args as $key => $value ) {
772
+ $query .= ' --' . $key . '=' . $value;
773
+ }
774
+
775
+ WP_CLI::error(
776
+ sprintf( $error . ' %s?', 'wp edd download_logs create' . $query )
777
+ );
778
+
779
+ return;
780
+ }
781
+
782
+ // Setup some defaults
783
+ $number = 1;
784
+
785
+ if( count( $assoc_args ) > 0 ) {
786
+ $number = ( array_key_exists( 'number', $assoc_args ) ) ? absint( $assoc_args['number'] ) : $number;
787
+ }
788
+
789
+
790
+ // First we need to find all downloads that have files associated.
791
+ $download_ids_with_file_meta = $wpdb->get_results( "SELECT post_id, meta_value FROM {$wpdb->postmeta} WHERE meta_key = 'edd_download_files'" );
792
+ $download_ids_with_files = array();
793
+ foreach ( $download_ids_with_file_meta as $meta_item ) {
794
+ if ( empty( $meta_item->meta_value ) ) {
795
+ continue;
796
+ }
797
+ $files = maybe_unserialize( $meta_item->meta_value );
798
+
799
+ // We have an empty array;
800
+ if ( empty( $files ) ) {
801
+ continue;
802
+ }
803
+
804
+ $download_ids_with_files[ $meta_item->post_id ] = array_keys( $files );
805
+ }
806
+
807
+ // Next, find all payment records that exist for the downloads that have files.
808
+ $sales_logs_args = array(
809
+ 'post_parent' => array_keys( $download_ids_with_files ),
810
+ 'log_type' => 'sale',
811
+ 'posts_per_page' => -1,
812
+ 'update_post_meta_cache' => false,
813
+ 'update_post_term_cache' => false,
814
+ );
815
+
816
+ $sales_logs = $edd_logs->get_connected_logs( $sales_logs_args );
817
+ $sales_log_meta = array();
818
+ $payments = array();
819
+
820
+ // Now generate some download logs for the files.
821
+ $progress = \WP_CLI\Utils\make_progress_bar( 'Creating File Download Logs', $number );
822
+ $i = 1;
823
+ while ( $i <= $number ) {
824
+ $sales_log_key = array_rand( $sales_logs, 1 );
825
+ $sales_log = $sales_logs[ $sales_log_key ];
826
+ if ( ! empty( $sales_log_meta[ $sales_log->ID ] ) ) {
827
+ $meta = $sales_log_meta[ $sales_log->ID ];
828
+ } else {
829
+ $meta = get_post_meta( $sales_log->ID );
830
+ $sales_log_meta[ $sales_log->ID ] = $meta;
831
+ }
832
+
833
+
834
+ $payment_id = (int) $meta['_edd_log_payment_id'][0];
835
+ $download_id = (int) $sales_log->post_parent;
836
+
837
+ if ( isset( $meta['_edd_log_price_id'] ) ) {
838
+ $price_id = (int) $meta['_edd_log_price_id'][0];
839
+ } else {
840
+ $price_id = false;
841
+ }
842
+
843
+ if ( ! isset( $payments[ $payment_id ] ) ) {
844
+ $payment = edd_get_payment( $payment_id );
845
+ $payments[ $payment_id ] = $payment;
846
+ } else {
847
+ $payment = $payments[ $payment_id ];
848
+ }
849
+
850
+ $customer = new EDD_Customer( $payment->customer_id );
851
+
852
+ $user_info = array(
853
+ 'email' => $payment->email,
854
+ 'id' => $payment->user_id,
855
+ 'name' => $customer->name,
856
+ );
857
+
858
+ if ( empty( $download_ids_with_files[ $download_id ] ) ) {
859
+ continue;
860
+ }
861
+
862
+ $file_id_key = array_rand( $download_ids_with_files[ $download_id ], 1 );
863
+ $file_key = $download_ids_with_files[ $download_id ][ $file_id_key ];
864
+ edd_record_download_in_log( $download_id, $file_key, $user_info, edd_get_ip(), $payment_id, $price_id );
865
+
866
+ $progress->tick();
867
+ $i++;
868
+ }
869
+ $progress->finish();
870
+
871
+ }
872
+
873
  protected function get_fname() {
874
  $names = array(
875
  'Ilse','Emelda','Aurelio','Chiquita','Cheryl','Norbert','Neville','Wendie','Clint','Synthia','Tobi','Nakita',
includes/download-functions.php CHANGED
@@ -635,7 +635,7 @@ function edd_record_sale_in_log( $download_id = 0, $payment_id, $price_id = fals
635
  * @global $edd_logs
636
  * @param int $download_id Download ID
637
  * @param int $file_id ID of the file downloaded
638
- * @param array $user_info User information
639
  * @param string $ip IP Address
640
  * @param int $payment_id Payment ID
641
  * @param int $price_id Price ID, if any
@@ -645,19 +645,19 @@ function edd_record_download_in_log( $download_id = 0, $file_id, $user_info, $ip
645
  global $edd_logs;
646
 
647
  $log_data = array(
648
- 'post_parent' => $download_id,
649
- 'log_type' => 'file_download'
650
  );
651
 
652
- $user_id = isset( $user_info['id'] ) ? $user_info['id'] : (int) -1;
653
 
654
  $log_meta = array(
655
- 'user_info' => $user_info,
656
- 'user_id' => $user_id,
657
- 'file_id' => (int) $file_id,
658
- 'ip' => $ip,
659
- 'payment_id'=> $payment_id,
660
- 'price_id' => (int) $price_id
661
  );
662
 
663
  $edd_logs->insert_log( $log_data, $log_meta );
635
  * @global $edd_logs
636
  * @param int $download_id Download ID
637
  * @param int $file_id ID of the file downloaded
638
+ * @param array $user_info User information (Deprecated)
639
  * @param string $ip IP Address
640
  * @param int $payment_id Payment ID
641
  * @param int $price_id Price ID, if any
645
  global $edd_logs;
646
 
647
  $log_data = array(
648
+ 'post_parent' => $download_id,
649
+ 'log_type' => 'file_download',
650
  );
651
 
652
+ $payment = new EDD_Payment( $payment_id );
653
 
654
  $log_meta = array(
655
+ 'customer_id' => $payment->customer_id,
656
+ 'user_id' => $payment->user_id,
657
+ 'file_id' => (int) $file_id,
658
+ 'ip' => $ip,
659
+ 'payment_id' => $payment_id,
660
+ 'price_id' => (int) $price_id,
661
  );
662
 
663
  $edd_logs->insert_log( $log_data, $log_meta );
includes/install.php CHANGED
@@ -214,7 +214,8 @@ function edd_run_install() {
214
  'upgrade_payment_taxes',
215
  'upgrade_customer_payments_association',
216
  'upgrade_user_api_keys',
217
- 'remove_refunded_sale_logs'
 
218
  );
219
 
220
  foreach ( $upgrade_routines as $upgrade ) {
214
  'upgrade_payment_taxes',
215
  'upgrade_customer_payments_association',
216
  'upgrade_user_api_keys',
217
+ 'remove_refunded_sale_logs',
218
+ 'update_file_download_log_data',
219
  );
220
 
221
  foreach ( $upgrade_routines as $upgrade ) {
includes/payments/class-edd-payment.php CHANGED
@@ -908,6 +908,8 @@ class EDD_Payment {
908
  break;
909
 
910
  case 'email':
 
 
911
  $this->update_meta( '_edd_payment_user_email', $this->email );
912
  break;
913
 
@@ -992,8 +994,9 @@ class EDD_Payment {
992
  'cart_details' => $this->cart_details,
993
  'fees' => $this->fees,
994
  'currency' => $this->currency,
995
- 'user_info' => is_array( $this->user_info ) ? array_filter( $this->user_info ) : array(),
996
- 'date' => $this->date
 
997
  );
998
 
999
  // Do some merging of user_info before we merge it all, to honor the edd_payment_meta filter
908
  break;
909
 
910
  case 'email':
911
+ $this->payment_meta['email'] = $this->email;
912
+ $this->user_info['email'] = $this->email;
913
  $this->update_meta( '_edd_payment_user_email', $this->email );
914
  break;
915
 
994
  'cart_details' => $this->cart_details,
995
  'fees' => $this->fees,
996
  'currency' => $this->currency,
997
+ 'user_info' => is_array( $this->user_info ) ? $this->user_info : array(),
998
+ 'date' => $this->date,
999
+ 'email' => $this->email,
1000
  );
1001
 
1002
  // Do some merging of user_info before we merge it all, to honor the edd_payment_meta filter
includes/payments/class-payments-query.php CHANGED
@@ -466,7 +466,13 @@ class EDD_Payments_Query extends EDD_Stats {
466
 
467
  $this->__unset( 's' );
468
 
469
- } elseif ( edd_get_option( 'enable_sequential' ) ) {
 
 
 
 
 
 
470
 
471
  $search_meta = array(
472
  'key' => '_edd_payment_number',
@@ -489,6 +495,19 @@ class EDD_Payments_Query extends EDD_Stats {
489
  $this->__unset( 's' );
490
  }
491
 
 
 
 
 
 
 
 
 
 
 
 
 
 
492
  } elseif ( '#' == substr( $search, 0, 1 ) ) {
493
 
494
  $search = str_replace( '#:', '', $search );
466
 
467
  $this->__unset( 's' );
468
 
469
+ } elseif (
470
+ edd_get_option( 'enable_sequential' ) &&
471
+ (
472
+ false !== strpos( $search, edd_get_option( 'sequential_prefix' ) ) ||
473
+ false !== strpos( $search, edd_get_option( 'sequential_postfix' ) )
474
+ )
475
+ ) {
476
 
477
  $search_meta = array(
478
  'key' => '_edd_payment_number',
495
  $this->__unset( 's' );
496
  }
497
 
498
+ if ( edd_get_option( 'enable_sequential' ) ) {
499
+
500
+ $search_meta = array(
501
+ 'key' => '_edd_payment_number',
502
+ 'value' => $search,
503
+ 'compare' => 'LIKE'
504
+ );
505
+
506
+ $this->__set( 'meta_query', $search_meta );
507
+ $this->__unset( 's' );
508
+
509
+ }
510
+
511
  } elseif ( '#' == substr( $search, 0, 1 ) ) {
512
 
513
  $search = str_replace( '#:', '', $search );
includes/payments/functions.php CHANGED
@@ -258,6 +258,14 @@ function edd_insert_payment( $payment_data = array() ) {
258
 
259
  $payment->save();
260
 
 
 
 
 
 
 
 
 
261
  do_action( 'edd_insert_payment', $payment->ID, $payment_data );
262
 
263
  if ( ! empty( $payment->ID ) ) {
@@ -715,24 +723,38 @@ function edd_get_payment_status( $payment, $return_label = false ) {
715
  return false;
716
  }
717
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
718
  $statuses = edd_get_payment_statuses();
719
 
720
  if ( ! is_array( $statuses ) || empty( $statuses ) ) {
721
  return false;
722
  }
723
 
724
- $payment = new EDD_Payment( $payment->ID );
725
-
726
- if ( array_key_exists( $payment->status, $statuses ) ) {
727
- if ( true === $return_label ) {
728
- return $statuses[ $payment->status ];
729
- } else {
730
- // Account that our 'publish' status is labeled 'Complete'
731
- $post_status = 'publish' == $payment->status ? 'Complete' : $payment->post_status;
732
-
733
- // Make sure we're matching cases, since they matter
734
- return array_search( strtolower( $post_status ), array_map( 'strtolower', $statuses ) );
735
- }
736
  }
737
 
738
  return false;
258
 
259
  $payment->save();
260
 
261
+ if ( edd_get_option( 'show_agree_to_terms', false ) && ! empty( $_POST['edd_agree_to_terms'] ) ) {
262
+ $payment_data['agree_to_terms_time'] = current_time( 'timestamp' );
263
+ }
264
+
265
+ if ( edd_get_option( 'show_agree_to_privacy_policy', false ) && ! empty( $_POST['edd_agree_to_privacy_policy'] ) ) {
266
+ $payment_data['agree_to_privacy_time'] = current_time( 'timestamp' );
267
+ }
268
+
269
  do_action( 'edd_insert_payment', $payment->ID, $payment_data );
270
 
271
  if ( ! empty( $payment->ID ) ) {
723
  return false;
724
  }
725
 
726
+ if ( true === $return_label ) {
727
+ return edd_get_payment_status_label( $payment->post_status );
728
+ } else {
729
+ $statuses = edd_get_payment_statuses();
730
+
731
+ // Account that our 'publish' status is labeled 'Complete'
732
+ $post_status = 'publish' == $payment->status ? 'Complete' : $payment->post_status;
733
+
734
+ // Make sure we're matching cases, since they matter
735
+ return array_search( strtolower( $post_status ), array_map( 'strtolower', $statuses ) );
736
+ }
737
+
738
+ return ! empty( $status ) ? $status : false;
739
+ }
740
+
741
+ /**
742
+ * Given a payment status string, return the label for that string.
743
+ *
744
+ * @since 2.9.2
745
+ * @param string $status
746
+ *
747
+ * @return bool|mixed
748
+ */
749
+ function edd_get_payment_status_label( $status = '' ) {
750
  $statuses = edd_get_payment_statuses();
751
 
752
  if ( ! is_array( $statuses ) || empty( $statuses ) ) {
753
  return false;
754
  }
755
 
756
+ if ( array_key_exists( $status, $statuses ) ) {
757
+ return $statuses[ $status ];
 
 
 
 
 
 
 
 
 
 
758
  }
759
 
760
  return false;
includes/privacy-functions.php ADDED
@@ -0,0 +1,1374 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Privacy Functions
4
+ *
5
+ * @package EDD
6
+ * @subpackage Functions
7
+ * @copyright Copyright (c) 2018, Easy Digital Downloads, LLC
8
+ * @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
9
+ * @since 2.9.2
10
+ */
11
+
12
+ // Exit if accessed directly
13
+ if ( ! defined( 'ABSPATH' ) ) exit;
14
+
15
+ /**
16
+ * Register the EDD template for a privacy policy.
17
+ *
18
+ * Note, this is just a suggestion and should be customized to meet your businesses needs.
19
+ *
20
+ * @since 2.9.2
21
+ */
22
+ function edd_register_privacy_policy_template() {
23
+
24
+ if ( ! function_exists( 'wp_add_privacy_policy_content' ) ) {
25
+ return;
26
+ }
27
+
28
+ $content = wp_kses_post( apply_filters( 'edd_privacy_policy_content', __( '
29
+ We collect information about you during the checkout process on our store. This information may include, but is not limited to, your name, billing address, shipping address, email address, phone number, credit card/payment details and any other details that might be requested from you for the purpose of processing your orders.
30
+ Handling this data also allows us to:
31
+ - Send you important account/order/service information.
32
+ - Respond to your queries, refund requests, or complaints.
33
+ - Process payments and to prevent fraudulent transactions. We do this on the basis of our legitimate business interests.
34
+ - Set up and administer your account, provide technical and/or customer support, and to verify your identity.
35
+ ', 'easy-digital-downloads' ) ) );
36
+
37
+ $content .= "\n\n";
38
+
39
+ $additional_collection = array(
40
+ __( 'Location and traffic data (including IP address and browser type) if you place an order, or if we need to estimate taxes and shipping costs based on your location.', 'easy-digital-downloads' ),
41
+ __( 'Product pages visited and content viewed while your session is active.', 'easy-digital-downloads' ),
42
+ __( 'Your comments and product reviews if you choose to leave them on our website.', 'easy-digital-downloads' ),
43
+ __( 'Account email/password to allow you to access your account, if you have one.', 'easy-digital-downloads' ),
44
+ __( 'If you choose to create an account with us, your name, address, and email address, which will be used to populate the checkout for future orders.', 'easy-digital-downloads' ),
45
+ );
46
+
47
+ $additional_collection = apply_filters( 'edd_privacy_policy_additional_collection', $additional_collection );
48
+
49
+ $content .= __( 'Additionally we may also collect the following information:', 'easy-digital-downloads' ) . "\n";
50
+ if ( ! empty( $additional_collection ) ) {
51
+ foreach ( $additional_collection as $item ) {
52
+ $content .= '- ' . $item . "\n";
53
+ }
54
+ }
55
+
56
+ wp_add_privacy_policy_content( 'Easy Digital Downloads', wpautop( $content ) );
57
+ }
58
+ add_action( 'admin_init', 'edd_register_privacy_policy_template' );
59
+
60
+ /** Helper Functions */
61
+
62
+ /**
63
+ * Given a string, mask it with the * character.
64
+ *
65
+ * First and last character will remain with the filling characters being changed to *. One Character will
66
+ * be left in tact as is. Two character strings will have the first character remain and the second be a *.
67
+ *
68
+ * @since 2.9.2
69
+ * @param string $string
70
+ *
71
+ * @return string
72
+ */
73
+ function edd_mask_string( $string = '' ) {
74
+
75
+ if ( empty( $string ) ) {
76
+ return '';
77
+ }
78
+
79
+ $first_char = substr( $string, 0, 1 );
80
+ $last_char = substr( $string, -1, 1 );
81
+
82
+ $masked_string = $string;
83
+
84
+ if ( strlen( $string ) > 2 ) {
85
+
86
+ $total_stars = strlen( $string ) - 2;
87
+ $masked_string = $first_char . str_repeat( '*', $total_stars ) . $last_char;
88
+
89
+ } elseif ( strlen( $string ) === 2 ) {
90
+
91
+ $masked_string = $first_char . '*';
92
+
93
+ }
94
+
95
+
96
+
97
+ return $masked_string;
98
+
99
+ }
100
+
101
+ /**
102
+ * Given a domain, mask it with the * character.
103
+ *
104
+ * TLD parts will remain intact (.com, .co.uk, etc). All subdomains will be masked t**t.e*****e.co.uk.
105
+ *
106
+ * @since 2.9.2
107
+ * @param string $domain
108
+ *
109
+ * @return string
110
+ */
111
+ function edd_mask_domain( $domain = '' ) {
112
+
113
+ if ( empty( $domain ) ) {
114
+ return '';
115
+ }
116
+
117
+ $domain_parts = explode( '.', $domain );
118
+
119
+ if ( count( $domain_parts ) === 2 ) {
120
+
121
+ // We have a single entry tld like .org or .com
122
+ $domain_parts[0] = edd_mask_string( $domain_parts[0] );
123
+
124
+ } else {
125
+
126
+ $part_count = count( $domain_parts );
127
+ $possible_cctld = strlen( $domain_parts[ $part_count - 2 ] ) <= 3 ? true : false;
128
+
129
+ $mask_parts = $possible_cctld ? array_slice( $domain_parts, 0, $part_count - 2 ) : array_slice( $domain_parts, 0, $part_count - 1 );
130
+
131
+ $i = 0;
132
+ while ( $i < count( $mask_parts ) ) {
133
+ $domain_parts[ $i ] = edd_mask_string( $domain_parts[ $i ]);
134
+ $i++;
135
+ }
136
+
137
+ }
138
+
139
+ return implode( '.', $domain_parts );
140
+ }
141
+
142
+ /**
143
+ * Given an email address, mask the name and domain according to domain and string masking functions.
144
+ *
145
+ * Will result in an email address like a***n@e*****e.org for admin@example.org.
146
+ *
147
+ * @since 2.9.2
148
+ * @param $email_address
149
+ *
150
+ * @return string
151
+ */
152
+ function edd_pseudo_mask_email( $email_address ) {
153
+ if ( ! is_email( $email_address ) ) {
154
+ return $email_address;
155
+ }
156
+
157
+ $email_parts = explode( '@', $email_address );
158
+ $name = edd_mask_string( $email_parts[0] );
159
+ $domain = edd_mask_domain( $email_parts[1] );
160
+
161
+ $email_address = $name . '@' . $domain;
162
+
163
+
164
+ return $email_address;
165
+ }
166
+
167
+ /**
168
+ * Log the privacy and terms timestamp for the last completed purchase for a customer.
169
+ *
170
+ * Stores the timestamp of the last time the user clicked the 'complete purchase' button for the Agree to Terms and/or
171
+ * Privacy Policy checkboxes during the checkout process.
172
+ *
173
+ * @since 2.9.2
174
+ *
175
+ * @param $payment_id
176
+ * @param $payment_data
177
+ *
178
+ * @return void
179
+ */
180
+ function edd_log_terms_and_privacy_times( $payment_id, $payment_data ) {
181
+ $payment = edd_get_payment( $payment_id );
182
+ $customer = new EDD_Customer( $payment->customer_id );
183
+
184
+ if ( empty( $customer->id ) ) {
185
+ return;
186
+ }
187
+
188
+ if ( ! empty( $payment_data['agree_to_terms_time'] ) ) {
189
+ $customer->add_meta( 'agree_to_terms_time', $payment_data['agree_to_terms_time'] );
190
+ }
191
+
192
+ if ( ! empty( $payment_data['agree_to_privacy_time'] ) ) {
193
+ $customer->add_meta( 'agree_to_privacy_time', $payment_data['agree_to_terms_time'] );
194
+ }
195
+ }
196
+ add_action( 'edd_insert_payment', 'edd_log_terms_and_privacy_times', 10, 2 );
197
+
198
+ /*
199
+ * Return an anonymized email address.
200
+ *
201
+ * While WP Core supports anonymizing email addresses with the wp_privacy_anonymize_data function,
202
+ * it turns every email address into deleted@site.invalid, which does not work when some purchase/customer records
203
+ * are still needed for legal and regulatory reasons.
204
+ *
205
+ * This function will anonymize the email with an MD5 that is salted
206
+ * and given a randomized uniqid prefixed with the store URL in order to prevent connecting a single customer across
207
+ * multiple stores, as well as the timestamp at the time of anonymization (so it trying the same email again will not be
208
+ * repeatable and therefore connected), and return the email address as <hash>@site.invalid.
209
+ *
210
+ * @since 2.9.2
211
+ *
212
+ * @param string $email_address
213
+ *
214
+ * @return string
215
+ */
216
+ function edd_anonymize_email( $email_address ) {
217
+
218
+ if ( empty( $email_address ) ) {
219
+ return $email_address;
220
+ }
221
+
222
+ $email_address = strtolower( $email_address );
223
+ $email_parts = explode( '@', $email_address );
224
+ $anonymized_email = wp_hash( uniqid( get_option( 'site_url' ), true ) . $email_parts[0] . current_time( 'timestamp' ), 'nonce' );
225
+
226
+
227
+ return $anonymized_email . '@site.invalid';
228
+ }
229
+
230
+ /**
231
+ * Given a customer ID, anonymize the data related to that customer.
232
+ *
233
+ * Only the customer record is affected in this function. The data that is changed:
234
+ * - The name is changed to 'Anonymized Customer'
235
+ * - The email address is anonymized, but kept in a format that passes is_email checks
236
+ * - The date created is set to the timestamp of 0 (January 1, 1970)
237
+ * - Notes are fully cleared
238
+ * - Any additional email addresses are removed
239
+ *
240
+ * Once completed, a note is left stating when the customer was anonymized.
241
+ *
242
+ * @param int $customer_id
243
+ *
244
+ * @return array
245
+ */
246
+ function _edd_anonymize_customer( $customer_id = 0 ) {
247
+
248
+ $customer = new EDD_Customer( $customer_id );
249
+ if ( empty( $customer->id ) ) {
250
+ return array( 'success' => false, 'message' => sprintf( __( 'No customer with ID %d', 'easy-digital-downloads' ), $customer_id ) );
251
+ }
252
+
253
+ /**
254
+ * Determines if this customer should be allowed to be anonymized.
255
+ *
256
+ * Developers and extensions can use this filter to make it possible to not anonymize a customer. A sample use case
257
+ * would be if the customer has pending orders, and that payment requires shipping, anonymizing the customer may
258
+ * not be ideal.
259
+ *
260
+ * @since 2.9.2
261
+ *
262
+ * @param array {
263
+ * Contains data related to if the anonymization should take place
264
+ *
265
+ * @type bool $should_anonymize If the customer should be anonymized.
266
+ * @type string $message A message to display if the customer could not be anonymized.
267
+ * }
268
+ */
269
+ $should_anonymize_customer = apply_filters( 'edd_should_anonymize_customer', array( 'should_anonymize' => true, 'message' => '' ), $customer );
270
+
271
+ if ( empty( $should_anonymize_customer['should_anonymize'] ) ) {
272
+ return array( 'success' => false, 'message' => $should_anonymize_customer['message'] );
273
+ }
274
+
275
+ // Now we should look at payments this customer has associated, and if there are any payments that should not be modified,
276
+ // do not modify the customer.
277
+ $payments = edd_get_payments( array(
278
+ 'customer' => $customer->id,
279
+ 'output' => 'payments',
280
+ 'number' => -1,
281
+ ) );
282
+
283
+ foreach ( $payments as $payment ) {
284
+ $action = _edd_privacy_get_payment_action( $payment );
285
+ if ( 'none' === $action ) {
286
+ return array(
287
+ 'success' => false,
288
+ 'message' => __( 'Customer could not be anonymized due to payments that could not be anonymized or deleted.', 'easy-digital-downloads' )
289
+ );
290
+ }
291
+ }
292
+
293
+ // Loop through all their email addresses, and remove any additional email addresses.
294
+ foreach ( $customer->emails as $email ) {
295
+ $customer->remove_email( $email );
296
+ }
297
+
298
+ if ( $customer->user_id > 0 ) {
299
+ delete_user_meta( $customer->user_id, '_edd_user_address' );
300
+ }
301
+
302
+ $customer->update( array(
303
+ 'name' => __( 'Anonymized Customer', 'easy-digital-downloads' ),
304
+ 'email' => edd_anonymize_email( $customer->email ),
305
+ 'date_created' => date( 'Y-m-d H:i:s', 0 ),
306
+ 'notes' => '',
307
+ 'user_id' => 0,
308
+ ) );
309
+
310
+ /**
311
+ * Run further anonymization on a customer
312
+ *
313
+ * Developers and extensions can use the EDD_Customer object passed into the edd_anonymize_customer action
314
+ * to complete further anonymization.
315
+ *
316
+ * @since 2.9.2
317
+ *
318
+ * @param EDD_Customer $customer The EDD_Customer object that was found.
319
+ */
320
+ do_action( 'edd_anonymize_customer', $customer );
321
+
322
+ $customer->add_note( __( 'Customer anonymized successfully', 'easy-digital-downloads' ) );
323
+ return array( 'success' => true, 'message' => sprintf( __( 'Customer ID %d successfully anonymized.', 'easy-digital-downloads' ), $customer_id ) );
324
+
325
+ }
326
+
327
+ /**
328
+ * Given a payment ID, anonymize the data related to that payment.
329
+ *
330
+ * Only the payment record is affected in this function. The data that is changed:
331
+ * - First Name is made blank
332
+ * - Last Name is made blank
333
+ * - All email addresses are converted to the anonymized email address on the customer
334
+ * - The IP address is run to only be the /24 IP Address (ending in .0) so it cannot be traced back to a user
335
+ * - Address line 1 is made blank
336
+ * - Address line 2 is made blank
337
+ *
338
+ * @param int $payment_id
339
+ *
340
+ * @return array
341
+ */
342
+ function _edd_anonymize_payment( $payment_id = 0 ) {
343
+
344
+ $payment = edd_get_payment( $payment_id );
345
+ if ( false === $payment ) {
346
+ return array( 'success' => false, 'message' => sprintf( __( 'No payment with ID %d.', 'easy-digital-downloads' ), $payment_id ) );
347
+ }
348
+
349
+ /**
350
+ * Determines if this payment should be allowed to be anonymized.
351
+ *
352
+ * Developers and extensions can use this filter to make it possible to not anonymize a payment. A sample use case
353
+ * would be if the payment is pending orders, and the payment requires shipping, anonymizing the payment may
354
+ * not be ideal.
355
+ *
356
+ * @since 2.9.2
357
+ *
358
+ * @param array {
359
+ * Contains data related to if the anonymization should take place
360
+ *
361
+ * @type bool $should_anonymize If the payment should be anonymized.
362
+ * @type string $message A message to display if the customer could not be anonymized.
363
+ * }
364
+ */
365
+ $should_anonymize_payment = apply_filters( 'edd_should_anonymize_payment', array( 'should_anonymize' => true, 'message' => '' ), $payment );
366
+
367
+ if ( empty( $should_anonymize_payment['should_anonymize'] ) ) {
368
+ return array( 'success' => false, 'message' => $should_anonymize_payment['message'] );
369
+ }
370
+
371
+ $action = _edd_privacy_get_payment_action( $payment );
372
+
373
+ switch( $action ) {
374
+
375
+ case 'none':
376
+ default:
377
+ $return = array(
378
+ 'success' => false,
379
+ 'message' => sprintf( __( 'Payment not modified, due to status: %s.', 'easy-digital-downloads' ), $payment->status )
380
+ );
381
+ break;
382
+
383
+ case 'delete':
384
+ edd_delete_purchase( $payment->ID, true, true );
385
+
386
+ $return = array(
387
+ 'success' => true,
388
+ 'message' => sprintf( __( 'Payment %d with status %s deleted.', 'easy-digital-downloads' ), $payment->ID, $payment->status )
389
+ );
390
+ break;
391
+
392
+ case 'anonymize':
393
+ $customer = new EDD_Customer( $payment->customer_id );
394
+
395
+ $payment->ip = wp_privacy_anonymize_ip( $payment->ip );
396
+ $payment->email = $customer->email;
397
+
398
+ // Anonymize the line 1 and line 2 of the address. City, state, zip, and country are possibly needed for taxes.
399
+ $address = $payment->address;
400
+ if ( isset( $address['line1'] ) ) {
401
+ $address['line1'] = '';
402
+ }
403
+
404
+ if ( isset( $address['line2'] ) ) {
405
+ $address['line2'] = '';
406
+ }
407
+
408
+ $payment->address = $address;
409
+
410
+ $payment->first_name = '';
411
+ $payment->last_name = '';
412
+
413
+
414
+ wp_update_post( array(
415
+ 'ID' => $payment->ID,
416
+ 'post_title' => __( 'Anonymized Customer', 'easy-digital-downloads' ),
417
+ 'post_name' => sanitize_title( __( 'Anonymized Customer', 'easy-digital-downloads' ) ),
418
+ ) );
419
+
420
+ // Because we changed the post_name, WordPress sets a meta on the item for the `old slug`, we need to kill that.
421
+ delete_post_meta( $payment->ID, '_wp_old_slug' );
422
+
423
+ /**
424
+ * Run further anonymization on a payment
425
+ *
426
+ * Developers and extensions can use the EDD_Payment object passed into the edd_anonymize_payment action
427
+ * to complete further anonymization.
428
+ *
429
+ * @since 2.9.2
430
+ *
431
+ * @param EDD_Payment $payment The EDD_Payment object that was found.
432
+ */
433
+ do_action( 'edd_anonymize_payment', $payment );
434
+
435
+ $payment->save();
436
+ $return = array(
437
+ 'success' => true,
438
+ 'message' => sprintf( __( 'Payment ID %d successfully anonymized.', 'easy-digital-downloads' ), $payment_id )
439
+ );
440
+ break;
441
+ }
442
+
443
+ return $return;
444
+ }
445
+
446
+ /**
447
+ * Given an EDD_Payment, determine what action should be taken during the eraser processes.
448
+ *
449
+ * @since 2.9.2
450
+ *
451
+ * @param EDD_Payment $payment
452
+ *
453
+ * @return string
454
+ */
455
+ function _edd_privacy_get_payment_action( EDD_Payment $payment ) {
456
+
457
+ $action = edd_get_option( 'payment_privacy_status_action_' . $payment->status, false );
458
+
459
+ // If the store owner has not saved any special settings for the actions to be taken, use defaults.
460
+ if ( empty( $action ) ) {
461
+
462
+ switch ( $payment->status ) {
463
+
464
+ case 'publish':
465
+ case 'refunded':
466
+ case 'revoked':
467
+ $action = 'anonymize';
468
+ break;
469
+
470
+ case 'failed':
471
+ case 'abandoned':
472
+ $action = 'delete';
473
+ break;
474
+
475
+ case 'pending':
476
+ case 'processing':
477
+ default:
478
+ $action = 'none';
479
+ break;
480
+
481
+ }
482
+
483
+ }
484
+
485
+ /**
486
+ * Allow filtering of what type of action should be taken for a payment.
487
+ *
488
+ * Developers and extensions can use this filter to modify how Easy Digital Downloads will treat an order
489
+ * that has been requested to be deleted or anonymized.
490
+ *
491
+ * @since 2.9.2
492
+ *
493
+ * @param string $action What action will be performed (none, delete, anonymize)
494
+ * @param EDD_Payment $payment The EDD_Payment object that has been requested to be anonymized or deleted.
495
+ */
496
+ $action = apply_filters( 'edd_privacy_payment_status_action_' . $payment->status, $action, $payment );
497
+ return $action;
498
+
499
+ }
500
+
501
+ /**
502
+ * Since our eraser callbacks need to look up a stored customer ID by hashed email address, developers can use this
503
+ * to retrieve the customer ID associated with an email address that's being requested to be deleted even after the
504
+ * customer has been anonymized.
505
+ *
506
+ * @since 2.9.2
507
+ *
508
+ * @param $email_address
509
+ *
510
+ * @return EDD_Customer
511
+ */
512
+ function _edd_privacy_get_customer_id_for_email( $email_address ) {
513
+ $customer_id = get_option( 'edd_priv_' . md5( $email_address ), true );
514
+ $customer = new EDD_Customer( $customer_id );
515
+
516
+ return $customer;
517
+ }
518
+
519
+ /** Exporter Functions */
520
+
521
+ /**
522
+ * Register any of our Privacy Data Exporters
523
+ *
524
+ * @since 2.9.2
525
+ *
526
+ * @param $exporters
527
+ *
528
+ * @return array
529
+ */
530
+ function edd_register_privacy_exporters( $exporters ) {
531
+
532
+ $exporters[] = array(
533
+ 'exporter_friendly_name' => __( 'Customer Record', 'easy-digital-downloads' ),
534
+ 'callback' => 'edd_privacy_customer_record_exporter',
535
+ );
536
+
537
+ $exporters[] = array(
538
+ 'exporter_friendly_name' => __( 'Billing Information', 'easy-digital-downloads' ),
539
+ 'callback' => 'edd_privacy_billing_information_exporter',
540
+ );
541
+
542
+
543
+ $exporters[] = array(
544
+ 'exporter_friendly_name' => __( 'File Downloads', 'easy-digital-downloads' ),
545
+ 'callback' => 'edd_privacy_file_download_log_exporter',
546
+ );
547
+
548
+ $exporters[] = array(
549
+ 'exporter_friendly_name' => __( 'API Access Logs', 'easy-digital-downloads' ),
550
+ 'callback' => 'edd_privacy_api_access_log_exporter',
551
+ );
552
+
553
+ return $exporters;
554
+
555
+ }
556
+ add_filter( 'wp_privacy_personal_data_exporters', 'edd_register_privacy_exporters' );
557
+
558
+ /**
559
+ * Retrieves the Customer record for the Privacy Data Exporter
560
+ *
561
+ * @since 2.9.2
562
+ * @param string $email_address
563
+ * @param int $page
564
+ *
565
+ * @return array
566
+ */
567
+ function edd_privacy_customer_record_exporter( $email_address = '', $page = 1 ) {
568
+
569
+ $customer = new EDD_Customer( $email_address );
570
+
571
+ if ( empty( $customer->id ) ) {
572
+ return array( 'data' => array(), 'done' => true );
573
+ }
574
+
575
+ $export_data = array(
576
+ 'group_id' => 'edd-customer-record',
577
+ 'group_label' => __( 'Customer Record', 'easy-digital-downloads' ),
578
+ 'item_id' => "edd-customer-record-{$customer->id}",
579
+ 'data' => array(
580
+ array(
581
+ 'name' => __( 'Customer ID', 'easy-digital-downloads' ),
582
+ 'value' => $customer->id
583
+ ),
584
+ array(
585
+ 'name' => __( 'Primary Email', 'easy-digital-downloads' ),
586
+ 'value' => $customer->email
587
+ ),
588
+ array(
589
+ 'name' => __( 'Name', 'easy-digital-downloads' ),
590
+ 'value' => $customer->name
591
+ ),
592
+ array(
593
+ 'name' => __( 'Date Created', 'easy-digital-downloads' ),
594
+ 'value' => $customer->date_created
595
+ ),
596
+ array(
597
+ 'name' => __( 'All Email Addresses', 'easy-digital-downloads' ),
598
+ 'value' => implode( ', ', $customer->emails )
599
+ ),
600
+ )
601
+ );
602
+
603
+ $agree_to_terms_time = $customer->get_meta( 'agree_to_terms_time', false );
604
+ if ( ! empty( $agree_to_terms_time ) ) {
605
+ foreach ( $agree_to_terms_time as $timestamp ) {
606
+ $export_data['data'][] = array(
607
+ 'name' => __( 'Agreed to Terms', 'easy-digital-downloads' ),
608
+ 'value' => date_i18n( get_option( 'date_format' ) . ' H:i:s', $timestamp )
609
+ );
610
+ }
611
+ }
612
+
613
+ $agree_to_privacy_time = $customer->get_meta( 'agree_to_privacy_time', false );
614
+ if ( ! empty( $agree_to_privacy_time ) ) {
615
+ foreach ( $agree_to_privacy_time as $timestamp ) {
616
+ $export_data['data'][] = array(
617
+ 'name' => __( 'Agreed to Privacy Policy', 'easy-digital-downloads' ),
618
+ 'value' => date_i18n( get_option( 'date_format' ) . ' H:i:s', $timestamp )
619
+ );
620
+ }
621
+ }
622
+
623
+ $export_data = apply_filters( 'edd_privacy_customer_record', $export_data, $customer );
624
+
625
+ return array( 'data' => array( $export_data ), 'done' => true );
626
+ }
627
+
628
+ /**
629
+ * Retrieves the billing information for the Privacy Exporter
630
+ *
631
+ * @since 2.9.2
632
+ * @param string $email_address
633
+ * @param int $page
634
+ *
635
+ * @return array
636
+ */
637
+ function edd_privacy_billing_information_exporter( $email_address = '', $page = 1 ) {
638
+
639
+ $customer = new EDD_Customer( $email_address );
640
+ $payments = edd_get_payments( array(
641
+ 'customer' => $customer->id,
642
+ 'output' => 'payments',
643
+ 'page' => $page,
644
+ ) );
645
+
646
+ // If we haven't found any payments for this page, just return that we're done.
647
+ if ( empty( $payments ) ) {
648
+ return array( 'data' => array(), 'done' => true );
649
+ }
650
+
651
+ $export_items = array();
652
+ foreach ( $payments as $payment ) {
653
+
654
+ $order_items = array();
655
+ foreach ( $payment->downloads as $cart_item ) {
656
+ $download = new EDD_Download( $cart_item['id'] );
657
+ $name = $download->get_name();
658
+
659
+ if ( $download->has_variable_prices() && isset( $cart_item['options']['price_id'] ) ) {
660
+ $variation_name = edd_get_price_option_name( $download->ID, $cart_item['options']['price_id'] );
661
+ if ( ! empty( $variation_name ) ) {
662
+ $name .= ' - ' . $variation_name;
663
+ }
664
+ }
665
+
666
+ $order_items[] = $name . ' &times; ' . $cart_item['quantity'];
667
+ }
668
+
669
+ $items_purchased = implode( ', ', $order_items );
670
+
671
+ $billing_name = array();
672
+ if ( ! empty( $payment->user_info['first_name'] ) ) {
673
+ $billing_name[] = $payment->user_info['first_name'];
674
+ }
675
+
676
+ if ( ! empty( $payment->user_info['last_name'] ) ) {
677
+ $billing_name[] = $payment->user_info['last_name'];
678
+ }
679
+ $billing_name = implode( ' ', array_values( $billing_name ) );
680
+
681
+ $billing_street = array();
682
+ if ( ! empty( $payment->address['line1'] ) ) {
683
+ $billing_street[] = $payment->address['line1'];
684
+ }
685
+
686
+ if ( ! empty( $payment->address['line2'] ) ) {
687
+ $billing_street[] = $payment->address['line2'];
688
+ }
689
+ $billing_street = implode( "\n", array_values( $billing_street ) );
690
+
691
+
692
+ $billing_city_state = array();
693
+ if ( ! empty( $payment->address['city'] ) ) {
694
+ $billing_city_state[] = $payment->address['city'];
695
+ }
696
+
697
+ if ( ! empty( $payment->address['state'] ) ) {
698
+ $billing_city_state[] = $payment->address['state'];
699
+ }
700
+ $billing_city_state = implode( ', ', array_values( $billing_city_state ) );
701
+
702
+ $billing_country_postal = array();
703
+ if ( ! empty( $payment->address['zip'] ) ) {
704
+ $billing_country_postal[] = $payment->address['zip'];
705
+ }
706
+
707
+ if ( ! empty( $payment->address['country'] ) ) {
708
+ $billing_country_postal[] = $payment->address['country'];
709
+ }
710
+ $billing_country_postal = implode( "\n", array_values( $billing_country_postal ) );
711
+
712
+ $full_billing_address = '';
713
+ if ( ! empty( $billing_name ) ) {
714
+ $full_billing_address .= $billing_name . "\n";
715
+ }
716
+
717
+ if ( ! empty( $billing_street ) ) {
718
+ $full_billing_address .= $billing_street . "\n";
719
+ }
720
+
721
+ if ( ! empty( $billing_city_state ) ) {
722
+ $full_billing_address .= $billing_city_state . "\n";
723
+ }
724
+
725
+ if ( ! empty( $billing_country_postal ) ) {
726
+ $full_billing_address .= $billing_country_postal . "\n";
727
+ }
728
+
729
+
730
+ $data_points = array(
731
+ array(
732
+ 'name' => __( 'Order ID / Number', 'easy-digital-downloads' ),
733
+ 'value' => $payment->number,
734
+ ),
735
+ array(
736
+ 'name' => __( 'Order Date', 'easy-digital-downloads' ),
737
+ 'value' => date_i18n( get_option( 'date_format' ) . ' H:i:s', strtotime( $payment->date ) ),
738
+ ),
739
+ array(
740
+ 'name' => __( 'Order Completed Date', 'easy-digital-downloads' ),
741
+ 'value' => ! empty( $payment->completed_date )
742
+ ? date_i18n( get_option( 'date_format' ) . ' H:i:s', strtotime( $payment->completed_date ) )
743
+ : '',
744
+ ),
745
+ array(
746
+ 'name' => __( 'Order Total', 'easy-digital-downloads' ),
747
+ 'value' => edd_currency_filter( edd_format_amount( $payment->total ), $payment->currency ),
748
+ ),
749
+ array(
750
+ 'name' => __( 'Order Items', 'easy-digital-downloads' ),
751
+ 'value' => $items_purchased,
752
+ ),
753
+ array(
754
+ 'name' => __( 'Email Address', 'easy-digital-downloads' ),
755
+ 'value' => ! empty( $payment->email ) ? $payment->email : '',
756
+ ),
757
+ array(
758
+ 'name' => __( 'Billing Address', 'easy-digital-downloads' ),
759
+ 'value' => $full_billing_address,
760
+ ),
761
+ array(
762
+ 'name' => __( 'IP Address', 'easy-digital-downloads' ),
763
+ 'value' => ! empty( $payment->ip ) ? $payment->ip : '',
764
+ ),
765
+ array(
766
+ 'name' => __( 'Status', 'easy-digital-downloads' ),
767
+ 'value' => edd_get_payment_status_label( $payment->status ),
768
+ ),
769
+ );
770
+
771
+ $data_points = apply_filters( 'edd_privacy_order_details_item', $data_points, $payment );
772
+
773
+ $export_items[] = array(
774
+ 'group_id' => 'edd-order-details',
775
+ 'group_label' => __( 'Customer Orders', 'easy-digital-downloads' ),
776
+ 'item_id' => "edd-order-details-{$payment->ID}",
777
+ 'data' => $data_points,
778
+ );
779
+
780
+ }
781
+
782
+
783
+ // Add the data to the list, and tell the exporter to come back for the next page of payments.
784
+ return array(
785
+ 'data' => $export_items,
786
+ 'done' => false,
787
+ );
788
+
789
+ }
790
+
791
+ /**
792
+ * Adds the file download logs for a customer to the WP Core Privacy Data exporter
793
+ *
794
+ * @since 2.9.2
795
+ *
796
+ * @param string $email_address The email address to look up file download logs for.
797
+ * @param int $page The page of logs to request.
798
+ *
799
+ * @return array
800
+ */
801
+ function edd_privacy_file_download_log_exporter( $email_address = '', $page = 1 ) {
802
+ global $edd_logs;
803
+
804
+ $customer = new EDD_Customer( $email_address );
805
+ $log_query = array(
806
+ 'log_type' => 'file_download',
807
+ 'posts_per_page' => 100,
808
+ 'paged' => $page,
809
+ 'update_post_meta_cache' => false,
810
+ 'update_post_term_cache' => false,
811
+ 'meta_query' => array(
812
+ array(
813
+ 'key' => '_edd_log_customer_id',
814
+ 'value' => $customer->id,
815
+ )
816
+ )
817
+ );
818
+
819
+ $logs = $edd_logs->get_connected_logs( $log_query );
820
+
821
+ // If we haven't found any payments for this page, just return that we're done.
822
+ if ( empty( $logs ) ) {
823
+ return array( 'data' => array(), 'done' => true );
824
+ }
825
+
826
+ $found_downloads = array();
827
+
828
+ $export_items = array();
829
+ foreach ( $logs as $log ) {
830
+
831
+ $log_meta = get_post_meta( $log->ID );
832
+
833
+ if ( ! isset( $found_downloads[ $log->post_parent ] ) ) {
834
+ $found_downloads[ $log->post_parent ] = new EDD_Download( $log->post_parent );
835
+ }
836
+
837
+ $download = $found_downloads[ $log->post_parent ];
838
+
839
+ $data_points = array(
840
+ array(
841
+ 'name' => __( 'Date of Download', 'easy-digital-downloads' ),
842
+ 'value' => date_i18n( get_option( 'date_format' ) . ' H:i:s', strtotime( $log->post_date ) ),
843
+ ),
844
+ array(
845
+ 'name' => __( 'Product Downloaded', 'easy-digital-downloads' ),
846
+ 'value' => $download->get_name(),
847
+ ),
848
+ array(
849
+ 'name' => __( 'Order ID', 'easy-digital-downloads' ),
850
+ 'value' => $log_meta['_edd_log_payment_id'][0],
851
+ ),
852
+ array(
853
+ 'name' => __( 'Customer ID', 'easy-digital-downloads' ),
854
+ 'value' => $log_meta['_edd_log_customer_id'][0],
855
+ ),
856
+ array(
857
+ 'name' => __( 'User ID', 'easy-digital-downloads' ),
858
+ 'value' => $log_meta['_edd_log_user_id'][0],
859
+ ),
860
+ array(
861
+ 'name' => __( 'IP Address', 'easy-digital-downloads' ),
862
+ 'value' => $log_meta['_edd_log_ip'][0],
863
+ ),
864
+ );
865
+
866
+ $data_points = apply_filters( 'edd_privacy_file_download_log_item', $data_points, $log, $log_meta );
867
+
868
+ $export_items[] = array(
869
+ 'group_id' => 'edd-file-download-logs',
870
+ 'group_label' => __( 'File Download Logs', 'easy-digital-downloads' ),
871
+ 'item_id' => "edd-file-download-logs-{$log->ID}",
872
+ 'data' => $data_points,
873
+ );
874
+
875
+ }
876
+
877
+
878
+ // Add the data to the list, and tell the exporter to come back for the next page of payments.
879
+ return array(
880
+ 'data' => $export_items,
881
+ 'done' => false,
882
+ );
883
+ }
884
+
885
+ /**
886
+ * Adds the api access logs for a user to the WP Core Privacy Data exporter
887
+ *
888
+ * @since 2.9.2
889
+ *
890
+ * @param string $email_address The email address to look up api access logs for.
891
+ * @param int $page The page of logs to request.
892
+ *
893
+ * @return array
894
+ */
895
+ function edd_privacy_api_access_log_exporter( $email_address = '', $page = 1 ) {
896
+ global $edd_logs;
897
+
898
+ $user = get_user_by( 'email', $email_address );
899
+
900
+ if ( false === $user ) {
901
+ return array( 'data' => array(), 'done' => true );
902
+ }
903
+
904
+ $log_query = array(
905
+ 'log_type' => 'api_access',
906
+ 'posts_per_page' => 100,
907
+ 'paged' => $page,
908
+ 'update_post_meta_cache' => false,
909
+ 'update_post_term_cache' => false,
910
+ 'meta_query' => array(
911
+ array(
912
+ 'key' => '_edd_log_user',
913
+ 'value' => $user->ID,
914
+ )
915
+ )
916
+ );
917
+
918
+ $logs = $edd_logs->get_connected_logs( $log_query );
919
+
920
+ // If we haven't found any api access logs for this page, just return that we're done.
921
+ if ( empty( $logs ) ) {
922
+ return array( 'data' => array(), 'done' => true );
923
+ }
924
+
925
+ $export_items = array();
926
+ foreach ( $logs as $log ) {
927
+
928
+ $ip_address = get_post_meta( $log->ID, '_edd_log_request_ip', true );
929
+
930
+ $data_points = array(
931
+ array(
932
+ 'name' => __( 'Date', 'easy-digital-downloads' ),
933
+ 'value' => date_i18n( get_option( 'date_format' ) . ' H:i:s', strtotime( $log->post_date ) ),
934
+ ),
935
+ array(
936
+ 'name' => __( 'Request', 'easy-digital-downloads' ),
937
+ 'value' => $log->post_excerpt,
938
+ ),
939
+ array(
940
+ 'name' => __( 'IP Address', 'easy-digital-downloads' ),
941
+ 'value' => $ip_address,
942
+ ),
943
+ );
944
+
945
+ $data_points = apply_filters( 'edd_privacy_api_access_log_item', $data_points, $log );
946
+
947
+ $export_items[] = array(
948
+ 'group_id' => 'edd-api-access-logs',
949
+ 'group_label' => __( 'API Access Logs', 'easy-digital-downloads' ),
950
+ 'item_id' => "edd-api-access-logs-{$log->ID}",
951
+ 'data' => $data_points,
952
+ );
953
+
954
+ }
955
+
956
+ // Add the data to the list, and tell the exporter to come back for the next page of payments.
957
+ return array(
958
+ 'data' => $export_items,
959
+ 'done' => false,
960
+ );
961
+ }
962
+
963
+ /** Anonymization Functions */
964
+
965
+ /**
966
+ * This registers a single eraser _very_ early to avoid any other hook into the EDD data from running first.
967
+ *
968
+ * We are going to set an option of what customer we're currently deleting for what email address, so that after the customer
969
+ * is anonymized we can still find them. Then we'll delete it.
970
+ *
971
+ * @param array $erasers
972
+ */
973
+ function edd_register_privacy_eraser_customer_id_lookup( $erasers = array() ) {
974
+ $erasers[] = array(
975
+ 'eraser_friendly_name' => 'pre-eraser-customer-id-lookup',
976
+ 'callback' => 'edd_privacy_prefetch_customer_id',
977
+ );
978
+
979
+ return $erasers;
980
+ }
981
+ add_filter( 'wp_privacy_personal_data_erasers', 'edd_register_privacy_eraser_customer_id_lookup', 5, 1 );
982
+
983
+ /**
984
+ * Lookup the customer ID for this email address so that we can use it later in the anonymization process.
985
+ *
986
+ * @param $email_address
987
+ * @param int $page
988
+ *
989
+ * @return array
990
+ */
991
+ function edd_privacy_prefetch_customer_id( $email_address, $page = 1 ) {
992
+ $customer = new EDD_Customer( $email_address );
993
+ update_option( 'edd_priv_' . md5( $email_address ), $customer->id, false );
994
+
995
+ return array(
996
+ 'items_removed' => false,
997
+ 'items_retained' => false,
998
+ 'messages' => array(),
999
+ 'done' => true,
1000
+ );
1001
+ }
1002
+
1003
+ /**
1004
+ * This registers a single eraser _very_ late to remove a customer ID that was found for the erasers.
1005
+ *
1006
+ * We are now assumed done with our exporters, so we can go ahead and delete the customer ID we found for this eraser.
1007
+ *
1008
+ * @param array $erasers
1009
+ */
1010
+ function edd_register_privacy_eraser_customer_id_removal( $erasers = array() ) {
1011
+ $erasers[] = array(
1012
+ 'eraser_friendly_name' => __( 'Possibly Delete Customer', 'easy-digital-downloads' ),
1013
+ 'callback' => 'edd_privacy_maybe_delete_customer_eraser',
1014
+ );
1015
+
1016
+ $erasers[] = array(
1017
+ 'eraser_friendly_name' => 'post-eraser-customer-id-lookup',
1018
+ 'callback' => 'edd_privacy_remove_customer_id',
1019
+ );
1020
+
1021
+ return $erasers;
1022
+ }
1023
+ add_filter( 'wp_privacy_personal_data_erasers', 'edd_register_privacy_eraser_customer_id_removal', 9999, 1 );
1024
+
1025
+ /**
1026
+ * Delete the customer ID for this email address that was found in edd_privacy_prefetch_customer_id()
1027
+ *
1028
+ * @param $email_address
1029
+ * @param int $page
1030
+ *
1031
+ * @return array
1032
+ */
1033
+ function edd_privacy_remove_customer_id( $email_address, $page = 1 ) {
1034
+ delete_option( 'edd_priv_' . md5( $email_address ) );
1035
+
1036
+ return array(
1037
+ 'items_removed' => false,
1038
+ 'items_retained' => false,
1039
+ 'messages' => array(),
1040
+ 'done' => true,
1041
+ );
1042
+ }
1043
+
1044
+ /**
1045
+ * If after the payment anonymization/erasure methods have been run, and there are no longer payments
1046
+ * for the requested customer, go ahead and delete the customer
1047
+ *
1048
+ * @since 2.9.2
1049
+ *
1050
+ * @param string $email_address The email address requesting anonymization/erasure
1051
+ * @param int $page The page (not needed for this query)
1052
+ *
1053
+ * @return array
1054
+ */
1055
+ function edd_privacy_maybe_delete_customer_eraser( $email_address, $page = 1 ) {
1056
+ $customer = _edd_privacy_get_customer_id_for_email( $email_address );
1057
+
1058
+ if ( empty( $customer->id ) ) {
1059
+ return array(
1060
+ 'items_removed' => false,
1061
+ 'items_retained' => false,
1062
+ 'messages' => array(),
1063
+ 'done' => true,
1064
+ );
1065
+ }
1066
+
1067
+ $payments = edd_get_payments( array(
1068
+ 'customer' => $customer->id,
1069
+ 'output' => 'payments',
1070
+ 'page' => $page,
1071
+ ) );
1072
+
1073
+ if ( ! empty( $payments ) ) {
1074
+ return array(
1075
+ 'items_removed' => false,
1076
+ 'items_retained' => false,
1077
+ 'messages' => array(
1078
+ sprintf( __( 'Customer for %s not deleted, due to remaining payments.', 'easy-digital-downloads' ), $email_address ),
1079
+ ),
1080
+ 'done' => true,
1081
+ );
1082
+ }
1083
+
1084
+ if ( empty( $payments ) ) {
1085
+ global $wpdb;
1086
+
1087
+ $deleted_customer = EDD()->customers->delete( $customer->id );
1088
+ if ( $deleted_customer ) {
1089
+ $customer_meta_table = EDD()->customer_meta->table_name;
1090
+ $deleted_meta = $wpdb->query( "DELETE FROM {$customer_meta_table} WHERE customer_id = {$customer->id}" );
1091
+
1092
+ return array(
1093
+ 'items_removed' => true,
1094
+ 'items_retained' => false,
1095
+ 'messages' => array(
1096
+ sprintf( __( 'Customer for %s successfully deleted.', 'easy-digital-downloads' ), $email_address ),
1097
+ ),
1098
+ 'done' => true,
1099
+ );
1100
+ }
1101
+ }
1102
+
1103
+ return array(
1104
+ 'items_removed' => false,
1105
+ 'items_retained' => false,
1106
+ 'messages' => array(
1107
+ sprintf( __( 'Customer for %s failed to be deleted.', 'easy-digital-downloads' ), $email_address ),
1108
+ ),
1109
+ 'done' => true,
1110
+ );
1111
+ }
1112
+
1113
+ /**
1114
+ * Register eraser for EDD Data
1115
+ *
1116
+ * @param array $erasers
1117
+ *
1118
+ * @return array
1119
+ */
1120
+ function edd_register_privacy_erasers( $erasers = array() ) {
1121
+
1122
+ // The order of these matter, customer needs to be anonymized prior to the customer, so that the payment can adopt
1123
+ // properties of the customer like email.
1124
+
1125
+ $erasers[] = array(
1126
+ 'eraser_friendly_name' => __( 'Customer Record', 'easy-digital-downloads' ),
1127
+ 'callback' => 'edd_privacy_customer_anonymizer',
1128
+ );
1129
+
1130
+ $erasers[] = array(
1131
+ 'eraser_friendly_name' => __( 'Payment Record', 'easy-digital-downloads' ),
1132
+ 'callback' => 'edd_privacy_payment_eraser',
1133
+ );
1134
+
1135
+ $erasers[] = array(
1136
+ 'eraser_friendly_name' => __( 'File Download Logs', 'easy-digital-downloads' ),
1137
+ 'callback' => 'edd_privacy_file_download_logs_eraser',
1138
+ );
1139
+
1140
+ $erasers[] = array(
1141
+ 'eraser_friendly_name' => __( 'API Access Logs', 'easy-digital-downloads' ),
1142
+ 'callback' => 'edd_privacy_api_access_logs_eraser',
1143
+ );
1144
+
1145
+ return $erasers;
1146
+
1147
+ }
1148
+ add_filter( 'wp_privacy_personal_data_erasers', 'edd_register_privacy_erasers', 11, 1 );
1149
+
1150
+ /**
1151
+ * Anonymize a customer record through the WP Core Privacy Data Eraser methods.
1152
+ *
1153
+ * @param $email_address
1154
+ * @param int $page
1155
+ *
1156
+ * @return array
1157
+ */
1158
+ function edd_privacy_customer_anonymizer( $email_address, $page = 1 ) {
1159
+ $customer = _edd_privacy_get_customer_id_for_email( $email_address );
1160
+
1161
+ $anonymized = _edd_anonymize_customer( $customer->id );
1162
+ if ( empty( $anonymized['success'] ) ) {
1163
+ return array(
1164
+ 'items_removed' => false,
1165
+ 'items_retained' => false,
1166
+ 'messages' => array( $anonymized['message'] ),
1167
+ 'done' => true,
1168
+ );
1169
+ }
1170
+
1171
+ return array(
1172
+ 'items_removed' => true,
1173
+ 'items_retained' => false,
1174
+ 'messages' => array( sprintf( __( 'Customer for %s has been anonymized.', 'easy-digital-downloads' ), $email_address ) ),
1175
+ 'done' => true,
1176
+ );
1177
+ }
1178
+
1179
+ /**
1180
+ * Anonymize a payment record through the WP Core Privacy Data Eraser methods.
1181
+ *
1182
+ * @param string $email_address
1183
+ * @param int $page
1184
+ *
1185
+ * @return array
1186
+ */
1187
+ function edd_privacy_payment_eraser( $email_address, $page = 1 ) {
1188
+ $customer = _edd_privacy_get_customer_id_for_email( $email_address );
1189
+
1190
+ $payments = edd_get_payments( array(
1191
+ 'customer' => $customer->id,
1192
+ 'output' => 'payments',
1193
+ 'page' => $page,
1194
+ ) );
1195
+
1196
+ if ( empty( $payments ) ) {
1197
+
1198
+ $message = 1 === $page ?
1199
+ sprintf( __( 'No payments found for %s.', 'easy-digital-downloads' ), $email_address ) :
1200
+ sprintf( __( 'All eligible payments anonymized or deleted for %s.', 'easy-digital-downloads' ), $email_address );
1201
+
1202
+ return array(
1203
+ 'items_removed' => false,
1204
+ 'items_retained' => false,
1205
+ 'messages' => array( $message ),
1206
+ 'done' => true,
1207
+ );
1208
+ }
1209
+
1210
+ $items_removed = null;
1211
+ $items_retained = null;
1212
+ $messages = array();
1213
+ foreach ( $payments as $payment ) {
1214
+ $result = _edd_anonymize_payment( $payment->ID );
1215
+
1216
+ if ( ! is_null( $items_removed ) && $result['success'] ) {
1217
+ $items_removed = true;
1218
+ }
1219
+
1220
+ if ( ! is_null( $items_removed ) && ! $result['success'] ) {
1221
+ $items_retained = true;
1222
+ }
1223
+
1224
+ $messages[] = $result['message'];
1225
+ }
1226
+
1227
+
1228
+
1229
+ return array(
1230
+ 'items_removed' => ! is_null( $items_removed ) ? $items_removed : false,
1231
+ 'items_retained' => ! is_null( $items_retained ) ? $items_retained : false,
1232
+ 'messages' => $messages,
1233
+ 'done' => false,
1234
+ );
1235
+ }
1236
+
1237
+ /**
1238
+ * Anonymize the file download logs.
1239
+ *
1240
+ * @since 2.9.2
1241
+ *
1242
+ * @param string $email_address
1243
+ * @param int $page
1244
+ *
1245
+ * @return array
1246
+ */
1247
+ function edd_privacy_file_download_logs_eraser( $email_address, $page = 1 ) {
1248
+ global $edd_logs;
1249
+
1250
+ $customer = _edd_privacy_get_customer_id_for_email( $email_address );
1251
+
1252
+ $log_query = array(
1253
+ 'log_type' => 'file_download',
1254
+ 'posts_per_page' => 25,
1255
+ 'paged' => $page,
1256
+ 'update_post_meta_cache' => false,
1257
+ 'update_post_term_cache' => false,
1258
+ 'meta_query' => array(
1259
+ array(
1260
+ 'key' => '_edd_log_customer_id',
1261
+ 'value' => $customer->id,
1262
+ )
1263
+ )
1264
+ );
1265
+
1266
+ $logs = $edd_logs->get_connected_logs( $log_query );
1267
+
1268
+ if ( empty( $logs ) ) {
1269
+
1270
+ return array(
1271
+ 'items_removed' => false,
1272
+ 'items_retained' => false,
1273
+ 'messages' => array( sprintf( __( 'All eligible file download logs anonymized or deleted for %s.', 'easy-digital-downloads' ), $email_address ) ),
1274
+ 'done' => true,
1275
+ );
1276
+ }
1277
+
1278
+ foreach ( $logs as $log ) {
1279
+ $current_ip = get_post_meta( $log->ID, '_edd_log_ip', true );
1280
+ update_post_meta( $log->ID, '_edd_log_ip', wp_privacy_anonymize_ip( $current_ip ) );
1281
+
1282
+ /**
1283
+ * Run further anonymization on a file download log
1284
+ *
1285
+ * Developers and extensions can use the $log WP_Post object passed into the edd_anonymize_file_download_log action
1286
+ * to complete further anonymization.
1287
+ *
1288
+ * @since 2.9.2
1289
+ *
1290
+ * @param WP_Post $log The WP_Post object for the log
1291
+ */
1292
+ do_action( 'edd_anonymize_file_download_log', $log );
1293
+ }
1294
+
1295
+ return array(
1296
+ 'items_removed' => true,
1297
+ 'items_retained' => false,
1298
+ 'messages' => array(),
1299
+ 'done' => false,
1300
+ );
1301
+ }
1302
+
1303
+ /**
1304
+ * Delete API Access Logs
1305
+ *
1306
+ * @since 2.9.2
1307
+ *
1308
+ * @param string $email_address
1309
+ * @param int $page
1310
+ *
1311
+ * @return array
1312
+ */
1313
+ function edd_privacy_api_access_logs_eraser( $email_address, $page = 1 ) {
1314
+ global $edd_logs;
1315
+
1316
+ $user = get_user_by( 'email', $email_address );
1317
+
1318
+ if ( false === $user ) {
1319
+ return array(
1320
+ 'items_removed' => false,
1321
+ 'items_retained' => false,
1322
+ 'messages' => array( sprintf( __( 'No User found for %s, no access logs to remove.', 'easy-digital-downloads' ), $email_address ) ),
1323
+ 'done' => true,
1324
+ );
1325
+ }
1326
+
1327
+ $log_query = array(
1328
+ 'log_type' => 'api_access',
1329
+ 'posts_per_page' => 25,
1330
+ 'paged' => $page,
1331
+ 'update_post_meta_cache' => false,
1332
+ 'update_post_term_cache' => false,
1333
+ 'meta_query' => array(
1334
+ array(
1335
+ 'key' => '_edd_log_user',
1336
+ 'value' => $user->ID,
1337
+ )
1338
+ )
1339
+ );
1340
+
1341
+ $logs = $edd_logs->get_connected_logs( $log_query );
1342
+
1343
+ if ( empty( $logs ) ) {
1344
+ return array(
1345
+ 'items_removed' => false,
1346
+ 'items_retained' => false,
1347
+ 'messages' => array( sprintf( __( 'All API access logs deleted for %s.', 'easy-digital-downloads' ), $email_address ) ),
1348
+ 'done' => true,
1349
+ );
1350
+ }
1351
+
1352
+ foreach ( $logs as $log ) {
1353
+ wp_delete_post( $log->ID );
1354
+
1355
+ /**
1356
+ * Run further actions on an api access log
1357
+ *
1358
+ * Developers and extensions can use the $log WP_Post object passed into the edd_delete_api_access_log action
1359
+ * to complete further actions.
1360
+ *
1361
+ * @since 2.9.2
1362
+ *
1363
+ * @param WP_Post $log The WP_Post object for the log
1364
+ */
1365
+ do_action( 'edd_delete_api_access_log', $log );
1366
+ }
1367
+
1368
+ return array(
1369
+ 'items_removed' => true,
1370
+ 'items_retained' => false,
1371
+ 'messages' => array(),
1372
+ 'done' => false,
1373
+ );
1374
+ }
includes/shortcodes.php CHANGED
@@ -587,6 +587,9 @@ function edd_downloads_query( $atts, $content = null ) {
587
  $query = apply_filters( 'edd_downloads_query', $query, $atts );
588
 
589
  $downloads = new WP_Query( $query );
 
 
 
590
  if ( $downloads->have_posts() ) :
591
  $i = 1;
592
  $columns_class = array( 'edd_download_columns_' . $atts['columns'] );
@@ -594,9 +597,10 @@ function edd_downloads_query( $atts, $content = null ) {
594
  $wrapper_classes = array_unique( array_merge( $columns_class, $custom_classes ) );
595
  $wrapper_classes = implode( ' ', $wrapper_classes );
596
  ob_start(); ?>
 
597
  <div class="edd_downloads_list <?php echo apply_filters( 'edd_downloads_list_wrapper_class', $wrapper_classes, $atts ); ?>">
598
 
599
- <?php do_action( 'edd_downloads_list_top', $atts ); ?>
600
 
601
  <?php while ( $downloads->have_posts() ) : $downloads->the_post(); ?>
602
  <?php do_action( 'edd_download_shortcode_item', $atts, $i ); ?>
@@ -646,6 +650,8 @@ function edd_downloads_query( $atts, $content = null ) {
646
  $display = sprintf( _x( 'No %s found', 'download post type name', 'easy-digital-downloads' ), edd_get_label_plural() );
647
  endif;
648
 
 
 
649
  return apply_filters( 'downloads_shortcode', $display, $atts, $atts['buy_button'], $atts['columns'], '', $downloads, $atts['excerpt'], $atts['full_content'], $atts['price'], $atts['thumbnails'], $query );
650
  }
651
  add_shortcode( 'downloads', 'edd_downloads_query' );
587
  $query = apply_filters( 'edd_downloads_query', $query, $atts );
588
 
589
  $downloads = new WP_Query( $query );
590
+
591
+ do_action( 'edd_downloads_list_before', $atts );
592
+
593
  if ( $downloads->have_posts() ) :
594
  $i = 1;
595
  $columns_class = array( 'edd_download_columns_' . $atts['columns'] );
597
  $wrapper_classes = array_unique( array_merge( $columns_class, $custom_classes ) );
598
  $wrapper_classes = implode( ' ', $wrapper_classes );
599
  ob_start(); ?>
600
+
601
  <div class="edd_downloads_list <?php echo apply_filters( 'edd_downloads_list_wrapper_class', $wrapper_classes, $atts ); ?>">
602
 
603
+ <?php do_action( 'edd_downloads_list_top', $atts, $downloads ); ?>
604
 
605
  <?php while ( $downloads->have_posts() ) : $downloads->the_post(); ?>
606
  <?php do_action( 'edd_download_shortcode_item', $atts, $i ); ?>
650
  $display = sprintf( _x( 'No %s found', 'download post type name', 'easy-digital-downloads' ), edd_get_label_plural() );
651
  endif;
652
 
653
+ do_action( 'edd_downloads_list_after', $atts, $downloads );
654
+
655
  return apply_filters( 'downloads_shortcode', $display, $atts, $atts['buy_button'], $atts['columns'], '', $downloads, $atts['excerpt'], $atts['full_content'], $atts['price'], $atts['thumbnails'], $query );
656
  }
657
  add_shortcode( 'downloads', 'edd_downloads_query' );
includes/user-functions.php CHANGED
@@ -354,7 +354,7 @@ function edd_purchase_total_of_user( $user = null ) {
354
  }
355
 
356
  /**
357
- * Counts the total number of files a customer has downloaded
358
  *
359
  * @since 1.3
360
  * @param mixed $user - ID or email
@@ -364,13 +364,10 @@ function edd_count_file_downloads_of_user( $user ) {
364
  global $edd_logs;
365
 
366
  if ( is_email( $user ) ) {
367
- $meta_query = array(
368
- array(
369
- 'key' => '_edd_log_user_info',
370
- 'value' => $user,
371
- 'compare' => 'LIKE'
372
- )
373
- );
374
  } else {
375
  $meta_query = array(
376
  array(
@@ -383,6 +380,27 @@ function edd_count_file_downloads_of_user( $user ) {
383
  return $edd_logs->get_log_count( null, 'file_download', $meta_query );
384
  }
385
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
386
  /**
387
  * Validate a potential username
388
  *
354
  }
355
 
356
  /**
357
+ * Counts the total number of files a user (or customer if an email address is given) has downloaded
358
  *
359
  * @since 1.3
360
  * @param mixed $user - ID or email
364
  global $edd_logs;
365
 
366
  if ( is_email( $user ) ) {
367
+
368
+ // If we got an email, look up the customer ID and call the direct query for customer download counts.
369
+ return edd_count_file_downloads_of_customer( $user );
370
+
 
 
 
371
  } else {
372
  $meta_query = array(
373
  array(
380
  return $edd_logs->get_log_count( null, 'file_download', $meta_query );
381
  }
382
 
383
+ /**
384
+ * Counts the total number of files a customer has downloaded.
385
+ *
386
+ * @param string|int $customer_id_or_email The email address or id of the customer.
387
+ *
388
+ * @return int The total number of files the customer has downloaded.
389
+ */
390
+ function edd_count_file_downloads_of_customer( $customer_id_or_email = '' ) {
391
+ global $edd_logs;
392
+
393
+ $customer = new EDD_Customer( $customer_id_or_email );
394
+ $meta_query = array(
395
+ array(
396
+ 'key' => '_edd_log_customer_id',
397
+ 'value' => $customer->id,
398
+ )
399
+ );
400
+
401
+ return $edd_logs->get_log_count( null, 'file_download', $meta_query );
402
+ }
403
+
404
  /**
405
  * Validate a potential username
406
  *
languages/easy-digital-downloads.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the same license as the Easy Digital Downloads package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Easy Digital Downloads 2.9.1\n"
6
  "Report-Msgid-Bugs-To: https://easydigitaldownloads.com/\n"
7
- "POT-Creation-Date: 2018-04-20 17:28:35+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -79,14 +79,15 @@ msgstr ""
79
  #: includes/admin/tools/class-edd-tools-recount-store-earnings.php:153
80
  #: includes/admin/tools/class-edd-tools-reset-stats.php:179
81
  #: includes/admin/tools.php:1027 includes/admin/tools.php:1033
82
- #: includes/admin/upgrades/upgrade-functions.php:205
83
- #: includes/admin/upgrades/upgrade-functions.php:521
84
- #: includes/admin/upgrades/upgrade-functions.php:603
85
- #: includes/admin/upgrades/upgrade-functions.php:714
86
- #: includes/admin/upgrades/upgrade-functions.php:811
87
- #: includes/admin/upgrades/upgrade-functions.php:885
88
- #: includes/admin/upgrades/upgrade-functions.php:1013
89
- #: includes/admin/upgrades/upgrade-functions.php:1098
 
90
  #: includes/api/class-edd-api.php:1967 includes/api/class-edd-api.php:1972
91
  #: includes/api/class-edd-api.php:1984 includes/api/class-edd-api.php:1986
92
  #: includes/cart/class-edd-cart.php:1423 includes/cart/class-edd-cart.php:1437
@@ -97,8 +98,8 @@ msgstr ""
97
  #: includes/error-tracking.php:40 includes/gateways/functions.php:221
98
  #: includes/gateways/manual.php:33 includes/gateways/paypal-standard.php:168
99
  #: includes/process-download.php:293 includes/process-download.php:881
100
- #: includes/query-filters.php:48 includes/user-functions.php:873
101
- #: includes/user-functions.php:898 includes/user-functions.php:951
102
  msgid "Error"
103
  msgstr ""
104
 
@@ -185,7 +186,7 @@ msgstr ""
185
  msgid "Easy Digital Downloads Info and Tools"
186
  msgstr ""
187
 
188
- #: includes/admin/admin-pages.php:42 includes/admin/customers/customers.php:640
189
  msgid "Tools"
190
  msgstr ""
191
 
@@ -195,7 +196,7 @@ msgstr ""
195
 
196
  #: includes/admin/admin-pages.php:43 includes/admin/plugins.php:57
197
  #: includes/admin/settings/contextual-help.php:87
198
- #: includes/admin/settings/register-settings.php:1279
199
  msgid "Extensions"
200
  msgstr ""
201
 
@@ -408,7 +409,7 @@ msgstr ""
408
 
409
  #: includes/admin/customers/class-customer-table.php:72
410
  #: includes/admin/payments/class-payments-table.php:274
411
- #: includes/admin/reporting/class-file-downloads-logs-list-table.php:152
412
  #: includes/admin/reporting/class-sales-logs-list-table.php:129
413
  msgid "Customer"
414
  msgstr ""
@@ -430,7 +431,8 @@ msgstr ""
430
  #: includes/admin/discounts/class-discount-codes-table.php:267
431
  #: includes/admin/payments/class-payments-table.php:367
432
  #: includes/admin/payments/class-payments-table.php:435
433
- #: includes/payments/functions.php:1596
 
434
  msgid "Delete"
435
  msgstr ""
436
 
@@ -447,11 +449,12 @@ msgstr ""
447
  #: includes/admin/reporting/class-export-customers.php:74
448
  #: includes/admin/reporting/export/class-batch-export-customers.php:42
449
  #: includes/admin/reporting/export/class-batch-export-downloads.php:43
450
- #: templates/shortcode-receipt.php:123
451
  msgid "Name"
452
  msgstr ""
453
 
454
  #: includes/admin/customers/class-customer-table.php:177
 
455
  msgid "Primary Email"
456
  msgstr ""
457
 
@@ -465,6 +468,7 @@ msgstr ""
465
 
466
  #: includes/admin/customers/class-customer-table.php:180
467
  #: includes/admin/reporting/export/class-batch-export-downloads.php:44
 
468
  msgid "Date Created"
469
  msgstr ""
470
 
@@ -511,7 +515,7 @@ msgid "An error has occured. Please try again."
511
  msgstr ""
512
 
513
  #: includes/admin/customers/customer-actions.php:207
514
- #: includes/user-functions.php:898
515
  msgid "Nonce verification failed."
516
  msgstr ""
517
 
@@ -552,7 +556,7 @@ msgid "Nonce verification failed"
552
  msgstr ""
553
 
554
  #: includes/admin/customers/customer-actions.php:311
555
- #: includes/shortcodes.php:956
556
  msgid "Email address %s removed by %s"
557
  msgstr ""
558
 
@@ -635,7 +639,7 @@ msgid "City"
635
  msgstr ""
636
 
637
  #: includes/admin/customers/customers.php:269
638
- #: includes/admin/settings/register-settings.php:2077
639
  #: includes/admin/tools.php:695 includes/checkout/template.php:435
640
  #: templates/shortcode-profile-editor.php:171
641
  msgid "State / Province"
@@ -659,6 +663,7 @@ msgid "Customer since %s"
659
  msgstr ""
660
 
661
  #: includes/admin/customers/customers.php:313
 
662
  msgid "User ID"
663
  msgstr ""
664
 
@@ -677,7 +682,7 @@ msgid "Update Customer"
677
  msgstr ""
678
 
679
  #: includes/admin/customers/customers.php:333
680
- #: includes/admin/customers/customers.php:615
681
  #: includes/admin/payments/view-order-details.php:651
682
  #: includes/admin/payments/view-order-details.php:671
683
  #: includes/admin/thickbox.php:132 includes/class-edd-html-elements.php:796
@@ -739,14 +744,14 @@ msgstr ""
739
  #: includes/admin/downloads/metabox.php:698
740
  #: includes/admin/downloads/metabox.php:823
741
  #: includes/admin/payments/view-order-details.php:490
742
- #: includes/admin/settings/register-settings.php:2080 includes/scripts.php:227
743
  #: templates/checkout_cart.php:57 templates/checkout_cart.php:75
744
  #: templates/shortcode-profile-editor.php:123
745
  msgid "Remove"
746
  msgstr ""
747
 
748
  #: includes/admin/customers/customers.php:416
749
- #: includes/checkout/template.php:182
750
  msgid "Email Address"
751
  msgstr ""
752
 
@@ -790,15 +795,15 @@ msgstr ""
790
  #: includes/admin/reporting/class-export-download-history.php:62
791
  #: includes/admin/reporting/class-export-payments.php:78
792
  #: includes/admin/reporting/class-export.php:67
793
- #: includes/admin/reporting/class-file-downloads-logs-list-table.php:156
794
  #: includes/admin/reporting/class-gateway-error-logs-list-table.php:131
795
  #: includes/admin/reporting/class-sales-logs-list-table.php:133
796
  #: includes/admin/reporting/export/class-batch-export-api-requests.php:46
797
  #: includes/admin/reporting/export/class-batch-export-file-downloads.php:41
798
  #: includes/admin/reporting/export/class-batch-export-payments.php:60
799
  #: includes/admin/reporting/export/class-batch-export-sales.php:49
800
- #: includes/admin/tools.php:587 templates/history-purchases.php:19
801
- #: templates/shortcode-receipt.php:59
802
  msgid "Date"
803
  msgstr ""
804
 
@@ -809,7 +814,7 @@ msgstr ""
809
  #: includes/admin/reporting/class-export-payments.php:80
810
  #: includes/admin/reporting/export/class-batch-export-downloads.php:48
811
  #: includes/admin/reporting/export/class-batch-export-payments.php:65
812
- #: includes/admin/tools.php:614
813
  msgid "Status"
814
  msgstr ""
815
 
@@ -834,46 +839,89 @@ msgstr ""
834
  msgid "No %s Found"
835
  msgstr ""
836
 
837
- #: includes/admin/customers/customers.php:528
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
838
  #: includes/admin/reporting/export/class-batch-export-downloads.php:56
839
  msgid "Notes"
840
  msgstr ""
841
 
842
- #: includes/admin/customers/customers.php:566
843
  msgid "No Customer Notes"
844
  msgstr ""
845
 
846
- #: includes/admin/customers/customers.php:599
847
  msgid "Are you sure you want to delete this customer?"
848
  msgstr ""
849
 
850
- #: includes/admin/customers/customers.php:604
851
  msgid "Delete all associated payments and records?"
852
  msgstr ""
853
 
854
- #: includes/admin/customers/customers.php:614
855
  msgid "Delete Customer"
856
  msgstr ""
857
 
858
- #: includes/admin/customers/customers.php:643 includes/admin/tools.php:153
859
  msgid "Recount Customer Stats"
860
  msgstr ""
861
 
862
- #: includes/admin/customers/customers.php:644
863
  msgid ""
864
  "Use this tool to recalculate the purchase count and total value of the "
865
  "customer."
866
  msgstr ""
867
 
868
- #: includes/admin/customers/customers.php:651 includes/admin/tools.php:140
869
  msgid "Recount Stats"
870
  msgstr ""
871
 
872
- #: includes/admin/customers/customers.php:681
873
  msgid "This customer's user account is pending verification."
874
  msgstr ""
875
 
876
- #: includes/admin/customers/customers.php:683
877
  msgid "Verify account."
878
  msgstr ""
879
 
@@ -1120,7 +1168,7 @@ msgstr ""
1120
 
1121
  #: includes/admin/discounts/class-discount-codes-table.php:125
1122
  #: includes/admin/payments/class-payments-table.php:247
1123
- #: includes/admin/reporting/class-file-downloads-logs-list-table.php:346
1124
  #: includes/admin/reporting/class-sales-logs-list-table.php:281
1125
  msgid "All"
1126
  msgstr ""
@@ -1205,12 +1253,13 @@ msgstr ""
1205
 
1206
  #: includes/admin/discounts/contextual-help.php:38
1207
  #: includes/admin/settings/contextual-help.php:42
1208
- #: includes/admin/settings/register-settings.php:1272
1209
- #: includes/admin/settings/register-settings.php:1327
1210
- #: includes/admin/settings/register-settings.php:1332
1211
- #: includes/admin/settings/register-settings.php:1336
1212
- #: includes/admin/settings/register-settings.php:1341
1213
- #: includes/admin/settings/register-settings.php:1344
 
1214
  #: includes/admin/tools.php:68
1215
  msgid "General"
1216
  msgstr ""
@@ -1906,32 +1955,32 @@ msgid "Completed"
1906
  msgstr ""
1907
 
1908
  #: includes/admin/payments/class-payments-table.php:249
1909
- #: includes/payments/functions.php:749
1910
  msgid "Pending"
1911
  msgstr ""
1912
 
1913
  #: includes/admin/payments/class-payments-table.php:250
1914
- #: includes/payments/functions.php:755
1915
  msgid "Processing"
1916
  msgstr ""
1917
 
1918
  #: includes/admin/payments/class-payments-table.php:251
1919
- #: includes/payments/functions.php:751
1920
  msgid "Refunded"
1921
  msgstr ""
1922
 
1923
  #: includes/admin/payments/class-payments-table.php:252
1924
- #: includes/payments/functions.php:754
1925
  msgid "Revoked"
1926
  msgstr ""
1927
 
1928
  #: includes/admin/payments/class-payments-table.php:253
1929
- #: includes/payments/functions.php:752
1930
  msgid "Failed"
1931
  msgstr ""
1932
 
1933
  #: includes/admin/payments/class-payments-table.php:254
1934
- #: includes/payments/functions.php:753
1935
  msgid "Abandoned"
1936
  msgstr ""
1937
 
@@ -2344,7 +2393,7 @@ msgid "Click \"Save Payment\" to create new customer"
2344
  msgstr ""
2345
 
2346
  #: includes/admin/payments/view-order-details.php:689
2347
- #: includes/checkout/template.php:347
2348
  msgid "Billing Address"
2349
  msgstr ""
2350
 
@@ -2391,7 +2440,7 @@ msgid "General Settings"
2391
  msgstr ""
2392
 
2393
  #: includes/admin/reporting/class-api-requests-logs-list-table.php:87
2394
- #: includes/admin/reporting/class-file-downloads-logs-list-table.php:150
2395
  #: includes/admin/reporting/class-gateway-error-logs-list-table.php:126
2396
  #: includes/admin/reporting/class-sales-logs-list-table.php:128
2397
  #: includes/admin/reporting/export/class-batch-export-api-requests.php:39
@@ -2513,11 +2562,12 @@ msgid "Downloaded by"
2513
  msgstr ""
2514
 
2515
  #: includes/admin/reporting/class-export-download-history.php:64
2516
- #: includes/admin/reporting/class-file-downloads-logs-list-table.php:155
2517
  #: includes/admin/reporting/export/class-batch-export-api-requests.php:41
2518
  #: includes/admin/reporting/export/class-batch-export-file-downloads.php:43
2519
  #: includes/admin/reporting/export/class-batch-export-payments.php:63
2520
- #: includes/admin/tools.php:542
 
2521
  msgid "IP Address"
2522
  msgstr ""
2523
 
@@ -2527,7 +2577,7 @@ msgid "Product"
2527
  msgstr ""
2528
 
2529
  #: includes/admin/reporting/class-export-download-history.php:66
2530
- #: includes/admin/reporting/class-file-downloads-logs-list-table.php:154
2531
  #: includes/admin/reporting/export/class-batch-export-file-downloads.php:45
2532
  msgid "File"
2533
  msgstr ""
@@ -2555,7 +2605,7 @@ msgstr ""
2555
 
2556
  #: includes/admin/reporting/class-export-payments.php:68
2557
  #: includes/admin/reporting/export/class-batch-export-payments.php:49
2558
- #: includes/admin/settings/register-settings.php:2076
2559
  #: includes/admin/tools.php:713 templates/shortcode-profile-editor.php:162
2560
  msgid "Country"
2561
  msgstr ""
@@ -2617,7 +2667,7 @@ msgstr ""
2617
  msgid "You do not have permission to export data."
2618
  msgstr ""
2619
 
2620
- #: includes/admin/reporting/class-file-downloads-logs-list-table.php:153
2621
  #: includes/admin/reporting/class-gateway-error-logs-list-table.php:127
2622
  #: includes/admin/reporting/class-sales-logs-list-table.php:132
2623
  #: includes/admin/reporting/export/class-batch-export-payments.php:39
@@ -2809,7 +2859,8 @@ msgstr ""
2809
 
2810
  #: includes/admin/reporting/export/class-batch-export-payments.php:42
2811
  #: includes/admin/reporting/export/class-batch-export-sales.php:41
2812
- #: includes/admin/tools.php:524
 
2813
  msgid "Customer ID"
2814
  msgstr ""
2815
 
@@ -2819,7 +2870,7 @@ msgstr ""
2819
 
2820
  #: includes/admin/reporting/export/class-batch-export-payments.php:62
2821
  #: includes/admin/settings/register-settings.php:352
2822
- #: includes/admin/settings/register-settings.php:1328
2823
  msgid "Currency"
2824
  msgstr ""
2825
 
@@ -2951,7 +3002,8 @@ msgid "Refresh Reports"
2951
  msgstr ""
2952
 
2953
  #: includes/admin/reporting/logs.php:144
2954
- #: includes/admin/settings/register-settings.php:1354
 
2955
  msgid "File Downloads"
2956
  msgstr ""
2957
 
@@ -2981,7 +3033,7 @@ msgstr ""
2981
 
2982
  #: includes/admin/reporting/reports.php:59
2983
  #: includes/admin/settings/contextual-help.php:71
2984
- #: includes/admin/settings/register-settings.php:1276
2985
  msgid "Taxes"
2986
  msgstr ""
2987
 
@@ -3128,7 +3180,7 @@ msgstr ""
3128
 
3129
  #: includes/admin/settings/contextual-help.php:48
3130
  #: includes/admin/settings/register-settings.php:420
3131
- #: includes/admin/settings/register-settings.php:1273
3132
  msgid "Payment Gateways"
3133
  msgstr ""
3134
 
@@ -3157,7 +3209,7 @@ msgid ""
3157
  msgstr ""
3158
 
3159
  #: includes/admin/settings/contextual-help.php:57
3160
- #: includes/admin/settings/register-settings.php:1274
3161
  msgid "Emails"
3162
  msgstr ""
3163
 
@@ -3177,7 +3229,7 @@ msgid ""
3177
  msgstr ""
3178
 
3179
  #: includes/admin/settings/contextual-help.php:65
3180
- #: includes/admin/settings/register-settings.php:1275
3181
  msgid "Styles"
3182
  msgstr ""
3183
 
@@ -3260,7 +3312,7 @@ msgid ""
3260
  msgstr ""
3261
 
3262
  #: includes/admin/settings/contextual-help.php:93
3263
- #: includes/admin/settings/register-settings.php:1351
3264
  msgid "Miscellaneous"
3265
  msgstr ""
3266
 
@@ -3306,7 +3358,6 @@ msgstr ""
3306
  #: includes/admin/settings/register-settings.php:285
3307
  #: includes/admin/settings/register-settings.php:294
3308
  #: includes/admin/settings/register-settings.php:305
3309
- #: includes/admin/settings/register-settings.php:909
3310
  msgid "Select a page"
3311
  msgstr ""
3312
 
@@ -3438,7 +3489,7 @@ msgid "The symbol (usually , or .) to separate decimal points."
3438
  msgstr ""
3439
 
3440
  #: includes/admin/settings/register-settings.php:388
3441
- #: includes/admin/settings/register-settings.php:1329
3442
  msgid "API"
3443
  msgstr ""
3444
 
@@ -4100,267 +4151,286 @@ msgid "A postfix to append to all sequential order numbers."
4100
  msgstr ""
4101
 
4102
  #: includes/admin/settings/register-settings.php:858
4103
- msgid "Terms and Privacy Policy"
4104
- msgstr ""
4105
-
4106
- #: includes/admin/settings/register-settings.php:861
4107
- msgid "Terms and Privacy Policy Settings"
4108
- msgstr ""
4109
-
4110
- #: includes/admin/settings/register-settings.php:862
4111
- msgid ""
4112
- "Depending on legal and regulatory requirements, it may be necessary for "
4113
- "your site to show checkboxes for Terms of Agreement and/or Privacy Policy."
4114
- msgstr ""
4115
-
4116
- #: includes/admin/settings/register-settings.php:866
4117
  msgid "Agree to Terms"
4118
  msgstr ""
4119
 
4120
- #: includes/admin/settings/register-settings.php:867
4121
  msgid ""
4122
  "Check this to show an agree to terms on the checkout that users must agree "
4123
  "to before purchasing."
4124
  msgstr ""
4125
 
4126
- #: includes/admin/settings/register-settings.php:872
4127
  msgid "Agree to Terms Label"
4128
  msgstr ""
4129
 
4130
- #: includes/admin/settings/register-settings.php:873
4131
  msgid "Label shown next to the agree to terms check box."
4132
  msgstr ""
4133
 
4134
- #: includes/admin/settings/register-settings.php:879
4135
  msgid "Agreement Text"
4136
  msgstr ""
4137
 
4138
- #: includes/admin/settings/register-settings.php:880
4139
  msgid "If Agree to Terms is checked, enter the agreement terms here."
4140
  msgstr ""
4141
 
4142
- #: includes/admin/settings/register-settings.php:885
4143
  msgid "Agree to Privacy Policy"
4144
  msgstr ""
4145
 
4146
- #: includes/admin/settings/register-settings.php:886
4147
  msgid ""
4148
- "Check this to show an agree to privacy policy on checkout that users must "
4149
  "agree to before purchasing."
4150
  msgstr ""
4151
 
4152
- #: includes/admin/settings/register-settings.php:891
4153
  msgid "Agree to Privacy Policy Label"
4154
  msgstr ""
4155
 
4156
- #: includes/admin/settings/register-settings.php:892
4157
- msgid "Label shown next to the agree to privacy policy check box."
4158
  msgstr ""
4159
 
4160
- #: includes/admin/settings/register-settings.php:898
4161
- msgid "Show the privacy policy on checkout"
4162
  msgstr ""
4163
 
4164
- #: includes/admin/settings/register-settings.php:899
4165
- msgid "Display your privacy policy on checkout."
4166
  msgstr ""
4167
 
4168
- #: includes/admin/settings/register-settings.php:904
4169
- msgid "Privacy Agreement Page"
4170
  msgstr ""
4171
 
4172
- #: includes/admin/settings/register-settings.php:905
 
 
 
 
4173
  msgid ""
4174
- "If Agree to Privacy Policy is checked, select a page for the Privacy "
4175
- "Agreement here."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4176
  msgstr ""
4177
 
4178
- #: includes/admin/settings/register-settings.php:918
4179
  msgid "Buy Now Disabled"
4180
  msgstr ""
4181
 
4182
- #: includes/admin/settings/register-settings.php:919
4183
  msgid ""
4184
  "Buy Now buttons are only available for stores that have a single supported "
4185
  "gateway active and that do not use taxes."
4186
  msgstr ""
4187
 
4188
- #: includes/admin/settings/register-settings.php:1022
4189
  msgid "Settings updated."
4190
  msgstr ""
4191
 
4192
- #: includes/admin/settings/register-settings.php:1166
4193
  msgid "Error setting default gateway. No gateways are enabled."
4194
  msgstr ""
4195
 
4196
- #: includes/admin/settings/register-settings.php:1179
4197
  msgid "%s could not be set as the default gateway. It must first be enabled."
4198
  msgstr ""
4199
 
4200
- #: includes/admin/settings/register-settings.php:1282
 
 
 
 
4201
  msgid "Licenses"
4202
  msgstr ""
4203
 
4204
- #: includes/admin/settings/register-settings.php:1285
4205
  msgid "Misc"
4206
  msgstr ""
4207
 
4208
- #: includes/admin/settings/register-settings.php:1333
4209
  #: includes/gateways/functions.php:25 includes/gateways/paypal-standard.php:33
4210
  msgid "PayPal Standard"
4211
  msgstr ""
4212
 
4213
- #: includes/admin/settings/register-settings.php:1337
4214
  msgid "Purchase Receipts"
4215
  msgstr ""
4216
 
4217
- #: includes/admin/settings/register-settings.php:1338
4218
  msgid "New Sale Notifications"
4219
  msgstr ""
4220
 
4221
- #: includes/admin/settings/register-settings.php:1347
4222
  msgid "Main"
4223
  msgstr ""
4224
 
4225
- #: includes/admin/settings/register-settings.php:1352 includes/install.php:92
4226
  #: templates/widget-cart-checkout.php:6 templates/widget-cart-empty.php:7
4227
  msgid "Checkout"
4228
  msgstr ""
4229
 
4230
- #: includes/admin/settings/register-settings.php:1353
4231
  msgid "Button Text"
4232
  msgstr ""
4233
 
4234
- #: includes/admin/settings/register-settings.php:1355
4235
  msgid "Accounting"
4236
  msgstr ""
4237
 
4238
- #: includes/admin/settings/register-settings.php:1356
4239
  msgid "Terms of Agreement"
4240
  msgstr ""
4241
 
4242
- #: includes/admin/settings/register-settings.php:1598
 
 
 
 
4243
  msgid ""
4244
  "Don't see what you need? More Payment Gateway options are available <a "
4245
  "href=\"%s\">here</a>."
4246
  msgstr ""
4247
 
4248
- #: includes/admin/settings/register-settings.php:1819
4249
  msgid "The callback function used for the %s setting is missing."
4250
  msgstr ""
4251
 
4252
- #: includes/admin/settings/register-settings.php:1977
4253
  msgid "Upload File"
4254
  msgstr ""
4255
 
4256
- #: includes/admin/settings/register-settings.php:2078
4257
  msgid "Country Wide"
4258
  msgstr ""
4259
 
4260
- #: includes/admin/settings/register-settings.php:2079
4261
  msgid "Rate"
4262
  msgstr ""
4263
 
4264
- #: includes/admin/settings/register-settings.php:2079
4265
  msgid ""
4266
  "<strong>Regional tax rates: </strong>When a customer enters an address on "
4267
  "checkout that matches the specified region for this tax rate, the cart tax "
4268
  "will adjust automatically. Enter a percentage, such as 6.5 for 6.5%."
4269
  msgstr ""
4270
 
4271
- #: includes/admin/settings/register-settings.php:2096
4272
- #: includes/admin/settings/register-settings.php:2141
4273
  msgid "Choose a country"
4274
  msgstr ""
4275
 
4276
- #: includes/admin/settings/register-settings.php:2111
4277
  msgid "Choose a state"
4278
  msgstr ""
4279
 
4280
- #: includes/admin/settings/register-settings.php:2123
4281
- #: includes/admin/settings/register-settings.php:2151
4282
  msgid "Apply to whole country"
4283
  msgstr ""
4284
 
4285
- #: includes/admin/settings/register-settings.php:2126
4286
- #: includes/admin/settings/register-settings.php:2154
4287
  msgid "Remove Rate"
4288
  msgstr ""
4289
 
4290
- #: includes/admin/settings/register-settings.php:2159
4291
  msgid "Add Tax Rate"
4292
  msgstr ""
4293
 
4294
- #: includes/admin/settings/register-settings.php:2212
4295
  msgid ""
4296
  "Your license key expired on %s. Please <a href=\"%s\" "
4297
  "target=\"_blank\">renew your license key</a>."
4298
  msgstr ""
4299
 
4300
- #: includes/admin/settings/register-settings.php:2225
4301
  msgid ""
4302
  "Your license key has been disabled. Please <a href=\"%s\" "
4303
  "target=\"_blank\">contact support</a> for more information."
4304
  msgstr ""
4305
 
4306
- #: includes/admin/settings/register-settings.php:2237
4307
  msgid ""
4308
  "Invalid license. Please <a href=\"%s\" target=\"_blank\">visit your account "
4309
  "page</a> and verify it."
4310
  msgstr ""
4311
 
4312
- #: includes/admin/settings/register-settings.php:2250
4313
  msgid ""
4314
  "Your %s is not active for this URL. Please <a href=\"%s\" "
4315
  "target=\"_blank\">visit your account page</a> to manage your license key "
4316
  "URLs."
4317
  msgstr ""
4318
 
4319
- #: includes/admin/settings/register-settings.php:2262
4320
  msgid "This appears to be an invalid license key for %s."
4321
  msgstr ""
4322
 
4323
- #: includes/admin/settings/register-settings.php:2271
4324
  msgid ""
4325
  "Your license key has reached its activation limit. <a href=\"%s\">View "
4326
  "possible upgrades</a> now."
4327
  msgstr ""
4328
 
4329
- #: includes/admin/settings/register-settings.php:2280
4330
  msgid ""
4331
  "The key you entered belongs to a bundle, please use the product specific "
4332
  "license key."
4333
  msgstr ""
4334
 
4335
- #: includes/admin/settings/register-settings.php:2288
4336
  msgid "unknown_error"
4337
  msgstr ""
4338
 
4339
- #: includes/admin/settings/register-settings.php:2289
4340
  msgid ""
4341
  "There was an error with this license key: %s. Please <a href=\"%s\">contact "
4342
  "our support team</a>."
4343
  msgstr ""
4344
 
4345
- #: includes/admin/settings/register-settings.php:2309
4346
  msgid "License key never expires."
4347
  msgstr ""
4348
 
4349
- #: includes/admin/settings/register-settings.php:2316
4350
  msgid ""
4351
  "Your license key expires soon! It expires on %s. <a href=\"%s\" "
4352
  "target=\"_blank\">Renew your license key</a>."
4353
  msgstr ""
4354
 
4355
- #: includes/admin/settings/register-settings.php:2326
4356
  msgid "Your license key expires on %s."
4357
  msgstr ""
4358
 
4359
- #: includes/admin/settings/register-settings.php:2344
4360
  msgid "To receive updates, please enter your valid %s license key."
4361
  msgstr ""
4362
 
4363
- #: includes/admin/settings/register-settings.php:2357
4364
  msgid "Deactivate License"
4365
  msgstr ""
4366
 
@@ -4825,6 +4895,14 @@ msgstr ""
4825
  msgid "Do not allow"
4826
  msgstr ""
4827
 
 
 
 
 
 
 
 
 
4828
  #: includes/admin/upgrades/upgrade-functions.php:78
4829
  msgid "The Payment History needs to be updated. %s"
4830
  msgstr ""
@@ -4895,37 +4973,85 @@ msgid ""
4895
  "href=\"%s\">here</a> to start the upgrade."
4896
  msgstr ""
4897
 
4898
- #: includes/admin/upgrades/upgrade-functions.php:205
4899
- #: includes/admin/upgrades/upgrade-functions.php:521
4900
- #: includes/admin/upgrades/upgrade-functions.php:603
4901
- #: includes/admin/upgrades/upgrade-functions.php:714
4902
- #: includes/admin/upgrades/upgrade-functions.php:811
4903
- #: includes/admin/upgrades/upgrade-functions.php:885
4904
- #: includes/admin/upgrades/upgrade-functions.php:1013
4905
- #: includes/admin/upgrades/upgrade-functions.php:1098
 
 
 
 
 
 
4906
  msgid "You do not have permission to do shop upgrades"
4907
  msgstr ""
4908
 
4909
- #: includes/admin/upgrades/upgrade-functions.php:374 includes/install.php:129
4910
  msgid "Transaction Failed"
4911
  msgstr ""
4912
 
4913
- #: includes/admin/upgrades/upgrade-functions.php:375 includes/install.php:130
4914
  msgid "Your transaction failed, please try again or contact site support."
4915
  msgstr ""
4916
 
4917
- #: includes/admin/upgrades/upgrades.php:47
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4918
  msgid "Easy Digital Downloads - Upgrades"
4919
  msgstr ""
4920
 
4921
- #: includes/admin/upgrades/upgrades.php:52
4922
- #: includes/admin/upgrades/upgrades.php:66
4923
  msgid ""
4924
  "The upgrade process has started, please be patient. This could take several "
4925
  "minutes. You will be automatically redirected when the upgrade is finished."
4926
  msgstr ""
4927
 
4928
- #: includes/admin/upgrades/upgrades.php:55
4929
  msgid "Step %d of approximately %d running"
4930
  msgstr ""
4931
 
@@ -5000,27 +5126,27 @@ msgstr ""
5000
  msgid "No download logs found!"
5001
  msgstr ""
5002
 
5003
- #: includes/api/class-edd-api.php:1932 includes/user-functions.php:1050
5004
  msgid "Easy Digital Downloads API Keys"
5005
  msgstr ""
5006
 
5007
- #: includes/api/class-edd-api.php:1941 includes/user-functions.php:1055
5008
  msgid "Generate API Key"
5009
  msgstr ""
5010
 
5011
- #: includes/api/class-edd-api.php:1943 includes/user-functions.php:1057
5012
  msgid "Public key:"
5013
  msgstr ""
5014
 
5015
- #: includes/api/class-edd-api.php:1944 includes/user-functions.php:1058
5016
  msgid "Secret key:"
5017
  msgstr ""
5018
 
5019
- #: includes/api/class-edd-api.php:1945 includes/user-functions.php:1059
5020
  msgid "Token:"
5021
  msgstr ""
5022
 
5023
- #: includes/api/class-edd-api.php:1947 includes/user-functions.php:1061
5024
  msgid "Revoke API Keys"
5025
  msgstr ""
5026
 
@@ -5497,8 +5623,8 @@ msgstr ""
5497
  msgid "Customer User ID: %s"
5498
  msgstr ""
5499
 
5500
- #: includes/class-edd-cli.php:334 includes/user-functions.php:558
5501
- #: includes/user-functions.php:570
5502
  msgid "Username: %s"
5503
  msgstr ""
5504
 
@@ -5635,11 +5761,11 @@ msgstr ""
5635
  msgid "Single Use: %s"
5636
  msgstr ""
5637
 
5638
- #: includes/class-edd-cli.php:506
5639
  msgid "No action specified, did you mean"
5640
  msgstr ""
5641
 
5642
- #: includes/class-edd-cli.php:508
5643
  msgid "Invalid action specified, did you mean"
5644
  msgstr ""
5645
 
@@ -6901,11 +7027,11 @@ msgstr ""
6901
  msgid "Payment recovery processed"
6902
  msgstr ""
6903
 
6904
- #: includes/payments/functions.php:750
6905
  msgid "Complete"
6906
  msgstr ""
6907
 
6908
- #: includes/payments/functions.php:1581
6909
  msgid "EDD Bot"
6910
  msgstr ""
6911
 
@@ -7207,6 +7333,207 @@ msgid_plural "%1$s %3$s restored from the Trash."
7207
  msgstr[0] ""
7208
  msgstr[1] ""
7209
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7210
  #: includes/process-download.php:146
7211
  msgid "Error downloading file. Please contact support."
7212
  msgstr ""
@@ -7503,31 +7830,31 @@ msgstr ""
7503
  msgid "Purchase All Items"
7504
  msgstr ""
7505
 
7506
- #: includes/shortcodes.php:693
7507
  msgid "Sorry, trouble retrieving payment receipt."
7508
  msgstr ""
7509
 
7510
- #: includes/shortcodes.php:728
7511
  msgid "You must be logged in to view this payment receipt."
7512
  msgstr ""
7513
 
7514
- #: includes/shortcodes.php:740
7515
  msgid "Receipt could not be retrieved, your purchase session has expired."
7516
  msgstr ""
7517
 
7518
- #: includes/shortcodes.php:870
7519
  msgid "The passwords you entered do not match. Please try again."
7520
  msgstr ""
7521
 
7522
- #: includes/shortcodes.php:880
7523
  msgid "The email you entered is invalid. Please enter a valid email."
7524
  msgstr ""
7525
 
7526
- #: includes/shortcodes.php:885
7527
  msgid "The email you entered belongs to another user. Please use another."
7528
  msgstr ""
7529
 
7530
- #: includes/shortcodes.php:960
7531
  msgid "Error removing email address from profile. Please try again later."
7532
  msgstr ""
7533
 
@@ -7599,51 +7926,51 @@ msgstr ""
7599
  msgid "Plain Text"
7600
  msgstr ""
7601
 
7602
- #: includes/user-functions.php:556
7603
  msgid "[%s] New User Registration"
7604
  msgstr ""
7605
 
7606
- #: includes/user-functions.php:557
7607
  msgid "New user registration"
7608
  msgstr ""
7609
 
7610
- #: includes/user-functions.php:559
7611
  msgid "E-mail: %s"
7612
  msgstr ""
7613
 
7614
- #: includes/user-functions.php:568
7615
  msgid "[%s] Your username and password"
7616
  msgstr ""
7617
 
7618
- #: includes/user-functions.php:569
7619
  msgid "Your account info"
7620
  msgstr ""
7621
 
7622
- #: includes/user-functions.php:573
7623
  msgid "Password entered at checkout"
7624
  msgstr ""
7625
 
7626
- #: includes/user-functions.php:575
7627
  msgid "Password entered at registration"
7628
  msgstr ""
7629
 
7630
- #: includes/user-functions.php:578
7631
  msgid "Password: %s"
7632
  msgstr ""
7633
 
7634
- #: includes/user-functions.php:583
7635
  msgid "Click here to log in"
7636
  msgstr ""
7637
 
7638
- #: includes/user-functions.php:587
7639
  msgid "To log in, visit: %s"
7640
  msgstr ""
7641
 
7642
- #: includes/user-functions.php:741 includes/user-functions.php:742
7643
  msgid "Verify your account"
7644
  msgstr ""
7645
 
7646
- #: includes/user-functions.php:744
7647
  msgid ""
7648
  "Hello %s,\n"
7649
  "\n"
@@ -7653,33 +7980,33 @@ msgid ""
7653
  "Link missing? Visit the following URL: %s"
7654
  msgstr ""
7655
 
7656
- #: includes/user-functions.php:869
7657
  msgid ""
7658
  "Sorry but your account verification link has expired. <a href=\"%s\">Click "
7659
  "here</a> to request a new verification URL."
7660
  msgstr ""
7661
 
7662
- #: includes/user-functions.php:902
7663
  msgid "You must be logged in to verify your account."
7664
  msgstr ""
7665
 
7666
- #: includes/user-functions.php:902 includes/user-functions.php:906
7667
  msgid "Notice"
7668
  msgstr ""
7669
 
7670
- #: includes/user-functions.php:906
7671
  msgid "Your account has already been verified."
7672
  msgstr ""
7673
 
7674
- #: includes/user-functions.php:951
7675
  msgid "Invalid verification token provided."
7676
  msgstr ""
7677
 
7678
- #: includes/user-functions.php:1073
7679
  msgid "Easy Digital Downloads <a href=\"%s\">iOS App</a>"
7680
  msgstr ""
7681
 
7682
- #: includes/user-functions.php:1080
7683
  msgid "Add to iOS App"
7684
  msgstr ""
7685
 
@@ -8058,6 +8385,13 @@ msgctxt "text shown on the Add to Cart Button when the product is already in the
8058
  msgid "Checkout"
8059
  msgstr ""
8060
 
 
 
 
 
 
 
 
8061
  #: includes/checkout/template.php:738
8062
  msgctxt "Entering a discount code"
8063
  msgid "Click to enter it"
@@ -8098,7 +8432,7 @@ msgctxt "download post type name"
8098
  msgid "%2$s"
8099
  msgstr ""
8100
 
8101
- #: includes/shortcodes.php:646
8102
  msgctxt "download post type name"
8103
  msgid "No %s found"
8104
  msgstr ""
2
  # This file is distributed under the same license as the Easy Digital Downloads package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Easy Digital Downloads 2.9.2\n"
6
  "Report-Msgid-Bugs-To: https://easydigitaldownloads.com/\n"
7
+ "POT-Creation-Date: 2018-05-24 22:51:15+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
79
  #: includes/admin/tools/class-edd-tools-recount-store-earnings.php:153
80
  #: includes/admin/tools/class-edd-tools-reset-stats.php:179
81
  #: includes/admin/tools.php:1027 includes/admin/tools.php:1033
82
+ #: includes/admin/upgrades/classes/class-file-download-log-migration.php:151
83
+ #: includes/admin/upgrades/upgrade-functions.php:212
84
+ #: includes/admin/upgrades/upgrade-functions.php:528
85
+ #: includes/admin/upgrades/upgrade-functions.php:610
86
+ #: includes/admin/upgrades/upgrade-functions.php:721
87
+ #: includes/admin/upgrades/upgrade-functions.php:818
88
+ #: includes/admin/upgrades/upgrade-functions.php:892
89
+ #: includes/admin/upgrades/upgrade-functions.php:1020
90
+ #: includes/admin/upgrades/upgrade-functions.php:1105
91
  #: includes/api/class-edd-api.php:1967 includes/api/class-edd-api.php:1972
92
  #: includes/api/class-edd-api.php:1984 includes/api/class-edd-api.php:1986
93
  #: includes/cart/class-edd-cart.php:1423 includes/cart/class-edd-cart.php:1437
98
  #: includes/error-tracking.php:40 includes/gateways/functions.php:221
99
  #: includes/gateways/manual.php:33 includes/gateways/paypal-standard.php:168
100
  #: includes/process-download.php:293 includes/process-download.php:881
101
+ #: includes/query-filters.php:48 includes/user-functions.php:891
102
+ #: includes/user-functions.php:916 includes/user-functions.php:969
103
  msgid "Error"
104
  msgstr ""
105
 
186
  msgid "Easy Digital Downloads Info and Tools"
187
  msgstr ""
188
 
189
+ #: includes/admin/admin-pages.php:42 includes/admin/customers/customers.php:720
190
  msgid "Tools"
191
  msgstr ""
192
 
196
 
197
  #: includes/admin/admin-pages.php:43 includes/admin/plugins.php:57
198
  #: includes/admin/settings/contextual-help.php:87
199
+ #: includes/admin/settings/register-settings.php:1329
200
  msgid "Extensions"
201
  msgstr ""
202
 
409
 
410
  #: includes/admin/customers/class-customer-table.php:72
411
  #: includes/admin/payments/class-payments-table.php:274
412
+ #: includes/admin/reporting/class-file-downloads-logs-list-table.php:153
413
  #: includes/admin/reporting/class-sales-logs-list-table.php:129
414
  msgid "Customer"
415
  msgstr ""
431
  #: includes/admin/discounts/class-discount-codes-table.php:267
432
  #: includes/admin/payments/class-payments-table.php:367
433
  #: includes/admin/payments/class-payments-table.php:435
434
+ #: includes/admin/settings/register-settings.php:927
435
+ #: includes/payments/functions.php:1618
436
  msgid "Delete"
437
  msgstr ""
438
 
449
  #: includes/admin/reporting/class-export-customers.php:74
450
  #: includes/admin/reporting/export/class-batch-export-customers.php:42
451
  #: includes/admin/reporting/export/class-batch-export-downloads.php:43
452
+ #: includes/privacy-functions.php:589 templates/shortcode-receipt.php:123
453
  msgid "Name"
454
  msgstr ""
455
 
456
  #: includes/admin/customers/class-customer-table.php:177
457
+ #: includes/privacy-functions.php:585
458
  msgid "Primary Email"
459
  msgstr ""
460
 
468
 
469
  #: includes/admin/customers/class-customer-table.php:180
470
  #: includes/admin/reporting/export/class-batch-export-downloads.php:44
471
+ #: includes/privacy-functions.php:593
472
  msgid "Date Created"
473
  msgstr ""
474
 
515
  msgstr ""
516
 
517
  #: includes/admin/customers/customer-actions.php:207
518
+ #: includes/user-functions.php:916
519
  msgid "Nonce verification failed."
520
  msgstr ""
521
 
556
  msgstr ""
557
 
558
  #: includes/admin/customers/customer-actions.php:311
559
+ #: includes/shortcodes.php:962
560
  msgid "Email address %s removed by %s"
561
  msgstr ""
562
 
639
  msgstr ""
640
 
641
  #: includes/admin/customers/customers.php:269
642
+ #: includes/admin/settings/register-settings.php:2131
643
  #: includes/admin/tools.php:695 includes/checkout/template.php:435
644
  #: templates/shortcode-profile-editor.php:171
645
  msgid "State / Province"
663
  msgstr ""
664
 
665
  #: includes/admin/customers/customers.php:313
666
+ #: includes/privacy-functions.php:857
667
  msgid "User ID"
668
  msgstr ""
669
 
682
  msgstr ""
683
 
684
  #: includes/admin/customers/customers.php:333
685
+ #: includes/admin/customers/customers.php:695
686
  #: includes/admin/payments/view-order-details.php:651
687
  #: includes/admin/payments/view-order-details.php:671
688
  #: includes/admin/thickbox.php:132 includes/class-edd-html-elements.php:796
744
  #: includes/admin/downloads/metabox.php:698
745
  #: includes/admin/downloads/metabox.php:823
746
  #: includes/admin/payments/view-order-details.php:490
747
+ #: includes/admin/settings/register-settings.php:2134 includes/scripts.php:227
748
  #: templates/checkout_cart.php:57 templates/checkout_cart.php:75
749
  #: templates/shortcode-profile-editor.php:123
750
  msgid "Remove"
751
  msgstr ""
752
 
753
  #: includes/admin/customers/customers.php:416
754
+ #: includes/checkout/template.php:182 includes/privacy-functions.php:754
755
  msgid "Email Address"
756
  msgstr ""
757
 
795
  #: includes/admin/reporting/class-export-download-history.php:62
796
  #: includes/admin/reporting/class-export-payments.php:78
797
  #: includes/admin/reporting/class-export.php:67
798
+ #: includes/admin/reporting/class-file-downloads-logs-list-table.php:157
799
  #: includes/admin/reporting/class-gateway-error-logs-list-table.php:131
800
  #: includes/admin/reporting/class-sales-logs-list-table.php:133
801
  #: includes/admin/reporting/export/class-batch-export-api-requests.php:46
802
  #: includes/admin/reporting/export/class-batch-export-file-downloads.php:41
803
  #: includes/admin/reporting/export/class-batch-export-payments.php:60
804
  #: includes/admin/reporting/export/class-batch-export-sales.php:49
805
+ #: includes/admin/tools.php:587 includes/privacy-functions.php:932
806
+ #: templates/history-purchases.php:19 templates/shortcode-receipt.php:59
807
  msgid "Date"
808
  msgstr ""
809
 
814
  #: includes/admin/reporting/class-export-payments.php:80
815
  #: includes/admin/reporting/export/class-batch-export-downloads.php:48
816
  #: includes/admin/reporting/export/class-batch-export-payments.php:65
817
+ #: includes/admin/tools.php:614 includes/privacy-functions.php:766
818
  msgid "Status"
819
  msgstr ""
820
 
839
  msgid "No %s Found"
840
  msgstr ""
841
 
842
+ #: includes/admin/customers/customers.php:564
843
+ msgid "Agreements"
844
+ msgstr ""
845
+
846
+ #: includes/admin/customers/customers.php:567
847
+ msgid "Last Agreed to Terms"
848
+ msgstr ""
849
+
850
+ #: includes/admin/customers/customers.php:571
851
+ #: includes/admin/customers/customers.php:592
852
+ msgid "Previous Agreement Dates"
853
+ msgstr ""
854
+
855
+ #: includes/admin/customers/customers.php:576
856
+ #: includes/admin/customers/customers.php:597
857
+ msgid "No date found."
858
+ msgstr ""
859
+
860
+ #: includes/admin/customers/customers.php:580
861
+ #: includes/admin/customers/customers.php:601
862
+ msgid "Estimated Privacy Policy Date"
863
+ msgstr ""
864
+
865
+ #: includes/admin/customers/customers.php:580
866
+ msgid ""
867
+ "This customer made a purchase prior to agreement dates being logged, this "
868
+ "is the date of their last purchase. If your site was displaying the "
869
+ "agreement checkbox at that time, this is our best estimate as to when they "
870
+ "last agreed to your terms."
871
+ msgstr ""
872
+
873
+ #: includes/admin/customers/customers.php:588
874
+ msgid "Last Agreed to Privacy Policy"
875
+ msgstr ""
876
+
877
+ #: includes/admin/customers/customers.php:601
878
+ msgid ""
879
+ "This customer made a purchase prior to privacy policy dates being logged, "
880
+ "this is the date of their last purchase. If your site was displaying the "
881
+ "privacy policy checkbox at that time, this is our best estimate as to when "
882
+ "they last agreed to your privacy policy."
883
+ msgstr ""
884
+
885
+ #: includes/admin/customers/customers.php:608
886
  #: includes/admin/reporting/export/class-batch-export-downloads.php:56
887
  msgid "Notes"
888
  msgstr ""
889
 
890
+ #: includes/admin/customers/customers.php:646
891
  msgid "No Customer Notes"
892
  msgstr ""
893
 
894
+ #: includes/admin/customers/customers.php:679
895
  msgid "Are you sure you want to delete this customer?"
896
  msgstr ""
897
 
898
+ #: includes/admin/customers/customers.php:684
899
  msgid "Delete all associated payments and records?"
900
  msgstr ""
901
 
902
+ #: includes/admin/customers/customers.php:694
903
  msgid "Delete Customer"
904
  msgstr ""
905
 
906
+ #: includes/admin/customers/customers.php:723 includes/admin/tools.php:153
907
  msgid "Recount Customer Stats"
908
  msgstr ""
909
 
910
+ #: includes/admin/customers/customers.php:724
911
  msgid ""
912
  "Use this tool to recalculate the purchase count and total value of the "
913
  "customer."
914
  msgstr ""
915
 
916
+ #: includes/admin/customers/customers.php:731 includes/admin/tools.php:140
917
  msgid "Recount Stats"
918
  msgstr ""
919
 
920
+ #: includes/admin/customers/customers.php:761
921
  msgid "This customer's user account is pending verification."
922
  msgstr ""
923
 
924
+ #: includes/admin/customers/customers.php:763
925
  msgid "Verify account."
926
  msgstr ""
927
 
1168
 
1169
  #: includes/admin/discounts/class-discount-codes-table.php:125
1170
  #: includes/admin/payments/class-payments-table.php:247
1171
+ #: includes/admin/reporting/class-file-downloads-logs-list-table.php:320
1172
  #: includes/admin/reporting/class-sales-logs-list-table.php:281
1173
  msgid "All"
1174
  msgstr ""
1253
 
1254
  #: includes/admin/discounts/contextual-help.php:38
1255
  #: includes/admin/settings/contextual-help.php:42
1256
+ #: includes/admin/settings/register-settings.php:1321
1257
+ #: includes/admin/settings/register-settings.php:1377
1258
+ #: includes/admin/settings/register-settings.php:1382
1259
+ #: includes/admin/settings/register-settings.php:1386
1260
+ #: includes/admin/settings/register-settings.php:1391
1261
+ #: includes/admin/settings/register-settings.php:1394
1262
+ #: includes/admin/settings/register-settings.php:1409
1263
  #: includes/admin/tools.php:68
1264
  msgid "General"
1265
  msgstr ""
1955
  msgstr ""
1956
 
1957
  #: includes/admin/payments/class-payments-table.php:249
1958
+ #: includes/payments/functions.php:771
1959
  msgid "Pending"
1960
  msgstr ""
1961
 
1962
  #: includes/admin/payments/class-payments-table.php:250
1963
+ #: includes/payments/functions.php:777
1964
  msgid "Processing"
1965
  msgstr ""
1966
 
1967
  #: includes/admin/payments/class-payments-table.php:251
1968
+ #: includes/payments/functions.php:773
1969
  msgid "Refunded"
1970
  msgstr ""
1971
 
1972
  #: includes/admin/payments/class-payments-table.php:252
1973
+ #: includes/payments/functions.php:776
1974
  msgid "Revoked"
1975
  msgstr ""
1976
 
1977
  #: includes/admin/payments/class-payments-table.php:253
1978
+ #: includes/payments/functions.php:774
1979
  msgid "Failed"
1980
  msgstr ""
1981
 
1982
  #: includes/admin/payments/class-payments-table.php:254
1983
+ #: includes/payments/functions.php:775
1984
  msgid "Abandoned"
1985
  msgstr ""
1986
 
2393
  msgstr ""
2394
 
2395
  #: includes/admin/payments/view-order-details.php:689
2396
+ #: includes/checkout/template.php:347 includes/privacy-functions.php:758
2397
  msgid "Billing Address"
2398
  msgstr ""
2399
 
2440
  msgstr ""
2441
 
2442
  #: includes/admin/reporting/class-api-requests-logs-list-table.php:87
2443
+ #: includes/admin/reporting/class-file-downloads-logs-list-table.php:151
2444
  #: includes/admin/reporting/class-gateway-error-logs-list-table.php:126
2445
  #: includes/admin/reporting/class-sales-logs-list-table.php:128
2446
  #: includes/admin/reporting/export/class-batch-export-api-requests.php:39
2562
  msgstr ""
2563
 
2564
  #: includes/admin/reporting/class-export-download-history.php:64
2565
+ #: includes/admin/reporting/class-file-downloads-logs-list-table.php:156
2566
  #: includes/admin/reporting/export/class-batch-export-api-requests.php:41
2567
  #: includes/admin/reporting/export/class-batch-export-file-downloads.php:43
2568
  #: includes/admin/reporting/export/class-batch-export-payments.php:63
2569
+ #: includes/admin/tools.php:542 includes/privacy-functions.php:762
2570
+ #: includes/privacy-functions.php:861 includes/privacy-functions.php:940
2571
  msgid "IP Address"
2572
  msgstr ""
2573
 
2577
  msgstr ""
2578
 
2579
  #: includes/admin/reporting/class-export-download-history.php:66
2580
+ #: includes/admin/reporting/class-file-downloads-logs-list-table.php:155
2581
  #: includes/admin/reporting/export/class-batch-export-file-downloads.php:45
2582
  msgid "File"
2583
  msgstr ""
2605
 
2606
  #: includes/admin/reporting/class-export-payments.php:68
2607
  #: includes/admin/reporting/export/class-batch-export-payments.php:49
2608
+ #: includes/admin/settings/register-settings.php:2130
2609
  #: includes/admin/tools.php:713 templates/shortcode-profile-editor.php:162
2610
  msgid "Country"
2611
  msgstr ""
2667
  msgid "You do not have permission to export data."
2668
  msgstr ""
2669
 
2670
+ #: includes/admin/reporting/class-file-downloads-logs-list-table.php:154
2671
  #: includes/admin/reporting/class-gateway-error-logs-list-table.php:127
2672
  #: includes/admin/reporting/class-sales-logs-list-table.php:132
2673
  #: includes/admin/reporting/export/class-batch-export-payments.php:39
2859
 
2860
  #: includes/admin/reporting/export/class-batch-export-payments.php:42
2861
  #: includes/admin/reporting/export/class-batch-export-sales.php:41
2862
+ #: includes/admin/tools.php:524 includes/privacy-functions.php:581
2863
+ #: includes/privacy-functions.php:853
2864
  msgid "Customer ID"
2865
  msgstr ""
2866
 
2870
 
2871
  #: includes/admin/reporting/export/class-batch-export-payments.php:62
2872
  #: includes/admin/settings/register-settings.php:352
2873
+ #: includes/admin/settings/register-settings.php:1378
2874
  msgid "Currency"
2875
  msgstr ""
2876
 
3002
  msgstr ""
3003
 
3004
  #: includes/admin/reporting/logs.php:144
3005
+ #: includes/admin/settings/register-settings.php:1404
3006
+ #: includes/privacy-functions.php:544
3007
  msgid "File Downloads"
3008
  msgstr ""
3009
 
3033
 
3034
  #: includes/admin/reporting/reports.php:59
3035
  #: includes/admin/settings/contextual-help.php:71
3036
+ #: includes/admin/settings/register-settings.php:1325
3037
  msgid "Taxes"
3038
  msgstr ""
3039
 
3180
 
3181
  #: includes/admin/settings/contextual-help.php:48
3182
  #: includes/admin/settings/register-settings.php:420
3183
+ #: includes/admin/settings/register-settings.php:1322
3184
  msgid "Payment Gateways"
3185
  msgstr ""
3186
 
3209
  msgstr ""
3210
 
3211
  #: includes/admin/settings/contextual-help.php:57
3212
+ #: includes/admin/settings/register-settings.php:1323
3213
  msgid "Emails"
3214
  msgstr ""
3215
 
3229
  msgstr ""
3230
 
3231
  #: includes/admin/settings/contextual-help.php:65
3232
+ #: includes/admin/settings/register-settings.php:1324
3233
  msgid "Styles"
3234
  msgstr ""
3235
 
3312
  msgstr ""
3313
 
3314
  #: includes/admin/settings/contextual-help.php:93
3315
+ #: includes/admin/settings/register-settings.php:1401
3316
  msgid "Miscellaneous"
3317
  msgstr ""
3318
 
3358
  #: includes/admin/settings/register-settings.php:285
3359
  #: includes/admin/settings/register-settings.php:294
3360
  #: includes/admin/settings/register-settings.php:305
 
3361
  msgid "Select a page"
3362
  msgstr ""
3363
 
3489
  msgstr ""
3490
 
3491
  #: includes/admin/settings/register-settings.php:388
3492
+ #: includes/admin/settings/register-settings.php:1379
3493
  msgid "API"
3494
  msgstr ""
3495
 
4151
  msgstr ""
4152
 
4153
  #: includes/admin/settings/register-settings.php:858
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4154
  msgid "Agree to Terms"
4155
  msgstr ""
4156
 
4157
+ #: includes/admin/settings/register-settings.php:859
4158
  msgid ""
4159
  "Check this to show an agree to terms on the checkout that users must agree "
4160
  "to before purchasing."
4161
  msgstr ""
4162
 
4163
+ #: includes/admin/settings/register-settings.php:864
4164
  msgid "Agree to Terms Label"
4165
  msgstr ""
4166
 
4167
+ #: includes/admin/settings/register-settings.php:865
4168
  msgid "Label shown next to the agree to terms check box."
4169
  msgstr ""
4170
 
4171
+ #: includes/admin/settings/register-settings.php:871
4172
  msgid "Agreement Text"
4173
  msgstr ""
4174
 
4175
+ #: includes/admin/settings/register-settings.php:872
4176
  msgid "If Agree to Terms is checked, enter the agreement terms here."
4177
  msgstr ""
4178
 
4179
+ #: includes/admin/settings/register-settings.php:883
4180
  msgid "Agree to Privacy Policy"
4181
  msgstr ""
4182
 
4183
+ #: includes/admin/settings/register-settings.php:884
4184
  msgid ""
4185
+ "Check this to show an agree to Privacy Policy on checkout that users must "
4186
  "agree to before purchasing."
4187
  msgstr ""
4188
 
4189
+ #: includes/admin/settings/register-settings.php:889
4190
  msgid "Agree to Privacy Policy Label"
4191
  msgstr ""
4192
 
4193
+ #: includes/admin/settings/register-settings.php:890
4194
+ msgid "Label shown next to the agree to Privacy Policy checkbox."
4195
  msgstr ""
4196
 
4197
+ #: includes/admin/settings/register-settings.php:896
4198
+ msgid "Show the Privacy Policy on checkout"
4199
  msgstr ""
4200
 
4201
+ #: includes/admin/settings/register-settings.php:897
4202
+ msgid "Display your Privacy Policy on checkout."
4203
  msgstr ""
4204
 
4205
+ #: includes/admin/settings/register-settings.php:897
4206
+ msgid "Set your Privacy Policy here"
4207
  msgstr ""
4208
 
4209
+ #: includes/admin/settings/register-settings.php:910
4210
+ msgid "Payment Status Actions"
4211
+ msgstr ""
4212
+
4213
+ #: includes/admin/settings/register-settings.php:912
4214
  msgid ""
4215
+ "When a user requests to be anonymized or removed from a site, these are the "
4216
+ "actions that will be taken on payments associated with their customer, by "
4217
+ "status."
4218
+ msgstr ""
4219
+
4220
+ #: includes/admin/settings/register-settings.php:913
4221
+ msgid "What settings should I use?"
4222
+ msgstr ""
4223
+
4224
+ #: includes/admin/settings/register-settings.php:914
4225
+ msgid ""
4226
+ "By default, Easy Digital Downloads sets suggested actions based on the "
4227
+ "Payment Status. These are purely recommendations, and you may need to "
4228
+ "change them to suit your store's needs. If you are unsure, you can safely "
4229
+ "leave these settings as is."
4230
+ msgstr ""
4231
+
4232
+ #: includes/admin/settings/register-settings.php:925
4233
+ msgid "No Action"
4234
+ msgstr ""
4235
+
4236
+ #: includes/admin/settings/register-settings.php:926
4237
+ msgid "Anonymize"
4238
  msgstr ""
4239
 
4240
+ #: includes/admin/settings/register-settings.php:966
4241
  msgid "Buy Now Disabled"
4242
  msgstr ""
4243
 
4244
+ #: includes/admin/settings/register-settings.php:967
4245
  msgid ""
4246
  "Buy Now buttons are only available for stores that have a single supported "
4247
  "gateway active and that do not use taxes."
4248
  msgstr ""
4249
 
4250
+ #: includes/admin/settings/register-settings.php:1070
4251
  msgid "Settings updated."
4252
  msgstr ""
4253
 
4254
+ #: includes/admin/settings/register-settings.php:1214
4255
  msgid "Error setting default gateway. No gateways are enabled."
4256
  msgstr ""
4257
 
4258
+ #: includes/admin/settings/register-settings.php:1227
4259
  msgid "%s could not be set as the default gateway. It must first be enabled."
4260
  msgstr ""
4261
 
4262
+ #: includes/admin/settings/register-settings.php:1326
4263
+ msgid "Privacy"
4264
+ msgstr ""
4265
+
4266
+ #: includes/admin/settings/register-settings.php:1332
4267
  msgid "Licenses"
4268
  msgstr ""
4269
 
4270
+ #: includes/admin/settings/register-settings.php:1335
4271
  msgid "Misc"
4272
  msgstr ""
4273
 
4274
+ #: includes/admin/settings/register-settings.php:1383
4275
  #: includes/gateways/functions.php:25 includes/gateways/paypal-standard.php:33
4276
  msgid "PayPal Standard"
4277
  msgstr ""
4278
 
4279
+ #: includes/admin/settings/register-settings.php:1387
4280
  msgid "Purchase Receipts"
4281
  msgstr ""
4282
 
4283
+ #: includes/admin/settings/register-settings.php:1388
4284
  msgid "New Sale Notifications"
4285
  msgstr ""
4286
 
4287
+ #: includes/admin/settings/register-settings.php:1397
4288
  msgid "Main"
4289
  msgstr ""
4290
 
4291
+ #: includes/admin/settings/register-settings.php:1402 includes/install.php:92
4292
  #: templates/widget-cart-checkout.php:6 templates/widget-cart-empty.php:7
4293
  msgid "Checkout"
4294
  msgstr ""
4295
 
4296
+ #: includes/admin/settings/register-settings.php:1403
4297
  msgid "Button Text"
4298
  msgstr ""
4299
 
4300
+ #: includes/admin/settings/register-settings.php:1405
4301
  msgid "Accounting"
4302
  msgstr ""
4303
 
4304
+ #: includes/admin/settings/register-settings.php:1406
4305
  msgid "Terms of Agreement"
4306
  msgstr ""
4307
 
4308
+ #: includes/admin/settings/register-settings.php:1410
4309
+ msgid "Export & Erase"
4310
+ msgstr ""
4311
+
4312
+ #: includes/admin/settings/register-settings.php:1652
4313
  msgid ""
4314
  "Don't see what you need? More Payment Gateway options are available <a "
4315
  "href=\"%s\">here</a>."
4316
  msgstr ""
4317
 
4318
+ #: includes/admin/settings/register-settings.php:1873
4319
  msgid "The callback function used for the %s setting is missing."
4320
  msgstr ""
4321
 
4322
+ #: includes/admin/settings/register-settings.php:2031
4323
  msgid "Upload File"
4324
  msgstr ""
4325
 
4326
+ #: includes/admin/settings/register-settings.php:2132
4327
  msgid "Country Wide"
4328
  msgstr ""
4329
 
4330
+ #: includes/admin/settings/register-settings.php:2133
4331
  msgid "Rate"
4332
  msgstr ""
4333
 
4334
+ #: includes/admin/settings/register-settings.php:2133
4335
  msgid ""
4336
  "<strong>Regional tax rates: </strong>When a customer enters an address on "
4337
  "checkout that matches the specified region for this tax rate, the cart tax "
4338
  "will adjust automatically. Enter a percentage, such as 6.5 for 6.5%."
4339
  msgstr ""
4340
 
4341
+ #: includes/admin/settings/register-settings.php:2150
4342
+ #: includes/admin/settings/register-settings.php:2195
4343
  msgid "Choose a country"
4344
  msgstr ""
4345
 
4346
+ #: includes/admin/settings/register-settings.php:2165
4347
  msgid "Choose a state"
4348
  msgstr ""
4349
 
4350
+ #: includes/admin/settings/register-settings.php:2177
4351
+ #: includes/admin/settings/register-settings.php:2205
4352
  msgid "Apply to whole country"
4353
  msgstr ""
4354
 
4355
+ #: includes/admin/settings/register-settings.php:2180
4356
+ #: includes/admin/settings/register-settings.php:2208
4357
  msgid "Remove Rate"
4358
  msgstr ""
4359
 
4360
+ #: includes/admin/settings/register-settings.php:2213
4361
  msgid "Add Tax Rate"
4362
  msgstr ""
4363
 
4364
+ #: includes/admin/settings/register-settings.php:2266
4365
  msgid ""
4366
  "Your license key expired on %s. Please <a href=\"%s\" "
4367
  "target=\"_blank\">renew your license key</a>."
4368
  msgstr ""
4369
 
4370
+ #: includes/admin/settings/register-settings.php:2279
4371
  msgid ""
4372
  "Your license key has been disabled. Please <a href=\"%s\" "
4373
  "target=\"_blank\">contact support</a> for more information."
4374
  msgstr ""
4375
 
4376
+ #: includes/admin/settings/register-settings.php:2291
4377
  msgid ""
4378
  "Invalid license. Please <a href=\"%s\" target=\"_blank\">visit your account "
4379
  "page</a> and verify it."
4380
  msgstr ""
4381
 
4382
+ #: includes/admin/settings/register-settings.php:2304
4383
  msgid ""
4384
  "Your %s is not active for this URL. Please <a href=\"%s\" "
4385
  "target=\"_blank\">visit your account page</a> to manage your license key "
4386
  "URLs."
4387
  msgstr ""
4388
 
4389
+ #: includes/admin/settings/register-settings.php:2316
4390
  msgid "This appears to be an invalid license key for %s."
4391
  msgstr ""
4392
 
4393
+ #: includes/admin/settings/register-settings.php:2325
4394
  msgid ""
4395
  "Your license key has reached its activation limit. <a href=\"%s\">View "
4396
  "possible upgrades</a> now."
4397
  msgstr ""
4398
 
4399
+ #: includes/admin/settings/register-settings.php:2334
4400
  msgid ""
4401
  "The key you entered belongs to a bundle, please use the product specific "
4402
  "license key."
4403
  msgstr ""
4404
 
4405
+ #: includes/admin/settings/register-settings.php:2342
4406
  msgid "unknown_error"
4407
  msgstr ""
4408
 
4409
+ #: includes/admin/settings/register-settings.php:2343
4410
  msgid ""
4411
  "There was an error with this license key: %s. Please <a href=\"%s\">contact "
4412
  "our support team</a>."
4413
  msgstr ""
4414
 
4415
+ #: includes/admin/settings/register-settings.php:2363
4416
  msgid "License key never expires."
4417
  msgstr ""
4418
 
4419
+ #: includes/admin/settings/register-settings.php:2370
4420
  msgid ""
4421
  "Your license key expires soon! It expires on %s. <a href=\"%s\" "
4422
  "target=\"_blank\">Renew your license key</a>."
4423
  msgstr ""
4424
 
4425
+ #: includes/admin/settings/register-settings.php:2380
4426
  msgid "Your license key expires on %s."
4427
  msgstr ""
4428
 
4429
+ #: includes/admin/settings/register-settings.php:2398
4430
  msgid "To receive updates, please enter your valid %s license key."
4431
  msgstr ""
4432
 
4433
+ #: includes/admin/settings/register-settings.php:2411
4434
  msgid "Deactivate License"
4435
  msgstr ""
4436
 
4895
  msgid "Do not allow"
4896
  msgstr ""
4897
 
4898
+ #: includes/admin/upgrades/classes/class-file-download-log-migration.php:150
4899
+ msgid "You do not have permission to run this upgrade."
4900
+ msgstr ""
4901
+
4902
+ #: includes/admin/upgrades/classes/class-file-download-log-migration.php:164
4903
+ msgid "File download logs updated successfully."
4904
+ msgstr ""
4905
+
4906
  #: includes/admin/upgrades/upgrade-functions.php:78
4907
  msgid "The Payment History needs to be updated. %s"
4908
  msgstr ""
4973
  "href=\"%s\">here</a> to start the upgrade."
4974
  msgstr ""
4975
 
4976
+ #: includes/admin/upgrades/upgrade-functions.php:181
4977
+ msgid ""
4978
+ "Easy Digital Downloads needs to upgrade the file download logs database, "
4979
+ "click <a href=\"%s\">here</a> to start the upgrade."
4980
+ msgstr ""
4981
+
4982
+ #: includes/admin/upgrades/upgrade-functions.php:212
4983
+ #: includes/admin/upgrades/upgrade-functions.php:528
4984
+ #: includes/admin/upgrades/upgrade-functions.php:610
4985
+ #: includes/admin/upgrades/upgrade-functions.php:721
4986
+ #: includes/admin/upgrades/upgrade-functions.php:818
4987
+ #: includes/admin/upgrades/upgrade-functions.php:892
4988
+ #: includes/admin/upgrades/upgrade-functions.php:1020
4989
+ #: includes/admin/upgrades/upgrade-functions.php:1105
4990
  msgid "You do not have permission to do shop upgrades"
4991
  msgstr ""
4992
 
4993
+ #: includes/admin/upgrades/upgrade-functions.php:381 includes/install.php:129
4994
  msgid "Transaction Failed"
4995
  msgstr ""
4996
 
4997
+ #: includes/admin/upgrades/upgrade-functions.php:382 includes/install.php:130
4998
  msgid "Your transaction failed, please try again or contact site support."
4999
  msgstr ""
5000
 
5001
+ #: includes/admin/upgrades/upgrade-functions.php:1181
5002
+ msgid ""
5003
+ "<strong>Migration complete:</strong> You have already completed the update "
5004
+ "to the file download logs."
5005
+ msgstr ""
5006
+
5007
+ #: includes/admin/upgrades/upgrade-functions.php:1189
5008
+ msgid ""
5009
+ "<strong>Database Upgrade Complete:</strong> All database upgrades have been "
5010
+ "completed."
5011
+ msgstr ""
5012
+
5013
+ #: includes/admin/upgrades/upgrade-functions.php:1191
5014
+ msgid "You may now leave this page."
5015
+ msgstr ""
5016
+
5017
+ #: includes/admin/upgrades/upgrade-functions.php:1197
5018
+ msgid ""
5019
+ "<strong>Important:</strong> Please leave this screen open and do not "
5020
+ "navigate away until the process completes."
5021
+ msgstr ""
5022
+
5023
+ #: includes/admin/upgrades/upgrade-functions.php:1240
5024
+ msgid "Update file download logs"
5025
+ msgstr ""
5026
+
5027
+ #: includes/admin/upgrades/upgrade-functions.php:1245
5028
+ msgid ""
5029
+ "This will update the file download logs to remove some <abbr "
5030
+ "title=\"Personally Identifiable Information\">PII</abbr> and make file "
5031
+ "download counts more accurate."
5032
+ msgstr ""
5033
+
5034
+ #: includes/admin/upgrades/upgrade-functions.php:1254
5035
+ #: includes/admin/upgrades/upgrade-functions.php:1257
5036
+ msgid "Update File Download Logs"
5037
+ msgstr ""
5038
+
5039
+ #: includes/admin/upgrades/upgrade-functions.php:1258
5040
+ msgid "File download logs have already been updated."
5041
+ msgstr ""
5042
+
5043
+ #: includes/admin/upgrades/upgrades.php:26
5044
  msgid "Easy Digital Downloads - Upgrades"
5045
  msgstr ""
5046
 
5047
+ #: includes/admin/upgrades/upgrades.php:67
5048
+ #: includes/admin/upgrades/upgrades.php:81
5049
  msgid ""
5050
  "The upgrade process has started, please be patient. This could take several "
5051
  "minutes. You will be automatically redirected when the upgrade is finished."
5052
  msgstr ""
5053
 
5054
+ #: includes/admin/upgrades/upgrades.php:70
5055
  msgid "Step %d of approximately %d running"
5056
  msgstr ""
5057
 
5126
  msgid "No download logs found!"
5127
  msgstr ""
5128
 
5129
+ #: includes/api/class-edd-api.php:1932 includes/user-functions.php:1068
5130
  msgid "Easy Digital Downloads API Keys"
5131
  msgstr ""
5132
 
5133
+ #: includes/api/class-edd-api.php:1941 includes/user-functions.php:1073
5134
  msgid "Generate API Key"
5135
  msgstr ""
5136
 
5137
+ #: includes/api/class-edd-api.php:1943 includes/user-functions.php:1075
5138
  msgid "Public key:"
5139
  msgstr ""
5140
 
5141
+ #: includes/api/class-edd-api.php:1944 includes/user-functions.php:1076
5142
  msgid "Secret key:"
5143
  msgstr ""
5144
 
5145
+ #: includes/api/class-edd-api.php:1945 includes/user-functions.php:1077
5146
  msgid "Token:"
5147
  msgstr ""
5148
 
5149
+ #: includes/api/class-edd-api.php:1947 includes/user-functions.php:1079
5150
  msgid "Revoke API Keys"
5151
  msgstr ""
5152
 
5623
  msgid "Customer User ID: %s"
5624
  msgstr ""
5625
 
5626
+ #: includes/class-edd-cli.php:334 includes/user-functions.php:576
5627
+ #: includes/user-functions.php:588
5628
  msgid "Username: %s"
5629
  msgstr ""
5630
 
5761
  msgid "Single Use: %s"
5762
  msgstr ""
5763
 
5764
+ #: includes/class-edd-cli.php:506 includes/class-edd-cli.php:764
5765
  msgid "No action specified, did you mean"
5766
  msgstr ""
5767
 
5768
+ #: includes/class-edd-cli.php:508 includes/class-edd-cli.php:766
5769
  msgid "Invalid action specified, did you mean"
5770
  msgstr ""
5771
 
7027
  msgid "Payment recovery processed"
7028
  msgstr ""
7029
 
7030
+ #: includes/payments/functions.php:772
7031
  msgid "Complete"
7032
  msgstr ""
7033
 
7034
+ #: includes/payments/functions.php:1603
7035
  msgid "EDD Bot"
7036
  msgstr ""
7037
 
7333
  msgstr[0] ""
7334
  msgstr[1] ""
7335
 
7336
+ #: includes/privacy-functions.php:28
7337
+ msgid ""
7338
+ "\n"
7339
+ "We collect information about you during the checkout process on our store. "
7340
+ "This information may include, but is not limited to, your name, billing "
7341
+ "address, shipping address, email address, phone number, credit card/payment "
7342
+ "details and any other details that might be requested from you for the "
7343
+ "purpose of processing your orders.\n"
7344
+ "Handling this data also allows us to:\n"
7345
+ "- Send you important account/order/service information.\n"
7346
+ "- Respond to your queries, refund requests, or complaints.\n"
7347
+ "- Process payments and to prevent fraudulent transactions. We do this on "
7348
+ "the basis of our legitimate business interests.\n"
7349
+ "- Set up and administer your account, provide technical and/or customer "
7350
+ "support, and to verify your identity.\n"
7351
+ msgstr ""
7352
+
7353
+ #: includes/privacy-functions.php:40
7354
+ msgid ""
7355
+ "Location and traffic data (including IP address and browser type) if you "
7356
+ "place an order, or if we need to estimate taxes and shipping costs based on "
7357
+ "your location."
7358
+ msgstr ""
7359
+
7360
+ #: includes/privacy-functions.php:41
7361
+ msgid "Product pages visited and content viewed while your session is active."
7362
+ msgstr ""
7363
+
7364
+ #: includes/privacy-functions.php:42
7365
+ msgid ""
7366
+ "Your comments and product reviews if you choose to leave them on our "
7367
+ "website."
7368
+ msgstr ""
7369
+
7370
+ #: includes/privacy-functions.php:43
7371
+ msgid "Account email/password to allow you to access your account, if you have one."
7372
+ msgstr ""
7373
+
7374
+ #: includes/privacy-functions.php:44
7375
+ msgid ""
7376
+ "If you choose to create an account with us, your name, address, and email "
7377
+ "address, which will be used to populate the checkout for future orders."
7378
+ msgstr ""
7379
+
7380
+ #: includes/privacy-functions.php:49
7381
+ msgid "Additionally we may also collect the following information:"
7382
+ msgstr ""
7383
+
7384
+ #: includes/privacy-functions.php:250
7385
+ msgid "No customer with ID %d"
7386
+ msgstr ""
7387
+
7388
+ #: includes/privacy-functions.php:288
7389
+ msgid ""
7390
+ "Customer could not be anonymized due to payments that could not be "
7391
+ "anonymized or deleted."
7392
+ msgstr ""
7393
+
7394
+ #: includes/privacy-functions.php:303 includes/privacy-functions.php:416
7395
+ #: includes/privacy-functions.php:417
7396
+ msgid "Anonymized Customer"
7397
+ msgstr ""
7398
+
7399
+ #: includes/privacy-functions.php:322
7400
+ msgid "Customer anonymized successfully"
7401
+ msgstr ""
7402
+
7403
+ #: includes/privacy-functions.php:323
7404
+ msgid "Customer ID %d successfully anonymized."
7405
+ msgstr ""
7406
+
7407
+ #: includes/privacy-functions.php:346
7408
+ msgid "No payment with ID %d."
7409
+ msgstr ""
7410
+
7411
+ #: includes/privacy-functions.php:379
7412
+ msgid "Payment not modified, due to status: %s."
7413
+ msgstr ""
7414
+
7415
+ #: includes/privacy-functions.php:388
7416
+ msgid "Payment %d with status %s deleted."
7417
+ msgstr ""
7418
+
7419
+ #: includes/privacy-functions.php:438
7420
+ msgid "Payment ID %d successfully anonymized."
7421
+ msgstr ""
7422
+
7423
+ #: includes/privacy-functions.php:533 includes/privacy-functions.php:577
7424
+ #: includes/privacy-functions.php:1126
7425
+ msgid "Customer Record"
7426
+ msgstr ""
7427
+
7428
+ #: includes/privacy-functions.php:538
7429
+ msgid "Billing Information"
7430
+ msgstr ""
7431
+
7432
+ #: includes/privacy-functions.php:549 includes/privacy-functions.php:949
7433
+ #: includes/privacy-functions.php:1141
7434
+ msgid "API Access Logs"
7435
+ msgstr ""
7436
+
7437
+ #: includes/privacy-functions.php:597
7438
+ msgid "All Email Addresses"
7439
+ msgstr ""
7440
+
7441
+ #: includes/privacy-functions.php:607
7442
+ msgid "Agreed to Terms"
7443
+ msgstr ""
7444
+
7445
+ #: includes/privacy-functions.php:617
7446
+ msgid "Agreed to Privacy Policy"
7447
+ msgstr ""
7448
+
7449
+ #: includes/privacy-functions.php:732
7450
+ msgid "Order ID / Number"
7451
+ msgstr ""
7452
+
7453
+ #: includes/privacy-functions.php:736
7454
+ msgid "Order Date"
7455
+ msgstr ""
7456
+
7457
+ #: includes/privacy-functions.php:740
7458
+ msgid "Order Completed Date"
7459
+ msgstr ""
7460
+
7461
+ #: includes/privacy-functions.php:746
7462
+ msgid "Order Total"
7463
+ msgstr ""
7464
+
7465
+ #: includes/privacy-functions.php:750
7466
+ msgid "Order Items"
7467
+ msgstr ""
7468
+
7469
+ #: includes/privacy-functions.php:775
7470
+ msgid "Customer Orders"
7471
+ msgstr ""
7472
+
7473
+ #: includes/privacy-functions.php:841
7474
+ msgid "Date of Download"
7475
+ msgstr ""
7476
+
7477
+ #: includes/privacy-functions.php:845
7478
+ msgid "Product Downloaded"
7479
+ msgstr ""
7480
+
7481
+ #: includes/privacy-functions.php:849
7482
+ msgid "Order ID"
7483
+ msgstr ""
7484
+
7485
+ #: includes/privacy-functions.php:870 includes/privacy-functions.php:1136
7486
+ msgid "File Download Logs"
7487
+ msgstr ""
7488
+
7489
+ #: includes/privacy-functions.php:936
7490
+ msgid "Request"
7491
+ msgstr ""
7492
+
7493
+ #: includes/privacy-functions.php:1012
7494
+ msgid "Possibly Delete Customer"
7495
+ msgstr ""
7496
+
7497
+ #: includes/privacy-functions.php:1078
7498
+ msgid "Customer for %s not deleted, due to remaining payments."
7499
+ msgstr ""
7500
+
7501
+ #: includes/privacy-functions.php:1096
7502
+ msgid "Customer for %s successfully deleted."
7503
+ msgstr ""
7504
+
7505
+ #: includes/privacy-functions.php:1107
7506
+ msgid "Customer for %s failed to be deleted."
7507
+ msgstr ""
7508
+
7509
+ #: includes/privacy-functions.php:1131
7510
+ msgid "Payment Record"
7511
+ msgstr ""
7512
+
7513
+ #: includes/privacy-functions.php:1174
7514
+ msgid "Customer for %s has been anonymized."
7515
+ msgstr ""
7516
+
7517
+ #: includes/privacy-functions.php:1199
7518
+ msgid "No payments found for %s."
7519
+ msgstr ""
7520
+
7521
+ #: includes/privacy-functions.php:1200
7522
+ msgid "All eligible payments anonymized or deleted for %s."
7523
+ msgstr ""
7524
+
7525
+ #: includes/privacy-functions.php:1273
7526
+ msgid "All eligible file download logs anonymized or deleted for %s."
7527
+ msgstr ""
7528
+
7529
+ #: includes/privacy-functions.php:1322
7530
+ msgid "No User found for %s, no access logs to remove."
7531
+ msgstr ""
7532
+
7533
+ #: includes/privacy-functions.php:1347
7534
+ msgid "All API access logs deleted for %s."
7535
+ msgstr ""
7536
+
7537
  #: includes/process-download.php:146
7538
  msgid "Error downloading file. Please contact support."
7539
  msgstr ""
7830
  msgid "Purchase All Items"
7831
  msgstr ""
7832
 
7833
+ #: includes/shortcodes.php:699
7834
  msgid "Sorry, trouble retrieving payment receipt."
7835
  msgstr ""
7836
 
7837
+ #: includes/shortcodes.php:734
7838
  msgid "You must be logged in to view this payment receipt."
7839
  msgstr ""
7840
 
7841
+ #: includes/shortcodes.php:746
7842
  msgid "Receipt could not be retrieved, your purchase session has expired."
7843
  msgstr ""
7844
 
7845
+ #: includes/shortcodes.php:876
7846
  msgid "The passwords you entered do not match. Please try again."
7847
  msgstr ""
7848
 
7849
+ #: includes/shortcodes.php:886
7850
  msgid "The email you entered is invalid. Please enter a valid email."
7851
  msgstr ""
7852
 
7853
+ #: includes/shortcodes.php:891
7854
  msgid "The email you entered belongs to another user. Please use another."
7855
  msgstr ""
7856
 
7857
+ #: includes/shortcodes.php:966
7858
  msgid "Error removing email address from profile. Please try again later."
7859
  msgstr ""
7860
 
7926
  msgid "Plain Text"
7927
  msgstr ""
7928
 
7929
+ #: includes/user-functions.php:574
7930
  msgid "[%s] New User Registration"
7931
  msgstr ""
7932
 
7933
+ #: includes/user-functions.php:575
7934
  msgid "New user registration"
7935
  msgstr ""
7936
 
7937
+ #: includes/user-functions.php:577
7938
  msgid "E-mail: %s"
7939
  msgstr ""
7940
 
7941
+ #: includes/user-functions.php:586
7942
  msgid "[%s] Your username and password"
7943
  msgstr ""
7944
 
7945
+ #: includes/user-functions.php:587
7946
  msgid "Your account info"
7947
  msgstr ""
7948
 
7949
+ #: includes/user-functions.php:591
7950
  msgid "Password entered at checkout"
7951
  msgstr ""
7952
 
7953
+ #: includes/user-functions.php:593
7954
  msgid "Password entered at registration"
7955
  msgstr ""
7956
 
7957
+ #: includes/user-functions.php:596
7958
  msgid "Password: %s"
7959
  msgstr ""
7960
 
7961
+ #: includes/user-functions.php:601
7962
  msgid "Click here to log in"
7963
  msgstr ""
7964
 
7965
+ #: includes/user-functions.php:605
7966
  msgid "To log in, visit: %s"
7967
  msgstr ""
7968
 
7969
+ #: includes/user-functions.php:759 includes/user-functions.php:760
7970
  msgid "Verify your account"
7971
  msgstr ""
7972
 
7973
+ #: includes/user-functions.php:762
7974
  msgid ""
7975
  "Hello %s,\n"
7976
  "\n"
7980
  "Link missing? Visit the following URL: %s"
7981
  msgstr ""
7982
 
7983
+ #: includes/user-functions.php:887
7984
  msgid ""
7985
  "Sorry but your account verification link has expired. <a href=\"%s\">Click "
7986
  "here</a> to request a new verification URL."
7987
  msgstr ""
7988
 
7989
+ #: includes/user-functions.php:920
7990
  msgid "You must be logged in to verify your account."
7991
  msgstr ""
7992
 
7993
+ #: includes/user-functions.php:920 includes/user-functions.php:924
7994
  msgid "Notice"
7995
  msgstr ""
7996
 
7997
+ #: includes/user-functions.php:924
7998
  msgid "Your account has already been verified."
7999
  msgstr ""
8000
 
8001
+ #: includes/user-functions.php:969
8002
  msgid "Invalid verification token provided."
8003
  msgstr ""
8004
 
8005
+ #: includes/user-functions.php:1091
8006
  msgid "Easy Digital Downloads <a href=\"%s\">iOS App</a>"
8007
  msgstr ""
8008
 
8009
+ #: includes/user-functions.php:1098
8010
  msgid "Add to iOS App"
8011
  msgstr ""
8012
 
8385
  msgid "Checkout"
8386
  msgstr ""
8387
 
8388
+ #: includes/admin/settings/register-settings.php:955
8389
+ msgctxt ""
8390
+ "payment status labels for the privacy export & erase settings: Pending "
8391
+ "Payments"
8392
+ msgid "%s Payments"
8393
+ msgstr ""
8394
+
8395
  #: includes/checkout/template.php:738
8396
  msgctxt "Entering a discount code"
8397
  msgid "Click to enter it"
8432
  msgid "%2$s"
8433
  msgstr ""
8434
 
8435
+ #: includes/shortcodes.php:650
8436
  msgctxt "download post type name"
8437
  msgid "No %s found"
8438
  msgstr ""
readme.txt CHANGED
@@ -5,8 +5,8 @@ Contributors: easydigitaldownloads, mordauk, sunnyratilal, chriscct7, section214
5
  Donate link: https://easydigitaldownloads.com/donate/
6
  Tags: download, downloads, e-store, eshop, digital downloads, e-commerce, wp-ecommerce, wp ecommerce, ecommerce, ebook
7
  Requires at least: 4.4
8
- Tested up to: 4.9.5
9
- Stable Tag: 2.9.1
10
  License: GNU Version 2 or Any Later Version
11
 
12
  The easiest way to sell digital products with WordPress.
@@ -89,7 +89,7 @@ Full searchable docs can be found at [http://docs.easydigitaldownloads.com/](htt
89
 
90
  = Where can I ask for help? =
91
 
92
- You can submit a support ticket or pre-sale question from our [support page](http://docs.easydigitaldownloads.com/support?utm_source=docs&utm_medium=faq_tab&utm_content=support&utm_campaign=readme) at anytime.
93
 
94
  = Is an SSL certificate required? =
95
 
@@ -190,6 +190,18 @@ Yes. Easy Digital Downloads also includes default support for Amazon Payments an
190
 
191
  == Changelog ==
192
 
 
 
 
 
 
 
 
 
 
 
 
 
193
  = 2.9.1, April 20, 2018 =
194
  * Fix: Some text field settings were getting emptied when saving a subsection setting.
195
  * Fix: Stats API Endpoint requests were failing when pseudo-date ranges were used other than yesterday and today.
5
  Donate link: https://easydigitaldownloads.com/donate/
6
  Tags: download, downloads, e-store, eshop, digital downloads, e-commerce, wp-ecommerce, wp ecommerce, ecommerce, ebook
7
  Requires at least: 4.4
8
+ Tested up to: 4.9.6
9
+ Stable Tag: 2.9.2
10
  License: GNU Version 2 or Any Later Version
11
 
12
  The easiest way to sell digital products with WordPress.
89
 
90
  = Where can I ask for help? =
91
 
92
+ You can submit a support ticket or pre-sale question from our [support page](https://easydigitaldownloads.com/support/?utm_source=docs&utm_medium=faq_tab&utm_content=support&utm_campaign=readme) at anytime.
93
 
94
  = Is an SSL certificate required? =
95
 
190
 
191
  == Changelog ==
192
 
193
+ = 2.9.2, May 24, 2018 =
194
+ * GDPR: Support for WordPress Core Privacy Exporter and Eraser.
195
+ * GDPR: Added Privacy Policy template for WordPress Core Privacy Policy editor.
196
+ * GDPR: Added new "Privacy" tab to the Easy Digital Downloads Settings.
197
+ * Fix: The "button" CSS class was being applied twice to the "Apply Discount" button.
198
+ * Fix: The toggle link to view the Privacy Policy was not working when the Terms of Agreement were not visible.
199
+ * Fix: Email addresses that contained a + would not be removed via [edd_profile_editor].
200
+ * Fix: Searching payments by discount code was not working.
201
+ * New: Added action hook above short code download list.
202
+ * New: Improve File download Log accuracy and remove PII from log meta.
203
+ * New: Allow for target attribute of links in Terms of Service & Privacy Policy labels.
204
+
205
  = 2.9.1, April 20, 2018 =
206
  * Fix: Some text field settings were getting emptied when saving a subsection setting.
207
  * Fix: Stats API Endpoint requests were failing when pseudo-date ranges were used other than yesterday and today.
templates/edd.css CHANGED
@@ -793,7 +793,7 @@ input.edd_submit_plain {
793
  }
794
  .edd-submit,
795
  #edd-purchase-button,
796
- input[type="submit"].edd-submit {
797
  display: inline-block;
798
  padding: 6px 12px;
799
  margin: 0;
@@ -816,7 +816,7 @@ input[type="submit"].edd-submit {
816
  user-select: none;
817
  }
818
  .edd-submit.button:focus,
819
- input[type="submit"].edd-submit:focus {
820
  outline: thin dotted #333;
821
  outline: 5px auto -webkit-focus-ring-color;
822
  outline-offset: -2px;
793
  }
794
  .edd-submit,
795
  #edd-purchase-button,
796
+ [type="submit"].edd-submit {
797
  display: inline-block;
798
  padding: 6px 12px;
799
  margin: 0;
816
  user-select: none;
817
  }
818
  .edd-submit.button:focus,
819
+ [type="submit"].edd-submit:focus {
820
  outline: thin dotted #333;
821
  outline: 5px auto -webkit-focus-ring-color;
822
  outline-offset: -2px;
templates/edd.min.css CHANGED
@@ -1 +1 @@
1
- @charset "UTF-8";.edd-icon{display:inline-block;fill:currentColor;position:relative;top:-.0625em;vertical-align:middle;width:1em;height:1em}.edd-icon-lock{top:-.125rem}.edd-icon-spin{display:inline-block;-moz-animation:edd-icon-spin 2s infinite linear;-o-animation:edd-icon-spin 2s infinite linear;-webkit-animation:edd-icon-spin 2s infinite linear;animation:edd-icon-spin 2s infinite linear}@-moz-keyframes edd-icon-spin{0%{-moz-transform:rotate(0)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes edd-icon-spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes edd-icon-spin{0%{-o-transform:rotate(0)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes edd-icon-spin{0%{-ms-transform:rotate(0)}100%{-ms-transform:rotate(359deg)}}@keyframes edd-icon-spin{0%{transform:rotate(0)}100%{transform:rotate(359deg)}}.edd_clearfix:after{display:block;visibility:hidden;float:none;clear:both;text-indent:-9999px;content:"."}#edd_checkout_cart{text-align:left;width:100%;border:none;margin:0 0 21px;table-layout:auto}#edd_checkout_cart td,#edd_checkout_cart th{text-align:left;border:1px solid #eee;color:#666;padding:.5em 1.387em}#edd_checkout_cart .edd_cart_header_row th{background:#fafafa;padding:1.387em}#edd_checkout_cart .edd_cart_discount_row th,#edd_checkout_cart .edd_cart_tax_row th{background:0 0}#edd_checkout_cart th{font-weight:700}#edd_checkout_cart td{line-height:25px;vertical-align:middle;background:#fff}#edd_checkout_cart td.edd_cart_actions,#edd_checkout_cart td:last-child,#edd_checkout_cart th.edd_cart_actions,#edd_checkout_cart th.edd_cart_total,#edd_checkout_cart th:last-child{text-align:right}#edd_checkout_cart td img{float:left;margin:0 8px 0 0;background:0 0;padding:0;border:none}#edd_checkout_cart input.edd-item-quantity{width:3em;padding:2px}#edd_checkout_cart .edd_discount{display:inline-block;margin-left:5px}.edd_discount_remove{display:inline-block;width:10px;height:11px;background:url(images/xit.gif ) 0 0 no-repeat;position:relative;top:3px}.edd_discount_remove:hover{background-position:-10px 0}#edd_checkout_cart br{display:none}#edd_checkout_cart a.edd-cart-saving-button{font-weight:400;text-decoration:none}#edd_checkout_form_wrap legend{display:block;font-size:120%;line-height:1;font-weight:700;width:100%;margin:0 0 21px;padding:0}#edd_checkout_form_wrap label{font-weight:700;display:block;position:relative;line-height:100%;font-size:95%;margin:0 0 5px}#edd_checkout_form_wrap label:after{display:block;visibility:hidden;float:none;clear:both;height:0;text-indent:-9999px;content:"."}#edd_checkout_form_wrap span.edd-description{color:#666;font-size:80%;display:block;margin:0 0 5px}#edd_checkout_form_wrap input.edd-input,#edd_checkout_form_wrap textarea.edd-input{display:inline-block;width:70%}#edd_checkout_form_wrap select.edd-select{display:block;width:60%}#edd_checkout_form_wrap select.edd-select.edd-select-small{display:inline;width:auto}#edd_checkout_form_wrap input.edd-input.error,#edd_checkout_form_wrap textarea.edd-input.error{border-color:#c4554e}#edd_checkout_form_wrap>p{margin:0 0 21px}#edd_checkout_form_wrap span.edd-required-indicator{color:#b94a48;display:inline}#edd_checkout_form_wrap input[type=email],#edd_checkout_form_wrap input[type=password],#edd_checkout_form_wrap input[type=tel],#edd_checkout_form_wrap input[type=text],#edd_checkout_form_wrap textarea{padding:4px 6px}#edd_checkout_form_wrap input[type=radio]{border:none;margin-right:5px}#edd_checkout_form_wrap input[type=checkbox]{display:inline-block;margin:0 5px 0 0}#edd_checkout_form_wrap input[type=checkbox]+label,#edd_checkout_form_wrap input[type=checkbox]+label:after{display:inline}#edd_checkout_form_wrap .edd-payment-icons{height:32px;display:block;margin:0 0 8px}#edd_checkout_form_wrap .edd-payment-icons img.payment-icon{max-height:32px;width:auto;margin:0 3px 0 0;float:left;background:0 0;padding:0;border:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}#edd_checkout_form_wrap #edd-payment-mode-wrap label{display:inline-block;margin:0 20px 0 0}#edd_checkout_form_wrap #edd-payment-mode-wrap .edd-payment-mode-label{font-weight:700;display:inline-block;position:relative;margin-bottom:5px}#edd_checkout_form_wrap fieldset{border:1px solid #eee;padding:1.387em;margin:0 0 21px}#edd_checkout_form_wrap #edd_discount_code,#edd_checkout_form_wrap #edd_purchase_submit,#edd_checkout_form_wrap #edd_register_account_fields{padding:0;border:none}#edd_checkout_form_wrap fieldset fieldset{margin:0;border:none;padding:0}#edd_checkout_form_wrap #edd-login-account-wrap,#edd_checkout_form_wrap #edd-new-account-wrap,#edd_checkout_form_wrap #edd_final_total_wrap,#edd_checkout_form_wrap #edd_show_discount,#edd_checkout_form_wrap .edd-cart-adjustment{background:#fafafa;color:#666;padding:.5em 1.387em}#edd_checkout_form_wrap #edd-discount-code-wrap,#edd_checkout_form_wrap #edd_final_total_wrap,#edd_checkout_form_wrap #edd_show_discount{border:1px solid #eee}#edd_checkout_form_wrap .edd-cart-adjustment{padding:1.387em}#edd_checkout_form_wrap .edd-cart-adjustment input.edd-input,#edd_checkout_form_wrap .edd-cart-adjustment input.edd-submit{display:inline-block}#edd_checkout_form_wrap .edd-cart-adjustment input.edd-submit{padding:3px 12px;margin-bottom:2px}#edd_checkout_form_wrap #edd-discount-error-wrap{width:100%;display:inline-block;margin:1em 0 0}#edd_checkout_form_wrap #edd-login-account-wrap,#edd_checkout_form_wrap #edd-new-account-wrap{margin:-1.387em -1.387em 21px;border-left:none;border-right:none;border-top:none}#edd_checkout_form_wrap #edd_payment_mode_select{margin-bottom:21px}#edd_checkout_form_wrap fieldset#edd_register_fields #edd_checkout_user_info{margin-bottom:21px}#edd_checkout_form_wrap fieldset#edd_register_account_fields legend{padding-top:11px}#edd_checkout_form_wrap fieldset#edd_register_account_fields p.edd_login_password,#edd_checkout_form_wrap fieldset#edd_register_account_fields p.edd_register_password{margin:0}#edd_checkout_form_wrap fieldset#edd_cc_fields{border:1px solid #f0f0f0;background:#f9f9f9;position:relative}#edd_checkout_form_wrap fieldset#edd_cc_fields legend{border:none;padding:0}#edd_checkout_form_wrap fieldset p:last-child{margin-bottom:0}#edd_checkout_form_wrap fieldset#edd_cc_fields #edd-card-number-wrap{margin-top:5px}#edd_checkout_form_wrap #edd_purchase_final_total{margin:21px 0}#edd_checkout_form_wrap #edd_purchase_final_total p{margin:0}#edd_secure_site_wrapper{padding:4px 4px 4px 0;font-weight:700}#edd_checkout_form_wrap input.edd-input.card-number.valid{background-image:url(images/tick.png);background-repeat:no-repeat;background-position:98% 50%}#edd_checkout_form_wrap span.exp-divider{display:inline}#edd_checkout_form_wrap span.card-type{position:absolute;top:-2px;right:0;width:43px;height:32px;background-size:43px 32px!important}#edd_checkout_form_wrap span.card-type.off{display:none}#edd_checkout_form_wrap span.card-type.visa{background:url(images/icons/visa.png ) no-repeat}#edd_checkout_form_wrap span.card-type.mastercard{background:url(images/icons/mastercard.png ) no-repeat}#edd_checkout_form_wrap span.card-type.discover{background:url(images/icons/discover.png ) no-repeat}#edd_checkout_form_wrap span.card-type.amex{background:url(images/icons/americanexpress.png ) no-repeat}#edd_checkout_form_wrap .edd-cart-ajax{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.edd-amazon-profile-wrapper{font-size:12px}.edd-amazon-profile-name{font-weight:600}.edd-amazon-logout{font-size:10px;line-height:12px}.edd-amazon-logout a{cursor:pointer}#edd-amazon-address-box,#edd-amazon-wallet-box{height:228px;width:350px}#edd-amazon-address-box{margin-bottom:15px}@media only screen and (min-width:768px){#edd-amazon-address-box,#edd-amazon-wallet-box{width:100%;height:228px}}.edd_purchase_submit_wrapper{position:relative}.edd_purchase_submit_wrapper a.edd-add-to-cart{text-decoration:none;display:none;position:relative;overflow:hidden}.edd_purchase_submit_wrapper a.edd-add-to-cart.edd-has-js{display:inline-block}.edd_purchase_submit_wrapper .edd-cart-ajax{display:none;position:relative;left:-35px}.edd-submit.button.edd-ajax-loading{padding-right:30px}.edd-add-to-cart .edd-add-to-cart-label{opacity:1}.edd-loading,.edd-loading:after{border-radius:50%;display:block;width:1.5em;height:1.5em}.edd-loading{-webkit-animation:edd-spinning 1.1s infinite linear;animation:edd-spinning 1.1s infinite linear;border-top:.2em solid rgba(255,255,255,.2);border-right:.2em solid rgba(255,255,255,.2);border-bottom:.2em solid rgba(255,255,255,.2);border-left:.2em solid #fff;font-size:.75em;position:absolute;left:calc(50% - .75em);top:calc(50% - .75em);opacity:0;-ms-transform:translateZ(0);transform:translateZ(0)}.edd-discount-loader.edd-loading,.edd-loading-ajax.edd-loading,a.edd-add-to-cart.white .edd-loading{border-top-color:rgba(0,0,0,.2);border-right-color:rgba(0,0,0,.2);border-bottom-color:rgba(0,0,0,.2);border-left-color:#000}.edd-loading-ajax.edd-loading{display:inline-block;position:relative;top:0;left:.25em;vertical-align:middle}#edd_checkout_form_wrap .edd-cart-adjustment .edd-apply-discount.edd-submit{display:inline-block}.edd-discount-loader.edd-loading{display:inline-block;position:relative;left:auto;vertical-align:middle;width:1.25em;height:1.25em}.edd-loading-ajax.edd-loading{opacity:1}@-webkit-keyframes edd-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes edd-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.edd-loading,a.edd-add-to-cart .edd-add-to-cart-label{-webkit-transition:.1s opacity!important;-moz-transition:.1s opacity!important;-ms-transition:.1s opacity!important;-o-transition:.1s opacity!important;transition:.1s opacity!important}.edd-add-to-cart[data-edd-loading] .edd-add-to-cart-label{opacity:0}.edd-add-to-cart[data-edd-loading] .edd-loading,.edd-discount-loader.edd-loading{opacity:1}.edd-cart-added-alert{color:#567622;display:block;position:absolute}.edd_form input.edd-input.required,.edd_form select.edd-select.required{color:#000}body.edd_receipt_page{background-color:#fff;color:#141412;margin:0;font-family:Helvetica,sans-serif;font-size:12px}body.edd_receipt_page:before{position:relative}body.edd_receipt_page #edd_receipt_wrapper{width:660px;margin:0 auto;padding:50px 0}body.edd_receipt_page table{display:table;width:100%;border-bottom:1px solid #ededed;border-collapse:collapse;border-spacing:0;font-size:14px;line-height:2;margin:0 0 20px}body.edd_receipt_page td,body.edd_receipt_page th{display:table-cell;text-align:left;border-top:1px solid #ededed;padding:6px 10px;font-weight:400}body.edd_receipt_page th{font-weight:700;text-transform:uppercase}body.edd_receipt_page h3{font-size:22px;margin:40px 0 5px;clear:both;display:block;font-weight:700}body.edd_receipt_page li{list-style:none}table#edd_purchase_receipt,table#edd_purchase_receipt_products{width:100%}table#edd_purchase_receipt td,table#edd_purchase_receipt th,table#edd_purchase_receipt_products td,table#edd_purchase_receipt_products th{text-align:left}table#edd_purchase_receipt .edd_receipt_payment_status.cancelled,table#edd_purchase_receipt .edd_receipt_payment_status.failed,table#edd_purchase_receipt .edd_receipt_payment_status.pending,table#edd_purchase_receipt .edd_receipt_payment_status.revoked{color:#f73f2e}table#edd_purchase_receipt_products li{list-style:none;margin:0 0 8px 10px}table#edd_purchase_receipt ul,table#edd_purchase_receipt_products ul.edd_purchase_receipt_files{margin:0;padding:0}table#edd_purchase_receipt li.edd_download_file{list-style:none;margin:0 0 8px 0}table#edd_purchase_receipt_products .edd_purchase_receipt_product_notes{font-style:italic}table#edd_purchase_receipt_products .edd_purchase_receipt_product_name{font-weight:700}table#edd_purchase_receipt_products .edd_bundled_product_name{font-style:italic;font-weight:700}#edd_user_history{text-align:left;width:100%;border-top:1px solid #f0f0f0;border-bottom:none}#edd_user_history td,#edd_user_history th{text-align:left;padding:3px 5px;border-bottom:1px solid #f0f0f0;border-top:none}#edd_user_history th{font-weight:700;background:#f5f5f5}#edd_user_history td{line-height:25px;vertical-align:middle}#edd_user_history .edd_purchase_status.cancelled,#edd_user_history .edd_purchase_status.failed,#edd_user_history .edd_purchase_status.pending,#edd_user_history .edd_purchase_status.revoked{color:#f73f2e}#edd_login_form legend,#edd_register_form legend{font-size:120%;margin-bottom:1em}#edd_login_form fieldset,#edd_register_form fieldset{border:none}#edd_login_form .edd-input,#edd_register_form .edd-input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#edd_login_form label,#edd_register_form label{cursor:pointer}#edd_profile_editor_form p{margin-bottom:8px}#edd_profile_editor_form label{display:inline-block}#edd_profile_editor_form .edd-profile-emails{list-style-type:none;display:inline-table;margin-left:0;margin-bottom:0}#edd_profile_editor_form .edd-profile-email{width:auto}#edd_profile_editor_form .edd-profile-email .actions{display:none}#edd_profile_editor_form .edd-profile-email:hover>span{display:inline-block}.edd_added_to_cart_alert{padding:5px;font-size:14px;border:1px solid #046a9e;background:#9ecce2;color:#333;margin:8px 0}.edd_added_to_cart_alert a.edd_alert_checkout_link{color:#000!important}input.edd_submit_plain{background:0 0!important;border:none!important;padding:0!important;display:inline;cursor:pointer}.single-download .edd_download_purchase_form{margin-bottom:1.387em}.edd_download_purchase_form .edd_download_quantity_wrapper{margin:0 0 .5em}.edd_download_purchase_form .edd_download_quantity_wrapper .edd-item-quantity{width:75px}.edd_download_purchase_form .edd_price_options{margin:0 0 15px}.edd_download_purchase_form .edd_price_options ul{margin:0;padding:0;list-style:none}.edd_download_purchase_form .edd_price_options li{display:block;padding:0;margin:0}.edd_download_purchase_form .edd_price_options span{display:inline;padding:0;margin:0}.edd_download_purchase_form .edd_price_options .edd_download_quantity_wrapper{padding-left:18px}.edd_download_purchase_form .edd_price_options .edd_download_quantity_wrapper *{font-size:80%}.edd_download_purchase_form .edd_price_options input.edd-item-quantity{display:inline;width:50px;max-width:90%}#edd-purchase-button,.edd-submit,input[type=submit].edd-submit{display:inline-block;padding:6px 12px;margin:0;font-size:14px;font-weight:400;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.edd-submit.button:focus,input[type=submit].edd-submit:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.edd-submit.button:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.edd-submit.plain{padding:0;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.edd-submit.button,.edd-submit.button.gray,.edd-submit.button:visited{color:#333;background:#f0f0f0;border-color:#ccc}.edd-submit.button.gray:active,.edd-submit.button.gray:focus,.edd-submit.button.gray:hover,.edd-submit.button:active,.edd-submit.button:focus,.edd-submit.button:hover{color:#333;background:#ebebeb;border-color:#adadad}.edd-submit.button.gray:active{background-image:none}.edd-submit.button.white{color:#333;background:#fff;border-color:#ccc}.edd-submit.button.white:active,.edd-submit.button.white:focus,.edd-submit.button.white:hover{color:#333;background:#ebebeb;border-color:#adadad}.edd-submit.button.white:active{background-image:none}.edd-submit.button.blue{color:#fff;background:#428bca;border-color:#357ebd}.edd-submit.button.blue.active,.edd-submit.button.blue:focus,.edd-submit.button.blue:hover{color:#fff;background:#3276b1;border-color:#285e8e}.edd-submit.button.blue.active{background-image:none}.edd-submit.button.red{color:#fff;background:#d9534f;border-color:#d43f3a}.edd-submit.button.red:active,.edd-submit.button.red:focus,.edd-submit.button.red:hover{color:#fff;background:#d2322d;border-color:#ac2925}.edd-submit.button.red:active{background-image:none}.edd-submit.button.green{color:#fff;background:#5cb85c;border-color:#4cae4c}.edd-submit.button.green:active,.edd-submit.button.green:focus,.edd-submit.button.green:hover{color:#fff;background:#47a447;border-color:#398439}.edd-submit.button.green:active{background-image:none}.edd-submit.button.yellow{color:#fff;background:#f0ad4e;border-color:#eea236}.edd-submit.button.yellow:active,.edd-submit.button.yellow:focus,.edd-submit.button.yellow:hover{color:#fff;background:#ed9c28;border-color:#d58512}.edd-submit.button.yellow:active{background-image:none}.edd-submit.button.orange{color:#fff;background:#ed9c28;border-color:#e3921e}.edd-submit.button.orange:active,.edd-submit.button.orange:focus,.edd-submit.button.orange:hover{color:#fff;background:#e59016;border-color:#d58512}.edd-submit.button.orange:active{background-image:none}.edd-submit.button.dark-gray{color:#fff;background:#363636;border-color:#222}.edd-submit.button.dark-gray:active,.edd-submit.button.dark-gray:focus,.edd-submit.button.dark-gray:hover{color:#fff;background:#333;border-color:#adadad}.edd-submit.button.dark-gray:active{background-image:none}.edd_downloads_list:after{content:"";display:table;clear:both}.edd_download{float:left}.edd_download_columns_1 .edd_download{width:100%}.edd_download_columns_2 .edd_download{width:50%}.edd_download_columns_0 .edd_download,.edd_download_columns_3 .edd_download{width:33%}.edd_download_columns_4 .edd_download{width:25%}.edd_download_columns_5 .edd_download{width:20%}.edd_download_columns_6 .edd_download{width:16.6%}.edd_download_inner{padding:0 8px 8px;margin:0 0 10px}.edd_download_columns_2 .edd_download:nth-child(2n+1),.edd_download_columns_3 .edd_download:nth-child(3n+1),.edd_download_columns_4 .edd_download:nth-child(4n+1),.edd_download_columns_5 .edd_download:nth-child(5n+1),.edd_download_columns_6 .edd_download:nth-child(6n+1){clear:left}.edd_download_image{max-width:100%}.edd_download .edd_price{margin-bottom:10px}#edd_download_pagination{clear:both}.edd-hide-on-empty.cart-empty{display:none}edd-hide-on-empty.cart-not.empty{display:block}.edd-cart-ajax{margin:0 8px 0 4px;position:relative;top:2px;background:0 0;border:none;padding:0}.edd-cart-number-of-items{font-style:italic;color:grey}.edd-cart-meta.edd_subtotal{font-weight:700;font-style:italic}.edd-cart-meta.edd_cart_tax{font-size:1em;font-style:italic}.edd-cart-meta.edd_cart_tax::before{font-style:normal}.edd-cart-meta.edd_total{font-weight:700}.edd-cart-meta{padding:2px 5px}.edd-cart-meta.edd_subtotal,.edd-cart-meta.edd_total{background-color:#f9f9f9}.edd_errors:not(.edd-alert){-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;border:1px solid #e6db55;margin:0 0 21px;background:#ffffe0;color:#333}.edd_error{padding:10px}p.edd_error{margin:0!important}.edd_success:not(.edd-alert){-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;border:1px solid #b3ce89;margin:20px 0;background:#d5eab3;color:#567622;padding:6px 8px;box-shadow:inset 0 1px 0 rgba(255,255,255,.7)}.edd-alert{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;margin-bottom:20px;padding:10px;border:1px solid transparent;vertical-align:middle}.edd-alert p{padding:0}.edd-alert p:not(:last-child){margin-bottom:5px}.edd-alert p:last-child{margin-bottom:0}.edd-alert-error{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.edd-alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.edd-alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.edd-alert-warn{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}
1
+ @charset "UTF-8";.edd-icon{display:inline-block;fill:currentColor;position:relative;top:-.0625em;vertical-align:middle;width:1em;height:1em}.edd-icon-lock{top:-.125rem}.edd-icon-spin{display:inline-block;-moz-animation:edd-icon-spin 2s infinite linear;-o-animation:edd-icon-spin 2s infinite linear;-webkit-animation:edd-icon-spin 2s infinite linear;animation:edd-icon-spin 2s infinite linear}@-moz-keyframes edd-icon-spin{0%{-moz-transform:rotate(0)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes edd-icon-spin{0%{-webkit-transform:rotate(0)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes edd-icon-spin{0%{-o-transform:rotate(0)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes edd-icon-spin{0%{-ms-transform:rotate(0)}100%{-ms-transform:rotate(359deg)}}@keyframes edd-icon-spin{0%{transform:rotate(0)}100%{transform:rotate(359deg)}}.edd_clearfix:after{display:block;visibility:hidden;float:none;clear:both;text-indent:-9999px;content:"."}#edd_checkout_cart{text-align:left;width:100%;border:none;margin:0 0 21px;table-layout:auto}#edd_checkout_cart td,#edd_checkout_cart th{text-align:left;border:1px solid #eee;color:#666;padding:.5em 1.387em}#edd_checkout_cart .edd_cart_header_row th{background:#fafafa;padding:1.387em}#edd_checkout_cart .edd_cart_discount_row th,#edd_checkout_cart .edd_cart_tax_row th{background:0 0}#edd_checkout_cart th{font-weight:700}#edd_checkout_cart td{line-height:25px;vertical-align:middle;background:#fff}#edd_checkout_cart td.edd_cart_actions,#edd_checkout_cart td:last-child,#edd_checkout_cart th.edd_cart_actions,#edd_checkout_cart th.edd_cart_total,#edd_checkout_cart th:last-child{text-align:right}#edd_checkout_cart td img{float:left;margin:0 8px 0 0;background:0 0;padding:0;border:none}#edd_checkout_cart input.edd-item-quantity{width:3em;padding:2px}#edd_checkout_cart .edd_discount{display:inline-block;margin-left:5px}.edd_discount_remove{display:inline-block;width:10px;height:11px;background:url(images/xit.gif ) 0 0 no-repeat;position:relative;top:3px}.edd_discount_remove:hover{background-position:-10px 0}#edd_checkout_cart br{display:none}#edd_checkout_cart a.edd-cart-saving-button{font-weight:400;text-decoration:none}#edd_checkout_form_wrap legend{display:block;font-size:120%;line-height:1;font-weight:700;width:100%;margin:0 0 21px;padding:0}#edd_checkout_form_wrap label{font-weight:700;display:block;position:relative;line-height:100%;font-size:95%;margin:0 0 5px}#edd_checkout_form_wrap label:after{display:block;visibility:hidden;float:none;clear:both;height:0;text-indent:-9999px;content:"."}#edd_checkout_form_wrap span.edd-description{color:#666;font-size:80%;display:block;margin:0 0 5px}#edd_checkout_form_wrap input.edd-input,#edd_checkout_form_wrap textarea.edd-input{display:inline-block;width:70%}#edd_checkout_form_wrap select.edd-select{display:block;width:60%}#edd_checkout_form_wrap select.edd-select.edd-select-small{display:inline;width:auto}#edd_checkout_form_wrap input.edd-input.error,#edd_checkout_form_wrap textarea.edd-input.error{border-color:#c4554e}#edd_checkout_form_wrap>p{margin:0 0 21px}#edd_checkout_form_wrap span.edd-required-indicator{color:#b94a48;display:inline}#edd_checkout_form_wrap input[type=email],#edd_checkout_form_wrap input[type=password],#edd_checkout_form_wrap input[type=tel],#edd_checkout_form_wrap input[type=text],#edd_checkout_form_wrap textarea{padding:4px 6px}#edd_checkout_form_wrap input[type=radio]{border:none;margin-right:5px}#edd_checkout_form_wrap input[type=checkbox]{display:inline-block;margin:0 5px 0 0}#edd_checkout_form_wrap input[type=checkbox]+label,#edd_checkout_form_wrap input[type=checkbox]+label:after{display:inline}#edd_checkout_form_wrap .edd-payment-icons{height:32px;display:block;margin:0 0 8px}#edd_checkout_form_wrap .edd-payment-icons img.payment-icon{max-height:32px;width:auto;margin:0 3px 0 0;float:left;background:0 0;padding:0;border:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}#edd_checkout_form_wrap #edd-payment-mode-wrap label{display:inline-block;margin:0 20px 0 0}#edd_checkout_form_wrap #edd-payment-mode-wrap .edd-payment-mode-label{font-weight:700;display:inline-block;position:relative;margin-bottom:5px}#edd_checkout_form_wrap fieldset{border:1px solid #eee;padding:1.387em;margin:0 0 21px}#edd_checkout_form_wrap #edd_discount_code,#edd_checkout_form_wrap #edd_purchase_submit,#edd_checkout_form_wrap #edd_register_account_fields{padding:0;border:none}#edd_checkout_form_wrap fieldset fieldset{margin:0;border:none;padding:0}#edd_checkout_form_wrap #edd-login-account-wrap,#edd_checkout_form_wrap #edd-new-account-wrap,#edd_checkout_form_wrap #edd_final_total_wrap,#edd_checkout_form_wrap #edd_show_discount,#edd_checkout_form_wrap .edd-cart-adjustment{background:#fafafa;color:#666;padding:.5em 1.387em}#edd_checkout_form_wrap #edd-discount-code-wrap,#edd_checkout_form_wrap #edd_final_total_wrap,#edd_checkout_form_wrap #edd_show_discount{border:1px solid #eee}#edd_checkout_form_wrap .edd-cart-adjustment{padding:1.387em}#edd_checkout_form_wrap .edd-cart-adjustment input.edd-input,#edd_checkout_form_wrap .edd-cart-adjustment input.edd-submit{display:inline-block}#edd_checkout_form_wrap .edd-cart-adjustment input.edd-submit{padding:3px 12px;margin-bottom:2px}#edd_checkout_form_wrap #edd-discount-error-wrap{width:100%;display:inline-block;margin:1em 0 0}#edd_checkout_form_wrap #edd-login-account-wrap,#edd_checkout_form_wrap #edd-new-account-wrap{margin:-1.387em -1.387em 21px;border-left:none;border-right:none;border-top:none}#edd_checkout_form_wrap #edd_payment_mode_select{margin-bottom:21px}#edd_checkout_form_wrap fieldset#edd_register_fields #edd_checkout_user_info{margin-bottom:21px}#edd_checkout_form_wrap fieldset#edd_register_account_fields legend{padding-top:11px}#edd_checkout_form_wrap fieldset#edd_register_account_fields p.edd_login_password,#edd_checkout_form_wrap fieldset#edd_register_account_fields p.edd_register_password{margin:0}#edd_checkout_form_wrap fieldset#edd_cc_fields{border:1px solid #f0f0f0;background:#f9f9f9;position:relative}#edd_checkout_form_wrap fieldset#edd_cc_fields legend{border:none;padding:0}#edd_checkout_form_wrap fieldset p:last-child{margin-bottom:0}#edd_checkout_form_wrap fieldset#edd_cc_fields #edd-card-number-wrap{margin-top:5px}#edd_checkout_form_wrap #edd_purchase_final_total{margin:21px 0}#edd_checkout_form_wrap #edd_purchase_final_total p{margin:0}#edd_secure_site_wrapper{padding:4px 4px 4px 0;font-weight:700}#edd_checkout_form_wrap input.edd-input.card-number.valid{background-image:url(images/tick.png);background-repeat:no-repeat;background-position:98% 50%}#edd_checkout_form_wrap span.exp-divider{display:inline}#edd_checkout_form_wrap span.card-type{position:absolute;top:-2px;right:0;width:43px;height:32px;background-size:43px 32px!important}#edd_checkout_form_wrap span.card-type.off{display:none}#edd_checkout_form_wrap span.card-type.visa{background:url(images/icons/visa.png ) no-repeat}#edd_checkout_form_wrap span.card-type.mastercard{background:url(images/icons/mastercard.png ) no-repeat}#edd_checkout_form_wrap span.card-type.discover{background:url(images/icons/discover.png ) no-repeat}#edd_checkout_form_wrap span.card-type.amex{background:url(images/icons/americanexpress.png ) no-repeat}#edd_checkout_form_wrap .edd-cart-ajax{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.edd-amazon-profile-wrapper{font-size:12px}.edd-amazon-profile-name{font-weight:600}.edd-amazon-logout{font-size:10px;line-height:12px}.edd-amazon-logout a{cursor:pointer}#edd-amazon-address-box,#edd-amazon-wallet-box{height:228px;width:350px}#edd-amazon-address-box{margin-bottom:15px}@media only screen and (min-width:768px){#edd-amazon-address-box,#edd-amazon-wallet-box{width:100%;height:228px}}.edd_purchase_submit_wrapper{position:relative}.edd_purchase_submit_wrapper a.edd-add-to-cart{text-decoration:none;display:none;position:relative;overflow:hidden}.edd_purchase_submit_wrapper a.edd-add-to-cart.edd-has-js{display:inline-block}.edd_purchase_submit_wrapper .edd-cart-ajax{display:none;position:relative;left:-35px}.edd-submit.button.edd-ajax-loading{padding-right:30px}.edd-add-to-cart .edd-add-to-cart-label{opacity:1}.edd-loading,.edd-loading:after{border-radius:50%;display:block;width:1.5em;height:1.5em}.edd-loading{-webkit-animation:edd-spinning 1.1s infinite linear;animation:edd-spinning 1.1s infinite linear;border-top:.2em solid rgba(255,255,255,.2);border-right:.2em solid rgba(255,255,255,.2);border-bottom:.2em solid rgba(255,255,255,.2);border-left:.2em solid #fff;font-size:.75em;position:absolute;left:calc(50% - .75em);top:calc(50% - .75em);opacity:0;-ms-transform:translateZ(0);transform:translateZ(0)}.edd-discount-loader.edd-loading,.edd-loading-ajax.edd-loading,a.edd-add-to-cart.white .edd-loading{border-top-color:rgba(0,0,0,.2);border-right-color:rgba(0,0,0,.2);border-bottom-color:rgba(0,0,0,.2);border-left-color:#000}.edd-loading-ajax.edd-loading{display:inline-block;position:relative;top:0;left:.25em;vertical-align:middle}#edd_checkout_form_wrap .edd-cart-adjustment .edd-apply-discount.edd-submit{display:inline-block}.edd-discount-loader.edd-loading{display:inline-block;position:relative;left:auto;vertical-align:middle;width:1.25em;height:1.25em}.edd-loading-ajax.edd-loading{opacity:1}@-webkit-keyframes edd-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes edd-spinning{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.edd-loading,a.edd-add-to-cart .edd-add-to-cart-label{-webkit-transition:.1s opacity!important;-moz-transition:.1s opacity!important;-ms-transition:.1s opacity!important;-o-transition:.1s opacity!important;transition:.1s opacity!important}.edd-add-to-cart[data-edd-loading] .edd-add-to-cart-label{opacity:0}.edd-add-to-cart[data-edd-loading] .edd-loading,.edd-discount-loader.edd-loading{opacity:1}.edd-cart-added-alert{color:#567622;display:block;position:absolute}.edd_form input.edd-input.required,.edd_form select.edd-select.required{color:#000}body.edd_receipt_page{background-color:#fff;color:#141412;margin:0;font-family:Helvetica,sans-serif;font-size:12px}body.edd_receipt_page:before{position:relative}body.edd_receipt_page #edd_receipt_wrapper{width:660px;margin:0 auto;padding:50px 0}body.edd_receipt_page table{display:table;width:100%;border-bottom:1px solid #ededed;border-collapse:collapse;border-spacing:0;font-size:14px;line-height:2;margin:0 0 20px}body.edd_receipt_page td,body.edd_receipt_page th{display:table-cell;text-align:left;border-top:1px solid #ededed;padding:6px 10px;font-weight:400}body.edd_receipt_page th{font-weight:700;text-transform:uppercase}body.edd_receipt_page h3{font-size:22px;margin:40px 0 5px;clear:both;display:block;font-weight:700}body.edd_receipt_page li{list-style:none}table#edd_purchase_receipt,table#edd_purchase_receipt_products{width:100%}table#edd_purchase_receipt td,table#edd_purchase_receipt th,table#edd_purchase_receipt_products td,table#edd_purchase_receipt_products th{text-align:left}table#edd_purchase_receipt .edd_receipt_payment_status.cancelled,table#edd_purchase_receipt .edd_receipt_payment_status.failed,table#edd_purchase_receipt .edd_receipt_payment_status.pending,table#edd_purchase_receipt .edd_receipt_payment_status.revoked{color:#f73f2e}table#edd_purchase_receipt_products li{list-style:none;margin:0 0 8px 10px}table#edd_purchase_receipt ul,table#edd_purchase_receipt_products ul.edd_purchase_receipt_files{margin:0;padding:0}table#edd_purchase_receipt li.edd_download_file{list-style:none;margin:0 0 8px 0}table#edd_purchase_receipt_products .edd_purchase_receipt_product_notes{font-style:italic}table#edd_purchase_receipt_products .edd_purchase_receipt_product_name{font-weight:700}table#edd_purchase_receipt_products .edd_bundled_product_name{font-style:italic;font-weight:700}#edd_user_history{text-align:left;width:100%;border-top:1px solid #f0f0f0;border-bottom:none}#edd_user_history td,#edd_user_history th{text-align:left;padding:3px 5px;border-bottom:1px solid #f0f0f0;border-top:none}#edd_user_history th{font-weight:700;background:#f5f5f5}#edd_user_history td{line-height:25px;vertical-align:middle}#edd_user_history .edd_purchase_status.cancelled,#edd_user_history .edd_purchase_status.failed,#edd_user_history .edd_purchase_status.pending,#edd_user_history .edd_purchase_status.revoked{color:#f73f2e}#edd_login_form legend,#edd_register_form legend{font-size:120%;margin-bottom:1em}#edd_login_form fieldset,#edd_register_form fieldset{border:none}#edd_login_form .edd-input,#edd_register_form .edd-input{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#edd_login_form label,#edd_register_form label{cursor:pointer}#edd_profile_editor_form p{margin-bottom:8px}#edd_profile_editor_form label{display:inline-block}#edd_profile_editor_form .edd-profile-emails{list-style-type:none;display:inline-table;margin-left:0;margin-bottom:0}#edd_profile_editor_form .edd-profile-email{width:auto}#edd_profile_editor_form .edd-profile-email .actions{display:none}#edd_profile_editor_form .edd-profile-email:hover>span{display:inline-block}.edd_added_to_cart_alert{padding:5px;font-size:14px;border:1px solid #046a9e;background:#9ecce2;color:#333;margin:8px 0}.edd_added_to_cart_alert a.edd_alert_checkout_link{color:#000!important}input.edd_submit_plain{background:0 0!important;border:none!important;padding:0!important;display:inline;cursor:pointer}.single-download .edd_download_purchase_form{margin-bottom:1.387em}.edd_download_purchase_form .edd_download_quantity_wrapper{margin:0 0 .5em}.edd_download_purchase_form .edd_download_quantity_wrapper .edd-item-quantity{width:75px}.edd_download_purchase_form .edd_price_options{margin:0 0 15px}.edd_download_purchase_form .edd_price_options ul{margin:0;padding:0;list-style:none}.edd_download_purchase_form .edd_price_options li{display:block;padding:0;margin:0}.edd_download_purchase_form .edd_price_options span{display:inline;padding:0;margin:0}.edd_download_purchase_form .edd_price_options .edd_download_quantity_wrapper{padding-left:18px}.edd_download_purchase_form .edd_price_options .edd_download_quantity_wrapper *{font-size:80%}.edd_download_purchase_form .edd_price_options input.edd-item-quantity{display:inline;width:50px;max-width:90%}#edd-purchase-button,.edd-submit,[type=submit].edd-submit{display:inline-block;padding:6px 12px;margin:0;font-size:14px;font-weight:400;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.edd-submit.button:focus,[type=submit].edd-submit:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.edd-submit.button:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.edd-submit.plain{padding:0;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.edd-submit.button,.edd-submit.button.gray,.edd-submit.button:visited{color:#333;background:#f0f0f0;border-color:#ccc}.edd-submit.button.gray:active,.edd-submit.button.gray:focus,.edd-submit.button.gray:hover,.edd-submit.button:active,.edd-submit.button:focus,.edd-submit.button:hover{color:#333;background:#ebebeb;border-color:#adadad}.edd-submit.button.gray:active{background-image:none}.edd-submit.button.white{color:#333;background:#fff;border-color:#ccc}.edd-submit.button.white:active,.edd-submit.button.white:focus,.edd-submit.button.white:hover{color:#333;background:#ebebeb;border-color:#adadad}.edd-submit.button.white:active{background-image:none}.edd-submit.button.blue{color:#fff;background:#428bca;border-color:#357ebd}.edd-submit.button.blue.active,.edd-submit.button.blue:focus,.edd-submit.button.blue:hover{color:#fff;background:#3276b1;border-color:#285e8e}.edd-submit.button.blue.active{background-image:none}.edd-submit.button.red{color:#fff;background:#d9534f;border-color:#d43f3a}.edd-submit.button.red:active,.edd-submit.button.red:focus,.edd-submit.button.red:hover{color:#fff;background:#d2322d;border-color:#ac2925}.edd-submit.button.red:active{background-image:none}.edd-submit.button.green{color:#fff;background:#5cb85c;border-color:#4cae4c}.edd-submit.button.green:active,.edd-submit.button.green:focus,.edd-submit.button.green:hover{color:#fff;background:#47a447;border-color:#398439}.edd-submit.button.green:active{background-image:none}.edd-submit.button.yellow{color:#fff;background:#f0ad4e;border-color:#eea236}.edd-submit.button.yellow:active,.edd-submit.button.yellow:focus,.edd-submit.button.yellow:hover{color:#fff;background:#ed9c28;border-color:#d58512}.edd-submit.button.yellow:active{background-image:none}.edd-submit.button.orange{color:#fff;background:#ed9c28;border-color:#e3921e}.edd-submit.button.orange:active,.edd-submit.button.orange:focus,.edd-submit.button.orange:hover{color:#fff;background:#e59016;border-color:#d58512}.edd-submit.button.orange:active{background-image:none}.edd-submit.button.dark-gray{color:#fff;background:#363636;border-color:#222}.edd-submit.button.dark-gray:active,.edd-submit.button.dark-gray:focus,.edd-submit.button.dark-gray:hover{color:#fff;background:#333;border-color:#adadad}.edd-submit.button.dark-gray:active{background-image:none}.edd_downloads_list:after{content:"";display:table;clear:both}.edd_download{float:left}.edd_download_columns_1 .edd_download{width:100%}.edd_download_columns_2 .edd_download{width:50%}.edd_download_columns_0 .edd_download,.edd_download_columns_3 .edd_download{width:33%}.edd_download_columns_4 .edd_download{width:25%}.edd_download_columns_5 .edd_download{width:20%}.edd_download_columns_6 .edd_download{width:16.6%}.edd_download_inner{padding:0 8px 8px;margin:0 0 10px}.edd_download_columns_2 .edd_download:nth-child(2n+1),.edd_download_columns_3 .edd_download:nth-child(3n+1),.edd_download_columns_4 .edd_download:nth-child(4n+1),.edd_download_columns_5 .edd_download:nth-child(5n+1),.edd_download_columns_6 .edd_download:nth-child(6n+1){clear:left}.edd_download_image{max-width:100%}.edd_download .edd_price{margin-bottom:10px}#edd_download_pagination{clear:both}.edd-hide-on-empty.cart-empty{display:none}edd-hide-on-empty.cart-not.empty{display:block}.edd-cart-ajax{margin:0 8px 0 4px;position:relative;top:2px;background:0 0;border:none;padding:0}.edd-cart-number-of-items{font-style:italic;color:grey}.edd-cart-meta.edd_subtotal{font-weight:700;font-style:italic}.edd-cart-meta.edd_cart_tax{font-size:1em;font-style:italic}.edd-cart-meta.edd_cart_tax::before{font-style:normal}.edd-cart-meta.edd_total{font-weight:700}.edd-cart-meta{padding:2px 5px}.edd-cart-meta.edd_subtotal,.edd-cart-meta.edd_total{background-color:#f9f9f9}.edd_errors:not(.edd-alert){-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;border:1px solid #e6db55;margin:0 0 21px;background:#ffffe0;color:#333}.edd_error{padding:10px}p.edd_error{margin:0!important}.edd_success:not(.edd-alert){-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;border:1px solid #b3ce89;margin:20px 0;background:#d5eab3;color:#567622;padding:6px 8px;box-shadow:inset 0 1px 0 rgba(255,255,255,.7)}.edd-alert{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;margin-bottom:20px;padding:10px;border:1px solid transparent;vertical-align:middle}.edd-alert p{padding:0}.edd-alert p:not(:last-child){margin-bottom:5px}.edd-alert p:last-child{margin-bottom:0}.edd-alert-error{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.edd-alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.edd-alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.edd-alert-warn{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}
templates/history-downloads.php CHANGED
@@ -67,7 +67,7 @@ if ( $purchases ) :
67
  </a>
68
  </div>
69
 
70
- <?php do_action( 'edd_download_history_files', $filekey, $file, $id, $payment->ID, $purchase_data );
71
  endforeach;
72
 
73
  else :
67
  </a>
68
  </div>
69
 
70
+ <?php do_action( 'edd_download_history_files', $filekey, $file, $download['id'], $payment->ID, $purchase_data );
71
  endforeach;
72
 
73
  else :
templates/shortcode-profile-editor.php CHANGED
@@ -112,7 +112,7 @@ if ( is_user_logged_in() ):
112
  $remove_url = wp_nonce_url(
113
  add_query_arg(
114
  array(
115
- 'email' => $email,
116
  'edd_action' => 'profile-remove-email',
117
  'redirect' => esc_url( edd_get_current_page_url() ),
118
  )
112
  $remove_url = wp_nonce_url(
113
  add_query_arg(
114
  array(
115
+ 'email' => rawurlencode( $email ),
116
  'edd_action' => 'profile-remove-email',
117
  'redirect' => esc_url( edd_get_current_page_url() ),
118
  )