* @license GPL3 https://www.gnu.org/licenses/gpl-3.0.en.html * @since 1.0.0 */ namespace Optemiz\AWO; defined('ABSPATH') || exit; if (! class_exists('Frontend') ) { /** * Frontend class * * @class Frontend The class that manages all about frontend * * @category Frontend * @package Optemiz\AWO * @author Nazrul Islam Nayan * @license GPL3 https://www.gnu.org/licenses/gpl-3.0.en.html */ class Frontend { /** * Settings * * @var array|null */ public $settings = null; /** * Class constructor * * Sets up all the appropriate hooks and functions * within our plugin. * * @return void */ public function __construct() { $this->hooks(); do_action('hawo_frontend_loaded', $this); } /** * Instance. * * The instance will be created if it does not exist yet. * * @return self The main instance. * @since 1.0.0 */ public static function instance(): self { static $instance = null; if (is_null($instance) ) { $instance = new self(); } return $instance; } /** * All the executed hooks * * @return void */ protected function hooks(): void { // add_filter( 'woocommerce_payment_complete_order_status', array( $this, 'update_order_status_to_complete' ), -1, 2 ); add_action( 'woocommerce_thankyou', array( $this, 'auto_complete_order_after_checkout' ), 10 ); add_action( 'woocommerce_payment_complete', array( $this, 'auto_complete_when_paid' ), 10 ); add_action( 'hawo_complete_delayed_order', 'hawo_run_delayed_completion', 10, 1 ); add_action( 'woocommerce_process_shop_order_meta', array( $this, 'maybe_complete_admin_order' ), 60, 1 ); add_action( 'woocommerce_new_order', array( $this, 'maybe_complete_pos_order' ), 20, 2 ); add_filter( 'woocommerce_email_enabled_customer_completed_order', 'hawo_filter_completed_email', 10, 2 ); add_action( 'woocommerce_product_options_general_product_data', array( $this, 'render_product_autocomplete_field' ) ); add_action( 'woocommerce_admin_process_product_object', array( $this, 'save_product_autocomplete_field' ) ); add_action( 'product_cat_add_form_fields', array( $this, 'render_category_autocomplete_add_field' ) ); add_action( 'product_cat_edit_form_fields', array( $this, 'render_category_autocomplete_edit_field' ) ); add_action( 'created_product_cat', array( $this, 'save_category_autocomplete_field' ) ); add_action( 'edited_product_cat', array( $this, 'save_category_autocomplete_field' ) ); } /** * After order is done, complete the order. * * @param int $order_id Order ID. * * @return string */ public function auto_complete_order_after_checkout($order_id) { if (! $order_id) { return; } $order = wc_get_order($order_id); if (! $order) { return; } // Early skip if already completed. if ($order->has_status('completed')) { return; } $settings = get_option('hawo_settings', []); if (empty($settings['enable'])) { return; } if (! empty($settings['paid_orders_only']) && ! $order->is_paid()) { hawo_add_log( $order_id, 'skipped', __( 'Order is not paid yet.', 'advanced-autocomplete-orders-for-woocommerce' ) ); return; } // Rule 1 is the current settings. Later rules run only if rule 1 does not match. // An empty wait, status, and email choice still complete now, to Completed, with the normal email. $matched_rule = hawo_first_matching_rule($settings, $order); if ($matched_rule) { hawo_finish_matched_order( $order, $matched_rule ); return; } hawo_add_log( $order_id, 'skipped', hawo_explain_order( $settings, $order )['summary'] ); } /** * Checkbox on the product page. Off until the store turns it on. * * @return void */ public function render_product_autocomplete_field() { if (! hawo_can_edit_pro_settings()) { return; } global $post; $checked = $post ? get_post_meta($post->ID, '_hawo_autocomplete', true) : ''; echo '
'; woocommerce_wp_checkbox( array( 'id' => '_hawo_autocomplete', 'label' => __('Auto-complete', 'advanced-autocomplete-orders-for-woocommerce'), 'description' => __('Complete orders that include this product, using an extra rule. Your main rule still runs first.', 'advanced-autocomplete-orders-for-woocommerce'), 'value' => 'yes' === $checked ? 'yes' : 'no', ) ); echo '
'; } /** * Save the product checkbox. Do not clear it when Pro cannot be edited. * * @param WC_Product $product Product. * @return void */ public function save_product_autocomplete_field( $product ) { if (! hawo_can_edit_pro_settings() || ! current_user_can('edit_products')) { return; } $product->update_meta_data('_hawo_autocomplete', isset($_POST['_hawo_autocomplete']) ? 'yes' : 'no'); // phpcs:ignore WordPress.Security.NonceVerification.Missing } /** * Checkbox on the add-category screen. * * @return void */ public function render_category_autocomplete_add_field() { if (! hawo_can_edit_pro_settings()) { return; } ?>
term_id, '_hawo_autocomplete', true); ?> maybe_complete_by_source( $order_id, 'admin' ); } /** * Complete an in-person sale, only when a rule asks for that. * Checkout orders use this hook too, and are left for the thank-you page. * * @param int $order_id Order ID. * @param WC_Order|null $order Order. * @return void */ public function maybe_complete_pos_order( $order_id, $order = null ) { if ( ! is_object( $order ) && function_exists( 'wc_get_order' ) ) { $order = wc_get_order( $order_id ); } if ( 'pos' !== hawo_trigger_for_order( $order ) ) { return; } $this->maybe_complete_by_source( $order_id, 'pos', $order ); } /** * @param int $order_id Order ID. * @param string $source admin|pos. * @param WC_Order|null $order Order. * @return void */ protected function maybe_complete_by_source( $order_id, $source, $order = null ) { $settings = get_option( 'hawo_settings', array() ); if ( empty( $settings['enable'] ) || ! hawo_rules_allow_source( $settings, $source ) ) { return; } if ( ! is_object( $order ) ) { $order = wc_get_order( $order_id ); } if ( ! $order || $order->has_status( 'completed' ) ) { return; } if ( ! empty( $settings['paid_orders_only'] ) && ! $order->is_paid() ) { hawo_add_log( $order_id, 'skipped', __( 'Order is not paid yet.', 'advanced-autocomplete-orders-for-woocommerce' ) ); return; } $matched_rule = hawo_first_matching_rule( $settings, $order, $source ); if ( $matched_rule ) { hawo_finish_matched_order( $order, $matched_rule ); return; } hawo_add_log( $order_id, 'skipped', hawo_explain_order( $settings, $order, $source )['summary'] ); } public function auto_complete_when_paid( $order_id ) { $settings = get_option('hawo_settings', []); if (empty($settings['complete_when_paid'])) { return; } $this->auto_complete_order_after_checkout($order_id); } /** * Automatically complte the orders. * * @param string $order_status Order Status. * @param int $order_id Order ID. * * @return string */ public function update_order_status_to_complete( $order_status, $order_id ) { $order_status = 'completed'; return $order_status; } } }