pluginBase", [$this, 'wcpo_plugin_settings_link'] ); $this->plugin_options(); add_action( 'csf_bp_preorder_save_after', [$this, 'update_options'], 10, 1 ); } /** * This function is responsible for creating the plugin options and sections for the Pre-Orders for WooCommerce plugin. * * @return void */ public function plugin_options() { // Set a unique slug-like ID $prefix = 'bp_preorder'; // Create options \CSF::createOptions( $prefix, array( 'menu_title' => __( 'Pre-Orders Settings', 'preorders-for-woocommerce' ), 'menu_slug' => 'pre-order-options', 'framework_title' => 'Pre-Orders For WooCommerce version-' . WCPO_PLUGIN_VER . '', 'menu_type' => 'submenu', 'menu_parent' => 'brightplugins', 'theme' => 'dark', 'show_footer' => false, 'defaults' => $this->optDefaults(), 'footer_credit' => 'If you enjoy using Pre-Orders for WooCommerce, kindly leave us a ★★★★★ rating. Your review holds significant importance to us as it contributes to our continuous growth and improvement.', //TODO: add review LINK 'show_bar_menu' => false, 'ajax_save' => true, ) ); // Generals \CSF::createSection( $prefix, array( 'title' => __( 'General', 'pre-orders-for-woocommerce' ), 'icon' => 'fas fa-sliders-h', 'fields' => array( array( 'title' => false, 'type' => 'callback', 'function' => 'Woocommerce_Preorders\Bootstrap::cosmNotice', ), array( 'type' => 'submessage', 'style' => 'danger', 'dependency' => array( 'wc_preorders_mode', '!=', 'either' ), 'content' => 'This mode is exclusively available in the Pro Version. To access this feature, we recommend upgrading to the Pro Version, which offers a wider range of functionalities and enhanced capabilities. ', ), // A text field array( 'title' => __( 'Pre-Order Modes', 'pre-orders-for-woocommerce' ), 'type' => 'select', 'options' => [ 'either' => __( 'Order only preorder products or available ones', 'pre-orders-for-woocommerce' ), 'Available in Pro Version!' => array( 'whole' => __( 'Treat the entire order as preordered', 'pre-orders-for-woocommerce' ), 'partial' => __( 'Generate a separate order with all preordered products', 'pre-orders-for-woocommerce' ), 'individual' => __( 'Generate a separate order for each preordered products', 'pre-orders-for-woocommerce' ), ), ], 'default' => 'either', 'id' => 'wc_preorders_mode', ), // A Notice array( 'title' => __( 'Choose shipping date', 'pre-orders-for-woocommerce' ), 'type' => 'switcher', 'subtitle' => __( 'New feature added', 'pre-orders-for-woocommerce' ) . " ", 'desc' => __( 'Allow customers to choose a desired shipping date on checkout page (after all products are available).', 'pre-orders-for-woocommerce' ), 'id' => 'wc_preorders_always_choose_date', ), array( 'title' => __( 'Enable Pre-Order Bagde', 'pre-orders-for-woocommerce' ), 'id' => 'wc_preorder_badge_array', 'subtitle' => __( 'New feature added', 'pre-orders-for-woocommerce' ) . " ", 'type' => 'checkbox', 'options' => array( 'wc_preorder_badge_single_product' => __( 'Single Product Page', 'pre-orders-for-woocommerce' ), 'wc_preorder_badge_shop_page' => __( 'Shop Page', 'pre-orders-for-woocommerce' ), ), ), array( 'title' => __( 'Badge Position (Shop)', 'pre-orders-for-woocommerce' ), 'type' => 'select', 'subtitle' => __( 'New feature added', 'pre-orders-for-woocommerce' ) . " ", 'default' => 'woocommerce_after_shop_loop_item_title', 'options' => [ 'woocommerce_after_shop_loop_item_title' => __( 'After Title (Recommended)', 'pre-orders-for-woocommerce' ), 'woocommerce_before_shop_loop_item_title' => __( 'Before Title', 'pre-orders-for-woocommerce' ), 'woocommerce_before_shop_loop_item' => __( 'Before Shop Loop', 'pre-orders-for-woocommerce' ), 'woocommerce_after_shop_loop_item' => __( 'After Shop Loop', 'pre-orders-for-woocommerce' ), ], 'desc' => __( 'Where the preorder badge should be displayed (Catalog Pages)', 'pre-orders-for-woocommerce' ), 'id' => 'wc_preorder_loop_badge_position', 'dependency' => array( 'wc_preorder_badge_array', 'any', 'wc_preorder_badge_shop_page' ), ), array( 'title' => __( 'Display the Available Date', 'pre-orders-for-woocommerce' ), 'id' => 'wc_preorders_avaiable_date_array', 'type' => 'checkbox', 'checkboxgroup' => 'start', 'options' => array( 'wc_preorders_avaiable_date_single_product' => __( 'Single Product Page', 'pre-orders-for-woocommerce' ), 'wc_preorders_avaiable_date_loop' => __( 'Catalog Page(s)', 'pre-orders-for-woocommerce' ), 'wc_preorders_avaiable_date_cart_item' => __( 'Cart Page', 'pre-orders-for-woocommerce' ), ), ), /** * PRO features (disabled) * * @since 2.0.0 */ array( 'title' => __( 'Available Date Position', 'pre-orders-for-woocommerce' ), 'type' => 'select', 'subtitle' => "Available in Pro Version! ", 'class' => 'cix-only-pro', 'desc' => __( 'Choose the position where the Available date Text will be displayed on the Single Product Page.', 'pre-orders-for-woocommerce' ), 'options' => [ 'before' => __( 'Before the pre-order button', 'pre-orders-for-woocommerce' ), 'after' => __( 'After the pre-order button', 'pre-orders-for-woocommerce' ), ], 'id' => 'wc_preorders_position_avaiable_date_text', ), array( 'title' => __( 'Pre-Order Transition Status', 'pre-orders-for-woocommerce' ), 'type' => 'select', 'class' => 'wc-enhanced-select cix-only-pro', 'subtitle' => "Available in Pro Version! ", 'desc' => __( 'Choose which status should the order be set after the preorder date passed', 'pre-orders-for-woocommerce' ), 'options' => wc_get_order_statuses(), 'default' => 'wc-processing', 'id' => 'wc_preorders_after_completed' . $this->text_disabled, ), array( 'title' => __( 'Disable Payment Methods', 'pre-orders-for-woocommerce' ), 'type' => 'checkbox', 'class' => 'cix-only-pro', 'subtitle' => 'Available in Pro Version! ', 'desc' => __( 'Disable Payment gateway if cart has pre-order product(s)', 'pre-orders-for-woocommerce' ), 'placeholder' => __( 'Select Payment method(s)', 'pre-orders-for-woocommerce' ), 'options' => function () { $active_gateways = array(); $gateways = WC()->payment_gateways->payment_gateways(); foreach ( $gateways as $id => $gateway ) { if ( 'yes' == $gateway->enabled ) { $active_gateways[$id] = $gateway->title; } } return $active_gateways; }, 'chosen' => true, 'multiple' => true, 'id' => 'wc_preorders_disable_payment' . $this->text_disabled, ), array( 'type' => 'notice', 'style' => 'danger', 'dependency' => array( 'wc_preorders_mode', '==', 'individual' ), 'content' => '"Generate a separate order for each preordered products preorder mode" is not compatible with "Pre-Order Pay Later"', ), array( 'title' => __( 'Pre-Order Pay Later', 'pre-orders-for-woocommerce' ), 'type' => 'switcher', 'class' => 'cix-only-pro', 'subtitle' => 'Available in Pro Version! ', 'help' => __( 'Consider enabling the Pay Later gateway which allows customers to make payments on the available date instead of immediately place the order', 'pre-orders-for-woocommerce' ), 'id' => 'wc_preorders_enable_paylater' . $this->text_disabled, ), array( 'title' => __( 'Product Date Cycle', 'pre-orders-for-woocommerce' ), 'type' => 'select', 'class' => 'wc-enhanced-select min-w-230 cix-only-pro', 'subtitle' => 'Available in Pro Version! ', 'options' => [ 'instock' => __( 'In Stock', 'pre-orders-for-woocommerce' ), 'outofstock' => __( 'Out of Stock', 'pre-orders-for-woocommerce' ), ], 'desc' => __( 'Once the preorder is finished on it\'s date cycle, the stock status will be automatically change to selected status', 'pre-orders-for-woocommerce' ), 'id' => 'wc_preorders_product_date_cycle' . $this->text_disabled, ), array( 'title' => __( 'Unify Shipping Costs', 'pre-orders-for-woocommerce' ), 'type' => 'switcher', 'class' => 'cix-only-pro', 'subtitle' => 'Available in Pro Version! ', 'default' => false, 'desc' => __( 'If you have more than 1 order is generated, let the customer pay only 1 shipment for all orders.
This option will use the shipment method as if it were only 1 order.', 'pre-orders-for-woocommerce' ), 'id' => 'wc_preorders_prevent_shipping_cost' . $this->text_disabled, ), array( 'title' => __( 'Disable Payment Methods (Pay Later)', 'pre-orders-for-woocommerce' ), 'type' => 'switcher', 'desc' => __( 'When the "Pay Later" method is active, ensure that all payment methods are disabled.', 'pre-orders-for-woocommerce' ), 'dependency' => array( 'wc_preorders_enable_paylater', '==', 'true' ), 'id' => 'paylater_hide_other_gateways' . $this->text_disabled, ), array( 'title' => __( 'Pay Later Transition Status', 'pre-orders-for-woocommerce' ), 'type' => 'select', 'class' => 'wc-enhanced-select', 'desc' => __( 'Choose which status should the order be set after the preorder date passed but order not paid by customer', 'pre-orders-for-woocommerce' ), 'options' => wc_get_order_statuses(), 'default' => 'wc-pending', 'dependency' => array( 'wc_preorders_enable_paylater|wc_preorders_mode', '==|!=', 'true|individual' ), 'id' => 'pay_later_transition_status' . $this->text_disabled, ), ), ) ); // Create a section \CSF::createSection( $prefix, array( 'title' => 'Text & Labels', 'icon' => 'fas fa-edit', 'fields' => array( array( 'title' => __( 'Pre-Order Button Label', 'pre-orders-for-woocommerce' ), 'type' => 'text', 'desc' => __( 'Change button title for pre-order products', 'pre-orders-for-woocommerce' ), 'id' => 'wc_preorders_button_text', ), array( 'title' => __( 'Pre-Order Status Label', 'pre-orders-for-woocommerce' ), 'type' => 'text', 'default' => 'Pre Ordered', 'desc' => __( 'Change preorder status name', 'pre-orders-for-woocommerce' ), 'id' => 'preorder_status_label', ), array( 'title' => __( 'Pre-Order Cart Notice', 'pre-orders-for-woocommerce' ), 'type' => 'text', 'default' => 'Note: this item will be available for shipping in {days_left} days', 'desc' => ' Text will be shown below the preoder product on the cart page
Available variables:
{days_left} = Count preorder date
{human_readable} = 3 weeks - Available in Pro Version!
{date_format} = Default site date format ( January 15, 2020 ) - Available in Pro Version!', 'id' => 'wc_preorders_cart_product_text', ), array( 'title' => __( 'Available Date Label', 'pre-orders-for-woocommerce' ), 'type' => 'text', 'default' => 'Available on {date_format}', 'desc' => ' Choose how the available date should be displayed. You can use 3 different variables inside the text,
to show either the normal date, the amount of weeks left, or a dynamic countdown. For more information please visit this docs page
Available variables:
{date_format} = Default site date format ( January 15, 2020 )
{human_readable} = 3 weeks - Available in Pro Version!
{countdown} = Countdown Timer - Available in Pro Version!', 'id' => 'wc_preorders_avaiable_date_text', ), /** * PRO features (disabled) * * @since 2.0.0 */ array( 'title' => __( 'Countdown Format', 'pre-orders-for-woocommerce' ), 'type' => 'text', 'desc' => '%d days, %h hours, %i minutes, %s seconds', 'id' => 'wc_preorders_countdown_format' . $this->text_disabled, 'class' => 'cix-only-pro', 'subtitle' => 'Available in Pro Version! ', ), array( 'title' => __( 'Pre-Order Bagde Label', 'pre-orders-for-woocommerce' ), 'type' => 'text', 'default' => 'Pre-Order', 'subtitle' => "Available in Pro Version! ", 'class' => 'cix-only-pro', 'id' => 'wc_preorders_badge_text' . $this->text_disabled, ), array( 'title' => __( 'Pre-Order Note', 'pre-orders-for-woocommerce' ), 'type' => 'text', 'placeholder' => __( 'The Pre-order date has been changed to {date_format}', 'pre-orders-for-woocommerce' ), 'default' => 'The Pre-order date has been changed to {date_format}', 'desc' => __( 'Add a note to customer if pre-order date change from order dashboard
Available variable:
{date_format} = Default site date format ( January 15, 2020 )', 'pre-orders-for-woocommerce' ), 'subtitle' => "Available in Pro Version! ", 'class' => 'cix-only-pro', 'id' => 'preorder_date_order_note' . $this->text_disabled, ), array( 'title' => __( 'Regular Product Notice', 'pre-orders-for-woocommerce' ), 'type' => 'textarea', 'default' => 'We detected that your cart has pre-order products. Please remove them before being able to add this product.', 'subtitle' => "Available in Pro Version! ", 'class' => 'cix-only-pro', 'id' => 'regular_cart_error_notice' . $this->text_disabled, ), array( 'title' => __( 'Pre-Order Product Notice', 'pre-orders-for-woocommerce' ), 'type' => 'textarea', 'default' => 'We detected that you are trying to add a pre-order product to your cart. Please remove the rest of the product(s) from the cart before being able to add this product.', 'subtitle' => "Available in Pro Version! ", 'class' => 'cix-only-pro', 'id' => 'preorder_cart_error_notice' . $this->text_disabled, ), ), ) ); // Notifications \CSF::createSection( $prefix, array( 'title' => __( 'Notifications', Bootstrap::TEXT_DOMAIN ), 'icon' => 'far fa-bell', 'fields' => array( /** * PRO features (disabled) */ array( 'title' => __( 'Admin Notification', 'pre-orders-for-woocommerce' ), 'type' => 'number', 'class' => 'max-w-70', 'default' => '0', 'class' => 'cix-only-pro', 'subtitle' => 'Available in Pro Version! ', 'desc' => __( 'Amount of days in advance that admins will get an e-mail notification when a preorder will be available.
Leave 0 if you want to leave this feature disabled', 'pre-orders-for-woocommerce' ), 'id' => 'wc_preorders_alert' . $this->text_disabled, ), array( 'title' => __( 'Customer Notification', 'pre-orders-for-woocommerce' ), 'type' => 'switcher', 'class' => 'cix-only-pro', 'subtitle' => 'Available in Pro Version! ', 'desc' => __( 'When preorder date will arrived customers will get email notification with order details', 'pre-orders-for-woocommerce' ), 'id' => 'wc_preorder_customer_notification' . $this->text_disabled, ), array( 'title' => __( 'Update Date Notification', 'pre-orders-for-woocommerce' ), 'type' => 'switcher', 'class' => 'cix-only-pro', 'subtitle' => 'Available in Pro Version! ', 'desc' => __( 'Send email notification to customers when preorder date is updated by using bulk-edit mode', 'pre-orders-for-woocommerce' ), 'id' => 'preoder_bulk_edit_notification' . $this->text_disabled, ), ), ) ); // Email Tempaltes \CSF::createSection( $prefix, array( 'title' => __( 'Email Templates', 'pre-orders-for-woocommerce' ), 'icon' => 'fas fa-envelope', 'fields' => array( // A Callback Field Example array( 'type' => 'callback', 'function' => [$this, 'wcPreOrderEmailList'], ), ), ) ); } public function bp_admin_menu() { add_menu_page( 'Bright Plugins', 'Bright Plugins', 'manage_options', 'brightplugins', null, plugin_dir_url( __DIR__ ) . '/media/img/bp-logo-icon.png', 60 ); //do_action( 'bp_sub_menu' ); } public function later() { //add_submenu_page( 'brightplugins', '', __( 'Pre-Orders Settings', 'pre-orders-for-woocommerce' ), 'manage_options', admin_url( 'admin.php?page=wc-settings&tab=settings_tab_preorders' ) ); remove_submenu_page( 'brightplugins', 'brightplugins' ); } /** * @param $links */ public function wcpo_plugin_settings_link( $links ) { $row_meta = array( 'settings' => '' . __( 'Settings', 'pre-orders-for-woocommerce' ) . '', 'pro_link' => '' . esc_html__( 'Pro Version', 'pre-orders-for-woocommerce' ) . '', ); return array_merge( $links, $row_meta ); } /** * todo: need to remove this function * @param $settings_tabs * @return mixed */ public function addSettingsTab( $settings_tabs ) { $settings_tabs['settings_tab_preorders'] = __( 'Pre-Orders', 'pre-orders-for-woocommerce' ); return $settings_tabs; } /** * Sets the default options for the pre-order plugin. * * @return void */ public static function defaultOptions() { $defaultOptions = [ 'wc_preorders_button_text' => 'Pre Order Now!', 'wc_preorders_always_choose_date' => 'yes', 'wc_preorders_mode' => 'either', 'wc_preorders_multiply_shipping' => 'no', 'wc_preorders_is_pro' => 'no', ]; foreach ( $defaultOptions as $option => $value ) { if ( !get_option( $option ) || '' === get_option( $option ) ) { update_option( $option, $value ); } } } /** * This function generates all the content for the Email Templates tab within the plugin settings * * @since 2.0.0 * * @return void */ public function wcPreOrderEmailList() { $templates = [ 'WC_New_Pre_Order_Email' => 'New Pre-order - Admin', 'WC_New_Customer_Pre_Order_Email' => 'Pre-Order Order - Customers', 'WC_Pre_Order_Alert' . $this->text_disabled => 'Pre-order Alert - Admin', 'WC_Preorder_Ready' . $this->text_disabled => 'Pre-order available today - Customers', 'WC_Preorder_Paylater_available' . $this->text_disabled => 'Pre-Order Order (Pay later) - Customers', ]; foreach ( $templates as $key => $template_name ) { if( strpos( $key, $this->text_disabled ) !== false ) { $this->generate_premium_row_disabled_for_email_templates_tab( $template_name ); continue; } echo '' . $template_name . ''; } } /** * @param $data */ public function update_options( $data ) { $old_options = [ 'wc_preorders_button_text' => $data['wc_preorders_button_text'], 'wc_preorders_cart_product_text' => $data['wc_preorders_cart_product_text'], 'wc_preorders_avaiable_date_text' => $data['wc_preorders_avaiable_date_text'], 'wc_preorders_status_text' => $data['preorder_status_label'], ]; foreach ( $old_options as $old_option => $value ) { update_option( $old_option, $value ); } } /** * Returns an array of default options for the plugin from the database [wc_preorders_*] (if exists). * * @return array The default options. */ public function optDefaults() { $opts = array( 'wc_preorders_mode' => get_option( 'wc_preorders_mode', 'either' ), 'wc_preorders_button_text' => get_option( 'wc_preorders_button_text', 'Pre Order Now!' ), 'wc_preorders_cart_product_text' => get_option( 'wc_preorders_cart_product_text', 'Note: this item will be available for shipping in {days_left} days' ), 'wc_preorders_avaiable_date_text' => get_option( 'wc_preorders_avaiable_date_text', 'Available on {date_format}' ), 'preorder_status_label' => get_option( 'wc_preorders_status_text', 'Pre Ordered' ), ); return $opts; } /** * Generates premiun row disabled for email templates tab * * @since 2.0.0 * * @return void */ public function generate_premium_row_disabled_for_email_templates_tab( $template_name ) { ?>
Available in Pro Version!