Create New Item
×
Item Type
File
Folder
Item Name
×
Search file in folder and subfolders...
File Manager
/
wp-content
/
plugins
/
woocommerce
/
includes
/
data-stores
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php if (!defined('ABSPATH')) { exit; } class WC_Webhook_Data_Store implements WC_Webhook_Data_Store_Interface { public function create(&$webhook) { global $wpdb; $changes = $webhook->get_changes(); if (isset($changes['date_created'])) { $date_created = $webhook->get_date_created()->date('Y-m-d H:i:s'); $date_created_gmt = gmdate('Y-m-d H:i:s', $webhook->get_date_created()->getTimestamp()); } else { $date_created = current_time('mysql'); $date_created_gmt = current_time('mysql', 1); $webhook->set_date_created($date_created); } if (!isset($changes['pending_delivery'])) { $webhook->set_pending_delivery(true); } $data = array('status' => $webhook->get_status('edit'), 'name' => $webhook->get_name('edit'), 'user_id' => $webhook->get_user_id('edit'), 'delivery_url' => $webhook->get_delivery_url('edit'), 'secret' => $webhook->get_secret('edit'), 'topic' => $webhook->get_topic('edit'), 'date_created' => $date_created, 'date_created_gmt' => $date_created_gmt, 'api_version' => $this->get_api_version_number($webhook->get_api_version('edit')), 'failure_count' => $webhook->get_failure_count('edit'), 'pending_delivery' => $webhook->get_pending_delivery('edit')); $wpdb->insert($wpdb->prefix . 'wc_webhooks', $data); $webhook_id = $wpdb->insert_id; $webhook->set_id($webhook_id); $webhook->apply_changes(); $this->delete_transients($webhook->get_status('edit')); WC_Cache_Helper::invalidate_cache_group('webhooks'); do_action('woocommerce_new_webhook', $webhook_id, $webhook); } public function read(&$webhook) { global $wpdb; $data = wp_cache_get($webhook->get_id(), 'webhooks'); if (false === $data) { $data = $wpdb->get_row($wpdb->prepare("SELECT webhook_id, status, name, user_id, delivery_url, secret, topic, date_created, date_modified, api_version, failure_count, pending_delivery FROM {$wpdb->prefix}wc_webhooks WHERE webhook_id = %d LIMIT 1;", $webhook->get_id()), ARRAY_A); wp_cache_add($webhook->get_id(), $data, 'webhooks'); } if (is_array($data)) { $webhook->set_props(array('id' => $data['webhook_id'], 'status' => $data['status'], 'name' => $data['name'], 'user_id' => $data['user_id'], 'delivery_url' => $data['delivery_url'], 'secret' => $data['secret'], 'topic' => $data['topic'], 'date_created' => '0000-00-00 00:00:00' === $data['date_created'] ? null : $data['date_created'], 'date_modified' => '0000-00-00 00:00:00' === $data['date_modified'] ? null : $data['date_modified'], 'api_version' => $data['api_version'], 'failure_count' => $data['failure_count'], 'pending_delivery' => $data['pending_delivery'])); $webhook->set_object_read(true); do_action('woocommerce_webhook_loaded', $webhook); } else { throw new Exception(__('Invalid webhook.', 'woocommerce')); } } public function update(&$webhook) { global $wpdb; $changes = $webhook->get_changes(); $trigger = isset($changes['delivery_url']); if (isset($changes['date_modified'])) { $date_modified = $webhook->get_date_modified()->date('Y-m-d H:i:s'); $date_modified_gmt = gmdate('Y-m-d H:i:s', $webhook->get_date_modified()->getTimestamp()); } else { $date_modified = current_time('mysql'); $date_modified_gmt = current_time('mysql', 1); $webhook->set_date_modified($date_modified); } $data = array('status' => $webhook->get_status('edit'), 'name' => $webhook->get_name('edit'), 'user_id' => $webhook->get_user_id('edit'), 'delivery_url' => $webhook->get_delivery_url('edit'), 'secret' => $webhook->get_secret('edit'), 'topic' => $webhook->get_topic('edit'), 'date_modified' => $date_modified, 'date_modified_gmt' => $date_modified_gmt, 'api_version' => $this->get_api_version_number($webhook->get_api_version('edit')), 'failure_count' => $webhook->get_failure_count('edit'), 'pending_delivery' => $webhook->get_pending_delivery('edit')); $wpdb->update($wpdb->prefix . 'wc_webhooks', $data, array('webhook_id' => $webhook->get_id())); $webhook->apply_changes(); if (isset($changes['status'])) { $this->delete_transients('all'); } wp_cache_delete($webhook->get_id(), 'webhooks'); WC_Cache_Helper::invalidate_cache_group('webhooks'); if ('active' === $webhook->get_status() && ($trigger || $webhook->get_pending_delivery())) { $webhook->deliver_ping(); } do_action('woocommerce_webhook_updated', $webhook->get_id()); } public function delete(&$webhook) { global $wpdb; $wpdb->delete($wpdb->prefix . 'wc_webhooks', array('webhook_id' => $webhook->get_id()), array('%d')); $this->delete_transients('all'); wp_cache_delete($webhook->get_id(), 'webhooks'); WC_Cache_Helper::invalidate_cache_group('webhooks'); do_action('woocommerce_webhook_deleted', $webhook->get_id(), $webhook); } public function get_api_version_number($api_version) { return 'legacy_v3' === $api_version ? -1 : intval(substr($api_version, -1)); } public function get_webhooks_ids($status = '') { if (!empty($status)) { $this->validate_status($status); } $ids = get_transient($this->get_transient_key($status)); if (false === $ids) { $ids = $this->search_webhooks(array('limit' => -1, 'status' => $status)); $ids = array_map('absint', $ids); set_transient($this->get_transient_key($status), $ids); } return $ids; } public function search_webhooks($args) { global $wpdb; $args = wp_parse_args($args, array('limit' => 10, 'offset' => 0, 'order' => 'DESC', 'orderby' => 'id', 'paginate' => false)); $statuses = array('publish' => 'active', 'draft' => 'paused', 'pending' => 'disabled'); $orderby_mapping = array('ID' => 'webhook_id', 'id' => 'webhook_id', 'name' => 'name', 'title' => 'name', 'post_title' => 'name', 'post_name' => 'name', 'date_created' => 'date_created_gmt', 'date' => 'date_created_gmt', 'post_date' => 'date_created_gmt', 'date_modified' => 'date_modified_gmt', 'modified' => 'date_modified_gmt', 'post_modified' => 'date_modified_gmt'); $orderby = isset($orderby_mapping[$args['orderby']]) ? $orderby_mapping[$args['orderby']] : 'webhook_id'; $sort = 'ASC' === strtoupper($args['order']) ? 'ASC' : 'DESC'; $order = "ORDER BY {$orderby} {$sort}"; $limit = -1 < $args['limit'] ? $wpdb->prepare('LIMIT %d', $args['limit']) : ''; $offset = 0 < $args['offset'] ? $wpdb->prepare('OFFSET %d', $args['offset']) : ''; $status = !empty($args['status']) ? $wpdb->prepare('AND `status` = %s', isset($statuses[$args['status']]) ? $statuses[$args['status']] : $args['status']) : ''; $search = !empty($args['search']) ? $wpdb->prepare('AND `name` LIKE %s', '%' . $wpdb->esc_like(sanitize_text_field($args['search'])) . '%') : ''; $include = ''; $exclude = ''; $date_created = ''; $date_modified = ''; if (!empty($args['include'])) { $args['include'] = implode(',', wp_parse_id_list($args['include'])); $include = 'AND webhook_id IN (' . $args['include'] . ')'; } if (!empty($args['exclude'])) { $args['exclude'] = implode(',', wp_parse_id_list($args['exclude'])); $exclude = 'AND webhook_id NOT IN (' . $args['exclude'] . ')'; } if (!empty($args['after']) || !empty($args['before'])) { $args['after'] = empty($args['after']) ? '0000-00-00' : $args['after']; $args['before'] = empty($args['before']) ? current_time('mysql', 1) : $args['before']; $date_created = "AND `date_created_gmt` BETWEEN STR_TO_DATE('" . esc_sql($args['after']) . "', '%Y-%m-%d %H:%i:%s') and STR_TO_DATE('" . esc_sql($args['before']) . "', '%Y-%m-%d %H:%i:%s')"; } if (!empty($args['modified_after']) || !empty($args['modified_before'])) { $args['modified_after'] = empty($args['modified_after']) ? '0000-00-00' : $args['modified_after']; $args['modified_before'] = empty($args['modified_before']) ? current_time('mysql', 1) : $args['modified_before']; $date_modified = "AND `date_modified_gmt` BETWEEN STR_TO_DATE('" . esc_sql($args['modified_after']) . "', '%Y-%m-%d %H:%i:%s') and STR_TO_DATE('" . esc_sql($args['modified_before']) . "', '%Y-%m-%d %H:%i:%s')"; } $cache_key = WC_Cache_Helper::get_cache_prefix('webhooks') . 'search_webhooks' . md5(implode(',', $args)); $cache_value = wp_cache_get($cache_key, 'webhook_search_results'); if ($cache_value) { return $cache_value; } if ($args['paginate']) { $query = trim("SELECT SQL_CALC_FOUND_ROWS webhook_id\n\t\t\t\tFROM {$wpdb->prefix}wc_webhooks\n\t\t\t\tWHERE 1=1\n\t\t\t\t{$status}\n\t\t\t\t{$search}\n\t\t\t\t{$include}\n\t\t\t\t{$exclude}\n\t\t\t\t{$date_created}\n\t\t\t\t{$date_modified}\n\t\t\t\t{$order}\n\t\t\t\t{$limit}\n\t\t\t\t{$offset}"); $webhook_ids = wp_parse_id_list($wpdb->get_col($query)); $total = (int) $wpdb->get_var('SELECT FOUND_ROWS();'); $return_value = (object) array('webhooks' => $webhook_ids, 'total' => $total, 'max_num_pages' => $args['limit'] > 1 ? ceil($total / $args['limit']) : 1); } else { $query = trim("SELECT webhook_id\n\t\t\t\tFROM {$wpdb->prefix}wc_webhooks\n\t\t\t\tWHERE 1=1\n\t\t\t\t{$status}\n\t\t\t\t{$search}\n\t\t\t\t{$include}\n\t\t\t\t{$exclude}\n\t\t\t\t{$date_created}\n\t\t\t\t{$date_modified}\n\t\t\t\t{$order}\n\t\t\t\t{$limit}\n\t\t\t\t{$offset}"); $webhook_ids = wp_parse_id_list($wpdb->get_col($query)); $return_value = $webhook_ids; } wp_cache_set($cache_key, $return_value, 'webhook_search_results'); return $return_value; } protected function get_webhook_count($status = 'active') { global $wpdb; $cache_key = WC_Cache_Helper::get_cache_prefix('webhooks') . $status . '_count'; $count = wp_cache_get($cache_key, 'webhooks'); if (false === $count) { $count = absint($wpdb->get_var($wpdb->prepare("SELECT count( webhook_id ) FROM {$wpdb->prefix}wc_webhooks WHERE `status` = %s;", $status))); wp_cache_add($cache_key, $count, 'webhooks'); } return $count; } public function get_count_webhooks_by_status() { $statuses = array_keys(wc_get_webhook_statuses()); $counts = array(); foreach ($statuses as $status) { $counts[$status] = $this->get_webhook_count($status); } return $counts; } private function validate_status($status) { if (!array_key_exists($status, wc_get_webhook_statuses())) { throw new InvalidArgumentException(sprintf('Invalid status given: %s. Status must be one of: %s.', $status, implode(', ', array_keys(wc_get_webhook_statuses())))); } } private function get_transient_key($status = '') { return empty($status) ? 'woocommerce_webhook_ids' : sprintf('woocommerce_webhook_ids_status_%s', $status); } private function delete_transients($status = '') { delete_transient($this->get_transient_key('')); if (!empty($status)) { if ('all' === $status) { foreach (wc_get_webhook_statuses() as $status_key => $status_string) { delete_transient($this->get_transient_key($status_key)); } } else { delete_transient($this->get_transient_key($status)); } } } }