f6#e|4default_option_wgm_add_on_woocommerce_eu_vatin_checkory[-pre_option_wgm_add_on_woocommerce_invoice_pdfrder.Manut.D)option_wgm_add_on_woocommerce_invoice_pdfally updatedMim"HT1pre_option_wgm_add_on_woocommerce_eu_vat_checkoutin bet5default_option_wgm_add_on_woocommerce_eu_vat_checkouton*wgm_add_on_woocommerce_return_delivery_pdfd the followilu/t5pre_option_wgm_add_on_woocommerce_return_delivery_pdfntܑ(pre_option_wgm_add_on_online_buchhaltungftionsntMark  ' O,default_option_wgm_add_on_online_buchhaltung completed qҹ3pre_option_woocommerce_de_manual_order_confirmationterfLgs5pre_option_wp_wc_invoice_pdf_header_number_of_columnserFU(1option_wp_wc_invoice_pdf_header_number_of_columnsommercB:5pre_option_wp_wc_invoice_pdf_footer_number_of_columnsteP1option_wp_wc_invoice_pdf_footer_number_of_columnsevDesk''51000000006ef59341000000004d1c64a6divi_page_builderp.brau -7default_option_woocommerce_de_manual_order_confirmationf+pre_option_woocommerce_de_show_ppu_checkout * @var WGM_3=13Woocommerce_German_Market::enqueue_frontend_scriptsof tO:l(WGM_Template::add_virtual_product_notice found.No sett̎7WGM_Template::woocommerce_de_price_with_tax_hint_singleKM505WGM_Template::woocommerce_de_price_with_tax_hint_loop s"Zܮ.WGM_Template::add_digital_product_prerequisits the plug=ώy,WGM_Template::add_product_summary_price_parts just oncePd>7,WGM_Template::init_grouped_product_adaptionsNormalNot q Gv5pre_option_woocommerce_de_show_delivery_time_checkoutinkqз11option_woocommerce_de_show_delivery_time_checkout the cL~@+default_option_gm_deactivate_checkout_hooksfter the cus1Xld(pre_option_woocommerce_de_secondcheckout"Tax-exempt expTC,default_option_woocommerce_de_secondcheckoutd on any ph!ߘX(5option_gm_order_review_checkboxes_before_order_reviewr A υ-pre_option_gm_order_review_checkboxes_logging_reviewonh)option_gm_order_review_checkboxes_loggingns in the headԉ@w-WGM_Fee::cart_totals_get_fees_from_cart_taxesptionNumbhSӁ5WGM_Template::woocommerce_cart_totals_excl_tax_stringriP/*WGM_Template::add_mwst_rate_to_cart_totalsOn HoldOn yoriB/WGM_Template::remove_mwst_rate_from_cart_totalseld valuP/*WGM_Template::add_mwst_rate_to_cart_totalsa placeholderriB/WGM_Template::remove_mwst_rate_from_cart_totals placehojf!7WGM_Template::pay_order_validation_of_revocation_policy)0WGM_Template::add_mwst_rate_to_product_item_initt 1 comhh%-/WGM_Template::remove_login_from_second_checkoutOnly proལ6WGM_Template::add_product_short_desc_to_checkout_titleUa,ā3,WGM_Template::my_account_registration_fieldsnly show laG;fW7option_gm_checkbox_5_my_account_registration_activation]+WGM_Template::product_review_privacy_policyntactOpen t'y ~6WGM_Template::product_review_privacy_policy_validationlR 2WP_WC_Invoice_Pdf_Email_Attachment::add_attachment } . 4WP_WC_Invoice_Pdf_Email_Attachment::refunded_triggerco. 4WP_WC_Invoice_Pdf_Email_Attachment::refunded_triggerOp;C3WP_WC_Invoice_Pdf_View_Order_Download::download_pdfn Te6fG\_Pp7option_woocommerce_de_sevdesk_automatic_completed_orderber - {{or * Usage: * ->get_filtered( $this->addons, [ 'category' => 'payments' ] ) - addons for the payments panel. * ->get_filtered( $this->addons, [ 'license' => 'elite' ] ) - addons available for 'elite' license. * * @since 1.6.6 * * @param array $addons Raw addons data. * @param array $args Arguments array. * * @return array Addons data filtered according to given arguments. */ private function get_filtered( array $addons, array $args ) { if ( empty( $addons ) ) { return []; } $default_args = [ 'category' => '', 'license' => '', ]; $args = wp_parse_args( $args, $default_args ); $filtered_addons = []; foreach ( $addons as $addon ) { foreach ( [ 'category', 'license' ] as $arg_key ) { if ( ! empty( $args[ $arg_key ] ) && ! empty( $addon[ $arg_key ] ) && is_array( $addon[ $arg_key ] ) && in_array( strtolower( $args[ $arg_key ] ), $addon[ $arg_key ], true ) ) { $filtered_addons[] = $addon; } } } return $filtered_addons; } /** * Get available addons data by category. * * @since 1.6.6 * * @param string $category Addon category. * * @return array. */ public function get_by_category( string $category ) { return $this->get_filtered( $this->get_available(), [ 'category' => $category ] ); } /** * Get available addons data by license. * * @since 1.6.6 * * @param string $license Addon license. * * @return array. * @noinspection PhpUnused */ public function get_by_license( string $license ) { return $this->get_filtered( $this->get_available(), [ 'license' => $license ] ); } /** * Get available addons data by slugs. * * @since 1.6.8 * * @param array|mixed $slugs Addon slugs. * * @return array */ public function get_by_slugs( $slugs ) { if ( empty( $slugs ) || ! is_array( $slugs ) ) { return []; } $result_addons = []; foreach ( $slugs as $slug ) { $addon = $this->get_addon( $slug ); if ( ! empty( $addon ) ) { $result_addons[] = $addon; } } return $result_addons; } /** * Get available addon data by slug. * * @since 1.6.6 * * @param string|bool $slug Addon slug can be both "wpforms-drip" and "drip". * * @return array Single addon data. Empty array if addon is not found. */ public function get_addon( $slug ) { $slug = (string) $slug; $slug = 'wpforms-' . str_replace( 'wpforms-', '', sanitize_key( $slug ) ); $addon = $this->get_available()[ $slug ] ?? []; // In case if addon is "not available" let's try to get and prepare addon data from all addons. if ( empty( $addon ) ) { $addon = ! empty( $this->addons[ $slug ] ) ? $this->prepare_addon_data( $this->addons[ $slug ] ) : []; } return $addon; } /** * Check if addon is active. * * @since 1.8.9 * * @param string $slug Addon slug. * * @return bool */ public function is_active( string $slug ): bool { $addon = $this->get_addon( $slug ); return isset( $addon['status'] ) && $addon['status'] === 'active'; } /** * Get license level of the addon. * * @since 1.6.6 * * @param array|string $addon Addon data array OR addon slug. * * @return string License level: pro | elite. */ private function get_license_level( $addon ) { if ( empty( $addon ) ) { return ''; } $levels = [ self::BASIC, self::PLUS, self::PRO, self::ELITE, self::AGENCY, self::ULTIMATE ]; $license = ''; $addon_license = $this->get_addon_license( $addon ); foreach ( $levels as $level ) { if ( in_array( $level, $addon_license, true ) ) { $license = $level; break; } } if ( empty( $license ) ) { return ''; } return in_array( $license, [ self::BASIC, self::PLUS, self::PRO ], true ) ? self::PRO : self::ELITE; } /** * Get addon license. * * @since 1.8.2 * * @param array|string $addon Addon data array OR addon slug. * * @return array */ private function get_addon_license( $addon ) { $addon = is_string( $addon ) ? $this->get_addon( $addon ) : $addon; return $this->default_data( $addon, 'license', [] ); } /** * Determine if a user's license level has access. * * @since 1.6.6 * * @param array|string $addon Addon data array OR addon slug. * * @return bool */ protected function has_access( $addon ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.Found return false; } /** * Return array of addons available to display. All data is prepared and normalized. * "Available to display" means that addon needs to be displayed as an education item (addon is not installed or not activated). * * @since 1.6.6 * * @return array */ public function get_available() { static $available_addons = []; if ( $available_addons ) { return $available_addons; } if ( empty( $this->addons ) || ! is_array( $this->addons ) ) { return []; } $available_addons = array_map( [ $this, 'prepare_addon_data' ], $this->addons ); $available_addons = array_filter( $available_addons, static function ( $addon ) { return isset( $addon['status'], $addon['plugin_allow'] ) && ( $addon['status'] !== 'active' || ! $addon['plugin_allow'] ); } ); return $available_addons; } /** * Prepare addon data. * * @since 1.6.6 * * @param array|mixed $addon Addon data. * * @return array Extended addon data. */ protected function prepare_addon_data( $addon ) { if ( empty( $addon ) ) { return []; } $addon['title'] = $this->default_data( $addon, 'title', '' ); $addon['slug'] = $this->default_data( $addon, 'slug', '' ); // We need the cleared name of the addon, without the 'addon' suffix, for further use. $addon['name'] = preg_replace( '/ addon$/i', '', $addon['title'] ); $addon['modal_name'] = sprintf( /* translators: %s - addon name. */ esc_html__( '%s addon', 'wpforms-lite' ), $addon['name'] ); $addon['clear_slug'] = str_replace( 'wpforms-', '', $addon['slug'] ); $addon['utm_content'] = ucwords( str_replace( '-', ' ', $addon['clear_slug'] ) ); $addon['license'] = $this->default_data( $addon, 'license', [] ); $addon['license_level'] = $this->get_license_level( $addon ); $addon['icon'] = $this->default_data( $addon, 'icon', '' ); $addon['path'] = sprintf( '%1$s/%1$s.php', $addon['slug'] ); $addon['video'] = $this->default_data( $addon, 'video', '' ); $addon['plugin_allow'] = $this->has_access( $addon ); $addon['status'] = 'missing'; $addon['action'] = 'upgrade'; $addon['page_url'] = $this->default_data( $addon, 'url', '' ); $addon['doc_url'] = $this->default_data( $addon, 'doc', '' ); $addon['url'] = ''; static $nonce = ''; $nonce = empty( $nonce ) ? wp_create_nonce( 'wpforms-admin' ) : $nonce; $addon['nonce'] = $nonce; return $addon; } /** * Get default data. * * @since 1.8.2 * * @param array|mixed $addon Addon data. * @param string $key Key. * @param mixed $default_data Default data. * * @return array|string|mixed */ private function default_data( $addon, string $key, $default_data ) { if ( is_string( $default_data ) ) { return ! empty( $addon[ $key ] ) ? $addon[ $key ] : $default_data; } if ( is_array( $default_data ) ) { return ! empty( $addon[ $key ] ) ? (array) $addon[ $key ] : $default_data; } return $addon[ $key ] ?? ''; } /** * Populate addons data. * * @since 1.9.2 * * @return void */ private function populate_addons_data() { foreach ( $this->addons as $addon ) { $this->addons_text_domains[] = $addon['slug']; $this->addons_titles[] = 'WPForms ' . str_replace( ' Addon', '', $addon['title'] ); } } /** * Filter Gettext. * * This filter allows us to prevent empty translations from being returned * on the `plugins` page for addon name and description. * * @since 1.9.2 * * @param string|mixed $translation Translated text. * @param string|mixed $text Text to translate. * @param string|mixed $domain Text domain. * * @return string Translated text. */ public function filter_gettext( $translation, $text, $domain ): string { $translation = (string) $translation; $text = (string) $text; $domain = (string) $domain; if ( ! in_array( $domain, $this->addons_text_domains, true ) ) { return $translation; } // Prevent empty translations from being returned and don't translate addon names. if ( ! trim( $translation ) || in_array( $text, $this->addons_titles, true ) ) { $translation = $text; } return $translation; } }