Passed
Branch master (6d02eb)
by Daniel
03:14 queued 01:22
created

Algolia_Woo_Indexer   F

Complexity

Total Complexity 62

Size/Duplication

Total Lines 654
Duplicated Lines 0 %

Importance

Changes 33
Bugs 0 Features 1
Metric Value
eloc 235
c 33
b 0
f 1
dl 0
loc 654
rs 3.44
wmc 62

21 Methods

Rating   Name   Duplication   Size   Complexity  
A algolia_woo_indexer_index_name_output() 0 7 2
A send_new_product_to_algolia() 0 6 3
A algolia_woo_indexer_section_text() 0 3 1
B init() 0 56 6
A maybe_send_products() 0 4 2
A setup_settings_sections() 0 57 2
A algolia_woo_indexer_application_id_output() 0 7 2
A __construct() 0 3 1
A algolia_woo_indexer_automatically_send_new_products_output() 0 10 2
B update_settings_options() 0 66 11
A algolia_woo_indexer_admin_api_key_output() 0 9 2
A check_algolia_input_values() 0 12 4
A can_connect_to_algolia() 0 13 2
A get_instance() 0 6 2
B send_products_to_algolia() 0 114 9
A deactivate_plugin() 0 3 1
A admin_menu() 0 9 1
A load_textdomain() 0 3 1
A algolia_woo_indexer_settings() 0 21 2
A settings_fields_validate_options() 0 9 1
A activate_plugin() 0 39 5

How to fix   Complexity   

Complex Class

Complex classes like Algolia_Woo_Indexer often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use Algolia_Woo_Indexer, and based on these observations, apply Extract Interface, too.

1
<?php
2
/**
3
 * Main Algolia Woo Indexer class
4
 * Called from main plugin file algolia-woo-indexer.php
5
 *
6
 * @package algolia-woo-indexer
7
 */
8
9
namespace Algowoo;
10
11
use \Algowoo\Algolia_Check_Requirements as Algolia_Check_Requirements;
12
use \Algowoo\Algolia_Verify_Nonces as Algolia_Verify_Nonces;
13
14
/**
15
 * Abort if this file is called directly
16
 */
17
if ( ! defined( 'ABSPATH' ) ) {
18
	exit;
19
}
20
21
/**
22
 * Include plugin file if function is_plugin_active does not exist
23
 */
24
if (! function_exists('is_plugin_active')) {
25
    require_once(ABSPATH . '/wp-admin/includes/plugin.php');
26
}
27
28
/**
29
 * Define the plugin version and the database table name
30
 */
31
define( 'ALGOWOO_DB_OPTION', '_algolia_woo_indexer' );
32
define( 'ALGOWOO_CURRENT_DB_VERSION', '0.3' );
33
34
/**
35
 * Define application constants
36
 */
37
define( 'CHANGE_ME', 'change me' );
38
39
/**
40
 * Database table names
41
 */
