Settings > Import page * @category Settings API * @author wpdevelop * * @web-site https://wpbookingcalendar.com/ * @email info@wpbookingcalendar.com * @modified 2016-08-07 * * This is COMMERCIAL SCRIPT * We are not guarantee correct work and support of Booking Calendar, if some file(s) was modified by someone else then wpdevelop. */ if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly /** API for Settings Page */ class WPBC_API_SettingsImportGCal extends WPBC_Settings_API { /** * Settings API Constructor * During creation, system try to load values from DB, if exist. * * @param type $id - "Pure Name" */ public function __construct( $id, $init_fields_values = array(), $options = array() ) { $default_options = array( 'db_prefix_option' => '' , 'db_saving_type' => 'separate' ); // separate_prefix: update_bk_option( $this->options['db_prefix_option'] . $settings_id . '_' . $field_name , $value ); $options = wp_parse_args( $options, $default_options ); /** * Activation and deactivation of these options already done at the wpbc-gcal.php file // // add_bk_action( 'wpbc_other_versions_activation', array( $this, 'activate' ) ); // Activate // add_bk_action( 'wpbc_other_versions_deactivation', array( $this, 'deactivate' ) ); // Deactivate */ parent::__construct( $id, $options, $init_fields_values ); // Define ID of Setting page and options } /** Define settings Fields */ public function init_settings_fields() { $this->fields = array(); // Auto import if ( wpbc_is_mu_user_can_be_here('only_super_admin') ){ $this->fields['booking_gcal_auto_import_is_active'] = array( 'type' => 'checkbox' , 'default' => 'Off' , 'title' => __( 'Activate auto import', 'booking' ) /* translators: 1: ... */ , 'label' => sprintf( __( 'Check this box to %1$sactivate%2$s auto import events and creation bookings from them', 'booking' ),'','') , 'description' => '' , 'group' => 'auto_import' ); // $options = array(); // $options[1] = '1 ' . __( 'hour', 'booking' ); // for ( $i = 2; $i < 24; $i++ ) { // $options[$i] = $i . ' ' . __( 'hours', 'booking' ); // } // $options[24] = '1 ' . __( 'day', 'booking' ); // for ( $i = 2; $i < 32; $i++ ) { // $options[( $i * 24)] = $i . ' ' . __( 'days', 'booking' ); // } // Fix for legacy code (previously) was only integer value here in hours $legacy_booking_gcal_auto_import_time = get_bk_option( 'booking_gcal_auto_import_time' ); if ( ( false === strpos( $legacy_booking_gcal_auto_import_time, 'm' ) ) && ( false === strpos( $legacy_booking_gcal_auto_import_time, 'd' ) ) ) { update_bk_option( 'booking_gcal_auto_import_time', strval( intval( $legacy_booking_gcal_auto_import_time ) * 60 ) . 'm' ); } // Options $extra_time = array(); foreach ( range( 15, 55, 15 ) as $extra_num ) { // Each 5 minutes $extra_time[ $extra_num . 'm' ] = $extra_num . ' ' . __( 'minutes', 'booking' ); } $extra_time[ '60' . 'm' ] = '1 ' . __( 'hour', 'booking' ); foreach ( range( 75, 115, 15 ) as $extra_num ) { // 1 hour + Each 5 minutes $extra_time[ $extra_num . 'm' ] = '1 ' . __( 'hour', 'booking' ) . ' ' . ( $extra_num - 60 ) . ' ' . __( 'minutes', 'booking' ); } foreach ( range( 120, 1380, 60 ) as $extra_num ) { // Each Hour based on minutes $extra_time[ $extra_num . 'm' ] = ( $extra_num / 60 ) . ' ' . __( 'hours', 'booking' ); } foreach ( range( 1, 30, 1 ) as $extra_num ) { // Each Day $extra_time[ $extra_num . 'd' ] = $extra_num . ' ' . __( 'day(s)', 'booking' ); } $cron_info = ''; $readable_time_of_next_run = WPBC()->cron->get_readable_time_of_last_run( 'wpbc_import_gcal' ); if ( ! empty( $readable_time_of_next_run ) ) { $cron_info .= '
' . esc_html__( 'Last import', 'booking' ) . ': ' . $readable_time_of_next_run; } $readable_time_of_next_run = WPBC()->cron->get_readable_time_of_next_run( 'wpbc_import_gcal', ''.__( 'during', 'booking' ).' ' ) . ''; if ( ! empty( $readable_time_of_next_run ) ) { $cron_info .= '
' . esc_html__( 'Next import', 'booking' ) . ': ' . $readable_time_of_next_run; } // $active_tasks_arr = WPBC()->cron->get_active_tasks_info(); // if ( ! empty( $active_tasks_arr['wpbc_import_gcal'] ) ) { // $cron_info .= '
' . esc_html__( 'Last import', 'booking' ) . ': ' . $active_tasks_arr['wpbc_import_gcal']['last_time__run__local']; // $cron_info .= '
' . esc_html__( 'Next import', 'booking' ) . ': ' . $active_tasks_arr['wpbc_import_gcal']['next_time__run__local']; // $cron_info .= ' ' . __( 'during', 'booking' ) . ': ' . wpbc_get_readable_time_interval( $active_tasks_arr['wpbc_import_gcal']['next_run_after_seconds'] ) . ' '; // } $this->fields['booking_gcal_auto_import_time'] = array( 'type' => 'select' , 'default' => '24' , 'title' => __('Import events every' ,'booking') , 'description' => __('Select time duration of import requests.' ,'booking') . $cron_info , 'description_tag' => 'span' , 'css' => '' , 'options' => $extra_time , 'tr_class' => 'wpbc_sub_settings_grayed wpbc_tr_auto_import' , 'group' => 'auto_import' ); } //////////////////////////////////////////////////////////////////////// // General Google Calendar Settings $this->fields['booking_gcal_api_key'] = array( 'type' => 'text' , 'default' => '' //, 'placeholder' => '' , 'title' => __('Google API Key', 'booking') , 'description' => __('Please enter your Google API key. This field required to import events.' ,'booking') . '
' . __('Note:' ,'booking') . ' ' /* translators: 1: ... */ . sprintf( __( 'You can check in this %1$sinstruction how to generate and use your Google API key%2$s.', 'booking' ) , '' ,'' ) . '
' . ( ( wpbc_is_this_demo() ) ? wpbc_get_warning_text_in_demo_mode() : '' ) , 'description_tag' => 'p' , 'css' => ''//'width:100%' , 'group' => 'general' , 'tr_class' => '' // 'wpbc_sub_settings_grayed' //, 'validate_as' => array( 'required' ) , 'is_demo_safe' => wpbc_is_this_demo() ); // General Google ID for Free version if ( ! class_exists('wpdev_bk_personal') ) $this->fields['booking_gcal_feed'] = array( 'type' => 'text' , 'default' => '' //, 'placeholder' => '' , 'title' => __('Google Calendar ID', 'booking') , 'description' => ( ( wpbc_is_this_demo() ) ? wpbc_get_warning_text_in_demo_mode() : '' ) , 'description_tag' => 'span' , 'css' => 'width:100%' , 'group' => 'general' , 'tr_class' => '' // 'wpbc_sub_settings_grayed' //, 'validate_as' => array( 'required' ) , 'is_demo_safe' => wpbc_is_this_demo() ); //////////////////////////////////////////////////////////////////////// // M A X num - Default Settings $this->fields['booking_gcal_events_max'] = array( 'type' => 'text' , 'default' => '25' //, 'placeholder' => '' , 'title' => __('Maximum number', 'booking') , 'description' => __('You can specify the maximum number of events to import during one session.' ,'booking') , 'description_tag' => 'span' , 'css' => 'width:4em' , 'group' => 'default_settings' , 'tr_class' => '' // 'wpbc_sub_settings_grayed' //, 'validate_as' => array( 'required' ) ); // F R O M ///////////////////////////////////////////////////////// $options = array( "now" => __('Now' ,'booking') , "today" => __('00:00 today' ,'booking') , "week" => __('Start of current week' ,'booking') , "month-start" => __('Start of current month' ,'booking') , "month-end" => __('End of current month' ,'booking') , "any" => __('The start of time' ,'booking') , "date" => __('Specific date / time' ,'booking') ); $this->fields['booking_gcal_events_from'] = array( 'type' => 'select' , 'default' => 'month-start' , 'title' => __('From', 'booking') , 'description' => __('Select option, when to start retrieving events.' ,'booking') , 'description_tag' => 'span' , 'css' => '' , 'options' => $options , 'group' => 'default_settings' ); ///////////// $this->fields['booking_gcal_events_from_offset_html_prefix'] = array( 'type' => 'pure_html' , 'group' => 'default_settings' , 'html' => '
' ); $this->fields['booking_gcal_events_from_offset'] = array( 'type' => 'text' , 'default' => '' //, 'placeholder' => '' , 'title' => '' , 'description' => '' , 'description_tag' => 'span' , 'css' => 'width:6em;height:28px;margin:0;vertical-align:middle;' , 'group' => 'default_settings' , 'tr_class' => 'wpbc_sub_settings_grayed wpbc_tr_from_offset' , 'only_field' => true ); $option_types = array( 'second' => __('seconds' ,'booking') , 'minute' => __('minutes' ,'booking') , 'hour' => __('hours' ,'booking') , 'day' => __('days' ,'booking') ); $this->fields['booking_gcal_events_from_offset_type'] = array( 'type' => 'select' , 'default' => '' , 'title' => '' , 'description' => '' , 'description_tag' => 'span' , 'css' => '' , 'options' => $option_types , 'group' => 'default_settings' , 'class' => 'wpbc_offset_value' , 'tr_class' => 'wpbc_sub_settings_grayed' , 'only_field' => true ); $this->fields['booking_gcal_events_from_offset_html_sufix'] = array( 'type' => 'pure_html' , 'group' => 'default_settings' , 'html' => ' ' . __('You can specify an additional offset from you chosen start point. The offset can be negative.' ,'booking') . ' ' /* translators: 1: ... */ . sprintf( __( 'Type your date in format %1$s. Example: %2$s', 'booking' ), 'Y-m-d', '' . date_i18n( 'Y-m-d' ) . '' ) . '
' ); ///////////// // U N T I L ///////////////////////////////////////////////////// $options = array( "now" => __('Now' ,'booking') , "today" => __('00:00 today' ,'booking') , "week" => __('Start of current week' ,'booking') , "month-start" => __('Start of current month' ,'booking') , "month-end" => __('End of current month' ,'booking') , "any" => __('The end of time' ,'booking') , "date" => __('Specific date / time' ,'booking') ); $this->fields['booking_gcal_events_until'] = array( 'type' => 'select' , 'default' => 'any' , 'title' => __('Until', 'booking') , 'description' => __('Select option, when to stop retrieving events.' ,'booking') , 'description_tag' => 'span' , 'css' => '' , 'options' => $options , 'group' => 'default_settings' ); ///////////// $this->fields['booking_gcal_events_until_offset_html_prefix'] = array( 'type' => 'pure_html' , 'group' => 'default_settings' , 'html' => '
' ); $this->fields['booking_gcal_events_until_offset'] = array( 'type' => 'text' , 'default' => '' //, 'placeholder' => '' , 'title' => '' , 'description' => '' , 'description_tag' => 'span' , 'css' => 'width:6em;height:28px;margin:0;vertical-align:middle;' , 'group' => 'default_settings' , 'tr_class' => 'wpbc_sub_settings_grayed wpbc_tr_until_offset' , 'only_field' => true ); $option_types = array( 'second' => __('seconds' ,'booking') , 'minute' => __('minutes' ,'booking') , 'hour' => __('hours' ,'booking') , 'day' => __('days' ,'booking') ); $this->fields['booking_gcal_events_until_offset_type'] = array( 'type' => 'select' , 'default' => '' , 'title' => '' , 'description' => '' , 'description_tag' => 'span' , 'css' => '' , 'options' => $option_types , 'group' => 'default_settings' , 'class' => 'wpbc_offset_value' , 'tr_class' => 'wpbc_sub_settings_grayed' , 'only_field' => true ); $this->fields['booking_gcal_events_until_offset_html_sufix'] = array( 'type' => 'pure_html' , 'group' => 'default_settings' , 'html' => ' ' . __('You can specify an additional offset from you chosen start point. The offset can be negative.' ,'booking') . ' ' /* translators: 1: ... */ . sprintf( __( 'Type your date in format %1$s. Example: %2$s', 'booking' ), 'Y-m-d', '' . date_i18n( 'Y-m-d' ) . '' ) . '
' ); ///////////// //////////////////////////////////////////////////////////////////////// // Help $this->fields['booking_gcal_events_help'] = array( 'type' => 'help' , 'value' => array() , 'cols' => 2 , 'group' => 'help' ); $this->fields['booking_gcal_events_help']['value'][] = '

