Skip to content

Kaikki WordPressistä, web-kehityksestä — ja paljon muuta

📝 WooCommerce-tilaushuomautusten lisääminen sähköposteihin: täydellinen opas

📝 WooCommerce-tilaushuomautusten lisääminen sähköposteihin: täydellinen opas

Asiakas tekee tilauksen, ja jätät hallintapaneeliin muistiinpanon: tarkensit toimituspäivää, lisäsit seurantanumeron tai kirjoitit yksinkertaisesti "soita ennen toimitusta". Asiakas ei kuitenkaan näe tätä. WooCommercen tilausmuistiinpanot näkyvät oletuksena vain hallintapaneelissa, tilauksen muokkaussivupalkissa. Ne eivät näy ostajalle lähetettävissä sähköposteissa.

Ongelma ratkeaa yhdellä koodinpätkällä functions.php-tiedostossa. Ei lisäosia, ei mallipohjien muokkausta, vain siisti koukku, joka tulostaa muistiinpanot sähköpostin runkoon. Käytännössä olemme käyttäneet tätä lähestymistapaa asiakkaiden verkkokaupoissa jo usean vuoden ajan ilman ongelmia WooCommercen päivitysten jälkeen. Tässä oppaassa käymme läpi, miten WooCommerce tallentaa tilausmuistiinpanot, mitä koukkua kannattaa käyttää ja miten voit muokata tulosteen omiin tarpeisiisi.

💡 Nopea yleiskatsaus:

  • Miten WooCommerce tallentaa tilausmuistiinpanot: order_note-kommenttityyppi ja wc_get_order_notes()-funktio
  • Kaksi tapaa sähköpostien muokkaukseen: mallipohjan korvaaminen tai koukut, ja milloin kumpikin kannattaa valita
  • Valmis koodinpätkä muistiinpanojen näyttämiseen tilauksen valmistumisviestissä, rivi riviltä selitettynä
  • Muokkaus: listan tyylittely, vain asiakasmuistiinpanojen suodatus, plain text -sähköpostien tukeminen
  • Testaus sähköpostin esikatselulla hallintapaneelissa, ilman oikeiden asiakkaiden häiritsemistä

Vaihe 1: Miten WooCommerce tallentaa tilausmuistiinpanot

WooCommerce tallentaa muistiinpanot WordPressin kommentteina, joiden tyyppi on order_note. Jokainen tilaukseen kohdistuva toimenpide (tilan muutos, palautus, ylläpitäjän muistiinpano tai asiakkaan viesti) kirjataan wp_comments-tauluun lipulla comment_type = 'order_note'.

Sisäisten ja asiakasmuistiinpanojen ero määräytyy is_customer_note-metakentän perusteella. Jos "Näkyy Oma tili -sivulla" -valintaruutu on valittuna muistiinpanoa lisättäessä, WooCommerce asettaa arvon is_customer_note = true, ja ostaja näkee sen omalla tilillään. Tavalliset sisäiset muistiinpanot (is_customer_note = false) eivät näy asiakkaalle missään.

High Performance Order Storage (HPOS) -ominaisuuden myötä WooCommerce 8.2+:ssa muistiinpanot siirtyivät erilliseen wp_wc_order_notes-tauluun. Suorat SQL-kyselyt wp_comments-tauluun HPOS:n ollessa käytössä voivat palauttaa tyhjiä tuloksia. Siksi get_comments()-funktion sijaan on parempi käyttää wc_get_order_notes()-funktiota, joka toimii oikein tallennustavasta riippumatta.

Vaihe 2: Mallipohjat vai koukut, kumpi lähestymistapa valita

WooCommerce tarjoaa kaksi tapaa sähköpostien muokkaukseen: mallipohjan korvaamisen ja toimintokoukut. Kummallakin on oma käyttötarkoituksensa.