42
define('INDEX_NAME', '_index_name');
43
define('AUTOMATICALLY_SEND_NEW_PRODUCTS', '_automatically_send_new_products');
44
define('ALGOLIA_APPLICATION_ID', '_application_id');
45
define('ALGOLIA_API_KEY', '_admin_api_key');
46
47
if (! class_exists('Algolia_Woo_Indexer')) {
48
    /**
49
     * Algolia WooIndexer main class
50
     */
51
    class Algolia_Woo_Indexer
52
    {
53
        const PLUGIN_NAME      = 'Algolia Woo Indexer';
54
        const PLUGIN_TRANSIENT = 'algowoo-plugin-notice';
55
56
        /**
57
         * Class instance
58
         *
59
         * @var object
60
         */
61
        private static $instance;
62
63
        /**
64
         * The plugin URL
65
         *
66
         * @var string
67
         */
68
        private static $plugin_url = '';
69
70
        /**
71
         * The Algolia instance
72
         *
73
         * @var \Algolia\AlgoliaSearch\SearchClient
74
         */
75
        private static $algolia = null;
76
77
        /**
78
         * Class constructor
79
         *
80
         * @return void
81
         */
82
        public function __construct()
83
        {
84
            $this->init();
85
        }
86
87
        /**
88
         * Setup sections and fields to store and retrieve values from Settings API
89
         *
90
         * @return void
91
         */
92
        public static function setup_settings_sections()
93
        {
94
            /**
95
            * Setup arguments for settings sections and fields
96
            *
97
            * @see https://developer.wordpress.org/reference/functions/register_setting/
98
            */
99
            if (is_admin()) {
100
                $arguments = array(
101
                    'type'              => 'string',
102
                    'sanitize_callback' => 'settings_fields_validate_options',
103
                    'default'           => null,
104
                );
105
                register_setting('algolia_woo_options', 'algolia_woo_options', $arguments);
106
107
                /**
108
                 * Make sure we reference the instance of the current class by using self::get_instance()
109
                 * This way we can setup the correct callback function for add_settings_section and add_settings_field
110
                 */
111
                $algowooindexer = self::get_instance();
112
113
                /**
114
                 * Add our necessary settings sections and fields
115
                 */
116
                add_settings_section(
117
                    'algolia_woo_indexer_main',
118
                    esc_html__('Algolia Woo Plugin Settings', 'algolia-woo-indexer'),
119
                    array( $algowooindexer, 'algolia_woo_indexer_section_text' ),
120
                    'algolia_woo_indexer'
121
                );
122
                add_settings_field(
123
                    'algolia_woo_indexer_application_id',
124
                    esc_html__('Application ID', 'algolia-woo-indexer'),
125
                    array( $algowooindexer, 'algolia_woo_indexer_application_id_output' ),
126
                    'algolia_woo_indexer',
127
                    'algolia_woo_indexer_main'
128
                );
129
                add_settings_field(
130
                    'algolia_woo_indexer_admin_api_key',
131
                    esc_html__('Admin API Key', 'algolia-woo-indexer'),
132
                    array( $algowooindexer, 'algolia_woo_indexer_admin_api_key_output' ),
133
                    'algolia_woo_indexer',
134
                    'algolia_woo_indexer_main'
135
                );
136
                add_settings_field(
137
                    'algolia_woo_indexer_index_name',
138
                    esc_html__('Index name (will be created if not existing)', 'algolia-woo-indexer'),
139
                    array( $algowooindexer, 'algolia_woo_indexer_index_name_output' ),
140
                    'algolia_woo_indexer',
141
                    'algolia_woo_indexer_main'
142
                );
143
                add_settings_field(
144
                    'algolia_woo_indexer_automatically_send_new_products',
145
                    esc_html__('Automatically index new products', 'algolia-woo-indexer'),
146
                    array( $algowooindexer, 'algolia_woo_indexer_automatically_send_new_products_output' ),
147
                    'algolia_woo_indexer',
148
                    'algolia_woo_indexer_main'
149
                );
150
            }
151
        }
152
153
        /**
154
         * Output for admin API key field
155
         *
156
         * @see https://developer.wordpress.org/reference/functions/wp_nonce_field/
157
         *
158
         * @return void
159
         */
160
        public static function algolia_woo_indexer_admin_api_key_output()
161
        {
162
            $api_key = get_option(ALGOWOO_DB_OPTION . ALGOLIA_API_KEY);
163
            $api_key = is_string($api_key) ? $api_key : CHANGE_ME;
164
165
            wp_nonce_field('algolia_woo_indexer_admin_api_nonce_action', 'algolia_woo_indexer_admin_api_nonce_name');
166
167
            echo "<input id='algolia_woo_indexer_admin_api_key' name='algolia_woo_indexer_admin_api_key[key]'
168
				type='text' value='" . esc_attr($api_key) . "' />";
169
        }
170
171
        /**
172
         * Output for application ID field
173
         *
174
         * @return void
175
         */
176
        public static function algolia_woo_indexer_application_id_output()
177
        {
178
            $application_id = get_option(ALGOWOO_DB_OPTION . ALGOLIA_APPLICATION_ID);
179
            $application_id = is_string($application_id) ? $application_id : CHANGE_ME;
180
181
            echo "<input id='algolia_woo_indexer_application_id' name='algolia_woo_indexer_application_id[id]'
182
				type='text' value='" . esc_attr($application_id) . "' />";
183
        }
184
185
        /**
186
         * Output for index name field
187
         *
188
         * @return void
189
         */
190
        public static function algolia_woo_indexer_index_name_output()
191
        {
192
            $index_name = get_option(ALGOWOO_DB_OPTION . INDEX_NAME);
193
            $index_name = is_string($index_name) ? $index_name : CHANGE_ME;
194
195
            echo "<input id='algolia_woo_indexer_index_name' name='algolia_woo_indexer_index_name[name]'
196
				type='text' value='" . esc_attr($index_name) . "' />";
197
        }
198
        
199
        /**
200
         * Output for checkbox to check if we automatically send new products to Algolia
201
         *
202
         * @return void
203
         */
204
        public static function algolia_woo_indexer_automatically_send_new_products_output()
205
        {
206
            /**
207
             * Sanitization is not really needed as the variable is not directly echoed
208
             * But I have still done it to be 100% safe
209
             */
210
            $automatically_send_new_products = get_option(ALGOWOO_DB_OPTION . AUTOMATICALLY_SEND_NEW_PRODUCTS);
211
            $automatically_send_new_products = (! empty($automatically_send_new_products)) ? 1 : 0; ?>
212
			<input id="algolia_woo_indexer_automatically_send_new_products" name="algolia_woo_indexer_automatically_send_new_products[checked]"
213
			type="checkbox" <?php checked(1, $automatically_send_new_products); ?> />
214
			<?php
215
        }
216
217
        /**
218
         * Section text for plugin settings section text
219
         *
220
         * @return void
221
         */
222
        public static function algolia_woo_indexer_section_text()
223
        {
224
            echo esc_html__('Enter your settings here', 'algolia-woo-indexer');
225
        }
226
227
        /**
228
         * Check if we are going to send products by verifying send products nonce
229
         *
230
         * @return void
231
         */
232
        public static function maybe_send_products()
233
        {
234
            if (true === Algolia_Verify_Nonces::verify_send_products_nonce()) {
235
                self::send_products_to_algolia();
236
            }
237
        }
238
239
        /**
240
         * Initialize class, setup settings sections and fields
241
         *
242
         * @return void
243
         */
244
        public static function init()
245
        {
246
247
            /**
248
             * Fetch the option to see if we are going to automatically send new products
249
             */
250
            $automatically_send_new_products = get_option(ALGOWOO_DB_OPTION . AUTOMATICALLY_SEND_NEW_PRODUCTS);
251
252
            /**
253
             * Check that we have the minimum versions required and all of the required PHP extensions
254
             */
255
            Algolia_Check_Requirements::check_unmet_requirements();
256
257
            if (! Algolia_Check_Requirements::algolia_wp_version_check() || ! Algolia_Check_Requirements::algolia_php_version_check()) {
258
                add_action(
259
                    'admin_notices',
260
                    function () {
261
                        echo '<div class="error notice">
262
                                  <p>' . esc_html__('Please check the server requirements for Algolia Woo Indexer. <br/> It requires minimum PHP version 7.2 and WordPress version 5.0', 'algolia-woo-indexer') . '</p>
263
                                </div>';
264
                    }
265
                );
266
            }
267
268
            $ob_class = get_called_class();
269
270
            /**
271
             * Setup translations
272
             */
273
            add_action('plugins_loaded', array( $ob_class, 'load_textdomain' ));
274
275
            /**
276
             * Add actions to setup admin menu
277
             */
278
            if (is_admin()) {
279
                add_action('admin_menu', array( $ob_class, 'admin_menu' ));
280
                add_action('admin_init', array( $ob_class, 'setup_settings_sections' ));
281
                add_action('admin_init', array( $ob_class, 'update_settings_options' ));
282
                add_action('admin_init', array( $ob_class, 'maybe_send_products' ));
283
284
                /**
285
                 * Register hook to automatically send new products if the option is set
286
                 */
287
288
                if ('1' === $automatically_send_new_products) {
289
                    add_action('save_post', array( $ob_class, 'send_new_product_to_algolia' ), 10, 3);
290
                }
291
292
                self::$plugin_url = admin_url('options-general.php?page=algolia-woo-indexer-settings');
293
294
                if (! is_plugin_active('woocommerce/woocommerce.php')) {
295
                    add_action(
296
                        'admin_notices',
297
                        function () {
298
                            echo '<div class="error notice">
299
								  <p>' . esc_html__('WooCommerce plugin must be enabled for Algolia Woo Indexer to work.', 'algolia-woo-indexer') . '</p>
300
								</div>';
301
                        }
302
                    );
303
                }
304
            }
305
        }
306
307
        /**
308
         * Send a single product to Algolia once a new product has been published
309
         *
310
         * @param int   $post_id ID of the product.
311
         * @param array $post Post array.
312
         *
313
         * @return void
314
         */
315
        public static function send_new_product_to_algolia($post_id, $post)
316
        {
317
            if ('publish' !== $post->post_status || 'product' !== $post->post_type) {
318
                return;
319
            }
320
            self::send_products_to_algolia($post_id);
321
        }
322
323
        /**
324
         * Verify nonces before we update options and settings
325
         * Also retrieve the value from the send_products_to_algolia hidden field to check if we are sending products to Algolia
326
         *
327
         * @return void
328
         */
329
        public static function update_settings_options()
330
        {
331
            Algolia_Verify_Nonces::verify_settings_nonce();
332
333
            /**
334
             * Do not proceed if we are going to send products
335
             */
336
            if (true === Algolia_Verify_Nonces::verify_send_products_nonce()) {
337
                return;
338
            }
339
340
            /**
341
             * Filter the application id, api key, index name and verify that the input is an array
342
             *
343
             * @see https://www.php.net/manual/en/function.filter-input.php
344
             */
345
            $post_application_id             = filter_input(INPUT_POST, 'algolia_woo_indexer_application_id', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
346
            $post_api_key                    = filter_input(INPUT_POST, 'algolia_woo_indexer_admin_api_key', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
347
            $post_index_name                 = filter_input(INPUT_POST, 'algolia_woo_indexer_index_name', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
348
            $automatically_send_new_products = filter_input(INPUT_POST, 'algolia_woo_indexer_automatically_send_new_products', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
349
350
            /**
351
             * Properly sanitize text fields before updating data
352
             *
353
             * @see https://developer.wordpress.org/reference/functions/sanitize_text_field/
354
             */
355
            $filtered_application_id = sanitize_text_field($post_application_id['id']);
356
            $filtered_api_key        = sanitize_text_field($post_api_key['key']);
357
            $filtered_index_name     = sanitize_text_field($post_index_name['name']);
358
359
            /**
360
             * Sanitizing by setting the value to either 1 or 0
361
             */
362
            $filtered_automatically_send_new_products = (! empty($automatically_send_new_products)) ? 1 : 0;
363
364
            /**
365
             * Values have been filtered and sanitized
366
             * Check if set and not empty and update the database
367
             *
368
             * @see https://developer.wordpress.org/reference/functions/update_option/
369
             */
370
            if (isset($filtered_application_id) && (! empty($filtered_application_id))) {
371
                update_option(
372
                    ALGOWOO_DB_OPTION . ALGOLIA_APPLICATION_ID,
373
                    $filtered_application_id
374
                );
375
            }
376
377
            if (isset($filtered_api_key) && (! empty($filtered_api_key))) {
378
                update_option(
379
                    ALGOWOO_DB_OPTION . ALGOLIA_API_KEY,
380
                    $filtered_api_key
381
                );
382
            }
383
384
            if (isset($filtered_index_name) && (! empty($filtered_index_name))) {
385
                update_option(
386
                    ALGOWOO_DB_OPTION . INDEX_NAME,
387
                    $filtered_index_name
388
                );
389
            }
390
391
            if (isset($filtered_automatically_send_new_products) && (! empty($filtered_automatically_send_new_products))) {
392
                update_option(
393
                    ALGOWOO_DB_OPTION . AUTOMATICALLY_SEND_NEW_PRODUCTS,
394
                    $filtered_automatically_send_new_products
395
                );
396
            }
397
        }
398
399
		/**
400
		 * Check if values are empty and display error notice if not all values have been set
401
		 *
402
		 *  @param string $algolia_application_id Algolia application ID.
403
		 * 	@param string $algolia_api_key Algolia API key.
404
		 * 	@param string $algolia_index_name Algolia index name.
405
		 * 
406
		 */
407
		public static function check_algolia_input_values($algolia_application_id, $algolia_api_key, $algolia_index_name )
408
		{	
409
			if (empty($algolia_application_id) || empty($algolia_api_key || empty($algolia_index_name))) {
410
                add_action(
411
                    'admin_notices',
412
                    function () {
413
                        echo '<div class="error notice">
414
							  <p>' . esc_html__('All settings need to be set for the plugin to work.', 'algolia-woo-indexer') . '</p>
415
							</div>';
416
                    }
417
                );
418
                return;
419
            }
420
        }
421
422
		/**
423
		 * Check if we can connect to Algolia, if not, handle the exception, display an error and then return
424
		 */
425
		public static function can_connect_to_algolia() {
426
            try {
427
                self::$algolia->listApiKeys();
428
            } catch (\Algolia\AlgoliaSearch\Exceptions\UnreachableException $error) {
429
                add_action(
430
                    'admin_notices',
431
                    function () {
432
                        echo '<div class="error notice">
433
							  <p>' . esc_html__('An error has been encountered. Please check your application ID and API key. ', 'algolia-woo-indexer') . '</p>
434
							</div>';
435
                    }
436
                );
437
                return;
438
            }
439
		}
440
441
        /**
442
         * Send WooCommerce products to Algolia
443
         *
444
         * @param Int $id Product to send to Algolia if we send only a single product
445
         * @return void
446
         */
447
        public static function send_products_to_algolia($id = '')
448
        {
449
            /**
450
             * Remove classes from plugin URL and autoload Algolia with Composer
451
             */
452
453
            $base_plugin_directory = str_replace('classes', '', dirname(__FILE__));
454
            require_once $base_plugin_directory . '/vendor/autoload.php';
455
456
            /**
457
             * Fetch the required variables from the Settings API
458
             */
459
460
            $algolia_application_id = get_option(ALGOWOO_DB_OPTION . ALGOLIA_APPLICATION_ID);
461
			$algolia_application_id = is_string($algolia_application_id) ? $algolia_application_id : CHANGE_ME;
462
463
            $algolia_api_key        = get_option(ALGOWOO_DB_OPTION . ALGOLIA_API_KEY);
464
			$algolia_api_key		= is_string($algolia_api_key) ?$algolia_api_key : CHANGE_ME;
465
466
            $algolia_index_name     = get_option(ALGOWOO_DB_OPTION . INDEX_NAME);
467
			$algolia_index_name		= is_string($algolia_index_name) ? $algolia_index_name : CHANGE_ME;
468
469
			/**
470
             * Display admin notice and return if not all values have been set
471
             */
472
473
			self::check_algolia_input_values($algolia_application_id, $algolia_api_key, $algolia_index_name);
474
475
            /**
476
             * Initiate the Algolia client
477
             */
478
            self::$algolia = \Algolia\AlgoliaSearch\SearchClient::create($algolia_application_id, $algolia_api_key);
479
480
			/**
481
             * Check if we can connect, if not, handle the exception, display an error and then return
482
             */
483
			self::can_connect_to_algolia();
484
			
485
			/**
486
             * Initialize the search index and set the name to the option from the database
487
             */
488
            $index = self::$algolia->initIndex($algolia_index_name);
489
490
            /**
491
             * Setup arguments for sending all products to Algolia
492
             *
493
             * Limit => -1 means we send all products
494
             */
495
            $arguments = array(
496
                'status'   => 'publish',
497
                'limit'    => -1,
498
                'paginate' => false,
499
            );
500
501
            /**
502
            * Setup arguments for sending only a single product
503
            */
504
            if (isset($id) && '' !== $id) {
505
                $arguments = array(
506
                    'status'   => 'publish',
507
                    'include'  => array( $id ),
508
                    'paginate' => false,
509
                );
510
            }
511
512
            /**
513
             * Fetch all products from WooCommerce
514
             *
515
             * @see https://docs.woocommerce.com/wc-apidocs/function-wc_get_products.html
516
             */
517
            $products = /** @scrutinizer ignore-call */ wc_get_products($arguments);
518
519
            if ( empty( $products ) ) {
520
                return;
521
            }
522
            $records = array();
523
            $record  = array();
524
525
            foreach ($products as $product) {
526
                /**
527
                 * Extract image from $product->get_image()
528
                 */
529
                preg_match('/<img(.*)src(.*)=(.*)"(.*)"/U', $product->get_image(), $result);
530
                $product_image = array_pop($result);
531
                /**
532
                 * Build the record array using the information from the WooCommerce product
533
                 */
534
                $record['objectID']          = $product->get_id();
535
                $record['product_name']      = $product->get_name();
536
                $record['product_image']     = $product_image;
537
                $record['short_description'] = $product->get_short_description();
538
                $record['regular_price']     = $product->get_regular_price();
539
                $record['sale_price']        = $product->get_sale_price();
540
                $record['on_sale']           = $product->is_on_sale();
541
542
                $records[] = $record;
543
            }
544
            wp_reset_postdata();
545
546
            /**
547
             * Send the information to Algolia and save the result
548
             * If result is NullResponse, print an error message
549
             */
550
            $result = $index->saveObjects($records);
551
552
            if ('Algolia\AlgoliaSearch\Response\NullResponse' === get_class($result)) {
553
				wp_die(esc_html__('No response from the server. Please check your settings and try again', 'algolia_woo_indexer_settings'));    
554
            }
555
556
            /**
557
             * Display success message
558
             */
559
            echo '<div class="notice notice-success is-dismissible">
560
					 	<p>' . esc_html__('Product(s) sent to Algolia.', 'algolia-woo-indexer') . '</p>
561
				  		</div>';
562
        }
563
564
        /**
565
         * Sanitize input in settings fields and filter through regex to accept only a-z and A-Z
566
         *
567
         * @param string $input Settings text data
568
         * @return array
569
         */
570
        public static function settings_fields_validate_options($input)
571
        {
572
            $valid         = array();
573
            $valid['name'] = preg_replace(
574
                '/[^a-zA-Z\s]/',
575
                '',
576
                $input['name']
577
            );
578
            return $valid;
579
        }
580
581
        /**
582
         * Load text domain for translations
583
         *
584
         * @return void
585
         */
586
        public static function load_textdomain()
587
        {
588
            load_plugin_textdomain('algolia-woo-indexer', false, basename(dirname(__FILE__)) . '/languages/');
589
        }
590
591
        /**
592
         * Add the new menu to settings section so that we can configure the plugin
593
         *
594
         * @return void
595
         */
596
        public static function admin_menu()
597
        {
598
            add_submenu_page(
599
                'options-general.php',
600
                esc_html__('Algolia Woo Indexer Settings', 'algolia-woo-indexer'),
601
                esc_html__('Algolia Woo Indexer Settings', 'algolia-woo-indexer'),
602
                'manage_options',
603
                'algolia-woo-indexer-settings',
604
                array( get_called_class(), 'algolia_woo_indexer_settings' )
605
            );
606
        }
607
608
        /**
609
         * Display settings and allow user to modify them
610
         *
611
         * @return void
612
         */
613
        public static function algolia_woo_indexer_settings()
614
        {
615
            /**
616
            * Verify that the user can access the settings page
617
            */
618
            if (! current_user_can('manage_options')) {
619
                wp_die(esc_html__('Action not allowed.', 'algolia_woo_indexer_settings'));
620
            } ?>
621
			<div class="wrap">
622
				<h1><?php esc_html__('Algolia Woo Indexer Settings', 'algolia-woo-indexer'); ?></h1>
623
				<form action="<?php echo esc_url(self::$plugin_url); ?>" method="POST">
624
			<?php
625
            settings_fields('algolia_woo_options');
626
            do_settings_sections('algolia_woo_indexer');
627
            submit_button('', 'primary wide'); ?>
628
				</form>
629
				<form action="<?php echo esc_url(self::$plugin_url); ?>" method="POST">
630
					<?php wp_nonce_field('send_products_to_algolia_nonce_action', 'send_products_to_algolia_nonce_name'); ?>
631
					<input type="hidden" name="send_products_to_algolia" id="send_products_to_algolia" value="true" />
632
					<?php submit_button(esc_html__('Send products to Algolia', 'algolia_woo_indexer_settings'), 'primary wide', '', false); ?>
633
				</form>
634
			</div>
635
			<?php
636
        }
637
638
        /**
639
         * Get active object instance
640
         *
641
         * @return object
642
         */
643
        public static function get_instance()
644
        {
645
            if (! self::$instance) {
646
                self::$instance = new Algolia_Woo_Indexer();
647
            }
648
            return self::$instance;
649
        }
650
651
        /**
652
         * The actions to execute when the plugin is activated.
653
         *
654
         * @return void
655
         */
656
        public static function activate_plugin()
657
        {
658
659
            /**
660
             * Set default values for options if not already set
661
             */
662
            $automatically_send_new_products = get_option(ALGOWOO_DB_OPTION . AUTOMATICALLY_SEND_NEW_PRODUCTS);
663
            $algolia_application_id          = get_option(ALGOWOO_DB_OPTION . ALGOLIA_APPLICATION_ID);
664
            $algolia_api_key                 = get_option(ALGOWOO_DB_OPTION . ALGOLIA_API_KEY);
665
            $algolia_index_name              = get_option(ALGOWOO_DB_OPTION . INDEX_NAME);
666
            
667
            if (empty($automatically_send_new_products)) {
668
                add_option(
669
                    ALGOWOO_DB_OPTION . AUTOMATICALLY_SEND_NEW_PRODUCTS,
670
                    '0'
671
                );
672
            }
673
674
            if (empty($algolia_application_id)) {
675
                add_option(
676
                    ALGOWOO_DB_OPTION . ALGOLIA_APPLICATION_ID,
677
                    'Change me'
678
                );
679
            }
680
681
            if (empty($algolia_api_key)) {
682
                add_option(
683
                    ALGOWOO_DB_OPTION . ALGOLIA_API_KEY,
684
                    'Change me'
685
                );
686
            }
687
688
            if (empty($algolia_index_name)) {
689
                add_option(
690
                    ALGOWOO_DB_OPTION . INDEX_NAME,
691
                    'Change me'
692
                );
693
            }
694
            set_transient(self::PLUGIN_TRANSIENT, true);
695
        }
696
697
        /**
698
         * The actions to execute when the plugin is deactivated.
699
         *
700
         * @return void
701
         */
702
        public static function deactivate_plugin()
703
        {
704
            delete_transient(self::PLUGIN_TRANSIENT);
705
        }
706
    }
707
}