PATH:
home
/
letacommog
/
laindinois
/
wp-content
/
plugins
/
woocommerce-bookings
<?php /** * Plugin Name: WooCommerce Bookings * Plugin URI: https://woocommerce.com/products/woocommerce-bookings/ * Description: Setup bookable products such as for reservations, services and hires. * Version: 1.11.3 * Author: Automattic * Author URI: https://woocommerce.com * Text Domain: woocommerce-bookings * Domain Path: /languages * WC tested up to: 3.4 * WC requires at least: 2.6 * * Copyright: © 2009-2017 Automattic. * License: GNU General Public License v3.0 * License URI: http://www.gnu.org/licenses/gpl-3.0.html * * Woo: 390890:911c438934af094c2b38d5560b9f50f3 */ if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Required functions */ if ( ! function_exists( 'woothemes_queue_update' ) ) { require_once( 'woo-includes/woo-functions.php' ); } /** * Plugin updates */ woothemes_queue_update( plugin_basename( __FILE__ ), '911c438934af094c2b38d5560b9f50f3', '390890' ); if ( ! is_woocommerce_active() ) { return; } /** * WC Bookings class */ class WC_Bookings { /** * Constructor */ public function __construct() { define( 'WC_BOOKINGS_VERSION', '1.11.3' ); define( 'WC_BOOKINGS_TEMPLATE_PATH', untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/templates/' ); define( 'WC_BOOKINGS_PLUGIN_URL', untrailingslashit( plugins_url( basename( plugin_dir_path( __FILE__ ) ), basename( __FILE__ ) ) ) ); define( 'WC_BOOKINGS_MAIN_FILE', __FILE__ ); define( 'WC_BOOKINGS_ABSPATH', dirname( __FILE__ ) . '/' ); add_action( 'init', array( $this, 'load_plugin_textdomain' ) ); add_action( 'plugins_loaded', array( $this, 'includes' ) ); add_action( 'plugins_loaded', array( $this, 'init' ) ); add_action( 'init', array( $this, 'init_post_types' ) ); add_action( 'wp_enqueue_scripts', array( $this, 'booking_form_styles' ) ); add_filter( 'plugin_row_meta', array( $this, 'plugin_row_meta' ), 10, 2 ); add_filter( 'woocommerce_data_stores', array( $this, 'register_data_stores' ) ); if ( is_admin() ) { $this->admin_includes(); } register_activation_hook( __FILE__, array( $this, 'install' ) ); register_deactivation_hook( __FILE__, array( $this, 'deactivate' ) ); if ( get_option( 'wc_bookings_version' ) !== WC_BOOKINGS_VERSION ) { add_action( 'shutdown', array( $this, 'delayed_install' ) ); } // Load payment gateway name. add_filter( 'woocommerce_payment_gateways', array( $this, 'include_gateway' ) ); // Load integration. add_filter( 'woocommerce_integrations', array( $this, 'include_integration' ) ); // Init Bookings settings. add_filter( 'woocommerce_general_settings', array( $this, 'init_bookings_settings' ) ); $this->init_cache_clearing(); } /** * Installer */ public function install() { add_action( 'shutdown', array( $this, 'delayed_install' ) ); $notice_html = '<strong>' . esc_html__( 'Bookings has been activated!', 'woocommerce-bookings' ) . '</strong><br><br>'; /* translators: 1: href link to list of bookings */ $notice_html .= sprintf( __( 'Add or edit a product to manage bookings in the Product Data section for individual products and then go to the <a href="%s" target="_blank">Bookings page</a> to manage them individually.', 'woocommerce-bookings' ), admin_url( 'edit.php?post_type=wc_booking' ) ); WC_Admin_Notices::add_custom_notice( 'woocommerce_bookings_activation', $notice_html ); // Register the rewrite endpoint before permalinks are flushed add_rewrite_endpoint( apply_filters( 'woocommerce_bookings_account_endpoint', 'bookings' ), EP_PAGES ); // Flush Permalinks flush_rewrite_rules(); } /** * Cleanup on plugin deactivation. * * @since 1.11 */ public function deactivate() { WC_Admin_Notices::remove_notice( 'woocommerce_bookings_activation' ); } /** * Installer (delayed) */ public function delayed_install() { global $wpdb, $wp_roles; $wpdb->hide_errors(); $collate = ''; if ( $wpdb->has_cap( 'collation' ) ) { if ( ! empty( $wpdb->charset ) ) { $collate .= "DEFAULT CHARACTER SET $wpdb->charset"; } if ( ! empty( $wpdb->collate ) ) { $collate .= " COLLATE $wpdb->collate"; } } require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); dbDelta( " CREATE TABLE {$wpdb->prefix}wc_booking_relationships ( ID bigint(20) unsigned NOT NULL auto_increment, product_id bigint(20) unsigned NOT NULL, resource_id bigint(20) unsigned NOT NULL, sort_order bigint(20) unsigned NOT NULL default 0, PRIMARY KEY (ID), KEY product_id (product_id), KEY resource_id (resource_id) ) $collate; " ); // Product type if ( ! get_term_by( 'slug', sanitize_title( 'booking' ), 'product_type' ) ) { wp_insert_term( 'booking', 'product_type' ); } // Capabilities if ( class_exists( 'WP_Roles' ) ) { if ( ! isset( $wp_roles ) ) { $wp_roles = new WP_Roles(); } } if ( is_object( $wp_roles ) ) { $wp_roles->add_cap( 'shop_manager', 'manage_bookings' ); $wp_roles->add_cap( 'administrator', 'manage_bookings' ); } // Data updates if ( version_compare( get_option( 'wc_bookings_version', WC_BOOKINGS_VERSION ), '1.3', '<' ) ) { $bookings = $wpdb->get_results( "SELECT post_id, meta_key, meta_value FROM $wpdb->postmeta WHERE meta_key IN ( '_booking_start', '_booking_end' );" ); foreach ( $bookings as $booking ) { if ( ctype_digit( $booking->meta_value ) && $booking->meta_value <= 2147483647 ) { $new_date = date( 'YmdHis', $booking->meta_value ); update_post_meta( $booking->post_id, $booking->meta_key, $new_date ); } } } if ( version_compare( get_option( 'wc_bookings_version', WC_BOOKINGS_VERSION ), '1.4', '<' ) ) { $resources = $wpdb->get_results( "SELECT ID, post_parent FROM $wpdb->posts WHERE post_type = 'bookable_resource' AND post_parent > 0;" ); foreach ( $resources as $resource ) { $wpdb->insert( $wpdb->prefix . 'wc_booking_relationships', array( 'product_id' => $resource->post_parent, 'resource_id' => $resource->ID, 'sort_order' => 1, ) ); if ( $wpdb->insert_id ) { $wpdb->update( $wpdb->posts, array( 'post_parent' => 0, ), array( 'ID' => $resource->ID, ) ); $cost = get_post_meta( $resource->ID, 'cost', true ); $parent_costs = get_post_meta( $resource->post_parent, '_resource_base_costs', true ); if ( ! $parent_costs ) { $parent_costs = array(); } $parent_costs[ $resource->ID ] = $cost; update_post_meta( $resource->post_parent, '_resource_base_costs', $parent_costs ); } } } if ( version_compare( get_option( 'wc_bookings_version', WC_BOOKINGS_VERSION ), '1.5', '<' ) ) { $wpdb->query( " UPDATE {$wpdb->posts} as posts SET posts.post_status = 'pending-confirmation' WHERE posts.post_type = 'wc_booking' AND posts.post_status = 'pending'; " ); } if ( version_compare( get_option( 'wc_bookings_version', WC_BOOKINGS_VERSION ), '1.10.3', '<' ) ) { $this->includes(); $booking_products = WC_Product_Booking_Data_Store_CPT::get_bookable_product_ids(); // Update all bookings to match the proper price foreach ( $booking_products as $product_id ) { $price = get_post_meta( $product_id, '_price', true ); if ( ! empty( $price ) ) { continue; } $new_price = wc_booking_calculated_base_cost( new WC_Product_Booking( $product_id ) ); update_post_meta( $product_id, '_price', $new_price ); } } if ( version_compare( get_option( 'wc_bookings_version', WC_BOOKINGS_VERSION ), '1.10.9', '<' ) ) { $this->includes(); $booking_products = WC_Product_Booking_Data_Store_CPT::get_bookable_product_ids(); // Update all bookings to match the proper base cost foreach ( $booking_products as $product_id ) { $base_cost = get_post_meta( $product_id, '_wc_booking_base_cost', true ); if ( empty( $base_cost ) ) { continue; } update_post_meta( $product_id, '_wc_booking_block_cost', $base_cost ); delete_post_meta( $product_id, '_wc_booking_base_cost' ); } } // Update version update_option( 'wc_bookings_version', WC_BOOKINGS_VERSION ); } /** * Localisation */ public function load_plugin_textdomain() { $locale = apply_filters( 'plugin_locale', get_locale(), 'woocommerce-bookings' ); $dir = trailingslashit( WP_LANG_DIR ); load_textdomain( 'woocommerce-bookings', $dir . 'woocommerce-bookings/woocommerce-bookings-' . $locale . '.mo' ); load_plugin_textdomain( 'woocommerce-bookings', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' ); } /** * Load Classes. */ public function includes() { /** * Load 3.0.x classes and backwards compatibility code when using older versions of WooCommerce. * * @since 1.10.0 * @todo remove this when 2.6.x support is dropped. */ if ( version_compare( WC_VERSION, '3.0', '<' ) ) { if ( ! class_exists( 'WC_Data_Store' ) ) { include_once( WC_BOOKINGS_ABSPATH . 'includes/compatibility/class-wc-data-store.php' ); } if ( ! class_exists( 'WC_Data_Exception' ) ) { include_once( WC_BOOKINGS_ABSPATH . 'includes/compatibility/class-wc-data-exception.php' ); } if ( ! class_exists( 'WC_Data_Store_WP' ) ) { include_once( WC_BOOKINGS_ABSPATH . 'includes/compatibility/class-wc-data-store-wp.php' ); } if ( ! class_exists( 'WC_Product_Data_Store_CPT' ) ) { include_once( WC_BOOKINGS_ABSPATH . 'includes/compatibility/class-wc-product-data-store-cpt.php' ); } } if ( ! class_exists( 'WC_Bookings_Data' ) ) { include_once( WC_BOOKINGS_ABSPATH . 'includes/compatibility/abstract-wc-bookings-data.php' ); // Bookings version of WC_Data. } // WC AJAX. include_once( WC_BOOKINGS_ABSPATH . 'includes/class-wc-bookings-wc-ajax.php' ); // Objects. include_once( WC_BOOKINGS_ABSPATH . 'includes/data-objects/class-wc-product-booking.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/data-objects/class-wc-product-booking-resource.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/data-objects/class-wc-product-booking-person-type.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/data-objects/class-wc-booking.php' ); // Stores. include_once( WC_BOOKINGS_ABSPATH . 'includes/data-stores/class-wc-booking-data-store.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/data-stores/class-wc-product-booking-data-store-cpt.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/data-stores/class-wc-product-booking-resource-data-store-cpt.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/data-stores/class-wc-product-booking-person-type-data-store-cpt.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/wc-bookings-functions.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/class-wc-booking-form-handler.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/class-wc-booking-order-manager.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/class-wc-product-booking-manager.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/class-wc-bookings-controller.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/class-wc-booking-cron-manager.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/class-wc-bookings-ics-exporter.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/gateways/class-wc-bookings-gateway.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/integrations/class-wc-bookings-google-calendar-integration.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/booking-form/class-wc-booking-form.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/class-wc-booking-coupon.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/class-wc-product-class-loader.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/class-wc-product-booking-rule-manager.php' ); if ( class_exists( 'WC_Product_Addons' ) ) { include_once( WC_BOOKINGS_ABSPATH . 'includes/integrations/class-wc-bookings-addons.php' ); } if ( class_exists( 'WC_Deposits' ) ) { include_once( WC_BOOKINGS_ABSPATH . 'includes/integrations/class-wc-bookings-deposits.php' ); } include_once( WC_BOOKINGS_ABSPATH . 'includes/class-wc-booking-privacy.php' ); } /** * Init self */ public function init() { include_once( WC_BOOKINGS_ABSPATH . 'includes/class-wc-booking-email-manager.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/class-wc-booking-cart-manager.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/class-wc-booking-checkout-manager.php' ); } /** * Include admin */ public function admin_includes() { include_once( WC_BOOKINGS_ABSPATH . 'includes/admin/class-wc-bookings-report-dashboard.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/admin/class-wc-bookings-tools.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/admin/class-wc-bookings-admin.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/admin/class-wc-bookings-ajax.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/admin/class-wc-bookings-addons.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/admin/class-wc-bookings-products-export.php' ); include_once( WC_BOOKINGS_ABSPATH . 'includes/admin/class-wc-bookings-products-import.php' ); } /** * Init post types */ public function init_post_types() { register_post_type( 'bookable_person', apply_filters( 'woocommerce_register_post_type_bookable_person', array( 'label' => __( 'Person Type', 'woocommerce-bookings' ), 'public' => false, 'hierarchical' => false, 'supports' => false, ) ) ); register_post_type( 'bookable_resource', apply_filters( 'woocommerce_register_post_type_bookable_resource', array( 'label' => __( 'Resources', 'woocommerce-bookings' ), 'labels' => array( 'name' => __( 'Bookable resources', 'woocommerce-bookings' ), 'singular_name' => __( 'Bookable resource', 'woocommerce-bookings' ), 'add_new' => __( 'Add Resource', 'woocommerce-bookings' ), 'add_new_item' => __( 'Add New Resource', 'woocommerce-bookings' ), 'edit' => __( 'Edit', 'woocommerce-bookings' ), 'edit_item' => __( 'Edit Resource', 'woocommerce-bookings' ), 'new_item' => __( 'New Resource', 'woocommerce-bookings' ), 'view' => __( 'View Resource', 'woocommerce-bookings' ), 'view_item' => __( 'View Resource', 'woocommerce-bookings' ), 'search_items' => __( 'Search Resource', 'woocommerce-bookings' ), 'not_found' => __( 'No Resource found', 'woocommerce-bookings' ), 'not_found_in_trash' => __( 'No Resource found in trash', 'woocommerce-bookings' ), 'parent' => __( 'Parent Resources', 'woocommerce-bookings' ), 'menu_name' => _x( 'Resources', 'Admin menu name', 'woocommerce-bookings' ), 'all_items' => __( 'Resources', 'woocommerce-bookings' ), ), 'description' => __( 'Bookable resources are bookable within a bookings product.', 'woocommerce-bookings' ), 'public' => false, 'show_ui' => true, 'capability_type' => 'product', 'map_meta_cap' => true, 'publicly_queryable' => false, 'exclude_from_search' => true, 'show_in_menu' => true, 'hierarchical' => false, 'show_in_nav_menus' => false, 'rewrite' => false, 'query_var' => false, 'supports' => array( 'title' ), 'has_archive' => false, 'show_in_menu' => 'edit.php?post_type=wc_booking', ) ) ); register_post_type( 'wc_booking', apply_filters( 'woocommerce_register_post_type_wc_booking', array( 'label' => __( 'Booking', 'woocommerce-bookings' ), 'labels' => array( 'name' => __( 'Bookings', 'woocommerce-bookings' ), 'singular_name' => __( 'Booking', 'woocommerce-bookings' ), 'add_new' => __( 'Add Booking', 'woocommerce-bookings' ), 'add_new_item' => __( 'Add New Booking', 'woocommerce-bookings' ), 'edit' => __( 'Edit', 'woocommerce-bookings' ), 'edit_item' => __( 'Edit Booking', 'woocommerce-bookings' ), 'new_item' => __( 'New Booking', 'woocommerce-bookings' ), 'view' => __( 'View Booking', 'woocommerce-bookings' ), 'view_item' => __( 'View Booking', 'woocommerce-bookings' ), 'search_items' => __( 'Search Bookings', 'woocommerce-bookings' ), 'not_found' => __( 'No Bookings found', 'woocommerce-bookings' ), 'not_found_in_trash' => __( 'No Bookings found in trash', 'woocommerce-bookings' ), 'parent' => __( 'Parent Bookings', 'woocommerce-bookings' ), 'menu_name' => _x( 'Bookings', 'Admin menu name', 'woocommerce-bookings' ), 'all_items' => __( 'All Bookings', 'woocommerce-bookings' ), ), 'description' => __( 'This is where bookings are stored.', 'woocommerce-bookings' ), 'public' => false, 'show_ui' => true, 'capability_type' => 'product', 'map_meta_cap' => true, 'publicly_queryable' => false, 'exclude_from_search' => true, 'show_in_menu' => true, 'hierarchical' => false, 'show_in_nav_menus' => false, 'rewrite' => false, 'query_var' => false, 'supports' => array( '' ), 'has_archive' => false, 'menu_icon' => 'dashicons-calendar-alt', ) ) ); /** * Post status */ register_post_status( 'complete', array( 'label' => '<span class="status-complete tips" data-tip="' . _x( 'Complete', 'woocommerce-bookings', 'woocommerce-bookings' ) . '">' . _x( 'Complete', 'woocommerce-bookings', 'woocommerce-bookings' ) . '</span>', 'public' => true, 'exclude_from_search' => false, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, /* translators: 1: count, 2: count */ 'label_count' => _n_noop( 'Complete <span class="count">(%s)</span>', 'Complete <span class="count">(%s)</span>', 'woocommerce-bookings' ), ) ); register_post_status( 'paid', array( 'label' => '<span class="status-paid tips" data-tip="' . _x( 'Paid & Confirmed', 'woocommerce-bookings', 'woocommerce-bookings' ) . '">' . _x( 'Paid & Confirmed', 'woocommerce-bookings', 'woocommerce-bookings' ) . '</span>', 'public' => true, 'exclude_from_search' => false, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, /* translators: 1: count, 2: count */ 'label_count' => _n_noop( 'Paid & Confirmed <span class="count">(%s)</span>', 'Paid & Confirmed <span class="count">(%s)</span>', 'woocommerce-bookings' ), ) ); register_post_status( 'confirmed', array( 'label' => '<span class="status-confirmed tips" data-tip="' . _x( 'Confirmed', 'woocommerce-bookings', 'woocommerce-bookings' ) . '">' . _x( 'Confirmed', 'woocommerce-bookings', 'woocommerce-bookings' ) . '</span>', 'public' => true, 'exclude_from_search' => false, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, /* translators: 1: count, 2: count */ 'label_count' => _n_noop( 'Confirmed <span class="count">(%s)</span>', 'Confirmed <span class="count">(%s)</span>', 'woocommerce-bookings' ), ) ); register_post_status( 'unpaid', array( 'label' => '<span class="status-unpaid tips" data-tip="' . _x( 'Un-paid', 'woocommerce-bookings', 'woocommerce-bookings' ) . '">' . _x( 'Un-paid', 'woocommerce-bookings', 'woocommerce-bookings' ) . '</span>', 'public' => true, 'exclude_from_search' => true, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, /* translators: 1: count, 2: count */ 'label_count' => _n_noop( 'Un-paid <span class="count">(%s)</span>', 'Un-paid <span class="count">(%s)</span>', 'woocommerce-bookings' ), ) ); register_post_status( 'pending-confirmation', array( 'label' => '<span class="status-pending tips" data-tip="' . _x( 'Pending Confirmation', 'woocommerce-bookings', 'woocommerce-bookings' ) . '">' . _x( 'Pending Confirmation', 'woocommerce-bookings', 'woocommerce-bookings' ) . '</span>', 'public' => true, 'exclude_from_search' => false, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, /* translators: 1: count, 2: count */ 'label_count' => _n_noop( 'Pending Confirmation <span class="count">(%s)</span>', 'Pending Confirmation <span class="count">(%s)</span>', 'woocommerce-bookings' ), ) ); register_post_status( 'cancelled', array( 'label' => '<span class="status-cancelled tips" data-tip="' . _x( 'Cancelled', 'woocommerce-bookings', 'woocommerce-bookings' ) . '">' . _x( 'Cancelled', 'woocommerce-bookings', 'woocommerce-bookings' ) . '</span>', 'public' => true, 'exclude_from_search' => false, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, /* translators: 1: count, 2: count */ 'label_count' => _n_noop( 'Cancelled <span class="count">(%s)</span>', 'Cancelled <span class="count">(%s)</span>', 'woocommerce-bookings' ), ) ); register_post_status( 'in-cart', array( 'label' => '<span class="status-incart tips" data-tip="' . _x( 'In Cart', 'woocommerce-bookings', 'woocommerce-bookings' ) . '">' . _x( 'In Cart', 'woocommerce-bookings', 'woocommerce-bookings' ) . '</span>', 'public' => false, 'exclude_from_search' => false, 'show_in_admin_all_list' => false, 'show_in_admin_status_list' => true, /* translators: 1: count, 2: count */ 'label_count' => _n_noop( 'In Cart <span class="count">(%s)</span>', 'In Cart <span class="count">(%s)</span>', 'woocommerce-bookings' ), ) ); register_post_status( 'was-in-cart', array( 'label' => false, 'public' => false, 'exclude_from_search' => false, 'show_in_admin_all_list' => false, 'show_in_admin_status_list' => false, 'label_count' => false, ) ); } public function init_cache_clearing() { add_action( 'woocommerce_booking_cancelled', array( $this, 'clear_cache' ) ); add_action( 'before_delete_post', array( $this, 'clear_cache' ) ); add_action( 'wp_trash_post', array( $this, 'clear_cache' ) ); add_action( 'untrash_post', array( $this, 'clear_cache' ) ); add_action( 'save_post', array( $this, 'clear_cache_on_save_post' ) ); add_action( 'woocommerce_order_status_changed', array( $this, 'clear_cache' ) ); add_action( 'woocommerce_pre_payment_complete', array( $this, 'clear_cache' ) ); // scheduled events add_action( 'delete_booking_transients', array( $this, 'clear_cache' ) ); add_action( 'delete_booking_dr_transients', array( $this, 'clear_cache' ) ); add_action( 'delete_booking_ress_transients', array( $this, 'clear_cache' ) ); add_action( 'delete_booking_res_transients', array( $this, 'clear_cache' ) ); } public function clear_cache() { WC_Cache_Helper::get_transient_version( 'bookings', true ); // It only makes sense to delete transients from the DB if we're not using an external cache. if ( ! wp_using_ext_object_cache() ) { $this->delete_booking_transients(); $this->delete_booking_dr_transients(); $this->delete_booking_ress_transients(); $this->delete_booking_res_transients(); } } /** * Clears the transients when booking is edited * * @param int $post_id * @return int $post_id */ public function clear_cache_on_save_post( $post_id ) { if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { return $post_id; } $post = get_post( $post_id ); if ( 'wc_booking' !== $post->post_type && 'product' !== $post->post_type ) { return $post_id; } $this->clear_cache(); } /** * Delete Booking Related Transients */ public function delete_booking_transients() { global $wpdb; $limit = 1000; $affected_timeouts = $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s LIMIT %d;", '_transient_timeout_book_fo_%', $limit ) ); $affected_transients = $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s LIMIT %d;", '_transient_book_fo_%', $limit ) ); // If affected rows is equal to limit, there are more rows to delete. Delete in 10 secs. if ( $affected_transients === $limit ) { wp_schedule_single_event( time() + 10, 'delete_booking_transients', array( time() ) ); } } /** * Delete Booking Date Range Related Transients */ public function delete_booking_dr_transients() { global $wpdb; $limit = 1000; $affected_timeouts = $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s LIMIT %d;", '_transient_timeout_book_dr_%', $limit ) ); $affected_transients = $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s LIMIT %d;", '_transient_book_dr_%', $limit ) ); // If affected rows is equal to limit, there are more rows to delete. Delete in 10 secs. if ( $affected_transients === $limit ) { wp_schedule_single_event( time() + 10, 'delete_booking_dr_transients', array( time() ) ); } } /** * Delete Booking Product Resources Related Transients */ public function delete_booking_ress_transients() { global $wpdb; $limit = 1000; $affected_timeouts = $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s LIMIT %d;", '_transient_timeout_book_ress_%', $limit ) ); $affected_transients = $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s LIMIT %d;", '_transient_book_ress_%', $limit ) ); // If affected rows is equal to limit, there are more rows to delete. Delete in 10 secs. if ( $affected_transients === $limit ) { wp_schedule_single_event( time() + 10, 'delete_booking_ress_transients', array( time() ) ); } } /** * Delete Booking Product Resource Related Transients */ public function delete_booking_res_transients() { global $wpdb; $limit = 1000; $affected_timeouts = $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s LIMIT %d;", '_transient_timeout_book_res_%', $limit ) ); $affected_transients = $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s LIMIT %d;", '_transient_book_res_%', $limit ) ); // If affected rows is equal to limit, there are more rows to delete. Delete in 10 secs. if ( $affected_transients === $limit ) { wp_schedule_single_event( time() + 10, 'delete_booking_res_transients', array( time() ) ); } } /** * Frontend booking form scripts */ public function booking_form_styles() { global $wp_scripts; $jquery_version = isset( $wp_scripts->registered['jquery-ui-core']->ver ) ? $wp_scripts->registered['jquery-ui-core']->ver : '1.11.4'; wp_enqueue_style( 'jquery-ui-style', '//ajax.googleapis.com/ajax/libs/jqueryui/' . $jquery_version . '/themes/smoothness/jquery-ui.min.css' ); wp_enqueue_style( 'wc-bookings-styles', WC_BOOKINGS_PLUGIN_URL . '/assets/css/frontend.css', null, WC_BOOKINGS_VERSION ); } /** * Add a custom payment gateway * This gateway works with booking that requires confirmation */ public function include_gateway( $gateways ) { $gateways[] = 'WC_Bookings_Gateway'; return $gateways; } /** * Add integrations * This add the Google Calendar integration */ public function include_integration( $integrations ) { $integrations[] = 'WC_Bookings_Google_Calendar_Integration'; return $integrations; } /** * Add Bookings settings to the WC Settings screen. * * @param array $settings * @return array */ public function init_bookings_settings( $settings ) { // Pop the separator. $last_element = array_pop( $settings ); $bookings_settings = array( array( 'title' => __( 'Enable Bookings Timezone calculation', 'woocommerce-bookings' ), 'desc' => __( 'Schedule Bookings events, such as reminder emails and auto-completions of bookings, using your site’s configured timezone.', 'woocommerce-bookings' ), 'id' => 'woocommerce_bookings_tz_calculation', 'default' => 'no', 'type' => 'checkbox', ), ); $settings = array_merge( $settings, $bookings_settings ); $settings[] = $last_element; return $settings; } /** * Show row meta on the plugin screen. * * @access public * @param mixed $links Plugin Row Meta * @param mixed $file Plugin Base file * @return array */ public function plugin_row_meta( $links, $file ) { if ( plugin_basename( WC_BOOKINGS_MAIN_FILE ) == $file ) { $row_meta = array( 'docs' => '<a href="' . esc_url( apply_filters( 'woocommerce_bookings_docs_url', 'https://docs.woocommerce.com/documentation/plugins/woocommerce/woocommerce-extensions/woocommerce-bookings/' ) ) . '" title="' . esc_attr( __( 'View Documentation', 'woocommerce-bookings' ) ) . '">' . __( 'Docs', 'woocommerce-bookings' ) . '</a>', 'support' => '<a href="' . esc_url( apply_filters( 'woocommerce_bookings_support_url', 'https://woocommerce.com/my-account/tickets/' ) ) . '" title="' . esc_attr( __( 'Visit Premium Customer Support', 'woocommerce-bookings' ) ) . '">' . __( 'Premium Support', 'woocommerce-bookings' ) . '</a>', ); return array_merge( $links, $row_meta ); } return (array) $links; } /** * Register data stores for bookings. * * @param array $data_stores * @return array */ public function register_data_stores( $data_stores = array() ) { $data_stores['booking'] = 'WC_Booking_Data_Store'; $data_stores['product-booking'] = 'WC_Product_Booking_Data_Store_CPT'; $data_stores['product-booking-resource'] = 'WC_Product_Booking_Resource_Data_Store_CPT'; $data_stores['product-booking-person-type'] = 'WC_Product_Booking_Person_Type_Data_Store_CPT'; return $data_stores; } } $GLOBALS['wc_bookings'] = new WC_Bookings();
[+]
..
[-] .editorconfig
[edit]
[+]
includes
[-] phpunit.xml
[edit]
[-] woocommmerce-bookings.php
[edit]
[+]
woo-includes
[+]
templates
[-] changelog.txt
[edit]
[-] composer.json
[edit]
[-] package-lock.json
[edit]
[-] uninstall.php
[edit]
[+]
languages
[-] woocommerce-bookings.php
[edit]
[-] .travis.yml
[edit]
[-] phpcs.xml
[edit]
[+]
assets