01. ' . __('To get Google Calendar API key please follow this instruction' ,'booking') . ':

'; $this->fields['booking_gcal_events_help']['value'][] = '
    '; /* translators: 1: ... */ $this->fields['booking_gcal_events_help']['value'][] = '
  1. ' . sprintf(__( 'Go to Google Developer Console: %s.' ,'booking'),'https://console.developers.google.com') . '
  2. '; $this->fields['booking_gcal_events_help']['value'][] = '
  3. ' . sprintf(__('Give your project a name and click "Create".' ,'booking')) . '
  4. '; $this->fields['booking_gcal_events_help']['value'][] = '
  5. ' . sprintf(__('In the sidebar click on "APIs & auth".' ,'booking')) . '
  6. '; $this->fields['booking_gcal_events_help']['value'][] = '
  7. ' . sprintf(__('Click APIs and make sure "Calendar API" is set to ON.' ,'booking')) . '
  8. '; $this->fields['booking_gcal_events_help']['value'][] = '
  9. ' . sprintf(__('Now click on "Credentials" in the sidebar.' ,'booking')) . '
  10. '; $this->fields['booking_gcal_events_help']['value'][] = '
  11. ' . sprintf(__('Under the section "Public API access" click the button "Create new Key".' ,'booking')) . '
  12. '; $this->fields['booking_gcal_events_help']['value'][] = '
  13. ' . sprintf(__('On the popup click the button "Server Key" and click "Create".' ,'booking')) . '
  14. '; /* translators: 1: ... */ $this->fields['booking_gcal_events_help']['value'][] = '
  15. ' . sprintf( __( 'You will now see a table loaded with the top item being the API Key. Copy this and paste it into %1$sGoogle API Key%2$s field at this page.', 'booking' ),'','') . '
  16. '; $this->fields['booking_gcal_events_help']['value'][] = '