Mallipohjan korvaaminen. Kopioit tiedoston hakemistosta woocommerce/templates/emails/ hakemistoon yourtheme/woocommerce/emails/ ja muokkaat HTML:ää suoraan. Etuna on täysi hallinta merkintäkielestä. Haittana on, että suurten WooCommerce-päivitysten jälkeen mallipohjasi voi poiketa ajantasaisesta versiosta, ja sähköpostit voivat alkaa hajota. Mallipohjien rakenteen dokumentaatio on nyt osoitteessa woocommerce.com, ei vanhassa docs.woothemes.com-osoitteessa.

Koukut. Kiinnität takaisinkutsufunktion woocommerce_email_order_meta-toimintoon, ja WooCommerce kutsuu funktiotasi oikeassa kohdassa sähköpostia. Etuna on, että se ei riipu mallipohjien versioista ja toimii suoraan ydintiedostojen päivitysten jälkeen. Haittana on, että olet rajoittunut koukun sijaintiin (se laukeaa tilauksen metatietolohkossa, tuotetaulukon jälkeen).

Kriteeri

Mallipohjat

Koukut

Merkintäkielen hallinta

Täysi

Koukun sijainnin puitteissa

Kestävyys päivityksille

Matala

Korkea

Toteutuksen monimutkaisuus

Korkeampi

Matalampi

Paras tilanteeseen

Koko sähköpostin uudistus

Yksittäisen lohkon lisäys

Meidän tehtäväämme, muistiinpanojen näyttämiseen, koukku on enemmän kuin riittävä. Jos sinun täytyy uudistaa sähköpostien asettelu kokonaan, käytä mallipohjia ja suunnittele niiden päivittäminen noin puolen vuoden välein.

Vaihe 3: Koodin lisääminen functions.php-tiedostoon

woocommerce_email_order_meta-koukku laukeaa kaikissa WooCommercen transaktiosähköposteissa: tilausvahvistus, valmistumisilmoitus, peruutus, lasku ja muut. Takaisinkutsulle välitetään neljä parametria: tilausobjekti $order, $sent_to_admin-lippu, $plain_text-lippu ja sähköpostiobjekti $email.

Sijoita tämä koodi aktiivisen teemasi functions.php-tiedostoon (tai Code Snippets -lisäosan kautta, mikä on turvallisempaa, koska koodi ei katoa teemaa vaihdettaessa):

1add_action( 'woocommerce_email_order_meta', 'sd_add_order_notes_to_email', 10, 4 );
2
3function sd_add_order_notes_to_email( $order, $sent_to_admin, $plain_text, $email ) {
4 // Don't break the plain-text version of the email
5 if ( $plain_text ) {
6 echo "\n\n" . esc_html__( 'Order Notes:', 'woocommerce' ) . "\n";
7
8 $notes = wc_get_order_notes( array(
9 'order_id' => $order->get_id(),
10 'type' => 'customer',
11 ) );
12
13 if ( empty( $notes ) ) {
14 echo esc_html__( 'No notes for this order.', 'woocommerce' ) . "\n";
15 return;
16 }
17
18 foreach ( $notes as $note ) {
19 echo '- ' . wp_strip_all_tags( $note->content ) . "\n";
20 }
21 return;
22 }
23
24 // HTML version: get only customer notes
25 $notes = wc_get_order_notes( array(
26 'order_id' => $order->get_id(),
27 'type' => 'customer',
28 ) );
29
30 if ( empty( $notes ) ) {
31 return;
32 }
33
34 echo '<h2>' . esc_html__( 'Order Notes', 'woocommerce' ) . '</h2>';
35 echo '<ul class="order-notes-list" style="list-style:none;padding:0;margin:0 0 24px;">';
36
37 foreach ( $notes as $note ) {
38 $note_date = sprintf(
39 '%1$s at %2$s',
40 date_i18n( get_option( 'date_format' ), strtotime( $note->date_created ) ),
41 date_i18n( get_option( 'time_format' ), strtotime( $note->date_created ) )
42 );
43
44 printf(
45 '<li style="background:#f9f9f9;border-left:4px solid #7f54b3;padding:12px 16px;margin-bottom:10px;border-radius:0 4px 4px 0;">'
46 . '<div style="margin-bottom:4px;">%s</div>'
47 . '<small style="color:#888;">%s</small>'
48 . '</li>',
49 wp_kses_post( nl2br( $note->content ) ),
50 esc_html( $note_date )
51 );
52 }
53
54 echo '</ul>';
55}

