public static function pre_update_option($new, $old = false) { if (false !== ($field_data = piklist_validate::check($new))) { $setting = $_REQUEST['option_page']; $_old = $old; foreach ($field_data[$setting] as $field => &$data) { if (!isset($data['display']) || isset($data['display']) && !$data['display']) { if (!isset($new[$field]) && isset($_old[$field])) { unset($_old[$field]); } if ((isset($data['add_more']) && !$data['add_more'] || !isset($data['add_more'])) && (isset($new[$field]) && isset($new[$field][0]) && count($new[$field]) == 1)) { $new[$field] = is_array($new[$field][0]) && count($new[$field][0]) == 1 ? $new[$field][0][0] : $new[$field][0]; } if (isset($new[$field]) && is_array($new[$field]) && count($new[$field]) > 1 && empty($new[$field][0]) && isset($new[$field][0])) { unset($new[$field][0]); $new[$field] = array_values($new[$field]); } if (isset($data['field'])) { $path = array_merge(array($setting, 'name'), strstr($data['field'], ':') ? explode(':', $data['field']) : array($data['field'])); if (piklist::array_path_get($_FILES, $path) && $data['type'] == 'file') { $data['request_value'] = piklist_form::save_upload($path, $data['request_value'], true); $path = explode(':', $data['field']); $parent_field = $path[0]; unset($path[0]); piklist::array_path_set($new[$parent_field], $path, $data['request_value']); } } } } $settings = wp_parse_args($new, $_old); $settings = apply_filters('piklist_pre_update_option', $settings, $setting, $new, $old); $settings = apply_filters('piklist_pre_update_option_' . $setting, $settings, $new, $old); } else { $settings = $old; } return $settings; }
public static function check(&$stored_data = null) { if (!isset($_REQUEST[piklist::$prefix]['fields_id']) || !($fields_data = get_transient(piklist::$prefix . $_REQUEST[piklist::$prefix]['fields_id']))) { return false; } $fields_id = $_REQUEST[piklist::$prefix]['fields_id']; foreach ($fields_data as $type => &$fields) { foreach ($fields as &$field) { if (!is_null($stored_data)) { $request_data =& $stored_data; } else { if (isset($_REQUEST['widget-id']) && isset($_REQUEST['multi_number']) && isset($_REQUEST['widget_number'])) { $widget_index = !empty($_REQUEST['multi_number']) ? $_REQUEST['multi_number'] : $_REQUEST['widget_number']; $request_data =& $_REQUEST[piklist::$prefix . $field['scope']][$widget_index]; } elseif (isset($field['scope']) && !empty($field['scope'])) { $request_data =& $_REQUEST[piklist::$prefix . $field['scope']]; } else { $request_data =& $_REQUEST; } } if (isset($request_data) && isset($field['field'])) { $field['request_value'] = !strstr($field['field'], ':') ? isset($request_data[$field['field']]) ? $request_data[$field['field']] : null : piklist::array_path_get($request_data, explode(':', $field['field'])); $field['valid'] = true; if (stristr($field['field'], ':0:')) { $_field = $field['field']; $value = array(); $index = 0; do { $_value = piklist::array_path_get($request_data, explode(':', $_field)); if (isset($_value[$index]) && count($_value[$index]) > 1 && in_array($field['type'], piklist_form::$field_list_types['multiple_value']) && $field['add_more']) { $_value[$index] = array_values(array_filter($_value[$index])); } if (isset($_value[$index])) { array_push($value, $_value); piklist::array_path_set($request_data, explode(':', $_field), $_value); $_field = strrev(implode(strrev(':' . ($index + 1) . ':'), explode(':' . $index . ':', strrev($_field), 2))); } else { break; } $index++; } while (isset($_value[$index])); $field['request_value'] = $_value; } elseif ($field['type'] == 'group' && empty($field['field'])) { $field['request_value'] = array(); foreach ($field['fields'] as $_field) { $field['request_value'][$_field['field']] = !strstr($_field['field'], ':') ? isset($request_data[$_field['field']]) ? $request_data[$_field['field']] : null : piklist::array_path_get($request_data, explode(':', $_field['field'])); } } else { $index = 0; do { if (isset($field['request_value'][$index]) && count($field['request_value'][$index]) > 1 && $field['type'] == 'checkbox') { $field['request_value'][$index] = array_values(array_filter($field['request_value'][$index])); } $index++; } while (isset($field['request_value'][$index])); piklist::array_path_set($request_data, explode(':', $field['field']), $field['request_value']); } if (isset($field['sanitize'])) { foreach ($field['sanitize'] as $sanitize) { if (isset(self::$sanitization_rules[$sanitize['type']])) { $sanitization = array_merge(self::$sanitization_rules[$sanitize['type']], $sanitize); if (isset($sanitization['callback'])) { foreach ($field['request_value'] as $request_value) { $request_value = call_user_func_array($sanitization['callback'], array($request_value, $field, isset($sanitize['options']) ? $sanitize['options'] : array())); $request_value = is_array($request_value) ? $request_value : array($request_value); piklist::array_path_set($request_data, explode(':', $field['field']), $request_value); } } } } } self::add_request_value($field); if (isset($field['required']) && $field['required']) { for ($index = 0; $index < count($field['request_value']); $index++) { $request_value = is_array($field['request_value'][$index]) ? array_filter($field['request_value'][$index]) : $field['request_value'][$index]; if (empty($request_value)) { self::add_error($field, $index, __('is a required field.', 'piklist')); } } } if (isset($field['validate'])) { foreach ($field['validate'] as $validate) { if (isset(self::$validation_rules[$validate['type']])) { $validation = array_merge(self::$validation_rules[$validate['type']], $validate); $request_values = $field['request_value']; if ($field['type'] == 'group') { $_request_values = array(); foreach ($request_values as $key => $values) { foreach ($values as $index => $value) { if (!isset($_request_values[$index])) { $_request_values[$index] = array(); } $_request_values[$index][$key] = $value; } } $request_values = array($_request_values); } if (isset($validation['rule'])) { for ($index = 0; $index < count($request_values); $index++) { if (!empty($request_values[$index]) && !preg_match($validation['rule'], $request_values[$index])) { self::add_error($field, $index, $validation['message']); } } } if (isset($validation['callback'])) { for ($index = 0; $index < count($request_values); $index++) { if (!empty($request_values[$index]) || $field['type'] != 'group' && $field['add_more']) { $validation_result = call_user_func_array($validation['callback'], array($request_values[$index], $field, isset($validate['options']) ? $validate['options'] : array())); if ($validation_result !== true) { self::add_error($field, $index, isset($validation['message']) ? $validation['message'] : (is_string($validation_result) ? $validation_result : __('is not valid input', 'piklist'))); } } } } } } } } } } self::set_data($fields_id); return !empty(self::$submission['errors']) ? false : $fields_data; }
public static function save_upload($path, $storage = array(), $return = false) { $files = $_FILES; $paths = array(); $paths['name'] = $path; $path[1] = 'size'; $paths['size'] = $path; $path[1] = 'tmp_name'; $paths['tmp_name'] = $path; $path[1] = 'error'; $paths['error'] = $path; $codes = piklist::array_path_get($files, $paths['error']); $names = piklist::array_path_get($files, $paths['name']); $sizes = piklist::array_path_get($files, $paths['size']); $tmp_names = piklist::array_path_get($files, $paths['tmp_name']); foreach ($codes as $set => $code_set) { $_storage = array(); foreach ($code_set as $index => $code) { if (in_array($code, array(UPLOAD_ERR_OK, 0), true)) { $attach_id = media_handle_sideload(array('name' => $names[$set][$index], 'size' => $sizes[$set][$index], 'tmp_name' => $tmp_names[$set][$index]), 0); if (!is_wp_error($attach_id)) { $_storage[$index] = $attach_id; } } } if (isset($storage[$set])) { $storage[$set] = array_merge($storage[$set], $_storage); if ($return && isset($storage[$set]) && is_array($storage[$set]) && count($storage[$set]) > 1) { $storage[$set] = array_values(array_filter($storage[$set])); } } else { $storage[$set] = array(0 => null); } } ksort($storage); return $storage; }
/** * check * Run all validation and sanitization checks against the rendered fields. * * @param array $stored_data The data to parse if the REQUEST object is not used by default. * @param string $fields_id The fields id. * * @return array Results of the check. * * @access public * @static * @since 1.0 */ public static function check($stored_data = null, $fields_id = null) { self::$valid = true; self::$checked = false; if (!$fields_id) { $fields_id = isset($_REQUEST[piklist::$prefix]['fields']) ? esc_attr($_REQUEST[piklist::$prefix]['fields']) : null; } if (!$fields_id || !($fields_data = get_transient(piklist::$prefix . $fields_id))) { return false; } $clones = array(); foreach ($fields_data as $type => &$fields) { foreach ($fields as &$field) { if (!is_null($stored_data)) { if ($field['prefix'] && isset($stored_data[piklist::$prefix . $field['scope']])) { $request_data = $stored_data[piklist::$prefix . $field['scope']]; } elseif (!$field['prefix'] && isset($stored_data[$field['scope']])) { $request_data = $stored_data[$field['scope']]; } else { $request_data = $stored_data; } } else { if ($field['scope'] && isset($_REQUEST[piklist::$prefix . $field['scope']])) { $request_data = $_REQUEST[piklist::$prefix . $field['scope']]; } elseif ($field['scope'] && $field['scope'] == piklist::$prefix && isset($_REQUEST[piklist::$prefix])) { $request_data = $_REQUEST[piklist::$prefix]; } else { $request_data = $_REQUEST; } } if ($request_data && $field['field'] && $field['type'] != 'html') { $field['errors'] = false; if (!in_array($field['field'], $clones)) { if (isset($request_data[$field['field']])) { $field['request_value'] = $request_data[$field['field']]; } elseif (strstr($field['field'], ':')) { $pluck = explode(':', $field['field']); $pluck_field = array_pop($pluck); if (is_numeric($pluck[count($pluck) - 1])) { array_pop($pluck); } $pluck = implode(':', $pluck); if (isset($request_data[$pluck][$pluck_field])) { $field['request_value'] = $request_data[$pluck][$pluck_field]; } else { $request_data = piklist::array_path_get($request_data, explode(':', $pluck)); if (isset($request_data[$pluck_field])) { $field['request_value'] = $request_data[$pluck_field]; } else { $field['request_value'] = $request_data ? piklist::pluck($request_data, $pluck_field) : null; } } } } if ($field['type'] == 'group' && $field['field'] && !strstr($field['field'], ':')) { $paths = piklist::array_paths($field['request_value']); foreach ($paths as $path) { $path = explode(':', $path); if (is_numeric($path[count($path) - 1])) { unset($path[count($path) - 1]); } $path = implode(':', $path); $field_name = $field['field'] . ':' . $path; if (!isset($fields[$path]) && !in_array($field_name, $clones)) { $original = preg_replace('/\\:\\d+\\:/', ':0:', $field_name); $original = explode(':', $original); if (is_numeric($original[count($original) - 1])) { unset($original[count($original) - 1]); } $original = implode(':', $original); if (isset($fields[$original])) { $clone = $fields[$original]; $path = array_reverse(explode(':', $path)); for ($i = 0; $i < count($path); $i++) { if (is_numeric($path[$i])) { $clone['index'] = (int) $path[$i]; break; } } $path = array_reverse($path); $clone['field'] = $field_name; $clone['id'] = piklist_form::get_field_id($clone); $clone['name'] = piklist_form::get_field_name($clone); $clone['request_value'] = piklist::array_path_get($field['request_value'], $path); $original_path = explode(':', $original); $group = array_shift($original_path); $fields[$original]['request_value'] = piklist::array_path_get($field['request_value'], $original_path); $position = array_search($original, array_keys($fields)) + 1; $fields = array_slice($fields, 0, $position, true) + array($field_name => $clone) + array_slice($fields, $position, count($fields) - 1, true); array_push($clones, $field_name); } } } } // Strip Slashes $field['request_value'] = stripslashes_deep($field['request_value']); // Required if ($field['required']) { $field = self::required_value($field); } // Sanitization foreach ($field['sanitize'] as $sanitize) { if (isset(self::$sanitization_rules[$sanitize['type']])) { $sanitization = array_merge(self::$sanitization_rules[$sanitize['type']], $sanitize); if (isset($sanitization['callback'])) { $field = self::sanitize_value_callback($field, $sanitization); if (strstr($field['field'], ':')) { $path = explode(':', $field['field']); $group = array_shift($path); piklist::array_path_set($fields[$group]['request_value'], $path, $field['request_value']); } } } else { $trigger_error = sprintf(__('Sanitization type "%s" is not valid.', 'piklist'), $sanitize['type']); trigger_error($trigger_error, E_USER_NOTICE); } } // Validation foreach ($field['validate'] as $validate) { if (isset(self::$validation_rules[$validate['type']])) { $validation = array_merge(self::$validation_rules[$validate['type']], $validate); if (isset($validation['rule'])) { $field = self::validate_value_rule($field, $validation); } if (isset($validation['callback'])) { $field = self::validate_value_callback($field, $validation, $fields_data); } } else { $trigger_error = sprintf(__('Validation type "%s" is not valid.', 'piklist'), $validate['type']); trigger_error($trigger_error, E_USER_NOTICE); } } } } } self::$checked = true; self::set_data($fields_id, $fields_data); return array('valid' => self::$valid, 'type' => $_SERVER['REQUEST_METHOD'], 'fields_data' => $fields_data); }
/** * save_upload * Save any FILES uploaded by a file field. * * @param array $path The file paths * @param array $storage The object to store the object ids in to return. * * @return array The object ids. * * @access public * @static * @since 1.0 */ public static function save_upload($path, $storage = array(), $url = false) { $files = $_FILES; if (!function_exists('media_handle_sideload')) { require_once ABSPATH . 'wp-admin/includes/image.php'; require_once ABSPATH . 'wp-admin/includes/file.php'; require_once ABSPATH . 'wp-admin/includes/media.php'; } $paths = array(); $paths['name'] = $path; $path[1] = 'size'; $paths['size'] = $path; $path[1] = 'tmp_name'; $paths['tmp_name'] = $path; $path[1] = 'error'; $paths['error'] = $path; $codes = piklist::array_path_get($files, $paths['error']); $names = piklist::array_path_get($files, $paths['name']); $sizes = piklist::array_path_get($files, $paths['size']); $tmp_names = piklist::array_path_get($files, $paths['tmp_name']); if (!$storage) { $storage = array(); } foreach ($codes as $set => $code) { if (in_array($code, array(UPLOAD_ERR_OK, 0), true)) { $attach_id = media_handle_sideload(array('name' => $names[$set], 'size' => $sizes[$set], 'tmp_name' => $tmp_names[$set]), 0); if (!is_wp_error($attach_id)) { array_push($storage, $url ? wp_get_attachment_url($attach_id) : $attach_id); } } } return $storage; }