Plugin Directory

Changeset 3374520


Ignore:
Timestamp:
10/07/2025 03:23:05 PM (4 months ago)
Author:
reenhanced
Message:

Release version 2.3.0

Location:
wp-connectr/trunk
Files:
54 edited

Legend:

Unmodified
Added
Removed
  • wp-connectr/trunk/changelog.txt

    r3364617 r3374520  
    11*** Changelog ***
     2
     32025-10-06 - version 2.3.0
     4* Enhanced ACF field retrieval with alternative request schema support for improved compatibility
    25
    362025-09-19 - version 2.2.0
  • wp-connectr/trunk/readme.txt

    r3364617 r3374520  
    66Tested up to: 6.8
    77Requires PHP: 7.2.0
    8 Stable tag: 2.2.0
     8Stable tag: 2.3.0
    99License: GPLv2 or later
    1010License URI: http://www.gnu.org/licenses/gpl-2.0.html
     
    7474== Changelog ==
    7575
     762025-10-06 - version 2.3.0
     77* Enhanced ACF field retrieval with alternative request schema support for improved compatibility
     78
    76792025-09-19 - version 2.2.0
    7780* Added meta query support for users and posts - filter by custom fields using meta_key, meta_value, meta_compare, and complex meta_query parameters
  • wp-connectr/trunk/src/ACF/Rest_Api.php

    r3363457 r3374520  
    3131        add_filter( 'rest_pre_dispatch', array( $this, 'initialize' ), 10, 3 );
    3232        add_action( 'rest_api_init', array( $this, 'register_field' ), 2 );
     33
     34        add_filter( 'wp_connectr_endpoint_args', array( $this, 'filter_schema_props_for_endpoint_args' ), 10, 1 );
    3335
    3436        // Add schema filters for each ACF field type to ensure Power Automate compatibility
     
    7173
    7274        // File/Image fields - return as object or string
    73         add_filter( 'acf/rest/get_field_schema/type=image', array( $this, 'get_file_schema' ), 10, 2 );
    74         add_filter( 'acf/rest/get_field_schema/type=file', array( $this, 'get_file_schema' ), 10, 2 );
     75        // Disabled: Files and images are returned as IDs in ACF REST API. See acf_field_file::format_value_for_rest
     76        // add_filter( 'acf/rest/get_field_schema/type=image', array( $this, 'get_image_schema' ), 10, 2 );
     77        // add_filter( 'acf/rest/get_field_schema/type=file', array( $this, 'get_file_schema' ), 10, 2 );
    7578        add_filter( 'acf/rest/get_field_schema/type=gallery', array( $this, 'get_array_schema' ), 10, 2 );
    7679
     
    8386
    8487        // Layout fields - return as array
    85         add_filter( 'acf/rest/get_field_schema/type=repeater', array( $this, 'get_array_schema' ), 10, 2 );
     88        add_filter( 'acf/rest/get_field_schema/type=repeater', array( $this, 'get_repeater_schema' ), 10, 2 );
    8689        add_filter( 'acf/rest/get_field_schema/type=flexible_content', array( $this, 'get_array_schema' ), 10, 2 );
    87         add_filter( 'acf/rest/get_field_schema/type=group', array( $this, 'get_object_schema' ), 10, 2 );
     90        add_filter( 'acf/rest/get_field_schema/type=group', array( $this, 'get_group_schema' ), 10, 2 );
    8891        add_filter( 'acf/rest/get_field_schema/type=clone', array( $this, 'get_object_schema' ), 10, 2 );
    8992
     
    180183
    181184    }
     185
     186
     187    /**
     188     * Filter to modify schema for endpoint args.
     189     *
     190     * ACF provides only a single description of the schema, which is used for both the request and the response.
     191     * This works fine for most cases, but for some fields, the schema for the request needs to be different to the schema for the response.
     192     *
     193     * When we construct the schema for our fields, we add 'request_overrides' to the schema for fields that need to be different for requests.
     194     *
     195     * This filter looks for those overrides and applies them to the schema for the request endpoint args.
     196     *
     197     * @param array $schema The full item schema.
     198     * @return array Modified schema for request endpoint args.
     199     */
     200    public function filter_schema_props_for_endpoint_args( $schema_props ) {
     201        // Only process the 'acf' field since this class is only responsible for ACF fields
     202        if ( ! isset( $schema_props['acf'] ) ) {
     203            return $schema_props;
     204        }
     205
     206        // Process the acf field and all its nested properties recursively
     207        $schema_props['acf'] = $this->apply_request_overrides_recursively( $schema_props['acf'] );
     208
     209        return $schema_props;
     210    }
     211
     212    /**
     213     * Recursively apply request_overrides to a schema and its nested properties.
     214     *
     215     * @param array $field_schema The field schema to process.
     216     * @return array The processed field schema.
     217     */
     218    private function apply_request_overrides_recursively( $field_schema ) {
     219        if ( ! is_array( $field_schema ) ) {
     220            return $field_schema;
     221        }
     222
     223        // Apply request_overrides for this field
     224        if ( isset( $field_schema['request_overrides'] ) && is_array( $field_schema['request_overrides'] ) ) {
     225            foreach ( $field_schema['request_overrides'] as $key => $value ) {
     226                $field_schema[ $key ] = $value;
     227            }
     228            unset( $field_schema['request_overrides'] );
     229        }
     230
     231        // Recursively process nested properties
     232        if ( isset( $field_schema['properties'] ) && is_array( $field_schema['properties'] ) ) {
     233            foreach ( $field_schema['properties'] as $property_name => &$property_schema ) {
     234                $property_schema = $this->apply_request_overrides_recursively( $property_schema );
     235            }
     236        }
     237
     238        // Recursively process items schema (for arrays)
     239        if ( isset( $field_schema['items'] ) && is_array( $field_schema['items'] ) ) {
     240            $field_schema['items'] = $this->apply_request_overrides_recursively( $field_schema['items'] );
     241        }
     242
     243        return $field_schema;
     244    }
     245
    182246
    183247    /**
     
    834898
    835899    /**
     900     * Get schema for image fields
     901     *
     902     * @param array $schema
     903     * @param array $field
     904     * @return array
     905     */
     906    public function get_image_schema( $schema, $field ) {
     907        // Check return format to determine if we return object or string
     908        $return_format = isset( $field['return_format'] ) ? $field['return_format'] : 'array';
     909
     910        // Set request overrides to expect an integer (Attachment ID) for requests
     911        if ( isset( $schema['type'] ) ) {
     912            $schema['request_overrides']['type'] = $schema['type'];
     913            $schema['request_overrides']['description'] = 'The Attachment ID of the image.';
     914        }
     915
     916        if ( $return_format === 'url' ) {
     917            $schema['type'] = 'string';
     918            $schema['description'] = 'The URL of the image.';
     919        } elseif ( $return_format === 'id' ) {
     920            $schema['type'] = 'string';
     921            $schema['description'] = 'The Attachment ID of the image.';
     922        } else {
     923            // For array/object return format, describe the full image attachment object structure
     924            $schema['type'] = 'object';
     925            $schema['description'] = 'Full image attachment object with all metadata including sizes.';
     926            $schema['properties'] = array(
     927                'id' => array(
     928                    'type' => 'integer',
     929                    'description' => 'The attachment ID',
     930                ),
     931                'title' => array(
     932                    'type' => 'string',
     933                    'description' => 'The attachment title.',
     934                ),
     935                'filename' => array(
     936                    'type' => 'string',
     937                    'description' => 'The file name.',
     938                ),
     939                'filesize' => array(
     940                    'type' => 'integer',
     941                    'description' => 'The file size in bytes.',
     942                ),
     943                'url' => array(
     944                    'type' => 'string',
     945                    'format' => 'uri',
     946                    'description' => 'The URL to the full-size image.',
     947                ),
     948                'link' => array(
     949                    'type' => 'string',
     950                    'format' => 'uri',
     951                    'description' => 'The attachment page link.',
     952                ),
     953                'alt' => array(
     954                    'type' => 'string',
     955                    'description' => 'The alternative text.',
     956                ),
     957                'author' => array(
     958                    'type' => 'string',
     959                    'description' => 'The author ID.',
     960                ),
     961                'description' => array(
     962                    'type' => 'string',
     963                    'description' => 'The attachment description.',
     964                ),
     965                'caption' => array(
     966                    'type' => 'string',
     967                    'description' => 'The attachment caption.',
     968                ),
     969                'name' => array(
     970                    'type' => 'string',
     971                    'description' => 'The attachment post name (slug).',
     972                ),
     973                'status' => array(
     974                    'type' => 'string',
     975                    'description' => 'The attachment post status.',
     976                ),
     977                'uploaded_to' => array(
     978                    'type' => 'integer',
     979                    'description' => 'The parent post ID this attachment is uploaded to.',
     980                ),
     981                'date' => array(
     982                    'type' => 'string',
     983                    'format' => 'date-time',
     984                    'description' => 'The upload date (GMT).',
     985                ),
     986                'modified' => array(
     987                    'type' => 'string',
     988                    'format' => 'date-time',
     989                    'description' => 'The last modified date (GMT).',
     990                ),
     991                'menu_order' => array(
     992                    'type' => 'integer',
     993                    'description' => 'The menu order.',
     994                ),
     995                'mime_type' => array(
     996                    'type' => 'string',
     997                    'description' => 'The MIME type of the image.',
     998                ),
     999                'type' => array(
     1000                    'type' => 'string',
     1001                    'description' => 'The general file type (typically "image").',
     1002                ),
     1003                'subtype' => array(
     1004                    'type' => 'string',
     1005                    'description' => 'The specific image subtype (e.g., jpeg, png, gif).',
     1006                ),
     1007                'icon' => array(
     1008                    'type' => 'string',
     1009                    'format' => 'uri',
     1010                    'description' => 'The URL to the icon representing the file type.',
     1011                ),
     1012                'width' => array(
     1013                    'type' => 'integer',
     1014                    'description' => 'The image width in pixels.',
     1015                ),
     1016                'height' => array(
     1017                    'type' => 'integer',
     1018                    'description' => 'The image height in pixels.',
     1019                ),
     1020                'sizes' => array(
     1021                    'type' => 'object',
     1022                    'description' => 'Object containing URLs and dimensions for all registered image sizes.',
     1023                    'additionalProperties' => true,
     1024                    'properties' => array(
     1025                        'thumbnail' => array(
     1026                            'type' => 'string',
     1027                            'format' => 'uri',
     1028                            'description' => 'URL to the thumbnail size.',
     1029                        ),
     1030                        'thumbnail-width' => array(
     1031                            'type' => 'integer',
     1032                            'description' => 'Width of the thumbnail size.',
     1033                        ),
     1034                        'thumbnail-height' => array(
     1035                            'type' => 'integer',
     1036                            'description' => 'Height of the thumbnail size.',
     1037                        ),
     1038                        'medium' => array(
     1039                            'type' => 'string',
     1040                            'format' => 'uri',
     1041                            'description' => 'URL to the medium size.',
     1042                        ),
     1043                        'medium-width' => array(
     1044                            'type' => 'integer',
     1045                            'description' => 'Width of the medium size.',
     1046                        ),
     1047                        'medium-height' => array(
     1048                            'type' => 'integer',
     1049                            'description' => 'Height of the medium size.',
     1050                        ),
     1051                        'medium_large' => array(
     1052                            'type' => 'string',
     1053                            'format' => 'uri',
     1054                            'description' => 'URL to the medium_large size.',
     1055                        ),
     1056                        'medium_large-width' => array(
     1057                            'type' => 'integer',
     1058                            'description' => 'Width of the medium_large size.',
     1059                        ),
     1060                        'medium_large-height' => array(
     1061                            'type' => 'integer',
     1062                            'description' => 'Height of the medium_large size.',
     1063                        ),
     1064                        'large' => array(
     1065                            'type' => 'string',
     1066                            'format' => 'uri',
     1067                            'description' => 'URL to the large size.',
     1068                        ),
     1069                        'large-width' => array(
     1070                            'type' => 'integer',
     1071                            'description' => 'Width of the large size.',
     1072                        ),
     1073                        'large-height' => array(
     1074                            'type' => 'integer',
     1075                            'description' => 'Height of the large size.',
     1076                        ),
     1077                    ),
     1078                ),
     1079            );
     1080            $schema['additionalProperties'] = true; // Allow for custom image sizes
     1081        }
     1082        return $schema;
     1083    }
     1084
     1085    /**
    8361086     * Get schema for file/image fields
    8371087     *
     
    8441094        $return_format = isset( $field['return_format'] ) ? $field['return_format'] : 'array';
    8451095
    846         if ( $return_format === 'url' || $return_format === 'id' ) {
     1096        // Set request overrides to expect an integer (Attachment ID) for requests
     1097        if ( isset( $schema['type'] ) ) {
     1098            $schema['request_overrides']['type'] = $schema['type'];
     1099            $schema['request_overrides']['description'] = 'The Attachment ID of the file.';
     1100        }
     1101
     1102        if ( $return_format === 'url' ) {
    8471103            $schema['type'] = 'string';
     1104            $schema['description'] = 'The URL of the file.';
     1105        } elseif ( $return_format === 'id' ) {
     1106            $schema['type'] = 'string';
     1107            $schema['description'] = 'The Attachment ID of the file.';
    8481108        } else {
    849             // For array/object return format, we can't predict the exact object structure
    850             // So we'll let it be converted to JSON string by the typecaster
     1109            // For array/object return format, describe the full attachment object structure
    8511110            $schema['type'] = 'object';
     1111            $schema['description'] = 'Full attachment object with all metadata.';
     1112            $schema['properties'] = array(
     1113                'id' => array(
     1114                    'type' => 'integer',
     1115                    'description' => 'The attachment ID',
     1116                ),
     1117                'title' => array(
     1118                    'type' => 'string',
     1119                    'description' => 'The attachment title.',
     1120                ),
     1121                'filename' => array(
     1122                    'type' => 'string',
     1123                    'description' => 'The file name.',
     1124                ),
     1125                'filesize' => array(
     1126                    'type' => 'integer',
     1127                    'description' => 'The file size in bytes.',
     1128                ),
     1129                'url' => array(
     1130                    'type' => 'string',
     1131                    'format' => 'uri',
     1132                    'description' => 'The URL to the file.',
     1133                ),
     1134                'link' => array(
     1135                    'type' => 'string',
     1136                    'format' => 'uri',
     1137                    'description' => 'The attachment page link.',
     1138                ),
     1139                'alt' => array(
     1140                    'type' => 'string',
     1141                    'description' => 'The alternative text.',
     1142                ),
     1143                'author' => array(
     1144                    'type' => 'string',
     1145                    'description' => 'The author ID.',
     1146                ),
     1147                'description' => array(
     1148                    'type' => 'string',
     1149                    'description' => 'The attachment description.',
     1150                ),
     1151                'caption' => array(
     1152                    'type' => 'string',
     1153                    'description' => 'The attachment caption.',
     1154                ),
     1155                'name' => array(
     1156                    'type' => 'string',
     1157                    'description' => 'The attachment post name (slug).',
     1158                ),
     1159                'status' => array(
     1160                    'type' => 'string',
     1161                    'description' => 'The attachment post status.',
     1162                ),
     1163                'uploaded_to' => array(
     1164                    'type' => 'integer',
     1165                    'description' => 'The parent post ID this attachment is uploaded to.',
     1166                ),
     1167                'date' => array(
     1168                    'type' => 'string',
     1169                    'format' => 'date-time',
     1170                    'description' => 'The upload date (GMT).',
     1171                ),
     1172                'modified' => array(
     1173                    'type' => 'string',
     1174                    'format' => 'date-time',
     1175                    'description' => 'The last modified date (GMT).',
     1176                ),
     1177                'menu_order' => array(
     1178                    'type' => 'integer',
     1179                    'description' => 'The menu order.',
     1180                ),
     1181                'mime_type' => array(
     1182                    'type' => 'string',
     1183                    'description' => 'The MIME type of the file.',
     1184                ),
     1185                'type' => array(
     1186                    'type' => 'string',
     1187                    'description' => 'The general file type (e.g., image, video, audio, application).',
     1188                ),
     1189                'subtype' => array(
     1190                    'type' => 'string',
     1191                    'description' => 'The specific file subtype (e.g., jpeg, png, mp4, pdf).',
     1192                ),
     1193                'icon' => array(
     1194                    'type' => 'string',
     1195                    'format' => 'uri',
     1196                    'description' => 'The URL to the icon representing the file type.',
     1197                ),
     1198            );
     1199            $schema['additionalProperties'] = true; // Allow for dynamic properties based on file type
     1200        }
     1201        return $schema;
     1202    }
     1203
     1204    /**
     1205     * Get schema for repeater fields with sub-field structure
     1206     *
     1207     * @param array $schema
     1208     * @param array $field
     1209     * @return array
     1210     */
     1211    public function get_repeater_schema( $schema, $field ) {
     1212        $schema['type'] = 'array';
     1213        $schema['description'] = 'Array of repeater row objects, each containing the defined sub-fields.';
     1214
     1215        // Check if the repeater has sub_fields defined
     1216        if ( isset( $field['sub_fields'] ) && is_array( $field['sub_fields'] ) && ! empty( $field['sub_fields'] ) ) {
     1217            // Build the schema for each repeater row as an object with properties
     1218            $schema['items'] = array(
     1219                'type' => 'object',
     1220                'description' => 'A single repeater row containing all sub-fields.',
     1221                'properties' => array(),
     1222            );
     1223
     1224            // Process each sub-field to build the properties
     1225            foreach ( $field['sub_fields'] as $sub_field ) {
     1226                // Recursively get the schema for each sub-field using ACF's schema function
     1227                $sub_field_schema = acf_get_field_rest_schema( $sub_field );
     1228                $schema['items']['properties'][ $sub_field['name'] ] = $sub_field_schema;
     1229            }
     1230        } else {
     1231            // Fallback if no sub_fields are defined (shouldn't normally happen)
     1232            $schema['items'] = array(
     1233                'type' => 'object',
     1234                'description' => 'A repeater row object.',
     1235                'additionalProperties' => true,
     1236            );
     1237        }
     1238
     1239        return $schema;
     1240    }
     1241
     1242    /**
     1243     * Get schema for group fields with sub-field structure
     1244     *
     1245     * @param array $schema
     1246     * @param array $field
     1247     * @return array
     1248     */
     1249    public function get_group_schema( $schema, $field ) {
     1250        $schema['type'] = 'object';
     1251        $schema['description'] = 'Group field containing multiple sub-fields.';
     1252        $schema['properties'] = array();
     1253
     1254        // Check if the group has sub_fields defined
     1255        if ( isset( $field['sub_fields'] ) && is_array( $field['sub_fields'] ) && ! empty( $field['sub_fields'] ) ) {
     1256            // Process each sub-field to build the properties
     1257            foreach ( $field['sub_fields'] as $sub_field ) {
     1258                // Recursively get the schema for each sub-field using ACF's schema function
     1259                $sub_field_schema = acf_get_field_rest_schema( $sub_field );
     1260                $schema['properties'][ $sub_field['name'] ] = $sub_field_schema;
     1261            }
     1262        } else {
     1263            // Fallback if no sub_fields are defined
    8521264            $schema['additionalProperties'] = true;
    8531265        }
     1266
    8541267        return $schema;
    8551268    }
     
    8661279        $multiple = isset( $field['multiple'] ) ? $field['multiple'] : false;
    8671280        $return_format = isset( $field['return_format'] ) ? $field['return_format'] : 'object';
     1281
     1282        if ( isset( $schema['type'] ) ) {
     1283            $schema['request_overrides']['type'] = $schema['type'];
     1284        }
    8681285
    8691286        if ( $multiple ) {
  • wp-connectr/trunk/src/Controller/RestfulRoutesTrait.php

    r3250561 r3374520  
    233233
    234234        /**
     235         * Filter to globally modify endpoint args
     236         *
     237         * @param array $endpoint_args The endpoint args.
     238         */
     239        $endpoint_args = apply_filters( 'wp_connectr_endpoint_args', $endpoint_args, $method );
     240
     241        /**
    235242         * Filter the endpoint args for this resource.
    236243         *
    237244         * @param array $endpoint_args The endpoint args.
    238245         */
    239         return apply_filters( "wp_connectr_{$this->rest_base}_endpoint_args", $endpoint_args );
     246        return apply_filters( "wp_connectr_{$this->rest_base}_endpoint_args", $endpoint_args, $method );
    240247    }
    241248
  • wp-connectr/trunk/src/DynamicSchemaProvider.php

    r3358663 r3374520  
    99    const SUPPORTED_TYPES    = array( 'string', 'integer', 'number', 'boolean', 'array', 'object' );
    1010    const SUPPORTED_FORMATS  = array( 'date-time', 'uri', 'email' );
     11
     12    /**
     13     * The API instance
     14     *
     15     * @var API
     16     */
     17    private $api;
     18
     19    /**
     20     * The input data
     21     *
     22     * @var array
     23     */
     24    private $input_data;
     25
     26    /**
     27     * The data, typically the response body
     28     *
     29     * @var array
     30     */
     31    private $data;
     32
     33    public function __construct( API $api ) {
     34        $this->api = $api;
     35
     36        $this->input_data = array();
     37        $this->data       = array();
     38    }
     39
     40    public function register() {
     41        add_filter( 'rest_post_dispatch', array( $this, 'translate_power_automate_options_request' ), 10, 3);
     42        add_filter( 'wp_connectr_dynamic_schema', array( $this, 'filter_schema' ), 10, 1 );
     43    }
     44
     45    /**
     46     * Accepts a schema and converts it to a format compatible with Power Automate.
     47     *
     48     * @param array $raw_schema Must contain 'schema' key
     49     * @return void
     50     */
     51    public function filter_schema( $raw_schema ) {
     52        if ( ! $this->api->is_our_request() ) {
     53            return $raw_schema;
     54        }
     55
     56        $jschema      = rgar( $raw_schema, 'schema', array( 'properties' => array() ) );
     57        $schema_props = self::json2swagger( $jschema['properties'] );
     58
     59        return array( 'schema' => $schema_props );
     60    }
     61
     62    /**
     63     * Translates OPTIONS requests to our API to a format compatible with Power Automate.
     64     *
     65     * Violates normal WP schema standards.
     66     *
     67     * @param WP_HTTP_Response $response
     68     * @param WP_REST_Server $wp_rest_server
     69     * @param WP_REST_Request $request
     70     * @return WP_HTTP_Response
     71     */
     72    public function translate_power_automate_options_request( $response, $wp_rest_server, $request ) {
     73        if ( $request->get_method() !== 'OPTIONS' || ! $this->api->is_our_request() ) {
     74            return $response;
     75        }
     76
     77        $this->set_input_data( $response->get_data() );
     78        $this->set_data( array() );
     79
     80        if ( isset( $this->input_data['schema'] ) ) {
     81            $jschema      = $this->input_data['schema'];
     82            $schema_props = self::json2swagger( $jschema['properties'] );
     83
     84            $schema          = $schema_props;
     85            $schema['title'] = (string) new Humanizer( $jschema['title'] );
     86            $schema['type']  = $jschema['type'];
     87
     88            $this->set_data_prop( 'schema', $schema );
     89        }
     90
     91        if ( array_key_exists( 'methods', $this->input_data ) ) {
     92            foreach ( $this->input_data['methods'] as $method ) {
     93                $jschema         = $this->first_matching_endpoint( $method );
     94                $method          = strtolower( $method );
     95                $remove_readonly = false;
     96
     97                if ( 'get' !== $method ) {
     98                    $remove_readonly = true;
     99                }
     100
     101                $swagger = self::json2swagger( $jschema, $remove_readonly );
     102
     103                $this->set_data_prop( $method, $swagger );
     104            }
     105        }
     106
     107        $response->set_data( $this->get_data() );
     108
     109        return $response;
     110    }
     111
     112    protected function get_data() {
     113        return $this->data;
     114    }
     115
     116    protected function set_data( $data ) {
     117        $this->data = $data;
     118
     119        return $data;
     120    }
     121
     122    protected function set_data_prop( $key, $value ) {
     123        $this->data[ $key ] = $value;
     124
     125        return $this->data[ $key ];
     126    }
     127
     128    protected function get_input_data() {
     129        return $this->input_data;
     130    }
     131
     132    protected function set_input_data( $value ) {
     133        $this->input_data = $value;
     134
     135        return $value;
     136    }
     137
    11138
    12139    public static function json2swagger( $json_schema, $remove_readonly = false ) {
     
    84211
    85212        if ( is_array( $jitem['type'] ) ) {
    86             if ( count( $jitem['type'] ) === 1 ) {
    87                 $jitem['type'] = $jitem['type'][0];
     213            // Remove null from types
     214            $types = array_filter( $jitem['type'], function( $v ) {
     215                return 'null' !== $v;
     216            } );
     217
     218            if ( count( $types ) === 1 ) {
     219                $jitem['type'] = $types[0];
    88220            } else {
    89                 // Power Automate doesn't support multiple types, so we need to work out how this should be handled
    90                 if ( isset( $jitem[ 'items' ] ) && in_array( 'array', $jitem['type'], true ) ) {
    91                     $jitem['type'] = 'array';
    92                 } elseif ( in_array( 'string', $jitem['type'], true ) ) {
    93                     $jitem['type'] = 'string';
    94                 }
    95 
     221                // Find the first supported type in the array
     222                $found_type = null;
     223                foreach ( $types as $type ) {
     224                    if ( in_array( $type, self::SUPPORTED_TYPES, true ) ) {
     225                        $found_type = $type;
     226                        break;
     227                    }
     228                }
     229
     230                // Use the first supported type found, or fallback to 'string'
     231                $jitem['type'] = null !== $found_type ? $found_type : 'string';
    96232            }
    97233        }
     
    152288        return array_filter( $item );
    153289    }
    154 
    155     /**
    156      * The API instance
    157      *
    158      * @var API
    159      */
    160     private $api;
    161 
    162     /**
    163      * The input data
    164      *
    165      * @var array
    166      */
    167     private $input_data;
    168 
    169     /**
    170      * The data, typically the response body
    171      *
    172      * @var array
    173      */
    174     private $data;
    175 
    176     public function __construct( API $api ) {
    177         $this->api = $api;
    178 
    179         $this->input_data = array();
    180         $this->data       = array();
    181     }
    182 
    183     public function register() {
    184         add_filter( 'rest_post_dispatch', array( $this, 'translate_power_automate_options_request' ), 10, 3);
    185         add_filter( 'wp_connectr_dynamic_schema', array( $this, 'filter_schema' ), 10, 1 );
    186     }
    187 
    188     /**
    189      * Accepts a schema and converts it to a format compatible with Power Automate.
    190      *
    191      * @param array $raw_schema Must contain 'schema' key
    192      * @return void
    193      */
    194     public function filter_schema( $raw_schema ) {
    195         if ( ! $this->api->is_our_request() ) {
    196             return $raw_schema;
    197         }
    198 
    199         $jschema      = rgar( $raw_schema, 'schema', array( 'properties' => array() ) );
    200         $schema_props = self::json2swagger( $jschema['properties'] );
    201 
    202         return array( 'schema' => $schema_props );
    203     }
    204 
    205     /**
    206      * Translates OPTIONS requests to our API to a format compatible with Power Automate.
    207      *
    208      * Violates normal WP schema standards.
    209      *
    210      * @param WP_HTTP_Response $response
    211      * @param WP_REST_Server $wp_rest_server
    212      * @param WP_REST_Request $request
    213      * @return WP_HTTP_Response
    214      */
    215     public function translate_power_automate_options_request( $response, $wp_rest_server, $request ) {
    216         if ( $request->get_method() !== 'OPTIONS' || ! $this->api->is_our_request() ) {
    217             return $response;
    218         }
    219 
    220         $this->set_input_data( $response->get_data() );
    221         $this->set_data( array() );
    222 
    223         if ( isset( $this->input_data['schema'] ) ) {
    224             $jschema      = $this->input_data['schema'];
    225             $schema_props = self::json2swagger( $jschema['properties'] );
    226 
    227             $schema          = $schema_props;
    228             $schema['title'] = (string) new Humanizer( $jschema['title'] );
    229             $schema['type']  = $jschema['type'];
    230 
    231             $this->set_data_prop( 'schema', $schema );
    232         }
    233 
    234         if ( array_key_exists( 'methods', $this->input_data ) ) {
    235             foreach ( $this->input_data['methods'] as $method ) {
    236                 $jschema         = $this->first_matching_endpoint( $method );
    237                 $method          = strtolower( $method );
    238                 $remove_readonly = false;
    239 
    240                 if ( 'get' !== $method ) {
    241                     $remove_readonly = true;
    242                 }
    243 
    244                 $swagger = self::json2swagger( $jschema, $remove_readonly );
    245 
    246                 $this->set_data_prop( $method, $swagger );
    247             }
    248         }
    249 
    250         $response->set_data( $this->get_data() );
    251 
    252         return $response;
    253     }
    254 
    255     protected function get_data() {
    256         return $this->data;
    257     }
    258 
    259     protected function set_data( $data ) {
    260         $this->data = $data;
    261 
    262         return $data;
    263     }
    264 
    265     protected function set_data_prop( $key, $value ) {
    266         $this->data[ $key ] = $value;
    267 
    268         return $this->data[ $key ];
    269     }
    270 
    271     protected function get_input_data() {
    272         return $this->input_data;
    273     }
    274 
    275     protected function set_input_data( $value ) {
    276         $this->input_data = $value;
    277 
    278         return $value;
    279     }
    280 
    281290
    282291    /**
  • wp-connectr/trunk/src/PowerResource/Post/PowerResource.php

    r3364617 r3374520  
    5353
    5454            // Handle meta_compare parameter
    55             if ( ! empty( $request['meta_compare'] ) ) {
     55            if ( ! empty( $request['meta_compare'] ) && !empty( $request['meta_key'] )  ) {
    5656                $compare = strtoupper( $request['meta_compare'] );
    5757                $valid_compares = array( '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP', 'RLIKE' );
     
    103103
    104104                // Optional: compare
    105                 if ( ! empty( $clause['compare'] ) ) {
     105                if ( ! empty( $clause['compare'] ) && !empty( $clause['key'] ) ) {
    106106                    $compare = strtoupper( $clause['compare'] );
    107107                    $valid_compares = array( '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP', 'RLIKE' );
     
    113113
    114114                // Optional: type
    115                 if ( ! empty( $clause['type'] ) ) {
     115                if ( ! empty( $clause['type'] ) && !empty( $clause['key'] ) ) {
    116116                    $type = strtoupper( $clause['type'] );
    117117                    $valid_types = array( 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED' );
  • wp-connectr/trunk/src/PowerResource/User/PowerResource.php

    r3364617 r3374520  
    5050
    5151            // Handle meta_compare parameter
    52             if ( ! empty( $request['meta_compare'] ) ) {
     52            if ( ! empty( $request['meta_compare'] ) && !empty( $request['meta_key'] ) ) {
    5353                $compare = strtoupper( $request['meta_compare'] );
    5454                $valid_compares = array( '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP', 'RLIKE' );
     
    100100
    101101                // Optional: compare
    102                 if ( ! empty( $clause['compare'] ) ) {
     102                if ( ! empty( $clause['compare'] ) && !empty( $clause['key'] ) ) {
    103103                    $compare = strtoupper( $clause['compare'] );
    104104                    $valid_compares = array( '=', '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'EXISTS', 'NOT EXISTS', 'REGEXP', 'NOT REGEXP', 'RLIKE' );
     
    110110
    111111                // Optional: type
    112                 if ( ! empty( $clause['type'] ) ) {
     112                if ( ! empty( $clause['type'] ) && !empty( $clause['key'] ) ) {
    113113                    $type = strtoupper( $clause['type'] );
    114114                    $valid_types = array( 'NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED' );
  • wp-connectr/trunk/vendor/composer/installed.php

    r3364617 r3374520  
    44        'pretty_version' => 'dev-main',
    55        'version' => 'dev-main',
    6         'reference' => '77723d3724d37d6022dc6af8616a7acb81e869fa',
     6        'reference' => '015116831b089d7e65c4988e879333e596e4e972',
    77        'type' => 'wordpress-plugin',
    88        'install_path' => __DIR__ . '/../../',
     
    4444            'pretty_version' => 'dev-main',
    4545            'version' => 'dev-main',
    46             'reference' => '77723d3724d37d6022dc6af8616a7acb81e869fa',
     46            'reference' => '015116831b089d7e65c4988e879333e596e4e972',
    4747            'type' => 'wordpress-plugin',
    4848            'install_path' => __DIR__ . '/../../',
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Argument/ArgumentInterface.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Argument/ArgumentResolverInterface.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Argument/ArgumentResolverTrait.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Argument/DefaultValueArgument.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Argument/DefaultValueInterface.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Argument/Literal/ArrayArgument.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Argument/Literal/BooleanArgument.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Argument/Literal/CallableArgument.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Argument/Literal/FloatArgument.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Argument/Literal/IntegerArgument.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Argument/Literal/ObjectArgument.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Argument/Literal/StringArgument.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Argument/LiteralArgument.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Argument/LiteralArgumentInterface.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Argument/ResolvableArgument.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Argument/ResolvableArgumentInterface.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Container.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/ContainerAwareInterface.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/ContainerAwareTrait.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Definition/Definition.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Definition/DefinitionAggregate.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Definition/DefinitionAggregateInterface.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Definition/DefinitionInterface.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/DefinitionContainerInterface.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Exception/ContainerException.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Exception/NotFoundException.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Inflector/Inflector.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Inflector/InflectorAggregate.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Inflector/InflectorAggregateInterface.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/Inflector/InflectorInterface.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/ReflectionContainer.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/ServiceProvider/AbstractServiceProvider.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/ServiceProvider/BootableServiceProviderInterface.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/ServiceProvider/ServiceProviderAggregate.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/ServiceProvider/ServiceProviderAggregateInterface.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/league/container/src/ServiceProvider/ServiceProviderInterface.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/psr/container/src/ContainerExceptionInterface.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/psr/container/src/ContainerInterface.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/psr/container/src/NotFoundExceptionInterface.php

    r3364617 r3374520  
    33 * @license MIT
    44 *
    5  * Modified by reenhanced on 19-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     5 * Modified by reenhanced on 07-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    66 */
    77
  • wp-connectr/trunk/vendor_prefixed/symfony/polyfill-ctype/Ctype.php

    r3363457 r3374520  
    99 * file that was distributed with this source code.
    1010 *
    11  * Modified by reenhanced on 17-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     11 * Modified by reenhanced on 06-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    1212 */
    1313
  • wp-connectr/trunk/vendor_prefixed/symfony/polyfill-ctype/bootstrap.php

    r3363457 r3374520  
    99 * file that was distributed with this source code.
    1010 *
    11  * Modified by reenhanced on 17-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     11 * Modified by reenhanced on 06-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    1212 */
    1313
  • wp-connectr/trunk/vendor_prefixed/symfony/polyfill-ctype/bootstrap80.php

    r3363457 r3374520  
    99 * file that was distributed with this source code.
    1010 *
    11  * Modified by reenhanced on 17-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     11 * Modified by reenhanced on 06-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    1212 */
    1313
  • wp-connectr/trunk/vendor_prefixed/symfony/polyfill-mbstring/Mbstring.php

    r3363457 r3374520  
    99 * file that was distributed with this source code.
    1010 *
    11  * Modified by reenhanced on 17-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     11 * Modified by reenhanced on 06-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    1212 */
    1313
  • wp-connectr/trunk/vendor_prefixed/symfony/polyfill-mbstring/bootstrap.php

    r3363457 r3374520  
    99 * file that was distributed with this source code.
    1010 *
    11  * Modified by reenhanced on 17-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     11 * Modified by reenhanced on 06-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    1212 */
    1313
  • wp-connectr/trunk/vendor_prefixed/symfony/polyfill-mbstring/bootstrap80.php

    r3363457 r3374520  
    99 * file that was distributed with this source code.
    1010 *
    11  * Modified by reenhanced on 17-September-2025 using {@see https://github.com/BrianHenryIE/strauss}.
     11 * Modified by reenhanced on 06-October-2025 using {@see https://github.com/BrianHenryIE/strauss}.
    1212 */
    1313
  • wp-connectr/trunk/wp-connectr.php

    r3364617 r3374520  
    2727 * Plugin URI:        https://www.reenhanced.com/products/wordpress-connector/
    2828 * Description:       Deeply integrates WordPress with Microsoft Power Automate. Microsoft Certified. Easily connect your site to Microsoft SharePoint, Dynamics, Teams or over 1000 other services.
    29  * Version:           2.2.0
     29 * Version:           2.3.0
    3030 * Author:            Reenhanced LLC
    3131 * License:           GPL-2.0+
     
    3434 *
    3535 */
    36 define( 'WP_CONNECTR_VERSION', '2.2.0' );
     36define( 'WP_CONNECTR_VERSION', '2.3.0' );
    3737
    3838 /*
Note: See TracChangeset for help on using the changeset viewer.