Jake Vanderwerf
2026-05-13 226b50642af0895948fbaa623a9b7180399a63b6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?php
namespace JVBase\rest\routes;
 
use JVBase\registrar\Registrar;
use JVBase\rest\PermissionHandler;
use JVBase\rest\Rest;
use JVBase\managers\Cache;
use JVBase\meta\Meta;
use JVBase\rest\Route;
use WP_REST_Request;
use WP_REST_Response;
use WP_Error;
 
if (!defined('ABSPATH')) {
    exit; // Exit if accessed directly
}
 
class OptionsRoutes extends Rest
{
 
    public function __construct()
    {
        parent::__construct();
        add_filter(BASE.'handle_bulk_operation', [$this, 'processOperation'], 10, 3);
    }
 
    public function registerRoutes():void
    {
        Route::for('options')
            ->post([$this, 'saveOptions'])
            ->auth(PermissionHandler::combine(['user', ['actionNonce' => 'dash-']]))
            ->rateLimit(3)
            ->args([
                'user'  => 'int|required',
                'id'    => 'string|required',
            ])
            ->register();
    }
 
    public function saveOptions(WP_REST_Request $request):WP_REST_Response
    {
        $data = $request->get_params();
        $user = $data['user'];
        if ($user && !user_can($user, 'manage_options')) {
            return $this->error('User Cannot modify options');
        }
        unset($data['user']);
        $operationID = $data['id'];
        unset($data['id']);
 
        JVB()->queue()->queueOperation(
            'update_options',
            $user,
            $data,
            [
                'operation_id'  =>$operationID,
                'priority'      => 'high',
            ]
        );
 
        return $this->queued($operationID);
    }
 
 
    /**
     * @param WP_Error|array $result
     * @param object $operation
     * @param array $data
     *
     * @return WP_Error|array
     */
    public function processOperation(WP_Error|array $result, object $operation, array $data):array|WP_Error
    {
        if ($operation->type != 'update_options') {
            return $result;
        }
 
        error_log('Saving changes: '.print_r($data, true));
        $results = [
            'errors'    => [],
            'success'   => []
        ];
 
        $meta = Meta::forOptions('options');
        $fields = Registrar::getFieldsFor('options');
 
        $allowedFields = array_filter($data,
        function ($key) use ($fields) {
            return array_key_exists($key, $fields);
        }, ARRAY_FILTER_USE_KEY);
        error_log('Setting fields: '.print_r($allowedFields, true));
        $results = $meta->setAll($allowedFields);
//      foreach ($data as $field => $value) {
//          if (array_key_exists($field, $fields)) {
//              $success = $meta->updateValue($field, $value);
//              if ($success) {
//                  $results['success'][] = $field;
//              } else {
//                  $results['errors'][] = $field;
//              }
//          }
//      }
 
        do_action('jvbOptionsRoute', $data);
 
        $cache = Cache::for('options', 1800);
        $cache->flush();
        return [
            'success'   => true,
            'result'    => $results
        ];
    }
}