true, 'single' => true, 'type' => 'integer', 'sanitize_callback' => 'absint', ) ); } } /** * Enqueue the block editor assets. */ public static function enqueue_editor_assets() { // Check for our supported post types. $current_screen = \get_current_screen(); $event_post_types = Setup::get_instance()->get_active_event_plugins_post_types(); if ( ! $current_screen || ! in_array( $current_screen->post_type, $event_post_types, true ) ) { return; } $asset_data = include ACTIVITYPUB_EVENT_BRIDGE_PLUGIN_DIR . 'build/reminder/plugin.asset.php'; $plugin_url = plugins_url( 'build/reminder/plugin.js', ACTIVITYPUB_EVENT_BRIDGE_PLUGIN_FILE ); wp_enqueue_script( 'activitypub-event-bridge-reminder', $plugin_url, $asset_data['dependencies'], $asset_data['version'], true ); // Pass the the default site wide time gap option to the settings block on the events edit page. wp_localize_script( 'activitypub-event-bridge-reminder', 'activityPubEventBridge', array( 'reminderTypeGap' => \get_option( 'activitypub_event_bridge_reminder_time_gap', 0 ), ) ); } /** * Schedule Activities. * * @param string $new_status New post status. * @param string $old_status Old post status. * @param WP_Post $post Post object. */ public static function maybe_schedule_event_reminder( $new_status, $old_status, $post ): void { // Re-Check that we got a valid post. $post = get_post( $post ); if ( ! $post ) { return; } // At first always unschedule the reminder for this event, it will be added again, in case. self::unschedule_event_reminder( $post->ID ); // Do not set reminders if post is password protected. if ( \post_password_required( $post ) ) { return; } // Only schedule an reminder for event post types. if ( ! Setup::get_instance()->is_post_type_event_of_active_event_plugin( $post->post_type ) ) { return; } // Do not schedule a reminder if the event is not published. if ( 'publish' !== $new_status ) { return; } // See if a reminder time gap is set for the event individually in the events post-meta. $reminder_time_gap = (int) get_post_meta( $post->ID, 'activitypub_event_bridge_reminder_time_gap', true ); // If not fallback to the global reminder time gap. if ( ! $reminder_time_gap ) { $reminder_time_gap = \get_option( 'activitypub_event_bridge_reminder_time_gap', 0 ); } // Any non positive integer means that this feature is not active for this event post. if ( 0 === $reminder_time_gap || ! is_int( $reminder_time_gap ) ) { return; } // Get start time of the event. $event_transformer = Transformer_Factory::get_transformer( $post ); if ( \is_wp_error( $event_transformer ) || ! $event_transformer instanceof Event_Transformer ) { return; } $start_time = $event_transformer->get_start_time(); $start_datetime = new DateTime( $start_time ); $start_timestamp = $start_datetime->getTimestamp(); // Get the time when the reminder of the event's start should be sent. $schedule_time = $start_timestamp - $reminder_time_gap; // If the reminder time has already passed "now" skip it. if ( $schedule_time < \time() ) { return; } // All checks passed: schedule a single event which will trigger the sending of the reminder for this event post. \wp_schedule_single_event( $schedule_time, 'activitypub_event_bridge_send_event_reminder', array( $post->ID ) ); } /** * Unschedule the event reminder. * * @param int $post_id The WordPress post ID of the event post. */ public static function unschedule_event_reminder( $post_id ): void { \wp_clear_scheduled_hook( 'activitypub_event_bridge_send_event_reminder', array( $post_id ) ); } /** * Send a reminder for an event post. * * This currently sends an Announce activity. * * @param int $post_id The WordPress post ID of the event post. */ public static function send_event_reminder( $post_id ): void { $post = \get_post( $post_id ); $transformer = Transformer_Factory::get_transformer( $post ); if ( \is_wp_error( $transformer ) || ! $transformer instanceof Event_Transformer ) { return; } $user_id = $transformer->get_wp_user_id(); if ( $user_id > 0 && is_user_disabled( $user_id ) ) { return; } $activity = $transformer->to_announce_self_activity( 'Announce' ); Activity_Dispatcher::send_activity_to_followers( $activity, $user_id, $post ); } }