Tak jak napisałem wczoraj – w związku z nadchodzącymi zmianami związanymi z nową ustawą o prawach konsumenta, która zacznie obowiązywać m.in. sklepy internetowe już w czwartek (25 grudnia) – w kilka sklepach przygotowujemy zmiany z tym związane. Jedną z takich zmian jest automatyczne dołączanie do wiadomości e-mail potwierdzających zakup regulaminu sklepu, oraz formularza odstąpienia od umowy wraz z pouczeniem (pliki PDF). A z racji tego, że ostatnio sklepy internetowe uruchamiamy głównie na platformie WooCommerce (WordPress), to dziś chciałbym przedstawić, jak właśnie w sklepie internetowym opartym o tę platformę wykonać takie zadanie…
Spis treści w artykule
WooCommece (WordPress) i dodawanie załącznika do automatycznych wiadomości
Jeśli ktoś z Was do tej pory nie dodawał nigdy „własnego kodu” do WordPressa, to odsyłam do wczorajszego wpisu – dziś przejdziemy od razu do sedna, czyli kodu:
function webinsider_woocommerce_add_attachments_to_order_email( $attachment, $status, $order ) {
$order_status_with_attachments = array( 'customer_completed_order' );
if ( isset( $status ) && in_array( $status, $order_status_with_attachments ) ) {
$attachment01_path = get_stylesheet_directory().'/regulamin.pdf';
$attachments[] = $attachment01_path;
}
return $attachments;
}
add_filter( 'woocommerce_email_attachments', 'webinsider_woocommerce_add_attachments_to_order_email', 10, 3 );
Mamy tu funkcję „webinsider_woocommerce_add_attachments_to_order_email()”, która jest wykonywana w momencie tworzenia przez WooCommerce/WordPress wiadomości e-mail. Funkcja ta, dla wybranych statusów – w naszym przypadku „customer_completed_order” (potwierdzenie realizacji zamówienia dla klienta) – dodaje wskazany załącznik (regulamin.pdf) znajdujący się w katalogu naszego szablonu (szablon potomny/child theme).
Oczywiście skrypt można zmodyfikować, zależnie od potrzeb…
Więcej załączników
Jeśli potrzebujemy dodać więcej niż jeden załącznik, wystarczy zdublować ten fragment kodu:
$attachment01_path = get_stylesheet_directory().'/regulamin.pdf';
$attachments[] = $attachment01_path;
Modyfikując go wedle potrzeb:
$attachment02_path = get_stylesheet_directory().'/jakiś-inny-plik.pdf';
$attachments[] = $attachment02_path;
$attachment03_path = get_stylesheet_directory().'/i-jeszcze-jeden-plik.pdf';
$attachments[] = $attachment03_path;
W efekcie otrzymamy coś takiego:
function webinsider_woocommerce_add_attachments_to_order_email( $attachment, $status, $order ) {
$order_status_with_attachments = array( 'customer_completed_order' );
if ( isset( $status ) && in_array( $status, $order_status_with_attachments ) ) {
$attachment01_path = get_stylesheet_directory().'/regulamin.pdf';
$attachments[] = $attachment01_path;
$attachment02_path = get_stylesheet_directory().'/jakiś-inny-plik.pdf';
$attachments[] = $attachment02_path;
$attachment03_path = get_stylesheet_directory().'/i-jeszcze-jeden-plik.pdf';
$attachments[] = $attachment03_path;
}
return $attachments;
}
add_filter( 'woocommerce_email_attachments', 'webinsider_woocommerce_add_attachments_to_order_email', 10, 3 );
Tematy praktycznego wdrożenia tzw. Omnibusa w sklepie internetowym opartym o WooCommerce poruszamy również w naszym kursie internetowym „Wdrożenie Omnibusa w WooCommerce”, w którym znajdziesz nie tylko konkretne informacje, w tym gotowe do zastosowania kody, ale również gotowe wtyczki do zainstalowania. Kliknij i sprawdź szczegóły…
Inna ścieżka pliku
Kolejną modyfikacją jest zmiana ścieżki/adresy pliku – w podanym przykładzie korzystamy ze ścieżki naszego szablonu, a konkretnie pliku style.css (get_stylesheet_directory()).
Można tu oczywiście wstawić dowolną ścieżkę, choć musi to być ścieżka bezwzględna, w formacie systemowym (Linux), np.:
/var/www/webinsider.pl/public_html/wp-content/uploads/regulamin.pdf
Natomiast nie zadziała ścieżka „internetowa”, np.:
https://webinsider.pl/wp-content/uploads/regulamin.pdf
I przykład kodu ze zmienioną ścieżką, jak w przykładzie powyżej:
function webinsider_woocommerce_add_attachments_to_order_email( $attachment, $status, $order ) {
$order_status_with_attachments = array( 'customer_completed_order' );
if ( isset( $status ) && in_array( $status, $order_status_with_attachments ) ) {
$attachment01_path = '/var/www/webinsider.pl/public_html/wp-content/uploads/regulamin.pdf';
$attachments[] = $attachment01_path;
}
return $attachments;
}
add_filter( 'woocommerce_email_attachments', 'webinsider_woocommerce_add_attachments_to_order_email', 10, 3 );
Załączniki do wiadomości dla innych statusów
W naszym przykładzie załącznik dodajemy do pierwszej wiadomości, jaką otrzymuje klient, czyli z potwierdzeniem zamówienia. Odpowiada za to status „customer_processing_order”.
Oczywiście nie ma przeszkód, by wykorzystać podaną metodę dla innych statusów. Wystarczy zmodyfikować jedną linijkę wg schematu:
$order_status_with_attachments = array( 'order_status01', 'order_status02', 'order_status03' );
Oczywiście można kod rozbudować, o różne załączniki dla różnych statusów – ale to już zależy od Waszych potrzeb… ;-)
- Wakacje składkowe ZUS a zawieszenie działalności gospodarczej, czyli uważaj, bo być może nie będziesz mógł skorzystać (w 2024) - 1970-01-01
- Przykładowy kalkulator wyceny usługi druku 3D, czyli nie tylko materiał się liczy - 1970-01-01
- Home Assistant 2024.10, czyli nowa karta „nagłówek” i niedziałający TTS w ramach usługi Google Cloud - 1970-01-01
Dziękuję Ci za tę informację, sporo się naszukałam, zanim znalazłam Twoje rozwiązanie -najprostsze i najbardziej oczywiste.
Podpowiedz jeszcze, proszę, jak dodawać w załączniku fakturę, która wystawiana jest przez plugin Faktury dla WordPressa z rozszerzeniem Faktury dla Woocommerce. Automatycznie wstawia się w linku w wiadomości, ale nowe przepisy nakazują, żeby była w na nośniku trwałym.
Dzięki – akurat przygotowywałem je na potrzeby moich klientów, ale uznałem też, że warto się tym podzielić, bo pewnie inni tez szukają… I fajnie, że ktoś to docenił :-)
Masz na myśli same faktury (nie potwierdzenie zamówienia)?
Z rozwiązań automatycznych – które testowałem, i mogę polecić – WooCommerce Jetpack ma poszukiwaną przez Ciebie funkcjonalność (m.in. automatyczną wysyłkę FVAT po oznaczeniu zamówienia jako zrealizowane). Dodatkowo plugin nie jest drogi, a pojawiają się w nim co chwila nowe opcje, i ogólnie jest to obecnie jeden z podstawowych dodatków do WooCommerce – przynajmniej wg mnie…
W planach mam dłuższy wpis mu poświęcony, ale to za jakiś czas… :-)
Dzięki za podpowiedź. A może jest jakieś rozwiązanie bez instalowania mega dużego pluginu z którego będzie wykorzystana jedna funkcja?
Inny – dedykowany – plugin, który będzie realizował taką funkcję :-)
Jest kilka bezpłatnych pluginów/wtyczek do WC/WP, które mogą posłużyć do tego celu (wystawienie i wysyłka FVAT). Alternatywnie, jeśli aktualnie używany plugin generuje plik PDF, ale nie ma opcji dodawania jako załącznik do e-maila – można spróbować zmusić go tego, np. za pomocą modyfikacji przedstawionego tu kodu o wcześniejsze generowanie odpowiedniego pliku np. na podstawie linku (zazwyczaj jest to stały link, w którym zmienia się tylko ID zamówienia) i dodawanie tak przygotowanego „tempa”.
Dzięki, chciałabym podziałać własnie tym tropem, żeby obecną wtyczkę skłonić do dodawania pliku także w załączniku. Na razie w treści wiadomości kończącej zamówienie dodaje link do pobrania dokumentu pdf. A to chyba wciąż za mało.
Ale powiedz (napisz) mi, Ty masz na pewno na myśli fakturę VAT, czy może jednak potwierdzenie zamówienia?
EDIT:
Widzę, że dałaś link do komercyjnej wtyczki – w takiej sytuacji najprościej zaktualizować wtyczkę, bo w opisie funkcji widać coś takiego:
No ta aktualizacja właśnie wciąż nie działa tak, jakbym chciała (tzn dodaje link do pobrania faktury, zamiast umieścić ją w załączniku).
Pewnie można by to przeskoczyć, ale wydaje mi się, że najprościej napisać do nich w tej sprawie…
Jeszcze raz wielkie dzięki! I za artykuł i za rady :)
Mam pytanie w jakim pliku umieścić ten kod do załaczania pdf. Przyznaje się nie jestem dobry w te klocki.
Ogólnie to utworzyłem plugina z kodem który został podany. Ale za nic w świecie nie dodaje mi załacznika.
Ok już sobie poradziłem ;]
W następnym komentarzu widzę informację, że już się udało… To ew. „dla innych”: w tym artykule/wpisie opisałem jak dodać własny kod do WordPressa…
Ja również dziękuję za artykuł – wszystko działa wyśmienicie. Chciałabym jeszcze zapytać – czy jest możliwość dodania numeru śledzenia przesyłki do treści maila z zamówieniem zrealizowanym?
Ok, już znalazłam – wtyczka Aftership. Dziękuję i pozdrawiam.
OK, właśnie szykowałem odpowiedź, ale zaczęła rosnąc na tyle, że uznałem, że będzie to chyba kolejny wpis… Ale skoro odpowiedź została znaleziona, to temat tymczasowo zostawiam na inne czasy, bo na pewno do niego jeszcze wrócę…
Dla innych tylko na szybko dodam, że można taki efekt osiągnąć również samodzielnie, korzystając z „custom field” i modyfikując plik szablonu wiadomości e-mail lub tworząc odpowiednią funkcję (wtyczka lub plik functions.php).
Dodam jeszcze, że jeśli ktoś nie chce i/lub nie potrzebuje dodatkowej modyfikacji itp., to do tego celu można również wykorzystać wbudowany system notatek do zamówienia – niby rzecz oczywista, ale z doświadczenia wiem, że wiele osób pomija ten element, często nawet nie zdając sobie sprawy z jego istnienia i możliwości :-)
Pozdrawiam
Witam. A da się, aby przy „new_order” wysyłało mail z załącznikiem tylko odo kupującego. Bo w tym momencie idzie tak samo do mnie (sprzedającego) i tylko skrzynkę zapychają załączniki :)
Z tego co kojarzyłem, to ten kod nie dodaje załączników do wiadomości o nowym zamówieniu wysyłanej do obsługi sklepu, a tylko do klienta. Ale, że pamięć potrafi czasem spłatać figla, to sprawdziłem szybko w jednym ze sklepów którymi się opiekuje, a w którym jest wdrożony ten kod, i wszystko jest tak jak być powinno – załączniki dodawane są tylko do wiadomości wysyłanej kupującemu.
Choć ja do tego zazwyczaj korzystam ze statusu „customer_processing_order”, bo „new_order” to właśnie status dla obsługi nie dla klienta, a więc to obsługa dostanie załączniki, a nie klient.
Chyba, że chodzi o to, by w ogóle nie przychodził e-mail z informacją o nowym zamówieniu? To wtedy trzeba to zmienić w ustawieniach WooCommerce:
Można też za pomocą odpowiedniego kodu, ale w tym przypadku mija się to z celem, bo jest odpowiednia opcja w ustawieniach.
Nie wiem dlaczego, ale podany przez Ciebie kod nie działa, znalazłem natomiast na stronach anglojęzycznych taki:
<?php
add_filter( 'woocommerce_email_attachments', 'attach_terms_conditions_pdf_to_email', 10, 3);
function attach_terms_conditions_pdf_to_email ( $attachments , $id, $object ) {
$your_pdf_path = get_template_directory() . '/Regulamin.pdf';
$attachments[] = $your_pdf_path;
return $attachments;
}
który działa bezproblemowo, za wyjątkiem jednego – dołącza regulamin do każdego emaila, nawet anulującego zamówienie.
Nie wiem co masz na myśli pisząc „nie działa”, ale na szybko sprawdziłem na jednym sklepie którym zażądam (najnowszy WordPress i WooCommerce) i wszystko działa, tj. dodaje 2 zdefiniowane załączniki. Zresztą tuż przed weekendem wdrażałem to rozwiązanie w kolejnym sklepie, i tam również bez problemów… Choć jak zawsze – jak przy każdym wpisie – uczulam na fakt, że informacje tam podane są aktualne na moment publikacji, i artykuł/poradnik pisany np. 3 lata temu niekoniecznie będzie aktualny dzisiaj.
Nie działał, ale teraz już działa, odkryłem że ten podany kod z waszej stroniy trzeba wcisnąć między <?php a takimi zielonymi gwiazdkami – tego tu akurat nie podajecie.
Ten wpis dotyczy konkretnego kodu do zastosowania w konkretnej sytuacji, ale na wszelki wypadek – jakby ktoś nie wiedział jak i gdzie dodać własny kod do WordPressa – tuż nad pierwszym listingiem jest informacja:
I w podlinkowanym wpisie znajdziesz wszystkie niezbędne informacje – m.in., że struktura (czystego pliku, z szablonu potomnego) wygląda np. tak:
Załóżmy, że chcemy dodać do naszej strony taki kod:
W takim przypadku cały plik functions.php będzie wyglądał tak:
Tylko ja nie rozumiem tego zapisu:
/* Swój kod wprowadź poniżej: */
Po co wprowadzać taki tekst ( w czym ma on być pomocny)
Czysto informacyjnie by mniej doświadczony wiedział gdzie ma wkleić kod. Żadnej innej funkcji on nie pełni – jest to zwykły komentarz w PHP.
Używam najnowszego WordPressa 4.5.2 z najnowszym motywem Storefront Wersja 2.0.3 i najnowszą wtyczką WooCommerce Wersja 2.5.5 Tam plik funcyins.php wygląda po wrzuceniu kodu tak:
<?php
function pryc_woocommerce_add_attachments_to_order_email($attachment,$status,$order) {
$order_status_with_attachments = array('customer_processing_order');
if (isset($status) && in_array($status,$order_status_with_attachments)) {
$attachment01_path = get_stylesheet_directory().'/Regulamin.pdf';
$attachments[] = $attachment01_path;
}
return $attachments;
}
add_filter('woocommerce_email_attachments','pryc_woocommerce_add_attachments_to_order_email',10,3);
/**
* Storefront engine room
*
* @package storefront
*/
/**
* Assign the Storefront version to a var
*/
$theme = wp_get_theme( 'storefront' );
$storefront_version = $theme['Version'];
/**
* Initialize all the things.
*/
require 'inc/class-storefront.php';
require 'inc/jetpack/class-storefront-jetpack.php';
require 'inc/customizer/class-storefront-customizer.php';
require 'inc/storefront-functions.php';
require 'inc/storefront-template-hooks.php';
require 'inc/storefront-template-functions.php';
if ( is_woocommerce_activated() ) {
require 'inc/woocommerce/class-storefront-woocommerce.php';
require 'inc/woocommerce/storefront-woocommerce-template-hooks.php';
require 'inc/woocommerce/storefront-woocommerce-template-functions.php';
}
if ( is_admin() ) {
require 'inc/admin/class-storefront-admin.php';
}
/**
* Note: Do not add any custom code here. Please use a custom plugin so that your customizations aren't lost during updates.
* https://github.com/woothemes/theme-customisations
*/
Czy mógłbyś laikom takim jak ja pokazać na przykładzie jak ten kon prawidłowo powinien być zapisany?
Odsyłam Cię do innych wpisów, m.in.:
Jeśli informacje zawarte w tych wpisach będą niejasne, to może warto rozważyć powierzenie niektórych czynności bardziej doświadczonym? Naprawdę nie zawsze najlepiej jest robić wszystko samemu.
Za indywidualne wsparcie – o co właściwie prosisz – wystawiam faktury, bo doba jest zbyt krótka by każdemu wszystko robić za darmo…
Witam, świetny materiał. Zauważyłem, że załączniki nie są dodawane do maila w którym jest ogólna informacja „Twoje zamówienie jest wstrzymane do czasu otrzymania potwierdzenia płatności. Poniżej znajdują się szczegóły zamówienia:” Dzieje się tak gdy ktoś wybierze płatność przez przelew – gdy przy odbiorze jest ok.
Gdy klient zdecyduje się na płatność przez przelew klient dostaje je dopiero gdy wyśle maila z „ZAMÓWIENIE W TRAKCIE REALIZACJI”. Czy da radę to zmienić, by załączniki były wysyłane wraz z pierwszym mailem do klienta? Czy po prostu to wina nowego WordPressa?
Skrypt generuje akcje (dodaje załącznik) w konkretnej sytuacji, tj. gdy od WooCommerce dostanie określony kod/status zamówienia. Jeśli chcesz by załącznik był dodawany dla innych statusów to albo musisz zmienić status jaki ma wyzwalać akcje, albo wykorzystać tabelę i kilka statusów.
Witam, zacząłem korzystać z Twojego rozwiązania – wielkie dzięki. Natomiast mam ten sam problem co kolega wyżej. Czy jesteś w stanie podać jak nazywa się ten status „Twoje zamówienie jest wstrzymane do czasu otrzymania potwierdzenia płatności. Poniżej znajdują się szczegóły zamówienia.” – np. pierwszy mail z metodą płatności przelew bankowy – tak abym mógł go dodać do szablonu, w przykładzie go nie ma a nie wiem jak znaleźć.
z góry dzięki.
Jeśli dobrze pamiętam, to status „zamówienie wstrzymane” (bo chyba o nim mowa) ma kod „customer_on_hold_order”.
A ja mam inny problem ponieważ u mnie w ogóle woocommerce nie wysyła powiadomień e-mail. Mogę prosić o jakieś wskazówki, gdzie szukać przyczyn problemu?
Zerknij tutaj:
Cześć,
gdy ustawie zeby zalaczniki byly dodawane do pierwszego maila z potwerdzeniem zamowienia – czyli na statusie „onhold”, z jakiegos powodu sklep przestaje odbierac potwierdzenie platnosci z bramki….
Platnosc przechodzi – bramka rejestruje i ksieguje kwote, ale woo nie otrzymuje zwrotnie infmoracji. Gdy kodu nie ma – wszystko jest OK.
tak to wyglada u mnie:
//KOD
function webinsider_woocommerce_add_attachments_to_order_email( $attachment, $status, $order ) {
$order_status_with_attachments = array( 'customer_on_hold_order’ );
if ( isset( $status ) && in_array( $status, $order_status_with_attachments ) ) {
$attachment01_path = get_stylesheet_directory().’/regulamin.pdf’;
$attachments[] = $attachment01_path;
$attachment02_path = get_stylesheet_directory().’/odstapienie-od-umowy.pdf’;
$attachments[] = $attachment02_path;
}
return $attachments;
}
add_filter( 'woocommerce_email_attachments’, 'webinsider_woocommerce_add_attachments_to_order_email’, 10, 3 );
//KONIEC
probowalem niecoinaczej tez, ale mam ten sam efekt
//KOD
add_filter( 'woocommerce_email_attachments’, 'attach_terms_conditions_pdf_to_email’, 10, 3);
function attach_terms_conditions_pdf_to_email ( $attachments , $id, $object ) {
// Continue if it’s customer_on_hold email notiication
if ( $id != 'customer_on_hold_order’ ) return $attachments;
$your_pdf_path1 = get_stylesheet_directory() . '/regulamin.pdf’;
$your_pdf_path2 = get_stylesheet_directory() . '/odstapienie-od-umowy.pdf’;
$attachments[] = $your_pdf_path1;
$attachments[] = $your_pdf_path2;
return $attachments;
}
//KONIEC
Jakies pomysly?
Dodam, ze w functions.php mam miedzy innymi porcje wczesnijeszego kodu od Ciebie ogarniajaca zgode na dostarczenie plikow cyfrowych przed 14 dniami + potwierdzenie tegoz dodawane do maili. Nie sadze zeby to mialo zanczenie – ale gdyby….
Oraz dodatkowa porcje kodu, ktora „naprawia” problem z wysylaniem maila new-order i customer_on_hold_order gdy platnosc leci przez przelewy24 co predzej bym podejzewal tutaj o jakis problem…
//KOD
add_action( 'woocommerce_checkout_order_processed’, 'pending_order_notification_for_przelewy24′, 20, 3 );
function pending_order_notification_for_przelewy24( $order_id, $posted_data, $order ) {
// Here set the related Payment ID
$payment_id = 'przelewy24′;
// Only for „pending” order status and 'przelewy24′ payements
if ($order->has_status(’pending’) && $order->get_payment_method() === $payment_id) {
// Send „New Email” notification (to admin)
WC()->mailer()->get_emails()[’WC_Email_New_Order’]->trigger($order_id);
// Send „On Hold Email” notification (to customer)
WC()->mailer()->get_emails()[’WC_Email_Customer_On_Hold_Order’]->trigger($order_id);
}
}
//KONIEC
Mozesz cos podpowiedziec prosze? :)
Dzieki!
m.
Trzeba by to przeanalizować (logi błędów PHP, tryb debugowania WP, ale mało prawdopodobne, by faktycznie wysyłka wiadomości miała wpływ na płatność. Naprawdę musieliby nieźle zj3bać twórcy wtyczki do płatności. Zwłaszcza że rozwiązania, które proponuję to nie są „filozoficzne debaty”, tylko korzystam z nich w swoim sklepie, czy sklepach klientów.
hej hej, no wiesz… to sa przelewy24… tam malo co nie jest zj3ban3 :D:D:D
niemniej problem dotyczy nie tylko przelewy24 ale i pay’u – jak uzyje Twojego lub mojego kodu dla statusu „customer_on_hold_order” – woo nie dostaje zwrotki z bramek platnosci i zamowienia utkaja na on-hold..
Pytanei czy przez lata cos sie nie pozmienialo w woo w tej kwestii i trzeba cos poprawic w kodzie?
m.
Nie kojarzę, do tego z tego kodu – w takiej, czy innej formie – cały czas korzystam nie tylko ja, ale i klienci. A skarg brak, po swoim sklepie też widzę, że zamówienia wpływają i oznaczają się OK. Zresztą nie powinno to mieć znaczenia, bo to nie funkcja zamiast tylko dodatek do tego, co i tak się wykonuje. Zobacz logi błędów.
Dzięki, będę szukał :)