| 1 |
<?php |
| 2 |
|
| 3 |
namespace Booktics\Extensions; |
| 4 |
|
| 5 |
/** |
| 6 |
* Plugin manager |
| 7 |
*/ |
| 8 |
class Plugin_Manager { |
| 9 |
|
| 10 |
/** |
| 11 |
* Check if a plugin is installed. |
| 12 |
* |
| 13 |
* @param string $slug The slug of the plugin. |
| 14 |
* |
| 15 |
* @return bool True if installed, false otherwise. |
| 16 |
*/ |
| 17 |
public static function is_installed( string $slug ): bool { |
| 18 |
if ( ! function_exists( 'get_plugins' ) ) { |
| 19 |
require_once ABSPATH . 'wp-admin/includes/plugin.php'; |
| 20 |
} |
| 21 |
|
| 22 |
$plugins = get_plugins(); |
| 23 |
|
| 24 |
if ( is_array( $plugins ) ) { |
| 25 |
foreach ( $plugins as $plugin_path => $plugin ) { |
| 26 |
if ( strpos( $plugin_path, $slug . '/' ) === 0 ) { |
| 27 |
return true; |
| 28 |
} |
| 29 |
} |
| 30 |
} |
| 31 |
|
| 32 |
return false; |
| 33 |
} |
| 34 |
|
| 35 |
/** |
| 36 |
* Check if a plugin is active. |
| 37 |
* |
| 38 |
* @param string $slug The slug of the plugin. |
| 39 |
* |
| 40 |
* @return bool True if activated, false otherwise. |
| 41 |
*/ |
| 42 |
public static function is_activated( string $slug ): bool { |
| 43 |
if ( ! self::is_installed( $slug ) ) { |
| 44 |
return false; |
| 45 |
} |
| 46 |
|
| 47 |
return is_plugin_active( self::get_plugin_path( $slug ) ); |
| 48 |
} |
| 49 |
|
| 50 |
/** |
| 51 |
* Install a plugin from the WordPress repository by slug. |
| 52 |
* |
| 53 |
* @param string $slug The slug of the plugin. |
| 54 |
* |
| 55 |
* @return bool True if installation succeeds, false otherwise. |
| 56 |
*/ |
| 57 |
public static function install_plugin( string $slug ): bool { |
| 58 |
if ( self::is_installed( $slug ) ) { |
| 59 |
return true; // Already installed |
| 60 |
} |
| 61 |
|
| 62 |
include_once ABSPATH . 'wp-admin/includes/file.php'; |
| 63 |
include_once ABSPATH . 'wp-admin/includes/misc.php'; |
| 64 |
include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php'; |
| 65 |
|
| 66 |
$skin = new \Automatic_Upgrader_Skin(); |
| 67 |
$upgrader = new \Plugin_Upgrader( $skin ); |
| 68 |
$download_link = null; |
| 69 |
foreach ( self::extensions() as $extension ) { |
| 70 |
if ( $extension['slug'] === $slug && ! empty( $extension['download_link'] ) ) { |
| 71 |
$download_link = $extension['download_link']; |
| 72 |
break; |
| 73 |
} |
| 74 |
} |
| 75 |
|
| 76 |
if ( ! $download_link ) { |
| 77 |
return false; |
| 78 |
} |
| 79 |
|
| 80 |
$result = $upgrader->install( $download_link ); |
| 81 |
|
| 82 |
return (bool) $result; |
| 83 |
} |
| 84 |
|
| 85 |
/** |
| 86 |
* Activate a plugin by slug. |
| 87 |
* |
| 88 |
* @param string $slug The slug of the plugin. |
| 89 |
* |
| 90 |
* @return bool True if activated, false otherwise. |
| 91 |
*/ |
| 92 |
public static function activate_plugin( string $slug ): bool { |
| 93 |
if ( ! self::is_installed( $slug ) ) { |
| 94 |
return false; // Plugin isn't installed |
| 95 |
} |
| 96 |
|
| 97 |
$plugin_path = self::get_plugin_path( $slug ); |
| 98 |
$result = activate_plugin( $plugin_path ); |
| 99 |
|
| 100 |
if ( is_wp_error( $result ) ) { |
| 101 |
return $result; |
| 102 |
} |
| 103 |
|
| 104 |
return true; |
| 105 |
} |
| 106 |
|
| 107 |
/** |
| 108 |
* Deactivate a plugin by slug. |
| 109 |
* |
| 110 |
* @param string $slug The slug of the plugin. |
| 111 |
* |
| 112 |
* @return bool True if deactivated, false otherwise. |
| 113 |
*/ |
| 114 |
public static function deactivate_plugin( string $slug ) { |
| 115 |
if ( ! self::is_activated( $slug ) ) { |
| 116 |
return false; // Plugin isn't activated |
| 117 |
} |
| 118 |
|
| 119 |
$plugin_path = self::get_plugin_path( $slug ); |
| 120 |
|
| 121 |
deactivate_plugins( $plugin_path ); |
| 122 |
|
| 123 |
return true; |
| 124 |
} |
| 125 |
|
| 126 |
/** |
| 127 |
* Get the plugin path by slug. |
| 128 |
* |
| 129 |
* @param string $slug The slug of the plugin. |
| 130 |
* |
| 131 |
* @return string The path to the plugin file. |
| 132 |
*/ |
| 133 |
private static function get_plugin_path( string $slug ) { |
| 134 |
if ( ! function_exists( 'get_plugins' ) ) { |
| 135 |
require_once ABSPATH . 'wp-admin/includes/plugin.php'; |
| 136 |
} |
| 137 |
|
| 138 |
$plugins = get_plugins(); |
| 139 |
|
| 140 |
if ( is_array( $plugins ) ) { |
| 141 |
foreach ( $plugins as $plugin_path => $plugin ) { |
| 142 |
if ( strpos( $plugin_path, $slug . '/' ) === 0 ) { |
| 143 |
return $plugin_path; |
| 144 |
} |
| 145 |
} |
| 146 |
} |
| 147 |
|
| 148 |
return false; |
| 149 |
} |
| 150 |
|
| 151 |
/** |
| 152 |
* Check if the provided file is the main plugin file. |
| 153 |
* |
| 154 |
* @param string $file Path to the file. |
| 155 |
* |
| 156 |
* @return bool True if it is the main plugin file, false otherwise. |
| 157 |
*/ |
| 158 |
private static function is_main_plugin_file( string $file ): bool { |
| 159 |
|
| 160 |
$plugin_data = get_file_data( $file, array( 'Name' => 'Plugin Name' ) ); |
| 161 |
|
| 162 |
return ! empty( $plugin_data['Name'] ); |
| 163 |
} |
| 164 |
|
| 165 |
/** |
| 166 |
* Get the plugin name by slug. |
| 167 |
* |
| 168 |
* @param string $slug Plugin slug (e.g., 'woocommerce). |
| 169 |
* |
| 170 |
* @return string|null Returns the plugin name if found, or null if not found. |
| 171 |
*/ |
| 172 |
public static function get_plugin_name_by_slug( string $slug ) { |
| 173 |
if ( ! function_exists( 'get_plugins' ) ) { |
| 174 |
require_once ABSPATH . 'wp-admin/includes/plugin.php'; |
| 175 |
} |
| 176 |
|
| 177 |
$all_plugins = get_plugins(); |
| 178 |
|
| 179 |
foreach ( $all_plugins as $plugin_file => $plugin_data ) { |
| 180 |
if ( strpos( $plugin_file, $slug ) !== false ) { |
| 181 |
return $plugin_data['Name']; |
| 182 |
} |
| 183 |
} |
| 184 |
|
| 185 |
return null; |
| 186 |
} |
| 187 |
|
| 188 |
/** |
| 189 |
* List of all extensions |
| 190 |
* |
| 191 |
* @return array |
| 192 |
*/ |
| 193 |
public static function extensions(): array { |
| 194 |
return array( |
| 195 |
'booktics-stripe-addon' => array( |
| 196 |
'name' => 'booktics-stripe-addon', |
| 197 |
'slug' => 'booktics-stripe-addon', |
| 198 |
'type' => 'addon', |
| 199 |
'upgrade' => true, |
| 200 |
'upgrade_link' => 'https://themewinter.com/purchase-history', |
| 201 |
'status' => 'off', |
| 202 |
'is_pro' => false, |
| 203 |
'title' => __( 'Booktics Stripe Addon', 'booktics' ), |
| 204 |
'description' => __( 'It allows you to use stripe payment.', 'booktics' ), |
| 205 |
'icon' => Extension_Icon::get( 'booktics-stripe-addon' ), |
| 206 |
'notice' => '', |
| 207 |
'demo_link' => 'https://support.themewinter.com/docs/plugins/plugin-docs/integration/booktics-stripe-addon', |
| 208 |
'settings_link' => '', |
| 209 |
'doc_link' => 'https://docs.arraytics.com/docs/booktics/payment-type/how-to-configure-the-stripe-in-booktics/', |
| 210 |
'download_link' => 'https://products.arraytics.com/booktics-addons/booktics-stripe-addon-1.0.0.zip', |
| 211 |
), |
| 212 |
'booktics-google-calendar' => array( |
| 213 |
'name' => 'booktics-google-calendar', |
| 214 |
'slug' => 'booktics-google-calendar', |
| 215 |
'type' => 'addon', |
| 216 |
'upgrade' => true, |
| 217 |
'upgrade_link' => 'https://themewinter.com/purchase-history', |
| 218 |
'status' => 'off', |
| 219 |
'is_pro' => false, |
| 220 |
'title' => __( 'Booktics Google Calendar', 'booktics' ), |
| 221 |
'description' => __( 'It allows you to use google calendar.', 'booktics' ), |
| 222 |
'icon' => Extension_Icon::get( 'booktics-google-calendar' ), |
| 223 |
'notice' => '', |
| 224 |
'demo_link' => 'https://support.themewinter.com/docs/plugins/plugin-docs/integration/booktics-google-calendar', |
| 225 |
'settings_link' => '', |
| 226 |
'doc_link' => 'https://docs.arraytics.com/docs/booktics/integration/how-to-integrate-google-calendar-with-booktics/', |
| 227 |
'download_link' => 'https://products.arraytics.com/booktics-addons/booktics-google-calendar-1.0.0.zip', |
| 228 |
), |
| 229 |
'booktics-outlook-calendar' => array( |
| 230 |
'name' => 'booktics-outlook-calendar', |
| 231 |
'slug' => 'booktics-outlook-calendar', |
| 232 |
'type' => 'addon', |
| 233 |
'upgrade' => true, |
| 234 |
'upgrade_link' => 'https://themewinter.com/purchase-history', |
| 235 |
'status' => 'off', |
| 236 |
'is_pro' => false, |
| 237 |
'title' => __( 'Booktics Outlook Calendar', 'booktics' ), |
| 238 |
'description' => __( 'It allows you to use outlook calendar.', 'booktics' ), |
| 239 |
'icon' => Extension_Icon::get( 'booktics-outlook-calendar' ), |
| 240 |
'notice' => '', |
| 241 |
'demo_link' => 'https://support.themewinter.com/docs/plugins/plugin-docs/integration/booktics-outlook-calendar-addon', |
| 242 |
'settings_link' => '', |
| 243 |
'doc_link' => 'https://docs.arraytics.com/docs/booktics/integration/how-to-integrate-outlook-calendar-with-booktics/', |
| 244 |
'download_link' => 'https://products.arraytics.com/booktics-addons/booktics-outlook-calendar-addon-1.0.0.zip', |
| 245 |
), |
| 246 |
'booktics-fluentcrm-addon' => array( |
| 247 |
'name' => 'booktics-fluentcrm-addon', |
| 248 |
'slug' => 'booktics-fluentcrm-addon', |
| 249 |
'type' => 'addon', |
| 250 |
'upgrade' => true, |
| 251 |
'upgrade_link' => 'https://themewinter.com/purchase-history', |
| 252 |
'status' => 'off', |
| 253 |
'is_pro' => false, |
| 254 |
'title' => __( 'Booktics FluentCRM Addon', 'booktics' ), |
| 255 |
'description' => __( 'It allows you to use FluentCRM.', 'booktics' ), |
| 256 |
'icon' => Extension_Icon::get( 'booktics-fluentcrm-addon' ), |
| 257 |
'notice' => '', |
| 258 |
'demo_link' => 'https://support.themewinter.com/docs/plugins/plugin-docs/integration/booktics-fluentcrm-addon', |
| 259 |
'settings_link' => '', |
| 260 |
'doc_link' => 'https://docs.arraytics.com/docs/booktics/', |
| 261 |
'download_link' => 'https://products.arraytics.com/booktics-addons/booktics-fluentcrm-addon-1.0.0.zip', |
| 262 |
), |
| 263 |
'booktics-paypal-addon' => array( |
| 264 |
'name' => 'booktics-paypal-addon', |
| 265 |
'slug' => 'booktics-paypal-addon', |
| 266 |
'type' => 'addon', |
| 267 |
'upgrade' => true, |
| 268 |
'upgrade_link' => 'https://themewinter.com/purchase-history', |
| 269 |
'status' => 'off', |
| 270 |
'is_pro' => false, |
| 271 |
'title' => __( 'Booktics PayPal Addon', 'booktics' ), |
| 272 |
'description' => __( 'It allows you to use PayPal.', 'booktics' ), |
| 273 |
'icon' => Extension_Icon::get( 'booktics-paypal-addon' ), |
| 274 |
'notice' => '', |
| 275 |
'demo_link' => 'https://support.themewinter.com/docs/plugins/plugin-docs/integration/booktics-paypal-addon', |
| 276 |
'settings_link' => '', |
| 277 |
'doc_link' => 'https://docs.arraytics.com/docs/booktics/payment-type/how-to-configure-the-paypal-in-booktics-pro/', |
| 278 |
'download_link' => 'https://products.arraytics.com/booktics-addons/booktics-paypal-addon-1.0.0.zip', |
| 279 |
), |
| 280 |
'eventin' => array( |
| 281 |
'name' => 'eventin', |
| 282 |
'slug' => 'wp-event-solution', |
| 283 |
'type' => 'plugin', |
| 284 |
'upgrade' => false, |
| 285 |
'upgrade_link' => '', |
| 286 |
'status' => 'off', |
| 287 |
'is_pro' => false, |
| 288 |
'title' => __( 'Eventin', 'booktics' ), |
| 289 |
'description' => __( 'Best Free WordPress Event Calendar Plugin to manage booking, registration, RSVPs, schedule recurring events and sell event tickets with WooCommerce.', 'booktics' ), |
| 290 |
'icon' => Extension_Icon::get( 'eventin' ), |
| 291 |
'notice' => '', |
| 292 |
'demo_link' => 'https://product.themewinter.com/eventin', |
| 293 |
'settings_link' => '', |
| 294 |
'doc_link' => 'https://support.themewinter.com/docs/plugins/docs/eventin/', |
| 295 |
'download_link' => 'https://downloads.wordpress.org/plugin/wp-event-solution.latest-stable.zip', |
| 296 |
), |
| 297 |
'wp-cafe' => array( |
| 298 |
'name' => 'wp-cafe', |
| 299 |
'slug' => 'wp-cafe', |
| 300 |
'type' => 'plugin', |
| 301 |
'upgrade' => false, |
| 302 |
'upgrade_link' => '', |
| 303 |
'status' => 'off', |
| 304 |
'is_pro' => false, |
| 305 |
'title' => __( 'WPCafe', 'booktics' ), |
| 306 |
'description' => __( 'WPCafe - A restaurant plugin to increase sales with an Online Ordering System, Delivery, Pickup, Food Menu, Reservations, and Table Management.', 'booktics' ), |
| 307 |
'icon' => Extension_Icon::get( 'wpcafe' ), |
| 308 |
'notice' => '', |
| 309 |
'demo_link' => 'https://product.themewinter.com/wpcafe', |
| 310 |
'settings_link' => '', |
| 311 |
'doc_link' => 'https://support.themewinter.com/docs/plugins/docs/wp-cafe/', |
| 312 |
'download_link' => 'https://downloads.wordpress.org/plugin/wp-cafe.latest-stable.zip', |
| 313 |
), |
| 314 |
'timetics' => array( |
| 315 |
'name' => 'timetics', |
| 316 |
'slug' => 'timetics', |
| 317 |
'type' => 'plugin', |
| 318 |
'upgrade' => false, |
| 319 |
'upgrade_link' => '', |
| 320 |
'status' => 'off', |
| 321 |
'is_pro' => false, |
| 322 |
'title' => __( 'WP Timetics', 'booktics' ), |
| 323 |
'description' => __( 'Appointment Booking and Scheduling Calendar Plugin - WP Timetics', 'booktics' ), |
| 324 |
'icon' => Extension_Icon::get( 'timetics' ), |
| 325 |
'notice' => '', |
| 326 |
'demo_link' => 'https://arraytics.com/timetics', |
| 327 |
'settings_link' => '', |
| 328 |
'doc_link' => 'https://docs.arraytics.com/docs/timetics/getting-started/', |
| 329 |
'download_link' => 'https://downloads.wordpress.org/plugin/timetics.latest-stable.zip', |
| 330 |
), |
| 331 |
'aisentic' => array( |
| 332 |
'name' => 'aisentic', |
| 333 |
'slug' => 'aisentic', |
| 334 |
'type' => 'plugin', |
| 335 |
'upgrade' => false, |
| 336 |
'upgrade_link' => '', |
| 337 |
'status' => 'off', |
| 338 |
'is_pro' => false, |
| 339 |
'title' => __( 'Aisentic', 'booktics' ), |
| 340 |
'description' => __( 'Your AI assistant for Booktics. Manage bookings, analyze schedules, and automate routine tasks using plain English.', 'booktics' ), |
| 341 |
'icon' => '<svg width="155" height="35.838" viewBox="0 0 155 35.838" fill="none" xmlns="http://www.w3.org/2000/svg"><path width="40" height="40" rx="7.018" fill="#6443f9" d="M6.288 0H29.55A6.288 6.288 0 0 1 35.838 6.288V29.55A6.288 6.288 0 0 1 29.55 35.838H6.288A6.288 6.288 0 0 1 0 29.55V6.288A6.288 6.288 0 0 1 6.288 0z"/><path d="M17.919 3.772c0.609 0 1.193 0.244 1.623 0.676a2.303 2.303 0 0 1 0.216 3c-0.296 0.395 -0.71 0.685 -1.184 0.824v3.397h6.561c1.044 0 2.045 0.417 2.784 1.158a3.942 3.942 0 0 1 1.153 2.791v0.731h0.553a1.975 1.975 0 0 1 1.968 1.974v4.605c0 0.524 -0.207 1.026 -0.576 1.397a1.971 1.971 0 0 1 -1.392 0.578h-0.553v3.216a3.942 3.942 0 0 1 -1.153 2.792 3.942 3.942 0 0 1 -2.784 1.157h-14.434a3.942 3.942 0 0 1 -2.784 -1.157 3.942 3.942 0 0 1 -1.153 -2.791v-3.217h-0.553a1.971 1.971 0 0 1 -1.392 -0.578 1.971 1.971 0 0 1 -0.576 -1.396v-4.605c0 -0.524 0.207 -1.026 0.576 -1.396a1.971 1.971 0 0 1 1.392 -0.579h0.553v-0.731c0 -1.047 0.416 -2.052 1.153 -2.791a3.942 3.942 0 0 1 2.784 -1.158h6.561v-3.396a2.294 2.294 0 0 1 -1.64 -2.197c0 -0.61 0.242 -1.196 0.673 -1.628A2.294 2.294 0 0 1 17.919 3.772m-3.638 21.497a0.655 0.655 0 0 0 -0.908 0.787 0.663 0.663 0 0 0 0.31 0.384 9.291 9.291 0 0 0 8.472 0 0.659 0.659 0 0 0 -0.599 -1.171 8.028 8.028 0 0 1 -7.273 0m-0.627 -8.337a2.294 2.294 0 0 0 -1.623 0.675 2.308 2.308 0 0 0 0 3.258 2.294 2.294 0 0 0 3.92 -1.629c0 -0.611 -0.242 -1.197 -0.672 -1.629a2.294 2.294 0 0 0 -1.623 -0.675m8.529 0a2.294 2.294 0 0 0 -2.122 1.422 2.308 2.308 0 0 0 1.243 3.01 2.294 2.294 0 0 0 2.502 -0.499 2.308 2.308 0 0 0 0 -3.258 2.294 2.294 0 0 0 -1.624 -0.675" fill="#fff"/><path d="M148.257 29.181c-4.408 0 -7.453 -3.172 -7.453 -7.58 0 -4.407 3.044 -7.546 7.453 -7.546 2.569 0 4.661 1.141 5.929 2.949l-2.822 2.188c-0.507 -0.602 -1.395 -1.395 -3.012 -1.395 -2.188 0 -3.679 1.617 -3.679 3.805s1.491 3.805 3.679 3.805c1.617 0 2.474 -0.666 3.012 -1.331l2.822 2.123c-1.269 1.84 -3.361 2.982 -5.929 2.982m-14.589 -0.285v-13.69a0.896 0.896 0 0 1 0.896 -0.896h2.202a0.896 0.896 0 0 1 0.896 0.898l-0.03 13.688z" fill="#08002b"/><path d="M135.793 7.841a0.251 0.251 0 0 1 0.237 0.165l0.173 0.468c0.236 0.636 0.331 0.879 0.507 1.055s0.418 0.271 1.055 0.507l0.468 0.173a0.251 0.251 0 0 1 0 0.473l-0.468 0.173c-0.636 0.236 -0.879 0.332 -1.055 0.507s-0.271 0.418 -0.507 1.055l-0.173 0.469a0.252 0.252 0 0 1 -0.473 0l-0.173 -0.469c-0.236 -0.636 -0.332 -0.878 -0.507 -1.055 -0.176 -0.176 -0.418 -0.271 -1.055 -0.507l-0.469 -0.173a0.252 0.252 0 0 1 0 -0.473l0.469 -0.173c0.636 -0.236 0.879 -0.332 1.055 -0.507s0.271 -0.418 0.507 -1.055l0.173 -0.468a0.251 0.251 0 0 1 0.237 -0.165m-3.058 -1.344a0.251 0.251 0 0 1 0.237 0.165l0.074 0.201c0.106 0.285 0.136 0.352 0.184 0.4 0.048 0.048 0.116 0.079 0.4 0.185l0.201 0.073a0.253 0.253 0 0 1 0 0.473l-0.201 0.074c-0.285 0.106 -0.352 0.136 -0.4 0.184 -0.047 0.048 -0.078 0.116 -0.184 0.4l-0.074 0.201a0.252 0.252 0 0 1 -0.472 0l-0.074 -0.201c-0.106 -0.285 -0.136 -0.352 -0.185 -0.4s-0.115 -0.078 -0.4 -0.184l-0.201 -0.074a0.251 0.251 0 0 1 0 -0.473l0.201 -0.073c0.285 -0.106 0.352 -0.136 0.4 -0.185 0.048 -0.047 0.079 -0.115 0.185 -0.4l0.074 -0.201a0.251 0.251 0 0 1 0.236 -0.165" fill="#6443f9"/><path d="M127.903 28.895c-2.917 0 -4.281 -1.521 -4.281 -4.217v-7.356h-1.902V14.308h1.902v-3.575a0.896 0.896 0 0 1 0.896 -0.896h2.172a0.896 0.896 0 0 1 0.896 0.896v3.575h3.108v3.012h-3.108v6.722c0 1.713 1.046 1.776 1.967 1.776h0.983v3.076zm-22.202 0v-13.69a0.896 0.896 0 0 1 0.896 -0.896h2.172a0.896 0.896 0 0 1 0.896 0.896v0.499c1.11 -1.205 2.664 -1.617 4.091 -1.617 2.631 0 5.676 1.426 5.676 5.898v8.91h-3.964v-8.308c0 -2.569 -1.807 -3.172 -2.917 -3.172 -1.141 0 -2.886 0.603 -2.886 3.172v8.308zm-9.81 0.317c-4.472 0 -7.42 -3.266 -7.42 -7.61s2.854 -7.579 7.262 -7.579c4.344 0 7.008 3.234 7.008 7.58v1.078h-10.465c0.381 1.966 1.807 3.139 3.615 3.139 1.934 0 2.949 -0.887 3.457 -1.554l2.695 1.967c-1.269 1.838 -3.488 2.98 -6.152 2.98m-3.552 -9.037h6.691c-0.349 -1.713 -1.427 -3.013 -3.298 -3.013 -1.808 0 -3.013 1.174 -3.393 3.013M80.38 29.34c-3.584 0 -5.803 -1.744 -6.532 -3.519L76.541 24.012c0.349 0.824 2.061 2.157 3.9 2.157 1.364 0 2.093 -0.412 2.093 -1.364 0 -1.174 -1.871 -1.49 -3.012 -1.871s-5.042 -1.3 -5.042 -4.503c0 -3.107 2.726 -4.439 5.866 -4.439 3.172 0 5.295 1.491 6.025 3.076l-2.569 1.649c-0.444 -0.697 -2.029 -1.711 -3.584 -1.711 -1.299 0 -1.871 0.507 -1.871 1.236 0 1.174 1.808 1.49 2.949 1.871s5.105 1.395 5.105 4.534c0 3.076 -2.283 4.693 -6.025 4.693m-11.352 -17.185c-1.079 0 -2.189 -0.824 -2.189 -2.219 0 -1.364 1.111 -2.093 2.188 -2.093 1.046 0 2.189 0.729 2.189 2.093 0 1.395 -1.142 2.219 -2.188 2.219m-1.998 16.744V14.31h3.996l-0.032 14.586zM44.798 28.895 52.942 8.843a0.896 0.896 0 0 1 0.831 -0.559h1.9a0.896 0.896 0 0 1 0.831 0.56l8.113 20.051h-4.344l-1.332 -3.393h-8.467l-1.331 3.393zm7.167 -7.134h5.517l-2.76 -7.008z" fill="#08002b"/></svg>', |
| 342 |
'notice' => '', |
| 343 |
'demo_link' => '', |
| 344 |
'settings_link' => '', |
| 345 |
'doc_link' => 'https://support.themewinter.com/docs/plugins/docs/aisentic/', |
| 346 |
), |
| 347 |
'optiontics' => array( |
| 348 |
'name' => 'optiontics', |
| 349 |
'slug' => 'optiontics', |
| 350 |
'type' => 'plugin', |
| 351 |
'upgrade' => false, |
| 352 |
'upgrade_link' => '', |
| 353 |
'status' => 'off', |
| 354 |
'is_pro' => false, |
| 355 |
'title' => __( 'Optiontics', 'booktics' ), |
| 356 |
'description' => __( 'Offer paid add-ons and extra options with every booking — services, extras, packages, or custom upgrades.', 'booktics' ), |
| 357 |
'icon' => '<svg width="150px" height="40px" viewBox="0 0 155 27.5" fill="none" xmlns="http://www.w3.org/2000/svg"><path width="36" height="42" rx="5" fill="#F6F3FF" d="M3.125 0H19.375A3.125 3.125 0 0 1 22.5 3.125V23.125A3.125 3.125 0 0 1 19.375 26.25H3.125A3.125 3.125 0 0 1 0 23.125V3.125A3.125 3.125 0 0 1 3.125 0z"/><path x="3.375" y="3.5" width="29.25" height="10.5" rx="5.25" fill="#4A3BD6" d="M5.391 2.188H17.109A3.281 3.281 0 0 1 20.391 5.469V5.469A3.281 3.281 0 0 1 17.109 8.75H5.391A3.281 3.281 0 0 1 2.109 5.469V5.469A3.281 3.281 0 0 1 5.391 2.188z"/><path x="3.375" y="15.75" width="29.25" height="10.5" rx="5.25" fill="#6F33EC" d="M5.391 9.844H17.109A3.281 3.281 0 0 1 20.391 13.125V13.125A3.281 3.281 0 0 1 17.109 16.406H5.391A3.281 3.281 0 0 1 2.109 13.125V13.125A3.281 3.281 0 0 1 5.391 9.844z"/><path x="3.375" y="28" width="29.25" height="10.5" rx="5.25" fill="#1AB89C" d="M5.391 17.5H17.109A3.281 3.281 0 0 1 20.391 20.781V20.781A3.281 3.281 0 0 1 17.109 24.063H5.391A3.281 3.281 0 0 1 2.109 20.781V20.781A3.281 3.281 0 0 1 5.391 17.5z"/><path d="M5.274 3.879c0.833 0 1.523 0.703 1.523 1.589S6.107 7.056 5.274 7.056C4.44 7.056 3.75 6.354 3.75 5.468s0.69 -1.589 1.524 -1.589Z" stroke="white" stroke-width="0.46875"/><path cx="8.4375" cy="33.2487" rx="2.8125" ry="2.91667" fill="white" d="M7.031 20.78A1.758 1.823 0 0 1 5.273 22.603A1.758 1.823 0 0 1 3.516 20.78A1.758 1.823 0 0 1 7.031 20.78z"/><path cx="8.4375" cy="20.9987" rx="2.8125" ry="2.91667" fill="white" d="M7.031 13.124A1.758 1.823 0 0 1 5.273 14.947A1.758 1.823 0 0 1 3.516 13.124A1.758 1.823 0 0 1 7.031 13.124z"/><path d="m4.571 13.216 0.439 0.456 0.967 -1.094" stroke="#6F33EC" stroke-width="0.234375" stroke-linecap="round" stroke-linejoin="round"/><path d="M46.759 13.235q0 2.929 -1.11 4.984 -1.102 2.054 -3.008 3.138 -1.898 1.075 -4.266 1.075 -2.386 0 -4.284 -1.084t-2.999 -3.138q-1.102 -2.055 -1.102 -4.975 0 -2.928 1.102 -4.983 1.101 -2.054 2.999 -3.129Q35.989 4.037 38.375 4.037q2.369 0 4.266 1.084 1.906 1.075 3.008 3.129 1.11 2.055 1.11 4.983m-3.837 0q0 -1.897 -0.569 -3.2 -0.559 -1.302 -1.583 -1.975 -1.022 -0.674 -2.395 -0.674t-2.396 0.674q-1.023 0.673 -1.591 1.975 -0.559 1.303 -0.559 3.2t0.559 3.2q0.569 1.302 1.591 1.976 1.023 0.673 2.396 0.673t2.395 -0.673q1.022 -0.673 1.583 -1.976 0.569 -1.303 0.569 -3.2M49.494 27.223V8.759h3.672v2.256h0.166q0.244 -0.542 0.708 -1.102 0.472 -0.569 1.224 -0.944 0.761 -0.385 1.888 -0.385 1.469 0 2.711 0.769 1.241 0.761 1.984 2.3 0.743 1.529 0.743 3.837 0 2.247 -0.726 3.794 -0.717 1.539 -1.958 2.334 -1.233 0.787 -2.763 0.787 -1.084 0 -1.845 -0.359 -0.752 -0.358 -1.232 -0.9 -0.481 -0.551 -0.734 -1.111h-0.114v7.186zm3.646 -11.75q0 1.198 0.332 2.089 0.333 0.892 0.962 1.39 0.629 0.49 1.53 0.49 0.909 0 1.539 -0.498 0.629 -0.507 0.953 -1.399 0.332 -0.9 0.332 -2.072 0 -1.163 -0.323 -2.046 -0.324 -0.883 -0.953 -1.381 -0.63 -0.499 -1.547 -0.498 -0.909 0 -1.539 0.481 -0.621 0.481 -0.953 1.364 -0.332 0.883 -0.332 2.081m19.076 -6.714v2.798h-8.086v-2.797zm-6.251 -3.217h3.724v12.519q0 0.516 0.158 0.805 0.158 0.279 0.437 0.393 0.289 0.114 0.664 0.114 0.263 0 0.524 -0.044 0.263 -0.053 0.403 -0.079l0.586 2.771q-0.279 0.088 -0.787 0.201 -0.507 0.122 -1.232 0.149 -1.346 0.052 -2.361 -0.359 -1.005 -0.411 -1.565 -1.276 -0.559 -0.866 -0.551 -2.186zM74.641 22.188V8.759h3.724V22.188zm1.871 -15.159q-0.831 0 -1.425 -0.551 -0.586 -0.559 -0.586 -1.338 0 -0.769 0.586 -1.321 0.594 -0.559 1.425 -0.559t1.416 0.559q0.594 0.551 0.594 1.321 0 0.778 -0.594 1.338 -0.586 0.55 -1.416 0.55m10.904 15.422q-2.037 0 -3.523 -0.866 -1.478 -0.875 -2.282 -2.431 -0.804 -1.565 -0.804 -3.628 0 -2.081 0.804 -3.637 0.804 -1.564 2.282 -2.43 1.486 -0.875 3.523 -0.875 2.037 0 3.514 0.875 1.486 0.865 2.291 2.43 0.804 1.556 0.804 3.638 0 2.063 -0.804 3.628 -0.804 1.556 -2.291 2.431 -1.478 0.866 -3.514 0.866m0.018 -2.885q0.927 0 1.547 -0.525 0.621 -0.533 0.936 -1.451 0.323 -0.917 0.323 -2.089t-0.323 -2.089q-0.315 -0.917 -0.936 -1.451 -0.621 -0.533 -1.547 -0.533 -0.936 0 -1.574 0.533 -0.629 0.534 -0.953 1.451 -0.314 0.919 -0.314 2.089 0 1.172 0.314 2.089 0.324 0.919 0.953 1.451 0.638 0.525 1.574 0.525m12.737 -5.141V22.188h-3.724V8.759h3.549v2.369h0.157a3.75 3.75 0 0 1 1.495 -1.853q1.049 -0.691 2.544 -0.691 1.399 0 2.439 0.612t1.618 1.749q0.577 1.128 0.577 2.692V22.188h-3.724V14.302q0.008 -1.232 -0.63 -1.924 -0.637 -0.699 -1.757 -0.699 -0.752 0 -1.329 0.324 -0.569 0.324 -0.892 0.944 -0.315 0.613 -0.324 1.478m18.733 -5.665v2.797h-8.087v-2.797zm-6.251 -3.217h3.724v12.519q0 0.516 0.158 0.805 0.158 0.279 0.438 0.393 0.288 0.114 0.664 0.114 0.262 0 0.524 -0.044 0.263 -0.053 0.402 -0.079l0.586 2.771q-0.28 0.088 -0.787 0.201 -0.508 0.122 -1.233 0.149 -1.346 0.052 -2.36 -0.359 -1.006 -0.411 -1.565 -1.276 -0.56 -0.866 -0.551 -2.186zM121.331 22.188V8.759h3.724V22.188zm1.871 -15.159q-0.831 0 -1.425 -0.551 -0.586 -0.559 -0.586 -1.338 0 -0.769 0.586 -1.321 0.594 -0.559 1.425 -0.559t1.416 0.559q0.594 0.551 0.594 1.321 0 0.778 -0.594 1.338 -0.586 0.55 -1.416 0.55m10.904 15.422q-2.063 0 -3.549 -0.875 -1.478 -0.882 -2.272 -2.447 -0.787 -1.565 -0.787 -3.602 0 -2.063 0.796 -3.619 0.804 -1.565 2.281 -2.439 1.478 -0.883 3.515 -0.883 1.757 0 3.077 0.637 1.321 0.639 2.089 1.792 0.769 1.154 0.848 2.711h-3.514q-0.148 -1.006 -0.787 -1.618 -0.629 -0.621 -1.653 -0.621 -0.865 0 -1.512 0.472 -0.639 0.463 -0.997 1.355t-0.359 2.159q0 1.286 0.35 2.186 0.358 0.9 1.006 1.373 0.647 0.473 1.512 0.473 0.639 0 1.146 -0.263a2.219 2.219 0 0 0 0.848 -0.761q0.341 -0.506 0.446 -1.215h3.514q-0.088 1.539 -0.839 2.71 -0.742 1.163 -2.054 1.819 -1.311 0.656 -3.104 0.656m19.555 -9.862 -3.409 0.21a1.75 1.75 0 0 0 -0.376 -0.787 2 2 0 0 0 -0.761 -0.569q-0.463 -0.218 -1.11 -0.218 -0.866 0 -1.46 0.367 -0.594 0.358 -0.594 0.961 0 0.481 0.384 -2.666 0 -4.249 -1.111 -1.574 -1.119 -1.845 -3.043l3.663 -0.192q0.166 0.813 0.804 1.241 0.639 0.419 1.635 0.419 0.979 0 1.574 -0.376 0.603 -0.384 0.612 -0.988 -0.009 -0.508 -0.429 -0.831 -0.419 -0.332 -1.294 -0.506l-2.326 -0.464q-1.967 -0.394 -2.929 -1.364 -0.953 -0.971 -0.953 -2.474 0 -1.294 0.699 -2.229 0.708 -0.936 1.984 -1.442 1.286 -0.506 3.008 -0.507 2.544 0 4.004 1.075 1.469 1.076 1.714 2.929" fill="#303030"/></svg>', |
| 358 |
'notice' => '', |
| 359 |
'demo_link' => '', |
| 360 |
'settings_link' => '', |
| 361 |
'doc_link' => 'https://support.themewinter.com/docs/plugins/plugin-docs/optiontics/how-to-create-product-options/', |
| 362 |
'download_link' => 'https://github.com/themewinter/optiontics-public/releases/download/release/optiontics.zip', |
| 363 |
), |
| 364 |
); |
| 365 |
} |
| 366 |
} |
| 367 |
|