Skip to content

Instantly share code, notes, and snippets.

@Niq1982
Last active May 21, 2021 09:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Niq1982/e8abad4bc047e9a63e6f707e3f593cdb to your computer and use it in GitHub Desktop.
Save Niq1982/e8abad4bc047e9a63e6f707e3f593cdb to your computer and use it in GitHub Desktop.
WP/Woocommerce Koodikatselmus part 1

WP/Woocommerce Koodikatselmus part 1

Katselmus on tehty WP/Woofi -facebookryhmässä silmiin osuneesta koodista alkup. tekijän luvalla.

Lähtökohtainen tilanne/tarve:

Tulee kokoajan tilauksia, joita perutaan paljon koska ei pystytä pitämään kiinni toimitusajoista. yli 9000 tuotetta ei pystytä oikein manuaalisesti päivittämään käsin joten tein pienenpienen (36 riviä) function joka selkeyttää Woocommercen stock statusta huomattavasti.

Jos saldo on:

  • < 0 = Tilaustuote alla lukee Nkpl jälkitoimituksessa
  • 0 = Tilaustuote -- Jos löytyy tukkurin saldokenttä niin alle tulee tukkurin saldot aina 10kpl saakka. Tämän jälkeen näytetään yli 10kpl tukkurilla. Tässä kohtaa myös tutkitaan mikä tukkuri on kyseessä ja tehdään sen perusteella arvio toimitusajasta.
  • 1 - 3 = Vain Nkpl varastossa
  • > 3 = Nkpl varastossa

Funktio vaatii toimiakseen, että tuotteen metakenttiin(esim. acf) on tallennettu maahantuoja ja haettu tukkurin varastotilanne wholesaleqty esim. all import pro:n avulla.

Katselmus

  • Funktiolle on hyvä tehdä kommenttiosio, jossa kerrotaan mitä funktio tekee ja mitä parametreja siihen syötetään. Nämä näkyvät koodieditorissa kun funktion nimeä hoveroi (jos koodieditorissa on php-tuki)
  • Funktio ja muuttujat nimetään mahdollisimman selkeästi sen mukaan mitä ne tekevät/sisältävät. Koodieditorit yleensä osaavat täyttää nimet automaattisesti, eli ei haittaa vaikka ne ovat vähän pidempiä. Lyhenteet ja kirjainmuuttujat jne. tekevät ongelmien selvittelystä vaikeaa
  • Funktiota usein jossain kohtaa tarvitaan "loopin ulkopuolella", joten laita valinnaiseksi parametriksi $product_id ja hae se sitten funktion sisällä get_post_ID():llä. Vältä global $post käyttöä jos suinkin mahdollista, ettei hajota mitään vahingossa
  • Tarkista mahdollisimman alussa, onko funktiolle elintärkeät asiat, kuten tässä tapauksessa $product_id olemassa, ettei suorittaminen hajoa rumasti kun ID onkin jotain muuta.
  • Kun ei ole tarvetta ACF:n välissäololle, niin get_post_meta on nopeampi tapa hakea kenttien arvot. Hakiessa tyypitä numerot numeroiksi, niin IF-lauseissa voi käyttää turvallisempia "tiukkoja" vertauksia, eli kolmea on-yhtä-kuin merkkiä ===.
  • Syvät if-rakenteet ovat yleensä todella hankalia, varsinkin kun pitää alkaa selvittää missä vika. Tässäkin oli kerrosteltu turhan paljon, kun vähemmälläkin selviää, kun hieman yhdistelee kyselyitä ja simppelimmät kysymykset voi myös hoitaa "shorthandina": $output = $stock ? $stock . ' varastossa' : 'varasto tyhjä!';
  • Arraylla eli listalla voi usein tehdä tälläisistä if-else tilanteista paljon selkeämpiä, kuten tässä tein noille arvioiden lukumäärille. Nyt on helppo päivittää pari tukkuria lisää tms. jatkosäätöä
  • Käytä PHP:n string appendia .= sen sijaan että echotat jokaisessa päätepisteessä jotain. Silloin voi "kerätä" stringin pitkin funktiota ja lopussa echottaa. Helpottaa jälleen ongelmien selvittämistä kun funktiossa on vain yksi echo. Sen lisäksi...
  • Kaikki mitä echotat, pitää aina escapettaa. Tätä ei voi liikaa alleviivata eikä poikkeuksia sallita. 😃
  • Valmistaudu muihin kieliversioihin. Jos ei niitä nyt tarvita, niin jonain päivänä asiakas haluaa ne. Ei ole suuri vaiva wrapata stringejä esc_html__() esc_html_e() ym. vastaaviin WP:n funktioihin, joten kannattaa ottaa se ihan tavaksi. sprintf -funktiolla voi lisätä tekstin sekaan muuttujat %s, jolloin lauserakennetta voi kääntäessä helposti muuttaa, kuten usein on tarpeen.
