ÿþ<?php /** * Functions and definitions * * @link https://developer.wordpress.org/themes/basics/theme-functions/ * * @package Ecomus */ require_once get_template_directory() . '/inc/theme.php'; \Ecomus\Theme::instance()->init(); /** * DIALKA: Nativní doprava zdarma - DoplHkové funkce * 1. Skrytí dobírky pro dopravu zdarma * 2. Motiva ní liata (CZ / SK) - PO ÍTÁ V ETN DPH * 3. Zobrazení textu "Zdarma" napravo (místo ceny) * 4. PXEPSÁNÍ GLS TLA ÍTEK: Výchozí skryta, chytrá (jen pYi zakliknutí) zapnuta v~dy */ // --- POMOCNÁ FUNKCE: NASTAVENÍ PODLE MNY --- function dialka_ziskat_nastaveni_dopravy() { $currency = get_woocommerce_currency(); if ( $currency === 'CZK' ) { return array( 'limit' => 1000, 'text_zbyva' => 'Nakupte jeat za <span style="color: #e53935; font-size: 1.2em; font-weight: 700;">%s</span> a máte <span style="color: #4caf50;">dopravu na výdejní místa zdarma</span>!', 'text_uspech' => '<؉ß Skvlé! Nyní máte dopravu do GLS boxo a výdejen zcela zdarma.', 'text_zdarma' => 'Zdarma' ); } elseif ( $currency === 'EUR' ) { return array( 'limit' => 50, 'text_zbyva' => 'Nakúpte eate za <span style="color: #e53935; font-size: 1.2em; font-weight: 700;">%s</span> a máte <span style="color: #4caf50;">dopravu na výdajné miesta zadarmo</span>!', 'text_uspech' => '<؉ß Skvelé! Teraz máte dopravu do GLS boxov a výdajní úplne zadarmo.', 'text_zdarma' => 'Zadarmo' ); } return false; } // --- 1. SKRYTÍ DOBÍRKY (POKUD JE ZVOLENO GLS) --- add_filter( 'woocommerce_available_payment_gateways', 'dialka_skryt_dobirku_nativni', 10, 1 ); function dialka_skryt_dobirku_nativni( $available_gateways ) { if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return $available_gateways; if ( ! WC()->cart || ! WC()->session ) return $available_gateways; $nastaveni = dialka_ziskat_nastaveni_dopravy(); if ( ! $nastaveni ) return $available_gateways; $cart_total = WC()->cart->get_cart_contents_total() + WC()->cart->get_cart_contents_tax(); if ( $cart_total >= $nastaveni['limit'] ) { $chosen_methods = WC()->session->get( 'chosen_shipping_methods' ); if ( ! empty( $chosen_methods ) ) { if ( strpos( $chosen_methods[0], 'gls_shipping_method_parcel' ) !== false ) { if ( isset( $available_gateways['cod'] ) ) { unset( $available_gateways['cod'] ); } } } } return $available_gateways; } // --- 2. MOTIVA NÍ LI`TA A CSS STYLY --- function dialka_lista_html_nativni() { if ( ! WC()->cart ) return ''; $nastaveni = dialka_ziskat_nastaveni_dopravy(); if ( ! $nastaveni ) return ''; $limit = $nastaveni['limit']; $current = WC()->cart->get_cart_contents_total() + WC()->cart->get_cart_contents_tax(); $remaining = $limit - $current; if ( $remaining < 0 ) { $remaining = 0; } $percentage = min( ( $current / $limit ) * 100, 100 ); ob_start(); ?> <div id="dialka-free-shipping-wrapper"> <div class="dialka-free-shipping-bar" style="margin-bottom: 20px; padding: 15px; background: #fff; border-radius: 8px; border: 2px solid #f0f0f0; box-shadow: 0 2px 8px rgba(0,0,0,0.03);"> <?php if ( $current < $limit ) : ?> <div style="font-weight: 600; text-align: center; margin-bottom: 12px; font-size: 16px; font-family: sans-serif;"> <?php echo sprintf( $nastaveni['text_zbyva'], wc_price( $remaining ) ); ?> </div> <?php else : ?> <div style="font-weight: 600; text-align: center; margin-bottom: 12px; color: #4caf50; font-size: 16px; font-family: sans-serif;"> <?php echo $nastaveni['text_uspech']; ?> </div> <!-- CSS: Posunutí textu "Zdarma" na pravou stranu k cenám --> <style> label[for*="gls_shipping_method_parcel"] .shipping-method__option-label-wrapper { display: flex !important; justify-content: space-between !important; align-items: center !important; width: 100% !important; } label[for*="gls_shipping_method_parcel"] .shipping-method__option-label-wrapper::after { content: "<?php echo esc_html( $nastaveni['text_zdarma'] ); ?>"; color: #4caf50; font-weight: 700; font-size: 15px; margin-left: auto; padding-left: 10px; white-space: nowrap; } </style> <?php endif; ?> <div style="width: 100%; background-color: #f0f0f0; border-radius: 10px; overflow: hidden; height: 10px;"> <div style="width: <?php echo esc_attr( $percentage ); ?>%; background-color: #4caf50; height: 100%; transition: width 0.5s ease-in-out;"></div> </div> </div> <!-- CSS: Globální skrytí starých GLS tla ítek a zobrazení pouze tch naaich --> <style> /* Zlikviduje vaechna tla ítka, která se pokusí vypsat plugin GLS sám */ button#gls-map-button { display: none !important; } /* Zobrazí pouze ta, která generujeme my (pYes speciální tYídu divu) */ .dialka-vlastni-gls-tlacitko button#gls-map-button { display: block !important; margin-top: 5px; } </style> </div> <?php return ob_get_clean(); } add_action( 'woocommerce_checkout_before_order_review', 'dialka_vlozit_listu_nativni' ); add_action( 'woocommerce_before_cart', 'dialka_vlozit_listu_nativni' ); function dialka_vlozit_listu_nativni() { echo dialka_lista_html_nativni(); } add_filter( 'woocommerce_add_to_cart_fragments', 'dialka_lista_fragment_nativni' ); add_filter( 'woocommerce_update_order_review_fragments', 'dialka_lista_fragment_nativni' ); function dialka_lista_fragment_nativni( $fragments ) { $fragments['#dialka-free-shipping-wrapper'] = dialka_lista_html_nativni(); return $fragments; } // --- 3. VLO}ENÍ TLA ÍTKA GLS (V}DY, ALE POUZE PRO AKTIVNÍ VOLBU) --- add_action( 'woocommerce_after_shipping_rate', 'dialka_obnova_gls_po_sazbe', 10, 2 ); function dialka_obnova_gls_po_sazbe( $method, $index ) { // Odstranna kontrola ceny! Spustí se u V`ECH GLS boxo/výdejen bez ohledu na to, zda jsou placené i zdarma. if ( strpos( $method->id, 'gls_shipping_method_parcel' ) !== false ) { // Zjistíme, jaká doprava je aktuáln v koaíku zakliknutá $chosen_methods = WC()->session->get( 'chosen_shipping_methods' ); $is_chosen = ( is_array( $chosen_methods ) && in_array( $method->id, $chosen_methods ) ); // Vykreslíme NA`E tla ítko POUZE tehdy, pokud má tuto konkrétní dopravu zákazník zaakrtnutou if ( $is_chosen ) { echo '<div class="dialka-vlastni-gls-tlacitko" style="margin-top: 10px; padding-left: 28px;">'; if ( strpos( $method->id, 'locker' ) !== false ) { echo '<button type="button" id="gls-map-button" class="dugme-gls_shipping_method_parcel_locker">Vyberte výdejní automat</button>'; } else { echo '<button type="button" id="gls-map-button" class="dugme-gls_shipping_method_parcel_shop">Vyberte výdejní místo</button>'; } echo '</div>'; } } } // ===================================================================== // NÍ}E JE TVnJ NEDOT ENÝ KÓD (BRANDS A EMAILY) // ===================================================================== // 1. PYidání pole pro obrázek pYi VYTVAXENÍ nové zna ky (brand) add_action( 'product_brand_add_form_fields', 'dialka_add_product_brand_image' ); function dialka_add_product_brand_image() { ?> <div class="form-field term-image-wrap"> <label for="brand_header_image"><?php _e( 'Obrázek hlavi ky', 'woocommerce' ); ?></label> <input type="hidden" id="brand_header_image" name="brand_header_image" value="" /> <div id="brand_image_preview" style="margin: 10px 0;"></div> <button type="button" class="button upload_brand_image_btn">Vybrat z knihovny médií</button> <button type="button" class="button remove_brand_image_btn" style="display:none;">Odstranit obrázek</button> </div> <?php } // 2. PYidání pole pro obrázek pYi EDITACI existující zna ky (brand) add_action( 'product_brand_edit_form_fields', 'dialka_edit_product_brand_image', 10, 2 ); function dialka_edit_product_brand_image( $term ) { $image_url = get_term_meta( $term->term_id, 'brand_header_image', true ); ?> <tr class="form-field term-image-wrap"> <th scope="row"><label for="brand_header_image"><?php _e( 'Obrázek hlavi ky', 'woocommerce' ); ?></label></th> <td> <input type="hidden" id="brand_header_image" name="brand_header_image" value="<?php echo esc_attr( $image_url ); ?>" /> <div id="brand_image_preview" style="margin: 10px 0;"> <?php if ( $image_url ) : ?> <img src="<?php echo esc_url( $image_url ); ?>" style="max-width: 150px; height: auto; border: 1px solid #ccc; padding: 5px;" /> <?php endif; ?> </div> <button type="button" class="button upload_brand_image_btn">Vybrat z knihovny médií</button> <button type="button" class="button remove_brand_image_btn" style="<?php echo ( $image_url ) ? '' : 'display:none;'; ?>">Odstranit obrázek</button> </td> </tr> <?php } // 3. Ulo~ení URL obrázku do databáze (term meta) add_action( 'created_product_brand', 'dialka_save_product_brand_image' ); add_action( 'edited_product_brand', 'dialka_save_product_brand_image' ); function dialka_save_product_brand_image( $term_id ) { if ( isset( $_POST['brand_header_image'] ) ) { update_term_meta( $term_id, 'brand_header_image', esc_url_raw( $_POST['brand_header_image'] ) ); } } // 4. Správné na tení jádra WP Media uploaderu add_action( 'admin_enqueue_scripts', 'dialka_brand_image_uploader_scripts' ); function dialka_brand_image_uploader_scripts() { // Na teme pouze pokud jsme v administraci taxonomie product_brand if ( isset( $_GET['taxonomy'] ) && $_GET['taxonomy'] === 'product_brand' ) { wp_enqueue_media(); } } // 5. Vlo~ení ovládacího JavaScriptu do pati ky administrace add_action( 'admin_footer', 'dialka_brand_image_uploader_js' ); function dialka_brand_image_uploader_js() { if ( isset( $_GET['taxonomy'] ) && $_GET['taxonomy'] === 'product_brand' ) { ?> <script> jQuery(document).ready(function($){ var mediaUploader; // Pou~íváme delegovanou událost (funguje spolehliv i po ulo~ení) $(document).on('click', '.upload_brand_image_btn', function(e) { e.preventDefault(); if (mediaUploader) { mediaUploader.open(); return; } mediaUploader = wp.media.frames.file_frame = wp.media({ title: 'Vyberte obrázek na pozadí hlavi ky', button: { text: 'Pou~ít tento obrázek' }, multiple: false }); mediaUploader.on('select', function() { var attachment = mediaUploader.state().get('selection').first().toJSON(); $('#brand_header_image').val(attachment.url); $('#brand_image_preview').html('<img src="' + attachment.url + '" style="max-width:150px; height:auto; border: 1px solid #ccc; padding: 5px; margin-top: 5px;" />'); $('.remove_brand_image_btn').show(); }); mediaUploader.open(); }); $(document).on('click', '.remove_brand_image_btn', function(e){ e.preventDefault(); $('#brand_header_image').val(''); $('#brand_image_preview').html(''); $(this).hide(); }); }); </script> <?php } } // 6. Automatické vlo~ení vybraného obrázku a stylo (tmavý pYekryv, bílý text) na frontendu add_action( 'wp_head', 'dialka_output_brand_header_bg' ); function dialka_output_brand_header_bg() { // Aplikujeme pouze na archivech taxonomie product_brand if ( is_tax( 'product_brand' ) ) { $term = get_queried_object(); if ( $term ) { $image_url = get_term_meta( $term->term_id, 'brand_header_image', true ); if ( $image_url ) { echo '<style>'; // Nastavení obrázku na pozadí echo 'body.tax-product_brand #page-header { background-image: url(' . esc_url( $image_url ) . ') !important; position: relative; overflow: hidden; }'; // Zmna barvy texto na bílou echo 'body.tax-product_brand #page-header, body.tax-product_brand #page-header .page-header__title, body.tax-product_brand #page-header .page-header__description, body.tax-product_brand #page-header .woocommerce-breadcrumb, body.tax-product_brand #page-header .woocommerce-breadcrumb a { color: #fff !important; }'; // Tmavý poloprohledný pYekryv pro lepaí itelnost textu echo 'body.tax-product_brand #page-header::before { content: ""; position: absolute; inset: 0; background: rgba(0, 0, 0, 0.5); z-index: 1; }'; // Posunutí obsahu (texto) nad pYekryv echo 'body.tax-product_brand #page-header .em-container { position: relative; z-index: 2; }'; echo '</style>'; } } } } add_action( 'admin_init', 'dialka_auto_fill_brand_descriptions' ); function dialka_auto_fill_brand_descriptions() { // Skript se spustí pouze pokud do URL v administraci pYidáa parametr ?fill_brands=yes if ( ! isset( $_GET['fill_brands'] ) || $_GET['fill_brands'] !== 'yes' ) { return; } $brands_data = array( 'Antonelli' => 'Vychutnejte si tradi ní italské pe ivo v odleh ené form. Antonelli pYináaí nadýchané croissanty a dezerty bez pYidaného cukru, ideální pro chvilku pohody u kávy.', 'Diablo' => 'Britská zna ka Diablo je synonymem pro sladkosti bez vý itek. `iroká nabídka okolád, oplatek a bonbono uspokojí chue na sladké bez vlivu na hladinu cukru v krvi.', 'Diana' => 'DoplHte zdravé tuky a energii z pYírody. Diana nabízí pe liv vybrané oYechy, semínka a suaené plodiny, které skvle zapadnou do vyvá~eného jídelní ku diabetika.', 'El Dia' => 'Specialista na dia potraviny El Dia pYináaí tradi ní chut v bezpe ném slo~ení. U~ijte si oblíbené pochoutky vyvinuté primárn pro vý~ivové potYeby pYi diabetu.', 'FAN' => 'Oslate si ~ivot chytYe a bez kalorií. eská zna ka FAN se specializuje na moderní náhradní sladidla, díky kterým si vychutnáte oblíbené nápoje i dezerty bez obav.', 'Goya' => 'Autentické suroviny pro zdravé vaYení. Goya nabízí kvalitní produkty a ingredience, se kterými obohatíte svoj ka~dodenní jídelní ek o nové chut bez zbyte ných cukro.', 'Gullon' => 'Gullón je evropskou api kou v bezcukrovém pe ivu. Bohatá nabídka kYupavých apanlských suaenek plných vlákniny pYedstavuje perfektní dia sva inku na cesty i domo.', 'Gymbeam' => 'PodpoYte svoj aktivní ~ivotní styl a udr~te si formu. Gymbeam nabízí proteinové snacky, oYechová másla a fitness potraviny s minimem cukru pro zdravé doplnní ~ivin.', 'Hors' => 'Tradi ní eské bonbony a lízátka v dia variant. S tvrdými bonbony Hors si dopYejete radost ze sladkého cucání vy i vaae dti, a to zcela bez pYidaného cukru.', 'Kvasni ka' => 'Poctivá lokální výroba a tradi ní receptury. Zna ka Kvasni ka pYináaí osvd ené pochoutky a cukrovinky, které respektují dietní omezení a zároveH skvle chutnají.', 'La Bontá' => 'Kousek italské pekaYské tradice pYímo na vaaem stole. La Bontá pYináaí jemné pe ivo ve variantách se sní~eným obsahem cukro pro bezpe né a elegantní mlsání.', 'Limaco' => 'KYupavé oplatky a trubi ky pro chvíle domácí pohody. Limaco vyrábí oblíbené cukrovinky s ohledem na dia stravování, ideální jako lehký doplnk k odpolední káv.', 'MTE spol. s.r.o.' => 'Kvalitní potraviny a doplHky od spolehlivého eského výrobce. MTE nabízí produkty zamYené na podporu zdraví a stabilizaci hladiny krevního cukru.', 'Sante' => 'Za nte svoj den zdrav s porcí vlákniny. SnídaHové cereálie, kaae a kYupavé ty inky Sante dodají komplexní sacharidy bez zbyte ných pYidaných cukro.', 'Torras' => 'Mistrovská apanlská okoláda bez lepku a cukru. Torras nabízí luxusní kakaový zá~itek a akálu pYíchutí slazených stévií i maltitolem pro stabilní glykémii.', 'Valor' => 'Prémiové okolády s více ne~ stoletou tradicí. Zna ka Valor pYináaí intenzivní dia okolády, které nadchnou milovníky silného kakaa hledající zdravjaí variantu.', 'Víno PYistál' => 'Vychutnejte si sklenku dobrého vína bez obav z výkyvo glykémie. Rodinné vinaYství PYistál se zamYuje na vína s minimálním zbytkovým cukrem, ideální pro diabetiky.', 'Wolfberry' => 'PYírodní síla superpotravin pro vaai vitalitu. Wolfberry nabízí isté suroviny, oYechy a alternativní sladidla, se kterými hrav pYipravíte zdravé dia recepty.', 'Xucker' => 'Sladký ~ivot s erythritolem a xylitolem. Nmecká zna ka Xucker pYináaí lahodné okolády a istá sladidla bez kalorií, perfektní pro dia a low-carb stravování.', 'Yo' => 'Osv~ující ovocné sirupy plné chuti. Yo v dia variant bez pYidaného cukru tvoYí skvlý základ pro pitný re~im, díky kterému si dopYejete limonádu bez vý itek.' ); $updated_count = 0; foreach ( $brands_data as $brand_name => $description ) { // Najde zna ku podle jména v taxonomii product_brand $term = get_term_by( 'name', $brand_name, 'product_brand' ); if ( $term && ! is_wp_error( $term ) ) { // Aktualizuje pole description wp_update_term( $term->term_id, 'product_brand', array( 'description' => $description )); $updated_count++; } } // Zobrazí zprávu o úspaném dokon ení a zastaví na ítání zbytku stránky wp_die( "Hotovo! Úspan bylo zapsáno $updated_count popiso ke zna kám. Nyní mo~ea tento kód z functions.php zase smazat." ); } // --- OPRAVA EMAILn PRO ABANDONED CARTS PRO --- // 1. Zni ení anglického textu s daní na úrovni pYeklada e jádra WP add_filter( 'gettext', 'dialka_odstranit_dan_gettext', 999, 3 ); function dialka_odstranit_dan_gettext( $translated_text, $text, $domain ) { if ( $text === '(includes %s)' || strpos( $text, 'includes Tax' ) !== false ) { return ''; } return $translated_text; } // 2. Oprava slisované tabulky pYímo v odesílacím jádru SMTP (PHPMailer) add_action( 'phpmailer_init', 'dialka_oprava_smtp_emailu', 999 ); function dialka_oprava_smtp_emailu( $phpmailer ) { if ( ! empty( $phpmailer->Body ) ) { // A) Oprava zalamování "30 ks x" (udr~í na jednom Yádku) $phpmailer->Body = preg_replace( '/(<td[^>]*>)\s*(\d{1,4})\s*(<\/td>)/i', '$1<span style="white-space: nowrap; display: inline-block; padding-right: 5px;">$2 ks &times;</span>$3', $phpmailer->Body ); // B) Agresivní vymazání dan "(211 K )" prolezlé skrytým WooCommerce HTML $phpmailer->Body = preg_replace( '/\s*(?:<small[^>]*>)?\s*\(\s*(?:includes\s*Tax:\s*)?(?:<[^>]+>)*\s*[\d\s.,]+(?:&nbsp;|\s)*(?:<[^>]+>)*(?:K |¬ |Ft|CZK|HUF)(?:&nbsp;|\s)*(?:<[^>]+>)*\s*\)\s*(?:<\/small>)?/ui', '', $phpmailer->Body ); // C) Odstranní SKU (napY. "SKU: HORS-LIZ-10G" nebo "SKU: AGUL0112") // Odstraní pYípadné <br> pYed SKU, slovo SKU:, kód samotný a~ k dalaímu HTML tagu. $phpmailer->Body = preg_replace( '/\s*(?:<br[^>]*>)?\s*(?:<span[^>]*>)?\s*SKU:\s*[^<]+(?:<\/span>)?/ui', '', $phpmailer->Body ); } // iatní ist textové (Alt) verze e-mailu if ( ! empty( $phpmailer->AltBody ) ) { $phpmailer->AltBody = preg_replace( '/\s*\(\s*(?:includes\s*Tax:\s*)?[\d\s.,]+(?:K |¬ |Ft|CZK|HUF)\s*\)/ui', '', $phpmailer->AltBody ); $phpmailer->AltBody = preg_replace( '/\s*SKU:\s*[^\n\r]+/ui', '', $phpmailer->AltBody ); } }
0
    0
    Váš košík
    Košík je prázdnyZačať nakupovať
      Vypočítať náklady na dopravu