'; $this->fields['booking_gcal_events_help']['value'][] = '

02. ' . __('Set Your Calendar to Public' ,'booking') . ':

'; $this->fields['booking_gcal_events_help']['value'][] = '
    '; $this->fields['booking_gcal_events_help']['value'][] = '
  1. ' . sprintf(__('Navigate to your Google calendars.' ,'booking'),'https://console.developers.google.com') . '
  2. '; $this->fields['booking_gcal_events_help']['value'][] = '
  3. ' . sprintf(__('Open the settings for the calendar.' ,'booking')) . '
  4. '; $this->fields['booking_gcal_events_help']['value'][] = '
  5. ' . sprintf(__('Click the "Share this Calendar" link.' ,'booking')) . '
  6. '; $this->fields['booking_gcal_events_help']['value'][] = '
  7. ' . sprintf(__('Click the checkbox to make calendar public. Do not check the other option.' ,'booking')) . '
  8. '; $this->fields['booking_gcal_events_help']['value'][] = '
'; $this->fields['booking_gcal_events_help']['value'][] = '

03. ' . __('Find Your Calendar ID' ,'booking') . ':

'; $this->fields['booking_gcal_events_help']['value'][] = '
    '; $this->fields['booking_gcal_events_help']['value'][] = '
  1. ' . sprintf(__('Navigate to your Google calendars.' ,'booking'),'https://console.developers.google.com') . '
  2. '; $this->fields['booking_gcal_events_help']['value'][] = '
  3. ' . sprintf(__('Open the settings for the calendar.' ,'booking')) . '
  4. '; /* translators: 1: ... */ $this->fields['booking_gcal_events_help']['value'][] = '
  5. ' . sprintf( __( 'Now copy the Calendar ID to use in the plugin settings in your WordPress admin. Make sure to %1$suse the Calendar ID only, not the entire XML feed URL%2$s.', 'booking' ),'','') . '
  6. '; $this->fields['booking_gcal_events_help']['value'][] = '