Tässä on selitys rivi riviltä:

  • Rivi 1. Rekisteröimme koukun prioriteetilla 10 ja otamme vastaan kaikki 4 parametria. Ilman 10, 4-määrittelyä WooCommerce välittää vain ensimmäisen argumentin, ja saat virheen.
  • Rivit 5-20. Plain text -sähköpostien käsittely. Osa sähköposteista lähetetään tekstimuodossa, joten tulostamme muistiinpanot listana ajatusviivoilla, ilman HTML:ää.
  • Rivit 24-28. wc_get_order_notes() pyytää vain asiakasmuistiinpanoja (type => 'customer'). Poista suodatin näyttääksesi kaikki muistiinpanot, myös sisäiset (tilan muutokset, palautukset). Jos taulukko on tyhjä, emme tulosta mitään emmekä täytä sähköpostia turhalla sisällöllä.
  • Rivit 34-38. Muotoilemme päivämäärän date_i18n()-funktiolla, joka huomioi sivuston kieliasetuksen ja päivämäärän ja kellonajan muotoiluasetukset.
  • Rivit 40-48. printf() tulostaa jokaisen muistiinpanon tyylitellyssä lohkossa: violetti palkki vasemmalla, vaalea tausta, päivämäärä harmaalla alla.

Koodi ei käytä ulkoisia riippuvuuksia ja on yhteensopiva WooCommerce 3.2+:n (wc_get_order_notes-funktio esiteltiin tässä versiossa) ja HPOS:n kanssa (natiivituki versiosta 8.2+).

Vaihe 4: Testaus ilman asiakkaiden häiritsemistä

Koodin lisäämisen jälkeen älä jää odottamaan oikeaa tilausta testataksesi. WooCommerce tarjoaa sisäänrakennetun sähköpostin esikatselun: WooCommerce → Asetukset → Sähköpostit → klikkaa mitä tahansa sähköpostia → "Esikatsele"-painike alareunassa. Näet sähköpostin sekä HTML- että plain text -muodossa, käyttäen oikeaa tilausta (viimeisintä käytetään). Jos tilauksia ei ole, luo testitilaus manuaalisesti.

Mitä tarkistaa:

  • Asiakasmuistiinpano, jossa "Näkyy Oma tili -sivulla" on valittuna, näkyy sähköpostissa;
  • Sisäinen muistiinpano (ilman valintaruutua) ei näy (jos pidit type => 'customer'-rajauksen);
  • Sähköpostin plain text -versio ei ole rikki (vaihda esikatselun alla olevasta linkistä);
  • Muistiinpanolohko ei kahdennu ylläpitäjän sähköposteissa (lisää tarkistus if ( $sent_to_admin ) return; tarvittaessa).

Jos käytät Code Snippets -lisäosaa, poista koodinpätkä käytöstä peruaksesi muutoksen. Jos muokkasit functions.php-tiedostoa, kommentoi tai poista koodi. Tietokantaan ei jää jälkiä.

⁉️🤔 Usein kysytyt kysymykset

Voinko näyttää KAIKKI muistiinpanot, en vain asiakasmuistiinpanoja?

Kyllä. Korvaa 'type' => 'customer' arvolla 'type' => 'internal' saadaksesi vain sisäiset muistiinpanot. Poista type-parametri kokonaan saadaksesi kaikki muistiinpanot. Huomioi, että sisäiset muistiinpanot voivat sisältää palvelutietoja (palautustunnuksia, summia), joita asiakkaiden ei pitäisi nähdä. Useimmille verkkokaupoille 'type' => 'customer' on riittävä. Jos haluat erotella tulosteen, luo kaksi lohkoa: ensin asiakasmuistiinpanot otsikolla "Tilauksen kommentit", sitten sisäiset muistiinpanot otsikolla "Toimituksen tiedot" (tämä on ylläpitäjän sähköposteja varten, käyttäen $sent_to_admin-lippua).

