| | |
| | | namespace JVBase\meta; |
| | | |
| | | use Exception; |
| | | use JVBase\inc\managers\ErrorHelper; |
| | | use JVBase\managers\Cache; |
| | | use JVBase\managers\Errors; |
| | | use wpdb; |
| | | |
| | | if (!defined('ABSPATH')) { |
| | | exit; |
| | |
| | | |
| | | /** |
| | | * Handles persistence of meta values to WordPress |
| | | * Pure storage layer - no validation or sanitization |
| | | */ |
| | | class Storage |
| | | { |
| | | protected \wpdb $wpdb; |
| | | use ErrorHelper; |
| | | protected wpdb $wpdb; |
| | | |
| | | public function __construct() |
| | | { |
| | |
| | | && ( |
| | | ($config['type'] ?? '') === 'taxonomy' |
| | | || (($config['type']??'') === 'selector' && ($config['subtype']??'') === 'taxonomy') |
| | | ) && !isset($config['taxonomy_type'])) { |
| | | ) && (!isset($config['taxonomy_type']) || !isset($config['isReference']))) { |
| | | $taxonomyFields[$name] = $config; |
| | | } else { |
| | | $metaFields[] = $name; |
| | |
| | | } |
| | | |
| | | if ($field->isTaxonomy()) { |
| | | error_log('Saving Taxonomy field with set_object_terms'); |
| | | return $this->saveTaxonomyField($item, $field); |
| | | } |
| | | |
| | | $metaKey = BASE . $field->name; |
| | | |
| | | return match ($item->objectType) { |
| | | 'post' => update_post_meta($item->id, $metaKey, $field->value) !== false, |
| | | 'term' => update_term_meta($item->id, $metaKey, $field->value) !== false, |
| | | 'user', 'integrations' => update_user_meta($item->id, $metaKey, $field->value) !== false, |
| | | $result = match ($item->objectType) { |
| | | 'post' => (bool)update_post_meta($item->id, $metaKey, $field->value), |
| | | 'term' => (bool)update_term_meta($item->id, $metaKey, $field->value), |
| | | 'user', 'integrations' => (bool)update_user_meta($item->id, $metaKey, $field->value), |
| | | 'options' => $this->saveOption($item, $field), |
| | | default => false |
| | | }; |
| | | |
| | | error_log('Result: '.print_r($result, true)); |
| | | return $result; |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | $this->wpdb->query('START TRANSACTION'); |
| | | |
| | | try { |
| | | foreach ($dirty as $field) { |
| | | if (!$this->saveField($item, $field)) { |
| | | error_log("Could not save field: {$field->name}"); |
| | | throw new Exception("Failed to save field: {$field->name}"); |
| | | } |
| | | $field->markClean(); |
| | |
| | | $this->wpdb->query('COMMIT'); |
| | | |
| | | // Update post modified timestamp |
| | | Cache::invalidateItem($item->objectType, $item->id); |
| | | $this->clearCache($item); |
| | | |
| | | return true; |
| | | |
| | | } catch (Exception $e) { |
| | | $this->wpdb->query('ROLLBACK'); |
| | | JVB()->error()->log('meta_storage', $e->getMessage(), [ |
| | | 'item_id' => $item->id, |
| | | 'object_type' => $item->objectType, |
| | | 'fields' => array_keys($dirty) |
| | | ], 'error'); |
| | | $this->logError($e->getMessage(), 'save'); |
| | | |
| | | return false; |
| | | } |
| | | } |
| | |
| | | $config = $item->getFieldConfig($name); |
| | | if ($config && ($config['type'] ?? '') === 'taxonomy' && !isset($config['taxonomy_type'])) { |
| | | $taxonomy = jvbCheckBase($config['taxonomy']); |
| | | wp_set_object_terms($item->id, [], $taxonomy, false); |
| | | wp_set_object_terms($item->id, [], $taxonomy); |
| | | return true; |
| | | } |
| | | |
| | |
| | | $results[$meta->item()->id ?? 'options'] = false; |
| | | } |
| | | |
| | | JVB()->error()->log('meta_storage', 'Bulk save failed: ' . $e->getMessage(), [], 'error'); |
| | | self::staticLogError($e->getMessage(), 'save'); |
| | | |
| | | return $results; |
| | | } |
| | |
| | | { |
| | | $taxonomy = jvbCheckBase($field->config['taxonomy']); |
| | | $value = $field->value; |
| | | |
| | | if (empty(trim((string)$value))) { |
| | | wp_set_object_terms($item->id, [], $taxonomy, false); |
| | | wp_set_object_terms($item->id, [], $taxonomy); |
| | | return true; |
| | | } |
| | | |
| | | $termIds = array_map('intval', array_filter(explode(',', $value))); |
| | | $result = wp_set_object_terms($item->id, $termIds, $taxonomy, false); |
| | | $result = wp_set_object_terms($item->id, $termIds, $taxonomy); |
| | | |
| | | return !is_wp_error($result); |
| | | } |
| | |
| | | |
| | | public function clearCache(Item $item): void |
| | | { |
| | | match ($item->objectType) { |
| | | 'post' => clean_post_cache($item->id), |
| | | 'term' => clean_term_cache($item->id), |
| | | 'user', 'integrations' => clean_user_cache($item->id), |
| | | default => null |
| | | }; |
| | | switch ($item->objectType) { |
| | | case 'post': |
| | | Cache::clearPost($item->id); |
| | | clean_post_cache($item->id); |
| | | break; |
| | | case 'term': |
| | | Cache::clearTerm($item->id); |
| | | clean_term_cache($item->id); |
| | | break; |
| | | case 'user': |
| | | case 'integrations': |
| | | Cache::clearUser($item->id); |
| | | clean_user_cache($item->id); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | // ───────────────────────────────────────────────────────────── |
| | |
| | | ? [] |
| | | : array_map('intval', array_filter(explode(',', $update['value']))); |
| | | |
| | | wp_set_object_terms($update['object_id'], $termIds, $update['taxonomy'], false); |
| | | wp_set_object_terms($update['object_id'], $termIds, $update['taxonomy']); |
| | | } |
| | | } |
| | | |