PluginProbe
seQura / 3.1.0
seQura v3.1.0
4.3.4 4.3.3 4.3.2 4.3.1 trunk 2.0.0 2.0.10 2.0.11 2.0.12 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 3.0.0 3.0.2 3.0.5 3.0.6 3.0.7 3.1.0 3.1.1 3.2.0 3.2.1 3.2.2 4.0.0 All 30 releases
sequra / src / class-plugin.php

class-plugin.php in seQura 3.1.0, at src/class-plugin.php

210 lines 7.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * The core plugin class.
4 *
5 * @package SeQura/WC
6 */
7
8 namespace SeQura\WC;
9
10 use SeQura\WC\Controllers\Hooks\Asset\Interface_Assets_Controller;
11 use SeQura\WC\Controllers\Hooks\Product\Interface_Product_Controller;
12 use SeQura\WC\Controllers\Hooks\I18n\Interface_I18n_Controller;
13 use SeQura\WC\Controllers\Hooks\Order\Interface_Order_Controller;
14 use SeQura\WC\Controllers\Hooks\Payment\Interface_Payment_Controller;
15 use SeQura\WC\Controllers\Hooks\Process\Interface_Async_Process_Controller;
16 use SeQura\WC\Controllers\Hooks\Settings\Interface_Settings_Controller;
17 use SeQura\WC\Controllers\Rest\REST_Controller;
18 use SeQura\WC\Services\Interface_Constants;
19 use SeQura\WC\Services\Migration\Interface_Migration_Manager;
20
21 /**
22 * The core plugin class.
23 */
24 class Plugin {
25
26 /**
27 * The plugin data.
28 *
29 * @var array<string, string>
30 */
31 private $data;
32
33 /**
34 * The WordPress version
35 *
36 * @var string
37 */
38 private $wp_version;
39
40 /**
41 * The WooCommerce version
42 *
43 * @var string
44 */
45 private $wc_version;
46
47 /**
48 * The plugin base name.
49 *
50 * @var string
51 */
52 private $base_name;
53
54 /**
55 * The plugin file path.
56 *
57 * @var string
58 */
59 private $file_path;
60
61 /**
62 * Migration manager.
63 *
64 * @var Interface_Migration_Manager
65 */
66 private $migration_manager;
67
68 private const HOOK_DELIVERY_REPORT = 'sequra_delivery_report';
69 private const HOOK_CLEANUP_ORDERS = 'sequra_cleanup_orders';
70
71 /**
72 * Construct the plugin and bind hooks with controllers.
73 */
74 public function __construct(
75 Interface_Constants $constants,
76 Interface_Migration_Manager $migration_manager,
77 Interface_I18n_Controller $i18n_controller,
78 Interface_Assets_Controller $assets_controller,
79 Interface_Settings_Controller $settings_controller,
80 Interface_Payment_Controller $payment_controller,
81 REST_Controller $rest_settings_controller,
82 REST_Controller $rest_onboarding_controller,
83 REST_Controller $rest_payment_controller,
84 REST_Controller $rest_log_controller,
85 Interface_Product_Controller $product_controller,
86 Interface_Async_Process_Controller $async_process_controller,
87 Interface_Order_Controller $order_controller
88 ) {
89 $this->data = $constants->get_plugin_data();
90 $this->wp_version = $constants->get_environment_data()['wp_version'] ?? '';
91 $this->wc_version = $constants->get_woocommerce_data()['Version'] ?? '';
92 $this->file_path = $constants->get_plugin_file_path();
93 $this->base_name = $constants->get_plugin_basename();
94 $this->migration_manager = $migration_manager;
95
96 \add_action( 'plugins_loaded', array( $this, 'install' ) );
97
98 // I18n.
99 \add_action( 'plugins_loaded', array( $i18n_controller, 'load_text_domain' ) );
100
101 // Assets hooks.
102 \add_action( 'admin_enqueue_scripts', array( $assets_controller, 'enqueue_admin' ) );
103 \add_action( 'wp_enqueue_scripts', array( $assets_controller, 'enqueue_front' ) );
104
105 // Settings hooks.
106 \add_action( 'admin_menu', array( $settings_controller, 'register_page' ) );
107 \add_filter( "plugin_action_links_{$this->base_name}", array( $settings_controller, 'add_action_link' ), 10, 4 );
108 \add_filter( 'sequra_settings_page_url', array( $settings_controller, 'get_settings_page_url' ) );
109 \add_filter( 'admin_footer_text', array( $settings_controller, 'remove_footer_admin' ) );
110 \add_filter( 'plugin_row_meta', array( $settings_controller, 'add_plugin_row_meta' ), 10, 2 );
111
112 // REST Controllers.
113 \add_action( 'rest_api_init', array( $rest_settings_controller, 'register_routes' ) );
114 \add_action( 'rest_api_init', array( $rest_onboarding_controller, 'register_routes' ) );
115 \add_action( 'rest_api_init', array( $rest_payment_controller, 'register_routes' ) );
116 \add_action( 'rest_api_init', array( $rest_log_controller, 'register_routes' ) );
117
118 // Payment hooks.
119 \add_filter( 'woocommerce_payment_gateways', array( $payment_controller, 'register_gateway_classes' ) );
120 \add_action( 'woocommerce_blocks_loaded', array( $payment_controller, 'register_gateway_gutenberg_block' ) );
121
122 \add_filter( 'woocommerce_thankyou_order_received_text', array( $payment_controller, 'order_received_text' ), 10, 2 );
123 \add_filter( 'woocommerce_order_get_payment_method_title', array( $payment_controller, 'order_get_payment_method_title' ), 10, 2 );
124
125 // Product widget.
126 \add_action( 'woocommerce_after_main_content', array( $product_controller, 'add_widget_shortcode_to_page' ) );
127 \add_action( 'wp_footer', array( $product_controller, 'add_widget_shortcode_to_page' ) );
128
129 \add_shortcode( 'sequra_widget', array( $product_controller, 'do_widget_shortcode' ) );
130 \add_shortcode( 'sequra_cart_widget', array( $product_controller, 'do_cart_widget_shortcode' ) );
131 \add_shortcode( 'sequra_product_listing_widget', array( $product_controller, 'do_product_listing_widget_shortcode' ) );
132
133 \add_action( 'add_meta_boxes', array( $product_controller, 'add_meta_boxes' ) );
134 \add_action( 'woocommerce_process_product_meta', array( $product_controller, 'save_product_meta' ) );
135
136 // Delivery report.
137 \add_action( self::HOOK_DELIVERY_REPORT, array( $async_process_controller, 'send_delivery_report' ) );
138 \add_filter( 'woocommerce_order_data_store_cpt_get_orders_query', array( $order_controller, 'handle_custom_query_vars' ), 10, 3 );
139
140 // Order Update.
141 \add_action( 'woocommerce_order_status_changed', array( $order_controller, 'handle_order_status_changed' ), 10, 4 );
142 \add_action( 'woocommerce_admin_order_data_after_order_details', array( $order_controller, 'show_link_to_sequra_back_office' ) );
143 \add_action( self::HOOK_CLEANUP_ORDERS, array( $order_controller, 'cleanup_orders' ) );
144
145 // WooCommerce Compat.
146 \add_action( 'before_woocommerce_init', array( $this, 'declare_woocommerce_compatibility' ) );
147 }
148
149 /**
150 * Handle activation of the plugin.
151 */
152 public function activate(): void {
153 if ( version_compare( PHP_VERSION, $this->data['RequiresPHP'], '<' ) ) {
154 \deactivate_plugins( $this->base_name );
155 \wp_die( \esc_html( 'This plugin requires PHP ' . $this->data['RequiresPHP'] . ' or greater.' ) );
156 }
157
158 if ( version_compare( $this->wp_version, $this->data['RequiresWP'], '<' ) ) {
159 \deactivate_plugins( $this->base_name );
160 \wp_die( \esc_html( 'This plugin requires WordPress ' . $this->data['RequiresWP'] . ' or greater.' ) );
161 }
162
163 if ( version_compare( $this->wc_version, $this->data['RequiresWC'], '<' ) ) {
164 \deactivate_plugins( $this->base_name );
165 \wp_die( \esc_html( 'This plugin requires WooCommerce ' . $this->data['RequiresWC'] . ' or greater.' ) );
166 }
167 }
168
169 /**
170 * Handle deactivation of the plugin.
171 */
172 public function deactivate(): void {
173 \wp_clear_scheduled_hook( self::HOOK_DELIVERY_REPORT );
174 \wp_clear_scheduled_hook( self::HOOK_CLEANUP_ORDERS );
175 }
176
177 /**
178 * Get a random time between 2AM and 8AM.
179 *
180 * @return int
181 */
182 private function get_random_midnight_time() {
183 $random_offset = \wp_rand( 0, 25200 ); // 60*60*7 seconds from 2AM to 8AM.
184 $tomorrow = gmdate( 'Y-m-d 02:00', strtotime( 'tomorrow' ) );
185 return $random_offset + strtotime( $tomorrow );
186 }
187
188 /**
189 * Execute the installation process if needed.
190 */
191 public function install(): void {
192 if ( ! \wp_next_scheduled( self::HOOK_DELIVERY_REPORT ) ) {
193 \wp_schedule_event( $this->get_random_midnight_time(), 'daily', self::HOOK_DELIVERY_REPORT );
194 }
195 if ( ! \wp_next_scheduled( self::HOOK_CLEANUP_ORDERS ) ) {
196 \wp_schedule_event( $this->get_random_midnight_time(), 'daily', self::HOOK_CLEANUP_ORDERS );
197 }
198 $this->migration_manager->run_install_migrations();
199 }
200
201 /**
202 * Declare WooCommerce compatibility.
203 */
204 public function declare_woocommerce_compatibility() {
205 if ( class_exists( \Automattic\WooCommerce\Utilities\FeaturesUtil::class ) ) {
206 \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', $this->file_path, true );
207 }
208 }
209 }
210