From 1aa7c404dae63c9518468fe9b579fad819f8d871 Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Sun, 13 Sep 2026 18:32:43 +0000
Subject: [PATCH] =Single Event page setup done through the new Event block. Currently working on the Simple Calendar block setup
---
inc/registrar/helpers/AddCustomFields.php | 102 ++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 84 insertions(+), 18 deletions(-)
diff --git a/inc/registrar/helpers/AddCustomFields.php b/inc/registrar/helpers/AddCustomFields.php
index 2e730ff..2be7fd2 100644
--- a/inc/registrar/helpers/AddCustomFields.php
+++ b/inc/registrar/helpers/AddCustomFields.php
@@ -1,9 +1,12 @@
<?php
namespace JVBase\inc\registrar\helpers;
+use JVBase\meta\Meta;
use JVBase\meta\MetaTypeManager;
use JVBase\meta\Sanitizer;
use JVBase\registrar\Registrar;
+use WP_Post;
+use WP_User;
if (!defined('ABSPATH')) {
exit;
@@ -14,10 +17,22 @@
public function __construct(Registrar $registrar) {
$this->registrar = $registrar;
- if ($registrar->getType() === 'post') {
- add_action('enqueue_block_editor_assets', [$this, 'enqueue']);
+ $this->registerHooks();
+ }
+ protected function registerHooks():void
+ {
+ switch ($this->registrar->getType()) {
+ case 'post':
+ add_action('save_post', [$this, 'checkPostFields'], 10, 2);
+ add_action('enqueue_block_editor_assets', [$this, 'enqueue']);
+ break;
+ case 'term':
+ add_action('saved_term', [$this, 'checkTermFields']);
+ break;
+ case 'user':
+ add_action('profile_update', [$this, 'checkUserFields']);
+ break;
}
-
add_action('init', [$this, 'registerMeta']);
}
@@ -35,7 +50,7 @@
wp_enqueue_script(
'jvb-editor-fields',
- JVB_URL.'/build/_meta/fields.js',
+ JVB_URL.'build/_meta/fields.js',
$asset['dependencies'],
$asset['version'],
true
@@ -44,13 +59,24 @@
wp_add_inline_script(
'jvb-editor-fields',
'window.jvbFieldConfig = '.wp_json_encode([
- 'postType' => $this->registrar->getBased(),
'fields' => array_map(function($f) {
$f['name'] = jvbCheckBase($f['name']);
+ $f['id'] = jvbCheckBase($f['name']);
+ if ($f['type'] === 'selector') {
+ $f['taxonomy'] = jvbCheckBase($f['taxonomy']);
+ }
+ if (array_key_exists('condition', $f)) {
+ $f['condition']['field'] = jvbCheckBase($f['condition']['field']);
+ }
return $f;
},array_values($this->registrar->getFields(false))),
- 'sections' => $this->registrar->getSections(),
- 'base' => BASE
+ 'sections' => array_map(function ($s) {
+ $s['id'] = jvbCheckBase($s['slug']);
+ $s['fields'] = array_map(function ($f) {
+ return jvbCheckBase($f);
+ }, $s['fields']);
+ return $s;
+ },$this->registrar->getSections()),
]).';',
'before'
);
@@ -62,7 +88,16 @@
foreach ($this->registrar->getFields(false) as $name => $config) {
$metaType = $this->getSchemaType($config);
- $schema = $metaType === 'array' ? $this->determineSchema($config) : true;
+ $rawSchema = in_array($metaType, ['array', 'object'], true)
+ ? $this->determineSchema($config)
+ : true;
+
+ //Allow for null
+ if ($metaType === 'object') {
+ $rawSchema['type'] = ['object', 'null'];
+ }
+
+ $schema = is_array($rawSchema) ? $this->schema($rawSchema) : $rawSchema;
register_post_meta($this->registrar->getBased(), jvbCheckBase($name), [
'single' => true,
@@ -71,7 +106,6 @@
'sanitize_callback' => fn($value) => (Sanitizer::sanitize($value, $config)),
'auth_callback' => fn($allowed, $key, $postID) => current_user_can('edit_post', $postID),
'show_in_rest' => $schema,
- 'revisions_enabled' => true,
]);
}
}
@@ -152,16 +186,16 @@
$required[] = $name;
}
- $schema = $this->determineSchema($c);
- if (is_array($schema)) {
- if (array_key_exists('default', $schema)) {
- $args['default'] = $schema['default'];
+ $tmp = $this->determineSchema($c);
+ if (is_array($tmp)) {
+ if (array_key_exists('default', $tmp)) {
+ $args['default'] = $tmp['default'];
}
- if (array_key_exists('enum', $schema)) {
- $args['enum'] = $schema['enum'];
+ if (array_key_exists('enum', $tmp)) {
+ $args['enum'] = $tmp['enum'];
}
- if (array_key_exists('format', $schema)) {
- $args['format'] = $schema['format'];
+ if (array_key_exists('format', $tmp)) {
+ $args['format'] = $tmp['format'];
}
}
if (array_key_exists('default', $c)) {
@@ -190,7 +224,7 @@
protected function schemaLocation(array $config):array|true
{
return [
- 'type' => 'object',
+ 'type' => ['object', 'null'],
'properties' => [
'address' => [
'type' => 'string'
@@ -219,4 +253,36 @@
]
];
}
+
+ public function checkPostFields(int $ID, WP_Post $post):void
+ {
+ if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
+ if (wp_is_post_revision($ID) || wp_is_post_autosave($ID)) return;
+
+ if ($post->post_type !== $this->registrar->getBased()) {
+ return;
+ }
+ $taxFields = array_filter($this->registrar->getFields(false), function ($field) {
+ return array_key_exists('type', $field) && $field['type'] === 'selector' && (!array_key_exists('isReference', $field) || !$field['isReference']);
+ });
+ if (empty($taxFields)) {
+ return;
+ }
+ foreach ($taxFields as $name => $config) {
+ $tax = jvbCheckBase($config['taxonomy']);
+
+ $value = get_post_meta($ID, BASE.$name, true);
+ $termIDs = array_map('intval', array_filter(explode(',', $value)));
+ $result = wp_set_object_terms($ID, $termIDs, $tax);
+ }
+ }
+
+ public function checkTermFields(int $ID, int $ttID, string $taxonomy):void
+ {
+
+ }
+ public function checkUserFields(int $ID, WP_User $oldUser, array $userData):void
+ {
+
+ }
}
--
Gitblit v1.10.0