Changeset 3488708
- Timestamp:
- 03/23/2026 08:48:07 AM (9 days ago)
- Location:
- pitchprint
- Files:
-
- 20 edited
- 1 copied
-
tags/11.3.0 (copied) (copied from pitchprint/trunk)
-
tags/11.3.0/CHANGELOG.txt (modified) (1 diff)
-
tags/11.3.0/functions/admin/designs.php (modified) (2 diffs)
-
tags/11.3.0/functions/admin/orders.php (modified) (2 diffs)
-
tags/11.3.0/functions/admin/settings.php (modified) (3 diffs)
-
tags/11.3.0/functions/front/accounts.php (modified) (2 diffs)
-
tags/11.3.0/functions/front/customize_button.php (modified) (2 diffs)
-
tags/11.3.0/functions/front/projects.php (modified) (2 diffs)
-
tags/11.3.0/functions/general/customization.php (modified) (3 diffs)
-
tags/11.3.0/pitchprint.php (modified) (2 diffs)
-
tags/11.3.0/readme.txt (modified) (2 diffs)
-
trunk/CHANGELOG.txt (modified) (1 diff)
-
trunk/functions/admin/designs.php (modified) (2 diffs)
-
trunk/functions/admin/orders.php (modified) (2 diffs)
-
trunk/functions/admin/settings.php (modified) (3 diffs)
-
trunk/functions/front/accounts.php (modified) (2 diffs)
-
trunk/functions/front/customize_button.php (modified) (2 diffs)
-
trunk/functions/front/projects.php (modified) (2 diffs)
-
trunk/functions/general/customization.php (modified) (3 diffs)
-
trunk/pitchprint.php (modified) (2 diffs)
-
trunk/readme.txt (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
pitchprint/tags/11.3.0/CHANGELOG.txt
r3479889 r3488708 1 == 11.3.0 = 2 Improved user identification for customization data isolation 3 Improved session handling reliability 4 Replaced deprecated wc_enqueue_js with wp_add_inline_script 5 1 6 == 11.2.0 = 2 7 Fixed a vulnerability issue confined to uploads the plugin folder -
pitchprint/tags/11.3.0/functions/admin/designs.php
r3286188 r3488708 89 89 90 90 $credentials = \pitchprint\functions\general\fetch_credentials(); 91 wc_enqueue_js(PITCHPRINT_ADMIN_DEF . "91 $pp_inline_js = PITCHPRINT_ADMIN_DEF . " 92 92 PPADMIN.vars = { 93 93 credentials: { timestamp: '" . $credentials['timestamp'] . "', apiKey: '" . get_option('ppa_api_key') . "', signature: '" . $credentials['signature'] . "'}, … … 96 96 PPADMIN.readyFncs.push('init', 'fetchDesigns'); 97 97 if (typeof PPADMIN.start !== 'undefined') PPADMIN.start(); 98 "); 98 "; 99 wp_register_script('pitchprint-admin-designs', '', array('pitchprint_admin'), false, true); 100 wp_enqueue_script('pitchprint-admin-designs'); 101 wp_add_inline_script('pitchprint-admin-designs', $pp_inline_js); 99 102 100 103 } -
pitchprint/tags/11.3.0/functions/admin/orders.php
r3391124 r3488708 22 22 $cred = \pitchprint\functions\general\fetch_credentials(); 23 23 wp_enqueue_script('pitchprint_admin', 'https://pitchprint.io/rsc/js/a.wp.js'); 24 wc_enqueue_js("var PPADMIN = window.PPADMIN; if (typeof PPADMIN === 'undefined') window.PPADMIN = PPADMIN = { version: '9.0.0', readyFncs: [] };" . "24 $pp_inline_js = "var PPADMIN = window.PPADMIN; if (typeof PPADMIN === 'undefined') window.PPADMIN = PPADMIN = { version: '9.0.0', readyFncs: [] };" . " 25 25 PPADMIN.vars = { 26 26 credentials: { timestamp: '" . $cred['timestamp'] . "', apiKey: '" . get_option('ppa_api_key') . "', signature: '" . $cred['signature'] . "'} … … 28 28 PPADMIN.readyFncs.push('init'); 29 29 if (typeof PPADMIN.start !== 'undefined') PPADMIN.start(); 30 "); 30 "; 31 wp_register_script('pitchprint-admin-order', '', array('pitchprint_admin'), false, true); 32 wp_enqueue_script('pitchprint-admin-order'); 33 wp_add_inline_script('pitchprint-admin-order', $pp_inline_js); 31 34 } 32 35 function format_pitchprint_order_value($formatted_meta, $order_item) { -
pitchprint/tags/11.3.0/functions/admin/settings.php
r3404073 r3488708 44 44 'ppa_settings_section' 45 45 ); 46 add_settings_field( 47 'ppa_disable_session', 48 __('Disable Session Backup', 'PitchPrint'), 49 'pitchprint\\functions\\admin\\ppa_disable_session', 50 'pitchprint', 51 'ppa_settings_section' 52 ); 46 53 47 54 // Register settings with sanitization callbacks … … 60 67 ]); 61 68 register_setting('pitchprint', 'ppa_email_download_link', [ 69 'sanitize_callback' => 'sanitize_text_field' 70 ]); 71 register_setting('pitchprint', 'ppa_disable_session', [ 62 72 'sanitize_callback' => 'sanitize_text_field' 63 73 ]); … … 86 96 } 87 97 98 function ppa_disable_session() { 99 $checked = checked(get_option('ppa_disable_session'), 'on', false); 100 echo '<input id="ppa_disable_session" name="ppa_disable_session" type="checkbox" ' . $checked . ' />'; 101 echo '<label for="ppa_disable_session">' . __('Disable PHP session backup (enable this if your host uses Batcache or similar page caching)', 'PitchPrint') . '</label>'; 102 } 103 88 104 function add_settings_link($links) { 89 105 $settings_link = [ -
pitchprint/tags/11.3.0/functions/front/accounts.php
r3286188 r3488708 13 13 14 14 echo '<div id="pp_mydesigns_div"></div>'; 15 wc_enqueue_js("15 $pp_inline_js = " 16 16 ajaxsearch = undefined; 17 17 (function(_doc) { … … 28 28 isCheckoutPage: " . (is_checkout() ? 'true' : 'false') . " 29 29 }); 30 })(document);"); 30 })(document);"; 31 wp_register_script('pitchprint-account-init', '', array('pitchprint_class'), false, true); 32 wp_enqueue_script('pitchprint-account-init'); 33 wp_add_inline_script('pitchprint-account-init', $pp_inline_js); 31 34 } 32 35 -
pitchprint/tags/11.3.0/functions/front/customize_button.php
r3391124 r3488708 69 69 $upload_path = file_exists(ABSPATH . 'pitchprint/uploader') ? 'pitchprint/uploader/' : 'wp-content/plugins/pitchprint/uploader/'; 70 70 71 wc_enqueue_js("71 $pp_inline_js = " 72 72 ajaxsearch = undefined; 73 73 (function(_doc) { … … 100 100 ppValue: '{$now_value}', 101 101 }); 102 })(document);"); 102 })(document);"; 103 wp_register_script('pitchprint-product-init', '', array('pitchprint_class'), false, true); 104 wp_enqueue_script('pitchprint-product-init'); 105 wp_add_inline_script('pitchprint-product-init', $pp_inline_js); 103 106 104 107 echo '<input type="hidden" id="_w2p_set_option" name="_w2p_set_option" value="' . $now_value . '" /> -
pitchprint/tags/11.3.0/functions/front/projects.php
r3286188 r3488708 6 6 7 7 function save_project_sess() { 8 8 9 9 if (!isset($_POST['productId']) || empty($_POST['productId'])) { 10 10 wp_send_json_error('No product ID provided'); … … 35 35 36 36 function reset_project_sess() { 37 37 38 if (!isset($_POST['productId']) || empty($_POST['productId'])) { 38 39 wp_send_json_error('No product ID provided.'); -
pitchprint/tags/11.3.0/functions/general/customization.php
r3296178 r3488708 3 3 namespace pitchprint\functions\general; 4 4 5 function get_user_token() { 6 if (isset($_COOKIE[PITCHPRINT_CUSTOMIZATION_KEY])) 7 return $_COOKIE[PITCHPRINT_CUSTOMIZATION_KEY]; 8 9 // Generate a random token for the user (guest or signed-in) 10 if (!headers_sent()) { 11 $token = bin2hex(random_bytes(16)); 12 $cookie_set = setcookie(PITCHPRINT_CUSTOMIZATION_KEY, $token, time() + PITCHPRINT_CUSTOMIZATION_DURATION, '/'); 13 14 if (!$cookie_set) { 15 // Handle error if cookie cannot be set 16 error_log('[PITCHPRINT] Failed to set cookie: ' . PRINT_APP_CUSTOMIZATION_KEY); 17 } else { 18 return $token; 19 } 5 function use_session_backup() { 6 return get_option('ppa_disable_session') !== 'on'; 7 } 8 9 function ensure_session() { 10 if (use_session_backup() && session_status() === PHP_SESSION_NONE && !headers_sent()) { 11 @session_start(); 20 12 } 21 13 } 22 14 23 // Sanitize and validate inputs for better security 15 function get_user_token() { 16 // For logged-in WordPress users, use their user ID as the token. 17 // This ensures data isolation even if cookies are lost or shared. 18 $user_id = get_current_user_id(); 19 if ($user_id > 0) { 20 return 'user_' . $user_id; 21 } 22 23 // For guests, use the cookie token managed by the JS client 24 if (isset($_COOKIE[PITCHPRINT_CUSTOMIZATION_KEY]) && !empty($_COOKIE[PITCHPRINT_CUSTOMIZATION_KEY])) { 25 return sanitize_text_field($_COOKIE[PITCHPRINT_CUSTOMIZATION_KEY]); 26 } 27 28 return false; 29 } 30 24 31 function save_customization_data($product_id, $customization_data) { 25 $product_id = absint($product_id); // Ensure product_id is an integer26 $customization_data = wp_unslash($customization_data); // Remove slashes from input32 $product_id = absint($product_id); 33 $customization_data = wp_unslash($customization_data); 27 34 28 35 $user_token = get_user_token(); 29 36 if (!is_string($user_token) || empty($user_token)) { 30 return false; // Invalid token37 return false; 31 38 } 32 39 $key = 'pitchprint_' . $user_token . '_' . $product_id; 33 40 34 // Try saving to transient first35 41 delete_transient($key); 36 $ transient_result = set_transient($key, $customization_data, PITCHPRINT_CUSTOMIZATION_DURATION);42 $result = set_transient($key, $customization_data, PITCHPRINT_CUSTOMIZATION_DURATION); 37 43 38 // Also save to session as a backup 39 if (!headers_sent() && session_status() === PHP_SESSION_NONE) { 40 session_start(); 44 // Session backup for hosts that allow it 45 ensure_session(); 46 if (session_status() === PHP_SESSION_ACTIVE) { 47 $_SESSION[$key] = $customization_data; 41 48 } 42 $_SESSION[$key] = $customization_data;43 49 44 // Return the key if transient save was successful, otherwise FALSE 45 return $transient_result !== FALSE ? $key : FALSE; 50 return $result !== FALSE ? $key : FALSE; 46 51 } 47 52 … … 49 54 $user_token = get_user_token(); 50 55 if (!is_string($user_token) || empty($user_token)) { 51 return false; // Invalid token56 return false; 52 57 } 53 58 $key = 'pitchprint_' . $user_token . '_' . $product_id; 54 59 55 // Try getting from transient first56 60 $data = get_transient($key); 57 58 61 if ($data !== false) { 59 62 return $data; 60 63 } 61 64 62 // If transient failed or expired, try getting from session 63 if (!headers_sent() && session_status() === PHP_SESSION_NONE) { 64 session_start(); 65 } 66 67 if (isset($_SESSION[$key])) { 68 // Optionally, restore the transient if found in session 65 // Fall back to session if transient expired 66 ensure_session(); 67 if (session_status() === PHP_SESSION_ACTIVE && isset($_SESSION[$key])) { 69 68 return $_SESSION[$key]; 70 69 } 71 70 72 return false; // Return false if not found in either71 return false; 73 72 } 74 73 … … 76 75 $user_token = get_user_token(); 77 76 if (!is_string($user_token) || empty($user_token)) { 78 return false; // Invalid token77 return false; 79 78 } 80 79 $key = 'pitchprint_' . $user_token . '_' . $product_id; 81 80 82 // Delete from transient83 81 delete_transient($key); 84 82 85 // Delete from session 86 if (!headers_sent() && session_status() === PHP_SESSION_NONE) { 87 session_start(); 88 } 89 if (isset($_SESSION[$key])) { 83 ensure_session(); 84 if (session_status() === PHP_SESSION_ACTIVE && isset($_SESSION[$key])) { 90 85 unset($_SESSION[$key]); 91 86 } -
pitchprint/tags/11.3.0/pitchprint.php
r3479889 r3488708 6 6 * Description: A beautiful web based print customization app for your online store. Integrates with WooCommerce. 7 7 * Author: PitchPrint, Inc. 8 * Version: 11. 2.08 * Version: 11.3.0 9 9 * Author URI: https://pitchprint.com 10 10 * Requires at least: 3.8 … … 47 47 * @var string 48 48 */ 49 public $version = '11. 2.0';49 public $version = '11.3.0'; 50 50 51 51 /** -
pitchprint/tags/11.3.0/readme.txt
r3479889 r3488708 4 4 Requires at least: 3.8 5 5 Tested up to: 6.8 6 Stable tag: 11. 2.06 Stable tag: 11.3.0 7 7 License: GPLv2 or later 8 8 License URI: http://www.gnu.org/licenses/gpl-2.0.html … … 172 172 173 173 == Changelog == 174 175 == 11.3.0 = 176 Improved user identification for customization data isolation 177 Improved session handling reliability 178 Replaced deprecated wc_enqueue_js with wp_add_inline_script 174 179 175 180 == 11.2.0 = -
pitchprint/trunk/CHANGELOG.txt
r3479889 r3488708 1 == 11.3.0 = 2 Improved user identification for customization data isolation 3 Improved session handling reliability 4 Replaced deprecated wc_enqueue_js with wp_add_inline_script 5 1 6 == 11.2.0 = 2 7 Fixed a vulnerability issue confined to uploads the plugin folder -
pitchprint/trunk/functions/admin/designs.php
r3286188 r3488708 89 89 90 90 $credentials = \pitchprint\functions\general\fetch_credentials(); 91 wc_enqueue_js(PITCHPRINT_ADMIN_DEF . "91 $pp_inline_js = PITCHPRINT_ADMIN_DEF . " 92 92 PPADMIN.vars = { 93 93 credentials: { timestamp: '" . $credentials['timestamp'] . "', apiKey: '" . get_option('ppa_api_key') . "', signature: '" . $credentials['signature'] . "'}, … … 96 96 PPADMIN.readyFncs.push('init', 'fetchDesigns'); 97 97 if (typeof PPADMIN.start !== 'undefined') PPADMIN.start(); 98 "); 98 "; 99 wp_register_script('pitchprint-admin-designs', '', array('pitchprint_admin'), false, true); 100 wp_enqueue_script('pitchprint-admin-designs'); 101 wp_add_inline_script('pitchprint-admin-designs', $pp_inline_js); 99 102 100 103 } -
pitchprint/trunk/functions/admin/orders.php
r3391124 r3488708 22 22 $cred = \pitchprint\functions\general\fetch_credentials(); 23 23 wp_enqueue_script('pitchprint_admin', 'https://pitchprint.io/rsc/js/a.wp.js'); 24 wc_enqueue_js("var PPADMIN = window.PPADMIN; if (typeof PPADMIN === 'undefined') window.PPADMIN = PPADMIN = { version: '9.0.0', readyFncs: [] };" . "24 $pp_inline_js = "var PPADMIN = window.PPADMIN; if (typeof PPADMIN === 'undefined') window.PPADMIN = PPADMIN = { version: '9.0.0', readyFncs: [] };" . " 25 25 PPADMIN.vars = { 26 26 credentials: { timestamp: '" . $cred['timestamp'] . "', apiKey: '" . get_option('ppa_api_key') . "', signature: '" . $cred['signature'] . "'} … … 28 28 PPADMIN.readyFncs.push('init'); 29 29 if (typeof PPADMIN.start !== 'undefined') PPADMIN.start(); 30 "); 30 "; 31 wp_register_script('pitchprint-admin-order', '', array('pitchprint_admin'), false, true); 32 wp_enqueue_script('pitchprint-admin-order'); 33 wp_add_inline_script('pitchprint-admin-order', $pp_inline_js); 31 34 } 32 35 function format_pitchprint_order_value($formatted_meta, $order_item) { -
pitchprint/trunk/functions/admin/settings.php
r3404073 r3488708 44 44 'ppa_settings_section' 45 45 ); 46 add_settings_field( 47 'ppa_disable_session', 48 __('Disable Session Backup', 'PitchPrint'), 49 'pitchprint\\functions\\admin\\ppa_disable_session', 50 'pitchprint', 51 'ppa_settings_section' 52 ); 46 53 47 54 // Register settings with sanitization callbacks … … 60 67 ]); 61 68 register_setting('pitchprint', 'ppa_email_download_link', [ 69 'sanitize_callback' => 'sanitize_text_field' 70 ]); 71 register_setting('pitchprint', 'ppa_disable_session', [ 62 72 'sanitize_callback' => 'sanitize_text_field' 63 73 ]); … … 86 96 } 87 97 98 function ppa_disable_session() { 99 $checked = checked(get_option('ppa_disable_session'), 'on', false); 100 echo '<input id="ppa_disable_session" name="ppa_disable_session" type="checkbox" ' . $checked . ' />'; 101 echo '<label for="ppa_disable_session">' . __('Disable PHP session backup (enable this if your host uses Batcache or similar page caching)', 'PitchPrint') . '</label>'; 102 } 103 88 104 function add_settings_link($links) { 89 105 $settings_link = [ -
pitchprint/trunk/functions/front/accounts.php
r3286188 r3488708 13 13 14 14 echo '<div id="pp_mydesigns_div"></div>'; 15 wc_enqueue_js("15 $pp_inline_js = " 16 16 ajaxsearch = undefined; 17 17 (function(_doc) { … … 28 28 isCheckoutPage: " . (is_checkout() ? 'true' : 'false') . " 29 29 }); 30 })(document);"); 30 })(document);"; 31 wp_register_script('pitchprint-account-init', '', array('pitchprint_class'), false, true); 32 wp_enqueue_script('pitchprint-account-init'); 33 wp_add_inline_script('pitchprint-account-init', $pp_inline_js); 31 34 } 32 35 -
pitchprint/trunk/functions/front/customize_button.php
r3391124 r3488708 69 69 $upload_path = file_exists(ABSPATH . 'pitchprint/uploader') ? 'pitchprint/uploader/' : 'wp-content/plugins/pitchprint/uploader/'; 70 70 71 wc_enqueue_js("71 $pp_inline_js = " 72 72 ajaxsearch = undefined; 73 73 (function(_doc) { … … 100 100 ppValue: '{$now_value}', 101 101 }); 102 })(document);"); 102 })(document);"; 103 wp_register_script('pitchprint-product-init', '', array('pitchprint_class'), false, true); 104 wp_enqueue_script('pitchprint-product-init'); 105 wp_add_inline_script('pitchprint-product-init', $pp_inline_js); 103 106 104 107 echo '<input type="hidden" id="_w2p_set_option" name="_w2p_set_option" value="' . $now_value . '" /> -
pitchprint/trunk/functions/front/projects.php
r3286188 r3488708 6 6 7 7 function save_project_sess() { 8 8 9 9 if (!isset($_POST['productId']) || empty($_POST['productId'])) { 10 10 wp_send_json_error('No product ID provided'); … … 35 35 36 36 function reset_project_sess() { 37 37 38 if (!isset($_POST['productId']) || empty($_POST['productId'])) { 38 39 wp_send_json_error('No product ID provided.'); -
pitchprint/trunk/functions/general/customization.php
r3296178 r3488708 3 3 namespace pitchprint\functions\general; 4 4 5 function get_user_token() { 6 if (isset($_COOKIE[PITCHPRINT_CUSTOMIZATION_KEY])) 7 return $_COOKIE[PITCHPRINT_CUSTOMIZATION_KEY]; 8 9 // Generate a random token for the user (guest or signed-in) 10 if (!headers_sent()) { 11 $token = bin2hex(random_bytes(16)); 12 $cookie_set = setcookie(PITCHPRINT_CUSTOMIZATION_KEY, $token, time() + PITCHPRINT_CUSTOMIZATION_DURATION, '/'); 13 14 if (!$cookie_set) { 15 // Handle error if cookie cannot be set 16 error_log('[PITCHPRINT] Failed to set cookie: ' . PRINT_APP_CUSTOMIZATION_KEY); 17 } else { 18 return $token; 19 } 5 function use_session_backup() { 6 return get_option('ppa_disable_session') !== 'on'; 7 } 8 9 function ensure_session() { 10 if (use_session_backup() && session_status() === PHP_SESSION_NONE && !headers_sent()) { 11 @session_start(); 20 12 } 21 13 } 22 14 23 // Sanitize and validate inputs for better security 15 function get_user_token() { 16 // For logged-in WordPress users, use their user ID as the token. 17 // This ensures data isolation even if cookies are lost or shared. 18 $user_id = get_current_user_id(); 19 if ($user_id > 0) { 20 return 'user_' . $user_id; 21 } 22 23 // For guests, use the cookie token managed by the JS client 24 if (isset($_COOKIE[PITCHPRINT_CUSTOMIZATION_KEY]) && !empty($_COOKIE[PITCHPRINT_CUSTOMIZATION_KEY])) { 25 return sanitize_text_field($_COOKIE[PITCHPRINT_CUSTOMIZATION_KEY]); 26 } 27 28 return false; 29 } 30 24 31 function save_customization_data($product_id, $customization_data) { 25 $product_id = absint($product_id); // Ensure product_id is an integer26 $customization_data = wp_unslash($customization_data); // Remove slashes from input32 $product_id = absint($product_id); 33 $customization_data = wp_unslash($customization_data); 27 34 28 35 $user_token = get_user_token(); 29 36 if (!is_string($user_token) || empty($user_token)) { 30 return false; // Invalid token37 return false; 31 38 } 32 39 $key = 'pitchprint_' . $user_token . '_' . $product_id; 33 40 34 // Try saving to transient first35 41 delete_transient($key); 36 $ transient_result = set_transient($key, $customization_data, PITCHPRINT_CUSTOMIZATION_DURATION);42 $result = set_transient($key, $customization_data, PITCHPRINT_CUSTOMIZATION_DURATION); 37 43 38 // Also save to session as a backup 39 if (!headers_sent() && session_status() === PHP_SESSION_NONE) { 40 session_start(); 44 // Session backup for hosts that allow it 45 ensure_session(); 46 if (session_status() === PHP_SESSION_ACTIVE) { 47 $_SESSION[$key] = $customization_data; 41 48 } 42 $_SESSION[$key] = $customization_data;43 49 44 // Return the key if transient save was successful, otherwise FALSE 45 return $transient_result !== FALSE ? $key : FALSE; 50 return $result !== FALSE ? $key : FALSE; 46 51 } 47 52 … … 49 54 $user_token = get_user_token(); 50 55 if (!is_string($user_token) || empty($user_token)) { 51 return false; // Invalid token56 return false; 52 57 } 53 58 $key = 'pitchprint_' . $user_token . '_' . $product_id; 54 59 55 // Try getting from transient first56 60 $data = get_transient($key); 57 58 61 if ($data !== false) { 59 62 return $data; 60 63 } 61 64 62 // If transient failed or expired, try getting from session 63 if (!headers_sent() && session_status() === PHP_SESSION_NONE) { 64 session_start(); 65 } 66 67 if (isset($_SESSION[$key])) { 68 // Optionally, restore the transient if found in session 65 // Fall back to session if transient expired 66 ensure_session(); 67 if (session_status() === PHP_SESSION_ACTIVE && isset($_SESSION[$key])) { 69 68 return $_SESSION[$key]; 70 69 } 71 70 72 return false; // Return false if not found in either71 return false; 73 72 } 74 73 … … 76 75 $user_token = get_user_token(); 77 76 if (!is_string($user_token) || empty($user_token)) { 78 return false; // Invalid token77 return false; 79 78 } 80 79 $key = 'pitchprint_' . $user_token . '_' . $product_id; 81 80 82 // Delete from transient83 81 delete_transient($key); 84 82 85 // Delete from session 86 if (!headers_sent() && session_status() === PHP_SESSION_NONE) { 87 session_start(); 88 } 89 if (isset($_SESSION[$key])) { 83 ensure_session(); 84 if (session_status() === PHP_SESSION_ACTIVE && isset($_SESSION[$key])) { 90 85 unset($_SESSION[$key]); 91 86 } -
pitchprint/trunk/pitchprint.php
r3479889 r3488708 6 6 * Description: A beautiful web based print customization app for your online store. Integrates with WooCommerce. 7 7 * Author: PitchPrint, Inc. 8 * Version: 11. 2.08 * Version: 11.3.0 9 9 * Author URI: https://pitchprint.com 10 10 * Requires at least: 3.8 … … 47 47 * @var string 48 48 */ 49 public $version = '11. 2.0';49 public $version = '11.3.0'; 50 50 51 51 /** -
pitchprint/trunk/readme.txt
r3479889 r3488708 4 4 Requires at least: 3.8 5 5 Tested up to: 6.8 6 Stable tag: 11. 2.06 Stable tag: 11.3.0 7 7 License: GPLv2 or later 8 8 License URI: http://www.gnu.org/licenses/gpl-2.0.html … … 172 172 173 173 == Changelog == 174 175 == 11.3.0 = 176 Improved user identification for customization data isolation 177 Improved session handling reliability 178 Replaced deprecated wc_enqueue_js with wp_add_inline_script 174 179 175 180 == 11.2.0 =
Note: See TracChangeset
for help on using the changeset viewer.