PluginProbe
seQura / 4.1.0
seQura v4.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 4.1.0, at src/class-plugin.php

211 lines 7.8 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\Constants\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 \add_action( $constants->get_hook_add_order_indexes(), array( $order_controller, 'migrate_orders_to_use_indexes' ) );
145
146 // WooCommerce Compat.
147 \add_action( 'before_woocommerce_init', array( $this, 'declare_woocommerce_compatibility' ) );
148 }
149
150 /**
151 * Handle activation of the plugin.
152 */
153 public function activate(): void {
154 if ( version_compare( PHP_VERSION, $this->data['RequiresPHP'], '<' ) ) {
155 \deactivate_plugins( $this->base_name );
156 \wp_die( \esc_html( 'This plugin requires PHP ' . $this->data['RequiresPHP'] . ' or greater.' ) );
157 }
158
159 if ( version_compare( $this->wp_version, $this->data['RequiresWP'], '<' ) ) {
160 \deactivate_plugins( $this->base_name );
161 \wp_die( \esc_html( 'This plugin requires WordPress ' . $this->data['RequiresWP'] . ' or greater.' ) );
162 }
163
164 if ( version_compare( $this->wc_version, $this->data['RequiresWC'], '<' ) ) {
165 \deactivate_plugins( $this->base_name );
166 \wp_die( \esc_html( 'This plugin requires WooCommerce ' . $this->data['RequiresWC'] . ' or greater.' ) );
167 }
168 }
169
170 /**
171 * Handle deactivation of the plugin.
172 */
173 public function deactivate(): void {
174 \wp_clear_scheduled_hook( self::HOOK_DELIVERY_REPORT );
175 \wp_clear_scheduled_hook( self::HOOK_CLEANUP_ORDERS );
176 }
177
178 /**
179 * Get a random time between 2AM and 8AM.
180 *
181 * @return int
182 */
183 private function get_random_midnight_time() {
184 $random_offset = \wp_rand( 0, 25200 ); // 60*60*7 seconds from 2AM to 8AM.
185 $tomorrow = gmdate( 'Y-m-d 02:00', strtotime( 'tomorrow' ) );
186 return $random_offset + strtotime( $tomorrow );
187 }
188
189 /**
190 * Execute the installation process if needed.
191 */
192 public function install(): void {
193 if ( ! \wp_next_scheduled( self::HOOK_DELIVERY_REPORT ) ) {
194 \wp_schedule_event( $this->get_random_midnight_time(), 'daily', self::HOOK_DELIVERY_REPORT );
195 }
196 if ( ! \wp_next_scheduled( self::HOOK_CLEANUP_ORDERS ) ) {
197 \wp_schedule_event( $this->get_random_midnight_time(), 'daily', self::HOOK_CLEANUP_ORDERS );
198 }
199 $this->migration_manager->run_install_migrations();
200 }
201
202 /**
203 * Declare WooCommerce compatibility.
204 */
205 public function declare_woocommerce_compatibility() {
206 if ( class_exists( \Automattic\WooCommerce\Utilities\FeaturesUtil::class ) ) {
207 \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', $this->file_path, true );
208 }
209 }
210 }
211