/** * Setup current user object and customer ID as well as cart. * * @uses do_action() Calls 'wpsc_setup_customer' after customer data is ready * @access private * @since 3.8.13 * @return int visitor id * */ function _wpsc_action_setup_customer() { ///////////////////////////////////////////////////////////////////////// // Setting up the customer happens after WPEC is initialized AND after // WordPress has loaded. The reason for this is that the conditional // query tags are checked to see if the request is a 404 or a feed or // some other request that should not create a visitor profile. The // conditional query tags are not available until after the // posts_selection hook is processed. The 'wp' action is fired after // the 'posts_selection' hook. ///////////////////////////////////////////////////////////////////////// if (!did_action('init')) { _wpsc_doing_it_wrong(__FUNCTION__, __('Customer cannot be reliably setup until at least the "init" hook as been fired during AJAX processing.', 'wpsc'), '3.8.14'); } // if the customer cookie is invalid, unset it $visitor_id_from_cookie = _wpsc_validate_customer_cookie(); if ($visitor_id_from_cookie && is_user_logged_in()) { $id_from_wp_user = get_user_meta(get_current_user_id(), _wpsc_get_visitor_meta_key('visitor_id'), true); if (empty($id_from_wp_user)) { _wpsc_update_wp_user_visitor_id(get_current_user_id(), $visitor_id_from_cookie); } elseif ($visitor_id_from_cookie != $id_from_wp_user) { // save the old visitor id so the merge cart function can do its work wpsc_update_customer_meta('merge_cart_vistor_id', $visitor_id_from_cookie); // make the current customer cookie match the cookie that is in the WordPress user meta _wpsc_create_customer_id_cookie($id_from_wp_user); // merging cart requires the taxonomies to have been initialized if (did_action('wpsc_register_taxonomies_after')) { _wpsc_merge_cart(); } else { add_action('wpsc_register_taxonomies_after', '_wpsc_merge_cart', 1); } } } // initialize customer ID if it's not already there $visitor_id = wpsc_get_current_customer_id(); // if there wasn't a visitor id in the cookies we set it now if ($visitor_id && empty($visitor_id_from_cookie) && is_user_logged_in()) { _wpsc_create_customer_id_cookie($visitor_id); } // setup the cart and restore its items wpsc_core_setup_cart(); do_action('wpsc_setup_customer', $visitor_id); }
public function save() { if (defined('WPSC_LOAD_DEPRECATED') && WPSC_LOAD_DEPRECATED) { _wpsc_doing_it_wrong(__FUNCTION__, __('As of version 3.8.14 calling WPSC_Country class method "save" is not required. Changes to WPSC_Country properties are saved automatically.', 'wpsc'), '3.8.14'); } }
private function init_controller($controller) { global $wp_query; if (empty($controller)) { return; } $controller_args = trim(get_query_var('wpsc_controller_args'), '/'); $controller_args = explode('/', $controller_args); if (!is_array($controller_args)) { $controller_args = array(); } $slug = array_shift($controller_args); $method = str_replace(array(' ', '-'), '_', $slug); if (!$method) { $slug = $method = 'index'; } $this->controller_slug = $slug; $this->controller_method = $method; $this->controller_name = $controller; $this->controller = _wpsc_load_controller($controller); // If method/path not found, show the 404 page if (!is_callable(array($this->controller, $method))) { _wpsc_doing_it_wrong(__FUNCTION__, __('Invalid controller method: ' . get_class($this->controller) . '::' . $method . '()', 'wpsc'), '4.0'); return $this->not_found(); } do_action('wpsc_router_init'); $this->controller_args = $controller_args; if (is_callable(array($this->controller, '_pre_action'))) { call_user_func(array($this->controller, '_pre_action'), $this->controller_method, $this->controller_args); } call_user_func_array(array($this->controller, $this->controller_method), $this->controller_args); if (is_callable(array($this->controller, '_post_action'))) { call_user_func(array($this->controller, '_post_action'), $this->controller_method, $this->controller_args); } }
/** * Update customer information using information supplied by shopper on WPeC pages * * @since 3.8.14 * * @global $_REQUEST['meta_data'] array of key value pairs that the user has changed, key is meta item name, value is new value * * @return JSON encoded response array with results * * $RESPONSE['request'] : array containing the original AJAX $_REQUEST that was sent to * the server, use to match up asynchronous AJAX transactions, or * to see original rquiest paramters * * $RESPONSE['customer_meta'] : array of key value pairs containing updated meta values. The * specific value changed is not included. If there isn't any updated * customer meta, other than the original meta changed, this array element * may not be present, or may be present and empty * * $response['checkout_info'] : array of updated checkout information, array key is the HTML element ID * where the information is presented on the checkout form. If there isn't * any updated checkout information this array element may not be present, * or may be present and empty * * */ function wpsc_customer_updated_data_ajax() { $success = true; // we will echo back the request in the (likely async) response so that the client knows // which transaction the response matches $response = array('request' => $_REQUEST); // update can be a single key/value pair or an array of key value pairs if (!empty($_REQUEST['meta_data'])) { $customer_meta = isset($_REQUEST['meta_data']) ? $_REQUEST['meta_data'] : array(); } elseif (!empty($_REQUEST['meta_key']) && isset($_REQUEST['meta_value'])) { $customer_meta = array($_REQUEST['meta_key'] => $_REQUEST['meta_value']); } else { _wpsc_doing_it_wrong(__FUNCTION__, __('missing meta key or meta array', 'wpsc'), '3.8.14'); $customer_meta = array(); } // We will want to know which interface elements have changed as a result of this meta update, // capture the current state of the elements $checkout_info_before_updates = _wpsc_get_checkout_info(); // We will want to know which, if any, checkout meta changes as a result of hooks and filters // that may fire as we update each meta item $all_checkout_meta_before_updates = _wpsc_get_checkout_meta(); if (!empty($customer_meta)) { foreach ($customer_meta as $meta_key => $meta_value) { // this will echo back any fields to the requester. It's a // means for the requester to maintain some state during // asynchronous requests if (!empty($meta_key)) { $updated = wpsc_update_customer_meta($meta_key, $meta_value); $success = $success & $updated; } } // loop through a second time so that all of the meta has been set, tht way if there are // dependencies in response calculation foreach ($customer_meta as $meta_key => $meta_value) { $response = apply_filters('wpsc_customer_meta_response_' . $meta_key, $response, $meta_key, $meta_value); } if ($success) { $response['type'] = 'success'; $response['error'] = ''; } else { $response['type'] = 'error'; $response['error'] = __('meta values may not have been updated', 'wpsc'); } } else { $response['type'] = 'error'; $response['error'] = __('invalid parameters, meta array or meta key value pair required', 'wpsc'); } // Let's see what the current state of the customer meta set is after we applied the requested updates $all_checkout_meta_after_updates = _wpsc_get_checkout_meta(); foreach ($all_checkout_meta_after_updates as $current_meta_key => $current_meta_value) { // if the meta key and value are the same as what was sent in the request we don't need to // send them back because the client already knows about this. // // But we have to check just in case a data rule or a plugin that used our hooks made some adjustments if (isset($all_checkout_meta_before_updates[$current_meta_key]) && $all_checkout_meta_before_updates[$current_meta_key] == $current_meta_value) { // new value s the same as the old value, why send it? unset($all_checkout_meta_after_updates[$current_meta_key]); unset($all_checkout_meta_before_updates[$current_meta_key]); continue; } // if the meta value we are considering sending back is one of the values the client gave, we don't send it // because the client already knows the meta value and it is probably already visible in the user interface if (isset($customer_meta[$current_meta_key]) && $customer_meta[$current_meta_key] == $current_meta_value) { // new value s the same as the old value, why send it? unset($all_checkout_meta_after_updates[$current_meta_key]); continue; } } // Any checkout meta that has changed as a result of the requeeted updates remains // in our array, add it to the response $response['customer_meta'] = $all_checkout_meta_after_updates; // Get the changed checkout information and if something has changed add it to the repsonse $new_checkout_info = _wpsc_remove_unchanged_checkout_info($checkout_info_before_updates, _wpsc_get_checkout_info()); if (!empty($new_checkout_info)) { $response['checkout_info'] = $new_checkout_info; } else { if (isset($response['checkout_info'])) { unset($response['checkout_info']); } } // do the shipping quotes need to be recalcualted? $response['needs_shipping_recalc'] = wpsc_cart_need_to_recompute_shipping_quotes(); wp_send_json_success($response); }
/** * Delete a customer meta * @param string * @return JSON encoded array with results, results include original request parameters * @since 3.8.14 */ function wpsc_delete_customer_meta_ajax() { $meta_key = isset($_POST['meta_key']) ? $_REQUEST['meta_key'] : ''; $response = array('request' => $_REQUEST); if (!empty($meta_key)) { $response['old_value'] = wpsc_get_customer_meta($meta_key); $response['type'] = __('success', 'wpsc'); $response['error'] = ''; wpsc_delete_customer_meta($meta_key); } else { $response['old_value'] = ''; $response['type'] = __('error', 'wpsc'); $response['error'] = __('no meta key', 'wpsc'); _wpsc_doing_it_wrong(__FUNCTION__, __('missing meta key', 'wpsc'), '3.8.14'); } $response = _wpsc_add_customer_meta_to_response($response); wp_send_json_success($response); }
/** * Make sure the data is available * * @access public * * @since 3.8.14 * * @return string a map name to uniquely identify this map so it can be saved and restored */ private function _confirm_data_ready() { if (!is_array($this->_map_data)) { // if this is a named map we can try to restore it from the transient store if (!empty($this->_map_name)) { $this->_map_data = get_transient($this->_map_name); } // if we still don't have a valid map and there is a constructor callback use it if (!is_array($this->_map_data) && !empty($this->_map_callback) && is_callable($this->_map_callback)) { static $already_invoking_callback = array(); // the callback could be a string or an array, we can keep track of // who's call we are processing tp avoid a recursion problem, just in case! $callback_unique_key = md5(json_encode($this->_map_callback)); if (!array_key_exists($callback_unique_key, $already_invoking_callback)) { $already_invoking_callback[$callback_unique_key] = true; $this->_map_data = array(); // callback has a single parameter, the data map call_user_func($this->_map_callback, $this); if (!is_array($this->_map_data)) { $this->_map_data = array(); } if (!empty($this->_map_name)) { set_transient($this->_map_name, $this->_map_data); } // we just loaded and saved the data, that makes it not dirty $this->_dirty = false; } else { if (is_array($this->_map_callback)) { $function = $this->_map_callback[0] . '::' . $this->_map_callback[1]; } else { $function = $this->_map_callback; } _wpsc_doing_it_wrong($function, __('WPSC_Data_Map map creation callback is recursively calling itself.', 'wpsc'), '3.8.14'); } unset($already_invoking_callback[$callback_unique_key]); } // if we still don't have valid map data create an empty array if (!is_array($this->_map_data)) { $this->_map_data = array(); } } return is_array($this->_map_data); }
/** * Delete a purchase log * * @deprecated Use WPSC_Purchase_Log->delete() instead. * * @param int|string $purchlog_id Required. Purchase log ID (empty string is deprecated). * @return boolean Deleted successfully. */ function wpsc_delete_purchlog($purchlog_id = '') { global $wpdb; // Deprecate empty purchase log ID parameter. if ($purchlog_id == '') { _wpsc_doing_it_wrong('wpsc_delete_purchlog', __('$purchlog_id parameter requires a numeric purchase log ID.', 'wp-e-commerce'), '3.9.0'); return false; } $log = new WPSC_Purchase_Log($purchlog_id); return $log->delete(); }
/** * @description: wpec_taxes_get_region_information - given a region code and column * this function will return the resulting value. * @param: region_code - code for this region * @param: attribute (optional) - specify a column to retrieve * Default action is to retrieve the id column. * @return: int, string, or false * */ function wpec_taxes_get_region_information($region, $attribute = 'id', $country = null) { $returnable = false; if ('all-markets' == $region || 'all-markets' == $country) { $returnable = __('All Markets', 'wpsc'); } else { // prior to version 3.8.14 this function was made available without the country parameter, because // there is no assurance that region code ar unique across the globe we need to specify a country // at the time of this change this function was not called with WPeC, but just in case we have a // little logic here to try to catch an improper call, but it isn't perfect. if ($country == null) { _wpsc_doing_it_wrong(__FUNCTION__, __('Prior to version 3.8.14 this function was made available without the country parameter. Because there is no assurance that region codes are unique across the globe, we need to specify a country.', 'wpsc'), '3.8.14'); } //check for all markets ifset return the string 'All Markets' if (!$returnable) { $wpsc_country = new WPSC_Country($country); if ($wpsc_country) { $wpsc_region = $wpsc_country->get_region($region); if ($wpsc_region) { $returnable = $wpsc_region->get($attribute); } } } } return $returnable; }
/** * Returns the Cart Widget * * @param boolean $die Whether or not to return the output (for new JSON requests) or to die() on the old $output / action. * @param array $cart_message An array of cart messages to be optionally passed. Primarily passed via wpsc_add_to_cart(). * * @since 3.8.11 * @return mixed Returns an array of output data, alternatively */ function _wpsc_ajax_get_cart($die = true, $cart_messages = array()) { $return = array(); if (defined('DOING_AJAX') && DOING_AJAX) { ob_start(); include_once wpsc_get_template_file_path('wpsc-cart_widget.php'); $output = ob_get_contents(); ob_end_clean(); $output = str_replace(array('\\n', '\\r'), '', $output); $return['widget_output'] = $output; $return['core_images_url'] = WPSC_CORE_IMAGES_URL; if (1 == get_option('show_sliding_cart') || empty($cart_messages)) { if (wpsc_cart_item_count()) { $_SESSION['slider_state'] = 1; $return['sliding_cart_state'] = 'show'; } else { $_SESSION['slider_state'] = 0; $return['sliding_cart_state'] = 'hide'; } } $action_output = ''; if (has_action('wpsc_alternate_cart_html') && empty($_REQUEST['_wpsc_compat_ajax'])) { //Deprecated action. Do not use. We now have a custom JS event called 'wpsc_fancy_notification'. There is access to the complete $json_response object. ob_start(); echo _wpsc_get_alternate_html($cart_messages); $action_output = ob_get_contents(); $output = ''; ob_end_clean(); } if (!empty($action_output)) { _wpsc_doing_it_wrong('wpsc_alternate_cart_html', __('As of WPeC 3.8.11, it is improper to hook into "wpsc_alternate_cart_html" to output javascript. We now have a custom javascript event called "wpsc_fancy_notification" you can hook into.', 'wpsc'), '3.8.11'); $return['wpsc_alternate_cart_html'] = $action_output; } } if ($die) { echo $output . $action_output; die; } else { return $return; } }
/** * Doing it Wrong * * @since 4.0 * @access private */ function _wpsc_doing_it_wrong($method) { _wpsc_doing_it_wrong('wpsc_products_by_category->' . $method . '()', __('This class is deprecated. There is no direct replacement. Hiding subcategory products in parent categories is now handled by the private wpsc_hide_subcatsprods_in_cat_query() function.', 'wp-e-commerce'), '4.0'); }
/** * Prior to using the global cart variable cart template API functions should check * to be sure the global cart variable has been initialized. * * @access private * @static * @since 3.8.14 * * @uses wpsc_cart * @return boolean true if we have a valid cart, false otherwise * */ function _wpsc_verify_global_cart_has_been_initialized($function = __FUNCTION__) { global $wpsc_cart; $we_have_a_valid_cart = !empty($wpsc_cart) && is_a($wpsc_cart, 'wpsc_cart'); if (!$we_have_a_valid_cart) { $wpsc_cart = wpsc_get_customer_cart(); $we_have_a_valid_cart = !empty($wpsc_cart) && is_a($wpsc_cart, 'wpsc_cart'); } // We will try to give a helpful message to the developer so that they can adjust their code static $already_gave_no_valid_cart_message = false; if (!$we_have_a_valid_cart && !$already_gave_no_valid_cart_message) { _wpsc_doing_it_wrong($function, __('The WPeC global cart is not yet initialized. Accessing global cart properties and methods will not work.', 'wpsc'), '3.8.14'); $already_gave_no_valid_cart_message = true; } return $we_have_a_valid_cart; }
/** * saves region data to the database * * @access private * * @since 3.8.14 * * @param array key/value pairs that are put into the database columns * * @return int|boolean country_id on success, false on failure */ private function _save_region_data($region_data) { global $wpdb; /* * We need to figure out if we are updating an existing country. There are three * possible unique identifiers for a country. Look for a row that has any of the * identifiers. */ $region_id = isset($region_data['id']) ? intval($region_data['id']) : 0; $country_id = isset($region_data['country_id']) ? intval($region_data['country_id']) : 0; $region_code = isset($region_data['code']) ? $region_data['code'] : ''; $region_name = isset($region_data['code']) ? $region_data['code'] : ''; $region_id_from_db = false; /* * If at least one of the key feilds ins't present we aren'y going to continue, we can't reliably update * a row in the table, nor could we insrt a row that could reliably be updated. */ if (empty($country_id) || empty($region_code) || empty($region_name)) { _wpsc_doing_it_wrong(__FUNCTION__, __('Creating a new region requires country id, region code and region name.', 'wpsc'), '3.8.11'); return $region_id_from_db; } if ($region_id) { $sql = $wpdb->prepare('SELECT id FROM ' . WPSC_TABLE_REGION_TAX . ' WHERE (`id` = %d )', $region_id); $region_id_from_db = $wpdb->get_var($sql); } if (empty($region_id_from_db)) { // we are doing an insert of a new country $result = $wpdb->insert(WPSC_TABLE_REGION_TAX, $region_data); if ($result) { $region_id_from_db = $wpdb->insert_id; } } else { // we are doing an update of an existing country if (isset($region_data['id'])) { // no need to update the id to itself, don't want to allow changing of region id's either unset($region_data['id']); } $wpdb->update(WPSC_TABLE_REGION_TAX, $region_data, array('id' => $region_id_from_db), '%s', array('%d')); } // clear the cached data, force a rebuild WPSC_Countries::clear_cache(); return $region_id_from_db; }
/** * Deletes a log from the database. * * @access public * @since 3.8.9 * * @uses $wpdb Global database instance. * @uses wpsc_is_store_admin() Check user has admin capabilities. * @uses WPSC_Purchase_Log::delete_cache() Delete purchaselog cache. * @uses WPSC_Claimed_Stock Claimed Stock class. * * @param string $log_id ID of the log. * @return boolean Deleted successfully. */ public function delete($log_id = false) { global $wpdb; if (!(isset($this) && get_class($this) == __CLASS__)) { _wpsc_doing_it_wrong('WPSC_Purchase_Log::delete', __('WPSC_Purchase_Log::delete() is no longer a static method and should not be called statically.', 'wpsc'), '3.9.0'); } if (false !== $log_id) { _wpsc_deprecated_argument(__FUNCTION__, '3.9.0', 'The $log_id param is not used. You must first create an instance of WPSC_Purchase_Log before calling this method.'); } if (!wpsc_is_store_admin()) { return false; } $log_id = $this->get('id'); if ($log_id > 0) { do_action('wpsc_purchase_log_before_delete', $log_id); self::delete_cache($log_id); // Delete claimed stock $purchlog_status = $wpdb->get_var($wpdb->prepare("SELECT `processed` FROM `" . WPSC_TABLE_PURCHASE_LOGS . "` WHERE `id`= %d", $log_id)); if ($purchlog_status == WPSC_Purchase_Log::CLOSED_ORDER || $purchlog_status == WPSC_Purchase_Log::INCOMPLETE_SALE) { $claimed_query = new WPSC_Claimed_Stock(array('cart_id' => $log_id, 'cart_submitted' => 1)); $claimed_query->clear_claimed_stock(0); } // Delete cart content, submitted data, then purchase log $wpdb->query($wpdb->prepare("DELETE FROM `" . WPSC_TABLE_CART_CONTENTS . "` WHERE `purchaseid` = %d", $log_id)); $wpdb->query($wpdb->prepare("DELETE FROM `" . WPSC_TABLE_SUBMITTED_FORM_DATA . "` WHERE `log_id` IN (%d)", $log_id)); $wpdb->query($wpdb->prepare("DELETE FROM `" . WPSC_TABLE_PURCHASE_LOGS . "` WHERE `id` = %d LIMIT 1", $log_id)); do_action('wpsc_purchase_log_delete', $log_id); return true; } return false; }
/** * saves country data to the database * * @access WPeC private * * @since 3.8.14 * * @param array key/value pairs that are put into the database columns * * @return int|boolean country_id on success, false on failure */ public static function _save_country_data($country_data) { global $wpdb; /* * We need to figure out if we are updating an existing country. There are three * possible unique identifiers for a country. Look for a row that has any of the * identifiers. */ $country_id = isset($country_data['id']) ? intval($country_data['id']) : 0; $country_iso_code = isset($country_data['isocode']) ? $country_data['isocode'] : ''; /* * If at least one of the key feilds ins't present we aren'y going to continue, we can't reliably update * a row in the table, nor could we insrt a row that could reliably be updated. */ if (empty($country_id) && empty($country_iso_code)) { _wpsc_doing_it_wrong(__FUNCTION__, __('To insert a country either country id or country ISO code must be specified.', 'wpsc'), '3.8.11'); return false; } // check the database to find the country id $sql = $wpdb->prepare('SELECT id FROM ' . WPSC_TABLE_CURRENCY_LIST . ' WHERE (`id` = %d ) OR ( `isocode` = %s ) ', $country_id, $country_iso_code); $country_id_from_db = $wpdb->get_var($sql); // do a little data clean up prior to inserting into the database if (isset($country_data['has_regions'])) { $country_data['has_regions'] = $country_data['has_regions'] ? 1 : 0; } if (isset($country_data['visible'])) { $country_data['visible'] = $country_data['visible'] ? 1 : 0; } // insert or update the information if (empty($country_id_from_db)) { // we are doing an insert of a new country $result = $wpdb->insert(WPSC_TABLE_CURRENCY_LIST, $country_data); if ($result) { $country_id_from_db = $wpdb->insert_id; } } else { // we are doing an update of an existing country if (isset($country_data['id'])) { // no nead to update the id to itself unset($country_data['id']); } $wpdb->update(WPSC_TABLE_CURRENCY_LIST, $country_data, array('id' => $country_id_from_db), '%s', array('%d')); } // clear the cached data, force a rebuild by getting a country self::clear_cache(); return $country_id_from_db; }
/** * deprecating user log filter for getting all customer meta as an array. * *@deprecated 3.8.14 * * @return none */ function wpsc_deprecated_filter_user_log_get() { if (has_filter('wpsc_user_log_get')) { $meta_data = wpsc_get_customer_meta('checkout_details'); $meta_data = apply_filters('wpsc_user_log_get', $meta_data, wpsc_get_current_customer_id()); wpsc_update_customer_meta('checkout_details', $meta_data); _wpsc_doing_it_wrong('wpsc_user_log_get', __('The filter being used has been deprecated. Use wpsc_get_visitor_meta or wpsc_get_visitor_meta_$meta_name instead.', 'wp-e-commerce'), '3.8.14'); } }
/** * Hide Subcat Products Init * * @deprecated Since 4.0. Hiding subcategory products in parent categories is now handled by the private wpsc_hide_subcatsprods_in_cat_query() function. */ function wpsc_hidesubcatprods_init() { _wpsc_doing_it_wrong('wpsc_hidesubcatprods_init', __('This function is deprecated. There is no direct replacement. Hiding subcategory products in parent categories is now handled by the private wpsc_hide_subcatsprods_in_cat_query() function.', 'wp-e-commerce'), '4.0'); }
/* * @since 3.8.14 * * We are going to do a check to see if the cart template API include file has no been included. Pre 3.8.14 the * template API functions were in the cart.class.php file before the class definition. In 3.8.14 the functions * are in a separate that is included immediately before this file. In the future we will want to have the option * of changing the order and classes may be included at a different point in the init sequence. * * If we find that a key function we expect to be present does not exist it tells is that this file has been * improperly included directly in outside code. We will give a doing it wrong message. * * So that backwards compatibility is preserved for 3.8.14 we also require_once the cart template API file. * */ if (!function_exists('wpsc_cart_need_to_recompute_shipping_quotes')) { _wpsc_doing_it_wrong('cart.class.php', __('As of WPeC 3.8.14, A check is made to be sure that wpsc-includes\\cart.class.php is not loaded directly by outside code. WPeC internals are likely to be re-organized going forward. When this happens code that directly includes WPeC internal modules may fail.', 'wpsc'), '3.8.14'); } require_once WPSC_FILE_PATH . '/wpsc-includes/cart-template-api.php'; /** * The WPSC Cart class */ class wpsc_cart { public $delivery_country; public $selected_country; public $delivery_region; public $selected_region; public $selected_shipping_method = null; public $selected_shipping_option = null; public $selected_shipping_amount = null; public $coupon;
/** * Make sure the data is available * * @access public * * @since 3.8.14 * * @return string a map name to uniquely identify this map so it can be saved and restored */ private function _confirm_data_ready() { if (!is_array($this->_map_data)) { // if this is a named map we can try to restore it from the transient store if (!empty($this->_map_name)) { // TODO: Maybe figure out why this causes problems with APC caches, or maybe it doesn't? // In any case because transients can be deleted at any time commenting this out should // merely force a rebuild. // see https://wordpress.org/support/topic/fatal-error-wpsc_countries/page/2?replies=49#post-6812338 $this->_map_data = _wpsc_get_transient($this->_map_name); } // if we still don't have a valid map and there is a constructor callback use it if (!is_array($this->_map_data) && !empty($this->_map_callback) && is_callable($this->_map_callback)) { static $already_invoking_callback = array(); // the callback could be a string or an array, we can keep track of // who's call we are processing tp avoid a recursion problem, just in case! $callback_unique_key = md5(json_encode($this->_map_callback)); if (!array_key_exists($callback_unique_key, $already_invoking_callback)) { $already_invoking_callback[$callback_unique_key] = true; $this->_map_data = array(); // callback has a single parameter, the data map call_user_func($this->_map_callback, $this); if (!is_array($this->_map_data)) { $this->_map_data = array(); } if (!empty($this->_map_name)) { _wpsc_set_transient($this->_map_name, $this->_map_data); } // we just loaded and saved the data, that makes it not dirty $this->_dirty = false; } else { if (is_array($this->_map_callback)) { $function = $this->_map_callback[0] . '::' . $this->_map_callback[1]; } else { $function = $this->_map_callback; } _wpsc_doing_it_wrong($function, __('WPSC_Data_Map map creation callback is recursively calling itself.', 'wpsc'), '3.8.14'); } unset($already_invoking_callback[$callback_unique_key]); } // if we still don't have valid map data create an empty array if (!is_array($this->_map_data)) { $this->_map_data = array(); } } return is_array($this->_map_data); }