/wp-content/plugins/the-events-calendar/src/Tribe/Aggregator/API/Import.php

https://github.com/livinglab/openlab · PHP · 226 lines · 151 code · 39 blank · 36 comment · 22 complexity · 17d59314aeea64c53ecab2368ac8d13c MD5 · raw file

  1. <?php
  2. // Don't load directly
  3. defined( 'WPINC' ) or die;
  4. class Tribe__Events__Aggregator__API__Import extends Tribe__Events__Aggregator__API__Abstract {
  5. public $event_field_map = [
  6. 'title' => 'post_title',
  7. 'description' => 'post_content',
  8. 'start_date' => 'EventStartDate',
  9. 'start_hour' => 'EventStartHour',
  10. 'start_minute' => 'EventStartMinute',
  11. 'start_meridian' => 'EventStartMeridian',
  12. 'end_date' => 'EventEndDate',
  13. 'end_hour' => 'EventEndHour',
  14. 'end_minute' => 'EventEndMinute',
  15. 'end_meridian' => 'EventEndMeridian',
  16. 'url' => 'EventURL',
  17. 'parent_id' => 'parent_id',
  18. 'uid' => 'uid',
  19. 'dev_start' => 'dev_start',
  20. 'dev_end' => 'dev_end',
  21. 'all_day' => 'EventAllDay',
  22. 'timezone' => 'EventTimezone',
  23. 'recurrence' => 'recurrence',
  24. 'categories' => 'categories',
  25. 'currency_symbol' => 'EventCurrencySymbol',
  26. 'currency_position' => 'EventCurrencyPosition',
  27. 'cost' => 'EventCost',
  28. ];
  29. public $organizer_field_map = [
  30. 'organizer' => 'Organizer',
  31. 'phone' => 'Phone',
  32. 'website' => 'Website',
  33. 'email' => 'Email',
  34. ];
  35. public $venue_field_map = [
  36. 'venue' => 'Venue',
  37. 'address' => 'Address',
  38. 'city' => 'City',
  39. 'stateprovince' => 'StateProvince',
  40. 'country' => 'Country',
  41. 'zip' => 'Zip',
  42. 'phone' => 'Phone',
  43. 'overwrite_coordinates' => 'OverwriteCoords',
  44. 'latitude' => 'Lat',
  45. 'longitude' => 'Lng',
  46. ];
  47. public function __construct() {
  48. parent::__construct();
  49. }
  50. /**
  51. * Gets the status (and possibly the results) of an import
  52. *
  53. * @param string $import_id Event Aggregator import id
  54. *
  55. * @return stdClass|WP_Error A class containing the service response or a WP_Error if the service could not be reached.
  56. */
  57. public function get( $import_id, $data = [] ) {
  58. $response = $this->service->get_import( $import_id, $data );
  59. if ( is_wp_error( $response ) ) {
  60. /** @var WP_Error $response */
  61. if ( 'core:aggregator:http_request-limit' === $response->get_error_code() ) {
  62. $response = (object) [
  63. 'status' => 'queued',
  64. 'message_code' => 'queued',
  65. 'message' => tribe( 'events-aggregator.service' )->get_service_message( 'queued' ),
  66. 'data' => (object) [
  67. 'import_id' => $import_id,
  68. ],
  69. ];
  70. }
  71. return $response;
  72. }
  73. // let's try to use the localized version of the message if available
  74. if ( ! empty( $response->message_code ) ) {
  75. $default = ! empty( $response->message ) ? $response->message : $this->service->get_unknown_message();
  76. $message_args = is_array( $response->data ) ? $response->data : [];
  77. $response->message = $this->service->get_service_message( $response->message_code, $message_args, $default );
  78. }
  79. if ( 'success_import-complete' !== $response->message_code ) {
  80. return $response;
  81. }
  82. $events = [];
  83. foreach ( $response->data->events as $event ) {
  84. $events[] = $this->translate_json_to_event( $event );
  85. }
  86. return $events;
  87. }
  88. /**
  89. * Creates an import
  90. *
  91. * @param array $args Array of arguments for event creation
  92. *
  93. * @return stdClass|WP_Error
  94. */
  95. public function create( $args ) {
  96. return $this->service->post_import( $args );
  97. }
  98. /**
  99. * Update the details of an existing import into EA server.
  100. *
  101. * @since 5.1.5
  102. *
  103. * @param $import_id string The ID of the import to be updated.
  104. * @param $args array An key, value array representing the values to update on the EA server.
  105. *
  106. * @return object|stdClass|string|WP_Error Response from EA server.
  107. */
  108. public function update( $import_id, $args ) {
  109. return $this->service->update_import( $import_id, $args );
  110. }
  111. /**
  112. * Translates event JSON to the-events-calendar Event array format
  113. *
  114. * @param object $json Event data in Event Aggregator format
  115. *
  116. * @return array
  117. */
  118. public function translate_json_to_event( $json ) {
  119. if (
  120. empty( $json->title )
  121. || empty( $json->start_date )
  122. || empty( $json->start_hour )
  123. || empty( $json->start_minute )
  124. || empty( $json->end_date )
  125. || empty( $json->end_hour )
  126. || empty( $json->end_minute )
  127. ) {
  128. return tribe_error( 'core:aggregator:invalid-event-json' );
  129. }
  130. $event = [];
  131. $event['post_type'] = Tribe__Events__Main::POSTTYPE;
  132. $event['post_status'] = tribe( 'events-aggregator.settings' )->default_post_status( $json->origin );
  133. // translate json key/value pairs to event array key/value pairs
  134. foreach ( get_object_vars( $json ) as $key => $value ) {
  135. // venues and organizers are a bit more complex. We'll handle those later
  136. if ( 'venue' === $key || 'organizer' === $key ) {
  137. continue;
  138. }
  139. if ( isset( $this->event_field_map[ $key ] ) ) {
  140. $key = $this->event_field_map[ $key ];
  141. }
  142. $event[ $key ] = $value;
  143. }
  144. if ( ! empty( $json->venue ) ) {
  145. $event['Venue'] = [];
  146. if ( ! is_array( $json->venue ) ) {
  147. $json->venue = [ $json->venue ];
  148. }
  149. foreach ( $json->venue as $venue ) {
  150. $venue_data = [];
  151. if ( empty( $venue->venue ) ) {
  152. continue;
  153. }
  154. foreach ( get_object_vars( $venue ) as $key => $value ) {
  155. if ( isset( $this->venue_field_map[ $key ] ) ) {
  156. $key = $this->venue_field_map[ $key ];
  157. }
  158. $venue_data[ $key ] = $value;
  159. }
  160. $event['Venue'][] = $venue_data;
  161. }
  162. }
  163. if ( ! empty( $json->organizer ) ) {
  164. $event['Organizer'] = [];
  165. if ( ! is_array( $json->organizer ) ) {
  166. $json->organizer = [ $json->organizer ];
  167. }
  168. foreach ( $json->organizer as $organizer ) {
  169. $organizer_data = [];
  170. if ( empty( $organizer->organizer ) ) {
  171. continue;
  172. }
  173. foreach ( get_object_vars( $organizer ) as $key => $value ) {
  174. if ( isset( $this->organizer_field_map[ $key ] ) ) {
  175. $key = $this->organizer_field_map[ $key ];
  176. }
  177. $organizer_data[ $key ] = $value;
  178. }
  179. $event['Organizer'][] = $organizer_data;
  180. }
  181. }
  182. $show_map_setting = tribe( 'events-aggregator.settings' )->default_map( $json->origin );
  183. $event['EventShowMap'] = $show_map_setting;
  184. $event['EventShowMapLink'] = $show_map_setting;
  185. return $event;
  186. }
  187. }