0ž5 EfutA(Þ5 =\ w5 Ğ5 9.{C8~5Ş5 Me@~5ƞ5 [Yhnua5Ǟ5 @ua5Ȟ5 g[Y}pua5Ȟ5 ,Yj+ua5ɞ5 BD#|va5ʞ5 t5˞5 㴐va5ў5 ߢ>bczAҞ5 DKIVAӞ5 P^a~ta5מ5 =:AHȺra5ڞ5 ՝0wԭA۞5 / @xa5ݞ5 eyQ1Y`5X5 1va5P5 &t3{a5`T5** E((B55*5a5a5@5@V5+@5`sa5++a5a5@85++Pa5+ha5+5xa5شa5@`5++a5+a5   5 =\ za55 EfutA5 g[Y} za55 [Yhn`ya5֞5 ߢ>bczAמ5 =:AHȺra5ڞ5 ՝0wԭA۞5 / @xa5ܞ5 DKIVAݞ5 eyQ1Y`5p5 t0`5h5 9.{Ch`5`5 Me@`5X5 1va5P5 &t3{a5a5=Ha5ȷa5@ټ5??a5@pra5?@5ઓ5?@5XxA??Xa5?U@a5pa5a5U@5hѼ5??a58a5a58a5@: 55??a5?a5? a5a5@U`5??ha5?a5(a5ȸa5E<@P`5l`5ra5жa5a5fUP? gU `@_fU  gU R hU0plgUPtfU< gU@R hUXplgUPtlgU`tlgUptPfU<_fUh gUR hUpkUPPBfU<0jUp@'jUpgU@+fU>@jUppkU`PBPfU <fU>A0{A{A@AAA8A`AHѥAHѥA5A5A0{A{AxAozAozA`5`5a5ka5a5kȾa5Efl!fUP?pvjUPQnhUgU@+_fU gUR hU0pkUPPBat of the billing and shipping addresses.', 'woocommerce-pdf-invoices-packing-slips' ), 'extensions' => array( 'pro', 'bundle' ), ), array( 'label' => __( 'Order notification email', 'woocommerce-pdf-invoices-packing-slips' ), 'description' => sprintf( '%s %s', __( 'Send a notification email to user specified addresses.', 'woocommerce-pdf-invoices-packing-slips' ), 'https://docs.wpovernight.com/woocommerce-pdf-invoices-packing-slips/configuring-the-order-notification-email/', __( 'Learn more', 'woocommerce-pdf-invoices-packing-slips' ) ), 'extensions' => array( 'pro', 'bundle' ), ), array( 'label' => __( 'PDF Customizer', 'woocommerce-pdf-invoices-packing-slips' ), 'description' => sprintf( '%s %s', __( 'Fully customize the product table and totals table on your documents.', 'woocommerce-pdf-invoices-packing-slips' ), 'https://docs.wpovernight.com/woocommerce-pdf-invoices-packing-slips/using-the-customizer/', __( 'Learn more', 'woocommerce-pdf-invoices-packing-slips' ) ), 'extensions' => array( 'templates', 'bundle' ), ), array( 'label' => __( 'Add custom data to your documents', 'woocommerce-pdf-invoices-packing-slips' ), 'description' => sprintf( '%s %s', __( 'Display all sorts of data and apply conditional logic using Custom Blocks.', 'woocommerce-pdf-invoices-packing-slips' ), 'https://docs.wpovernight.com/woocommerce-pdf-invoices-packing-slips/using-custom-blocks/', __( 'Learn more', 'woocommerce-pdf-invoices-packing-slips' ) ), 'extensions' => array( 'templates', 'bundle' ), ), array( 'label' => __( 'Additional PDF templates', 'woocommerce-pdf-invoices-packing-slips' ), 'description' => __( 'Make use of our Business or Modern template designs.', 'woocommerce-pdf-invoices-packing-slips' ), 'extensions' => array( 'templates', 'bundle' ), ), array( 'label' => __( 'Add styling', 'woocommerce-pdf-invoices-packing-slips' ), 'description' => __( 'Easily change the look and feel of your documents by adding some custom CSS.', 'woocommerce-pdf-invoices-packing-slips' ), 'extensions' => array( 'templates', 'bundle' ), ), ); $extension_license_infos = $this->get_extension_license_infos( true ); $plugin_recommendations = array( array( 'plugin_path' => 'wc-reminder-emails/wc-reminder-emails.php', 'thumbnail' => WPO_WCPDF()->plugin_url().'/assets/images/wc-reminder-emails-thumbnail-400x400.jpg', 'title' => __( 'WooCommerce Smart Reminder Emails', 'woocommerce-pdf-invoices-packing-slips' ), 'description' => __( 'Automatically schedule and send Reminder Emails for WooCommerce orders.', 'woocommerce-pdf-invoices-packing-slips' ), 'url' => 'https://wpovernight.com/downloads/woocommerce-reminder-emails-payment-reminders?utm_medium=plugin&utm_source=ips&utm_campaign=upgrade-tab&content=reminder-emails-cross' ), array( 'plugin_path' => 'woocommerce-address-labels/woocommerce-address-labels.php', 'thumbnail' => WPO_WCPDF()->plugin_url().'/assets/images/woocommerce-address-labels-thumbnail-400x400.jpg', 'title' => __( 'WooCommerce Print Address Labels', 'woocommerce-pdf-invoices-packing-slips' ), 'description' => __( 'Print out address labels for selected orders straight from WooCommerce.', 'woocommerce-pdf-invoices-packing-slips' ), 'url' => 'https://wpovernight.com/downloads/woocommerce-print-address-labels?utm_medium=plugin&utm_source=ips&utm_campaign=upgrade-tab&content=address-labels-cross' ), array( 'plugin_path' => 'woocommerce-printnode/print-orders.php', 'thumbnail' => WPO_WCPDF()->plugin_url().'/assets/images/woocommerce-printnode-thumbnail-400x400.jpg', 'title' => __( 'WooCommerce Automatic Printing - PrintNode', 'woocommerce-pdf-invoices-packing-slips' ), 'description' => __( 'A plugin to automatically print completed orders via PrintNode.', 'woocommerce-pdf-invoices-packing-slips' ), 'url' => 'https://wpovernight.com/downloads/woocommerce-automatic-order-printing-printnode?utm_medium=plugin&utm_source=ips&utm_campaign=upgrade-tab&content=order-printing-cross' ), array( 'plugin_path' => 'woocommerce-ultimate-barcodes/woocommerce-ultimate-barcodes.php', 'thumbnail' => WPO_WCPDF()->plugin_url().'/assets/images/woocommerce-ultimate-barcodes-thumbnail-400x400.jpg', 'title' => __( 'WooCommerce Ultimate Barcodes', 'woocommerce-pdf-invoices-packing-slips' ), 'description' => __( 'Generate barcodes (ZATCA, QR-codes, C128, EAN-13 and more) for your orders, products and even invoices & packing slips.', 'woocommerce-pdf-invoices-packing-slips' ), 'url' => 'https://wpovernight.com/downloads/woocommerce-ultimate-barcodes?utm_medium=plugin&utm_source=ips&utm_campaign=upgrade-tab&content=ultimate-barcodes-cross' ), array( 'plugin_path' => 'woocommerce-order-list/woocommerce-order-list.php', 'thumbnail' => WPO_WCPDF()->plugin_url().'/assets/images/woocommerce-order-list-thumbnail-400x400.jpg', 'title' => __( 'WooCommerce Print Order List', 'woocommerce-pdf-invoices-packing-slips' ), 'description' => __( 'This plugin lets you quickly print a list of your WooCommerce orders. Great for order picking.', 'woocommerce-pdf-invoices-packing-slips' ), 'url' => 'https://wpovernight.com/downloads/woocommerce-print-order-list?utm_medium=plugin&utm_source=ips&utm_campaign=upgrade-tab&content=order-list-cross' ), array( 'plugin_path' => 'wp-menu-cart-pro/wp-menu-cart-pro.php', 'thumbnail' => WPO_WCPDF()->plugin_url().'/assets/images/wp-menu-cart-pro-thumbnail-400x400.jpg', 'title' => __( 'Menu Cart Pro', 'woocommerce-pdf-invoices-packing-slips' ), 'description' => __( 'Integrates seamlessly with WooCommerce to add a shopping cart to your menu.', 'woocommerce-pdf-invoices-packing-slips' ), 'url' => 'https://wpovernight.com/downloads/menu-cart-pro?utm_medium=plugin&utm_source=ips&utm_campaign=upgrade-tab&content=menu-cart-pro-cross' ), ); // Sort recommendations based on if the plugin is installed $installed_plugins = get_plugins(); $sorted_plugin_recommendations = array(); foreach ( array_reverse( $plugin_recommendations ) as $plugin ) { if ( isset( $installed_plugins[ $plugin['plugin_path'] ] ) ) { $plugin['installed'] = true; $sorted_plugin_recommendations[] = $plugin; } else { array_unshift( $sorted_plugin_recommendations, $plugin ); } } include( WPO_WCPDF()->plugin_path() . '/views/upgrade-table.php' ); } } /** * Check if a PDF extension is enabled * * @param string $extension can be 'pro' or 'templates' * @return boolean */ public function extension_is_enabled( $extension ) { $is_enabled = false; if ( ! empty( $extension ) || ! in_array( $extension, $this->extensions ) ) { $extension_main_function = "WPO_WCPDF_".ucfirst( $extension ); if ( function_exists( $extension_main_function ) ) { $is_enabled = true; } } return $is_enabled; } /** * Get PDF extensions license info * * @param bool $ignore_cache * @return array */ public function get_extension_license_infos( $ignore_cache = false ) { $extensions = $this->extensions; $license_info = ! $ignore_cache ? $this->get_extensions_license_data( 'cached' ) : array(); if ( ! empty( $license_info ) ) { return $license_info; } foreach ( $extensions as $extension ) { $license_info[ $extension ] = array(); $args = array(); $request = null; $license_key = ''; $updater = null; if ( $this->extension_is_enabled( $extension ) ) { $extension_main_function = "WPO_WCPDF_" . ucfirst( $extension ); $updater = $extension_main_function()->updater; if ( 'templates' === $extension && version_compare( $extension_main_function()->version, '2.20.0', '<=' ) ) { // 'updater' property had 'private' visibility continue; } if ( is_null( $updater ) ) { continue; } // built-in updater if ( is_callable( array( $updater, 'get_license_key' ) ) ) { $license_key = $updater->get_license_key(); } if ( ! empty( $license_key ) ) { $args['edd_action'] = 'check_license'; $args['license_key'] = $license_info[ $extension ]['license_key'] = trim( $license_key ); } else { continue; } if ( $updater && is_callable( array( $updater, 'remote_license_actions' ) ) && ! empty( $args ) ) { $request = $updater->remote_license_actions( $args ); if ( is_wp_error( $request ) ) { wcpdf_log_error( 'Unable to retrieve license data from the remote server for the extension ' . $extension . '. Error: ' . $response->get_error_message() ); continue; } $license_info[ $extension ]['status'] = isset( $request->license ) ? $request->license : 'inactive'; $license_info[ $extension ]['license_limit'] = isset( $request->license_limit ) ? $request->license_limit : 1; $license_info[ $extension ]['license_id'] = isset( $request->license_id ) ? absint( $request->license_id ) : null; $license_info[ $extension ]['bundle_license'] = isset( $request->bundle_license ) ? $request->bundle_license : false; } } } $extensions[] = 'bundle'; $default_utm_tags = 'utm_medium=plugin&utm_source=ips&utm_campaign=upgrade-tab'; $bundle_upgrade_url = ''; $upgrade_tiers = array( // license limit => upgrade ID 'pro' => array( 1 => 3, 3 => 4, 25 => 5, ), 'templates' => array( 1 => 4, 3 => 5, 25 => 6, ), ); foreach ( $extensions as $extension ) { // set default URL switch ( $extension ) { case 'pro': $pro_utm_tags = $default_utm_tags . '&utm_content=ips-pro-upgrade'; $license_info[ $extension ]['url'] = "https://wpovernight.com/downloads/woocommerce-pdf-invoices-packing-slips-professional/?{$pro_utm_tags}"; break; case 'templates': case 'bundle': $bundle_utm_tags = $default_utm_tags . '&utm_content=ips-plus-bundle-upgrade'; $license_info[ $extension ]['url'] = "https://wpovernight.com/downloads/woocommerce-pdf-invoices-packing-slips-bundle/?{$bundle_utm_tags}"; break; } // if bundle, no upgrade needed if ( isset( $license_info[ $extension ]['bundle_license'] ) && $license_info[ $extension ]['bundle_license'] ) { continue; } // there's no license ID, can't be upgraded if ( empty( $license_info[ $extension ]['license_id'] ) ) { continue; } // check if the license is activated and valid if ( empty( $license_info[ $extension ]['status'] ) || 'valid' !== $license_info[ $extension ]['status'] ) { continue; } // if bundle upgrade URL is already set, skip if ( ! empty( $bundle_upgrade_url ) ) { continue; } // create upgrade URL $license_id = $license_info[ $extension ]['license_id']; $license_limit = $license_info[ $extension ]['license_limit']; $upgrade_id = isset( $upgrade_tiers[ $extension ][ $license_limit ] ) ? $upgrade_tiers[ $extension ][ $license_limit ] : 0; if ( 0 === $upgrade_id ) { continue; } $upgrade_utm_tags = $default_utm_tags . '&utm_content=ips-plus-bundle-upgrade+upgrade-from-' . $extension; $bundle_upgrade_url = "https://wpovernight.com/checkout/?edd_action=sl_license_upgrade&license_id={$license_id}&upgrade_id={$upgrade_id}&{$upgrade_utm_tags}"; } // set bundle upgrade URL if ( ! empty( $bundle_upgrade_url ) ) { $license_info['bundle']['url'] = $bundle_upgrade_url; } update_option( 'wpo_wcpdf_extensions_license_cache', $license_info ); if ( ! function_exists( '\\as_next_scheduled_action' ) || ! function_exists( '\\as_unschedule_action' ) || ! function_exists( '\\as_schedule_single_action' ) ) { wcpdf_log_error( 'Action Scheduler functions not available. Cannot schedule or clear the extensions license cache.', 'critical' ); return $license_info; } if ( \as_next_scheduled_action( 'wpo_wcpdf_schedule_extensions_license_cache_clearing' ) ) { \as_unschedule_action( 'wpo_wcpdf_schedule_extensions_license_cache_clearing' ); } \as_schedule_single_action( strtotime( "+1 week" ), 'wpo_wcpdf_schedule_extensions_license_cache_clearing' ); return $license_info; } /** * Clear extensions license cache * * @return void */ public function clear_extensions_license_cache() { delete_option( 'wpo_wcpdf_extensions_license_cache' ); } /** * Get extensions license data * * @param string $type can be 'cached' or 'live' * @return array */ public function get_extensions_license_data( string $type = 'cached' ): array { $option_key = 'wpo_wcpdf_extensions_license_cache'; // default to fetching cached data $data = get_option( $option_key, array() ); // if type is 'live' or cached data is empty, fetch live data if ( 'live' === $type || empty( $data ) ) { $data = $this->get_extension_license_infos( true ); if ( 'cached' === $type ) { update_option( $option_key, $data ); } } return $data; } /** * Check if are any extensions installed * * @return bool */ public function are_any_extensions_installed() { $installed = false; foreach ( $this->extensions as $extension ) { if ( $this->extension_is_enabled( $extension ) ) { $installed = true; break; } } return $installed; } } endif; // class_exists ,c2Kg+'3!.*lsNZ,y8m)N7zbk()+}nryM!aDP1b`k`?\CzX׼)xNONXE@g,vsM{J'ql(g)`Cb ;]pnzse߶gFJu7%}a*m`ux@ L`G<K %Lb\~@aH^l,2k7 nDdP!C,+ܫxḤ>#a6 ,D&A?{Y8n0f pCR/r~vIjIhlN@^S]-odYWLT ryض>"4p@ҜG<7 ]j"v$YkLg\9[,`-Ig7xeZ(L^`jc4/{_M@'sx 8U ïZ|sm]̺פќKdSPǾZU jȋo,wi$PgAxn5ZݮxĚ0Fi `Q[ NJnPִ?ב-0qDTS>^8<7 ?^:ꖫoR#kP4Y'eVx^8mt]8CyIWe%y`q2S 9A9EcM#AApȘS;ֹ=d?%*p4Q{[>3EL|yGXB%ۈ&K+zKh^}`^$}T9Bˎ2z wEg>B` )TWhYX,;.pT1?!a U^ 5o^xPEn.Oo1{H^~ݨ. ,]Vi4YNܒ+Is=mš͊BDך%]e4׹v:ک.?^Am p=W'񉓫X3OAݧ)O)Cĝ` %lm{A(njMx <( n` ֛j!oϽY`.(vӊŕ1 Qa3jƭ.y<̹RnixMu9v luƫr:X>m`:VM9AѸ5P/X/ `echo p+%ֶmtG RVemr -+:bS`ė^42I#jz̿si n@S>2Qg;TBQ_>HHieA(LI8ҿHJw:=X$T"3jrwnKM(9.($V9Ŵ|2?!u# ՚G NwarvX Gf F{>^r U$=RM@=mUEl6o۰!tö\UwVaRr k|MK TܣA7)XdK;^:d"VPMNq@CvcHzЈ fDC)[Kyz'B [afˆ S9BFf\s^kE6 ғ:ՙŋJGaR1~ŘFW]