| | |
| | | <?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;
|
| | |
| | | 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']);
|
| | | }
|
| | |
|
| | |
| | | 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' => array_map(function ($s) {
|
| | |
| | | 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;
|
| | |
|
| | | $default = $config['type'] === 'repeater' ?
|
| | | $this->determineDefault($schema['schema']['properties']??[]) :
|
| | | $config['default'] ?? MetaTypeManager::getType($config['type'])['default'] ?? '';
|
| | |
|
| | | register_post_meta($this->registrar->getBased(), jvbCheckBase($name), [
|
| | | 'single' => true,
|
| | | 'type' => $metaType,
|
| | | 'default' => $config['default'] ?? MetaTypeManager::getType($config['type'])['default'] ?? '',
|
| | | 'default' => $default,
|
| | | '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,
|
| | | ]);
|
| | | }
|
| | | }
|
| | |
| | | $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)) {
|
| | |
| | | protected function schemaLocation(array $config):array|true
|
| | | {
|
| | | return [
|
| | | 'type' => 'object',
|
| | | 'type' => ['object', 'null'],
|
| | | 'properties' => [
|
| | | 'address' => [
|
| | | 'type' => 'string'
|
| | |
| | | ]
|
| | | ];
|
| | | }
|
| | |
|
| | | 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
|
| | | {
|
| | |
|
| | | }
|
| | |
|
| | | protected function determineDefault(array $properties):array
|
| | | {
|
| | | $out = [];
|
| | | foreach ($properties as $prop => $value) {
|
| | | $out[$prop] = match ($value) {
|
| | | 'object' => [],
|
| | | default => ''
|
| | | };
|
| | | }
|
| | | return $out;
|
| | | }
|
| | | }
|