File Editor
Directories:
.. (Back)
API
CLI
Processes
REST
Record
Tabs
Files:
Admin_Bar.php
Cron.php
Errors.php
Event.php
Meta_Box.php
Migrate.php
Page.php
Records.php
Service.php
Settings.php
Tabs.php
Create New File
Create
Edit File: Settings.php
<?php // Don't load directly use Tribe\Events\Admin\Settings; defined( 'WPINC' ) or die; class Tribe__Events__Aggregator__Settings { /** * @var Tribe__Events__Aggregator__Settings Event Aggregator settings bootstrap class */ protected static $instance; /** * Default update authority setting * * @var string */ public static $default_update_authority = 'overwrite'; /** * Static Singleton Factory Method * * @return Tribe__Events__Aggregator__Settings */ public static function instance() { return tribe( 'events-aggregator.settings' ); } /** * A private method to prevent it to be created twice. * It will add the methods and setup any dependecies * * Note: This should load on `plugins_loaded@P10` */ public function __construct() { add_action( 'tribe_settings_do_tabs', [ $this, 'do_import_settings_tab' ] ); add_action( 'current_screen', [ $this, 'maybe_clear_eb_credentials' ] ); add_action( 'current_screen', [ $this, 'maybe_clear_meetup_credentials' ] ); } /** * Hooked to current_screen, this method identifies whether or not eb credentials should be cleared * * @param WP_Screen $screen */ public function maybe_clear_eb_credentials( $screen ) { if ( 'tribe_events_page_tribe-common' !== $screen->base && 'tribe_events_page_tec-events-settings' !== $screen->base ) { return; } if ( ! isset( $_GET['tab'] ) || 'addons' !== $_GET['tab'] ) { return; } if ( ! ( isset( $_GET['action'] ) && isset( $_GET['_wpnonce'] ) && 'disconnect-eventbrite' === $_GET['action'] && wp_verify_nonce( $_GET['_wpnonce'], 'disconnect-eventbrite' ) ) ) { return; } $this->clear_eb_credentials(); wp_redirect( tribe( Settings::class )->get_url( [ 'tab' => 'addons' ] ) ); die; } /** * Get EB Security Key * * @since 4.6.18 * */ public function get_eb_security_key() { $args = [ 'security_key' => tribe_get_option( 'eb_security_key' ), ]; return (object) $args; } /** * Check if Security Key * * @since 4.6.18 * */ public function has_eb_security_key() { $credentials = $this->get_eb_security_key(); return ! empty( $credentials->security_key ); } /** * Handle Checking if there is a Security Key and Saving It * * @since 4.6.18 * * @param object $eb_authorized object from EA service for EB Validation * * @return bool */ public function handle_eventbrite_security_key( $eb_authorized ) { // key is sent on initial authorization and save it if we have it if ( ! empty( $eb_authorized->data->secret_key ) ) { tribe_update_option( 'eb_security_key', esc_attr( $eb_authorized->data->secret_key ) ); return true; } if ( $this->has_eb_security_key() ) { return true; } return false; } /** * Disconnect Eventbrite from EA * * @since 4.6.18 * */ public function clear_eb_credentials() { tribe( 'events-aggregator.service' )->disconnect_eventbrite_token(); tribe_update_option( 'eb_security_key', null ); } /** * Given a URL, tack on the parts of the URL that gets used to disconnect Eventbrite * * @param string $url * * @return string */ public function build_disconnect_eventbrite_url( $url ) { return wp_nonce_url( add_query_arg( 'action', 'disconnect-eventbrite', $url ), 'disconnect-eventbrite' ); } /** * Check if the Eventbrite credentials are connected in EA * * @return bool Whether the Eventbrite credentials are valid */ public function is_ea_authorized_for_eb() { // if the service hasn't enabled oauth for Eventbrite, always assume it is valid if ( ! tribe( 'events-aggregator.main' )->api( 'origins' )->is_oauth_enabled( 'eventbrite' ) ) { return true; } $eb_authorized = tribe( 'events-aggregator.service' )->has_eventbrite_authorized(); if ( empty( $eb_authorized->status ) || 'success' !== $eb_authorized->status ) { return false; } if ( ! $this->handle_eventbrite_security_key( $eb_authorized ) ) { return false; } return true; } /** * Hooked to current_screen, this method identifies whether or not eb credentials should be cleared * * @since 4.9.6 * * @param WP_Screen $screen The current screen instance. */ public function maybe_clear_meetup_credentials( $screen ) { if ( 'tribe_events_page_tribe-common' !== $screen->base && 'tribe_events_page_tec-events-settings' !== $screen->base ) { return; } if ( tribe_get_request_var( 'tab', false ) !== 'addons' ) { return; } $action = tribe_get_request_var( 'action' ) === 'disconnect-meetup'; $nonce = tribe_get_request_var( '_wpnonce' ); if ( ! ( $action && $nonce && wp_verify_nonce( $nonce, 'disconnect-meetup' ) ) ) { return; } $this->clear_meetup_credentials(); wp_redirect( tribe( Settings::class )->get_url( [ 'tab' => 'addons' ] ) ); die; } /** * Get EB Security Key * * @since 4.9.6 * */ public function get_meetup_security_key() { $args = [ 'security_key' => tribe_get_option( 'meetup_security_key' ), ]; return (object) $args; } /** * Check if Security Key * * @since 4.9.6 * * @return bool * */ public function has_meetup_security_key() { $credentials = $this->get_meetup_security_key(); return ! empty( $credentials->security_key ); } /** * Handle Checking if there is a Security Key and Saving It * * @since 4.9.6 * * @param object $eb_authorized object from EA service for Meetup Validation * * @return bool */ public function handle_meetup_security_key( $meetup_authorized ) { // key is sent on initial authorization and save it if we have it if ( ! empty( $meetup_authorized->data->secret_key ) ) { tribe_update_option( 'meetup_security_key', esc_attr( $meetup_authorized->data->secret_key ) ); // If we have a Meetup OAuth flow security key, then we can remove the old Meetup API key, if any. tribe_update_option( 'meetup_api_key', '' ); return true; } if ( $this->has_meetup_security_key() ) { return true; } return false; } /** * Disconnect Meetup from EA * * @since 4.9.6 */ public function clear_meetup_credentials() { tribe( 'events-aggregator.service' )->disconnect_meetup_token(); tribe_update_option( 'meetup_security_key', null ); delete_transient( Tribe__Events__Aggregator__Service::$auth_transient_meetup ); } /** * Given a URL, tack on the parts of the URL that gets used to disconnect Meetup * * @param string $url * * @since 4.9.6 * * @return string The URL to issue a Meeetup disconnect request to EA Service. */ public function build_disconnect_meetup_url( $url ) { return wp_nonce_url( add_query_arg( 'action', 'disconnect-meetup', $url ), 'disconnect-meetup' ); } /** * Check if the Meetup API credentials are connected in EA and correctly set. * * @since 4.9.6 * * @return bool Whether the Meetup credentials are valid or not. */ public function is_ea_authorized_for_meetup() { // If the service hasn't enabled oauth for Meetup, always assume it is valid. if ( ! tribe( 'events-aggregator.main' )->api( 'origins' )->is_oauth_enabled( 'meetup' ) ) { return true; } $request_secret_key = ! $this->has_meetup_security_key(); $meetup_authorized = tribe( 'events-aggregator.service' )->has_meetup_authorized( $request_secret_key ); if ( empty( $meetup_authorized->status ) || 'success' !== $meetup_authorized->status ) { return false; } if ( ! $this->handle_meetup_security_key( $meetup_authorized ) ) { return false; } return true; } public function do_import_settings_tab( $admin_page ) { $tec_settings_page_id = tribe( Settings::class )::$settings_page_id; if ( ! empty( $admin_page ) && $tec_settings_page_id !== $admin_page ) { return; } include_once tribe( 'tec.main' )->plugin_path . 'src/admin-views/aggregator/settings.php'; } public function get_all_default_settings() { $origins = [ 'csv', 'gcal', 'ical', 'ics', 'eventbrite', 'meetup', 'url', ]; /** * Filters the origins available for the default import settings handling. * * @since 4.6.24.1 * * @param array $origins List of origins that support import settings. */ $origins = apply_filters( 'tribe_aggregator_import_setting_origins', $origins ); $settings = array(); foreach ( $origins as $origin ) { $settings[ $origin ] = [ 'post_status' => $this->default_post_status( $origin ), 'category' => $this->default_category( $origin ), 'map' => $this->default_map( $origin ), ]; } return $settings; } /** * Returns the default update authority for imports * * Origin default settings trump global settings * * @param string $origin Origin * * @return string */ public function default_update_authority( $origin = null ) { $setting = tribe_get_option( 'tribe_aggregator_default_update_authority', self::$default_update_authority ); if ( $origin ) { $setting = tribe_get_option( "tribe_aggregator_default_{$origin}_update_authority", $setting ); } if ( -1 === (int) $setting ) { $setting = self::$default_update_authority; } return $setting; } /** * Returns the default post status for imports * * Origin default settings trump global settings * * @param string $origin Origin * * @return string */ public function default_post_status( $origin = null ) { $default = 'publish'; $setting = tribe_get_option( 'tribe_aggregator_default_post_status', $default ); if ( $origin ) { $origin_setting = tribe_get_option( "tribe_aggregator_default_{$origin}_post_status", $setting ); if ( ! empty( $origin_setting ) ) { $setting = $origin_setting; } } if ( -1 === (int) $setting ) { $setting = $default; } return $setting; } /** * Returns the default category for imports * * Origin default settings trump global settings * * @since 5.16.0 - Fix the default category is added to the origin. * * @param string $origin The name of the EA origin. * * @return integer|null The category id for null if none set. */ public function default_category( $origin = null ) { $setting = null; $default = tribe_get_option( 'tribe_aggregator_default_category', null ); if ( -1 !== (int) $default ) { $setting = $default; } if ( $origin ) { $origin_setting = tribe_get_option( "tribe_aggregator_default_{$origin}_category", $default ); if ( ! empty( $origin_setting ) && -1 !== (int) $origin_setting ) { $setting = $origin_setting; } } return $setting; } /** * Returns the default map setting for imports * * Origin default settings trump global settings * * @param string $origin Origin * * @return string */ public function default_map( $origin = null ) { $default = 'no'; $setting = tribe_get_option( 'tribe_aggregator_default_show_map', $default ); if ( $origin ) { $origin_setting = tribe_get_option( "tribe_aggregator_default_{$origin}_show_map", $setting ); if ( ! empty( $origin_setting ) ) { $setting = $origin_setting; } } if ( -1 === (int) $setting ) { $setting = $default; } return $setting; } /** * Returns the default value for an origin regarding applicable event settings. * * Event setttings are those settings related to an event presentation like Show Google Map, Hide from Listings and so on. * * @param string $origin The origin to look up the settings for. * * @return string The option value. */ public function default_settings_import( $origin ) { // by default do not import the event settings $setting = tribe_get_option( "tribe_aggregator_default_{$origin}_import_event_settings", 'no' ); return $setting; } /** * Returns the range options available for URL imports. * * Titles are meant to be used in titles and make sense alone, range strings are meant to be used when using the * duration in a sentence and do not make sense alone. * * @param bool $title Whether the values of the array should be for title or for use as range. * * @return array An associative array of durations and strings. */ public function get_url_import_range_options( $title = true ) { $options = $this->get_range_options(); /** * Filters the options available for the URL import range. * * @param array $options An array of arrays in the format * [ <range duration in seconds> => [ 'title' => <title>, 'range' => <range> ] ]. */ $options = apply_filters( 'tribe_aggregator_url_import_range_options', $options ); if ( $title ) { return array_combine( array_keys( $options ), wp_list_pluck( $options, 'title' ) ); } return array_combine( array_keys( $options ), wp_list_pluck( $options, 'range' ) ); } /** * Returns the list of limit options that should be applied to imports. * * @since 4.5.13 * * @return array An array of limit type options in the [ <limit_type> => <limit description> ] * format. */ public function get_import_limit_type_options( ) { $options = [ 'range' => __( 'By date range', 'the-events-calendar' ), 'count' => __( 'By number of events', 'the-events-calendar' ), 'no_limit' => __( 'Do not limit (not recommended)', 'the-events-calendar' ), ]; /** * Filters the options available for the default import limit options. * * @since 4.5.13 * * @param array $options An array of arrays in the format * [ <limit_type> => <limit description> ]. */ $options = apply_filters( 'tribe_aggregator_import_limit_types', $options ); return $options; } /** * Returns a list of date range options. * * @since 4.5.13 * * @return array $options An array of arrays in the format * [ <range duration in seconds> => [ 'title' => <title>, 'range' => <range> ] ]. */ protected function get_range_options() { return array( DAY_IN_SECONDS => [ 'title' => __( '24 hours', 'the-events-calendar' ), 'range' => __( '24 hours', 'the-events-calendar' ), ], 3 * DAY_IN_SECONDS => [ 'title' => __( '72 hours', 'the-events-calendar' ), 'range' => __( '72 hours', 'the-events-calendar' ), ], WEEK_IN_SECONDS => [ 'title' => __( 'One week', 'the-events-calendar' ), 'range' => __( 'one week', 'the-events-calendar' ), ], 2 * WEEK_IN_SECONDS => [ 'title' => __( 'Two weeks', 'the-events-calendar' ), 'range' => __( 'two weeks', 'the-events-calendar' ), ], 3 * WEEK_IN_SECONDS => [ 'title' => __( 'Three weeks', 'the-events-calendar' ), 'range' => __( 'three weeks', 'the-events-calendar' ), ], 30 * DAY_IN_SECONDS => [ 'title' => __( 'One month', 'the-events-calendar' ), 'range' => __( 'one month', 'the-events-calendar' ), ], 2 * 30 * DAY_IN_SECONDS => [ 'title' => __( 'Two months', 'the-events-calendar' ), 'range' => __( 'two months', 'the-events-calendar' ), ], 3 * 30 * DAY_IN_SECONDS => [ 'title' => __( 'Three months', 'the-events-calendar' ), 'range' => __( 'three months', 'the-events-calendar' ), ], ); } /** * Returns the range options available for imports. * * Titles are meant to be used in titles and make sense alone, range strings are meant to be used when using the * duration in a sentence and do not make sense alone. * * @since 4.5.13 * * @param bool $title Whether the values of the array should be for title or for use as range. * * @return array An associative array of durations and strings. */ public function get_import_range_options( $title = true ) { $options = $this->get_range_options(); /** * Filters the options available for the import date range. * * @since 4.5.13 * * @param array $options An array of arrays in the format * [ <range duration in seconds> => [ 'title' => <title>, 'range' => <range> ] ]. */ $options = apply_filters( 'tribe_aggregator_import_range_options', $options ); if ( $title ) { return array_combine( array_keys( $options ), wp_list_pluck( $options, 'title' ) ); } return array_combine( array_keys( $options ), wp_list_pluck( $options, 'range' ) ); } /** * Return a list of available options for the import numeric limit. * * @since 4.5.13 * * @return array $options An array of arrays in the format [ <number> => <number> ]. */ public function get_import_limit_count_options() { $numbers = [ 50, 100, 200, 300, 500, 750, 1000, 1500, 2000, 2500, 3000, 3500, 4000 ]; $options = array_combine( $numbers, $numbers ); /** * Filters the options available for the import numeric limit. * * @since 4.5.13 * * @param array $options An array of arrays in the format [ <number> => <number> ]. */ $options = apply_filters( 'tribe_aggregator_import_count_options', $options ); return $options; } /** * Returns the default value of the import count limit. * * @since 4.5.13 * * @return int */ public function get_import_limit_count_default() { /** * Filters the default value of the import count limit. * * @since 4.5.13 * * @param int */ return apply_filters( 'tribe_aggregator_import_count_default', 300 ); } /** * Returns the default value of the import count limit. * * @since 4.5.13 * * @return int */ public function get_import_range_default() { /** * Filters the default value of the import range limit. * * @since 4.5.13 * * @param int */ return apply_filters( 'tribe_aggregator_import_range_default', 30 * DAY_IN_SECONDS ); } /** * Gets all the possible regular-exp for external url sources * * @since 4.6.18 * * @return array */ public function get_source_origin_regexp() { $origins = [ 'eventbrite' => Tribe__Events__Aggregator__Record__Eventbrite::get_source_regexp(), 'meetup' => Tribe__Events__Aggregator__Record__Meetup::get_source_regexp(), ]; /** * Allows external plugins to filter which are the source Regular EXP * * @since 4.6.18 * * @param array $origins Which origins already exist */ return apply_filters( 'tribe_aggregator_source_origin_regexp', $origins ); } /** * Matches which other origin this source url might be * * @since 4.6.18 * * @param string $source Which source we are testing against * * @return string|bool */ public function match_source_origin( $source ) { $origins = $this->get_source_origin_regexp(); if ( ! is_string( $source ) ) { return false; } foreach ( $origins as $origin => $regexp ) { // Skip if we don't match the source to any of the URLs if ( ! preg_match( '/' . $regexp . '/', $source ) ) { continue; } return $origin; } return false; } /** * Hooked to current_screen, this method identifies whether or not fb credentials should be cleared * * @deprecated 4.6.23 * * @param WP_Screen $screen */ public function maybe_clear_fb_credentials( $screen ) { _deprecated_function( __FUNCTION__, '4.6.23', 'Importing from Facebook is no longer supported in Event Aggregator.' ); if ( 'tribe_events_page_tribe-common' !== $screen->base && 'tribe_events_page_tec-events-settings' !== $screen->base ) { return; } if ( ! isset( $_GET['tab'] ) || 'addons' !== $_GET['tab'] ) { return; } if ( ! ( isset( $_GET['action'] ) && isset( $_GET['_wpnonce'] ) && 'disconnect-facebook' === $_GET['action'] && wp_verify_nonce( $_GET['_wpnonce'], 'disconnect-facebook' ) ) ) { return; } $this->clear_fb_credentials(); wp_redirect( tribe( Settings::class )->get_url( [ 'tab' => 'addons' ] ) ); die; } /** * @deprecated 4.6.23 */ public function get_fb_credentials() { _deprecated_function( __FUNCTION__, '4.6.23', 'Importing from Facebook is no longer supported in Event Aggregator.' ); $args = [ 'token' => tribe_get_option( 'fb_token' ), 'expires' => tribe_get_option( 'fb_token_expires' ), 'scopes' => tribe_get_option( 'fb_token_scopes' ), ]; return (object) $args; } /** * @deprecated 4.6.23 */ public function has_fb_credentials() { _deprecated_function( __FUNCTION__, '4.6.23', 'Importing from Facebook is no longer supported in Event Aggregator.' ); $credentials = $this->get_fb_credentials(); return ! empty( $credentials->token ) && ! empty( $credentials->expires ) && ! empty( $credentials->scopes ); } /** * @deprecated 4.6.23 */ public function clear_fb_credentials() { _deprecated_function( __FUNCTION__, '4.6.23', 'Importing from Facebook is no longer supported in Event Aggregator.' ); tribe_update_option( 'fb_token', null ); tribe_update_option( 'fb_token_expires', null ); tribe_update_option( 'fb_token_scopes', null ); } /** * Given a URL, tack on the parts of the URL that gets used to disconnect Facebook * * @deprecated 4.6.23 * * @param string $url * * @return string */ public function build_disconnect_facebook_url( $url ) { _deprecated_function( __FUNCTION__, '4.6.23', 'Importing from Facebook is no longer supported in Event Aggregator.' ); return wp_nonce_url( add_query_arg( 'action', 'disconnect-facebook', $url ), 'disconnect-facebook' ); } /** * @deprecated 4.6.23 */ public function is_fb_credentials_valid( $time = null ) { _deprecated_function( __FUNCTION__, '4.6.23', 'Importing from Facebook is no longer supported in Event Aggregator.' ); // if the service hasn't enabled oauth for facebook, always assume it is valid if ( ! tribe( 'events-aggregator.main' )->api( 'origins' )->is_oauth_enabled( 'facebook' ) ) { return true; } if ( ! $this->has_fb_credentials() ) { return false; } $credentials = $this->get_fb_credentials(); // Allow passing comparing time if ( is_null( $time ) ) { $time = time(); } return $credentials->expires > $time; } /** * Returns a filtered map of import process slugs to classes. * * @since 4.6.23 * * @param bool $pretty Whether to return human-readable and "pretty" name for the process * or the class names. * * @return array A map of import process slugs to classes or names in the shape * [ <slug> => <class_or_name> ]. */ public function get_import_process_options( $pretty = false ) { $options = array( 'async' => array( 'class' => 'Tribe__Events__Aggregator__Record__Async_Queue', 'name' => __( 'Asynchronous', 'the-events-calendar' ), ), 'cron' => array( 'class' => 'Tribe__Events__Aggregator__Record__Queue', 'name' => __( 'Cron-based', 'the-events-calendar' ), ), ); /** * Filters the map of available import process options. * * @since 4.6.23 * * @param array $options A map of import process options to import process classes * in the shape [ <slug> => [ 'class' => <class>, 'name' => <name> ] ]. * @param bool $pretty Whether to return human-readable and "pretty" names for the options (`true`) * or the class names ('false'). */ $options = apply_filters( 'tribe_aggregator_import_process_options', $options, $pretty ); if ( $pretty ) { return array_combine( array_keys( $options ), wp_list_pluck( $options, 'name' ) ); } return array_combine( array_keys( $options ), wp_list_pluck( $options, 'class' ) ); } /** * Returns the filtered default import process slug or class. * * @since 4.6.23 * * @param bool $return_class Whether to return the import process class (`true`) or * slug (`false`). * * @return string The default import process slug or class. */ public function get_import_process_default( $return_class = true ) { $available = $this->get_import_process_options(); if ( $return_class ) { $default = reset( $available ); } else { $keys = array_keys( $available ); $default = reset( $keys ); } /** * Filters the default import process class or slug. * * @since 4.6.23 * * @param string $default The default import process class (if `$return_class` is `true`) or * slug (if `$return_class` is `false`). * @param bool $return_class Whether to return the default import process class (`true`) or * slug (`false`). * @param array $available A map, in the shape [ <slug> => <class> ], of available import processes. */ $default = apply_filters( 'tribe_aggregator_import_process_default', $default, $return_class, $available ); return $default; } /** * Returns the currently selected, or a specific, import process class. * * @since 4.6.23 * * @param null|string $slug The slug of the import process class to return; if not specified * then the default import process class will be returned. If the * slug is not available then the default class will be returned. * * @return string The import process class for the specified slug or the default class if the * slug was not specified or is not available. */ public function get_import_process_class( $slug = null ) { $default_slug = $this->get_import_process_default( false ); $default_class = $this->get_import_process_default(); $available = $this->get_import_process_options(); if ( null === $slug ) { $slug = tribe_get_option( 'tribe_aggregator_import_process_system', $default_slug ); } $class = Tribe__Utils__Array::get( $available, $slug, $default_class ); /** * Filters the import process class that will be returned for an import process slug. * * @since 4.6.23 * * @param string $class The import process slug for the slug or the default class if the * slug was not specified or the specified slug is not available. * @param string|null $slug The specified slug or `null` if not specified. * @param array $available A map of available process classes in the shape * [ <slug> => <class> ]. */ $class = apply_filters( 'tribe_aggregator_import_process', $class, $slug, $available ); return $class; } }
Save Changes
Rename File
Rename