diff --git a/wp-rest/Plugin.php b/wp-rest/Plugin.php index 7cf3e9f92fb1282dffb50302d17c73733e9d1946..5f634a86a8dfc737e002e5af101db453d0fe950c 100644 --- a/wp-rest/Plugin.php +++ b/wp-rest/Plugin.php @@ -35,6 +35,8 @@ class Plugin { add_filter( 'rest_pre_dispatch', [ $this, 'bootstrap_civi' ], 10, 3 ); + add_filter( 'rest_post_dispatch', [ $this, 'maybe_reset_wp_timezone' ], 10, 3); + } /** @@ -48,7 +50,13 @@ class Plugin { */ public function bootstrap_civi( $result, $server, $request ) { - if ( false !== strpos( $request->get_route(), 'civicrm' ) ) civi_wp()->initialize(); + if ( false !== strpos( $request->get_route(), 'civicrm' ) ) { + + $this->maybe_set_user_timezone( $request ); + + civi_wp()->initialize(); + + } return $result; @@ -122,4 +130,64 @@ class Plugin { } + /** + * Sets the timezone to the users timezone when + * calling the civicrm/v3/rest endpoint. + * + * @since 0.1 + * @param WP_REST_Request $request The request + */ + private function maybe_set_user_timezone( $request ) { + + if ( $request->get_route() != '/civicrm/v3/rest' ) return; + + $timezones = [ + 'wp_timezone' => date_default_timezone_get(), + 'user_timezone' => get_option( 'timezone_string', false ) + ]; + + // filter timezones + add_filter( 'civi_wp_rest/plugin/timezones', function() use ( $timezones ) { + + return $timezones; + + } ); + + if ( empty( $timezones['user_timezone'] ) ) return; + + /** + * CRM-12523 + * CRM-18062 + * CRM-19115 + */ + date_default_timezone_set( $timezones['user_timezone'] ); + \CRM_Core_Config::singleton()->userSystem->setMySQLTimeZone(); + + } + + /** + * Resets the timezone to the original WP + * timezone after calling the civicrm/v3/rest endpoint. + * + * @since 0.1 + * @param mixed $result + * @param WP_REST_Server $server REST server instance + * @param WP_REST_Request $request The request + * @return mixed $result + */ + public function maybe_reset_wp_timezone( $result, $server, $request ) { + + if ( $request->get_route() != '/civicrm/v3/rest' ) return; + + $timezones = apply_filters( 'civi_wp_rest/plugin/timezones', null ); + + if ( empty( $timezones['wp_timezone'] ) ) return $result; + + // reset wp timezone + date_default_timezone_set( $timezones['wp_timezone'] ); + + return $result; + + } + }