File "class-wc-data-store-wp.php"
Full path: /home/kosmetik/public_html/wp-content/plugins/woocommerce/includes/data-stores/class-wc-data-store-wp.php
File
size: 12.61 B
MIME-type: text/x-php
Charset: utf-8
Download Open Edit Advanced Editor Back
<?php
defined('ABSPATH') || exit;
class WC_Data_Store_WP
{
protected $meta_type = 'post';
protected $object_id_field_for_meta = '';
protected $internal_meta_keys = array();
protected $must_exist_meta_keys = array();
protected function get_term_ids($object, $taxonomy)
{
if (is_numeric($object)) {
$object_id = $object;
} else {
$object_id = $object->get_id();
}
$terms = get_the_terms($object_id, $taxonomy);
if (false === $terms || is_wp_error($terms)) {
return array();
}
return wp_list_pluck($terms, 'term_id');
}
public function read_meta(&$object)
{
global $wpdb;
$db_info = $this->get_db_info();
$raw_meta_data = $wpdb->get_results($wpdb->prepare("SELECT {$db_info['meta_id_field']} as meta_id, meta_key, meta_value\n\t\t\t\tFROM {$db_info['table']}\n\t\t\t\tWHERE {$db_info['object_id_field']} = %d\n\t\t\t\tORDER BY {$db_info['meta_id_field']}", $object->get_id()));
return $this->filter_raw_meta_data($object, $raw_meta_data);
}
public function filter_raw_meta_data(&$object, $raw_meta_data)
{
$this->internal_meta_keys = array_merge(array_map(array($this, 'prefix_key'), $object->get_data_keys()), $this->internal_meta_keys);
$meta_data = array_filter($raw_meta_data, array($this, 'exclude_internal_meta_keys'));
return apply_filters("woocommerce_data_store_wp_{$this->meta_type}_read_meta", $meta_data, $object, $this);
}
public function delete_meta(&$object, $meta)
{
delete_metadata_by_mid($this->meta_type, $meta->id);
}
public function add_meta(&$object, $meta)
{
return add_metadata($this->meta_type, $object->get_id(), wp_slash($meta->key), is_string($meta->value) ? wp_slash($meta->value) : $meta->value, false);
}
public function update_meta(&$object, $meta)
{
update_metadata_by_mid($this->meta_type, $meta->id, $meta->value, $meta->key);
}
protected function get_db_info()
{
global $wpdb;
$meta_id_field = 'meta_id';
$table = $wpdb->prefix;
if (!in_array($this->meta_type, array('post', 'user', 'comment', 'term'), true)) {
$table .= 'woocommerce_';
}
$table .= $this->meta_type . 'meta';
$object_id_field = $this->meta_type . '_id';
if ('user' === $this->meta_type) {
$meta_id_field = 'umeta_id';
$table = $wpdb->usermeta;
}
if (!empty($this->object_id_field_for_meta)) {
$object_id_field = $this->object_id_field_for_meta;
}
return array('table' => $table, 'object_id_field' => $object_id_field, 'meta_id_field' => $meta_id_field);
}
protected function prefix_key($key)
{
return '_' === substr($key, 0, 1) ? $key : '_' . $key;
}
protected function exclude_internal_meta_keys($meta)
{
return !in_array($meta->meta_key, $this->internal_meta_keys, true) && 0 !== stripos($meta->meta_key, 'wp_');
}
protected function get_props_to_update($object, $meta_key_to_props, $meta_type = 'post')
{
$props_to_update = array();
$changed_props = $object->get_changes();
foreach ($meta_key_to_props as $meta_key => $prop) {
if (array_key_exists($prop, $changed_props) || !metadata_exists($meta_type, $object->get_id(), $meta_key)) {
$props_to_update[$meta_key] = $prop;
}
}
return $props_to_update;
}
protected function update_or_delete_post_meta($object, $meta_key, $meta_value)
{
if (in_array($meta_value, array(array(), ''), true) && !in_array($meta_key, $this->must_exist_meta_keys, true)) {
$updated = delete_post_meta($object->get_id(), $meta_key);
} else {
$updated = update_post_meta($object->get_id(), $meta_key, $meta_value);
}
return (bool) $updated;
}
protected function get_wp_query_args($query_vars)
{
$skipped_values = array('', array(), null);
$wp_query_args = array('errors' => array(), 'meta_query' => array());
foreach ($query_vars as $key => $value) {
if (in_array($value, $skipped_values, true) || 'meta_query' === $key) {
continue;
}
if (in_array('_' . $key, $this->internal_meta_keys, true)) {
if ('*' === $value) {
$wp_query_args['meta_query'][] = array(array('key' => '_' . $key, 'compare' => 'EXISTS'), array('key' => '_' . $key, 'value' => '', 'compare' => '!='));
} else {
$wp_query_args['meta_query'][] = array('key' => '_' . $key, 'value' => $value, 'compare' => is_array($value) ? 'IN' : '=');
}
} else {
$key_mapping = array('parent' => 'post_parent', 'parent_exclude' => 'post_parent__not_in', 'exclude' => 'post__not_in', 'limit' => 'posts_per_page', 'type' => 'post_type', 'return' => 'fields');
if (isset($key_mapping[$key])) {
$wp_query_args[$key_mapping[$key]] = $value;
} else {
$wp_query_args[$key] = $value;
}
}
}
return apply_filters('woocommerce_get_wp_query_args', $wp_query_args, $query_vars);
}
public function parse_date_for_wp_query($query_var, $key, $wp_query_args = array())
{
$query_parse_regex = '/([^.<>]*)(>=|<=|>|<|\\.\\.\\.)([^.<>]+)/';
$valid_operators = array('>', '>=', '=', '<=', '<', '...');
$precision = 'second';
$dates = array();
$operator = '=';
try {
if (is_a($query_var, 'WC_DateTime')) {
$dates[] = $query_var;
} elseif (is_numeric($query_var)) {
$dates[] = new WC_DateTime("@{$query_var}", new DateTimeZone('UTC'));
} elseif (preg_match($query_parse_regex, $query_var, $sections)) {
if (!empty($sections[1])) {
$dates[] = is_numeric($sections[1]) ? new WC_DateTime("@{$sections[1]}", new DateTimeZone('UTC')) : wc_string_to_datetime($sections[1]);
}
$operator = in_array($sections[2], $valid_operators, true) ? $sections[2] : '';
$dates[] = is_numeric($sections[3]) ? new WC_DateTime("@{$sections[3]}", new DateTimeZone('UTC')) : wc_string_to_datetime($sections[3]);
if (!is_numeric($sections[1]) && !is_numeric($sections[3])) {
$precision = 'day';
}
} else {
$dates[] = wc_string_to_datetime($query_var);
$precision = 'day';
}
} catch (Exception $e) {
return $wp_query_args;
}
if (!$operator || empty($dates) || '...' === $operator && count($dates) < 2) {
return $wp_query_args;
}
if ('post_date' === $key || 'post_modified' === $key) {
if (!isset($wp_query_args['date_query'])) {
$wp_query_args['date_query'] = array();
}
$query_arg = array('column' => 'day' === $precision ? $key : $key . '_gmt', 'inclusive' => '>' !== $operator && '<' !== $operator);
$comparisons = array();
if ('>' === $operator || '>=' === $operator || '...' === $operator) {
$comparisons[] = 'after';
}
if ('<' === $operator || '<=' === $operator || '...' === $operator) {
$comparisons[] = 'before';
}
foreach ($comparisons as $index => $comparison) {
if ('day' === $precision) {
$query_arg[$comparison]['year'] = $dates[$index]->date('Y');
$query_arg[$comparison]['month'] = $dates[$index]->date('n');
$query_arg[$comparison]['day'] = $dates[$index]->date('j');
} else {
$query_arg[$comparison] = gmdate('m/d/Y H:i:s', $dates[$index]->getTimestamp());
}
}
if (empty($comparisons)) {
$query_arg['year'] = $dates[0]->date('Y');
$query_arg['month'] = $dates[0]->date('n');
$query_arg['day'] = $dates[0]->date('j');
if ('second' === $precision) {
$query_arg['hour'] = $dates[0]->date('H');
$query_arg['minute'] = $dates[0]->date('i');
$query_arg['second'] = $dates[0]->date('s');
}
}
$wp_query_args['date_query'][] = $query_arg;
return $wp_query_args;
}
if (!isset($wp_query_args['meta_query'])) {
$wp_query_args['meta_query'] = array();
}
if ('day' === $precision) {
$start_timestamp = strtotime(gmdate('m/d/Y 00:00:00', $dates[0]->getTimestamp()));
$end_timestamp = '...' !== $operator ? $start_timestamp + DAY_IN_SECONDS : strtotime(gmdate('m/d/Y 00:00:00', $dates[1]->getTimestamp()));
switch ($operator) {
case '>':
case '<=':
$wp_query_args['meta_query'][] = array('key' => $key, 'value' => $end_timestamp, 'compare' => $operator);
break;
case '<':
case '>=':
$wp_query_args['meta_query'][] = array('key' => $key, 'value' => $start_timestamp, 'compare' => $operator);
break;
default:
$wp_query_args['meta_query'][] = array('key' => $key, 'value' => $start_timestamp, 'compare' => '>=');
$wp_query_args['meta_query'][] = array('key' => $key, 'value' => $end_timestamp, 'compare' => '<=');
}
} else {
if ('...' !== $operator) {
$wp_query_args['meta_query'][] = array('key' => $key, 'value' => $dates[0]->getTimestamp(), 'compare' => $operator);
} else {
$wp_query_args['meta_query'][] = array('key' => $key, 'value' => $dates[0]->getTimestamp(), 'compare' => '>=');
$wp_query_args['meta_query'][] = array('key' => $key, 'value' => $dates[1]->getTimestamp(), 'compare' => '<=');
}
}
return $wp_query_args;
}
public function get_internal_meta_keys()
{
return $this->internal_meta_keys;
}
protected function get_valid_search_terms($terms)
{
$valid_terms = array();
$stopwords = $this->get_search_stopwords();
foreach ($terms as $term) {
if (preg_match('/^".+"$/', $term)) {
$term = trim($term, "\"'");
} else {
$term = trim($term, "\"' ");
}
if (empty($term) || 1 === strlen($term) && preg_match('/^[a-z\\-]$/i', $term)) {
continue;
}
if (in_array(wc_strtolower($term), $stopwords, true)) {
continue;
}
$valid_terms[] = $term;
}
return $valid_terms;
}
protected function get_search_stopwords()
{
$stopwords = array_map('wc_strtolower', array_map('trim', explode(',', _x('about,an,are,as,at,be,by,com,for,from,how,in,is,it,of,on,or,that,the,this,to,was,what,when,where,who,will,with,www', 'Comma-separated list of search stopwords in your language', 'woocommerce'))));
return apply_filters('wp_search_stopwords', $stopwords);
}
protected function get_data_for_lookup_table($id, $table)
{
return array();
}
protected function get_primary_key_for_lookup_table($table)
{
return '';
}
protected function update_lookup_table($id, $table)
{
global $wpdb;
$id = absint($id);
$table = sanitize_key($table);
if (empty($id) || empty($table)) {
return false;
}
$existing_data = wp_cache_get('lookup_table', 'object_' . $id);
$update_data = $this->get_data_for_lookup_table($id, $table);
if (!empty($update_data) && $update_data !== $existing_data) {
$wpdb->replace($wpdb->{$table}, $update_data);
wp_cache_set('lookup_table', $update_data, 'object_' . $id);
}
}
public function delete_from_lookup_table($id, $table)
{
global $wpdb;
$id = absint($id);
$table = sanitize_key($table);
if (empty($id) || empty($table)) {
return false;
}
$pk = $this->get_primary_key_for_lookup_table($table);
$wpdb->delete($wpdb->{$table}, array($pk => $id));
wp_cache_delete('lookup_table', 'object_' . $id);
}
protected function string_to_timestamp($time_string)
{
return '0000-00-00 00:00:00' !== $time_string ? wc_string_to_timestamp($time_string) : null;
}
}