Changeset 13683 for sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/wporg-gp-translation-events.php
- Timestamp:
- 05/09/2024 08:33:51 AM (19 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sites/trunk/wordpress.org/public_html/wp-content/plugins/wporg-gp-translation-events/wporg-gp-translation-events.php
r13541 r13683 23 23 use Exception; 24 24 use GP; 25 use GP_Locales; 25 26 use WP_Post; 26 27 use WP_Query; 27 28 use Wporg\TranslationEvents\Attendee\Attendee; 28 29 use Wporg\TranslationEvents\Attendee\Attendee_Repository; 30 use Wporg\TranslationEvents\Event\Event_Capabilities; 29 31 use Wporg\TranslationEvents\Event\Event_Form_Handler; 30 32 use Wporg\TranslationEvents\Event\Event_Repository_Cached; 31 33 use Wporg\TranslationEvents\Event\Event_Repository_Interface; 34 use Wporg\TranslationEvents\Notifications\Notifications_Send; 35 use Wporg\TranslationEvents\Stats\Stats_Calculator; 32 36 use Wporg\TranslationEvents\Stats\Stats_Listener; 33 37 34 38 class Translation_Events { 35 39 public const CPT = 'translation_event'; 40 41 private Event_Capabilities $event_capabilities; 36 42 37 43 public static function get_instance(): Translation_Events { … … 65 71 add_action( 'wp_enqueue_scripts', array( $this, 'register_translation_event_js' ) ); 66 72 add_action( 'init', array( $this, 'register_event_post_type' ) ); 73 add_action( 'init', array( $this, 'send_notifications' ) ); 67 74 add_action( 'add_meta_boxes', array( $this, 'event_meta_boxes' ) ); 68 75 add_action( 'save_post', array( $this, 'save_event_meta_boxes' ) ); … … 72 79 add_action( 'gp_init', array( $this, 'gp_init' ) ); 73 80 add_action( 'gp_before_translation_table', array( $this, 'add_active_events_current_user' ) ); 81 add_filter( 'wp_post_revision_meta_keys', array( $this, 'wp_post_revision_meta_keys' ) ); 82 add_filter( 'pre_wp_unique_post_slug', array( $this, 'pre_wp_unique_post_slug' ), 10, 6 ); 74 83 75 84 if ( is_admin() ) { 76 85 Upgrade::upgrade_if_needed(); 77 86 } 87 88 $this->event_capabilities = new Event_Capabilities( 89 self::get_event_repository(), 90 self::get_attendee_repository(), 91 new Stats_Calculator() 92 ); 93 $this->event_capabilities->register_hooks(); 78 94 } 79 95 80 96 public function gp_init() { 97 $locale = '(' . implode( '|', wp_list_pluck( GP_Locales::locales(), 'slug' ) ) . ')'; 98 $slug = '((?:2[0-9]{3}/)?[a-z0-9_-]+)'; 99 $status = '(waiting)'; 100 $id = '(\d+)'; 101 81 102 GP::$router->add( '/events?', array( 'Wporg\TranslationEvents\Routes\Event\List_Route', 'handle' ) ); 103 GP::$router->add( '/events/trashed?', array( 'Wporg\TranslationEvents\Routes\Event\List_Trashed_Route', 'handle' ) ); 82 104 GP::$router->add( '/events/new', array( 'Wporg\TranslationEvents\Routes\Event\Create_Route', 'handle' ) ); 83 GP::$router->add( '/events/edit/(\d+)', array( 'Wporg\TranslationEvents\Routes\Event\Edit_Route', 'handle' ) ); 84 GP::$router->add( '/events/attend/(\d+)', array( 'Wporg\TranslationEvents\Routes\User\Attend_Event_Route', 'handle' ), 'post' ); 85 GP::$router->add( '/events/host/(\d+)/(\d+)', array( 'Wporg\TranslationEvents\Routes\User\Host_Event_Route', 'handle' ), 'post' ); 105 GP::$router->add( "/events/edit/$id", array( 'Wporg\TranslationEvents\Routes\Event\Edit_Route', 'handle' ) ); 106 GP::$router->add( "/events/trash/$id", array( 'Wporg\TranslationEvents\Routes\Event\Trash_Route', 'handle' ) ); 107 GP::$router->add( "/events/delete/$id", array( 'Wporg\TranslationEvents\Routes\Event\Delete_Route', 'handle' ) ); 108 GP::$router->add( "/events/attend/$id", array( 'Wporg\TranslationEvents\Routes\User\Attend_Event_Route', 'handle' ), 'post' ); 109 GP::$router->add( "/events/host/$id/$id", array( 'Wporg\TranslationEvents\Routes\User\Host_Event_Route', 'handle' ), 'post' ); 86 110 GP::$router->add( '/events/my-events', array( 'Wporg\TranslationEvents\Routes\User\My_Events_Route', 'handle' ) ); 87 GP::$router->add( '/events/([a-z0-9_-]+)', array( 'Wporg\TranslationEvents\Routes\Event\Details_Route', 'handle' ) ); 111 GP::$router->add( "/events/$slug/translations/$locale/$status", array( 'Wporg\TranslationEvents\Routes\Event\Translations_Route', 'handle' ) ); 112 GP::$router->add( "/events/$slug/translations/$locale", array( 'Wporg\TranslationEvents\Routes\Event\Translations_Route', 'handle' ) ); 113 GP::$router->add( "/events/$slug", array( 'Wporg\TranslationEvents\Routes\Event\Details_Route', 'handle' ) ); 114 GP::$router->add( "/events/$slug/attendees", array( 'Wporg\TranslationEvents\Routes\Attendee\List_Route', 'handle' ) ); 88 115 89 116 $stats_listener = new Stats_Listener( … … 113 140 114 141 $args = array( 115 'labels' => $labels, 116 'public' => true, 117 'has_archive' => true, 118 'menu_icon' => 'dashicons-calendar', 119 'supports' => array( 'title', 'editor', 'thumbnail', 'revisions' ), 120 'rewrite' => array( 'slug' => 'events' ), 121 'show_ui' => false, 142 'labels' => $labels, 143 'public' => true, 144 'has_archive' => true, 145 'hierarchical' => true, 146 'menu_icon' => 'dashicons-calendar', 147 'supports' => array( 'title', 'editor', 'thumbnail', 'revisions' ), 148 'rewrite' => array( 'slug' => 'events' ), 149 'show_ui' => false, 122 150 ); 123 151 … … 163 191 } 164 192 } 165 166 193 $fields = array( 'event_start', 'event_end' ); 167 194 foreach ( $fields as $field ) { … … 219 246 220 247 if ( null === $attendee ) { 221 $attendee = new Attendee( $event_id, $user_id ); 222 $attendee->mark_as_host(); 248 $attendee = new Attendee( $event_id, $user_id, true ); 223 249 $attendee_repository->insert_attendee( $attendee ); 224 250 } … … 237 263 return $items; 238 264 } 239 $new[ esc_url( gp_url( '/events/') ) ] = esc_html__( 'Events', 'gp-translation-events' );265 $new[ esc_url( Urls::events_home() ) ] = esc_html__( 'Events', 'gp-translation-events' ); 240 266 return array_merge( $items, $new ); 241 267 } … … 254 280 public function generate_event_slug( array $data, array $postarr ): array { 255 281 if ( self::CPT === $data['post_type'] ) { 282 if ( isset( $data['post_name'] ) && preg_match( '/^2[0-9]+$/', $data['post_name'] ) ) { 283 return $data; 284 } 256 285 if ( 'draft' === $data['post_status'] ) { 257 286 $data['post_name'] = sanitize_title( $data['post_title'] ); … … 278 307 */ 279 308 public function add_active_events_current_user(): void { 280 $attendee_repository = new Attendee_Repository(); 281 $user_attending_event_ids = $attendee_repository->get_events_for_user( get_current_user_id() ); 282 if ( empty( $user_attending_event_ids ) ) { 283 return; 284 } 285 286 $current_datetime_utc = ( new DateTime( 'now', new DateTimeZone( 'UTC' ) ) )->format( 'Y-m-d H:i:s' ); 287 $user_attending_events_args = array( 288 'post_type' => self::CPT, 289 'post__in' => $user_attending_event_ids, 290 'post_status' => 'publish', 291 // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query 292 'meta_query' => array( 293 array( 294 'key' => '_event_start', 295 'value' => $current_datetime_utc, 296 'compare' => '<=', 297 'type' => 'DATETIME', 298 ), 299 array( 300 'key' => '_event_end', 301 'value' => $current_datetime_utc, 302 'compare' => '>=', 303 'type' => 'DATETIME', 304 ), 305 ), 306 // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key 307 'meta_key' => '_event_start', 308 'orderby' => 'meta_value', 309 'order' => 'ASC', 310 ); 311 312 $user_attending_events_query = new WP_Query( $user_attending_events_args ); 313 $number_of_events = $user_attending_events_query->post_count; 309 $event_repository = self::get_event_repository(); 310 $user_attending_events_query = $event_repository->get_current_events_for_user( get_current_user_id() ); 311 $events = $user_attending_events_query->events; 312 313 $number_of_events = count( $events ); 314 314 if ( 0 === $number_of_events ) { 315 315 return; … … 320 320 $content .= sprintf( _n( 'Contributing to %d event:', 'Contributing to %d events:', $number_of_events, 'gp-translation-events' ), $number_of_events ); 321 321 $content .= ' '; 322 323 foreach ( array_splice( $events, 0, 2 ) as $event ) { 324 $content .= '<span class="active-events-before-translation-table"><a href="' . Urls::event_details( $event->id() ) . '" target="_blank">' . esc_html( $event->title() ) . '</a></span>'; 325 } 326 322 327 if ( $number_of_events > 3 ) { 323 $counter = 0;324 while ( $user_attending_events_query->have_posts() && $counter < 2 ) {325 $user_attending_events_query->the_post();326 $url = esc_url( gp_url( '/events/' . get_post_field( 'post_name', get_post() ) ) );327 $content .= '<span class="active-events-before-translation-table"><a href="' . $url . '" target="_blank">' . get_the_title() . '</a></span>';328 ++$counter;329 }330 331 328 $remaining_events = $number_of_events - 2; 332 $url = esc_url( gp_url( '/events/' ) );333 329 /* translators: %d: Number of remaining events */ 334 $content .= '<span class="remaining-events"><a href="' . $url . '" target="_blank">' . sprintf( esc_html__( ' and %d more events.', 'gp-translation-events' ), $remaining_events ) . '</a></span>'; 335 336 } else { 337 while ( $user_attending_events_query->have_posts() ) { 338 $user_attending_events_query->the_post(); 339 $url = esc_url( gp_url( '/events/' . get_post_field( 'post_name', get_post() ) ) ); 340 $content .= '<span class="active-events-before-translation-table"><a href="' . $url . '" target="_blank">' . get_the_title() . '</a></span>'; 341 } 342 } 330 $content .= '<span class="remaining-events"><a href="' . esc_url( Urls::events_home() ) . '" target="_blank">' . sprintf( esc_html__( ' and %d more events.', 'gp-translation-events' ), $remaining_events ) . '</a></span>'; 331 } 332 343 333 $content .= '</div>'; 344 334 … … 360 350 ); 361 351 } 352 353 /** 354 * Send notifications for the events. 355 */ 356 public function send_notifications() { 357 new Notifications_Send( self::get_event_repository(), self::get_attendee_repository() ); 358 } 359 360 /** 361 * Add the event meta keys to the list of meta keys to keep in post revisions. 362 * 363 * @param array $keys The list of meta keys to keep in post revisions. 364 * 365 * @return array The modified list of meta keys to keep in post revisions. 366 */ 367 public function wp_post_revision_meta_keys( array $keys ): array { 368 $meta_keys_to_keep = array( '_event_start', '_event_end', '_event_timezone', '_hosts' ); 369 return array_merge( $keys, $meta_keys_to_keep ); 370 } 371 372 public function pre_wp_unique_post_slug( $override_slug, string $slug, int $post_id, string $post_status, string $post_type, int $post_parent ) { 373 if ( self::CPT !== $post_type || $post_parent ) { 374 return $override_slug; 375 } 376 // Normally the slug is not allowed to be a year, this overrides it since we have a CPT and translate.wordpress.org doesn't have blog posts. 377 if ( preg_match( '/^2[0-9]{3}$/', $slug ) ) { 378 return $slug; 379 } 380 return $override_slug; 381 } 362 382 } 363 383 Translation_Events::get_instance();
Note: See TracChangeset
for help on using the changeset viewer.