<?php
function show_stock() {
global $post;
$stock = get_post_meta($post->ID, '_stock', true);
if ($stock == "0") {
if (get_field('wholesaleqty')) {
echo '<div class="remaining">';
$wqty = get_field("wholesaleqty");
if ($wqty > 10) {
echo 'yli 10';
} else {
echo the_field('wholesaleqty');
}
if (get_field('maahantuoja')) {
$maahantuoja = get_field("maahantuoja");
if ($maahantuoja == "Maahantuoja 1") {
echo ' kpl maahantuojalla (arvio 1-3pv)';
} elseif ($maahantuoja == "Maahantuoja 2") {
echo ' kpl maahantuojalla (arvio 4-6pv)';
} elseif ($maahantuoja == "Maahantuoja 3") {
echo ' kpl maahantuojalla (arvio 1-3pv)';
} elseif ($maahantuoja == "Maahantuoja 4") {
echo ' kpl maahantuojalla (arvio 4-6pv)';
} elseif ($maahantuoja == "Maahantuoja 5") {
echo ' kpl maahantuojalla (arvio 1-3pv)';
} else {
echo ' kpl maahantuojalla';
}
} else {
echo ' kpl maahantuojalla';
}
echo '</div>';
}
} elseif ($stock == "1") {
echo '';
} elseif ($stock == "2" || $stock == "3") {
echo '<div class="remaining">Vain ' . $stock . ' kpl varastossa</div>';
} elseif ($stock > "3") {
echo '<div class="remaining">' . $stock . ' kpl varastossa</div>';
} else {
echo '<div class="remaining">' . $stock . ' kpl j&aumllkitoimituksessa</div>';
}
}
<?php
/**
* Echo stock amounts for a product depending on the local and wholesale stock
* quantities and possibly add wholesale information.
*
* @param int $product_id Product ID (optional)
*/
function show_stock( $product_id = 0 ) {
$product_id = $product_id ? $product_id : get_the_ID();
// Bail out if we don't have product id
if ( ! $product_id ) {
return;
}
// Get the local and wholesale stock quantities and convert to integer
$stock = intval( get_post_meta( $product_id, '_stock', true ) );
$wholesale_stock = intval( get_post_meta( $product_id, 'wholesaleqty', true ) );
// Set the estimates if available for wholesale
$estimates = [
'Maahantuoja 1' => '1-3pv',
'Maahantuoja 2' => '4-6pv',
'Maahantuoja 3' => '1-3pv',
'Maahantuoja 4' => '4-6pv',
'Maahantuoja 5' => '1-3pv',
];
// Prepare the string to be outputted
$output = '';
if ( 0 === $stock && $wholesale_stock ) {
// Set wholesale stock
if ( $wholesale_stock > 10 ) {
$output .= sprintf( esc_html__( 'Yli %s kpl maahantuojalla', 'my-text-domain' ), $wholesale_stock );
} else {
$output .= sprintf( esc_html__( '%s kpl maahantuojalla', 'my-text-domain' ), $wholesale_stock );
}
// Get estimate time by supplier if they have product in stock
$supplier = get_post_meta( $product_id, 'maahantuoja', true );
if ( $wholesale_stock && $supplier && ! empty( $estimates[ $supplier ] ) ) {
$output .= sprintf( esc_html__( '(arvio %s pv)', 'my-text-domain' ), $estimates[ $supplier ] );
}
} elseif ( $stock <= 3 ) {
$output .= sprintf( esc_html__( 'Vain %s kpl varastossa', 'my-text-domain' ), $stock );
} elseif ( $stock > 3 ) {
$output .= sprintf( esc_html__( '%s kpl varastossa', 'my-text-domain' ), $stock );
} else {
$output .= sprintf( esc_html__( '%s kpl jälkitoimituksessa', 'my-text-domain' ), $stock );
}
if ( ! empty( $output ) ) {
// Wrap output to div element
$output = '<div class="remaining">' . $output . '</div>';
// Escape and echo output
echo wp_kses_post( $output );
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment