PluginProbe
Cooked – Recipe Management / 1.16.1
Cooked – Recipe Management v1.16.1
1.16.1 1.16.0 1.15.0 trunk 1.10.0 1.11.0 1.11.1 1.11.2 1.11.3 1.11.4 1.12.0 1.13.0 1.14.0 1.7.10 1.7.11 1.7.12 1.7.13 1.7.15.1 1.7.15.3 1.7.15.4 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 All 37 releases
← All changes | cooked.php +489 -260 1.7.121.16.1 View file →
@@ -1,38 +1,47 @@
1 1 <?php
2 -
3 -/*
4 -
5 -Plugin Name: Cooked
6 -Plugin URI: https://cooked.pro
7 -Description: A recipe plugin for WordPress.
8 -Author: Boxy Studio
9 -Author URI: https://boxystudio.com
10 -Version: 1.7.12
11 -Text Domain: cooked
12 -Domain Path: languages
13 -License: GPL2
14 -
15 -Cooked is free software: you can redistribute it and/or modify
16 -it under the terms of the GNU General Public License as published by
17 -the Free Software Foundation, either version 2 of the License, or
18 -any later version.
19 -
20 -Cooked is distributed in the hope that it will be useful,
21 -but WITHOUT ANY WARRANTY; without even the implied warranty of
22 -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 -GNU General Public License for more details.
24 -
25 -You should have received a copy of the GNU General Public License
26 -along with Cooked. If not, see http://www.gnu.org/licenses/.
27 -
2 +/**
3 + * Plugin Name: Cooked - Recipe Management
4 + * Plugin URI: https://wordpress.org/plugins/cooked
5 + * Description: A recipe plugin for WordPress.
6 + * Author: Gora Tech
7 + * Author URI: https://goratech.dev
8 + * Version: 1.16.1
9 + * Text Domain: cooked
10 + * Domain Path: /languages
11 + * License: GPLv2 or later
12 + * License URI: https://www.gnu.org/licenses/gpl-2.0.html
13 + * Requires at least: 6.8
14 + * Tested up to: 7.1
15 + * Requires PHP: 7.4
16 + * Contributors: xjsv, boxystudio
17 + * Tags: recipe, recipes, food, cooking, nutrition
18 + *
19 + * Cooked is free software: you can redistribute it and/or modify
20 + * it under the terms of the GNU General Public License as published by
21 + * the Free Software Foundation, either version 2 of the License, or
22 + * any later version.
23 + *
24 + * Cooked is distributed in the hope that it will be useful,
25 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
26 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 + * GNU General Public License for more details.
28 + *
29 + * You should have received a copy of the GNU General Public License
30 + * along with Cooked. If not, see http://www.gnu.org/licenses/.
31 + *
32 + * @package Cooked
28 33 */
29 34
30 35 // Exit if accessed directly.
31 -if ( ! defined( 'ABSPATH' ) ) exit;
36 +if ( ! defined( 'ABSPATH' ) ) {
37 + exit;
38 +}
32 39
33 -define( 'COOKED_VERSION', '1.7.12' );
40 +require_once __DIR__ . '/vendor/autoload.php';
41 +
34 42 define( 'COOKED_DEV', false );
43 +define( 'COOKED_VERSION', '1.16.1' );
35 44
36 45 if ( ! class_exists( 'Cooked_Plugin' ) ) :
37 46
38 47 /**
@@ -41,290 +50,510 @@
41 50 * @since 1.0.0
42 51 */
43 52 final class Cooked_Plugin {
44 53
45 - /**
46 - * @var Cooked_Plugin
47 - * @since 1.0.0
48 - */
49 - private static $instance;
54 + /**
55 + * @var Cooked_Plugin
56 + * @since 1.0.0
57 + */
58 + private static $instance;
50 59
51 - /**
52 - * Cooked Roles Object.
53 - *
54 - * @var object|Cooked_Roles
55 - * @since 1.0.0
56 - */
57 - public $roles;
60 + /**
61 + * Cooked Roles Object.
62 + *
63 + * @var object|Cooked_Roles
64 + * @since 1.0.0
65 + */
66 + public $roles;
58 67
59 - /**
60 - * Main Cooked_Plugin Instance.
61 - *
62 - * Insures that only one instance of Cooked_Plugin exists in memory at any one
63 - * time. Also prevents needing to define globals everywhere.
64 - *
65 - * @since 1.0.0
66 - * @static
67 - * @staticvar array $instance
68 - * @uses Cooked_Plugin::setup_constants() Setup the constants needed.
69 - * @uses Cooked_Plugin::includes() Include the required files.
70 - * @uses Cooked_Plugin::load_textdomain() load the language files.
71 - * @see Cooked()
72 - * @return object|Cooked_Plugin
73 - */
74 - public static function instance() {
68 + /**
69 + * Cooked Admin Menus Object.
70 + *
71 + * @var object|Cooked_Admin_Menus
72 + * @since 1.0.0
73 + */
74 + public $admin_menus;
75 75
76 - if ( ! isset( self::$instance ) && ! ( self::$instance instanceof Cooked_Plugin ) ) {
76 + /**
77 + * Cooked Admin Enqueues Object.
78 + *
79 + * @var object|Cooked_Admin_Enqueues
80 + * @since 1.0.0
81 + */
82 + public $admin_enqueues;
77 83
78 - self::$instance = new Cooked_Plugin;
79 - self::$instance->setup_constants();
84 + /**
85 + * Cooked Enqueues Object.
86 + *
87 + * @var object|Cooked_Enqueues
88 + * @since 1.0.0
89 + */
90 + public $enqueues;
80 91
81 - add_action( 'plugins_loaded', array( self::$instance, 'load_textdomain' ) );
92 + /**
93 + * Cooked Settings Object.
94 + *
95 + * @var object|Cooked_Settings
96 + * @since 1.0.0
97 + */
98 + public $admin_settings;
82 99
83 - self::$instance->includes();
84 - self::$instance->roles = new Cooked_Roles();
85 - self::$instance->admin_menus = new Cooked_Admin_Menus();
100 + /**
101 + * Cooked Migration Object.
102 + *
103 + * @var object|Cooked_Migration
104 + * @since 1.0.0
105 + */
106 + public $migration;
86 107
87 - if (is_admin()):
88 - self::$instance->admin_enqueues = new Cooked_Admin_Enqueues();
89 - else:
90 - self::$instance->enqueues = new Cooked_Enqueues();
91 - endif;
108 + /**
109 + * Cooked Updates Object.
110 + *
111 + * @var object|Cooked_Updates
112 + * @since 1.0.0
113 + */
114 + public $updates;
92 115
93 - self::$instance->admin_settings = new Cooked_Settings();
94 - self::$instance->migration = new Cooked_Migration();
95 - self::$instance->post_types = new Cooked_Post_Types();
96 - self::$instance->recipe_meta = new Cooked_Recipe_Meta();
97 - self::$instance->recipe_meta = new Cooked_Measurements();
98 - self::$instance->users = new Cooked_Users();
99 - self::$instance->recipes = new Cooked_Recipes();
100 - self::$instance->shortcodes = new Cooked_Shortcodes();
101 - self::$instance->ajax = new Cooked_Ajax();
102 - self::$instance->functions = new Cooked_Functions();
103 - self::$instance->widget = new Cooked_Widgets();
104 - self::$instance->gutenberg = new Cooked_Gutenberg();
105 - self::$instance->elementor = new Cooked_Elementor();
116 + /**
117 + * Cooked Post Types Object.
118 + *
119 + * @var object|Cooked_Post_Types
120 + * @since 1.0.0
121 + */
122 + public $post_types;
106 123
107 - self::$instance->module_setup();
124 + /**
125 + * Cooked Recipe Meta Object.
126 + *
127 + * @var object|Cooked_Recipe_Meta
128 + * @since 1.0.0
129 + */
130 + public $recipe_meta;
108 131
109 - }
132 + /**
133 + * Cooked Measurements Object.
134 + *
135 + * @var object|Cooked_Measurements
136 + * @since 1.0.0
137 + */
138 + public $measurements;
110 139
111 - return self::$instance;
140 + /**
141 + * Cooked Users Object.
142 + *
143 + * @var object|Cooked_Users
144 + * @since 1.0.0
145 + */
146 + public $users;
112 147
113 - }
148 + /**
149 + * Cooked Recipes Object.
150 + *
151 + * @var object|Cooked_Recipes
152 + * @since 1.0.0
153 + */
154 + public $recipes;
114 155
115 - private function module_setup(){
156 + /**
157 + * Cooked Shortcodes Object.
158 + *
159 + * @var object|Cooked_Shortcodes
160 + * @since 1.0.0
161 + */
162 + public $shortcodes;
116 163
117 - // Look for Cooked Modules
118 - $modules = file_exists( COOKED_DIR . 'modules' ) ? scandir( COOKED_DIR . 'modules' ) : false;
119 - if ($modules):
120 - foreach($modules as $module_name):
121 - if ($module_name !== '.' && $module_name !== '..'):
122 - if ( file_exists( COOKED_DIR . 'modules/'.esc_attr( $module_name ).'/'.esc_attr( $module_name ).'.php' ) ):
123 - require_once COOKED_DIR . 'modules/'.esc_attr( $module_name ).'/'.esc_attr( $module_name ).'.php';
124 - endif;
125 - endif;
126 - endforeach;
127 - endif;
164 + /**
165 + * Cooked Ajax Object.
166 + *
167 + * @var object|Cooked_Ajax
168 + * @since 1.0.0
169 + */
170 + public $ajax;
128 171
129 - // Look for Cooked Modules in Parent Theme
130 - $parent_theme_folder = trailingslashit( get_template_directory() );
131 - $modules = file_exists( $parent_theme_folder . 'cooked-modules' ) ? scandir( $parent_theme_folder . 'cooked-modules' ) : false;
132 - if ($modules):
133 - foreach($modules as $module_name):
134 - if ($module_name !== '.' && $module_name !== '..'):
135 - if ( file_exists( $parent_theme_folder . 'cooked-modules/'.esc_attr( $module_name ).'/'.esc_attr( $module_name ).'.php' ) ):
136 - require_once $parent_theme_folder . 'cooked-modules/'.esc_attr( $module_name ).'/'.esc_attr( $module_name ).'.php';
137 - endif;
138 - endif;
139 - endforeach;
140 - endif;
172 + /**
173 + * Cooked Functions Object.
174 + *
175 + * @var object|Cooked_Functions
176 + * @since 1.0.0
177 + */
178 + public $functions;
141 179
142 - // Look for Cooked Modules in Child Theme (if one is active)
143 - $child_theme_folder = trailingslashit( get_stylesheet_directory() );
144 - if ($child_theme_folder != $parent_theme_folder):
145 - $modules = file_exists( $child_theme_folder . 'cooked-modules' ) ? scandir( $child_theme_folder . 'cooked-modules' ) : false;
146 - if ($modules):
147 - foreach($modules as $module_name):
148 - if ($module_name !== '.' && $module_name !== '..'):
149 - if ( file_exists( $child_theme_folder . 'cooked-modules/'.esc_attr( $module_name ).'/'.esc_attr( $module_name ).'.php' ) ):
150 - require_once $child_theme_folder . 'cooked-modules/'.esc_attr( $module_name ).'/'.esc_attr( $module_name ).'.php';
151 - endif;
152 - endif;
153 - endforeach;
154 - endif;
155 - endif;
180 + /**
181 + * Cooked Widgets Object.
182 + *
183 + * @var object|Cooked_Widgets
184 + * @since 1.0.0
185 + */
186 + public $widget;
156 187
157 - }
188 + /**
189 + * Cooked Gutenberg Object.
190 + *
191 + * @var object|Cooked_Gutenberg
192 + * @since 1.0.0
193 + */
194 + public $gutenberg;
158 195
159 - /**
160 - * Throw error on object clone.
161 - *
162 - * The whole idea of the singleton design pattern is that there is a single
163 - * object therefore, we don't want the object to be cloned.
164 - *
165 - * @since 1.0.0
166 - * @access protected
167 - * @return void
168 - */
169 - public function __clone() {
170 - // Nope, can't do that.
171 - return false;
172 - }
196 + /**
197 + * Cooked Elementor Object.
198 + *
199 + * @var object|Cooked_Elementor
200 + * @since 1.0.0
201 + */
202 + public $elementor;
173 203
174 - /**
175 - * Disable unserializing of the class.
176 - *
177 - * @since 1.0.0
178 - * @access protected
179 - * @return void
180 - */
181 - public function __wakeup() {
182 - // Nope, can't do that either.
183 - return false;
184 - }
204 + /**
205 + * Cooked Rank Math SEO Object.
206 + *
207 + * @var object|Cooked_RankMathSEO
208 + * @since 1.8.9
209 + */
210 + public $rankmathseo;
185 211
186 - /**
187 - * Setup plugin constants.
188 - *
189 - * @access private
190 - * @since 1.0.0
191 - * @return void
192 - */
193 - private function setup_constants() {
212 + /**
213 + * Cooked Yoast SEO Object.
214 + *
215 + * @var object|Cooked_YoastSEO
216 + * @since 1.8.9
217 + */
218 + public $yoastseo;
194 219
195 - // Plugin Folder Path.
196 - if ( ! defined( 'COOKED_DIR' ) ) {
197 - define( 'COOKED_DIR', plugin_dir_path( __FILE__ ) );
198 - }
220 + /**
221 + * Cooked Multilingual Object.
222 + *
223 + * @var object|Cooked_Multilingual
224 + * @since 1.12.0
225 + */
226 + public $multilingual;
199 227
200 - // Plugin Folder Name.
201 - if ( ! defined( 'COOKED_FOLDER' ) ) {
202 - $foldername = untrailingslashit( str_replace( 'cooked.php', '', plugin_basename( __FILE__ ) ) );
203 - define( 'COOKED_FOLDER', $foldername );
204 - }
228 + /**
229 + * Cooked Related Recipes Object.
230 + *
231 + * @var object|Cooked_Related_Recipes
232 + * @since 1.12.0
233 + */
234 + public $related_recipes;
205 235
206 - // Plugin Root File.
207 - if ( ! defined( 'COOKED_PLUGIN_FILE' ) ) {
208 - define( 'COOKED_PLUGIN_FILE', __FILE__ );
209 - }
236 + /**
237 + * Cooked Extra Object.
238 + *
239 + * @var object|Cooked_Plugin_Extra
240 + * @since 1.8.7
241 + */
242 + public $extra;
210 243
211 - // Plugin Folder URL.
212 - if ( ! defined( 'COOKED_URL' ) ) {
213 - define( 'COOKED_URL', plugin_dir_url( __FILE__ ) );
214 - }
244 + /**
245 + * Cooked Pixwell Theme Support Object.
246 + *
247 + * @var object|Cooked_Pixwell
248 + * @since 1.16.0
249 + */
250 + public $pixwell;
215 251
216 - // WordPress Ajax URL.
217 - if ( ! defined( 'COOKED_AJAX_URL' ) ) {
218 - define( 'COOKED_AJAX_URL', admin_url('admin-ajax.php') );
219 - }
252 + /**
253 + * Main Cooked_Plugin Instance.
254 + *
255 + * Insures that only one instance of Cooked_Plugin exists in memory at any one
256 + * time. Also prevents needing to define globals everywhere.
257 + *
258 + * @since 1.0.0
259 + * @static
260 + * @staticvar array $instance
261 + * @uses Cooked_Plugin::setup_constants() Setup the constants needed.
262 + * @uses Cooked_Plugin::includes() Include the required files.
263 + * @uses Cooked_Plugin::load_textdomain() load the language files.
264 + * @see Cooked()
265 + * @return object|Cooked_Plugin
266 + */
267 + public static function instance() {
268 + if ( ! isset( self::$instance ) && ! ( self::$instance instanceof Cooked_Plugin ) ) {
269 + self::$instance = new Cooked_Plugin;
270 + self::$instance->setup_constants();
220 271
221 - // Make sure CAL_GREGORIAN is defined.
222 - if ( ! defined( 'CAL_GREGORIAN' ) ) {
223 - define( 'CAL_GREGORIAN', 1 );
224 - }
272 + add_action( 'init', [self::$instance, 'load_textdomain'] );
273 + add_action( 'plugins_loaded', [self::$instance, 'check_plugin_update'] );
225 274
226 - // Time Format
227 - if ( ! defined( 'COOKED_TIME_FORMAT' ) ) {
228 - define( 'COOKED_TIME_FORMAT', get_option('time_format','g:ia') );
229 - }
275 + self::$instance->includes();
276 + self::$instance->roles = new Cooked_Roles();
277 + self::$instance->admin_menus = new Cooked_Admin_Menus();
230 278
231 - // Date Format
232 - if ( ! defined( 'COOKED_DATE_FORMAT' ) ) {
233 - define( 'COOKED_DATE_FORMAT', get_option('date_format','F j, Y') );
234 - }
279 + if (is_admin()) {
280 + self::$instance->admin_enqueues = new Cooked_Admin_Enqueues();
281 + } else {
282 + self::$instance->enqueues = new Cooked_Enqueues();
283 + }
235 284
236 - }
285 + self::$instance->admin_settings = new Cooked_Settings();
286 + self::$instance->migration = new Cooked_Migration();
287 + self::$instance->related_recipes = new Cooked_Related_Recipes();
288 + self::$instance->updates = new Cooked_Updates();
289 + self::$instance->post_types = new Cooked_Post_Types();
290 + self::$instance->recipe_meta = new Cooked_Recipe_Meta();
291 + self::$instance->measurements = new Cooked_Measurements();
292 + self::$instance->users = new Cooked_Users();
293 + self::$instance->recipes = new Cooked_Recipes();
294 + self::$instance->shortcodes = new Cooked_Shortcodes();
295 + self::$instance->ajax = new Cooked_Ajax();
296 + self::$instance->functions = new Cooked_Functions();
297 + self::$instance->widget = new Cooked_Widgets();
298 + self::$instance->gutenberg = new Cooked_Gutenberg();
299 + self::$instance->elementor = new Cooked_Elementor();
300 + self::$instance->extra = new Cooked_Plugin_Extra();
301 + self::$instance->multilingual = new Cooked_Multilingual();
302 + self::$instance->pixwell = new Cooked_Pixwell();
237 303
238 - /**
239 - * Include required files.
240 - *
241 - * @access private
242 - * @since 1.0.0
243 - * @return void
244 - */
245 - private function includes() {
304 + self::$instance->module_setup();
246 305
247 - require_once COOKED_DIR . 'includes/class.cooked-users.php';
248 - require_once COOKED_DIR . 'includes/class.cooked-roles.php';
249 - require_once COOKED_DIR . 'includes/class.cooked-taxonomies.php';
250 - require_once COOKED_DIR . 'includes/class.cooked-post-types.php';
251 - require_once COOKED_DIR . 'includes/class.cooked-seo.php';
252 - require_once COOKED_DIR . 'includes/class.cooked-recipes.php';
253 - require_once COOKED_DIR . 'includes/class.cooked-recipe-meta.php';
254 - require_once COOKED_DIR . 'includes/class.cooked-shortcodes.php';
255 - require_once COOKED_DIR . 'includes/class.cooked-measurements.php';
256 - require_once COOKED_DIR . 'includes/class.cooked-admin-enqueues.php';
257 - require_once COOKED_DIR . 'includes/class.cooked-enqueues.php';
258 - require_once COOKED_DIR . 'includes/class.cooked-admin-menus.php';
259 - require_once COOKED_DIR . 'includes/class.cooked-settings.php';
260 - require_once COOKED_DIR . 'includes/class.cooked-migration.php';
261 - require_once COOKED_DIR . 'includes/class.cooked-ajax.php';
262 - require_once COOKED_DIR . 'includes/class.cooked-functions.php';
263 - require_once COOKED_DIR . 'includes/class.cooked-widgets.php';
264 - require_once COOKED_DIR . 'includes/class.cooked-gutenberg.php';
265 - require_once COOKED_DIR . 'includes/class.cooked-elementor.php';
306 + add_action( 'init', [self::$instance, 'initialize_plugin_support'], 10 );
266 307
267 - }
308 + do_action('cooked_loaded');
309 + }
268 310
269 - /**
270 - * Loads the plugin language files.
271 - *
272 - * @access public
273 - * @since 1.0.0
274 - * @return void
275 - */
276 - public function load_textdomain() {
311 + return self::$instance;
312 + }
277 313
278 - /*
279 - * When translating Cooked, be sure to move your language file into the proper location:
280 - *
281 - * - wp-content/languages/plugins/cooked
282 - *
283 - * If you do not move custom language files here, they will be lost when updating Cooked. Boxy Studio
284 - * recommends Loco Translate for easy translations: https://boxystudio.ticksy.com/article/3235/
285 - */
314 + /**
315 + * Initialize module support.
316 + *
317 + * @since 1.0.0
318 + * @return void
319 + */
320 + private function module_setup() {
321 + // Look for Cooked Modules
322 + $modules = file_exists( COOKED_DIR . 'modules' ) ? scandir( COOKED_DIR . 'modules' ) : false;
323 + if ($modules):
324 + foreach ($modules as $module_name):
325 + if ($module_name !== '.' && $module_name !== '..'):
326 + if ( file_exists( COOKED_DIR . 'modules/' . esc_attr( $module_name ) . '/' . esc_attr( $module_name ) . '.php' ) ):
327 + require_once COOKED_DIR . 'modules/' . esc_attr( $module_name ) . '/' . esc_attr( $module_name ) . '.php';
328 + endif;
329 + endif;
330 + endforeach;
331 + endif;
286 332
287 - // Set filter for plugin's languages directory.
288 - $cooked_lang_dir = apply_filters( 'cooked_languages_directory', COOKED_DIR . 'languages/' );
333 + // Look for Cooked Modules in Parent Theme
334 + $parent_theme_folder = trailingslashit( get_template_directory() );
335 + $modules = file_exists( $parent_theme_folder . 'cooked-modules' ) ? scandir( $parent_theme_folder . 'cooked-modules' ) : false;
336 + if ($modules):
337 + foreach ($modules as $module_name):
338 + if ($module_name !== '.' && $module_name !== '..'):
339 + if ( file_exists( $parent_theme_folder . 'cooked-modules/' . esc_attr( $module_name ) . '/' . esc_attr( $module_name ) . '.php' ) ):
340 + require_once $parent_theme_folder . 'cooked-modules/' . esc_attr( $module_name ) . '/' . esc_attr( $module_name ) . '.php';
341 + endif;
342 + endif;
343 + endforeach;
344 + endif;
289 345
290 - // Traditional WordPress plugin locale filter.
291 - $locale = apply_filters( 'plugin_locale', get_locale(), 'cooked' );
292 - $mofile = sprintf( '%1$s-%2$s.mo', 'cooked', $locale );
346 + // Look for Cooked Modules in Child Theme (if one is active)
347 + $child_theme_folder = trailingslashit( get_stylesheet_directory() );
348 + if ($child_theme_folder != $parent_theme_folder):
349 + $modules = file_exists( $child_theme_folder . 'cooked-modules' ) ? scandir( $child_theme_folder . 'cooked-modules' ) : false;
350 + if ($modules):
351 + foreach ($modules as $module_name):
352 + if ($module_name !== '.' && $module_name !== '..'):
353 + if ( file_exists( $child_theme_folder . 'cooked-modules/' . esc_attr( $module_name ) . '/' . esc_attr( $module_name ) . '.php' ) ):
354 + require_once $child_theme_folder . 'cooked-modules/' . esc_attr( $module_name ) . '/' . esc_attr( $module_name ) . '.php';
355 + endif;
356 + endif;
357 + endforeach;
358 + endif;
359 + endif;
360 + }
293 361
294 - // Look in wp-content/languages/plugins/cooked
295 - $lang_file_ext = WP_LANG_DIR . '/plugins/cooked/' . $mofile;
362 + /**
363 + * Initialize plugin support.
364 + *
365 + * @since 1.0.0
366 + * @return void
367 + */
368 + public function initialize_plugin_support() {
369 + if (in_array('wordpress-seo/wp-seo.php', apply_filters('active_plugins', get_option('active_plugins')))) {
370 + require_once COOKED_DIR . 'includes/class.cooked-yoastseo.php';
371 + self::$instance->yoastseo = new Cooked_YoastSEO();
372 + }
296 373
297 - if ( file_exists( $lang_file_ext ) ) {
374 + if (in_array('seo-by-rank-math/rank-math.php', apply_filters('active_plugins', get_option('active_plugins')))) {
375 + require_once COOKED_DIR . 'includes/class.cooked-rankmathseo.php';
376 + self::$instance->rankmathseo = new Cooked_RankMathSEO();
377 + }
378 + }
298 379
299 - // Load the externally located language files.
300 - load_textdomain( 'cooked', $lang_file_ext );
380 + /**
381 + * Check for plugin updates and run migrations if needed
382 + *
383 + * @since 1.10.0
384 + */
385 + public function check_plugin_update() {
386 + $current_version = get_option('cooked_version', '0');
301 387
302 - } else {
388 + if (version_compare($current_version, COOKED_VERSION, '<')) {
389 + // Run migrations
390 + $this->migration->init();
303 391
304 - // Load the default language files.
305 - load_plugin_textdomain( 'cooked', false, COOKED_FOLDER . '/languages' );
392 + // Update version in database
393 + update_option('cooked_version', COOKED_VERSION);
394 + }
395 + }
306 396
307 - }
397 + /**
398 + * Throw error on object clone.
399 + *
400 + * The whole idea of the singleton design pattern is that there is a single
401 + * object therefore, we don't want the object to be cloned.
402 + *
403 + * @since 1.0.0
404 + * @access protected
405 + * @return void
406 + */
407 + public function __clone() {
408 + // Nope, can't do that.
409 + return false;
410 + }
308 411
309 - }
412 + /**
413 + * Disable unserializing of the class.
414 + *
415 + * @since 1.0.0
416 + * @access protected
417 + * @return void
418 + */
419 + public function __wakeup() {
420 + // Nope, can't do that either.
421 + return false;
422 + }
310 423
311 -}
424 + /**
425 + * Setup plugin constants.
426 + *
427 + * @access private
428 + * @since 1.0.0
429 + * @return void
430 + */
431 + private function setup_constants() {
432 + // Plugin Folder Path.
433 + if ( ! defined( 'COOKED_DIR' ) ) {
434 + define( 'COOKED_DIR', plugin_dir_path( __FILE__ ) );
435 + }
312 436
313 -endif; // End if class_exists check.
437 + // Plugin Folder Name.
438 + if ( ! defined( 'COOKED_FOLDER' ) ) {
439 + $foldername = untrailingslashit( str_replace( 'cooked.php', '', plugin_basename( __FILE__ ) ) );
440 + define( 'COOKED_FOLDER', $foldername );
441 + }
314 442
443 + // Plugin Root File.
444 + if ( ! defined( 'COOKED_PLUGIN_FILE' ) ) {
445 + define( 'COOKED_PLUGIN_FILE', __FILE__ );
446 + }
315 447
316 -// Uninstall Hook
317 -register_uninstall_hook( __FILE__, 'cooked_uninstall' );
318 -function cooked_uninstall(){
319 - Cooked_Roles::remove_caps();
320 - Cooked_Roles::remove_roles();
321 - flush_rewrite_rules();
448 + // Plugin Folder URL.
449 + if ( ! defined( 'COOKED_URL' ) ) {
450 + define( 'COOKED_URL', plugin_dir_url( __FILE__ ) );
451 + }
452 +
453 + // WordPress Ajax URL.
454 + if ( ! defined( 'COOKED_AJAX_URL' ) ) {
455 + define( 'COOKED_AJAX_URL', admin_url('admin-ajax.php') );
456 + }
457 +
458 + // Make sure CAL_GREGORIAN is defined.
459 + if ( ! defined( 'CAL_GREGORIAN' ) ) {
460 + define( 'CAL_GREGORIAN', 1 );
461 + }
462 +
463 + // Time Format
464 + if ( ! defined( 'COOKED_TIME_FORMAT' ) ) {
465 + define( 'COOKED_TIME_FORMAT', get_option('time_format','g:ia') );
466 + }
467 +
468 + // Date Format
469 + if ( ! defined( 'COOKED_DATE_FORMAT' ) ) {
470 + define( 'COOKED_DATE_FORMAT', get_option('date_format','F j, Y') );
471 + }
472 + }
473 +
474 + /**
475 + * Include required files.
476 + *
477 + * @access private
478 + * @since 1.0.0
479 + * @return void
480 + */
481 + private function includes() {
482 + require_once COOKED_DIR . 'includes/class.cooked-users.php';
483 + require_once COOKED_DIR . 'includes/class.cooked-roles.php';
484 + require_once COOKED_DIR . 'includes/class.cooked-taxonomies.php';
485 + require_once COOKED_DIR . 'includes/class.cooked-post-types.php';
486 + require_once COOKED_DIR . 'includes/class.cooked-seo.php';
487 + require_once COOKED_DIR . 'includes/class.cooked-recipes.php';
488 + require_once COOKED_DIR . 'includes/class.cooked-related-recipes.php';
489 + require_once COOKED_DIR . 'includes/class.cooked-recipe-meta.php';
490 + require_once COOKED_DIR . 'includes/class.cooked-shortcodes.php';
491 + require_once COOKED_DIR . 'includes/class.cooked-measurements.php';
492 + require_once COOKED_DIR . 'includes/class.cooked-unit-converter.php';
493 + require_once COOKED_DIR . 'includes/class.cooked-admin-enqueues.php';
494 + require_once COOKED_DIR . 'includes/class.cooked-enqueues.php';
495 + require_once COOKED_DIR . 'includes/class.cooked-admin-menus.php';
496 + require_once COOKED_DIR . 'includes/class.cooked-settings.php';
497 + require_once COOKED_DIR . 'includes/class.cooked-migration.php';
498 + require_once COOKED_DIR . 'includes/class.cooked-updates.php';
499 + require_once COOKED_DIR . 'includes/class.cooked-ajax.php';
500 + require_once COOKED_DIR . 'includes/class.cooked-functions.php';
501 + require_once COOKED_DIR . 'includes/class.cooked-widgets.php';
502 + require_once COOKED_DIR . 'includes/class.cooked-gutenberg.php';
503 + require_once COOKED_DIR . 'includes/class.cooked-elementor.php';
504 + require_once COOKED_DIR . 'includes/class.cooked-plugin-extra.php';
505 + require_once COOKED_DIR . 'includes/class.cooked-multilingual.php';
506 + require_once COOKED_DIR . 'includes/class.cooked-allergens.php';
507 + require_once COOKED_DIR . 'includes/class.cooked-pixwell.php';
508 +
509 + if ( defined( 'WP_CLI' ) && WP_CLI ) {
510 + require_once COOKED_DIR . 'includes/class.cooked-cli.php';
511 + }
512 + }
513 +
514 + /**
515 + * Loads the plugin language files.
516 + *
517 + * @access public
518 + * @since 1.0.0
519 + * @return void
520 + */
521 + public function load_textdomain() {
522 + /*
523 + * When translating Cooked, be sure to move your language file into the proper location:
524 + *
525 + * - wp-content/languages/plugins
526 + *
527 + * If you do not move custom language files here, they will be lost when updating Cooked. Gora Tech
528 + * recommends Loco Translate for easy translations: hhttps://github.com/XjSv/Cooked/wiki/Translations-Text-Changes
529 + */
530 +
531 + // Set filter for plugin's languages directory.
532 + $cooked_lang_dir = apply_filters( 'cooked_languages_directory', COOKED_DIR . 'languages/' );
533 +
534 + // Traditional WordPress plugin locale filter.
535 + $locale = apply_filters( 'plugin_locale', get_locale(), 'cooked' );
536 + $mofile = sprintf( '%1$s-%2$s.mo', 'cooked', $locale );
537 +
538 + // Look in wp-content/languages/plugins/cooked
539 + $lang_file_ext = WP_LANG_DIR . '/plugins/cooked/' . $mofile;
540 +
541 + if ( file_exists( $lang_file_ext ) ) {
542 + // Load the externally located language files.
543 + load_textdomain( 'cooked', $lang_file_ext );
544 + } else {
545 + // Load the default language files.
546 + // phpcs:ignore PluginCheck.CodeAnalysis.DiscouragedFunctions.load_plugin_textdomainFound -- Bundled /languages .mo files.
547 + load_plugin_textdomain( 'cooked', false, COOKED_FOLDER . '/languages' );
548 + }
549 + }
322 550 }
323 551
552 +endif; // End if class_exists check.
324 553
325 554 /**
326 - * The main function for that returns Cooked_Plugin
555 + * The main function for that returns Cooked_Plugin.
327 556 *
328 557 * The main function responsible for returning the Cooked_Plugin
329 558 * Instance to functions everywhere.
330 559 *
@@ -336,9 +565,9 @@
336 565 * @since 1.0.0
337 566 * @return object|Cooked_Plugin
338 567 */
339 568 function Cooked() {
340 - return Cooked_Plugin::instance();
569 + return Cooked_Plugin::instance();
341 570 }
342 571
343 572 // Let's get cooking!
344 573 $CookedPlugin = Cooked();