Event_Meta
Class Event_Meta
Source
File: src/Tribe/Meetings/YouTube/Event_Meta.php
class Event_Meta {
/**
* The array of YouTube fields.
*
* @since 1.6.0
*
* @var array<string>
*/
public static $fields = [
'channel_id',
'autoplay',
'live_chat',
'mute_video',
'modest_branding',
'related_videos',
'hide_controls',
];
/**
* The prefix, in the context of tribe_get_events, of each setting of YouTube.
*
* @since 1.6.0
*
* @var string
*/
public static $prefix = 'youtube_';
/**
* Get the prefix for the settings.
*
* @since 1.6.0
*
* @param string $key The meta key to add the prefix to.
*
* @return string The meta key with prefix added.
*/
protected static function get_prefix( $key ) {
return static::$prefix . $key;
}
/**
* Returns an event post meta related to YouTube.
*
* @since 1.6.0
*
* @param int|\WP_Post $post The event post ID or object.
*
* @return array The YouTube post meta or an empty array if not found or not an event.
*/
public static function get_post_meta( $post ) {
$event = tribe_get_event( $post );
if ( ! $event instanceof \WP_Post ) {
return [];
}
$all_meta = get_post_meta( $event->ID );
$prefix = Virtual_Event_Meta::$prefix . 'youtube_';
$flattened_array = Arr::flatten(
array_filter(
$all_meta,
static function ( $meta_key ) use ( $prefix ) {
return 0 === strpos( $meta_key, $prefix );
},
ARRAY_FILTER_USE_KEY
)
);
return $flattened_array;
}
/**
* Add information about the YouTube live stream if available via the REST Api.
*
* @since 1.6.0
*
* @param array<string,mixed> $data The current data of the event.
* @param \WP_Post $event The event being updated.
*
* @return array<string,mixed> An array with the data of the event on the endpoint.
*/
public function attach_rest_properties( array $data, \WP_Post $event ) {
$event = tribe_get_event( $event );
if ( ! $event instanceof \WP_Post || ! current_user_can( 'read_private_posts' ) ) {
return $data;
}
// Return when YouTube is not the source.
if ( 'youtube' !== $event->virtual_video_source ) {
return $data;
}
if ( empty( $data['meetings'] ) ) {
$data['meetings'] = [];
}
$data['meetings']['youtube'] = [
'channel_id' => $event->youtube_channel_id,
'is_live' => $event->virtual_meeting_is_live,
'auto_play' => $event->youtube_autoplay,
'live_chat' => $event->youtube_live_chat,
'mute_video' => $event->youtube_mute_video,
'modest_branding' => $event->youtube_modest_branding,
'related_videos' => $event->youtube_related_videos,
'hide_controls' => $event->youtube_hide_controls,
];
return $data;
}
/**
* Adds YouTube related properties to an event post object.
*
* @since 1.6.0
*
* @param \WP_Post $event The event post object, as decorated by the `tribe_get_event` function.
*
* @return \WP_Post The decorated event post object, with YouTube related properties added to it.
*/
public static function add_event_properties( \WP_Post $event ) {
// Return when YouTube is not the source.
if ( 'youtube' !== $event->virtual_video_source ) {
return $event;
}
// Get the saved values since the source is YouTube.
foreach ( self::$fields as $field_name ) {
$prefix_name = self::get_prefix( $field_name );
$value = self::get_meta_field( $prefix_name, $event );
$event->{$prefix_name} = $value;
}
// Enforce this is a virtual event.
$event->virtual = true;
$event->virtual_meeting = true;
$event->virtual_meeting_provider = tribe( YouTube_Provider::class )->get_slug();
// Set virtual url to null if YouTube is connected to the event.
$event->virtual_url = null;
return $event;
}
/**
* Get the saved or default values.
*
* @since 1.6.0
*
* @param \WP_Post $event The event post object, as decorated by the `tribe_get_event` function.
*
* @return array<string|mixed> The array of values for switch fields.
*/
public static function get_current_fields( \WP_Post $event ) {
/** @var \Tribe\Events\Virtual\Meetings\YouTube\Settings */
$settings = tribe( Settings::class );
$setting_defaults = $settings->get_fields( true );
$fields = [];
$use_defaults = false;
// Use defaults when YouTube is not the source.
if ( 'youtube' !== $event->virtual_video_source ) {
$use_defaults = true;
}
foreach ( $setting_defaults as $setting_id => $field ) {
// Remove the settings prefix to get matching fields.
$meta_id = str_replace( 'tribe_', '', $setting_id );
$name = "tribe-events-virtual[{$meta_id}]";
// Setup the field.
$fields[ $name ] = [
'label' => $field['label'],
'tooltip' => $field['tooltip'],
'value' => $use_defaults ? $field['value'] : self::get_meta_field( $meta_id, $event ),
];
}
/**
* Filters the YouTube fields values for an event.
*
* @since 1.6.0
*
* @param array<string,array> A map of the YouTube Live fields that will be used for an event.
* @param bool $use_defaults Whether the default values are being used.
*/
return apply_filters( 'tribe_events_virtual_meetings_youtube_settings_event_fields', $fields, $use_defaults );
}
/**
* Get the meta fields value.
*
* @since 1.6.0
*
* @param string $key The option key to add the prefix to.
* @param \WP_Post $event The event post object, as decorated by the `tribe_get_event` function.
*
* @return mixed
*/
protected static function get_meta_field( $key, \WP_Post $event ) {
return get_post_meta( $event->ID, Virtual_Event_Meta::$prefix . $key, true );
}
/**
* Saves the meta fields for YouTube.
*
* @since 1.6.0
*
* @param int $post_id The post ID of the post the date is being saved for.
* @param array<string,mixed> $data The data to save, directly from the metabox.
*/
public function save_metabox_data( $post_id, array $data ) {
$event = tribe_get_event( $post_id );
if ( 'youtube' !== $event->virtual_video_source ) {
return;
}
$prefix = Virtual_Event_Meta::$prefix;
$channel_id = get_post_meta( $post_id, $prefix . 'youtube_channel_id', true );
// An event that has a YouTube Channel ID Meeting link should always be considered virtual, let's ensure that.
if ( ! empty( $channel_id ) ) {
update_post_meta( $post_id, Virtual_Event_Meta::$key_virtual, true );
}
// Update meta fields.
foreach ( self::$fields as $field_name ) {
$name = self::get_prefix( $field_name );
$value = Arr::get( $data, $name, false );
$meta_key = $prefix . $name;
if ( ! empty( $value ) ) {
update_post_meta( $post_id, $meta_key, $value );
} else {
delete_post_meta( $post_id, $meta_key );
}
}
}
/**
* Removes the YouTube meta from a post.
*
* @since 1.6.0
*
* @param int|\WP_Post $post The event post ID or object.
*/
public static function delete_meta( $post ) {
$event = tribe_get_event( $post );
if ( ! $event instanceof \WP_Post ) {
return false;
}
$youtube_meta = static::get_post_meta( $event );
foreach ( array_keys( $youtube_meta ) as $meta_key ) {
delete_post_meta( $event->ID, $meta_key );
}
return true;
}
/**
* Adds dynamic, time-related, properties to the event object.
*
* This method deals with properties we set, for convenience, on the event object that should not
* be cached as they are time-dependent; i.e. the time the properties are computed at matters and
* caching their values would be incorrect.
*
* @since 1.6.0
*
* @param WP_Post $event The event post object, as read from the cache, if any.
*
* @return WP_Post The decorated event post object; its dynamic and time-dependent properties correctly set up.
*/
public function add_dynamic_properties( WP_Post $event ) {
// Return the event post object in the admin as these properties are for the front end only.
if ( is_admin() ) {
return $event;
}
if ( 'youtube' !== $event->virtual_video_source ) {
return $event;
}
// Hide on a past event.
if ( tribe_is_past_event( $event ) ) {
return $event;
}
if ( ! $event->virtual_should_show_embed ) {
return $event;
}
// Setup YouTube Live Stream.
/** @var \Tribe\Events\Virtual\Meetings\YouTube\Connection $connection */
$connection = tribe( Connection::class );
$event->virtual_meeting_url = $connection->get_url_with_id( $event->youtube_channel_id );
$event->virtual_meeting_is_live = $connection->get_live_stream( $event->youtube_channel_id );
// If offline there is no linked button to add.
if ( Connection::$offline_key === $event->virtual_meeting_is_live ) {
return $event;
}
// Override the virtual url if linked button is checked.
if ( ! empty( $event->virtual_linked_button ) ) {
$event->virtual_url = $event->virtual_meeting_url;
}
return $event;
}
/**
* Filter the ticket email url.
*
* @since 1.7.2
*
* @param string $virtual_url The virtual url for the ticket and rsvp emails.
* @param WP_Post $event The event post object with properties added by the `tribe_get_event` function.
*
* @return string The YouTube virtual url for the ticket and rsvp emails.
*/
public function filter_ticket_email_url( $virtual_url, WP_Post $event ) {
if ( 'youtube' !== $event->virtual_video_source ) {
return $virtual_url;
}
// Get Live Stream URL
/** @var \Tribe\Events\Virtual\Meetings\YouTube\Connection $connection */
$connection = tribe( Connection::class );
return $connection->get_url_with_id( $event->youtube_channel_id );
}
}
Changelog
| Version | Description |
|---|---|
| 1.6.0 | Introduced. |
Methods
- add_dynamic_properties — Adds dynamic, time-related, properties to the event object.
- add_event_automator_properties — Adds related properties to an Event Automator event details map.
- add_event_properties — Adds YouTube related properties to an event post object.
- attach_rest_properties — Add information about the YouTube live stream if available via the REST Api.
- delete_meta — Removes the YouTube meta from a post.
- filter_ticket_email_url — Filter the ticket email url.
- get_current_fields — Get the saved or default values.
- get_post_meta — Returns an event post meta related to YouTube.
- save_metabox_data — Saves the meta fields for YouTube.