Passed
Pull Request — master (#151)
by Daniel
02:18
created
classes/class-algolia-woo-indexer.php 2 patches
Indentation   +465 added lines, -465 removed lines patch added patch discarded remove patch
@@ -23,419 +23,419 @@  discard block
 block discarded – undo
23 23
  * Include plugin file if function is_plugin_active does not exist
24 24
  */
25 25
 if (! function_exists('is_plugin_active')) {
26
-    require_once(ABSPATH . '/wp-admin/includes/plugin.php');
26
+	require_once(ABSPATH . '/wp-admin/includes/plugin.php');
27 27
 }
28 28
 
29 29
 if (! class_exists('Algolia_Woo_Indexer')) {
30
-    /**
31
-     * Algolia WooIndexer main class
32
-     */
33
-    // TODO Rename class "Algolia_Woo_Indexer" to match the regular expression ^[A-Z][a-zA-Z0-9]*$.
34
-     class Algolia_Woo_Indexer
35
-    {
36
-        const PLUGIN_NAME      = 'Algolia Woo Indexer';
37
-        const PLUGIN_TRANSIENT = 'algowoo-plugin-notice';
38
-
39
-        /**
40
-         * Class instance
41
-         *
42
-         * @var object
43
-         */
44
-        private static $instance;
45
-
46
-        /**
47
-         * The plugin URL
48
-         *
49
-         * @var string
50
-         */
51
-        private static $plugin_url = '';
52
-
53
-        /**
54
-         * Class constructor
55
-         *
56
-         * @return void
57
-         */
58
-        public function __construct()
59
-        {
60
-            $this->init();
61
-        }
62
-
63
-        /**
64
-         * Setup sections and fields to store and retrieve values from Settings API
65
-         *
66
-         * @return void
67
-         */
68
-        public static function setup_settings_sections()
69
-        {
70
-            /**
71
-            * Setup arguments for settings sections and fields
72
-            *
73
-            * @see https://developer.wordpress.org/reference/functions/register_setting/
74
-            */
75
-            if (is_admin()) {
76
-                $arguments = array(
77
-                    'type'              => 'string',
78
-                    'sanitize_callback' => 'settings_fields_validate_options',
79
-                    'default'           => null,
80
-                );
81
-                register_setting('algolia_woo_options', 'algolia_woo_options', $arguments);
82
-
83
-                /**
84
-                 * Make sure we reference the instance of the current class by using self::get_instance()
85
-                 * This way we can setup the correct callback function for add_settings_section and add_settings_field
86
-                 */
87
-                $algowooindexer = self::get_instance();
88
-
89
-                /**
90
-                 * Add our necessary settings sections and fields
91
-                 */
92
-                add_settings_section(
93
-                    'algolia_woo_indexer_main',
94
-                    esc_html__('Algolia Woo Plugin Settings', 'algolia-woo-indexer'),
95
-                    array( $algowooindexer, 'algolia_woo_indexer_section_text' ),
96
-                    'algolia_woo_indexer'
97
-                );
98
-                add_settings_field(
99
-                    'algolia_woo_indexer_application_id',
100
-                    esc_html__('Application ID', 'algolia-woo-indexer'),
101
-                    array( $algowooindexer, 'algolia_woo_indexer_application_id_output' ),
102
-                    'algolia_woo_indexer',
103
-                    'algolia_woo_indexer_main'
104
-                );
105
-                add_settings_field(
106
-                    'algolia_woo_indexer_admin_api_key',
107
-                    esc_html__('Admin API Key', 'algolia-woo-indexer'),
108
-                    array( $algowooindexer, 'algolia_woo_indexer_admin_api_key_output' ),
109
-                    'algolia_woo_indexer',
110
-                    'algolia_woo_indexer_main'
111
-                );
112
-                add_settings_field(
113
-                    'algolia_woo_indexer_index_name',
114
-                    esc_html__('Index name (will be created if not existing)', 'algolia-woo-indexer'),
115
-                    array( $algowooindexer, 'algolia_woo_indexer_index_name_output' ),
116
-                    'algolia_woo_indexer',
117
-                    'algolia_woo_indexer_main'
118
-                );
119
-                add_settings_field(
120
-                    'algolia_woo_indexer_automatically_send_new_products',
121
-                    esc_html__('Automatically index new products', 'algolia-woo-indexer'),
122
-                    array( $algowooindexer, 'algolia_woo_indexer_automatically_send_new_products_output' ),
123
-                    'algolia_woo_indexer',
124
-                    'algolia_woo_indexer_main'
125
-                );
126
-            }
127
-        }
128
-
129
-        /**
130
-         * Output for admin API key field
131
-         *
132
-         * @see https://developer.wordpress.org/reference/functions/wp_nonce_field/
133
-         *
134
-         * @return void
135
-         */
136
-        public static function algolia_woo_indexer_admin_api_key_output()
137
-        {
138
-            $api_key = get_option(ALGOWOO_DB_OPTION . ALGOLIA_API_KEY);
139
-            $api_key = is_string($api_key) ? $api_key : CHANGE_ME;
140
-
141
-            wp_nonce_field('algolia_woo_indexer_admin_api_nonce_action', 'algolia_woo_indexer_admin_api_nonce_name');
142
-
143
-            echo "<input id='algolia_woo_indexer_admin_api_key' name='algolia_woo_indexer_admin_api_key[key]'
30
+	/**
31
+	 * Algolia WooIndexer main class
32
+	 */
33
+	// TODO Rename class "Algolia_Woo_Indexer" to match the regular expression ^[A-Z][a-zA-Z0-9]*$.
34
+	 class Algolia_Woo_Indexer
35
+	{
36
+		const PLUGIN_NAME      = 'Algolia Woo Indexer';
37
+		const PLUGIN_TRANSIENT = 'algowoo-plugin-notice';
38
+
39
+		/**
40
+		 * Class instance
41
+		 *
42
+		 * @var object
43
+		 */
44
+		private static $instance;
45
+
46
+		/**
47
+		 * The plugin URL
48
+		 *
49
+		 * @var string
50
+		 */
51
+		private static $plugin_url = '';
52
+
53
+		/**
54
+		 * Class constructor
55
+		 *
56
+		 * @return void
57
+		 */
58
+		public function __construct()
59
+		{
60
+			$this->init();
61
+		}
62
+
63
+		/**
64
+		 * Setup sections and fields to store and retrieve values from Settings API
65
+		 *
66
+		 * @return void
67
+		 */
68
+		public static function setup_settings_sections()
69
+		{
70
+			/**
71
+			 * Setup arguments for settings sections and fields
72
+			 *
73
+			 * @see https://developer.wordpress.org/reference/functions/register_setting/
74
+			 */
75
+			if (is_admin()) {
76
+				$arguments = array(
77
+					'type'              => 'string',
78
+					'sanitize_callback' => 'settings_fields_validate_options',
79
+					'default'           => null,
80
+				);
81
+				register_setting('algolia_woo_options', 'algolia_woo_options', $arguments);
82
+
83
+				/**
84
+				 * Make sure we reference the instance of the current class by using self::get_instance()
85
+				 * This way we can setup the correct callback function for add_settings_section and add_settings_field
86
+				 */
87
+				$algowooindexer = self::get_instance();
88
+
89
+				/**
90
+				 * Add our necessary settings sections and fields
91
+				 */
92
+				add_settings_section(
93
+					'algolia_woo_indexer_main',
94
+					esc_html__('Algolia Woo Plugin Settings', 'algolia-woo-indexer'),
95
+					array( $algowooindexer, 'algolia_woo_indexer_section_text' ),
96
+					'algolia_woo_indexer'
97
+				);
98
+				add_settings_field(
99
+					'algolia_woo_indexer_application_id',
100
+					esc_html__('Application ID', 'algolia-woo-indexer'),
101
+					array( $algowooindexer, 'algolia_woo_indexer_application_id_output' ),
102
+					'algolia_woo_indexer',
103
+					'algolia_woo_indexer_main'
104
+				);
105
+				add_settings_field(
106
+					'algolia_woo_indexer_admin_api_key',
107
+					esc_html__('Admin API Key', 'algolia-woo-indexer'),
108
+					array( $algowooindexer, 'algolia_woo_indexer_admin_api_key_output' ),
109
+					'algolia_woo_indexer',
110
+					'algolia_woo_indexer_main'
111
+				);
112
+				add_settings_field(
113
+					'algolia_woo_indexer_index_name',
114
+					esc_html__('Index name (will be created if not existing)', 'algolia-woo-indexer'),
115
+					array( $algowooindexer, 'algolia_woo_indexer_index_name_output' ),
116
+					'algolia_woo_indexer',
117
+					'algolia_woo_indexer_main'
118
+				);
119
+				add_settings_field(
120
+					'algolia_woo_indexer_automatically_send_new_products',
121
+					esc_html__('Automatically index new products', 'algolia-woo-indexer'),
122
+					array( $algowooindexer, 'algolia_woo_indexer_automatically_send_new_products_output' ),
123
+					'algolia_woo_indexer',
124
+					'algolia_woo_indexer_main'
125
+				);
126
+			}
127
+		}
128
+
129
+		/**
130
+		 * Output for admin API key field
131
+		 *
132
+		 * @see https://developer.wordpress.org/reference/functions/wp_nonce_field/
133
+		 *
134
+		 * @return void
135
+		 */
136
+		public static function algolia_woo_indexer_admin_api_key_output()
137
+		{
138
+			$api_key = get_option(ALGOWOO_DB_OPTION . ALGOLIA_API_KEY);
139
+			$api_key = is_string($api_key) ? $api_key : CHANGE_ME;
140
+
141
+			wp_nonce_field('algolia_woo_indexer_admin_api_nonce_action', 'algolia_woo_indexer_admin_api_nonce_name');
142
+
143
+			echo "<input id='algolia_woo_indexer_admin_api_key' name='algolia_woo_indexer_admin_api_key[key]'
144 144
 				type='text' value='" . esc_attr($api_key) . "' />";
145
-        }
146
-
147
-        /**
148
-         * Output for application ID field
149
-         *
150
-         * @return void
151
-         */
152
-        public static function algolia_woo_indexer_application_id_output()
153
-        {
154
-            $application_id = get_option(ALGOWOO_DB_OPTION . ALGOLIA_APPLICATION_ID);
155
-            $application_id = is_string($application_id) ? $application_id : CHANGE_ME;
156
-
157
-            echo "<input id='algolia_woo_indexer_application_id' name='algolia_woo_indexer_application_id[id]'
145
+		}
146
+
147
+		/**
148
+		 * Output for application ID field
149
+		 *
150
+		 * @return void
151
+		 */
152
+		public static function algolia_woo_indexer_application_id_output()
153
+		{
154
+			$application_id = get_option(ALGOWOO_DB_OPTION . ALGOLIA_APPLICATION_ID);
155
+			$application_id = is_string($application_id) ? $application_id : CHANGE_ME;
156
+
157
+			echo "<input id='algolia_woo_indexer_application_id' name='algolia_woo_indexer_application_id[id]'
158 158
 				type='text' value='" . esc_attr($application_id) . "' />";
159
-        }
160
-
161
-        /**
162
-         * Output for index name field
163
-         *
164
-         * @return void
165
-         */
166
-        public static function algolia_woo_indexer_index_name_output()
167
-        {
168
-            $index_name = get_option(ALGOWOO_DB_OPTION . INDEX_NAME);
169
-            $index_name = is_string($index_name) ? $index_name : CHANGE_ME;
170
-
171
-            echo "<input id='algolia_woo_indexer_index_name' name='algolia_woo_indexer_index_name[name]'
159
+		}
160
+
161
+		/**
162
+		 * Output for index name field
163
+		 *
164
+		 * @return void
165
+		 */
166
+		public static function algolia_woo_indexer_index_name_output()
167
+		{
168
+			$index_name = get_option(ALGOWOO_DB_OPTION . INDEX_NAME);
169
+			$index_name = is_string($index_name) ? $index_name : CHANGE_ME;
170
+
171
+			echo "<input id='algolia_woo_indexer_index_name' name='algolia_woo_indexer_index_name[name]'
172 172
 				type='text' value='" . esc_attr($index_name) . "' />";
173
-        }
173
+		}
174 174
         
175
-        /**
176
-         * Output for checkbox to check if we automatically send new products to Algolia
177
-         *
178
-         * @return void
179
-         */
180
-        public static function algolia_woo_indexer_automatically_send_new_products_output()
181
-        {
182
-            /**
183
-             * Sanitization is not really needed as the variable is not directly echoed
184
-             * But I have still done it to be 100% safe
185
-             */
186
-            $auto_send_new_products = get_option(ALGOWOO_DB_OPTION . AUTOMATICALLY_SEND_NEW_PRODUCTS);
187
-            $auto_send_new_products = (! empty($auto_send_new_products)) ? 1 : 0; ?>
175
+		/**
176
+		 * Output for checkbox to check if we automatically send new products to Algolia
177
+		 *
178
+		 * @return void
179
+		 */
180
+		public static function algolia_woo_indexer_automatically_send_new_products_output()
181
+		{
182
+			/**
183
+			 * Sanitization is not really needed as the variable is not directly echoed
184
+			 * But I have still done it to be 100% safe
185
+			 */
186
+			$auto_send_new_products = get_option(ALGOWOO_DB_OPTION . AUTOMATICALLY_SEND_NEW_PRODUCTS);
187
+			$auto_send_new_products = (! empty($auto_send_new_products)) ? 1 : 0; ?>
188 188
 			<input id="algolia_woo_indexer_automatically_send_new_products" name="algolia_woo_indexer_automatically_send_new_products[checked]"
189 189
 			type="checkbox" <?php checked(1, $auto_send_new_products); ?> />
190 190
 			<?php
191
-        }
192
-
193
-        /**
194
-         * Section text for plugin settings section text
195
-         *
196
-         * @return void
197
-         */
198
-        public static function algolia_woo_indexer_section_text()
199
-        {
200
-            echo esc_html__('Enter your settings here', 'algolia-woo-indexer');
201
-        }
202
-
203
-        /**
204
-         * Check if we are going to send products by verifying send products nonce
205
-         *
206
-         * @return void
207
-         */
208
-        public static function maybe_send_products()
209
-        {
210
-            if (true === Algolia_Verify_Nonces::verify_send_products_nonce()) {
211
-                Algolia_Send_Products::send_products_to_algolia();
212
-            }
213
-        }
214
-
215
-        /**
216
-         * Initialize class, setup settings sections and fields
217
-         *
218
-         * @return void
219
-         */
220
-        public static function init()
221
-        {
222
-
223
-            /**
224
-             * Fetch the option to see if we are going to automatically send new products
225
-             */
226
-            $auto_send_new_products = get_option(ALGOWOO_DB_OPTION . AUTOMATICALLY_SEND_NEW_PRODUCTS);
227
-
228
-            /**
229
-             * Check that we have the minimum versions required and all of the required PHP extensions
230
-             */
231
-            Algolia_Check_Requirements::check_unmet_requirements();
232
-
233
-            if (! Algolia_Check_Requirements::algolia_wp_version_check() || ! Algolia_Check_Requirements::algolia_php_version_check()) {
234
-                add_action(
235
-                    'admin_notices',
236
-                    function () {
237
-                        echo '<div class="error notice">
191
+		}
192
+
193
+		/**
194
+		 * Section text for plugin settings section text
195
+		 *
196
+		 * @return void
197
+		 */
198
+		public static function algolia_woo_indexer_section_text()
199
+		{
200
+			echo esc_html__('Enter your settings here', 'algolia-woo-indexer');
201
+		}
202
+
203
+		/**
204
+		 * Check if we are going to send products by verifying send products nonce
205
+		 *
206
+		 * @return void
207
+		 */
208
+		public static function maybe_send_products()
209
+		{
210
+			if (true === Algolia_Verify_Nonces::verify_send_products_nonce()) {
211
+				Algolia_Send_Products::send_products_to_algolia();
212
+			}
213
+		}
214
+
215
+		/**
216
+		 * Initialize class, setup settings sections and fields
217
+		 *
218
+		 * @return void
219
+		 */
220
+		public static function init()
221
+		{
222
+
223
+			/**
224
+			 * Fetch the option to see if we are going to automatically send new products
225
+			 */
226
+			$auto_send_new_products = get_option(ALGOWOO_DB_OPTION . AUTOMATICALLY_SEND_NEW_PRODUCTS);
227
+
228
+			/**
229
+			 * Check that we have the minimum versions required and all of the required PHP extensions
230
+			 */
231
+			Algolia_Check_Requirements::check_unmet_requirements();
232
+
233
+			if (! Algolia_Check_Requirements::algolia_wp_version_check() || ! Algolia_Check_Requirements::algolia_php_version_check()) {
234
+				add_action(
235
+					'admin_notices',
236
+					function () {
237
+						echo '<div class="error notice">
238 238
                                   <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>
239 239
                                 </div>';
240
-                    }
241
-                );
242
-            }
243
-
244
-            $ob_class = get_called_class();
245
-
246
-            /**
247
-             * Setup translations
248
-             */
249
-            add_action('plugins_loaded', array( $ob_class, 'load_textdomain' ));
250
-
251
-            /**
252
-             * Add actions to setup admin menu
253
-             */
254
-            if (is_admin()) {
255
-                add_action('admin_menu', array( $ob_class, 'admin_menu' ));
256
-                add_action('admin_init', array( $ob_class, 'setup_settings_sections' ));
257
-                add_action('admin_init', array( $ob_class, 'update_settings_options' ));
258
-                add_action('admin_init', array( $ob_class, 'maybe_send_products' ));
259
-
260
-                /**
261
-                 * Register hook to automatically send new products if the option is set
262
-                 */
263
-
264
-                if ('1' === $auto_send_new_products) {
265
-                    add_action('save_post', array( $ob_class, 'send_new_product_to_algolia' ), 10, 3);
266
-                }
267
-
268
-                self::$plugin_url = admin_url('options-general.php?page=algolia-woo-indexer-settings');
269
-
270
-                if (! is_plugin_active('woocommerce/woocommerce.php')) {
271
-                    add_action(
272
-                        'admin_notices',
273
-                        function () {
274
-                            echo '<div class="error notice">
240
+					}
241
+				);
242
+			}
243
+
244
+			$ob_class = get_called_class();
245
+
246
+			/**
247
+			 * Setup translations
248
+			 */
249
+			add_action('plugins_loaded', array( $ob_class, 'load_textdomain' ));
250
+
251
+			/**
252
+			 * Add actions to setup admin menu
253
+			 */
254
+			if (is_admin()) {
255
+				add_action('admin_menu', array( $ob_class, 'admin_menu' ));
256
+				add_action('admin_init', array( $ob_class, 'setup_settings_sections' ));
257
+				add_action('admin_init', array( $ob_class, 'update_settings_options' ));
258
+				add_action('admin_init', array( $ob_class, 'maybe_send_products' ));
259
+
260
+				/**
261
+				 * Register hook to automatically send new products if the option is set
262
+				 */
263
+
264
+				if ('1' === $auto_send_new_products) {
265
+					add_action('save_post', array( $ob_class, 'send_new_product_to_algolia' ), 10, 3);
266
+				}
267
+
268
+				self::$plugin_url = admin_url('options-general.php?page=algolia-woo-indexer-settings');
269
+
270
+				if (! is_plugin_active('woocommerce/woocommerce.php')) {
271
+					add_action(
272
+						'admin_notices',
273
+						function () {
274
+							echo '<div class="error notice">
275 275
 								  <p>' . esc_html__('WooCommerce plugin must be enabled for Algolia Woo Indexer to work.', 'algolia-woo-indexer') . '</p>
276 276
 								</div>';
277
-                        }
278
-                    );
279
-                }
280
-            }
281
-        }
282
-
283
-        /**
284
-         * Send a single product to Algolia once a new product has been published
285
-         *
286
-         * @param int   $post_id ID of the product.
287
-         * @param array $post Post array.
288
-         *
289
-         * @return void
290
-         */
291
-        public static function send_new_product_to_algolia($post_id, $post)
292
-        {
293
-            if ('publish' !== $post->post_status || 'product' !== $post->post_type) {
294
-                return;
295
-            }
296
-            Algolia_Send_Products::send_products_to_algolia($post_id);
297
-        }
298
-
299
-        /**
300
-         * Verify nonces before we update options and settings
301
-         * Also retrieve the value from the send_products_to_algolia hidden field to check if we are sending products to Algolia
302
-         *
303
-         * @return void
304
-         */
305
-        public static function update_settings_options()
306
-        {
307
-            Algolia_Verify_Nonces::verify_settings_nonce();
308
-
309
-            /**
310
-             * Do not proceed if we are going to send products
311
-             */
312
-            if (true === Algolia_Verify_Nonces::verify_send_products_nonce()) {
313
-                return;
314
-            }
315
-
316
-            /**
317
-             * Filter the application id, api key, index name and verify that the input is an array
318
-             *
319
-             * @see https://www.php.net/manual/en/function.filter-input.php
320
-             */
321
-            $post_application_id             = filter_input(INPUT_POST, 'algolia_woo_indexer_application_id', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
322
-            $post_api_key                    = filter_input(INPUT_POST, 'algolia_woo_indexer_admin_api_key', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
323
-            $post_index_name                 = filter_input(INPUT_POST, 'algolia_woo_indexer_index_name', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
324
-            $auto_send_new_products = filter_input(INPUT_POST, 'algolia_woo_indexer_automatically_send_new_products', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
325
-
326
-            /**
327
-             * Properly sanitize text fields before updating data
328
-             *
329
-             * @see https://developer.wordpress.org/reference/functions/sanitize_text_field/
330
-             */
331
-            $filtered_application_id = sanitize_text_field($post_application_id['id']);
332
-            $filtered_api_key        = sanitize_text_field($post_api_key['key']);
333
-            $filtered_index_name     = sanitize_text_field($post_index_name['name']);
334
-
335
-            /**
336
-             * Sanitizing by setting the value to either 1 or 0
337
-             */
338
-            $filtered_automatically_send_new_products = (! empty($auto_send_new_products)) ? 1 : 0;
339
-
340
-            /**
341
-             * Values have been filtered and sanitized
342
-             * Check if set and not empty and update the database
343
-             *
344
-             * @see https://developer.wordpress.org/reference/functions/update_option/
345
-             */
346
-            if (isset($filtered_application_id) && (! empty($filtered_application_id))) {
347
-                update_option(
348
-                    ALGOWOO_DB_OPTION . ALGOLIA_APPLICATION_ID,
349
-                    $filtered_application_id
350
-                );
351
-            }
352
-
353
-            if (isset($filtered_api_key) && (! empty($filtered_api_key))) {
354
-                update_option(
355
-                    ALGOWOO_DB_OPTION . ALGOLIA_API_KEY,
356
-                    $filtered_api_key
357
-                );
358
-            }
359
-
360
-            if (isset($filtered_index_name) && (! empty($filtered_index_name))) {
361
-                update_option(
362
-                    ALGOWOO_DB_OPTION . INDEX_NAME,
363
-                    $filtered_index_name
364
-                );
365
-            }
366
-
367
-            if (isset($filtered_automatically_send_new_products) && (! empty($filtered_automatically_send_new_products))) {
368
-                update_option(
369
-                    ALGOWOO_DB_OPTION . AUTOMATICALLY_SEND_NEW_PRODUCTS,
370
-                    $filtered_automatically_send_new_products
371
-                );
372
-            }
373
-        }
374
-
375
-        /**
376
-         * Sanitize input in settings fields and filter through regex to accept only a-z and A-Z
377
-         *
378
-         * @param string $input Settings text data
379
-         * @return array
380
-         */
381
-        public static function settings_fields_validate_options($input)
382
-        {
383
-            $valid         = array();
384
-            $valid['name'] = preg_replace(
385
-                '/[^a-zA-Z\s]/',
386
-                '',
387
-                $input['name']
388
-            );
389
-            return $valid;
390
-        }
391
-
392
-        /**
393
-         * Load text domain for translations
394
-         *
395
-         * @return void
396
-         */
397
-        public static function load_textdomain()
398
-        {
399
-            load_plugin_textdomain('algolia-woo-indexer', false, basename(dirname(__FILE__)) . '/languages/');
400
-        }
401
-
402
-        /**
403
-         * Add the new menu to settings section so that we can configure the plugin
404
-         *
405
-         * @return void
406
-         */
407
-        public static function admin_menu()
408
-        {
409
-            add_submenu_page(
410
-                'options-general.php',
411
-                esc_html__('Algolia Woo Indexer Settings', 'algolia-woo-indexer'),
412
-                esc_html__('Algolia Woo Indexer Settings', 'algolia-woo-indexer'),
413
-                'manage_options',
414
-                'algolia-woo-indexer-settings',
415
-                array( get_called_class(), 'algolia_woo_indexer_settings' )
416
-            );
417
-        }
418
-
419
-        /**
420
-         * Display settings and allow user to modify them
421
-         *
422
-         * @return void
423
-         */
424
-        public static function algolia_woo_indexer_settings()
425
-        {
426
-            /**
427
-            * Verify that the user can access the settings page
428
-            */
429
-            if (! current_user_can('manage_options')) {
430
-                wp_die(esc_html__('Action not allowed.', 'algolia_woo_indexer_settings'));
431
-            } ?>
277
+						}
278
+					);
279
+				}
280
+			}
281
+		}
282
+
283
+		/**
284
+		 * Send a single product to Algolia once a new product has been published
285
+		 *
286
+		 * @param int   $post_id ID of the product.
287
+		 * @param array $post Post array.
288
+		 *
289
+		 * @return void
290
+		 */
291
+		public static function send_new_product_to_algolia($post_id, $post)
292
+		{
293
+			if ('publish' !== $post->post_status || 'product' !== $post->post_type) {
294
+				return;
295
+			}
296
+			Algolia_Send_Products::send_products_to_algolia($post_id);
297
+		}
298
+
299
+		/**
300
+		 * Verify nonces before we update options and settings
301
+		 * Also retrieve the value from the send_products_to_algolia hidden field to check if we are sending products to Algolia
302
+		 *
303
+		 * @return void
304
+		 */
305
+		public static function update_settings_options()
306
+		{
307
+			Algolia_Verify_Nonces::verify_settings_nonce();
308
+
309
+			/**
310
+			 * Do not proceed if we are going to send products
311
+			 */
312
+			if (true === Algolia_Verify_Nonces::verify_send_products_nonce()) {
313
+				return;
314
+			}
315
+
316
+			/**
317
+			 * Filter the application id, api key, index name and verify that the input is an array
318
+			 *
319
+			 * @see https://www.php.net/manual/en/function.filter-input.php
320
+			 */
321
+			$post_application_id             = filter_input(INPUT_POST, 'algolia_woo_indexer_application_id', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
322
+			$post_api_key                    = filter_input(INPUT_POST, 'algolia_woo_indexer_admin_api_key', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
323
+			$post_index_name                 = filter_input(INPUT_POST, 'algolia_woo_indexer_index_name', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
324
+			$auto_send_new_products = filter_input(INPUT_POST, 'algolia_woo_indexer_automatically_send_new_products', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
325
+
326
+			/**
327
+			 * Properly sanitize text fields before updating data
328
+			 *
329
+			 * @see https://developer.wordpress.org/reference/functions/sanitize_text_field/
330
+			 */
331
+			$filtered_application_id = sanitize_text_field($post_application_id['id']);
332
+			$filtered_api_key        = sanitize_text_field($post_api_key['key']);
333
+			$filtered_index_name     = sanitize_text_field($post_index_name['name']);
334
+
335
+			/**
336
+			 * Sanitizing by setting the value to either 1 or 0
337
+			 */
338
+			$filtered_automatically_send_new_products = (! empty($auto_send_new_products)) ? 1 : 0;
339
+
340
+			/**
341
+			 * Values have been filtered and sanitized
342
+			 * Check if set and not empty and update the database
343
+			 *
344
+			 * @see https://developer.wordpress.org/reference/functions/update_option/
345
+			 */
346
+			if (isset($filtered_application_id) && (! empty($filtered_application_id))) {
347
+				update_option(
348
+					ALGOWOO_DB_OPTION . ALGOLIA_APPLICATION_ID,
349
+					$filtered_application_id
350
+				);
351
+			}
352
+
353
+			if (isset($filtered_api_key) && (! empty($filtered_api_key))) {
354
+				update_option(
355
+					ALGOWOO_DB_OPTION . ALGOLIA_API_KEY,
356
+					$filtered_api_key
357
+				);
358
+			}
359
+
360
+			if (isset($filtered_index_name) && (! empty($filtered_index_name))) {
361
+				update_option(
362
+					ALGOWOO_DB_OPTION . INDEX_NAME,
363
+					$filtered_index_name
364
+				);
365
+			}
366
+
367
+			if (isset($filtered_automatically_send_new_products) && (! empty($filtered_automatically_send_new_products))) {
368
+				update_option(
369
+					ALGOWOO_DB_OPTION . AUTOMATICALLY_SEND_NEW_PRODUCTS,
370
+					$filtered_automatically_send_new_products
371
+				);
372
+			}
373
+		}
374
+
375
+		/**
376
+		 * Sanitize input in settings fields and filter through regex to accept only a-z and A-Z
377
+		 *
378
+		 * @param string $input Settings text data
379
+		 * @return array
380
+		 */
381
+		public static function settings_fields_validate_options($input)
382
+		{
383
+			$valid         = array();
384
+			$valid['name'] = preg_replace(
385
+				'/[^a-zA-Z\s]/',
386
+				'',
387
+				$input['name']
388
+			);
389
+			return $valid;
390
+		}
391
+
392
+		/**
393
+		 * Load text domain for translations
394
+		 *
395
+		 * @return void
396
+		 */
397
+		public static function load_textdomain()
398
+		{
399
+			load_plugin_textdomain('algolia-woo-indexer', false, basename(dirname(__FILE__)) . '/languages/');
400
+		}
401
+
402
+		/**
403
+		 * Add the new menu to settings section so that we can configure the plugin
404
+		 *
405
+		 * @return void
406
+		 */
407
+		public static function admin_menu()
408
+		{
409
+			add_submenu_page(
410
+				'options-general.php',
411
+				esc_html__('Algolia Woo Indexer Settings', 'algolia-woo-indexer'),
412
+				esc_html__('Algolia Woo Indexer Settings', 'algolia-woo-indexer'),
413
+				'manage_options',
414
+				'algolia-woo-indexer-settings',
415
+				array( get_called_class(), 'algolia_woo_indexer_settings' )
416
+			);
417
+		}
418
+
419
+		/**
420
+		 * Display settings and allow user to modify them
421
+		 *
422
+		 * @return void
423
+		 */
424
+		public static function algolia_woo_indexer_settings()
425
+		{
426
+			/**
427
+			 * Verify that the user can access the settings page
428
+			 */
429
+			if (! current_user_can('manage_options')) {
430
+				wp_die(esc_html__('Action not allowed.', 'algolia_woo_indexer_settings'));
431
+			} ?>
432 432
 			<div class="wrap">
433 433
 				<h1><?php esc_html__('Algolia Woo Indexer Settings', 'algolia-woo-indexer'); ?></h1>
434 434
 				<form action="<?php echo esc_url(self::$plugin_url); ?>" method="POST">
435 435
 			<?php
436
-            settings_fields('algolia_woo_options');
437
-            do_settings_sections('algolia_woo_indexer');
438
-            submit_button('', 'primary wide'); ?>
436
+			settings_fields('algolia_woo_options');
437
+			do_settings_sections('algolia_woo_indexer');
438
+			submit_button('', 'primary wide'); ?>
439 439
 				</form>
440 440
 				<form action="<?php echo esc_url(self::$plugin_url); ?>" method="POST">
441 441
 					<?php wp_nonce_field('send_products_to_algolia_nonce_action', 'send_products_to_algolia_nonce_name'); ?>
@@ -444,75 +444,75 @@  discard block
 block discarded – undo
444 444
 				</form>
445 445
 			</div>
446 446
 			<?php
447
-        }
448
-
449
-        /**
450
-         * Get active object instance
451
-         *
452
-         * @return object
453
-         */
454
-        public static function get_instance()
455
-        {
456
-            if (! self::$instance) {
457
-                self::$instance = new Algolia_Woo_Indexer();
458
-            }
459
-            return self::$instance;
460
-        }
461
-
462
-        /**
463
-         * The actions to execute when the plugin is activated.
464
-         *
465
-         * @return void
466
-         */
467
-        public static function activate_plugin()
468
-        {
469
-
470
-            /**
471
-             * Set default values for options if not already set
472
-             */
473
-            $auto_send_new_products = get_option(ALGOWOO_DB_OPTION . AUTOMATICALLY_SEND_NEW_PRODUCTS);
474
-            $algolia_application_id          = get_option(ALGOWOO_DB_OPTION . ALGOLIA_APPLICATION_ID);
475
-            $algolia_api_key                 = get_option(ALGOWOO_DB_OPTION . ALGOLIA_API_KEY);
476
-            $algolia_index_name              = get_option(ALGOWOO_DB_OPTION . INDEX_NAME);
447
+		}
448
+
449
+		/**
450
+		 * Get active object instance
451
+		 *
452
+		 * @return object
453
+		 */
454
+		public static function get_instance()
455
+		{
456
+			if (! self::$instance) {
457
+				self::$instance = new Algolia_Woo_Indexer();
458
+			}
459
+			return self::$instance;
460
+		}
461
+
462
+		/**
463
+		 * The actions to execute when the plugin is activated.
464
+		 *
465
+		 * @return void
466
+		 */
467
+		public static function activate_plugin()
468
+		{
469
+
470
+			/**
471
+			 * Set default values for options if not already set
472
+			 */
473
+			$auto_send_new_products = get_option(ALGOWOO_DB_OPTION . AUTOMATICALLY_SEND_NEW_PRODUCTS);
474
+			$algolia_application_id          = get_option(ALGOWOO_DB_OPTION . ALGOLIA_APPLICATION_ID);
475
+			$algolia_api_key                 = get_option(ALGOWOO_DB_OPTION . ALGOLIA_API_KEY);
476
+			$algolia_index_name              = get_option(ALGOWOO_DB_OPTION . INDEX_NAME);
477 477
             
478
-            if (empty($auto_send_new_products)) {
479
-                add_option(
480
-                    ALGOWOO_DB_OPTION . AUTOMATICALLY_SEND_NEW_PRODUCTS,
481
-                    '0'
482
-                );
483
-            }
484
-
485
-            if (empty($algolia_application_id)) {
486
-                add_option(
487
-                    ALGOWOO_DB_OPTION . ALGOLIA_APPLICATION_ID,
488
-                    'Change me'
489
-                );
490
-            }
491
-
492
-            if (empty($algolia_api_key)) {
493
-                add_option(
494
-                    ALGOWOO_DB_OPTION . ALGOLIA_API_KEY,
495
-                    'Change me'
496
-                );
497
-            }
498
-
499
-            if (empty($algolia_index_name)) {
500
-                add_option(
501
-                    ALGOWOO_DB_OPTION . INDEX_NAME,
502
-                    'Change me'
503
-                );
504
-            }
505
-            set_transient(self::PLUGIN_TRANSIENT, true);
506
-        }
507
-
508
-        /**
509
-         * The actions to execute when the plugin is deactivated.
510
-         *
511
-         * @return void
512
-         */
513
-        public static function deactivate_plugin()
514
-        {
515
-            delete_transient(self::PLUGIN_TRANSIENT);
516
-        }
517
-    }
478
+			if (empty($auto_send_new_products)) {
479
+				add_option(
480
+					ALGOWOO_DB_OPTION . AUTOMATICALLY_SEND_NEW_PRODUCTS,
481
+					'0'
482
+				);
483
+			}
484
+
485
+			if (empty($algolia_application_id)) {
486
+				add_option(
487
+					ALGOWOO_DB_OPTION . ALGOLIA_APPLICATION_ID,
488
+					'Change me'
489
+				);
490
+			}
491
+
492
+			if (empty($algolia_api_key)) {
493
+				add_option(
494
+					ALGOWOO_DB_OPTION . ALGOLIA_API_KEY,
495
+					'Change me'
496
+				);
497
+			}
498
+
499
+			if (empty($algolia_index_name)) {
500
+				add_option(
501
+					ALGOWOO_DB_OPTION . INDEX_NAME,
502
+					'Change me'
503
+				);
504
+			}
505
+			set_transient(self::PLUGIN_TRANSIENT, true);
506
+		}
507
+
508
+		/**
509
+		 * The actions to execute when the plugin is deactivated.
510
+		 *
511
+		 * @return void
512
+		 */
513
+		public static function deactivate_plugin()
514
+		{
515
+			delete_transient(self::PLUGIN_TRANSIENT);
516
+		}
517
+	}
518 518
 }
519 519
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +27 added lines, -27 removed lines patch added patch discarded remove patch
@@ -15,18 +15,18 @@  discard block
 block discarded – undo
15 15
 /**
16 16
  * Abort if this file is called directly
17 17
  */
18
-if ( ! defined( 'ABSPATH' ) ) {
18
+if ( ! defined('ABSPATH')) {
19 19
 	exit;
20 20
 }
21 21
 
22 22
 /**
23 23
  * Include plugin file if function is_plugin_active does not exist
24 24
  */
25
-if (! function_exists('is_plugin_active')) {
25
+if ( ! function_exists('is_plugin_active')) {
26 26
     require_once(ABSPATH . '/wp-admin/includes/plugin.php');
27 27
 }
28 28
 
29
-if (! class_exists('Algolia_Woo_Indexer')) {
29
+if ( ! class_exists('Algolia_Woo_Indexer')) {
30 30
     /**
31 31
      * Algolia WooIndexer main class
32 32
      */
@@ -92,34 +92,34 @@  discard block
 block discarded – undo
92 92
                 add_settings_section(
93 93
                     'algolia_woo_indexer_main',
94 94
                     esc_html__('Algolia Woo Plugin Settings', 'algolia-woo-indexer'),
95
-                    array( $algowooindexer, 'algolia_woo_indexer_section_text' ),
95
+                    array($algowooindexer, 'algolia_woo_indexer_section_text'),
96 96
                     'algolia_woo_indexer'
97 97
                 );
98 98
                 add_settings_field(
99 99
                     'algolia_woo_indexer_application_id',
100 100
                     esc_html__('Application ID', 'algolia-woo-indexer'),
101
-                    array( $algowooindexer, 'algolia_woo_indexer_application_id_output' ),
101
+                    array($algowooindexer, 'algolia_woo_indexer_application_id_output'),
102 102
                     'algolia_woo_indexer',
103 103
                     'algolia_woo_indexer_main'
104 104
                 );
105 105
                 add_settings_field(
106 106
                     'algolia_woo_indexer_admin_api_key',
107 107
                     esc_html__('Admin API Key', 'algolia-woo-indexer'),
108
-                    array( $algowooindexer, 'algolia_woo_indexer_admin_api_key_output' ),
108
+                    array($algowooindexer, 'algolia_woo_indexer_admin_api_key_output'),
109 109
                     'algolia_woo_indexer',
110 110
                     'algolia_woo_indexer_main'
111 111
                 );
112 112
                 add_settings_field(
113 113
                     'algolia_woo_indexer_index_name',
114 114
                     esc_html__('Index name (will be created if not existing)', 'algolia-woo-indexer'),
115
-                    array( $algowooindexer, 'algolia_woo_indexer_index_name_output' ),
115
+                    array($algowooindexer, 'algolia_woo_indexer_index_name_output'),
116 116
                     'algolia_woo_indexer',
117 117
                     'algolia_woo_indexer_main'
118 118
                 );
119 119
                 add_settings_field(
120 120
                     'algolia_woo_indexer_automatically_send_new_products',
121 121
                     esc_html__('Automatically index new products', 'algolia-woo-indexer'),
122
-                    array( $algowooindexer, 'algolia_woo_indexer_automatically_send_new_products_output' ),
122
+                    array($algowooindexer, 'algolia_woo_indexer_automatically_send_new_products_output'),
123 123
                     'algolia_woo_indexer',
124 124
                     'algolia_woo_indexer_main'
125 125
                 );
@@ -184,7 +184,7 @@  discard block
 block discarded – undo
184 184
              * But I have still done it to be 100% safe
185 185
              */
186 186
             $auto_send_new_products = get_option(ALGOWOO_DB_OPTION . AUTOMATICALLY_SEND_NEW_PRODUCTS);
187
-            $auto_send_new_products = (! empty($auto_send_new_products)) ? 1 : 0; ?>
187
+            $auto_send_new_products = ( ! empty($auto_send_new_products)) ? 1 : 0; ?>
188 188
 			<input id="algolia_woo_indexer_automatically_send_new_products" name="algolia_woo_indexer_automatically_send_new_products[checked]"
189 189
 			type="checkbox" <?php checked(1, $auto_send_new_products); ?> />
190 190
 			<?php
@@ -230,10 +230,10 @@  discard block
 block discarded – undo
230 230
              */
231 231
             Algolia_Check_Requirements::check_unmet_requirements();
232 232
 
233
-            if (! Algolia_Check_Requirements::algolia_wp_version_check() || ! Algolia_Check_Requirements::algolia_php_version_check()) {
233
+            if ( ! Algolia_Check_Requirements::algolia_wp_version_check() || ! Algolia_Check_Requirements::algolia_php_version_check()) {
234 234
                 add_action(
235 235
                     'admin_notices',
236
-                    function () {
236
+                    function() {
237 237
                         echo '<div class="error notice">
238 238
                                   <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>
239 239
                                 </div>';
@@ -246,31 +246,31 @@  discard block
 block discarded – undo
246 246
             /**
247 247
              * Setup translations
248 248
              */
249
-            add_action('plugins_loaded', array( $ob_class, 'load_textdomain' ));
249
+            add_action('plugins_loaded', array($ob_class, 'load_textdomain'));
250 250
 
251 251
             /**
252 252
              * Add actions to setup admin menu
253 253
              */
254 254
             if (is_admin()) {
255
-                add_action('admin_menu', array( $ob_class, 'admin_menu' ));
256
-                add_action('admin_init', array( $ob_class, 'setup_settings_sections' ));
257
-                add_action('admin_init', array( $ob_class, 'update_settings_options' ));
258
-                add_action('admin_init', array( $ob_class, 'maybe_send_products' ));
255
+                add_action('admin_menu', array($ob_class, 'admin_menu'));
256
+                add_action('admin_init', array($ob_class, 'setup_settings_sections'));
257
+                add_action('admin_init', array($ob_class, 'update_settings_options'));
258
+                add_action('admin_init', array($ob_class, 'maybe_send_products'));
259 259
 
260 260
                 /**
261 261
                  * Register hook to automatically send new products if the option is set
262 262
                  */
263 263
 
264 264
                 if ('1' === $auto_send_new_products) {
265
-                    add_action('save_post', array( $ob_class, 'send_new_product_to_algolia' ), 10, 3);
265
+                    add_action('save_post', array($ob_class, 'send_new_product_to_algolia'), 10, 3);
266 266
                 }
267 267
 
268 268
                 self::$plugin_url = admin_url('options-general.php?page=algolia-woo-indexer-settings');
269 269
 
270
-                if (! is_plugin_active('woocommerce/woocommerce.php')) {
270
+                if ( ! is_plugin_active('woocommerce/woocommerce.php')) {
271 271
                     add_action(
272 272
                         'admin_notices',
273
-                        function () {
273
+                        function() {
274 274
                             echo '<div class="error notice">
275 275
 								  <p>' . esc_html__('WooCommerce plugin must be enabled for Algolia Woo Indexer to work.', 'algolia-woo-indexer') . '</p>
276 276
 								</div>';
@@ -335,7 +335,7 @@  discard block
 block discarded – undo
335 335
             /**
336 336
              * Sanitizing by setting the value to either 1 or 0
337 337
              */
338
-            $filtered_automatically_send_new_products = (! empty($auto_send_new_products)) ? 1 : 0;
338
+            $filtered_automatically_send_new_products = ( ! empty($auto_send_new_products)) ? 1 : 0;
339 339
 
340 340
             /**
341 341
              * Values have been filtered and sanitized
@@ -343,28 +343,28 @@  discard block
 block discarded – undo
343 343
              *
344 344
              * @see https://developer.wordpress.org/reference/functions/update_option/
345 345
              */
346
-            if (isset($filtered_application_id) && (! empty($filtered_application_id))) {
346
+            if (isset($filtered_application_id) && ( ! empty($filtered_application_id))) {
347 347
                 update_option(
348 348
                     ALGOWOO_DB_OPTION . ALGOLIA_APPLICATION_ID,
349 349
                     $filtered_application_id
350 350
                 );
351 351
             }
352 352
 
353
-            if (isset($filtered_api_key) && (! empty($filtered_api_key))) {
353
+            if (isset($filtered_api_key) && ( ! empty($filtered_api_key))) {
354 354
                 update_option(
355 355
                     ALGOWOO_DB_OPTION . ALGOLIA_API_KEY,
356 356
                     $filtered_api_key
357 357
                 );
358 358
             }
359 359
 
360
-            if (isset($filtered_index_name) && (! empty($filtered_index_name))) {
360
+            if (isset($filtered_index_name) && ( ! empty($filtered_index_name))) {
361 361
                 update_option(
362 362
                     ALGOWOO_DB_OPTION . INDEX_NAME,
363 363
                     $filtered_index_name
364 364
                 );
365 365
             }
366 366
 
367
-            if (isset($filtered_automatically_send_new_products) && (! empty($filtered_automatically_send_new_products))) {
367
+            if (isset($filtered_automatically_send_new_products) && ( ! empty($filtered_automatically_send_new_products))) {
368 368
                 update_option(
369 369
                     ALGOWOO_DB_OPTION . AUTOMATICALLY_SEND_NEW_PRODUCTS,
370 370
                     $filtered_automatically_send_new_products
@@ -412,7 +412,7 @@  discard block
 block discarded – undo
412 412
                 esc_html__('Algolia Woo Indexer Settings', 'algolia-woo-indexer'),
413 413
                 'manage_options',
414 414
                 'algolia-woo-indexer-settings',
415
-                array( get_called_class(), 'algolia_woo_indexer_settings' )
415
+                array(get_called_class(), 'algolia_woo_indexer_settings')
416 416
             );
417 417
         }
418 418
 
@@ -426,7 +426,7 @@  discard block
 block discarded – undo
426 426
             /**
427 427
             * Verify that the user can access the settings page
428 428
             */
429
-            if (! current_user_can('manage_options')) {
429
+            if ( ! current_user_can('manage_options')) {
430 430
                 wp_die(esc_html__('Action not allowed.', 'algolia_woo_indexer_settings'));
431 431
             } ?>
432 432
 			<div class="wrap">
@@ -453,7 +453,7 @@  discard block
 block discarded – undo
453 453
          */
454 454
         public static function get_instance()
455 455
         {
456
-            if (! self::$instance) {
456
+            if ( ! self::$instance) {
457 457
                 self::$instance = new Algolia_Woo_Indexer();
458 458
             }
459 459
             return self::$instance;
Please login to merge, or discard this patch.