Toimiiko koodi tietyssä sähköpostissa vai kaikissa?

woocommerce_email_order_meta-koukku laukeaa kaikissa transaktiosähköposteissa: Tilaus valmis, Tilausta käsitellään, Tilaus odottaa, Asiakkaan lasku ja niin edelleen. Jos haluat rajata tulosteen vain tilauksen valmistumisviestiin, kääri koodi tarkistuksen sisään:

1> if ( 'customer_completed_order' !== $email->id ) {
2> return;
3> }
4>

Täydellinen lista sähköpostien tunnisteista löytyy WooCommercen dokumentaatiosta: customer_completed_order · customer_processing_order · customer_on_hold_order · customer_invoice · customer_refunded_order · customer_new_account · new_order · cancelled_order · failed_order.

Onko turvallista muokata functions.php-tiedostoa tuotantosivustolla?

functions.php-tiedoston suora muokkaaminen on riskialtis lähestymistapa. Syntaksivirhe (ylimääräinen sulje, sulkematon lainausmerkki) aiheuttaa koko sivuston muuttumisen valkoiseksi ruuduksi. Turvallisempaa on käyttää Code Snippets -lisäosaa, jonka avulla voit lisätä PHP-koodinpätkiä hallintapaneelin kautta ja joka poistaa automaattisesti käytöstä koodin, joka aiheuttaa vakavan virheen. Vaihtoehto on WPCode (ilmainen versio wordpress.orgissa), joka tarjoaa saman toiminnallisuuden sekä ehdollisen logiikan (vain ylläpitäjälle, vain tietyillä sivuilla). Jos kuitenkin muokkaat functions.php-tiedostoa, tee tiedostosta varmuuskopio ja pidä FTP-yhteys saatavilla. Valkoisen ruudun korjaa korvaamalla functions.php-tiedoston alkuperäisellä varmuuskopiostasi.

Muistiinpanot kahdentuvat sähköposteissa, mitä tein väärin?

Kaksi todennäköistä syytä. Ensimmäinen: lisäsit koodin sekä functions.php-tiedostoon että koodinpätkälisäosan kautta, joten koukku laukeaa kahdesti. Pidä vain toinen. Toinen: teemasi tai jokin toinen lisäosa kiinnittää jo takaisinkutsun tähän samaan koukkuun. Tarkista etsimällä projektin koodista (grep -r "woocommerce_email_order_meta" wp-content/). Jos kahdennus johtuu lisäosasta, poista oma koodisi. Jos se johtuu teemasta, kääri takaisinkutsusi remove_action()-kutsuun ennen add_action()-kutsua varmistaaksesi, että vain yksi käsittelijä suoritetaan.

Lopputulos: kannattaako muistiinpanoja lisätä asiakkaan sähköposteihin

Viestinnän läpinäkyvyys on yksi edullisimmista tavoista vähentää asiakastuen työkuormaa. Kun asiakas näkee sähköpostissa "Seurantanumero: X123456789, toimitus 15. kesäkuuta", hän ei mene chattiin kysymään "missä tilaukseni on?" Yksi koodinpätkä, nolla lisäosaa, viisi minuuttia toteutukseen, ja vaikutus mitataan kymmenissä säästetyissä tukipyynnöissä kuukaudessa.

Jos sähköpostisi on jo muokattu mallipohjien kautta, upota muistiinpanojen tulostus suoraan mallipohjaan koukun käyttämisen sijaan. Jos käytät sähköpostien muokkauslisäosaa (Kadence, YayMail, ShopMagic), jokaisessa on oma mekanisminsa dynaamisten lohkojen lisäämiseen, joten käytä sitä koodin sijaan.

Kokeile yhdellä sähköpostityypillä (Tilaus valmis), testaa testitilauksella ja arvioi viikon kuluttua, saatko vähemmän toistuvia kysymyksiä asiakkailta. Lähes varmasti kyllä.