/** * Modifies the search query. * * Affects searches performed in the list of Users. * * @package s2Member\Users_List * @since 3.5 * * @attaches-to ``add_action("pre_user_query");`` * * @param WP_User_Query $query Expects a `WP_User_Query` object, by reference. */ public static function users_list_query(&$query = NULL) { global $wpdb; /** @var $wpdb wpdb */ foreach (array_keys(get_defined_vars()) as $__v) { $__refs[$__v] =& ${$__v}; } do_action("ws_plugin__s2member_before_users_list_search", get_defined_vars()); unset($__refs, $__v); if (is_admin() && !empty($GLOBALS['pagenow']) && $GLOBALS['pagenow'] === 'users.php') { if (isset($query->query_vars) && !is_network_admin()) { // NOT in Network admin panels. if (is_array($qv = $query->query_vars) && ($s = trim($qv["search"], "* \t\n\r\v")) && ($s = "%" . esc_sql(c_ws_plugin__s2member_utils_strings::like_escape($s)) . "%")) { $query->query_fields = "SQL_CALC_FOUND_ROWS DISTINCT(`" . $wpdb->users . "`.`ID`)"; $query->query_from = " FROM `" . $wpdb->users . "`, `" . $wpdb->usermeta . "`"; // Include meta table also. $query->query_where = " WHERE `" . $wpdb->users . "`.`ID` = `" . $wpdb->usermeta . "`.`user_id`"; // Join w/ meta table. $query->query_where .= " AND (" . apply_filters("ws_plugin__s2member_before_users_list_search_where_or_before", "", get_defined_vars()); $query->query_where .= " (`" . $wpdb->users . "`.`user_login` LIKE '" . $s . "' OR `" . $wpdb->users . "`.`user_nicename` LIKE '" . $s . "' OR `" . $wpdb->users . "`.`display_name` LIKE '" . $s . "' OR `" . $wpdb->users . "`.`user_email` LIKE '" . $s . "' OR `" . $wpdb->users . "`.`user_url` LIKE '" . $s . "')"; $query->query_where .= " OR ((`" . $wpdb->usermeta . "`.`meta_key` = 'first_name' OR `" . $wpdb->usermeta . "`.`meta_key` = 'last_name') AND `" . $wpdb->usermeta . "`.`meta_value` LIKE '" . $s . "')"; $query->query_where .= " OR (`" . $wpdb->usermeta . "`.`meta_key` = '" . $wpdb->base_prefix . "s2member_subscr_id' AND `" . $wpdb->usermeta . "`.`meta_value` LIKE '" . $s . "')"; $query->query_where .= " OR (`" . $wpdb->usermeta . "`.`meta_key` = '" . $wpdb->base_prefix . "s2member_custom' AND `" . $wpdb->usermeta . "`.`meta_value` LIKE '" . $s . "')"; $query->query_where .= " OR (`" . $wpdb->usermeta . "`.`meta_key` = '" . $wpdb->base_prefix . "s2member_custom_fields' AND `" . $wpdb->usermeta . "`.`meta_value` LIKE '" . $s . "')"; if (apply_filters("ws_plugin__s2member_users_list_search_admin_notes", FALSE, get_defined_vars())) { // Off by default; this can get very slow on large sites. $query->query_where .= " OR (`" . $wpdb->usermeta . "`.`meta_key` = '" . $wpdb->base_prefix . "s2member_notes' AND `" . $wpdb->usermeta . "`.`meta_value` LIKE '" . $s . "')"; } $query->query_where .= apply_filters("ws_plugin__s2member_before_users_list_search_where_or_after", "", get_defined_vars()) . ")"; // Leaving room for additional searches here. if (is_multisite()) { // On a Multisite Network we need to make sure we're searching only users w/ capabilities on this blog. $query->query_where .= " AND `" . $wpdb->users . "`.`ID` IN(SELECT DISTINCT(`user_id`) FROM `" . $wpdb->usermeta . "` WHERE `meta_key` = '" . $wpdb->prefix . "capabilities')"; } $query->query_from = apply_filters("ws_plugin__s2member_before_users_list_search_from", $query->query_from, get_defined_vars()); $query->query_where = apply_filters("ws_plugin__s2member_before_users_list_search_where", $query->query_where, get_defined_vars()); } } } foreach (array_keys(get_defined_vars()) as $__v) { $__refs[$__v] =& ${$__v}; } do_action("ws_plugin__s2member_after_users_list_search", get_defined_vars()); unset($__refs, $__v); }
/** * Handles the exportation of Users/Members. * * @package s2Member\Exports * @since 140724 * * @return null Or exits script execution after issuing file download prompt with CSV file. */ public static function export_users() { if (!empty($_POST['ws_plugin__s2member_pro_export_users']) && ($nonce = $_POST['ws_plugin__s2member_pro_export_users']) && wp_verify_nonce($nonce, 'ws-plugin--s2member-pro-export-users') && current_user_can('create_users')) { global $wpdb; // Global database object reference. /** @var \wpdb $wpdb This line for IDEs that need a reference. */ global $current_site, $current_blog; // Multisite Networking. @set_time_limit(0); @ini_set('memory_limit', apply_filters('admin_memory_limit', WP_MAX_MEMORY_LIMIT)); @ini_set('zlib.output_compression', 0); if (function_exists('apache_setenv')) { @apache_setenv('no-gzip', '1'); } while (@ob_end_clean()) { } $format = !empty($_POST['ws_plugin__s2member_pro_export_users_format']) ? $_POST['ws_plugin__s2member_pro_export_users_format'] : ''; $utf8_bom = isset($_POST['ws_plugin__s2member_pro_export_users_utf8_bom']) ? (int) $_POST['ws_plugin__s2member_pro_export_users_utf8_bom'] : 0; $start = !empty($_POST['ws_plugin__s2member_pro_export_users_start']) ? (int) $_POST['ws_plugin__s2member_pro_export_users_start'] : 1; $limit = !empty($_POST['ws_plugin__s2member_pro_export_users_limit']) ? (int) $_POST['ws_plugin__s2member_pro_export_users_limit'] : apply_filters('ws_plugin__s2member_pro_export_users_limit', 1000); // Back compatibility; and for blog farms. $start = $start >= 1 ? $start : 1; // Must be 1 or higher. $sql_s = $start === 1 ? 0 : $start; // 1 should be 0. $export = ''; // Initialize the export file variable. $user_keys = array(); // Initialize array of user keys. if (is_object($_user_row = $wpdb->get_row("SELECT * FROM `" . $wpdb->users . "` LIMIT 1"))) { foreach (array_keys((array) $_user_row) as $_user_key) { if (!in_array($_user_key, array('user_pass'), TRUE)) { $user_keys[] = $_user_key; } } } unset($_user_row, $_user_key); // Housekeeping. $user_keys = array_unique($user_keys); // Only unique keys please. $user_permission_keys = array('role', 'ccaps'); $user_meta_keys = $wpdb->get_col("SELECT DISTINCT `meta_key` FROM `" . $wpdb->usermeta . "` WHERE (`" . $wpdb->usermeta . "`.`meta_key` NOT LIKE '" . esc_sql(c_ws_plugin__s2member_utils_strings::like_escape($wpdb->base_prefix)) . "%' OR `" . $wpdb->usermeta . "`.`meta_key` LIKE '" . esc_sql(c_ws_plugin__s2member_utils_strings::like_escape($wpdb->prefix)) . "%')"); $user_meta_keys = is_array($user_meta_keys) ? $user_meta_keys : array(); foreach ($user_meta_keys as $_index => $_meta_key) { if ($_meta_key === $wpdb->prefix . 's2member_custom_fields') { unset($user_meta_keys[$_index]); } } if (is_multisite() && c_ws_plugin__s2member_utils_conds::is_multisite_farm() && !is_main_site()) { foreach ($user_meta_keys as $_index => $_meta_key) { if (strpos($_meta_key, $wpdb->prefix) !== 0) { if (!in_array($_meta_key, array('first_name', 'last_name', 'nickname', 'description'), TRUE)) { unset($user_meta_keys[$_index]); } } } } unset($_index, $_meta_key); // Housekeeping. $user_meta_keys = array_unique($user_meta_keys); // Only unique keys please. $user_custom_field_keys = array(); // Initialize this array. if ($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_fields']) { foreach (json_decode($GLOBALS['WS_PLUGIN__']['s2member']['o']['custom_reg_fields'], TRUE) as $_field) { $custom_field_var = preg_replace('/[^a-z0-9]/i', '_', strtolower($_field['id'])); $user_custom_field_keys[] = $custom_field_var; } } unset($_field); // Housekeeping. $user_custom_field_keys = array_unique($user_custom_field_keys); // Only unique keys please. sort($user_custom_field_keys, SORT_STRING); // Sort these also; just to give them some order. $export_headers = ''; // Initialize export headers. foreach ($user_keys as $_user_key) { // Include all of the user fields first. $export_headers .= ',"' . c_ws_plugin__s2member_utils_strings::esc_dq($_user_key, 1, '"') . '"'; } unset($_user_key); // Housekeeping. foreach ($user_permission_keys as $_user_permission_key) { // Include permission keys now. $export_headers .= ',"' . c_ws_plugin__s2member_utils_strings::esc_dq($_user_permission_key, 1, '"') . '"'; } unset($_user_permission_key); // Housekeeping. foreach ($user_meta_keys as $_user_meta_key) { // Next comes all of the user meta fields. $export_headers .= ',"meta_key__' . c_ws_plugin__s2member_utils_strings::esc_dq($_user_meta_key, 1, '"') . '"'; } unset($_user_meta_key); // Housekeeping. foreach ($user_custom_field_keys as $_user_custom_field_key) { // Now the s2Member custom fields separately. $export_headers .= ',"custom_field_key__' . c_ws_plugin__s2member_utils_strings::esc_dq($_user_custom_field_key, 1, '"') . '"'; } unset($_user_custom_field_key); // Housekeeping. $export_headers = trim($export_headers, ','); // Trim away leading/trailing delimiters. $export = $export_headers . "\n"; // First line of the export file is always the export headers. $users = $wpdb->get_results("SELECT `" . $wpdb->users . "`.`ID` FROM `" . $wpdb->users . "`, `" . $wpdb->usermeta . "` WHERE `" . $wpdb->users . "`.`ID` = `" . $wpdb->usermeta . "`.`user_id` AND `" . $wpdb->usermeta . "`.`meta_key` = '" . esc_sql($wpdb->prefix . 'capabilities') . "' ORDER BY `" . $wpdb->users . "`.`ID` ASC LIMIT " . $sql_s . ", " . $limit); $users = is_array($users) ? $users : array(); // List of the users on this blog. foreach ($users as $_user) { $_user_line = ''; // Initialize the export line for this user. if (!is_object($_user = new WP_User($_user->ID)) || !$_user->ID) { continue; } // Nothing to export for this user. foreach ($user_keys as $_user_key) { $_value = ''; // Intialize value. switch ($_user_key) { default: // Default handler. $_value = $_user->{$_user_key}; break; } $_user_line .= ',"' . c_ws_plugin__s2member_utils_strings::esc_dq((string) $_value, 1, '"') . '"'; } unset($_user_key, $_value); // Housekeeping. foreach ($user_permission_keys as $_user_permission_key) { $_value = ''; // Intialize value. switch ($_user_permission_key) { case 'role': // The user's role. $_value = c_ws_plugin__s2member_user_access::user_access_role($_user); break; case 'ccaps': // s2 custom capabilities. $_value = implode(',', c_ws_plugin__s2member_user_access::user_access_ccaps($_user)); break; } $_user_line .= ',"' . c_ws_plugin__s2member_utils_strings::esc_dq($_value, 1, '"') . '"'; } unset($_user_permission_key, $_value); // Housekeeping. $_user_meta_values = $wpdb->get_results("SELECT `meta_key`, `meta_value` FROM `" . $wpdb->usermeta . "` WHERE `user_id` = '" . esc_sql($_user->ID) . "'", OBJECT_K); foreach ($user_meta_keys as $_user_meta_key) { $_value = ''; // Intialize value. switch ($_user_meta_key) { case $wpdb->prefix . 'capabilities': case $wpdb->prefix . 's2member_sp_references': case $wpdb->prefix . 's2member_ipn_signup_vars': case $wpdb->prefix . 's2member_access_cap_times': case $wpdb->prefix . 's2member_paid_registration_times': case $wpdb->prefix . 's2member_file_download_access_arc': case $wpdb->prefix . 's2member_file_download_access_log': // This handles JSON-encoding for known array values. if (isset($_user_meta_values[$_user_meta_key]->meta_value[0])) { $_value = json_encode(maybe_unserialize($_user_meta_values[$_user_meta_key]->meta_value)); } break; default: // Default handler. if (isset($_user_meta_values[$_user_meta_key]->meta_value[0])) { if ($format === 'readable' && strpos($_user_meta_values[$_user_meta_key]->meta_value, '{')) { $_value = json_encode(maybe_unserialize($_user_meta_values[$_user_meta_key]->meta_value)); } else { $_value = $_user_meta_values[$_user_meta_key]->meta_value; } } break; } $_user_line .= ',"' . c_ws_plugin__s2member_utils_strings::esc_dq($_value, 1, '"') . '"'; } unset($_user_meta_values, $_user_meta_key, $_value); // Housekeeping. $_user_custom_fields = get_user_option('s2member_custom_fields', $_user->ID); foreach ($user_custom_field_keys as $_user_custom_field_key) { $_value = ''; // Intialize value. switch ($_user_custom_field_key) { default: // Default handler. if (isset($_user_custom_fields[$_user_custom_field_key])) { $_value = $_user_custom_fields[$_user_custom_field_key]; } break; } if ($format === 'readable' && is_array($_value)) { $_value = implode('|', $_value); } else { if (is_array($_value)) { $_value = json_encode($_value); } } $_user_line .= ',"' . c_ws_plugin__s2member_utils_strings::esc_dq((string) $_value, 1, '"') . '"'; } unset($_user_custom_fields, $_user_custom_field_key, $_value); // Housekeeping. $export .= trim($_user_line, " \r\n\t\v,") . "\n"; } unset($_user, $_user_line); // Housekeeping. status_header(200); // 200 OK status header. if ($utf8_bom) { // Add UTF-8 BOM (Byte Order Marker)? $export = "" . $export; } header('Content-Encoding: none'); header('Accept-Ranges: none'); header('Content-Type: text/csv; charset=UTF-8'); header('Content-Length: ' . strlen($export)); header('Expires: ' . gmdate('D, d M Y H:i:s', strtotime('-1 week')) . ' GMT'); header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); header('Cache-Control: no-cache, must-revalidate, max-age=0'); header('Cache-Control: post-check=0, pre-check=0', FALSE); header('Pragma: no-cache'); header('Content-Disposition: attachment; filename="export-' . $start . '-' . ($start + $limit - 1) . '.csv"'); exit($export); // Exportation file. } }
/** * Resets/deletes all IP Restrictions. * * @package s2Member\IP_Restrictions * @since 3.5 * * @return bool Always returns a `true` value. * * @todo Make return value conditional, based on success. */ public static function delete_reset_all_ip_restrictions() { global $wpdb; do_action("ws_plugin__s2member_before_delete_reset_all_ip_restrictions", get_defined_vars()); $wpdb->query("DELETE FROM `" . $wpdb->options . "` WHERE `option_name` LIKE '" . esc_sql(c_ws_plugin__s2member_utils_strings::like_escape("_transient_s2m_ipr_")) . "%'"); $wpdb->query("DELETE FROM `" . $wpdb->options . "` WHERE `option_name` LIKE '" . esc_sql(c_ws_plugin__s2member_utils_strings::like_escape("_transient_timeout_s2m_ipr_")) . "%'"); do_action("ws_plugin__s2member_after_delete_reset_all_ip_restrictions", get_defined_vars()); return apply_filters("ws_plugin__s2member_delete_reset_all_ip_restrictions", true, get_defined_vars()); }
/** * Uninstall routines for s2Member. * * @package s2Member\Installation * @since 3.5 */ public static function uninstall() { global $wpdb; /** @var $wpdb wpdb */ global $current_site, $current_blog; // Multisite. do_action('ws_plugin__s2member_before_uninstall', get_defined_vars()); if ($GLOBALS['WS_PLUGIN__']['s2member']['o']['run_uninstall_routines']) { c_ws_plugin__s2member_roles_caps::unlink_roles(); c_ws_plugin__s2member_files::remove_no_gzip_from_root_htaccess(); if (is_dir($files_dir = $GLOBALS['WS_PLUGIN__']['s2member']['c']['files_dir'])) { if (file_exists($htaccess = $files_dir . '/.htaccess')) { if (is_writable($htaccess)) { unlink($htaccess); } } @rmdir($files_dir) . @rmdir(c_ws_plugin__s2member_utils_dirs::strip_dir_app_data($files_dir)); } if (is_dir($logs_dir = $GLOBALS['WS_PLUGIN__']['s2member']['c']['logs_dir'])) { foreach (scandir($logs_dir) as $log_file) { if (is_file($log_file = $logs_dir . '/' . $log_file)) { if (is_writable($log_file)) { unlink($log_file); } } } @rmdir($logs_dir) . @rmdir(c_ws_plugin__s2member_utils_dirs::strip_dir_app_data($logs_dir)); } delete_option('ws_plugin__s2member_cache'); delete_option('ws_plugin__s2member_notices'); delete_option('ws_plugin__s2member_options'); delete_option('ws_plugin__s2member_configured'); delete_option('ws_plugin__s2member_activated_levels'); delete_option('ws_plugin__s2member_activated_version'); delete_option('ws_plugin__s2member_activated_mms_version'); if (is_multisite() && is_main_site()) { delete_site_option('ws_plugin__s2member_options'); } $wpdb->query("DELETE FROM `" . $wpdb->postmeta . "` WHERE `meta_key` LIKE '" . esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2m_')) . "%'"); $wpdb->query("DELETE FROM `" . $wpdb->postmeta . "` WHERE `meta_key` LIKE '%" . esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('_s2m_')) . "%'"); $wpdb->query("DELETE FROM `" . $wpdb->postmeta . "` WHERE `meta_key` LIKE '%" . esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2member_')) . "%'"); $wpdb->query("DELETE FROM `" . $wpdb->usermeta . "` WHERE `meta_key` LIKE '" . esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2m_')) . "%'"); $wpdb->query("DELETE FROM `" . $wpdb->usermeta . "` WHERE `meta_key` LIKE '%" . esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('_s2m_')) . "%'"); $wpdb->query("DELETE FROM `" . $wpdb->usermeta . "` WHERE `meta_key` LIKE '%" . esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2member_')) . "%'"); $wpdb->query("DELETE FROM `" . $wpdb->options . "` WHERE `option_name` LIKE '" . esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2m_')) . "%'"); $wpdb->query("DELETE FROM `" . $wpdb->options . "` WHERE `option_name` LIKE '%" . esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('_s2m_')) . "%'"); $wpdb->query("DELETE FROM `" . $wpdb->options . "` WHERE `option_name` LIKE '%" . esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2member_')) . "%'"); do_action('ws_plugin__s2member_during_uninstall', get_defined_vars()); } do_action('ws_plugin__s2member_after_uninstall', get_defined_vars()); }
/** * Determines whether or not a Username/Email is already in the database. * * Returns the WordPress User ID if they exist. * * @package s2Member\Utilities * @since 3.5 * * @param string $user_login A User's Username. * @param string $user_email A User's Email Address. * * @return int|bool If exists, a WordPress User ID, else false. */ public static function user_login_email_exists($user_login = '', $user_email = '') { global $wpdb; /** @var wpdb $wpdb */ if ($user_login && $user_email) { // Only if we have both of these. if ($user_id = $wpdb->get_var("SELECT `ID` FROM `" . $wpdb->users . "` WHERE `user_login` LIKE '" . esc_sql(c_ws_plugin__s2member_utils_strings::like_escape($user_login)) . "' AND `user_email` LIKE '" . esc_sql(c_ws_plugin__s2member_utils_strings::like_escape($user_email)) . "' LIMIT 1")) { return $user_id; } } // Return the associated WordPress ID. return FALSE; // Otherwise, return false. }
/** * Removes expired Transients inserted into the database by s2Member. * * @since 3.5 * @package s2Member\Utilities * * @param bool $stagger Defaults to a `TRUE` value. * * @return bool Always returns a `TRUE` value. */ public static function cleanup_expired_s2m_transients($stagger = TRUE) { global $wpdb; /** @var wpdb $wpdb */ if ($stagger && !is_float($stagger = time() / 2)) { return TRUE; } // Bypass this time. if ($expired_s2m_transients = $wpdb->get_results("SELECT * FROM `" . $wpdb->options . "` WHERE `option_name` LIKE '" . esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('_transient_timeout_s2m_')) . "%' AND `option_value` < '" . esc_sql(time()) . "' LIMIT 5")) { foreach ($expired_s2m_transients as $_expired_s2m_transient) { // Delete the _timeout, and also the transient entry name itself. if (($_id = $_expired_s2m_transient->option_id) && ($_name = preg_replace('/_transient_timeout_/i', '_transient_', $_expired_s2m_transient->option_name, 1))) { $wpdb->query("DELETE FROM `" . $wpdb->options . "` WHERE (`option_id` = '" . esc_sql($_id) . "' OR `option_name` = '" . esc_sql($_name) . "')"); } } } return TRUE; // Always returns a `TRUE` value. }
/** * [s2Member-Gift-Codes] Shortcode. * * @package s2Member\Shortcodes * @since 150203 * * @attaches-to ``add_shortcode('s2Member-Gift-Codes');`` * * @param array $attr An array of Attributes. * @param string $content Content inside the Shortcode. * @param string $shortcode The actual Shortcode name itself. * * @return string List of Gift Codes. */ public static function shortcode($attr = array(), $content = '', $shortcode = '') { global $wpdb; // Global DB object reference. /** @var $wpdb wpdb Reference for IDEs. */ foreach (array_keys(get_defined_vars()) as $__v) { $__refs[$__v] =& ${$__v}; } do_action('c_ws_plugin__s2member_pro_before_sc_gift_codes', get_defined_vars()); unset($__refs, $__v); c_ws_plugin__s2member_no_cache::no_cache_constants(true); $default_attr = array('quantity' => '1', 'discount' => '100%', 'directive' => '', 'singulars' => '', 'one_click' => ''); if (isset($attr['singular']) && !isset($attr['singulars'])) { $attr['singulars'] = $attr['singular']; } $attr = shortcode_atts($default_attr, $attr, $shortcode); $attr['quantity'] = (string) min($attr['quantity'], apply_filters('ws_plugin__s2member_pro_gifts_max_quantity', 1000)); $hashable_attr = $attr; unset($hashable_attr['one_click']); $post_id = is_singular() ? get_the_ID() : 0; $user = wp_get_current_user(); // Current user. $sp_access_value = $post_id ? c_ws_plugin__s2member_sp_access::sp_access($post_id, 'read-only') : ''; if ($post_id && ($sp_access_value && is_string($sp_access_value) || $user->ID)) { $gifts = array(); // Initialize. $coupons_class = new c_ws_plugin__s2member_pro_coupons(); if ($sp_access_value && is_string($sp_access_value)) { $sp_hash = md5($sp_access_value); $attr_hash = hash('crc32b', serialize($hashable_attr)); $option_key_for_gifts = 's2m_gcs_' . $post_id . '_' . $sp_hash . '_' . $attr_hash; if (!is_array($gifts = get_option($option_key_for_gifts))) { $gifts = $coupons_class->generate_gifts($attr); // Generate new gifts. $wpdb->query("DELETE FROM `" . $wpdb->options . "` WHERE `option_name` LIKE '%" . esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2m_gcs_' . $post_id . '_' . $sp_hash . '_')) . "%'"); add_option($option_key_for_gifts, $gifts, '', 'no'); // Store the new gifts. } } else { if ($user->ID) { $attr_hash = md5(serialize($hashable_attr)); $user_option_key_for_gifts = 's2m_gcs_' . $post_id . '_' . $attr_hash; if (!is_array($gifts = get_user_option($user_option_key_for_gifts, $user->ID))) { $gifts = $coupons_class->generate_gifts($attr); // Generate new gifts. $wpdb->query("DELETE FROM `" . $wpdb->usermeta . "` WHERE `user_id` = '" . esc_sql($user->ID) . "' AND `meta_key` LIKE '%" . esc_sql(c_ws_plugin__s2member_utils_strings::like_escape('s2m_gcs_' . $post_id . '_')) . "%'"); update_user_option($user->ID, $user_option_key_for_gifts, $gifts); // Store the new gifts. } } } if ($gifts) { $content = '<table class="ws-plugin--s2member-gift-codes table table-condensed table-striped table-hover">' . "\n"; $content .= '<thead>' . "\n"; $content .= '<tr>' . '<th class="-code">' . _x('Redemption Code', 's2member-front', 's2member') . '</th>' . '<th class="-status">' . _x('Status', 's2member-front', 's2member') . '</th>' . '</tr>' . "\n"; $content .= '</thead>' . "\n"; $content .= '<tbody>' . "\n"; foreach ($gifts as $_gift) { if ($coupons_class->get_uses($_gift['code'])) { $content .= '<tr class="-status-used">' . '<td class="-code"><s>' . esc_html($_gift['code']) . '</s></td>' . '<td class="-status">' . _x('used', 's2member-front', 's2member') . '</td>' . '</tr>' . "\n"; } else { $_one_click_url = $attr['one_click'] ? add_query_arg('s2p-coupon', urlencode($_gift['code']), $attr['one_click']) : ''; $content .= '<tr class="-status-unused">' . '<td class="-code">' . ($attr['one_click'] && $_one_click_url ? '<a href="' . esc_attr($_one_click_url) . '" target="_blank" title="' . _x('Click to Redeem', 's2member-front', 's2member') . '" data-toggle="tooltip">' . esc_html($_gift['code']) . '</a>' : esc_html($_gift['code'])) . '</td>' . '<td class="-status">' . _x('unused', 's2member-front', 's2member') . '</td>' . '</tr>' . "\n"; } } unset($_gift, $_one_click_url); // Housekeeping. $content .= '<tbody>' . "\n"; $content .= '</table>'; } } return apply_filters('c_ws_plugin__s2member_pro_sc_gift_codes_content', $content, get_defined_vars()); }