Jake Vanderwerf
2026-07-05 fff721dd185f5b97f7ae7a6e64189e55887ff590
inc/meta/Meta.php
@@ -1,6 +1,7 @@
<?php
namespace JVBase\meta;
use JVBase\base\Options;
use JVBase\registrar\Registrar;
use WP_Post;
use WP_Term;
@@ -30,7 +31,7 @@
   protected WP_Post|WP_Term|WP_User|false|null $wpObject;
   protected int|string $ID;
   protected MetaTypeManager $typeManager;
   protected static array $instances = ['post' => [],'term' => [], 'user'=>[],'options'=>[]];
   protected static array $instances = ['post' => [],'term' => [], 'user'=>[],'option'=>[]];
   protected array $defaults = ['post_thumbnail'];
   /**
@@ -75,30 +76,30 @@
   /**
    * Create Meta instance for options
    */
   public static function forOptions(?string $baseKey = 'ajv'): self
   public static function forOptions(?string $baseKey = BASE): self
   {
      if (array_key_exists($baseKey, self::$instances['options'])) {
         return self::$instances['options'][$baseKey];
      if (array_key_exists($baseKey, self::$instances['option'])) {
         return self::$instances['option'][$baseKey];
      }
      $new = new self($baseKey, 'options');
      self::$instances['options'][$baseKey] = $new;
      $new = new self($baseKey, 'option');
      self::$instances['option'][$baseKey] = $new;
      return $new;
   }
   /***************************************************************
    * Constructor
   ***************************************************************/
   public function __construct(int|string|null $id, string $type)
   public function __construct(int|string|null $id, string $type, array $fields = [])
   {
      $this->validator = new Validator();
      $this->sanitizer = new Sanitizer();
      $this->typeManager = new MetaTypeManager();
      $this->type = $type;
      $this->ID = $id;
      $this->buildData($id, $type);
      $this->buildData($id, $type, $fields);
   }
   protected function buildData(int|string|null $id, string $type):void
   protected function buildData(int|string|null $id, string $type, array $fields):void
   {
      $this->wpObject = match($type) {
         'post'   => get_post($id),
@@ -114,10 +115,13 @@
         default => null
      };
      $registrar = !is_null($this->slug) ? Registrar::getInstance($this->slug) : false;
      $fields = $registrar ? $registrar->getFields() : [];
      $fields = $registrar ? $registrar->getFields() : $fields;
      if ($this->type == 'option') {
         $options = Options::getInstance();
         $fields = $options->getFields();
      }
      $meta = match($type) {
         'post'   => get_post_meta($id),
         'term'   => get_term_meta($id),
@@ -128,13 +132,18 @@
         $meta = [];
      }
      $meta = array_map(fn($value) => maybe_unserialize($value[0]), $meta);
      $this->fields = [];
      foreach ($fields as $fieldName => $config) {
         $fieldName = jvbNoBase($fieldName);
         if ($this->wpObject && property_exists($this->wpObject, $fieldName)) {
         if ($this->type === 'option') {
            $value = get_option(BASE . $fieldName, $config['default'] ?? '');
         } else if (
            $this->wpObject && property_exists($this->wpObject, $fieldName)
            || $type === 'user' && $this->wpObject && property_exists($this->wpObject->data, $fieldName)) {
            $config['wp'] = true;
            $value = $this->wpObject->$fieldName;
         } else if (in_array($fieldName, $this->defaults)) {
         }  else if (in_array($fieldName, $this->defaults)) {
            $config['wp'] = true;
            switch ($fieldName) {
               case 'post_thumbnail':
@@ -195,6 +204,11 @@
      if (str_contains($name, ':')) {
         return $this->getByPath($name);
      }
      // Group shortcut path
      if (str_contains($name, '|')) {
         [$parent, $child] = explode('|', $name, 2);
         return $this->group($parent)->get($child);
      }
      if (!array_key_exists($name, $this->fields)) {
         error_log('[Meta]::get Attempted to get unregistered field: '.$name);
         return '';
@@ -216,6 +230,11 @@
         return $this->setByPath($name, $value);
      }
      // Group shortcut
      if (str_contains($name, '|')) {
         return $this->setGroup($name, $value, $autosave);
      }
      $field = $this->fields[$name]??false;
      if (!$field) {
         error_log('No config found for field: '.$name);
@@ -340,7 +359,7 @@
            'post' => 'update_post_meta',
            'term' => 'update_term_meta',
            'user' => 'update_user_meta',
            'options', 'option' => 'update_option',
            'option' => 'update_option',
            default => false,
         };
         if (!$function) {
@@ -348,7 +367,12 @@
            return false;
         }
         foreach ($custom as $field) {
            $result = $function($this->ID, BASE.$field->name, $field->value);
            if ($this->type === 'option') {
               $result = update_option(BASE.$field->name, $field->value);
            } else {
               $result = $function($this->ID, BASE.$field->name, $field->value);
            }
            if (!$result) {
               error_log('Problem saving field: '.$field->name.' with value: '.print_r($field->value, true));
            }
@@ -383,7 +407,7 @@
         'post'   => delete_post_meta($this->ID, BASE.$name),
         'term'   => delete_term_meta($this->ID, BASE.$name),
         'user', 'integrations' => delete_user_meta($this->ID, BASE.$name),
         'options'   => delete_option(BASE.$name),
         'option' => delete_option(BASE.$name),
         default => false
      };
   }
@@ -414,9 +438,9 @@
      return new Repeater($this, $name);
   }
   protected function setByPath(string $path, mixed $value): self
   {
      error_log('Setting by path: '.$path.', with value: '.print_r($value, true));
      $parts = explode(':', $path, 3);
      if (count($parts) !== 3) {
         return $this;
@@ -439,6 +463,22 @@
      return $this->repeater($repeaterName)->field((int) $rowIndex, $subField);
   }
   public function group(string $name): Group
   {
      return new Group($this, $name);
   }
   protected function setGroup(string $name, mixed $value, bool $autosave = true): self
   {
      $parent = strtok($name, '|');
      $child = str_replace($parent . '|', '', $name);
      $this->group($parent)->set($child, $value, $autosave);
      return $this;
   }
   // ─────────────────────────────────────────────────────────────
   // Utility Methods
   // ─────────────────────────────────────────────────────────────
@@ -487,6 +527,11 @@
      return $this->contentType;
   }
   public function item():Item
   {
      return $this->item;
   }
   // ─────────────────────────────────────────────────────────────
   // Protected Helpers