File "woo-payment-gateway-payinstore.php"

Full Path: /home/vantageo/public_html/cache/cache/cache/cache/cache/cache/cache/.wp-cli/wp-content/plugins/pay-in-store-woocommerce-payment-gateway/woo-payment-gateway-payinstore.php
File size: 9.99 KB
MIME-type: text/x-php
Charset: utf-8

<?php

/*
  Plugin Name: Pay in Store WooCommerce Payment Gateway
  Plugin URI: https://www.papaki.com
  Description: Provides a Pay in Store upon pick up Payment Gateway for Woocommerce.
  Version: 1.2.6
  Author: Papaki
  Author URI: https://www.papaki.com
  License: GPL-3.0+
  License URI: http://www.gnu.org/licenses/gpl-3.0.txt
  WC tested up to: 6.2.0
 */

if (!defined('ABSPATH')) {
    exit; // Exit if accessed directly
}

add_action('plugins_loaded', 'woocommerce_payinstore_init', 0);

function woocommerce_payinstore_init() {

    if (!class_exists('WC_Payment_Gateway'))
        return;

    class WC_Gateway_PayInStore extends WC_Payment_Gateway {

        /**
         * Constructor for the gateway.
         */
        public function __construct() {
            $this->id = 'payinstore';
            $this->icon = apply_filters('woocommerce_payinstore_icon', '');
            $this->method_title = __('Pay in Store', 'woocommerce');
            $this->method_description = __('Have your customers pay with cash (or by other means) in store upon  pickup.', 'woocommerce');
            $this->has_fields = false;

            // Load the settings
            $this->init_form_fields();
            $this->init_settings();

            // Get settings
            $this->title = $this->get_option('title');
            $this->description = $this->get_option('description');
            $this->instructions = $this->get_option('instructions', $this->description);
            $this->enable_for_methods = $this->get_option('enable_for_methods', array());
            $this->enable_for_virtual = $this->get_option('enable_for_virtual', 'yes') === 'yes' ? true : false;

            add_action('woocommerce_update_options_payment_gateways_' . $this->id, array($this, 'process_admin_options'));
            add_action('woocommerce_thankyou_payinstore', array($this, 'thankyou_page'));

            // Customer Emails
            add_action('woocommerce_email_before_order_table', array($this, 'email_instructions'), 10, 3);
        }

        /**
         * Initialise Gateway Settings Form Fields.
         */
        public function init_form_fields() {
            $shipping_methods = array();

            if (is_admin()) {
                foreach (WC()->shipping()->load_shipping_methods() as $method) {
                    $shipping_methods[$method->id] = $method->get_method_title();
                }
            }

            $this->form_fields = array(
                'enabled' => array(
                    'title' => __('Enable Pay in Store', 'woocommerce'),
                    'label' => __('Enable Pay in Store', 'woocommerce'),
                    'type' => 'checkbox',
                    'description' => '',
                    'default' => 'no'
                ),
                'title' => array(
                    'title' => __('Title', 'woocommerce'),
                    'type' => 'text',
                    'description' => __('Payment method description that the customer will see on your checkout.', 'woocommerce'),
                    'default' => __('Pay in Store', 'woocommerce'),
                    'desc_tip' => true,
                ),
                'description' => array(
                    'title' => __('Description', 'woocommerce'),
                    'type' => 'textarea',
                    'description' => __('Payment method description that the customer will see on your website.', 'woocommerce'),
                    'default' => __('Pay with cash upon delivery.', 'woocommerce'),
                    'desc_tip' => true,
                ),
                'instructions' => array(
                    'title' => __('Instructions', 'woocommerce'),
                    'type' => 'textarea',
                    'description' => __('Instructions that will be added to the thank you page.', 'woocommerce'),
                    'default' => __('Pay with cash upon delivery.', 'woocommerce'),
                    'desc_tip' => true,
                ),
                'enable_for_methods' => array(
                    'title' => __('Enable for shipping methods', 'woocommerce'),
                    'type' => 'multiselect',
                    'class' => 'wc-enhanced-select',
                    'css' => 'width: 450px;',
                    'default' => '',
                    'description' => __('If Pay in Store is only available for certain methods, set it up here. Leave blank to enable for all methods.', 'woocommerce'),
                    'options' => $shipping_methods,
                    'desc_tip' => true,
                    'custom_attributes' => array(
                        'data-placeholder' => __('Select shipping methods', 'woocommerce')
                    )
                ),
                'enable_for_virtual' => array(
                    'title' => __('Accept for virtual orders', 'woocommerce'),
                    'label' => __('Accept Pay in Store if the order is virtual', 'woocommerce'),
                    'type' => 'checkbox',
                    'default' => 'yes'
                )
            );
        }

        /**
         * Check If The Gateway Is Available For Use.
         *
         * @return bool
         */
        public function is_available() {
            $order = null;
            $needs_shipping = false;
            // Test if shipping is needed first
            if (WC()->cart && WC()->cart->needs_shipping()) {
                $needs_shipping = true;
            } elseif (is_page(wc_get_page_id('checkout')) && 0 < get_query_var('order-pay')) {
                $order_id = absint(get_query_var('order-pay'));
                $order = wc_get_order($order_id);

                // Test if order needs shipping.
                if (0 < sizeof($order->get_items())) {
                    foreach ($order->get_items() as $item) {
                        $_product = $order->get_product_from_item($item);
                        if ($_product && $_product->needs_shipping()) {
                            $needs_shipping = true;
                            break;
                        }
                    }
                }
            }

            $needs_shipping = apply_filters('woocommerce_cart_needs_shipping', $needs_shipping);
        

            // Virtual order, with virtual disabled
            if (!$this->enable_for_virtual && !$needs_shipping) {
                return false;
            }

            // Check methods
            if (!empty($this->enable_for_methods) && $needs_shipping) {
                // Only apply if all packages are being shipped via chosen methods, or order is virtual
                $chosen_shipping_methods_session = WC()->session->get('chosen_shipping_methods');

                if (isset($chosen_shipping_methods_session)) {
                    $chosen_shipping_methods = array_unique($chosen_shipping_methods_session);
                } else {
                    $chosen_shipping_methods = array();
                }

                $check_method = false;

                if (is_object($order)) {
                    if ($order->shipping_method) {
                        // $check_method = $order->shipping_method;
                        $check_method = reset( $order->get_items( 'shipping' ) )->get_method_id();
                    }
                } elseif (empty($chosen_shipping_methods) || sizeof($chosen_shipping_methods) > 1) {
                    $check_method = false;
                } elseif (sizeof($chosen_shipping_methods) == 1) {
                    $check_method = $chosen_shipping_methods[0];
                }

                if (!$check_method) {
                    return false;
                }

                $found = false;

                foreach ($this->enable_for_methods as $method_id) {
                    if (strpos($check_method, $method_id) === 0) {
                        $found = true;
                        break;
                    }
                }

                if (!$found) {
                    return false;
                }
            }

            return parent::is_available();
        }

        /**
         * Process the payment and return the result.
         *
         * @param int $order_id
         * @return array
         */
        public function process_payment($order_id) {
            $order = wc_get_order($order_id);

            // Mark as processing or on-hold (payment won't be taken until delivery)
            $order->update_status(apply_filters('woocommerce_payinstore_process_payment_order_status', $order->has_downloadable_item() ? 'on-hold' : 'processing', $order), __('Payment to be made upon pick up from store.', 'woocommerce'));

            // Reduce stock levels
            $order->reduce_order_stock();

            // Remove cart
            WC()->cart->empty_cart();

            // Return thankyou redirect
            return array(
                'result' => 'success',
                'redirect' => $this->get_return_url($order)
            );
        }

        /**
         * Output for the order received page.
         */
        public function thankyou_page() {
            if ($this->instructions) {
                echo wpautop(wptexturize($this->instructions));
            }
        }

        /**
         * Add content to the WC emails.
         *
         * @access public
         * @param WC_Order $order
         * @param bool $sent_to_admin
         * @param bool $plain_text
         */
        public function email_instructions($order, $sent_to_admin, $plain_text = false) {
            if (method_exists($order, 'get_payment_method')) {
                $payment_method = $order->get_payment_method();
            } else {
                $payment_method = $order->payment_method;
            }
            if ($this->instructions && !$sent_to_admin && 'payinstore' === $payment_method) {
                echo wpautop(wptexturize($this->instructions)) . PHP_EOL;
            }
        }

    }

    function woocommerce_add_payinstore_gateway($methods) {
        $methods[] = 'WC_Gateway_PayInStore';
        return $methods;
    }

    add_filter('woocommerce_payment_gateways', 'woocommerce_add_payinstore_gateway');
}