Jake Vanderwerf
2026-08-26 ccf5e61a075c35d24befc175994b5cb8957ca322
inc/meta/Storage.php
@@ -3,6 +3,7 @@
use Exception;
use JVBase\managers\Cache;
use JVBase\managers\Errors;
if (!defined('ABSPATH')) {
   exit;
@@ -10,7 +11,6 @@
/**
 * Handles persistence of meta values to WordPress
 * Pure storage layer - no validation or sanitization
 */
class Storage
{
@@ -77,7 +77,7 @@
            && (
               ($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;
@@ -123,18 +123,21 @@
      }
      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;
   }
   /**
@@ -149,10 +152,10 @@
      }
      $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();
@@ -161,14 +164,13 @@
         $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(), [
         Errors::getInstance()->log('meta_storage', $e->getMessage(), [
            'item_id' => $item->id,
            'object_type' => $item->objectType,
            'fields' => array_keys($dirty)
@@ -324,7 +326,7 @@
            $results[$meta->item()->id ?? 'options'] = false;
         }
         JVB()->error()->log('meta_storage', 'Bulk save failed: ' . $e->getMessage(), [], 'error');
         Errors::getInstance()->log('meta_storage', 'Bulk save failed: ' . $e->getMessage(), [], 'error');
         return $results;
      }
@@ -440,7 +442,7 @@
   protected function getTermField(Item $item, string $name): mixed
   {
      return match ($name) {
         'term_name' => get_term_field('name', $item->id),
         'name' => get_term_field('name', $item->id),
         'description' => get_term_field('description', $item->id),
         default => ''
      };
@@ -538,7 +540,6 @@
   {
      $taxonomy = jvbCheckBase($field->config['taxonomy']);
      $value = $field->value;
      if (empty(trim((string)$value))) {
         wp_set_object_terms($item->id, [], $taxonomy, false);
         return true;
@@ -608,12 +609,21 @@
   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;
      }
   }
   // ─────────────────────────────────────────────────────────────