plugin_info = $plugin_info; parent::__construct( $this->plugin_info ); $this->init_logger(); } /** * Initialize $this->logger * * @return LoggerInterface */ private function init_logger() { $logger_settings = new WPDesk_Flexible_Shipping_Logger_Settings(); if ( $logger_settings->is_enabled() ) { return $this->logger = ( new WPDeskLoggerFactory() )->createWPDeskLogger( $logger_settings->get_logger_channel_name() ); } return $this->logger = new NullLogger(); } /** * Load dependencies. */ private function load_dependencies() { require_once __DIR__ . '/../inc/functions.php'; require_once( __DIR__ . '/wp-wpdesk-fs-shipment/shipment/functions.php' ); require_once( __DIR__ . '/manifest/functions.php' ); new WPDesk_Flexible_Shipping_Shipment_CPT( $this ); new WPDesk_Flexible_Shipping_Shipping_Manifest_CPT( $this ); new WPDesk_Flexible_Shipping_Shipment_Ajax( $this ); new WPDesk_Flexible_Shipping_Bulk_Actions(); new WPDesk_Flexible_Shipping_Export( $this ); new WPDesk_Flexible_Shipping_Multilingual( $this ); new WPDesk_Flexible_Shipping_Multicurrency( $this ); $this->admin_notices = new WPDesk_Flexible_Shipping_Admin_Notices( $this ); $abtesting = new WPDesk_Flexible_Shipping_AB_Deactivation_Contact_Information(); $this->variant = $abtesting->get_variant(); $this->add_hookable( new WPDesk_Flexible_Shipping_Tracker() ); $this->add_hookable( new WPDesk\FS\Rate\Flexible_Shipping_Order_Counter() ); $this->add_hookable( new WPDesk\FS\Rate\WPDesk_Flexible_Shipping_Rate_Notice() ); $this->add_hookable( new WPDesk_Flexible_Shipping_AB_Tracker_Deactivation_Data( $this->variant ) ); $this->add_hookable( new WPDesk_Flexible_Shipping_Add_Shipping() ); $this->add_hookable( new WPDesk_Flexible_Shipping_Shorcode_Unit_Weight() ); $this->add_hookable( new WPDesk_Flexible_Shipping_Shorcode_Unit_Dimension() ); $this->add_hookable( new AjaxHandler( trailingslashit( $this->get_plugin()->get_plugin_url() ) . 'vendor_prefixed/wpdesk/wp-notice/assets' ) ); $this->add_hookable( new WPDesk_Flexible_Shipping_Method_Created_Tracker_Deactivation_Data() ); $this->add_hookable( new WPDesk_Flexible_Shipping_Logger_Downloader( new WPDeskLoggerFactory() ) ); $this->add_hookable( new WPDesk_Flexible_Shipping_Rest_Api_Order_Response_Data_Appender() ); } /** * Init base variables for plugin */ public function init_base_variables() { $this->plugin_url = $this->plugin_info->get_plugin_url(); $this->plugin_path = $this->plugin_info->get_plugin_dir(); $this->template_path = $this->plugin_info->get_text_domain(); $this->plugin_text_domain = $this->plugin_info->get_text_domain(); $this->plugin_namespace = $this->plugin_info->get_text_domain(); $this->template_path = $this->plugin_info->get_text_domain(); $this->default_settings_tab = 'main'; $this->settings_url = admin_url( 'admin.php?page=flexible-shipping-settings' ); $this->docs_url = get_locale() === 'pl_PL' ? 'https://www.wpdesk.pl/docs/flexible-shipping-pro-woocommerce-docs/' : 'https://docs.flexibleshipping.com/collection/20-fs-table-rate/'; $this->default_view_args = array( 'plugin_url' => $this->get_plugin_url(), ); } /** * Set renderer. */ private function init_renderer() { $resolver = new ChainResolver(); $resolver->appendResolver( new WPThemeResolver( $this->get_template_path() ) ); $resolver->appendResolver( new DirResolver( trailingslashit( $this->plugin_path ) . 'templates' ) ); $this->renderer = new FSVendor\WPDesk\View\Renderer\SimplePhpRenderer( $resolver ); } /** * Init. */ public function init() { $this->init_base_variables(); $this->init_renderer(); $this->load_dependencies(); $this->hooks(); } /** * Hooks. */ public function hooks() { parent::hooks(); add_filter( 'woocommerce_shipping_methods', array( $this, 'woocommerce_shipping_methods_filter' ), 10, 1 ); add_action( 'admin_init', array( $this, 'session_init' ) ); add_action( 'woocommerce_after_shipping_rate', array( $this, 'woocommerce_after_shipping_rate' ), 10, 2 ); add_action( 'flexible_shipping_method_rate_id', array( $this, 'flexible_shipping_method_rate_id', ), 9999999, 2 ); add_filter( 'woocommerce_shipping_chosen_method', array( $this, 'woocommerce_default_shipment_method', ), 10, 3 ); add_action( 'woocommerce_checkout_update_order_meta', array( $this, 'add_flexible_shipping_order_meta_on_checkout_woo_pre_27', ) ); add_action( 'woocommerce_checkout_create_order', array( $this, 'add_flexible_shipping_order_meta_on_checkout', ) ); add_filter( 'option_woocommerce_cod_settings', array( $this, 'option_woocommerce_cod_settings' ) ); add_action( 'plugins_loaded', array( $this, 'create_tracker' ), self::PRIORITY_BEFORE_SHARED_HELPER ); add_action( 'admin_init', array( $this, 'init_deactivation_tracker' ) ); $this->hooks_on_hookable_objects(); } /** * Init deactivation tracker. */ public function init_deactivation_tracker() { $plugin_data = new PluginData( WPDesk_Flexible_Shipping_Tracker::FLEXIBLE_SHIPPING_PLUGIN_SLUG, WPDesk_Flexible_Shipping_Tracker::FLEXIBLE_SHIPPING_PLUGIN_FILE, WPDesk_Flexible_Shipping_Tracker::FLEXIBLE_SHIPPING_PLUGIN_TITLE ); $thickbox_factory = new WPDesk_Flexible_Shipping_Deactivation_Thickbox_Factory( $this->variant, $plugin_data ); $deactivation_tracker = TrackerFactory::createCustomTracker( $plugin_data, null, $thickbox_factory->create_thickbox() ); $deactivation_tracker->hooks(); } /** * Maybe create tracker. */ public function create_tracker() { $tracker_factory = new WPDesk_Tracker_Factory(); $tracker_factory->create_tracker( basename( dirname( __FILE__ ) ) ); } /** * Woocommerce shipping methods filter. * * @param array $methods . * * @return array */ public function woocommerce_shipping_methods_filter( $methods ) { $methods['flexible_shipping'] = WPDesk_Flexible_Shipping::class; $methods[ WPDesk_Flexible_Shipping_Settings::METHOD_ID ] = WPDesk_Flexible_Shipping_Settings::class; return $methods; } /** * Option woocommerce cod settings filter. * * @param array $value . * * @return array */ public function option_woocommerce_cod_settings( $value ) { if ( is_checkout() ) { if ( ! empty( $value ) && is_array( $value ) && 'yes' === $value['enabled'] && ! empty( $value['enable_for_methods'] ) && is_array( $value['enable_for_methods'] ) ) { foreach ( $value['enable_for_methods'] as $method ) { if ( 'flexible_shipping' === $method ) { $all_fs_methods = flexible_shipping_get_all_shipping_methods(); $all_shipping_methods = flexible_shipping_get_all_shipping_methods(); $flexible_shipping = $all_shipping_methods['flexible_shipping']; $flexible_shipping_rates = $flexible_shipping->get_all_rates(); foreach ( $flexible_shipping_rates as $flexible_shipping_rate ) { $value['enable_for_methods'][] = $flexible_shipping_rate['id_for_shipping']; } break; } } } } return $value; } /** * Session init. */ public function session_init() { if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) { return; } // @codingStandardsIgnoreStart if ( ! session_id() ) { session_start(); } // @codingStandardsIgnoreEnd } /** * Add flexible shipping order meta on checkout. * * @param WC_Order $order Order. */ public function add_flexible_shipping_order_meta_on_checkout( $order ) { if ( ! $this->is_order_processed_on_checkout ) { $mutex = WordpressPostMutex::fromOrder( $order ); $mutex->acquireLock(); $this->is_order_processed_on_checkout = true; $order_shipping_methods = $order->get_shipping_methods(); foreach ( $order_shipping_methods as $shipping_id => $shipping_method ) { if ( isset( $shipping_method['item_meta'] ) && isset( $shipping_method['item_meta']['_fs_method'] ) ) { $fs_method = $shipping_method['item_meta']['_fs_method']; if ( ! empty( $fs_method['method_integration'] ) ) { $order_meta = $order->get_meta( '_flexible_shipping_integration', false ); if ( ! in_array( $fs_method['method_integration'], $order_meta, true ) ) { $order->add_meta_data( '_flexible_shipping_integration', $fs_method['method_integration'] ); } } } } $mutex->releaseLock(); } } /** * Add flexible shipping order meta on checkout (for WooCommerce versions before 2.7). * * @param int $order_id Order id. */ public function add_flexible_shipping_order_meta_on_checkout_woo_pre_27( $order_id ) { if ( version_compare( WC_VERSION, '2.7', '<' ) ) { if ( ! $this->is_order_processed_on_checkout ) { $this->is_order_processed_on_checkout = true; $order = wc_get_order( $order_id ); $order_shipping_methods = $order->get_shipping_methods(); foreach ( $order_shipping_methods as $shipping_id => $shipping_method ) { if ( isset( $shipping_method['item_meta'] ) && isset( $shipping_method['item_meta']['_fs_method'] ) && isset( $shipping_method['item_meta']['_fs_method'][0] ) ) { $fs_method = unserialize( $shipping_method['item_meta']['_fs_method'][0] ); if ( ! empty( $fs_method['method_integration'] ) ) { add_post_meta( $order->id, '_flexible_shipping_integration', $fs_method['method_integration'] ); } } } } } } /** * Set appropriate default FS method if no method chosen. * * @param string $default Default shipping method in frontend. * @param WC_Shipping_Rate[] $available_methods Available methods in frontend. * @param string|bool|null $chosen_method If false or null then no method is chosen. * * @return string */ public function woocommerce_default_shipment_method( $default, array $available_methods, $chosen_method ) { // @TODO: Infinite methods calling on Woocommerce 3.1 if ( version_compare( WC_VERSION, '3.2', '<' ) ) { return $default; } if ( null === $chosen_method || false === $chosen_method || ! $this->check_if_shipment_available_for_current_cart( $chosen_method ) ) { foreach ( $available_methods as $available_method ) { $method_meta = $available_method->get_meta_data(); $default_meta_key = WPDesk_Flexible_Shipping::META_DEFAULT; if ( $method_meta && isset( $method_meta[ $default_meta_key ] ) && 'yes' === $method_meta[ $default_meta_key ] ) { $candidate_id = $available_method->get_id(); if ( $this->check_if_shipment_available_for_current_cart( $candidate_id ) ) { return $candidate_id; } } } return $default; } return $chosen_method; } /** * Shipment can be possible but not for the current cart. Check if possible for cart. * * @param string $shipment_method_id . * * @return bool Possible or not */ private function check_if_shipment_available_for_current_cart( $shipment_method_id ) { $shipping_packages = WC()->shipping()->calculate_shipping( WC()->cart->get_shipping_packages() ); if ( is_array( $shipping_packages ) ) { foreach ( $shipping_packages as $package ) { if ( isset( $package['rates'][ $shipment_method_id ] ) && $package['rates'][ $shipment_method_id ] ) { return true; } } } return false; } /** * Admin enqueue scripts. */ public function admin_enqueue_scripts() { $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; wp_register_script( 'fs_admin', trailingslashit( $this->get_plugin_assets_url() ) . 'js/admin' . $suffix . '.js', array( 'jquery' ), $this->scripts_version ); $notice_url = get_locale() == 'pl_PL' ? 'https://wpde.sk/fs-rate-not-good-pl' : 'https://wpde.sk/fs-rate-not-good'; wp_localize_script( 'fs_admin', 'fs_admin', array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'notice_not_good_enought' => sprintf( // Translators: link. __( 'How can We make Flexible Shipping better for you? %1$sJust write to us.%2$s', 'flexible-shipping' ), '', '' ), ) ); wp_enqueue_script( 'fs_admin' ); $current_screen = get_current_screen(); if ( ! empty( $current_screen ) && 'shop_order' === $current_screen->id ) { wp_enqueue_media(); } wp_register_script( 'fs_ap_conditional_logic', trailingslashit( $this->get_plugin_assets_url() ) . 'js/ap_conditional_logic' . $suffix . '.js', array( 'jquery' ), $this->scripts_version ); wp_enqueue_script( 'fs_ap_conditional_logic' ); wp_enqueue_style( 'fs_admin', trailingslashit( $this->get_plugin_assets_url() ) . 'css/admin' . $suffix . '.css', array(), $this->scripts_version ); wp_enqueue_style( 'fs_font', trailingslashit( $this->get_plugin_assets_url() ) . 'css/font' . $suffix . '.css', array(), $this->scripts_version ); } /** * Enqueue Wordpress scripts. */ public function wp_enqueue_scripts() { $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; } /** * Links filter. * * @param array $links . * * @return array */ public function links_filter( $links ) { $docs_link = get_locale() === 'pl_PL' ? 'https://www.wpdesk.pl/docs/flexible-shipping-pro-woocommerce-docs/' : 'https://docs.flexibleshipping.com/collection/20-fs-table-rate/'; $support_link = get_locale() === 'pl_PL' ? 'https://www.wpdesk.pl/docs/?utm_campaign=flexible-shipping&utm_source=user-site&utm_medium=link&utm_term=&utm_content=fs-plugins-support' : 'https://flexibleshipping.com/support/?utm_campaign=flexible-shipping&utm_source=user-site&utm_medium=link&utm_term=&utm_content=fs-plugins-support'; $docs_link .= '?utm_campaign=flexible-shipping&utm_source=user-site&utm_medium=link&utm_term=&utm_content=fs-plugins-docs'; $settings_url = admin_url( 'admin.php?page=wc-settings&tab=shipping§ion=' . WPDesk_Flexible_Shipping_Settings::METHOD_ID ); $plugin_links = array( '' . __( 'Settings', 'flexible-shipping' ) . '', '' . __( 'Docs', 'flexible-shipping' ) . '', '' . __( 'Support', 'flexible-shipping' ) . '', ); $pro_link = get_locale() === 'pl_PL' ? 'https://www.wpdesk.pl/sklep/flexible-shipping-pro-woocommerce/' : 'https://flexibleshipping.com/table-rate/'; $utm = '?utm_campaign=flexible-shipping&utm_source=user-site&utm_medium=link&utm_term=&utm_content=fs-plugins-upgrade'; if ( ! wpdesk_is_plugin_active( 'flexible-shipping-pro/flexible-shipping-pro.php' ) ) { $plugin_links[] = '' . __( 'Upgrade', 'flexible-shipping' ) . ''; } return array_merge( $plugin_links, $links ); } /** * WooCommerce after shipping rate action. * * @param WC_Shipping_Rate $method . * @param int $index . */ public function woocommerce_after_shipping_rate( $method, $index ) { if ( 'flexible_shipping' === $method->method_id ) { $description = WC()->session->get( 'flexible_shipping_description_' . $method->id, false ); if ( $description && '' !== $description ) { echo $this->load_template( 'flexible-shipping/after-shipping-rate', 'cart/', array( 'method_description' => $description, ) ); // WPCS: XSS OK. } } } /** * . * * @param string $method_id . * @param array $shipping_method . * * @return string */ public function flexible_shipping_method_rate_id( $method_id, array $shipping_method ) { if ( isset( $shipping_method['id_for_shipping'] ) && '' !== $shipping_method['id_for_shipping'] ) { $method_id = $shipping_method['id_for_shipping']; } return $method_id; } }