Jake Vanderwerf
2026-01-25 b38f03c0e7218762d90fa5092696b127f24f36db
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
114
115
116
117
118
119
<?php
namespace JVBase\rest\routes;
 
use JVBase\JVB;
use JVBase\rest\RestRouteManager;
use JVBase\managers\Cache;
use JVBase\meta\MetaManager;
use JVBase\meta\MetaSanitizer;
use WP_REST_Request;
use WP_REST_Response;
use WP_Error;
use Exception;
 
if (!defined('ABSPATH')) {
    exit; // Exit if accessed directly
}
 
class OptionsRoutes extends RestRouteManager
{
 
    public function __construct()
    {
        parent::__construct();
        $this->action = 'dash-';
        add_filter(BASE.'handle_bulk_operation', [$this, 'processOperation'], 10, 3);
    }
 
    public function registerRoutes()
    {
        register_rest_route($this->namespace, '/options', [
            [
                'methods' => 'POST',
                'callback' => [$this, 'saveOptions'],
                'permission_callback' => [$this, 'checkPermission']
            ]
        ]);
    }
 
    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 new WP_REST_Response([
                'success'   => 'false',
                'message'   => 'User cannot modify options'
            ]);
        }
        unset($data['user']);
        $operationID = $data['id'];
        unset($data['id']);
        $queue = JVB()->queue();
        $queue->queueOperation(
            'update_options',
            $user,
            $data,
            [
                'operation_id'  =>$operationID,
                'priority'      => 'high',
            ]
        );
 
 
        return new WP_REST_Response([
            'success'   => 'true',
            'message'   => 'Probably'
        ]);
    }
 
 
    /**
     * @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 = new MetaManager(null, 'options');
        $fields = jvbGetFields('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
        ];
    }
}