File: /var/www/intranet.kauko.lt/wp-content/plugins/dpProEventCalendar/functions.php
<?php
/*
* DP Pro Event Calendar - Payments Extension
*
* Copyright 2012, Diego Pereyra
*
* @Web: https://www.wpsleek.com
* @Email: dpereyra90@gmail.com
*
* General functions WP Pro Event Calendar
*/
// If this file is called directly, abort.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Parse the plugin settings data
*
* @return string - requested field
*/
function pec_setting( $key, $default = '' )
{
global $dpProEventCalendar;
if( isset( $dpProEventCalendar[$key] ) )
return $dpProEventCalendar[$key];
return $default;
}
/**
* Get plugin url
*
* @return string - requested field
*/
function dpProEventCalendar_plugin_url( $path = '', $protocol = '' )
{
global $wp_version;
$return_url = "";
if ( version_compare( $wp_version, '2.8', '<' ) )
{ // Using WordPress 2.7
$folder = dirname( plugin_basename( __FILE__ ) );
if ( '.' != $folder )
$path = path_join( ltrim( $folder, '/' ), $path );
$return_url = plugins_url( $path );
if($protocol != "")
$return_url = str_replace(array('http://', 'https://'), $protocol.'://', $return_url);
return $return_url;
}
$return_url = plugins_url( $path, __FILE__ );
if($protocol != "")
$return_url = str_replace(array('http://', 'https://'), $protocol.'://', $return_url);
return $return_url;
}
// Fix links in the archives page for events
add_filter('the_permalink', 'dpProEventCalendar_archive_links');
add_filter('post_type_link', 'dpProEventCalendar_archive_links');
function dpProEventCalendar_archive_links( $post_link, $post = '' ) {
if( $post == '' )
global $post;
if ( is_post_type_archive ( DP_PRO_EVENT_CALENDAR_EVENT_POST_TYPE ) && $post->post_type == 'pec-events' ) {
global $pec_init;
$dpProEventCalendar_class = $pec_init->init_base( );
if( $post->id == "" )
$post->id = $post->ID;
$event = (object)array_merge((array)$dpProEventCalendar_class::getEventData( $post->ID ), (array)$post );
$link = $dpProEventCalendar_class::get_permalink ( $event, $event->date, true );
if( $link != '' )
$post_link = $post_link = $link;
}
return $post_link;
}
function dpProEventCalendar_convertBytes( $value )
{
if ( is_numeric( $value ) )
return $value;
else {
$value_length = strlen($value);
$qty = substr( $value, 0, $value_length - 1 );
$unit = strtolower( substr( $value, $value_length - 1 ) );
switch ( $unit )
{
case 'k':
$qty *= 1024;
break;
case 'm':
$qty *= 1048576;
break;
case 'g':
$qty *= 1073741824;
break;
}
return $qty;
}
}
function dpProEventCalendar_wp_mail_from_name( $original_email_from )
{
return get_bloginfo('name');
}
function dpProEventCalendar_wp_mail_from( $original_email_address )
{
global $dpProEventCalendar;
return ($dpProEventCalendar['wp_mail_from'] != "" ? $dpProEventCalendar['wp_mail_from'] : $original_email_address);
}
add_filter( 'pec_booking_email', 'dpProEventCalendar_bookingEmail', 10, 9 );
function dpProEventCalendar_bookingEmail( $template, $event_id, $user_name, $user_email, $event_date, $comment, $quantity, $user_phone = '', $extra_fields = '' )
{
global $dpProEventCalendar;
$template = str_replace( "#USERNAME#", $user_name, $template );
$template = str_replace( "#COMMENT#", $comment, $template );
$template = str_replace( "#USEREMAIL#", $user_email, $template );
$template = str_replace( "#USERPHONE#", $user_phone, $template );
$location_id = get_post_meta( $event_id, 'pec_location', true );
$location = get_the_title( $location_id );
$address = get_post_meta( $location_id, 'pec_venue_address', true );
if($address != "")
$location .= " (".$address.")";
$extra_fields = unserialize($extra_fields);
if( !is_array( $extra_fields ) )
$extra_fields = array();
$custom_fields = '';
foreach( $extra_fields as $key => $value )
{
$field_index = array_keys($dpProEventCalendar['booking_custom_fields']['id'], str_replace('pec_custom_', '', $key));
if(is_array($field_index))
$field_index = $field_index[0];
else
$field_index = '';
if($value != "" && is_numeric($field_index))
{
if($dpProEventCalendar['booking_custom_fields']['type'][$field_index] == 'checkbox')
$value = __('Yes', 'dpProEventCalendar');
$custom_fields .= $dpProEventCalendar['booking_custom_fields']['name'][$field_index].": ".$value."\n\r";
}
}
$template = str_replace("#EVENT_DETAILS#", "---------------------------\n\r".get_the_title($event_id)."\n\r".dpProEventCalendar_date_i18n(get_option('date_format'), strtotime($event_date)).' - '.date(get_option('time_format'), strtotime(get_post_meta($event_id, 'pec_date', true)))."\n\r".__("Quantity", "dpProEventCalendar").": ".$quantity."\n\r".$location."\n\r".$custom_fields."---------------------------\n\r", $template);
$template = str_replace("#SITE_NAME#", get_bloginfo('name'), $template);
return nl2br($template);
}
add_filter('pec_booking_email_cancel', 'dpProEventCalendar_bookingEmailCancel', 10, 2);
function dpProEventCalendar_bookingEmailCancel($template, $booking_id)
{
global $wpdb, $dpProEventCalendar;
$booking_count = 0;
$querystr = "
SELECT *
FROM " . DP_PRO_EVENT_CALENDAR_TABLE_BOOKING . "
WHERE id = %d";
$booking = $wpdb->get_row( $wpdb->prepare( $querystr, $booking_id), OBJECT );
if( is_numeric( $booking->id_user ) && $booking->id_user > 0) {
$userdata = get_userdata($booking->id_user);
} else {
$userdata = new stdClass();
$userdata->display_name = $booking->name;
$userdata->user_email = $booking->email;
}
$event_id = $booking->id_event;
$event_date = $booking->event_date;
$quantity = $booking->quantity;
$cancel_reason = $booking->cancel_reason;
$template = str_replace("#USERNAME#", $userdata->display_name, $template);
$template = str_replace("#COMMENT#", $booking->comment, $template);
$template = str_replace("#USEREMAIL#", $userdata->user_email, $template);
$template = str_replace("#USERPHONE#", $booking->phone, $template);
$location_id = get_post_meta($event_id, 'pec_location', true);
$location = get_the_title($location_id);
$address = get_post_meta($location_id, 'pec_venue_address', true);
if($address != "")
$location .= " (".$address.")";
$template = str_replace("#EVENT_DETAILS#", "---------------------------\n\r".get_the_title($event_id)."\n\r".dpProEventCalendar_date_i18n(get_option('date_format'), strtotime($event_date)).' - '.date(get_option('time_format'), strtotime(get_post_meta($event_id, 'pec_date', true)))."\n\r".__("Quantity", "dpProEventCalendar").": ".$quantity."\n\r".$location."\n\r---------------------------\n\r", $template);
$template = str_replace("#CANCEL_REASON#", $cancel_reason, $template);
$template = str_replace("#SITE_NAME#", get_bloginfo('name'), $template);
return nl2br($template);
}
add_filter('pec_new_event_published', 'dpProEventCalendar_eventPublished', 10, 6);
function dpProEventCalendar_eventPublished( $template, $event_title, $user_name )
{
$template = str_replace("#USERNAME#", $user_name, $template);
$template = str_replace("#EVENT_TITLE#", $event_title, $template);
$template = str_replace("#SITE_NAME#", get_bloginfo('name'), $template);
return html_entity_decode ( $template );
}
/*
function dpProEventCalendar_loadTemplate( $template ) {
global $dpProEventCalendar;
// assuming you have created a page/post entitled 'debug'
if ($GLOBALS['post']->post_type == DP_PRO_EVENT_CALENDAR_EVENT_POST_TYPE && $dpProEventCalendar['event_single_enable']) {
remove_filter( 'the_content', 'dpProEventCalendar_contentFilter' );
remove_all_actions('wp_enqueue_scripts');
return dirname( __FILE__ ) . '/templates/default/template.php';
}
return $template;
}
add_filter( 'template_include', 'dpProEventCalendar_loadTemplate', 100 );*/
if(!function_exists('cal_days_in_month'))
{
function cal_days_in_month($month, $year) {
return date('t', mktime(0, 0, 0, $month+1, 0, $year));
}
}
function dpProEventCalendar_booking_reminder()
{
global $wpdb, $dpProEventCalendar, $pec_init;
$days_reminder_setting = $dpProEventCalendar['days_reminders'];
if( ! is_numeric( $days_reminder_setting ) || $days_reminder_setting == 0 )
$days_reminder_setting = 3;
$booking_search_date = date( 'Y-m-d', strtotime( '+'.$days_reminder_setting.' days' ) );
$booking_search_id = array();
//Search events with continuous bookings
$args = array(
'posts_per_page' => -1,
'post_type'=> DP_PRO_EVENT_CALENDAR_EVENT_POST_TYPE,
'meta_query' => array(
array(
'key' => 'pec_booking_continuous',
'value' => 1,
))
);
$continuous_events = get_posts( $args );
if( ! empty( $continuous_events ) )
{
foreach( $continuous_events as $event )
{
$id_calendar = get_post_meta( $event->ID, 'pec_id_calendar', true );
$id_calendar = explode(',', $id_calendar);
$id_calendar = $id_calendar[0];
$opts = array();
$opts['id_calendar'] = $id_calendar;
$opts['event_id'] = $event->ID;
$dpProEventCalendar_class = $pec_init->init_base( $opts );
$event_dates = $dpProEventCalendar_class::upcomingCalendarLayout( true, 1, '', $booking_search_date." 00:00:00", $booking_search_date." 23:59:59" );
if(is_array($event_dates) && !empty($event_dates))
$booking_search_id[] = $event->ID;
}
}
$querystr = "
SELECT *
FROM " . DP_PRO_EVENT_CALENDAR_TABLE_BOOKING . "
WHERE (event_date = '".$booking_search_date."' ";
if(is_array($booking_search_id) && !empty($booking_search_id)) {
$querystr .= "OR id_event IN (".implode(",", $booking_search_id).")";
}
$querystr .= ") AND status <> '" . DP_PRO_EVENT_CALENDAR_BOOKING_PENDING . "' AND status <> '" . DP_PRO_EVENT_CALENDAR_BOOKING_CANCELED . "' AND status <> '" . DP_PRO_EVENT_CALENDAR_BOOKING_CANCELED_BY_USER . "'
ORDER BY id DESC
";
$bookings_obj = $wpdb->get_results($querystr, OBJECT);
$bookings_count = 0;
if( ! empty( $bookings_obj ) )
{
foreach( $bookings_obj as $booking )
{
if( is_numeric( $booking->id_user ) && $booking->id_user > 0 ) {
$userdata = get_userdata($booking->id_user);
} else {
$userdata = new stdClass();
$userdata->display_name = $booking->name;
$userdata->user_email = $booking->email;
}
$opts = array();
$opts['id_calendar'] = $booking->id_calendar;
$dpProEventCalendar_class = $pec_init->init_base( $opts );
$calendar_obj = $dpProEventCalendar_class->get_calendar();
$booking_email_template_reminder_user = $calendar_obj->booking_email_template_reminder_user;
if($booking_email_template_reminder_user == '')
$booking_email_template_reminder_user = "Hi #USERNAME#,\n\nWe would like to remind you the booking of the event:\n\n#EVENT_DETAILS#\n\nKind Regards.\n#SITE_NAME#";
add_filter( 'wp_mail_from_name', 'dpProEventCalendar_wp_mail_from_name' );
add_filter( 'wp_mail_from', 'dpProEventCalendar_wp_mail_from' );
$headers = 'Content-Type: text/html; charset=UTF-8';
// Email to User
wp_mail( $userdata->user_email, get_bloginfo('name'), apply_filters('pec_booking_email', $booking_email_template_reminder_user, $booking->id_event, $userdata->display_name, $userdata->user_email, $booking_search_date, $booking->comment, $booking->quantity, $booking->phone, $booking->extra_fields), $headers );
// Action hook
do_action( 'pec_booking_reminder', $booking->id, $booking->id_event );
$bookings_count++;
}
}
}
/**
* On the scheduled action hook, run a function.
*/
function dpProEventCalendar_ical_sync( $calendar_id )
{
global $wpdb;
$querystr = "
SELECT id as calendar_id, sync_ical_url, sync_fb_page, sync_ical_frequency, sync_ical_enable, sync_ical_category
FROM " . DP_PRO_EVENT_CALENDAR_TABLE_CALENDARS . "
WHERE id = %d";
$calendar_obj = $wpdb->get_row( $wpdb->prepare( $querystr, $calendar_id ), OBJECT );
if( empty( $calendar_obj ) ) return;
$filename_ical = $calendar_obj->sync_ical_url;
$fb_page = $calendar_obj->sync_fb_page;
$category = $calendar_obj->sync_ical_category;
if($category == 0)
$category = '';
$filename_ical_arr = explode(",", $filename_ical);
foreach($filename_ical_arr as $url) {
if($url != "")
dpProEventCalendar_importICS($calendar_id, $url, '', $category);
}
$fb_page_arr = explode(",", $fb_page);
foreach($fb_page_arr as $url) {
if($url != "")
dpProEventCalendar_importFB($calendar_id, $url, $category);
}
}
function dpProEventCalendar_create_venue( $name, $address = '', $map = '', $lnlat = '', $link = '' )
{
global $wpdb;
$name = trim( stripslashes( $name ) );
if( $name == "" )
return '';
$search_query = 'SELECT ID FROM '.$wpdb->posts.'
WHERE post_type = "pec-venues"
AND post_status = "publish"
AND post_title = %s';
$result = $wpdb->get_row( $wpdb->prepare( $search_query, str_replace( "&", "&", $name ) ) );
if(!is_array($result))
$result = array();
if(count($result) > 0) {
return $result->ID;
} else {
$args = array(
'posts_per_page' => 1,
'post_type'=> DP_PRO_EVENT_CALENDAR_VENUES_POST_TYPE,
"meta_query" => array(
array(
'key' => 'pec_venue_name_id',
'value' => $name
)
)
);
$result = get_posts( $args );
if( ! empty( $result ) )
return $result[0]->ID;
}
$venue_args = array(
'post_title' => $name,
'post_status' => 'publish',
'post_type' => DP_PRO_EVENT_CALENDAR_VENUES_POST_TYPE
);
if( ! is_user_logged_in() )
{
$users = get_users( 'role=administrator&number=1' );
foreach ( $users as $user ) {
$venue_args['post_author'] = $user->ID;
}
}
$venue_id = wp_insert_post( $venue_args );
update_post_meta( $venue_id, 'pec_venue_address', $address );
update_post_meta( $venue_id, 'pec_venue_map_lnlat', $lnlat );
update_post_meta( $venue_id, 'pec_venue_map', $map );
update_post_meta( $venue_id, 'pec_venue_link', $link );
update_post_meta( $venue_id, 'pec_venue_name_id', $name );
return $venue_id;
}
function dpProEventCalendar_importFB( $calendar_id, $event_url, $category_ics = '', $event_option = 2, $offset = '' )
{
global $dpProEventCalendar, $wpdb;
$facebook = new PEC_Import_Events_Facebook();
$event_data = array();
$expire_after = $dpProEventCalendar['remove_expired_days'];
if( $expire_after == '' || !is_numeric( $expire_after ) || $expire_after < 0 )
$expire_after = 10;
if( ! is_numeric( $event_url ) )
{
$event_url = str_replace("/?fref=nf", "", $event_url);
$event_url = str_replace("/?ti=cl", "", $event_url);
$event_url = str_replace("/timeline", "", $event_url);
$event_url = substr($event_url, strrpos(rtrim($event_url, '/ '), '/') + 1);
}
switch ( $event_option )
{
case 1:
$event_data['import_by'] = 'facebook_event_id';
break;
case 2:
$event_data['import_by'] = 'facebook_page';
$event_data['page_username'] = $event_url;
break;
}
$event_list = array();
$event_data['event_ids'] = array( $event_url );
$event_list = $facebook->import_events( $event_data );
$events_imported = array();
if( isset( $event_list->data ) )
{
$events_imported = $event_list->data;
} else {
if( !empty( $event_list ) )
$events_imported[] = $event_list;
}
@set_time_limit(0);
foreach( $events_imported as $graph_arr )
{
$extra_times = array();
if(isset($graph_arr->event_times))
{
$event_times = $graph_arr->event_times;
$event_times_arr = array();
foreach($event_times as $key) {
$event_times_arr[] = date('Y-m-d', strtotime($key['start_time']));
}
$extra_times = implode(',',$event_times_arr);
}
$picture = $graph_arr->cover;
if( is_object( $picture ) )
$picture = $picture->source;
$ticket_uri = $graph_arr->ticket_uri;
if( empty( $graph_arr->start_time ) ) continue;
$args = array(
'posts_per_page' => 1,
'post_type'=> DP_PRO_EVENT_CALENDAR_EVENT_POST_TYPE,
"meta_query" => array(
'relation' => 'AND',
array(
'key' => 'pec_id_calendar',
'value' => $calendar_id,
),
array(
'key' => 'pec_fb_uid',
'value' => $graph_arr->id.'@pec-no-uid',
)
)
);
$imported_posts = get_posts( $args );
$fb_event = array(
'post_title' => $graph_arr->name,
'post_content' => (isset($graph_arr->description) ? $graph_arr->description : ''),
'post_status' => 'publish',
'post_category' => array($category_ics),
'tax_input' => array( 'pec_events_category' => $category_ics ),
'post_type' => DP_PRO_EVENT_CALENDAR_EVENT_POST_TYPE
);
// Set author if not logged in
if( ! is_user_logged_in() )
{
$blogadmin = get_users( 'role=administrator' );
$fb_event['post_author'] = $blogadmin[0]->ID;
}
if( ! empty( $imported_posts ) )
{
$disable_sync = get_post_meta( $imported_posts[0]->ID, 'pec_disable_sync', true );
if( $disable_sync )
continue;
$fb_event['ID'] = $imported_posts[0]->ID;
$fb_event['post_author'] = $imported_posts[0]->post_author;
}
$tzid = "UTC";
$setTimeZone = get_option( 'timezone_string' );
if($setTimeZone == "")
$setTimeZone = timezone_name_from_abbr("", get_option('gmt_offset') * 3600, false);
$start_date = new DateTime(date("Y-m-d H:i:s O", strtotime($graph_arr->start_time)), new DateTimeZone($tzid));
$start_date->setTimeZone(new DateTimeZone($setTimeZone));
$pec_date = $start_date->format('Y-m-d H:i:s');
if( $offset != "" )
{
$end_date_hh = date('H', strtotime($offset.' hours', strtotime($end_date.' '.$end_date_hh.':'.$end_date_mm.':00')));
$pec_date = date('Y-m-d H:i:s', strtotime($offset.' hours', strtotime($pec_date)));
}
$end_date = "";
$end_date_hh = "";
$end_date_mm = "";
if( isset( $graph_arr->end_time ) )
{
$end_date = new DateTime(date("Y-m-d H:i:s O", strtotime($graph_arr->end_time)), new DateTimeZone($tzid));
$end_date->setTimeZone(new DateTimeZone($setTimeZone));
$end_date_hh = $end_date->format('H');
$end_date_mm = $end_date->format('i');
$end_date = $end_date->format('Y-m-d');
}
$location = $graph_arr->place->name;
$venue_id = '';
// Create Venue
if( $location != "")
{
$venue_address = "";
$venue_map = "";
if( isset($graph_arr->place->location->street)) {
$venue_address = $graph_arr->place->location->street;
$venue_map .= $venue_address;
}
if( isset($graph_arr->place->location->city))
$venue_map .= ', '.$graph_arr->place->location->city;
if( isset($graph_arr->place->location->country))
$venue_map .= ', '.$graph_arr->place->location->country;
$venue_lnlat = "";
if( isset($graph_arr->place->location->latitude)) {
$venue_lnlat .= $graph_arr->place->location->latitude;
$venue_lnlat .= ', '.$graph_arr->place->location->longitude;
}
if( $venue_map == "")
$venue_map = $venue_address;
if( $venue_map == "")
$venue_map = $location;
$venue_id = dpProEventCalendar_create_venue( $location, $venue_address, $venue_map, $venue_lnlat );
}
$recurring_frecuency = '';
if( $end_date != "" && substr( $pec_date, 0, 10 ) != $end_date )
$recurring_frecuency = 1;
if( isset( $dpProEventCalendar['remove_expired_enable'] ) && $dpProEventCalendar['remove_expired_enable'] &&
(
(
$end_date != "" &&
strtotime($end_date) < strtotime(current_time( 'Y-m-d' ) . ' -'.$expire_after.' days')
) ||
(
$end_date == "" &&
strtotime($pec_date) < strtotime(current_time( 'Y-m-d H:i:s' ) . ' -'.$expire_after.' days') &&
$recurring_frecuency == ''
)
)
) {
continue;
}
$post_id = wp_insert_post( $fb_event, true );
if( is_wp_error( $post_id ) )
continue;
if( $recurring_frecuency == 1 && $end_date != "" && date( "H", $pec_date ) > $end_date_hh )
$recurring_frecuency = 0;
if( ! empty( $extra_times ) )
{
$recurring_frecuency = 0;
$end_date = '';
update_post_meta( $post_id, 'pec_extra_dates', $extra_times );
}
wp_set_post_terms( $post_id, array( $category_ics ), 'pec_events_category' );
$code = get_post_meta( $post_id, 'pec_code', true );
if( ! isset( $code ) || $code == "" )
{
$code = dpProeventCalendar_generate_code();
update_post_meta( $post_id, 'pec_code', $code );
}
update_post_meta( $post_id, 'pec_id_calendar', $calendar_id );
update_post_meta( $post_id, 'pec_date', $pec_date );
update_post_meta( $post_id, 'pec_all_day', ($graph_arr->is_date_only ? '1' : '0') );
update_post_meta( $post_id, 'pec_location', $venue_id );
update_post_meta( $post_id, 'pec_end_date', $end_date );
update_post_meta( $post_id, 'pec_link', $ticket_uri );
update_post_meta( $post_id, 'pec_share', '' );
update_post_meta( $post_id, 'pec_map', '' );
update_post_meta( $post_id, 'pec_map_lnlat', '' );
update_post_meta( $post_id, 'pec_recurring_frecuency', $recurring_frecuency );
update_post_meta( $post_id, 'pec_end_time_hh', $end_date_hh );
update_post_meta( $post_id, 'pec_end_time_mm', $end_date_mm );
update_post_meta( $post_id, 'pec_hide_time', '' );
update_post_meta( $post_id, 'pec_fb_event', 'https://www.facebook.com/events/'.$graph_arr->id );
update_post_meta( $post_id, 'pec_fb_uid', $graph_arr->id.'@pec-no-uid' );
update_post_meta( $post_id, 'pec_fb_uid_title', $graph_arr->name );
if( $picture != "" && $picture != get_post_meta( $post_id, 'pec_fb_image', true ) )
dpProEventCalendar_fetch_media( $picture, $post_id );
update_post_meta( $post_id, 'pec_fb_image', $picture );
}
}
function dpProEventCalendar_importICS( $calendar_id, $filename, $tmp_filename = '', $category_ics = '', $offset = '' )
{
global $dpProEventCalendar_cache, $dpProEventCalendar, $wpdb;
$expire_after = $dpProEventCalendar['remove_expired_days'];
if( $expire_after == '' || ! is_numeric( $expire_after ) || $expire_after < 0 )
$expire_after = 10;
if( $tmp_filename == "" )
$tmp_filename = $filename;
$extension = strrchr( $tmp_filename, '.' );
$extensions = array('.ics');
//if(in_array($extension, $extensions)) {
require_once( dirname(__FILE__) . '/includes/ical_parser.php' );
$ical = new ICal($filename);
$feed = $ical->cal;
/*echo '<pre>';
echo $filename;
print_r($feed);
echo '</pre>';
die();*/
if( ! empty( $feed ) )
{
set_time_limit(0);
$all_uid = array();
$count = 0;
/*
echo '<pre>';
print_r($feed['VTIMEZONE']);
print_r($feed['STANDARD']);
echo '</pre>';*/
if( is_array( $feed['VEVENT'] ) )
{
foreach( $feed['VEVENT'] as $key )
{
/*echo '<pre>';
print_r($key);
echo '</pre>';*/
if( ! isset( $key['SUMMARY'] ) || $key['SUMMARY'] == "" )
{
$summary_arr = preg_grep( '/^SUMMARY/', array_keys($key) );
$summary_arr = reset( $summary_arr );
$key['SUMMARY'] = $key[$summary_arr];
}
if( $key['SUMMARY'] == "" ) continue;
$count++;
if(preg_match("/\p{Hebrew}/u", $key['DESCRIPTION']) || preg_match("/[ĄĆĘŁŃÓŚŹŻ]+/iu", $key['DESCRIPTION']) || preg_match("/\p{Cyrillic}/u", $key['DESCRIPTION'])) {
$key['DESCRIPTION'] = str_replace("―", " - ", $key['DESCRIPTION']);
$key['DESCRIPTION'] = str_replace("", "", ltrim($key['DESCRIPTION']));
} else {
$key['DESCRIPTION'] = str_replace("―", " - ", $key['DESCRIPTION']);
$key['DESCRIPTION'] = utf8_encode(utf8_decode(str_replace("", "", ltrim($key['DESCRIPTION']))));
}
foreach($key as $k => $v) {
$key[substr($k, 0, strpos($k, ';'))] = $v;
}
//$key['UID'] = "";
if($key['UID'] == "")
$key['UID'] = $key['DTSTART'].$key['SUMMARY'].'@pec-no-uid';
// XX
$args = array(
'posts_per_page' => 1,
'post_type'=> DP_PRO_EVENT_CALENDAR_EVENT_POST_TYPE,
"meta_query" => array(
'relation' => 'AND',
array(
'key' => 'pec_id_calendar',
'value' => $calendar_id,
),
array(
'key' => 'pec_ics_uid',
'value' => $key['UID'],
)
)
);
$imported_posts = get_posts( $args );
// Create post object
$ics_event = array(
'post_title' => $key['SUMMARY'],
'post_content' => $key['DESCRIPTION'],
'post_status' => 'publish',
'post_category' => array($category_ics),
'tax_input' => array( 'pec_events_category' => $category_ics ),
'post_type' => DP_PRO_EVENT_CALENDAR_EVENT_POST_TYPE
);
if( ! empty( $imported_posts ) )
{
$disable_sync = get_post_meta( $imported_posts[0]->ID, 'pec_disable_sync', true );
if( $disable_sync ) continue;
$ics_event['ID'] = $imported_posts[0]->ID;
}
$rrule_arr = "";
if( $key['RRULE'] != "" )
{
$rrule = explode( ';', $key['RRULE'] );
if( is_array( $rrule ) )
{
$rrule_arr = array();
foreach( $rrule as $rule ) {
$rrule_arr[substr($rule, 0, strpos($rule, '='))] = substr($rule, strrpos($rule, '=') + 1);
}
}
}
$tzid = "UTC";
$setTimeZone = get_option( 'timezone_string' );
if( $setTimeZone == "" )
$setTimeZone = timezone_name_from_abbr( "", get_option('gmt_offset') * 3600, false );
if( $feed['VTIMEZONE'][0]['TZID;X-RICAL-TZSOURCE=TZINFO'] != "" )
$feed['VTIMEZONE'][0]['TZID'] = $feed['VTIMEZONE'][0]['TZID;X-RICAL-TZSOURCE=TZINFO'];
if( $feed['VTIMEZONE'][0]['TZID'] != "" || $feed['VCALENDAR']['TZID'] != "" )
$tzid = ($feed['VTIMEZONE'][0]['TZID'] != "" ? $feed['VTIMEZONE'][0]['TZID'] : $feed['VCALENDAR']['TZID']);
if( isset($key['TZID']) && $key['TZID'] != "" )
$tzid = $key['TZID'];
if( isset( $feed['STANDARD'][0]['TZOFFSETTO'] ) )
{
$offset_to = substr_replace($feed['STANDARD'][0]['TZOFFSETTO'], ':', -2, 0);
list( $hours, $minutes ) = explode( ':', $offset_to );
$seconds = ( $hours * 60 * 60 ) + ( $minutes * 60 );
// Get timezone name from seconds
$tzid_tmp = timezone_name_from_abbr( '', $seconds, false );
if( $tzid_tmp != "" )
$tzid = $tzid_tmp;
}
if( $tzid == "Mountain Standard Time" )
$tzid = "America/Denver";
if( $tzid == "Eastern Standard Time" )
$tzid = "America/New_York";
if( $tzid == "Pacific Standard Time" )
$tzid = "America/Los_Angeles";
if( $tzid == "SE Asia Standard Time" )
$tzid = "Asia/Vientiane";
if( $tzid == "UTC+0" )
$tzid = "UTC";
$tzid = str_replace("America-", "America/", $tzid);
$tzid = str_replace(";VALUE=DATE-TIME", "", $tzid);
$tzid = str_replace(";VALUE=DATE", "", $tzid);
$start_date = new DateTime($key['DTSTART'], new DateTimeZone($tzid));
$start_date->setTimeZone(new DateTimeZone($setTimeZone));
if( strlen($key['DTEND']) == 8 ) {
$end_date = date("Y-m-d", strtotime($key['DTEND']));
$end_date_hh = date("H", strtotime($key['DTEND']));
$end_date_mm = date("i", strtotime($key['DTEND']));
} else {
$end_date = new DateTime($key['DTEND'], new DateTimeZone($tzid));
$end_date->setTimeZone(new DateTimeZone($setTimeZone));
$end_date_hh = $end_date->format('H');
$end_date_mm = $end_date->format('i');
$end_date = $end_date->format('Y-m-d');
}
$all_day = false;
$start_date_formatted = "";
$set_until = false;
if( strlen( $key['DTSTART'] ) == 8 ) {
$pec_date = date("Y-m-d", strtotime($key['DTSTART'])).' 00:00:00';
$start_date_formatted = date("Y-m-d", strtotime($key['DTSTART']));
$all_day = true;
if(strlen($key['DTEND']) == 8) {
$end_date = date("Y-m-d", strtotime($key['DTEND']) - 86400);
if(strtotime($key['DTEND']) - strtotime($key['DTSTART']) <= 86400) {
$end_date = '';
$end_date_hh = '';
$end_date_mm = '';
$key['DTEND'] = '';
}
}
} else {
$pec_date = $start_date->format('Y-m-d H:i:s');
if($offset != "")
$pec_date = date('Y-m-d H:i:s', strtotime($offset.' hours', strtotime($pec_date)));
$start_date_formatted = $start_date->format('Y-m-d');
}
$recurring_frecuency = '';
$pec_daily_every = '';
$pec_daily_working_days = '';
$pec_weekly_every = '';
$pec_weekly_day = '';
$pec_monthly_every = '';
$pec_monthly_position = '';
$pec_monthly_day;
if( is_array( $rrule_arr ) )
{
foreach($rrule_arr as $key2 => $value)
{
if($key2 == 'FREQ')
{
switch($value) {
case 'DAILY':
$recurring_frecuency = '1';
break;
case 'WEEKLY':
$recurring_frecuency = '2';
break;
case 'MONTHLY':
$recurring_frecuency = '3';
break;
case 'YEARLY':
$recurring_frecuency = '4';
break;
}
}
if( $key2 == 'FREQ' && $value == 'DAILY' )
{
$pec_daily_every = $rrule_arr['INTERVAL'];
$pec_daily_working_days = '';
}
if( $key2 == 'UNTIL' && $value != "" )
{
if( strlen( $value ) == 8 )
{
$end_date = date("Y-m-d", strtotime($value));
//$end_date_hh = date("H", strtotime($value));
//$end_date_mm = date("i", strtotime($value));
} else {
$end_date = new DateTime($value, new DateTimeZone($tzid));
$end_date->setTimeZone(new DateTimeZone($setTimeZone));
//$end_date_hh = $end_date->format('H');
//$end_date_mm = $end_date->format('i');
$end_date = $end_date->format('Y-m-d');
}
$set_until = true;
}
if( $key2 == 'COUNT' && $value != "" )
{
switch($recurring_frecuency) {
case 1:
$end_date = date("Y-m-d", strtotime("+".($value - 1)." days", strtotime($start_date_formatted)));
break;
case 2:
$end_date = date("Y-m-d", strtotime("+".$value." weeks", strtotime($start_date_formatted)));
break;
case 3:
$end_date = date("Y-m-d", strtotime("+".$value." months", strtotime($start_date_formatted)));
break;
case 4:
$end_date = date("Y-m-d", strtotime("+".$value." years", strtotime($start_date_formatted)));
break;
}
$set_until = true;
}
if( $key2 == 'FREQ' && $value == 'WEEKLY' )
{
$day_arr = array();
foreach( explode(',', $rrule_arr['BYDAY']) as $day )
{
switch( $day )
{
case 'MO':
$day_arr[] = 1;
break;
case 'TU':
$day_arr[] = 2;
break;
case 'WE':
$day_arr[] = 3;
break;
case 'TH':
$day_arr[] = 4;
break;
case 'FR':
$day_arr[] = 5;
break;
case 'SA':
$day_arr[] = 6;
break;
case 'SU':
$day_arr[] = 7;
break;
}
$pec_weekly_day = $day_arr;
}
$pec_weekly_every = $rrule_arr['INTERVAL'];
}
if( $key2 == 'FREQ' && $value == 'MONTHLY' )
{
$pec_monthly_every = $rrule_arr['INTERVAL'];
$setpos = "";
switch( $rrule_arr['BYSETPOS'] )
{
case '1':
$setpos = 'first';
break;
case '2':
$setpos = 'second';
break;
case '3':
$setpos = 'third';
break;
case '4':
$setpos = 'fourth';
break;
case '-1':
$setpos = 'last';
break;
}
$day_arr = '';
foreach( explode(',', $rrule_arr['BYDAY'] ) as $day ) {
switch($day) {
case 'MO':
$day_arr = 'monday';
break;
case 'TU':
$day_arr = 'tuesday';
break;
case 'WE':
$day_arr = 'wednesday';
break;
case 'TH':
$day_arr = 'thursday';
break;
case 'FR':
$day_arr = 'friday';
break;
case 'SA':
$day_arr = 'saturday';
break;
case 'SU':
$day_arr = 'sunday';
break;
case '1MO':
$day_arr = 'monday';
$setpos = 'first';
break;
case '1TU':
$day_arr = 'tuesday';
$setpos = 'first';
break;
case '1WE':
$day_arr = 'wednesday';
$setpos = 'first';
break;
case '1TH':
$day_arr = 'thursday';
$setpos = 'first';
break;
case '1FR':
$day_arr = 'friday';
$setpos = 'first';
break;
case '1SA':
$day_arr = 'saturday';
$setpos = 'first';
break;
case '1SU':
$day_arr = 'sunday';
$setpos = 'first';
break;
case '2MO':
$day_arr = 'monday';
$setpos = 'second';
break;
case '2TU':
$day_arr = 'tuesday';
$setpos = 'second';
break;
case '2WE':
$day_arr = 'wednesday';
$setpos = 'second';
break;
case '2TH':
$day_arr = 'thursday';
$setpos = 'second';
break;
case '2FR':
$day_arr = 'friday';
$setpos = 'second';
break;
case '2SA':
$day_arr = 'saturday';
$setpos = 'second';
break;
case '2SU':
$day_arr = 'sunday';
$setpos = 'second';
break;
case '3MO':
$day_arr = 'monday';
$setpos = 'third';
break;
case '3TU':
$day_arr = 'tuesday';
$setpos = 'third';
break;
case '3WE':
$day_arr = 'wednesday';
$setpos = 'third';
break;
case '3TH':
$day_arr = 'thursday';
$setpos = 'third';
break;
case '3FR':
$day_arr = 'friday';
$setpos = 'third';
break;
case '3SA':
$day_arr = 'saturday';
$setpos = 'third';
break;
case '3SU':
$day_arr = 'sunday';
$setpos = 'third';
break;
case '4MO':
$day_arr = 'monday';
$setpos = 'fourth';
break;
case '4TU':
$day_arr = 'tuesday';
$setpos = 'fourth';
break;
case '4WE':
$day_arr = 'wednesday';
$setpos = 'fourth';
break;
case '4TH':
$day_arr = 'thursday';
$setpos = 'fourth';
break;
case '4FR':
$day_arr = 'friday';
$setpos = 'fourth';
break;
case '4SA':
$day_arr = 'saturday';
$setpos = 'fourth';
break;
case '4SU':
$day_arr = 'sunday';
$setpos = 'fourth';
break;
}
}
$pec_monthly_position = $setpos;
$pec_monthly_day = $day_arr;
}
}
} else if( $key['DTEND'] != "" && $end_date != $start_date_formatted && substr( $key['DTSTART'], 0, 10 ) != substr( $key['DTEND'], 0, 10 ) ) {
$recurring_frecuency = 1;
}
if( is_array( $rrule_arr ) && ! $set_until )
$end_date = "";
if( $recurring_frecuency == '' || ( $end_date == $start_date_formatted && ! $set_until ) )
$end_date = "";
// Avoid expired events
if( isset($dpProEventCalendar['remove_expired_enable']) && $dpProEventCalendar['remove_expired_enable'] &&
(
(
$end_date != "" &&
strtotime($end_date) < strtotime(current_time( 'Y-m-d' ) . ' -'.$expire_after.' days')
) ||
(
$end_date == "" &&
strtotime($pec_date) < strtotime(current_time( 'Y-m-d H:i:s' ) . ' -'.$expire_after.' days') &&
$recurring_frecuency == ''
)
)
)
continue;
// Insert the post into the database
$post_id = wp_insert_post( $ics_event );
wp_set_post_terms( $post_id, array( $category_ics ), 'pec_events_category' );
if( $key['EXDATE'] != "" )
{
$exdate = wordwrap( $key['EXDATE'], 15, ",", true );
$exdate_string = array();
foreach( explode(',', $exdate) as $exception ) {
$exdate_string[] = date( "Y-m-d", strtotime( $exception ) );
}
$exdate = implode( ',', $exdate_string );
update_post_meta( $post_id, 'pec_exceptions', $exdate );
}
update_post_meta( $post_id, 'pec_id_calendar', $calendar_id );
if( $all_day )
update_post_meta( $post_id, 'pec_all_day', 1 );
else
update_post_meta( $post_id, 'pec_all_day', 0 );
update_post_meta( $post_id, 'pec_date', $pec_date );
if( $offset != "" )
$end_date_hh = date( 'H', strtotime( $offset.' hours', strtotime( '1970-01-01 ' . $end_date_hh . ':' . $end_date_mm . ':00' ) ) );
if( $recurring_frecuency == 1 && $end_date != "" && ! $all_day && date( "H", $pec_date ) > $end_date_hh )
$recurring_frecuency = 0;
update_post_meta( $post_id, 'pec_recurring_frecuency', $recurring_frecuency );
$location = $key['LOCATION'];
$venue_id = "";
// Create Venue
if( $location != "" )
$venue_id = dpProEventCalendar_create_venue( $location, '', $location );
$code = get_post_meta( $post_id, 'pec_code', true);
if( ! isset( $code ) || $code == "" )
{
$code = dpProeventCalendar_generate_code();
update_post_meta( $post_id, 'pec_code', $code );
}
update_post_meta( $post_id, 'pec_daily_every', $pec_daily_every );
update_post_meta( $post_id, 'pec_daily_working_days', $pec_daily_working_days );
update_post_meta( $post_id, 'pec_weekly_every', $pec_weekly_every );
update_post_meta( $post_id, 'pec_weekly_day', $pec_weekly_day );
update_post_meta( $post_id, 'pec_monthly_every', $pec_monthly_every );
update_post_meta( $post_id, 'pec_monthly_position', $pec_monthly_position );
update_post_meta( $post_id, 'pec_monthly_day', $pec_monthly_day );
update_post_meta( $post_id, 'pec_end_date', $end_date );
update_post_meta( $post_id, 'pec_link', $key['URL'] );
update_post_meta( $post_id, 'pec_share', '' );
update_post_meta( $post_id, 'pec_end_time_hh', ($all_day ? '' : $end_date_hh) );
update_post_meta( $post_id, 'pec_end_time_mm', ($all_day ? '' : $end_date_mm) );
update_post_meta( $post_id, 'pec_hide_time', '' );
update_post_meta( $post_id, 'pec_location', $venue_id );
update_post_meta( $post_id, 'pec_map', '' );
update_post_meta( $post_id, 'pec_map_lnlat', '' );
update_post_meta( $post_id, 'pec_ics_uid', $key['UID'] );
update_post_meta( $post_id, 'pec_ics_uid_title', $key['SUMMARY'] );
update_post_meta( $post_id, 'pec_ics_filename', sha1( $filename ) );
$all_uid[] = $key['UID'];
}
}
// Sync?
if( filter_var( $filename, FILTER_VALIDATE_URL ) == $filename )
{
// Remove Not found events
$args = array(
'posts_per_page' => -1,
'post_type'=> DP_PRO_EVENT_CALENDAR_EVENT_POST_TYPE,
"meta_query" => array(
'relation' => 'AND',
array(
'key' => 'pec_ics_filename',
'value' => sha1($filename)
),
array(
'key' => 'pec_ics_uid',
'value' => $all_uid,
'compare' => 'NOT IN'
)
)
);
$not_found_posts = get_posts( $args );
foreach( $not_found_posts as $key ) {
wp_delete_post( $key->ID );
}
}
if( isset( $dpProEventCalendar_cache['calendar_id_'.$calendar_id] ) ) {
$dpProEventCalendar_cache['calendar_id_'.$calendar_id] = array();
update_option( 'dpProEventCalendar_cache', $dpProEventCalendar_cache );
}
}
//}
}
if( ! function_exists( 'mb_substr' ) ) {
function mb_substr( $string, $offset, $length, $encoding = '' )
{
$arr = preg_split( "//u", $string );
$slice = array_slice( $arr, $offset + 1, $length );
return implode( "", $slice );
}
}
function dpProEventCalendar_datediffInWeeks( $date1, $date2 )
{
if( $date1 > $date2 ) return dpProEventCalendar_datediffInWeeks( $date2, $date1 );
if( method_exists( 'DateTime','createFromFormat' ) )
{
$first = DateTime::createFromFormat( 'Y-m-d H:i:s', $date1 );
$second = DateTime::createFromFormat( 'Y-m-d H:i:s', $date2 );
} else {
$first = dpProEventCalendar_create_from_format( 'Y-m-d H:i:s', $date1 );
$second = dpProEventCalendar_create_from_format( 'Y-m-d H:i:s', $date2 );
}
if( ! is_object( $first ) || ! is_object( $second ) )
return 1;
return floor( ( $second->format( 'U' ) - $first->format( 'U' ) ) / ( 60*60*24 ) / 7 );
}
function dpProEventCalendar_get_date_diff( $time1, $time2, $precision = 2, $intervals = array(
'year' => array('year', 'years'),
'month' => array('month', 'months'),
'day' => array('day', 'days'),
'hour' => array('hour', 'hours'),
'minute' => array('minute', 'minutes')
) )
{
// If not numeric then convert timestamps
if ( ! is_int( $time1 ) ) {
//$time1 = strtotime($time1);
}
if ( ! is_int( $time2 ) ) {
//$time2 = strtotime($time2);
}
// If time1 > time2 then swap the 2 values
if ( $time1 > $time2 )
list( $time1, $time2 ) = array( $time2, $time1 );
// Set up intervals and diffs arrays
$diffs = array();
foreach ( $intervals as $interval => $interval_label )
{
// Create temp time from time1 and interval
$ttime = strtotime( '+1 ' . $interval, $time1 );
// Set initial values
$add = 1;
$looped = 0;
// Loop until temp time is smaller than time2
while ( $time2 >= $ttime )
{
// Create new temp time from time1 and interval
$add++;
$ttime = strtotime( "+" . $add . " " . $interval, $time1 );
$looped++;
}
$time1 = strtotime( "+" . $looped . " " . $interval, $time1 );
$diffs[$interval] = $looped;
}
$count = 0;
$times = array();
foreach ( $diffs as $interval => $value )
{
// Break if we have needed precission
if ( $count >= $precision )
break;
// Add value and interval if value is bigger than 0
if ( $value > 0 )
{
// Add value and interval to times array
$times[] = $value . " " . $intervals[$interval][$value == 1 ? 0 : 1];
$count++;
}
}
// Return string with times
return implode( ", ", $times );
}
function dpProEventCalendar_create_from_format( $dformat, $dvalue )
{
$ymd = sprintf(
// This is a format string that takes six total decimal
// arguments, then left-pads them with zeros to either
// 4 or 2 characters, as needed
'%04d-%02d-%02d %02d:%02d:%02d',
date('Y', strtotime($dvalue)), // This will be "111", so we need to add 1900.
date('m', strtotime($dvalue)), // This will be the month minus one, so we add one.
date('d', strtotime($dvalue)),
date('H', strtotime($dvalue)),
date('i', strtotime($dvalue)),
date('s', strtotime($dvalue))
);
$new_schedule = new DateTime( $ymd );
return $new_schedule;
}
add_filter( 'the_excerpt_rss', 'dpProEventCalendar_rss_feed' );
add_filter( 'the_content_feed', 'dpProEventCalendar_rss_feed' );
function dpProEventCalendar_rss_feed( $content )
{
global $wp_query;
$post_id = $wp_query->post->ID;
$post_type = get_post_type( $post_id );
if( $post_type == DP_PRO_EVENT_CALENDAR_EVENT_POST_TYPE )
{
$post_thumbnail_id = get_post_thumbnail_id( $post_id );
$image_attributes = wp_get_attachment_image_src( $post_thumbnail_id, 'large' );
$content = '<img src="'.$image_attributes[0].'" alt="" />' . $content;
}
return $content;
}
function dpProEventCalendar_fetch_media( $file_url, $post_id )
{
require_once( ABSPATH . 'wp-admin/includes/image.php' );
global $wpdb;
if( ! $post_id )
return false;
//directory to import to
$artDir = '/importedmedia/';
$uploads = wp_upload_dir();
$upload_basedir = $uploads['basedir'];
$upload_baseurl = $uploads['baseurl'];
//if the directory doesn't exist, create it
if( !file_exists( $upload_basedir.$artDir ) )
mkdir( $upload_basedir . $artDir );
//rename the file... alternatively, you could explode on "/" and keep the original file name
$file_url_tmp = strtok( $file_url, '?' );
$ext = preg_replace( '/\?.*/', '', array_pop(explode(".", $file_url_tmp)) );
if( $ext != "jpg" && $ext != "png" && $ext != "gif" )
return false;
$new_filename = 'event-' . $post_id . "." . $ext; //if your post has multiple files, you may need to add a random number to the file name to prevent overwrites
$opts = array(
"ssl"=>array(
"cafile" => dirname(__FILE__)."/includes/Facebook/fb_ca_chain_bundle.crt",
"verify_peer"=> true,
"verify_peer_name"=> true,
),
);
$context = stream_context_create( $opts );
if( ini_get('allow_url_fopen') ) {
if(!copy($file_url, $upload_basedir.$artDir.$new_filename, $context))
{
/*$errors= error_get_last();
echo "COPY ERROR: ".$errors['type'];
echo "<br />\n".$errors['message'];*/
} else {
//echo "File copied from remote!";
}
} else {
//echo 'CURL';
$ch = curl_init();
$fp = fopen ( $upload_basedir . $artDir . $new_filename, 'w+' );
$ch = curl_init( $file_url );
curl_setopt( $ch, CURLOPT_TIMEOUT, 50 );
curl_setopt( $ch, CURLOPT_FILE, $fp );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 );
curl_setopt( $ch, CURLOPT_ENCODING, "" );
curl_exec( $ch );
curl_close( $ch );
fclose( $fp );
}
$siteurl = get_option( 'siteurl' );
$file_info = getimagesize( $upload_basedir . $artDir . $new_filename );
//create an array of attachment data to insert into wp_posts table
$artdata = array();
$artdata = array(
'post_date' => current_time('mysql'),
'post_date_gmt' => current_time('mysql'),
'post_title' => $new_filename,
'post_status' => 'inherit',
'comment_status' => 'closed',
'ping_status' => 'closed',
'post_name' => sanitize_title_with_dashes(str_replace("_", "-", $new_filename)),
'post_modified' => current_time('mysql'),
'post_modified_gmt' => current_time('mysql'),
'post_parent' => $post_id,
'post_type' => 'attachment',
'guid' => $upload_baseurl.$artDir.$new_filename,
'post_mime_type' => $file_info['mime'],
'post_excerpt' => '',
'post_content' => ''
);
$save_path = $uploads['basedir'] . '/importedmedia/' . $new_filename;
//insert the database record
$attach_id = wp_insert_attachment( $artdata, $save_path, $post_id );
//generate metadata and thumbnails
if( function_exists( "wp_generate_attachment_metadata" ) ) {
if ( $attach_data = wp_generate_attachment_metadata( $attach_id, $save_path ) )
wp_update_attachment_metadata( $attach_id, $attach_data );
}
//optional make it the featured image of the post it's attached to
$rows_affected = $wpdb->insert( $wpdb->prefix . 'postmeta', array( 'post_id' => $post_id, 'meta_key' => '_thumbnail_id', 'meta_value' => $attach_id ) );
return true;
}
function dpProEventCalendar_date_i18n( $format, $timestamp = "", $no_default = false )
{
if( $timestamp == "" )
{
if($no_default)
return '';
$timestamp = time();
}
$i18n = date( $format, $timestamp );
$i18n = str_replace( "January", __('January', 'dpProEventCalendar' ), $i18n );
$i18n = str_replace( "February", __('February', 'dpProEventCalendar' ), $i18n );
$i18n = str_replace( "March", __('March', 'dpProEventCalendar' ), $i18n );
$i18n = str_replace( "April", __('April', 'dpProEventCalendar' ), $i18n );
$i18n = str_replace( "May", __('May', 'dpProEventCalendar' ), $i18n );
$i18n = str_replace( "June", __('June', 'dpProEventCalendar' ), $i18n );
$i18n = str_replace( "July", __('July', 'dpProEventCalendar' ), $i18n );
$i18n = str_replace( "August", __('August', 'dpProEventCalendar' ), $i18n );
$i18n = str_replace( "September", __('September', 'dpProEventCalendar' ), $i18n );
$i18n = str_replace( "October", __('October', 'dpProEventCalendar' ), $i18n );
$i18n = str_replace( "November", __('November', 'dpProEventCalendar' ), $i18n );
$i18n = str_replace( "December", __('December', 'dpProEventCalendar' ), $i18n );
return $i18n;
}
function dpProEventCalendar_archive_template( $archive_template )
{
global $post, $dpProEventCalendar;
if ( is_post_type_archive ( DP_PRO_EVENT_CALENDAR_EVENT_POST_TYPE ) )
{
if($dpProEventCalendar['redirect_archive'] != "") {
wp_redirect($dpProEventCalendar['redirect_archive']);
die();
}
}
return $archive_template;
}
add_filter( 'archive_template', 'dpProEventCalendar_archive_template' ) ;
function dpProEventCalendar_get_permalink($id)
{
if( function_exists( 'icl_object_id' ) )
$id = icl_object_id($id, get_post_type($id), true);
$use_link = get_post_meta( $id, 'pec_use_link', true );
$link = get_post_meta( $id, 'pec_link', true );
if( $use_link && $link != "" )
{
if( substr( $link, 0, 4 ) != "http" && substr( $link, 0, 4 ) != "mail" )
$link = 'https://'.trim( $link );
return trim( $link );
} else {
return get_permalink( $id );
}
}
function dpProEventCalendar_getEventTimezone( $event_id, $parse_offset = false )
{
$event_timezone = get_post_meta( $event_id, 'pec_timezone', true );
if( $event_timezone == "" )
{
$current_offset = get_option('gmt_offset');
$tzstring = get_option('timezone_string');
if ( empty($tzstring) )
{ // Create a UTC+- zone if no timezone string exists
$check_zone_info = false;
if ( 0 == $current_offset )
$tzstring = 'UTC+0';
elseif ($current_offset < 0)
$tzstring = 'UTC' . $current_offset;
else
$tzstring = 'UTC+' . $current_offset;
}
$event_timezone = $tzstring;
}
if($parse_offset)
$event_timezone = dpProEventCalendar_parseOffset( $event_timezone );
$event_timezone = str_replace(array('America/', 'Europe/', 'Africa/', 'Asia/', 'Antarctica/'), '', $event_timezone);
$event_timezone = str_replace('/', ' / ', $event_timezone);
$event_timezone = str_replace('_', ' ', $event_timezone);
return $event_timezone;
}
function dpProEventCalendar_parseOffset ( $offset )
{
if( strpos( $offset, "UTC" ) === false )
{
$dateTimeZone = new DateTimeZone($offset);
$dateTime = new DateTime("now");
//xxx
$parsed = $dateTimeZone->getOffset($dateTime);
if( is_numeric( $parsed ) )
{
$negative = false;
if( strpos( $parsed, "-" ) !== false ) {
$parsed = str_replace('-', '', $parsed);
$negative = true;
}
$parsed = $parsed / 3600;
$parsed = (double)$parsed * 60;
if( $negative )
$parsed = "+".$parsed;
else
$parsed = "-".$parsed;
} else
$parsed = 0;
} else {
$parsed = str_replace( array( 'UTC+', 'UTC-' ), '', $offset );
$parsed = (double)$parsed * 60;
if( strpos( $offset, "UTC-" ) !== false )
$parsed = "+".$parsed;
else
$parsed = "-".$parsed;
}
return $parsed;
}
function dpProEventCalendar_is_ampm()
{
if( strpos( get_option('time_format'), "A") !== false || strpos(get_option( 'time_format' ), "a" ) !== false )
return true;
else
return false;
}
function dpProEventCalendar_removeExpiredEvents()
{
global $dpProEventCalendar, $dpProEventCalendar_cache;
$post_status = $dpProEventCalendar['remove_expired_status'];
if( $post_status == '' )
$post_status = 'publish';
$expire_after = $dpProEventCalendar['remove_expired_days'];
if( $expire_after == '' || !is_numeric($expire_after) || $expire_after < 0 )
$expire_after = 10;
$force_removal = false;
if( $dpProEventCalendar['remove_expired_completly'] == 'remove' )
$force_removal = true;
$expired_events = array();
// Get Events which end date is set and it is in the past
$args = array(
'posts_per_page' => -1,
'post_type' => DP_PRO_EVENT_CALENDAR_EVENT_POST_TYPE,
'post_status' => $post_status,
"meta_query" =>
array(
array(
'relation' => 'AND',
array(
'key' => 'pec_end_date',
'value' => '',
'compare' => '!='
),
array(
'key' => 'pec_end_date',
'value' => date( 'Y-m-d', strtotime( current_time( 'Y-m-d' ) . ' -'.$expire_after.' days' ) ),
'compare' => '<',
'type' => 'DATETIME'
)
)
)
);
$expired_events = array_merge( get_posts( $args ), $expired_events );
// Get events that end date is not set and the date is in the past and is not recurrent
$args = array(
'posts_per_page' => -1,
'post_type' => DP_PRO_EVENT_CALENDAR_EVENT_POST_TYPE,
'post_status' => $post_status,
"meta_query" =>
array(
array(
'relation' => 'AND',
array(
'key' => 'pec_end_date',
'value' => '',
'compare' => '='
),
array(
'key' => 'pec_date',
'value' => date('Y-m-d H:i:s', strtotime(current_time( 'Y-m-d H:i:s' ) . ' -'.$expire_after.' days')),
'compare' => '<',
'type' => 'DATETIME'
),
array(
'relation' => 'OR',
array(
'key' => 'pec_recurring_frecuency',
'value' => '0',
'compare' => '='
),
array(
'key' => 'pec_recurring_frecuency',
'value' => '',
'compare' => '='
)
)
)
)
);
$expired_events = array_merge( get_posts( $args ), $expired_events );
if( is_array( $expired_events ) )
{
foreach( $expired_events as $key ) {
wp_delete_post( $key->ID, $force_removal );
}
if( isset( $dpProEventCalendar_cache ) ) {
$dpProEventCalendar_cache = array();
update_option( 'dpProEventCalendar_cache', $dpProEventCalendar_cache );
}
}
}
/**
* Get the value of the Rest field
*
* @param array $object Details of current post.
* @param string $field_name Name of field.
* @param WP_REST_Request $request Current request
*
* @return mixed
*/
function dpProevEntCalendar_get_field_rest( $object, $field_name, $request )
{
if($field_name == "pec_venue_map_lnlat" && $object['type'] == DP_PRO_EVENT_CALENDAR_EVENT_POST_TYPE)
{
$location_id = get_post_meta( $object[ 'id' ], 'pec_location', true );
if(is_numeric($location_id))
return get_post_meta( $location_id, $field_name, true );
}
return get_post_meta( $object[ 'id' ], $field_name, true );
}
function dpProevEntCalendar_get_image_rest( $object, $field_name, $request )
{
$post_thumbnail_id = get_post_thumbnail_id( $object[ 'id' ] );
$image_attributes = wp_get_attachment_image_src( $post_thumbnail_id, 'large' );
if(!empty($image_attributes))
return $image_attributes[0];
else
return '';
}
function dpProEventCalendar_tz_offset_to_name( $offset )
{
$offset *= 3600; // convert hour offset to seconds
$abbrarray = timezone_abbreviations_list();
foreach ($abbrarray as $abbr)
{
foreach ($abbr as $city)
{
if ($city['offset'] == $offset)
return $city['timezone_id'];
}
}
return false;
}
function dpProEventCalendar_mailchimp_curl_connect( $url, $request_type, $api_key, $data = array() )
{
if( $request_type == 'GET' )
$url .= '?' . http_build_query($data);
$mch = curl_init();
$headers = array(
'Content-Type: application/json',
'Authorization: Basic '.base64_encode( 'user:'. $api_key )
);
curl_setopt($mch, CURLOPT_URL, $url );
curl_setopt($mch, CURLOPT_HTTPHEADER, $headers);
//curl_setopt($mch, CURLOPT_USERAGENT, 'PHP-MCAPI/2.0');
curl_setopt($mch, CURLOPT_RETURNTRANSFER, true); // do not echo the result, write it into variable
curl_setopt($mch, CURLOPT_CUSTOMREQUEST, $request_type); // according to MailChimp API: POST/GET/PATCH/PUT/DELETE
curl_setopt($mch, CURLOPT_TIMEOUT, 10);
curl_setopt($mch, CURLOPT_SSL_VERIFYPEER, false); // certificate verification for TLS/SSL connection
if( $request_type != 'GET' )
{
curl_setopt($mch, CURLOPT_POST, true);
curl_setopt($mch, CURLOPT_POSTFIELDS, json_encode($data) ); // send data in json
}
return curl_exec($mch);
}
add_action( 'admin_post_dpProEventCalendar_facebook_authorize_action', 'dpProEventCalendar_facebook_authorize_user' );
add_action( 'admin_post_dpProEventCalendar_facebook_authorize_callback', 'dpProEventCalendar_facebook_authorize_user_callback' );
function dpProEventCalendar_facebook_authorize_user ()
{
global $dpProEventCalendar;
//if ( ! empty( $_POST ) && isset( $_POST['dpProEventCalendar_facebook_authorize_nonce'] ) && wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['dpProEventCalendar_facebook_authorize_nonce'] ) ), 'dpProEventCalendar_facebook_authorize_action' ) ) { // input var okay.
$dpProEventCalendar_options = $dpProEventCalendar;
$app_id = isset( $dpProEventCalendar_options['facebook_app_id'] ) ? $dpProEventCalendar_options['facebook_app_id'] : '';
$app_secret = isset( $dpProEventCalendar_options['facebook_app_secret'] ) ? $dpProEventCalendar_options['facebook_app_secret'] : '';
$redirect_url = admin_url( 'admin-post.php?action=dpProEventCalendar_facebook_authorize_callback' );
$api_version = 'v3.0';
$param_url = rawurlencode( $redirect_url );
$dpProEventCalendar_session_state = md5( uniqid( rand(), true ) ); // phpcs:ignore WordPress.WP.AlternativeFunctions.rand_rand
setcookie( 'dpProEventCalendar_session_state', $dpProEventCalendar_session_state, '0', '/' );
if ( ! empty( $app_id ) && ! empty( $app_secret ) ) {
$dialog_url = 'https://www.facebook.com/' . $api_version . '/dialog/oauth?client_id='
. $app_id . '&redirect_uri=' . $param_url . '&state='
. $dpProEventCalendar_session_state . '&scope=groups_access_member_info,user_events,pages_show_list';
//die('action ok'.$dialog_url);
header( 'Location: ' . $dialog_url );
} else {
die( esc_attr__( 'Please insert Facebook App ID and Secret.', 'dpProEventCalendar' ) );
}
//} else {
// die( esc_attr__( 'You have not access to do this operation.', 'dpProEventCalendar' ) );
//}
}
function dpProEventCalendar_facebook_authorize_user_callback ()
{
global $dpProEventCalendar;
if ( isset( $_COOKIE['dpProEventCalendar_session_state'] ) && isset( $_REQUEST['state'] ) && ( sanitize_text_field( wp_unslash( $_REQUEST['state'] ) ) === $_COOKIE['dpProEventCalendar_session_state'] ) ) { // input var okay.
// phpcs:ignore WordPress.Security.NonceVerification
$code = isset( $_GET['code'] ) ? sanitize_text_field( wp_unslash( $_GET['code'] ) ) : ''; // input var okay.
$dpProEventCalendar_options = $dpProEventCalendar;
$app_id = isset( $dpProEventCalendar_options['facebook_app_id'] ) ? $dpProEventCalendar_options['facebook_app_id'] : '';
$app_secret = isset( $dpProEventCalendar_options['facebook_app_secret'] ) ? $dpProEventCalendar_options['facebook_app_secret'] : '';
$redirect_url = admin_url( 'admin-post.php?action=dpProEventCalendar_facebook_authorize_callback' );
$api_version = 'v3.0';
$param_url = rawurlencode( $redirect_url );
if ( ! empty( $app_id ) && ! empty( $app_secret ) ) {
$token_url = 'https://graph.facebook.com/' . $api_version . '/oauth/access_token?'
. 'client_id=' . $app_id . '&redirect_uri=' . $param_url
. '&client_secret=' . $app_secret . '&code=' . $code;
$access_token = '';
$dpProEventCalendar_user_token_options = array();
$dpProEventCalendar_fb_authorize_user = array();
$response = wp_remote_get( $token_url );
$body = wp_remote_retrieve_body( $response );
$body_response = json_decode( $body );
if ( ! empty( $body ) && isset( $body_response->access_token ) ) {
$access_token = $body_response->access_token;
$dpProEventCalendar_user_token_options['authorize_status'] = 1;
$dpProEventCalendar_user_token_options['access_token'] = sanitize_text_field( $access_token );
update_option( 'dpProEventCalendar_user_token_options', $dpProEventCalendar_user_token_options );
$profile_call = wp_remote_get( 'https://graph.facebook.com/' . $api_version . "/me?fields=id,name,picture&access_token=$access_token" );
$profile = wp_remote_retrieve_body( $profile_call );
$profile = json_decode( $profile );
if ( isset( $profile->id ) && isset( $profile->name ) ) {
$dpProEventCalendar_fb_authorize_user['ID'] = sanitize_text_field( $profile->id );
$dpProEventCalendar_fb_authorize_user['name'] = sanitize_text_field( $profile->name );
if ( isset( $profile->picture->data->url ) ) {
$dpProEventCalendar_fb_authorize_user['avtar'] = esc_url_raw( $profile->picture->data->url );
}
}
update_option( 'dpProEventCalendar_fb_authorize_user', $dpProEventCalendar_fb_authorize_user );
$args = array( 'timeout' => 15 );
$accounts_call = wp_remote_get( 'https://graph.facebook.com/' . $api_version . "/me/accounts?access_token=$access_token&limit=100&offset=0", $args );
$accounts = wp_remote_retrieve_body( $accounts_call );
$accounts = json_decode( $accounts );
$accounts = isset( $accounts->data ) ? $accounts->data : array();
if ( ! empty( $accounts ) ) {
$pages = array();
foreach ( $accounts as $account ) {
$pages[ $account->id ] = array(
'id' => $account->id,
'name' => $account->name,
'access_token' => $account->access_token,
);
}
update_option( 'dpProEventCalendar_fb_user_pages', $pages );
}
$redirect_url = admin_url( 'admin.php?page=dpProEventCalendar-settings&authorize=1' );
wp_safe_redirect( $redirect_url );
exit();
} else {
$redirect_url = admin_url( 'admin.php?page=dpProEventCalendar-settings&authorize=0' );
wp_safe_redirect( $redirect_url );
exit();
}
} else {
$redirect_url = admin_url( 'admin.php?page=dpProEventCalendar-settings&authorize=2' );
wp_safe_redirect( $redirect_url );
exit();
}
} else {
die( esc_attr__( 'You have not access to do this operation.', 'dpProEventCalendar' ) );
}
}
function dpProEventCalendar_has_authorized_user_token ()
{
$dpProEventCalendar_user_token_options = get_option( 'dpProEventCalendar_user_token_options', array() );
if ( ! empty( $dpProEventCalendar_user_token_options ) )
{
$authorize_status = isset( $dpProEventCalendar_user_token_options['authorize_status'] ) ? $dpProEventCalendar_user_token_options['authorize_status'] : 0;
$access_token = isset( $dpProEventCalendar_user_token_options['access_token'] ) ? $dpProEventCalendar_user_token_options['access_token'] : '';
if ( 1 === $authorize_status && ! empty( $access_token ) )
return true;
}
return false;
}
function dpProEventCalendar_get_user_role ()
{
global $current_user;
$user_roles = $current_user->roles;
$user_role = array_shift($user_roles);
return $user_role;
}
function dpProeventCalendar_generate_code( $length = 11 )
{
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$password = '';
for ( $i = 0; $i < $length; $i++ )
{
$password .= substr( $chars, wp_rand( 0, strlen( $chars ) - 1 ), 1 );
}
return $password;
}
function dpProEventCalendar_getBookingInfo( $booking_id )
{
global $wpdb;
$querystr = "
SELECT *
FROM " . DP_PRO_EVENT_CALENDAR_TABLE_BOOKING . "
WHERE id = %d";
$booking = $wpdb->get_row( $wpdb->prepare( $querystr, $booking_id ), OBJECT);
return $booking;
}
?>