|
1
|
|
|
<?php |
|
2
|
|
|
add_action( 'wpsc_hourly_cron_task', 'wpsc_clear_stock_claims' ); |
|
3
|
|
|
add_action( 'wpsc_hourly_cron_task', '_wpsc_delete_expired_visitors' ); |
|
4
|
|
|
add_action( 'wpsc_weekly_cron_task', 'wpsc_lic_weekly_license_check' ); |
|
5
|
|
|
|
|
6
|
|
|
/** |
|
7
|
|
|
* Checks any active Addons license keys and updates license data |
|
8
|
|
|
* |
|
9
|
|
|
* @since 3.12.0 |
|
10
|
|
|
*/ |
|
11
|
|
|
function wpsc_lic_weekly_license_check() { |
|
12
|
|
|
|
|
13
|
|
|
$active_licenses = get_option( 'wpec_licenses_active_products', array() ); |
|
14
|
|
|
|
|
15
|
|
|
if ( empty( $active_licenses ) ) { |
|
16
|
|
|
return; |
|
17
|
|
|
} |
|
18
|
|
|
|
|
19
|
|
|
foreach ( (array) $active_licenses as $license ) { |
|
20
|
|
|
$license_info = get_option( 'wpec_product_' . $license . '_license_active' ); |
|
21
|
|
|
|
|
22
|
|
|
// data to send in our API request |
|
23
|
|
|
$api_params = array( |
|
24
|
|
|
'wpec_lic_action'=> 'check_license', |
|
25
|
|
|
'license' => $license_info->license_key, |
|
26
|
|
|
'item_id' => $license_info->item_id, |
|
27
|
|
|
'url' => home_url() |
|
28
|
|
|
); |
|
29
|
|
|
|
|
30
|
|
|
// Call the API |
|
31
|
|
|
$response = wp_safe_remote_post( |
|
32
|
|
|
'https://wpecommerce.org/', |
|
33
|
|
|
array( |
|
34
|
|
|
'timeout' => 15, |
|
35
|
|
|
'sslverify' => false, |
|
36
|
|
|
'body' => $api_params |
|
37
|
|
|
) |
|
38
|
|
|
); |
|
39
|
|
|
|
|
40
|
|
|
// make sure the response came back okay |
|
41
|
|
|
if ( is_wp_error( $response ) ) { |
|
42
|
|
|
return false; |
|
43
|
|
|
} |
|
44
|
|
|
|
|
45
|
|
|
$license_data = json_decode( wp_remote_retrieve_body( $response ) ); |
|
46
|
|
|
update_option( 'wpec_product_' . $license . '_license_active', $license_data ); |
|
47
|
|
|
} |
|
48
|
|
|
} |
|
49
|
|
|
|
|
50
|
|
|
function wpsc_add_tracking_cron() { |
|
51
|
|
|
$tracking = new WPSC_Tracking(); |
|
52
|
|
|
$tracking->send_data(); |
|
53
|
|
|
} |
|
54
|
|
|
add_action( 'wpsc_weekly_cron_task', 'wpsc_add_tracking_cron' ); |
|
55
|
|
|
|
|
56
|
|
|
/** |
|
57
|
|
|
* wpsc_clear_stock_claims, clears the stock claims, runs using wp-cron and when editing purchase log statuses via the dashboard |
|
58
|
|
|
*/ |
|
59
|
|
|
function wpsc_clear_stock_claims() { |
|
60
|
|
|
global $wpdb; |
|
61
|
|
|
|
|
62
|
|
|
$time = (float) get_option( 'wpsc_stock_keeping_time', 1 ); |
|
63
|
|
|
$interval = get_option( 'wpsc_stock_keeping_interval', 'day' ); |
|
64
|
|
|
|
|
65
|
|
|
// we need to convert into seconds because we're allowing decimal intervals like 1.5 days |
|
66
|
|
|
$convert = array( |
|
67
|
|
|
'hour' => 3600, |
|
68
|
|
|
'day' => 86400, |
|
69
|
|
|
'week' => 604800, |
|
70
|
|
|
); |
|
71
|
|
|
|
|
72
|
|
|
$seconds = floor( $time * $convert[ $interval ] ); |
|
73
|
|
|
|
|
74
|
|
|
$sql = $wpdb->prepare( 'DELETE FROM ' . WPSC_TABLE_CLAIMED_STOCK . ' WHERE last_activity < UTC_TIMESTAMP() - INTERVAL %d SECOND', $seconds ); |
|
75
|
|
|
$wpdb->query( $sql ); |
|
76
|
|
|
} |
|
77
|
|
|
|
|
78
|
|
|
|
|
79
|
|
|
/** Start the process that cleans up user profiles |
|
80
|
|
|
* |
|
81
|
|
|
* Request is made through AJAX to ensure all of the WordPress admin functionality is loaded. Necessary because there is |
|
82
|
|
|
* delete logic that is admin only. It is also possible that a plugin may have filters that need to run when users are deleted. |
|
83
|
|
|
* @access private |
|
84
|
|
|
* @since 3.8.14 |
|
85
|
|
|
* |
|
86
|
|
|
* @return how many expired visitors remain to be deleted, 0 if all done |
|
87
|
|
|
*/ |
|
88
|
|
|
function _wpsc_delete_expired_visitors() { |
|
89
|
|
|
|
|
90
|
|
|
if ( ! defined( 'WPSC_MAX_DELETE_PROFILE_TIME' ) ) { |
|
91
|
|
|
define( 'WPSC_MAX_DELETE_PROFILE_TIME', 20 ); |
|
92
|
|
|
} |
|
93
|
|
|
|
|
94
|
|
|
if ( ! defined( 'WPSC_MAX_DELETE_MEMORY_USAGE' ) ) { |
|
95
|
|
|
define( 'WPSC_MAX_DELETE_MEMORY_USAGE', 20 * 1024 * 1024 ); // allow up to 20 megabytes to be consumed by the delete processing |
|
96
|
|
|
} |
|
97
|
|
|
|
|
98
|
|
|
// We are going to record a little option so that support can confirm that the delete users cron is running |
|
99
|
|
|
add_option( '_wpsc_last_delete_expired_visitors_cron', date( 'Y-m-d H:i:s' ), null, 'no' ); |
|
100
|
|
|
|
|
101
|
|
|
$expired_visitor_ids = wpsc_get_expired_visitor_ids(); |
|
102
|
|
|
|
|
103
|
|
|
$a_little_bit_of_time_after_start = time() + WPSC_MAX_DELETE_PROFILE_TIME; |
|
104
|
|
|
$too_much_memory_is_being_used = memory_get_usage( true ) + WPSC_MAX_DELETE_MEMORY_USAGE; |
|
105
|
|
|
|
|
106
|
|
|
// For each of the ids double check to be sure there isn't any important data associated with the temporary user. |
|
107
|
|
|
// If important data is found the user is no longer temporary. We also use a filter so that if other plug-ins |
|
108
|
|
|
// want to either stop the user from being deleted, or do something with the information in the profile they |
|
109
|
|
|
// have that chance. |
|
110
|
|
|
foreach ( $expired_visitor_ids as $index => $expired_visitor_id ) { |
|
111
|
|
|
wpsc_do_delete_visitor_ajax( $expired_visitor_id ); |
|
112
|
|
|
|
|
113
|
|
|
unset( $expired_visitor_ids[$index] ); |
|
114
|
|
|
|
|
115
|
|
|
// in case we have a lot of users to delete we do some checking to make sure we don't |
|
116
|
|
|
// get caught in a loop using server resources for an extended period of time without yielding. |
|
117
|
|
|
// Different environments will be able to delete a different number of users in the allowed time, |
|
118
|
|
|
// that's the reason for the defined variable |
|
119
|
|
|
if ( (time() > $a_little_bit_of_time_after_start) || ( memory_get_usage( true ) > $too_much_memory_is_being_used ) ) { |
|
120
|
|
|
// next delete processing will happen no sooner than in a couple minutes, but as the time allowed for |
|
121
|
|
|
// delete processing increases the interval between cycles will also extend. |
|
122
|
|
|
wp_schedule_single_event( time() + ( 120 + 2 * WPSC_MAX_DELETE_PROFILE_TIME ), '_wpsc_delete_expired_visitors_action' ); |
|
123
|
|
|
break; |
|
124
|
|
|
} |
|
125
|
|
|
} |
|
126
|
|
|
|
|
127
|
|
|
// Since there are no visitors to delete this is a good time to cleanup the visitors meta table |
|
128
|
|
|
// eliminating any orphaned meta data, asingle SQL query will do it! |
|
129
|
|
|
if ( ! count( $expired_visitor_ids ) ) { |
|
130
|
|
|
global $wpdb; |
|
131
|
|
|
$sql = 'DELETE vm FROM ' . $wpdb->wpsc_visitormeta . ' vm LEFT JOIN ' . $wpdb->wpsc_visitors . ' v on v.id = vm.wpsc_visitor_id WHERE v.id IS NULL'; |
|
132
|
|
|
$wpdb->query( $sql ); |
|
133
|
|
|
} |
|
134
|
|
|
|
|
135
|
|
|
return count( $expired_visitor_ids ); |
|
136
|
|
|
} |
|
137
|
|
|
|
|
138
|
|
|
|
|
139
|
|
|
/** |
|
140
|
|
|
* Request a visitor be deleted via the WordPRess admin ajax path |
|
141
|
|
|
* |
|
142
|
|
|
* @access private |
|
143
|
|
|
* @since 3.8.14 |
|
144
|
|
|
* |
|
145
|
|
|
* @param int $visitor_id |
|
146
|
|
|
* |
|
147
|
|
|
* @return boolean, true on success, false on failure |
|
|
|
|
|
|
148
|
|
|
* |
|
149
|
|
|
*/ |
|
150
|
|
|
function wpsc_do_delete_visitor_ajax( $visitor_id ) { |
|
151
|
|
|
|
|
152
|
|
|
$delete_visitor_nonce_action = 'wpsc_delete_visitor_id_' . $visitor_id; |
|
153
|
|
|
|
|
154
|
|
|
$wpsc_security = wp_create_nonce( $delete_visitor_nonce_action ); |
|
155
|
|
|
|
|
156
|
|
|
$response = wp_safe_remote_post( |
|
157
|
|
|
admin_url( 'admin-ajax.php' ), |
|
158
|
|
|
array( |
|
159
|
|
|
'method' => 'POST', |
|
160
|
|
|
'timeout' => 15, |
|
161
|
|
|
'redirection' => 5, |
|
162
|
|
|
'httpversion' => '1.0', |
|
163
|
|
|
'blocking' => true, |
|
164
|
|
|
'headers' => array(), |
|
165
|
|
|
'body' => array( 'action' => 'wpsc_delete_visitor', 'wpsc_visitor_id' => $visitor_id, 'wpsc_security' => $wpsc_security, ), |
|
166
|
|
|
'cookies' => array(), |
|
167
|
|
|
) |
|
168
|
|
|
); |
|
169
|
|
|
|
|
170
|
|
|
if ( is_wp_error( $response ) ) { |
|
171
|
|
|
$result = false; |
|
172
|
|
|
} else { |
|
173
|
|
|
$result = true; |
|
174
|
|
|
} |
|
175
|
|
|
|
|
176
|
|
|
return $result; |
|
177
|
|
|
} |
|
178
|
|
|
|
|
179
|
|
|
|
|
180
|
|
|
// add admin action for convenience |
|
181
|
|
|
add_action( '_wpsc_delete_expired_visitors_action' , '_wpsc_delete_expired_visitors' ); |
|
182
|
|
|
|
This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.