handle_buy_pro_module();
add_filter( 'eventin_settings', [$this, 'add_settings'] );
add_filter( 'get_edit_post_link', [ $this, 'modifiy_event_edit_link' ], 10, 2 );
add_action( 'in_plugin_update_message-' . Wpeventin::plugins_basename(), function( $plugin_data ) {
$this->version_update_warning( Wpeventin::version(), $plugin_data['new_version'] );
} );
add_action( 'admin_init', [ $this, 'do_upgrade' ] );
add_action( 'admin_init', [$this, 'etn_speaker_group_insert_to_user'] );
add_filter( 'eventin_settings', [ $this, 'update_extra_field_settings' ] );
add_action( 'eventin_event_updated', [ $this, 'update_seat_price' ] );
add_action( 'eventin_event_after_clone', [ $this, 'update_clone_event_sold_tickets' ] );
add_action( 'init', [$this, 'register_post_type' ] );
add_action( 'init', [ $this, 'proxy_image' ] );
add_action( 'after_setup_theme', [ $this, 'etn_activation_redirect' ], 99 );
new \Etn\Core\Event\Api();
// Todo: Temporary added this function for version compatibility. Need to remove this after 4.0.21
add_action( 'admin_notices', [ $this, 'eventin_pro_admin_notice' ] );
$this->add_eventin_pro_plugin_upgrade_notice();
new AttendeeHooks();
}
/**
* Get post ids
*
* @param string $post_type
*
* @return array
*/
private function get_post_ids( $post_type ) {
$args = [
'post_type' => $post_type,
'numberposts' => -1,
'post_status' => 'publish',
'fields' => 'ids',
];
$posts = get_posts( $args );
return $posts;
}
/**
* Added settings
*
* @param array $settings
*
* @return array
*/
public function add_settings( $settings ) {
$payment_method = etn_get_option( 'payment_method' );
$sells_engine = etn_get_option( 'etn_sells_engine_stripe' ) ?: '';
$payment_method = $payment_method ? $payment_method : $sells_engine;
$new_settings = [
'wc_enabled' => function_exists( 'WC' ),
'payment_method' => $payment_method,
'plugin_version' => Wpeventin::version(),
'modules' => get_option( 'etn_addons_options' ),
'zoom_authorize_url' => ZoomCredential::get_auth_url(),
'event_url_editable' => etn_event_url_editable(),
'email' => etn_get_email_settings(),
'etn_settings_country_currency' => etn_currency(),
'decimal_separator' => etn_get_decimal_separator(),
'thousand_separator' => etn_get_thousand_separator(),
'decimals' => etn_get_decimals(),
'price_format' => etn_get_price_format(),
'currency_position' => etn_get_currency_position(),
'wc_order_status_list' => etn_get_wc_order_status_list(),
'wc_order_statuses' => etn_get_wc_order_statuses(),
'show_ticket_expiry_date' => etn_get_option( 'show_ticket_expiry_date', false ),
"add_to_cart_redirect" => etn_get_option( 'add_to_cart_redirect','checkout' ),
"order_thank_you_redirect" => etn_get_option( 'order_thank_you_redirect','eventin_thankyou' ),
];
return array_merge( $settings, $new_settings );
}
/**
* Modify event edit link
*
* @param string $link
* @param integer $post_id
*
* @return string
*/
public function modifiy_event_edit_link( $link, $post_id ) {
$post_type = get_post_type( $post_id );
if ( 'etn' !== $post_type ) {
return $link;
}
$url = admin_url( "admin.php?page=eventin#/events/create/{$post_id}/basic" );
return $url;
}
/**
* Plugin upgrade warning notification
*
* @param string $current_version Plugin current version
* @param string $new_version Plugin new version
*
* @return void
*/
public function version_update_warning( $current_version, $new_version ) {
if ( version_compare( $current_version, $new_version, '>=', ) ) {
return;
}
?>
'etn',
'post_status' => 'publish',
'posts_per_page' => -1,
];
$events = [];
$post_query = new \WP_Query();
$query_result = $post_query->query( $args );
foreach ( $query_result as $post ) {
$event = new Event_Model( $post->ID );
$this->migrate_event_speaker_organizer( $event );
}
}
/**
* Migrate event speaker and organizer
*
* @param Event_Model $event [$event description]
*
* @return void
*/
protected function migrate_event_speaker_organizer( $event ) {
$organizer = get_post_meta( $event->id, 'etn_event_organizer', true );
$speaker = get_post_meta( $event->id, 'etn_event_speaker', true );
$speaker_category = get_term_by( 'slug', 'speaker', 'etn_speaker_category' );
$organizer_category = get_term_by( 'slug', 'organizer', 'etn_speaker_category' );
if ( $speaker_category ) {
$speaker_category = $speaker_category->term_id;
}
if ( $organizer_category ) {
$organizer_category = $organizer_category->term_id;
}
if ( $organizer ) {
$event->update( [
'etn_event_organizer' => $this->prepare_organizer(),
'organizer_type' => 'group',
'organizer_group' => [$organizer_category],
] );
}
if ( $speaker ) {
$event->update( [
'etn_event_speaker' => $this->prepare_speaker(),
'speaker_type' => 'group',
'speaker_group' => [$speaker_category],
] );
}
}
/**
* Get organizer by term slug
*
* @return array
*/
protected function prepare_organizer() {
$args = array(
'numberposts' => -1,
'post_type' => 'etn-speaker',
'post_status' => 'any',
'fields' => 'ids',
'tax_query' => array(
'relation' => 'AND',
[
'taxonomy' => 'etn_speaker_category',
'field' => 'slug',
'terms' => 'organizer'
]
)
);
$organizers = get_posts( $args );
return $organizers;
}
/**
* Get speaker by term slug
*
* @return array
*/
protected function prepare_speaker() {
$args = array(
'numberposts' => -1,
'post_type' => 'etn-speaker',
'post_status' => 'any',
'fields' => 'ids',
'tax_query' => array(
'relation' => 'AND',
[
'taxonomy' => 'etn_speaker_category',
'field' => 'slug',
'terms' => 'speaker'
]
)
);
$speakers = get_posts( $args );
return $speakers;
}
/**
* Upgrade the plugin migration
*
* @return void
*/
public function do_upgrade() {
$db_migration = get_option( 'etn_db_migration' );
$current_version = Wpeventin::version();
if ( ! $db_migration || version_compare( $current_version, $db_migration, '>' ) ) {
Upgrade::register();
update_option( 'etn_db_migration', $current_version, true );
}
}
/**
* Include speaker group to user
*
* @since 4.0.7
* return void
*/
public function etn_speaker_group_insert_to_user() {
// Check if the 'Uncategorized' term exists in the 'etn_speaker_category' taxonomy
$term = term_exists('Uncategorized', 'etn_speaker_category');
// If the term doesn't exist, create it
if ( ! $term ) {
$term = wp_insert_term( 'Uncategorized', 'etn_speaker_category' );
}
// Get the term_id
$term_id = is_array( $term ) ? $term['term_id'] : '';
$args = array(
'role__in' => array('etn-speaker', 'etn-organizer'),
'meta_key' => 'etn_speaker_group',
'meta_compare' => 'NOT EXISTS'
);
$users = get_users( $args );
if ( $users ) {
foreach ( $users as $user ) {
update_user_meta($user->ID, 'etn_speaker_group', $term_id, true);
}
// Determine the 'etn_speaker_category' value based on the user's role
if ( in_array('etn-speaker', $user->roles ) ) {
$category_value = ['speaker'];
} elseif ( in_array('etn-organizer', $user->roles) ) {
$category_value = ['organizer'];
}
// Update or add the 'etn_speaker_category' user meta
update_user_meta($user->ID, 'etn_speaker_category', $category_value, true);
}
}
/**
* Update settins extra fields
*
* @param array $settings
*
* @return array
*/
public function update_extra_field_settings( $settings ) {
$extra_fields = $extra_fields = etn_get_option( 'extra_fields', [] ) ?: etn_get_option( 'attendee_extra_fields', [] );
$settings['extra_fields'] = $extra_fields;
unset($settings['attendee_extra_fields']);
return $settings;
}
/**
* Update seat price when update event tickets
*
* @param Event_Model $event [$event description]
*
* @return void
*/
public function update_seat_price( $event ) {
$event_id = $event->id;
$tickets = $event->etn_ticket_variations;
$seats = $event->seat_plan;
if ( ! $seats ) {
return;
}
foreach ( $seats as $seat_key => $seat ) {
$ticket_price = $event->get_ticket_price_by_name( $seat['ticketType'] );
if ( 'table' === $seat['type'] ) {
$chairs = [];
foreach( $seat['chairs'] as $chair_key => $chair ) {
$chair['price'] = $ticket_price;
$chairs[] = $chair;
}
$seats[$seat_key]['chairs'] = $chairs;
} else {
$seats[$seat_key]['price'] = $ticket_price;
}
}
$event->update( [
'seat_plan' => $seats
] );
}
/**
* Update sold tickets on event clone
*
* @param Event_Model $event [$event description]
*
* @return void
*/
public function update_clone_event_sold_tickets( $event ) {
$tickets = $event->etn_ticket_variations;
if ( is_array( $tickets ) ) {
foreach( $tickets as &$ticket ) {
$ticket['etn_sold_tickets'] = 0;
}
}
$event->update([
'etn_ticket_variations' => $tickets
]);
}
/**
* Register post type
*
* @return void
*/
public function register_post_type() {
$template_post_type = new CPT();
$template_post_type->register_post_type();
}
/**
* Preapre proxi image for template builder
*
* @return string
*/
public function proxy_image() {
$action = isset( $_GET['action'] ) ? $_GET['action'] : '';
if ( $action !== 'proxy_image' ) {
return;
}
ob_start();
if ( $_SERVER['REQUEST_METHOD'] === 'OPTIONS' ) {
http_response_code(200);
ob_end_flush();
exit;
}
$imageUrl = isset( $_GET['url'] ) ? $_GET['url'] : null;
// is from allowed origins
if ( ! $this->is_origin_allowed( $imageUrl ) ) {
http_response_code(404);
ob_end_flush();
exit;
}
if ( $imageUrl ) {
$allowed_extensions = ['jpg', 'jpeg', 'png', 'gif', 'webp'];
$file_ext = strtolower( pathinfo( $imageUrl, PATHINFO_EXTENSION ) );
if ( ! in_array( $file_ext, $allowed_extensions, true ) ) {
return http_response_code(404);
}
if ( $this->is_same_origin($imageUrl) ) {
return http_response_code(404);
}
$imageContent = file_get_contents($imageUrl);
if ( false !== $imageContent && getimagesize($imageUrl) ) {
$finfo = finfo_open( FILEINFO_MIME_TYPE );
$mimeType = finfo_buffer( $finfo, $imageContent );
finfo_close( $finfo );
header("Content-Type: $mimeType");
$tempStream = fopen('php://temp', 'r+');
fwrite( $tempStream, $imageContent );
rewind( $tempStream );
fpassthru( $tempStream );
fclose( $tempStream );
} else {
http_response_code(404);
}
} else {
http_response_code(400);
}
ob_end_flush(); // End output buffering
}
/**
* Show buy-pro menu if pro plugin not active
*
* @return void
*/
public function handle_buy_pro_module() {
/**
* Show banner (codename: jhanda)
*/
$filter_string = 'eventin,eventin-free-only';
// if ( class_exists( 'Wpeventin_Pro' ) ) {
// $filter_string .= ',eventin-pro';
// $filter_string = str_replace( ',eventin-free-only', '', $filter_string );
// }
// \Wpmet\Libs\Banner::instance('eventin')
// ->is_test(true)
// ->set_filter(ltrim($filter_string, ','))
// ->set_api_url('http://xpeed.xyz/public/jhanda')
// ->set_plugin_screens('toplevel_page_eventin')
// ->call();
UtilityPackages::instance();
}
/**
* redirect to setup wizard when active pluginn
*
*/
public function etn_activation_redirect() {
if ( ( ! get_option( 'etn_wizard' ) ) ) {
update_option( 'etn_wizard', 'active' );
wp_redirect( admin_url( 'admin.php?page=etn-wizard' ) );
exit;
}
}
/**
* Add admin notice
* if eventin is not acitve add notice to active eventin
* if eventin pro version is 4.0.0 then add notice to required eventin verion 4.0.0
* @return void
*/
public function eventin_pro_admin_notice() {
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
$message = '';
$eventin_pro_required_version = '4.0.17';
if ( class_exists( 'Wpeventin_Pro' ) && version_compare( Wpeventin_Pro::version(), '4.0.17', '<' ) ) {
$message = sprintf(
'',
__( 'Important Update:', 'eventin' ),
__( 'A new version of Eventin Pro is available with major improvements and new features. Please update to the latest version for the best experience.', 'eventin' ),
esc_url( 'https://themewinter.com/eventin/pricing' ),
__( 'Update Now', 'eventin' )
);
}
if ( ! empty( $message ) ) {
?>
Wpeventin_Pro::version(),
'license' => $license_key,
'item_id' => '1013',
'author' => 'themewinter',
'url' => site_url(),
)
);
}
}
public function is_same_origin( $url ) {
return strpos( $url, site_url() ) !== false;
}
public function proxy_image_allowed_origins(): array {
return [
"https://product.themewinter.com"
];
}
private function is_origin_allowed($imageUrl): bool {
$allowedOrigins = $this->proxy_image_allowed_origins();
foreach ($allowedOrigins as $allowedOrigin) {
if (strpos($imageUrl, $allowedOrigin) !== false) {
return true;
}
}
return false;
}
}