'; //////////////////////////////////////////////////////////////////////// } } /** * Show Content * Update Content * Define Slug * Define where to show */ class WPBC_Page_SettingsImportGCal extends WPBC_Page_Structure { public $settings_api = false; /** * API - for Fields of this Settings Page * * @param array $init_fields_values - array of init form fields data - this array can ovveride "default" fields and loaded data. * @return object API */ public function get_api( $init_fields_values = array() ){ if ( $this->settings_api === false ) { $this->settings_api = new WPBC_API_SettingsImportGCal( 'import_gcal' , $init_fields_values ); } return $this->settings_api; } public function in_page() { return 'wpbc-settings'; } public function tabs() { $tabs = array(); $tabs[ 'sync' ] = array( 'title' => __( 'Sync', 'booking') // Title of TAB , 'page_title'=> __( 'Sync', 'booking') // Title of Page , 'hint' => __('Import' ,'booking') . ' / ' . __('Export' ,'booking') //, 'link' => '' // Can be skiped, then generated link based on Page and Tab tags. Or can be extenral link //, 'position' => '' // 'left' || 'right' || '' //, 'css_classes'=> '' // CSS class(es) //, 'icon' => '' // Icon - link to the real PNG img , 'font_icon' => 'wpbc_icn_sync_alt' // CSS definition of forn Icon //, 'default' => false // Is this tab activated by default or not: true || false. //, 'disabled' => false // Is this tab disbaled: true || false. //, 'hided' => false // Is this tab hided: true || false. , 'subtabs' => array() ); $subtabs = array(); $subtabs[ 'gcal' ] = array( 'type' => 'subtab' // Required| Possible values: 'subtab' | 'separator' | 'button' | 'goto-link' | 'html' , 'title' => __('Import Google Calendar', 'booking') //__('Google Calendar' ,'booking') . ' - ' . __('Events Import' ,'booking') // Title of TAB , 'page_title' => __('Import Google Calendar Events', 'booking') //__('Import Settings' ,'booking') // Title of Page , 'hint' => __('Set up and configure the import of Google Calendar events using the API.' ,'booking') // Hint , 'link' => '' // link , 'position' => '' // 'left' || 'right' || '' , 'css_classes' => '' // CSS class(es) //, 'icon' => 'http://.../icon.png' // Icon - link to the real PNG img , 'font_icon' => 'wpbc-bi-google' // CSS definition of Font Icon , 'default' => false // Is this sub tab activated by default or not: true || false. , 'disabled' => false // Is this sub tab deactivated: true || false. , 'checkbox' => false // or definition array for specific checkbox: array( 'checked' => true, 'name' => 'feature1_active_status' ) //, 'checkbox' => array( 'checked' => $is_checked, 'name' => 'enabled_active_status' ) , 'content' => 'content' // Function to load as conten of this TAB ); $tabs[ 'sync' ]['subtabs'] = $subtabs; return $tabs; } /** Show Content of Settings page */ public function content() { //$active_tasks_arr = WPBC()->cron->get_active_tasks_info(); //debuge( $active_tasks_arr ); $this->css(); //////////////////////////////////////////////////////////////////////// // Checking //////////////////////////////////////////////////////////////////////// do_action( 'wpbc_hook_settings_page_header', 'import_gcal_settings'); // Define Notices Section and show some static messages, if needed if ( ! wpbc_is_mu_user_can_be_here('activated_user') ) return false; // Check if MU user activated, otherwise show Warning message. // if ( ! wpbc_is_mu_user_can_be_here('only_super_admin') ) return false; // User is not Super admin, so exit. Basically its was already checked at the bottom of the PHP file, just in case. //////////////////////////////////////////////////////////////////////// // Load Data //////////////////////////////////////////////////////////////////////// $this->get_api(); // Load fields Data from DB //////////////////////////////////////////////////////////////////////// // S u b m i t Main Form //////////////////////////////////////////////////////////////////////// $submit_form_name = 'wpbc_import_gcal'; // Define form name // $this->get_api()->validated_form_id = $submit_form_name; // Define ID of Form for ability to validate fields (like required field) before submit. // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing if ( isset( $_POST['is_form_sbmitted_'. $submit_form_name ] ) ) { // Nonce checking {Return false if invalid, 1 if generated between, 0-12 hours ago, 2 if generated between 12-24 hours ago. } $nonce_gen_time = check_admin_referer( 'wpbc_settings_page_' . $submit_form_name ); // Its stop show anything on submiting, if its not refear to the original page // Save Changes $this->update(); } //////////////////////////////////////////////////////////////////////// // JavaScript: Tooltips, Popover, Datepick (js & css) //////////////////////////////////////////////////////////////////////// echo ''; wpbc_js_for_bookings_page(); echo ''; ?>
'wpbc_booking_resources_search_form' , 'search_get_key' => 'wh_resource_id' , 'is_pseudo' => false ) ); //////////////////////////////////////////////////////////////////////// // Content //////////////////////////////////////////////////////////// ?>
'wh_resource_id' ) ); // FixIn: 8.0.1.12. ?>
get_api()->show( 'general' ); wpbc_close_meta_box_section(); if ( wpbc_is_mu_user_can_be_here('only_super_admin') ){ wpbc_open_meta_box_section( 'wpbc_settings_import_gcal_events_auto_import', __('Auto import events' ,'booking') ); $this->get_api()->show( 'auto_import' ); wpbc_close_meta_box_section(); } wpbc_open_meta_box_section( 'wpbc_settings_import_gcal_events_default_settings', __('Default settings for retrieving events' ,'booking') ); $this->get_api()->show( 'default_settings' ); wpbc_close_meta_box_section(); ?>
get_api()->show( 'help' ); wpbc_close_meta_box_section(); ?>
enqueue_js(); } /** Save Chanages */ public function update() { //debuge($_POST); if ( function_exists( 'wpbc_import_gcal__update') ) wpbc_import_gcal__update(); // Get Validated Email fields $validated_fields = $this->get_api()->validate_post(); $validated_fields = apply_filters( 'wpbc_fields_before_saving_to_db__import_gcal', $validated_fields ); //Hook for validated fields. //debuge($validated_fields); $this->get_api()->save_to_db( $validated_fields ); wpbc_show_changes_saved_message(); // Old way of saving: // update_bk_option( 'booking_cache_expiration' , WPBC_Settings_API::validate_text_post_static( 'booking_cache_expiration' ) ); } //TODO: clear unused CSS here // /** CSS for this page */ private function css() { ?> } add_action('wpbc_menu_created', array( new WPBC_Page_SettingsImportGCal() , '__construct') ); // Executed after creation of Menu /** * Override fields array of Settings page, AFTER saving to DB. Some fields have to have different Values. * Set here values for our pseudo-options, after saving to DB * Because they was not overloading during this saving * * @param array $fields * @param string $page_id * @return array - fields */ function wpbc_fields_after_saving_to_db__import_gcal( $fields, $page_id ) { if ( $page_id == 'import_gcal' ) { // Check our API ID relative saving of this settings page // Update Cron // FixIn: 7.0.1.9. if ( $fields['booking_gcal_auto_import_is_active']['value'] == 'On' ) { $booking_gcal_auto_import_time = $fields['booking_gcal_auto_import_time']['value']; if ( false !== strpos( $booking_gcal_auto_import_time, 'm' ) ) { $booking_gcal_auto_import_time = str_replace( array( 'm', 'd' ), '', $booking_gcal_auto_import_time ); $booking_gcal_auto_import_time = intval( $booking_gcal_auto_import_time ); $time_dimension = 'm'; } else if ( false !== strpos( $booking_gcal_auto_import_time, 'd' ) ) { $booking_gcal_auto_import_time = str_replace( array( 'm', 'd' ), '', $booking_gcal_auto_import_time ); $booking_gcal_auto_import_time = intval( $booking_gcal_auto_import_time ); $time_dimension = 'd'; } else { // Old hours $booking_gcal_auto_import_time = intval( $booking_gcal_auto_import_time ); $time_dimension = 'h'; } update_bk_option( 'booking_gcal_auto_import_time', $fields['booking_gcal_auto_import_time']['value'] ); // add WPBC()->cron->update( 'wpbc_import_gcal' , array( 'action' => array( 'wpbc_silent_import_all_events' ) // Action and parameters , 'start_time' => (time()-1) // Now , 'last_execution' => time() // Set last time execution , 'recurrence' => intval( $booking_gcal_auto_import_time ) // Set time value , 'time_dimension' => $time_dimension // 'h' - hours, 'm' - minutes, 'd' - days ) ); } else { WPBC()->cron->delete( 'wpbc_import_gcal' ); // delete } } return $fields; } add_filter('wpbc_fields_after_saving_to_db', 'wpbc_fields_after_saving_to_db__import_gcal', 10, 2);